224 lines
		
	
	
	
		
			6.1 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			224 lines
		
	
	
	
		
			6.1 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| diff -rc aterm-1142707243.10633/aterm/aterm.c aterm/aterm/aterm.c
 | |
| *** aterm-1142707243.10633/aterm/aterm.c	2006-02-08 11:35:28.000000000 +0100
 | |
| --- aterm/aterm/aterm.c	2006-04-25 17:10:52.000000000 +0200
 | |
| ***************
 | |
| *** 193,198 ****
 | |
| --- 193,199 ----
 | |
|     /* that have char == 2 bytes, and sizeof(header_type) == 2 */
 | |
|     assert(sizeof(header_type) == sizeof(ATerm *));
 | |
|     assert(sizeof(header_type) >= 4);
 | |
| +   assert(sizeof(ATerm) == sizeof(MachineWord));
 | |
|   
 | |
|     /*}}}  */
 | |
|     /*{{{  Initialize buffer */
 | |
| diff -rc aterm-1142707243.10633/aterm/memory.c aterm/aterm/memory.c
 | |
| *** aterm-1142707243.10633/aterm/memory.c	2006-03-09 15:02:56.000000000 +0100
 | |
| --- aterm/aterm/memory.c	2006-04-25 18:22:00.000000000 +0200
 | |
| ***************
 | |
| *** 119,130 ****
 | |
|                           hash_number(tmp,3)) 
 | |
|   */
 | |
|   
 | |
|   #define HASHNUMBER3(t)\
 | |
| ! FINISH(COMBINE(START(((MachineWord*)t)[0]), ((MachineWord*)t)[2]))
 | |
|   
 | |
|   #define HASHNUMBER4(t)\
 | |
| ! FINISH(COMBINE(COMBINE(START(((MachineWord*)t)[0]), \
 | |
| ! 		       ((MachineWord*)t)[2]),((MachineWord*)t)[3]))
 | |
|   
 | |
|   #define HASHINT(val) \
 | |
|   FINISH(COMBINE(START( (AT_INT<<SHIFT_TYPE) ), val))
 | |
| --- 119,171 ----
 | |
|                           hash_number(tmp,3)) 
 | |
|   */
 | |
|   
 | |
| + /* The ATerm library use some heavy aliasing.  For instance, the
 | |
| +    various ATermXXX structures are referenced through MachineWord
 | |
| +    arrays.  This is not generally allowed by the C standard --- see
 | |
| +    C99, section 6.5, clause 7.  In particular, this means that you
 | |
| +    cannot assign something through an ATermXXX pointer, e.g.,
 | |
| + 
 | |
| +      protoAppl->header = header;
 | |
| + 
 | |
| +    and then read it through a MachineWord*, e.g.,
 | |
| + 
 | |
| +      hnr = hash_number((ATerm) protoAppl, 2);
 | |
| + 
 | |
| +    (hash_number walks over the term by casting it to a MachineWord*).
 | |
| + 
 | |
| +    However, the same clause of the C standard also specifies that you
 | |
| +    *can* read the memory location through a union type that contains
 | |
| +    both the original type (e.g. ATermAppl) and the type used to read
 | |
| +    the memory location (e.g. MachineWord).  That's what we do
 | |
| +    below: we have a union of all the types that occur in the various
 | |
| +    ATerm types.  We then read the "w" element of the union.  The
 | |
| +    compiler is not allowed to assume absence of aliasing with the
 | |
| +    other types in the union.
 | |
| + 
 | |
| +    A better solution would be to hash the term through a character
 | |
| +    pointer (since *any* memory location can be legally read as a
 | |
| +    character), but I'm too lazy right now.  Performance might also
 | |
| +    suffer if we do that. */
 | |
| + 
 | |
| + typedef union 
 | |
| + {
 | |
| +     MachineWord w;
 | |
| +     header_type header;
 | |
| +     ATerm term;
 | |
| +     ATermList list;
 | |
| +     int i;
 | |
| +     double d;
 | |
| +     void* p;
 | |
| + } Aliaser;
 | |
| + 
 | |
| + #define GET_WORD(t, n) (((Aliaser*) (((MachineWord*) t) + n))->w)
 | |
| + 
 | |
|   #define HASHNUMBER3(t)\
 | |
| ! FINISH(COMBINE(START(GET_WORD(t, 0)), GET_WORD(t, 2)))
 | |
|   
 | |
|   #define HASHNUMBER4(t)\
 | |
| ! FINISH(COMBINE(COMBINE(START(GET_WORD(t, 0)), \
 | |
| ! 		       GET_WORD(t, 2)), GET_WORD(t, 3)))
 | |
|   
 | |
|   #define HASHINT(val) \
 | |
|   FINISH(COMBINE(START( (AT_INT<<SHIFT_TYPE) ), val))
 | |
| ***************
 | |
| *** 132,144 ****
 | |
|   
 | |
|   #endif /* HASHPEM */
 | |
|   
 | |
| ! #define PROTO_APPL_ARGS ((ATerm *) (protoTerm + ARG_OFFSET))
 | |
|   
 | |
|   #define SET_PROTO_APPL_ARG(i, a) \
 | |
| !   (PROTO_APPL_ARGS[(i)] = (a))
 | |
|   
 | |
|   #define GET_PROTO_APPL_ARG(i) \
 | |
| !   (PROTO_APPL_ARGS[(i)])
 | |
|   
 | |
|   #define CHECK_TERM(t) \
 | |
|     assert((t) != NULL \
 | |
| --- 173,185 ----
 | |
|   
 | |
|   #endif /* HASHPEM */
 | |
|   
 | |
| ! #define PROTO_APPL_ARGS (protoTerm + ARG_OFFSET)
 | |
|   
 | |
|   #define SET_PROTO_APPL_ARG(i, a) \
 | |
| !   (PROTO_APPL_ARGS[(i)] = (MachineWord) (a))
 | |
|   
 | |
|   #define GET_PROTO_APPL_ARG(i) \
 | |
| !   ((ATerm) PROTO_APPL_ARGS[(i)])
 | |
|   
 | |
|   #define CHECK_TERM(t) \
 | |
|     assert((t) != NULL \
 | |
| ***************
 | |
| *** 323,336 ****
 | |
|   #else
 | |
|   static HashNumber hash_number(ATerm t, int size)
 | |
|   {
 | |
| -   MachineWord *words = (MachineWord *) t;
 | |
|     int i;
 | |
|     HashNumber hnr;
 | |
|   
 | |
| !   hnr = START(HIDE_AGE_MARK(words[0]));
 | |
|     
 | |
|     for (i=2; i<size; i++) {
 | |
| !     hnr = COMBINE(hnr, words[i]);
 | |
|     }
 | |
|   
 | |
|     return FINISH(hnr);
 | |
| --- 364,376 ----
 | |
|   #else
 | |
|   static HashNumber hash_number(ATerm t, int size)
 | |
|   {
 | |
|     int i;
 | |
|     HashNumber hnr;
 | |
|   
 | |
| !   hnr = START(HIDE_AGE_MARK(GET_WORD(t, 0)));
 | |
|     
 | |
|     for (i=2; i<size; i++) {
 | |
| !     hnr = COMBINE(hnr, GET_WORD(t, i));
 | |
|     }
 | |
|   
 | |
|     return FINISH(hnr);
 | |
| ***************
 | |
| *** 338,351 ****
 | |
|   
 | |
|   static HashNumber hash_number_anno(ATerm t, int size, ATerm anno)
 | |
|   {
 | |
| -   MachineWord *words = (MachineWord *) t;
 | |
|     int i;
 | |
|     HashNumber hnr;
 | |
|   
 | |
| !   hnr = START(HIDE_AGE_MARK(words[0]));
 | |
|     
 | |
|     for (i=2; i<size; i++) {
 | |
| !     hnr = COMBINE(hnr, words[i]);
 | |
|     }
 | |
|     hnr = COMBINE(hnr, (MachineWord)anno);
 | |
|   
 | |
| --- 378,390 ----
 | |
|   
 | |
|   static HashNumber hash_number_anno(ATerm t, int size, ATerm anno)
 | |
|   {
 | |
|     int i;
 | |
|     HashNumber hnr;
 | |
|   
 | |
| !   hnr = START(HIDE_AGE_MARK(GET_WORD(t, 0)));
 | |
|     
 | |
|     for (i=2; i<size; i++) {
 | |
| !     hnr = COMBINE(hnr, GET_WORD(t, i));
 | |
|     }
 | |
|     hnr = COMBINE(hnr, (MachineWord)anno);
 | |
|   
 | |
| ***************
 | |
| *** 1639,1645 ****
 | |
|     protoAppl->header = header;
 | |
|     CHECK_HEADER(protoAppl->header);
 | |
|   
 | |
| !   if (args != PROTO_APPL_ARGS) {
 | |
|       for (i=0; i<arity; i++) {
 | |
|         CHECK_TERM(args[i]);
 | |
|         SET_PROTO_APPL_ARG(i, args[i]);
 | |
| --- 1678,1684 ----
 | |
|     protoAppl->header = header;
 | |
|     CHECK_HEADER(protoAppl->header);
 | |
|   
 | |
| !   if (args != (ATerm *) PROTO_APPL_ARGS) {
 | |
|       for (i=0; i<arity; i++) {
 | |
|         CHECK_TERM(args[i]);
 | |
|         SET_PROTO_APPL_ARG(i, args[i]);
 | |
| ***************
 | |
| *** 1680,1686 ****
 | |
|       hashtable[hnr] = cur;
 | |
|     }
 | |
|   
 | |
| !   if (args != PROTO_APPL_ARGS) {
 | |
|       for (i=0; i<arity; i++) {
 | |
|         protected_buffer[i] = NULL;
 | |
|       }
 | |
| --- 1719,1725 ----
 | |
|       hashtable[hnr] = cur;
 | |
|     }
 | |
|   
 | |
| !   if (args != (ATerm *) PROTO_APPL_ARGS) {
 | |
|       for (i=0; i<arity; i++) {
 | |
|         protected_buffer[i] = NULL;
 | |
|       }
 | |
| ***************
 | |
| *** 2144,2150 ****
 | |
|     }
 | |
|     SET_PROTO_APPL_ARG(n, arg);
 | |
|   
 | |
| !   result = ATmakeApplArray(sym, PROTO_APPL_ARGS);
 | |
|     annos = AT_getAnnotations((ATerm)appl);
 | |
|     if (annos != NULL) {
 | |
|       result = (ATermAppl)AT_setAnnotations((ATerm)result, annos);
 | |
| --- 2183,2189 ----
 | |
|     }
 | |
|     SET_PROTO_APPL_ARG(n, arg);
 | |
|   
 | |
| !   result = ATmakeApplArray(sym, (ATerm *) PROTO_APPL_ARGS);
 | |
|     annos = AT_getAnnotations((ATerm)appl);
 | |
|     if (annos != NULL) {
 | |
|       result = (ATermAppl)AT_setAnnotations((ATerm)result, annos);
 |