diff -rc aterm-2.4.2-orig/aterm/bafio.c aterm-2.4.2/aterm/bafio.c *** aterm-2.4.2-orig/aterm/bafio.c 2004-02-02 12:24:34.000000000 +0100 --- aterm-2.4.2/aterm/bafio.c 2006-09-22 13:39:07.000000000 +0200 *************** *** 222,227 **** --- 222,229 ---- } } + if (val) return -1; + /* Ok */ return 0; } *************** *** 544,551 **** * terms have been sorted by symbol. */ ! void gather_top_symbols(sym_entry *cur_entry, int cur_arg, ! int total_top_symbols) { int index; unsigned int hnr; --- 546,553 ---- * terms have been sorted by symbol. */ ! static void gather_top_symbols(sym_entry *cur_entry, int cur_arg, ! int total_top_symbols) { int index; unsigned int hnr; *************** *** 899,905 **** } else { switch(ATgetType(t)) { case AT_INT: ! if(writeBits(ATgetInt((ATermInt)t), HEADER_BITS, writer) < 0) { return ATfalse; } #if 0 --- 901,908 ---- } else { switch(ATgetType(t)) { case AT_INT: ! /* If ATerm integers are > 32 bits, then this can fail. */ ! if(writeBits(ATgetInt((ATermInt)t), INT_SIZE_IN_BAF, writer) < 0) { return ATfalse; } #if 0 *************** *** 1033,1039 **** /*}}} */ /*{{{ ATbool write_baf(ATerm t, byte_writer *writer) */ ! ATbool write_baf(ATerm t, byte_writer *writer) { int nr_unique_terms = 0; --- 1036,1042 ---- /*}}} */ /*{{{ ATbool write_baf(ATerm t, byte_writer *writer) */ ! static ATbool write_baf(ATerm t, byte_writer *writer) { int nr_unique_terms = 0; *************** *** 1233,1239 **** * Read a single symbol from file. */ ! Symbol read_symbol(byte_reader *reader) { unsigned int arity, quoted; int len; --- 1236,1242 ---- * Read a single symbol from file. */ ! static Symbol read_symbol(byte_reader *reader) { unsigned int arity, quoted; int len; *************** *** 1260,1266 **** * Read all symbols from file. */ ! ATbool read_all_symbols(byte_reader *reader) { unsigned int val; int i, j, k, arity; --- 1263,1269 ---- * Read all symbols from file. */ ! static ATbool read_all_symbols(byte_reader *reader) { unsigned int val; int i, j, k, arity; *************** *** 1280,1293 **** /*}}} */ /*{{{ Read term count and allocate space */ ! if(readInt(&val, reader) < 0) return ATfalse; read_symbols[i].nr_terms = val; read_symbols[i].term_width = bit_width(val); ! if(val == 0) ! read_symbols[i].terms = NULL; ! else ! read_symbols[i].terms = (ATerm *)calloc(val, sizeof(ATerm)); if(!read_symbols[i].terms) ATerror("read_symbols: could not allocate space for %d terms.\n", val); ATprotectArray(read_symbols[i].terms, val); --- 1283,1293 ---- /*}}} */ /*{{{ Read term count and allocate space */ ! if(readInt(&val, reader) < 0 || val == 0) return ATfalse; read_symbols[i].nr_terms = val; read_symbols[i].term_width = bit_width(val); ! read_symbols[i].terms = (ATerm *)calloc(val, sizeof(ATerm)); if(!read_symbols[i].terms) ATerror("read_symbols: could not allocate space for %d terms.\n", val); ATprotectArray(read_symbols[i].terms, val); *************** *** 1351,1357 **** /*}}} */ /*{{{ ATerm read_term(sym_read_entry *sym, byte_reader *reader) */ ! ATerm read_term(sym_read_entry *sym, byte_reader *reader) { unsigned int val; int i, arity = sym->arity; --- 1351,1357 ---- /*}}} */ /*{{{ ATerm read_term(sym_read_entry *sym, byte_reader *reader) */ ! static ATerm read_term(sym_read_entry *sym, byte_reader *reader) { unsigned int val; int i, arity = sym->arity; *************** *** 1365,1370 **** --- 1365,1371 ---- ATprotectArray(args, arity); if(!args) ATerror("could not allocate space for %d arguments.\n", arity); + /* !!! leaks memory on the "return NULL" paths */ } /*ATfprintf(stderr, "reading term over symbol %y\n", sym->sym);*/ *************** *** 1372,1377 **** --- 1373,1380 ---- /*ATfprintf(stderr, " reading argument %d (%d)", i, sym->sym_width[i]);*/ if(readBits(&val, sym->sym_width[i], reader) < 0) return NULL; + if(val >= sym->nr_topsyms[i]) + return NULL; arg_sym = &read_symbols[sym->topsyms[i][val]]; /* ATfprintf(stderr, "argument %d, symbol index = %d, symbol = %y\n", i, val, arg_sym->sym);*/ *************** *** 1381,1386 **** --- 1384,1391 ---- if(readBits(&val, arg_sym->term_width, reader) < 0) return NULL; /* ATfprintf(stderr, "arg term index = %d\n", val);*/ + if(val >= arg_sym->nr_terms) + return NULL; if(!arg_sym->terms[val]) { arg_sym->terms[val] = read_term(arg_sym, reader); if(!arg_sym->terms[val]) *************** *** 1396,1402 **** case AS_INT: /*{{{ Read an integer */ ! if(readBits(&val, HEADER_BITS, reader) < 0) return NULL; result = (ATerm)ATmakeInt((int)val); --- 1401,1407 ---- case AS_INT: /*{{{ Read an integer */ ! if(readBits(&val, INT_SIZE_IN_BAF, reader) < 0) return NULL; result = (ATerm)ATmakeInt((int)val); *************** *** 1494,1502 **** for(i=0; iterms); ! if(entry->terms) free(entry->terms); if(entry->nr_topsyms) free(entry->nr_topsyms); if(entry->sym_width) --- 1499,1508 ---- for(i=0; iterms) { ! ATunprotectArray(entry->terms); free(entry->terms); + } if(entry->nr_topsyms) free(entry->nr_topsyms); if(entry->sym_width) Only in aterm-2.4.2/aterm: config.h.in diff -rc aterm-2.4.2-orig/aterm/encoding.h aterm-2.4.2/aterm/encoding.h *** aterm-2.4.2-orig/aterm/encoding.h 2004-06-01 10:29:02.000000000 +0200 --- aterm-2.4.2/aterm/encoding.h 2006-09-22 13:39:07.000000000 +0200 *************** *** 10,15 **** --- 10,17 ---- { #endif/* __cplusplus */ + #include "config.h" + /* |--------------------------------| |info|type |arity|quoted|mark|age| *************** *** 31,37 **** #define SHIFT_REMOVE_MARK_AGE 3 #define MASK_AGE_MARK (MASK_AGE|MASK_MARK) ! #if AT_64BIT #define SHIFT_LENGTH 34 #define HEADER_BITS 64 typedef unsigned long header_type; --- 33,39 ---- #define SHIFT_REMOVE_MARK_AGE 3 #define MASK_AGE_MARK (MASK_AGE|MASK_MARK) ! #ifdef AT_64BIT #define SHIFT_LENGTH 34 #define HEADER_BITS 64 typedef unsigned long header_type; *************** *** 137,142 **** --- 139,150 ---- #define AT_TABLE_SIZE(table_class) (1<<(table_class)) #define AT_TABLE_MASK(table_class) (AT_TABLE_SIZE(table_class)-1) + + /* Integers in BAF are always exactly 32 bits. The size must be fixed so that + * BAF terms can be exchanged between platforms. */ + #define INT_SIZE_IN_BAF 32 + + #ifdef __cplusplus } #endif/* __cplusplus */ diff -rc aterm-2.4.2-orig/aterm/gc.c aterm-2.4.2/aterm/gc.c *** aterm-2.4.2-orig/aterm/gc.c 2004-06-01 10:29:02.000000000 +0200 --- aterm-2.4.2/aterm/gc.c 2006-09-22 13:39:07.000000000 +0200 *************** *** 154,166 **** } #ifdef AT_64BIT ! odd_term = *((ATerm *)((MachineWord)cur)+4); real_term = AT_isInsideValidTerm(odd_term); if (real_term != NULL) { AT_markTerm(odd_term); } ! odd_sym = *((AFun *)((MachineWord)cur)+4); if (AT_isValidSymbol(odd_sym)) { /*fprintf(stderr,"mark_memory: AT_markSymbol(%d)\n",odd_sym);*/ AT_markSymbol(odd_sym); --- 154,166 ---- } #ifdef AT_64BIT ! odd_term = *((ATerm *)(((MachineWord)cur)+4)); real_term = AT_isInsideValidTerm(odd_term); if (real_term != NULL) { AT_markTerm(odd_term); } ! odd_sym = *((AFun *)(((MachineWord)cur)+4)); if (AT_isValidSymbol(odd_sym)) { /*fprintf(stderr,"mark_memory: AT_markSymbol(%d)\n",odd_sym);*/ AT_markSymbol(odd_sym); *************** *** 198,210 **** } #ifdef AT_64BIT ! odd_term = *((ATerm *)((MachineWord)cur)+4); real_term = AT_isInsideValidTerm(odd_term); if (real_term != NULL) { AT_markTerm_young(odd_term); } ! odd_sym = *((AFun *)((MachineWord)cur)+4); if (AT_isValidSymbol(odd_sym)) { /*fprintf(stderr,"mark_memory_young: AT_markSymbol_young(%d)\n",odd_sym);*/ AT_markSymbol_young(odd_sym); --- 198,210 ---- } #ifdef AT_64BIT ! odd_term = *((ATerm *)(((MachineWord)cur)+4)); real_term = AT_isInsideValidTerm(odd_term); if (real_term != NULL) { AT_markTerm_young(odd_term); } ! odd_sym = *((AFun *)(((MachineWord)cur)+4)); if (AT_isValidSymbol(odd_sym)) { /*fprintf(stderr,"mark_memory_young: AT_markSymbol_young(%d)\n",odd_sym);*/ AT_markSymbol_young(odd_sym); *************** *** 225,235 **** ATerm *start, *stop; ProtEntry *prot; - #ifdef AT_64BIT - ATerm oddTerm; - AFun oddSym; - #endif - #ifdef WIN32 unsigned int r_eax, r_ebx, r_ecx, r_edx, \ --- 225,230 ---- *************** *** 287,293 **** /* Traverse possible register variables */ sigsetjmp(env,0); ! start = (ATerm *)env; stop = ((ATerm *)(((char *)env) + sizeof(sigjmp_buf))); mark_memory(start, stop); #endif --- 282,288 ---- /* Traverse possible register variables */ sigsetjmp(env,0); ! start = (ATerm *)env; /* !!! illegal aliasing */ stop = ((ATerm *)(((char *)env) + sizeof(sigjmp_buf))); mark_memory(start, stop); #endif *************** *** 338,348 **** ATerm *start, *stop; ProtEntry *prot; - #ifdef AT_64BIT - ATerm oddTerm; - AFun oddSym; - #endif - #ifdef WIN32 unsigned int r_eax, r_ebx, r_ecx, r_edx, \ --- 333,338 ---- *************** *** 400,406 **** /* Traverse possible register variables */ sigsetjmp(env,0); ! start = (ATerm *)env; stop = ((ATerm *)(((char *)env) + sizeof(sigjmp_buf))); mark_memory_young(start, stop); #endif --- 390,396 ---- /* Traverse possible register variables */ sigsetjmp(env,0); ! start = (ATerm *)env; /* !!! illegal aliasing */ stop = ((ATerm *)(((char *)env) + sizeof(sigjmp_buf))); mark_memory_young(start, stop); #endif *************** *** 1047,1053 **** /*fprintf(stderr,"minor_sweep_phase_young: ensure empty freelist[%d]\n",size);*/ for(data = at_freelist[size] ; data ; data=data->next) { if(!EQUAL_HEADER(data->header,FREE_HEADER)) { ! fprintf(stderr,"data = %x header = %x\n",(unsigned int)data,data->header); } assert(EQUAL_HEADER(data->header,FREE_HEADER)); assert(ATgetType(data) == AT_FREE); --- 1037,1043 ---- /*fprintf(stderr,"minor_sweep_phase_young: ensure empty freelist[%d]\n",size);*/ for(data = at_freelist[size] ; data ; data=data->next) { if(!EQUAL_HEADER(data->header,FREE_HEADER)) { ! fprintf(stderr,"data = %p header = %x\n",data,(unsigned int) data->header); } assert(EQUAL_HEADER(data->header,FREE_HEADER)); assert(ATgetType(data) == AT_FREE); diff -rc aterm-2.4.2-orig/aterm/Makefile.am aterm-2.4.2/aterm/Makefile.am *** aterm-2.4.2-orig/aterm/Makefile.am 2005-08-03 11:45:19.000000000 +0200 --- aterm-2.4.2/aterm/Makefile.am 2006-09-22 13:39:07.000000000 +0200 *************** *** 37,43 **** aterm2.h \ atypes.h \ deprecated.h \ ! encoding.h PRIVATE_INCL = \ _afun.h \ --- 37,44 ---- aterm2.h \ atypes.h \ deprecated.h \ ! encoding.h \ ! config.h PRIVATE_INCL = \ _afun.h \ diff -rc aterm-2.4.2-orig/aterm/md5.h aterm-2.4.2/aterm/md5.h *** aterm-2.4.2-orig/aterm/md5.h 2003-09-02 15:32:46.000000000 +0200 --- aterm-2.4.2/aterm/md5.h 2006-09-22 13:39:07.000000000 +0200 *************** *** 24,29 **** --- 24,31 ---- documentation and/or software. */ + #include + /* GLOBAL.H - RSAREF types and constants */ *************** *** 46,55 **** typedef unsigned char *POINTER; /* UINT2 defines a two byte word */ ! typedef unsigned short int UINT2; /* UINT4 defines a four byte word */ ! typedef unsigned long int UINT4; /* PROTO_LIST is defined depending on how PROTOTYPES is defined above. If using PROTOTYPES, then PROTO_LIST returns the list, otherwise it --- 48,57 ---- typedef unsigned char *POINTER; /* UINT2 defines a two byte word */ ! typedef uint16_t UINT2; /* UINT4 defines a four byte word */ ! typedef uint32_t UINT4; /* PROTO_LIST is defined depending on how PROTOTYPES is defined above. If using PROTOTYPES, then PROTO_LIST returns the list, otherwise it diff -rc aterm-2.4.2-orig/aterm/memory.c aterm-2.4.2/aterm/memory.c *** aterm-2.4.2-orig/aterm/memory.c 2005-10-11 13:19:25.000000000 +0200 --- aterm-2.4.2/aterm/memory.c 2006-09-22 13:39:16.000000000 +0200 *************** *** 96,102 **** #define HASHNUMBER4(t) hash_number(t,4) #define HASHINT(val) (tmp[0]=(MachineWord)(AT_INT<data; assert(at_blocks[size] != NULL); ! assert(((int)top_at_blocks[size] % MAX(sizeof(double), sizeof(void *))) == 0); /* [pem: Feb 14 02] TODO: fast allocation */ assert(at_freelist[size] == NULL); --- 708,714 ---- at_blocks[size] = newblock; top_at_blocks[size] = newblock->data; assert(at_blocks[size] != NULL); ! assert(((long)top_at_blocks[size] % MAX(sizeof(double), sizeof(void *))) == 0); /* [pem: Feb 14 02] TODO: fast allocation */ assert(at_freelist[size] == NULL); *************** *** 1009,1018 **** do { if(!cur) { /*printf("freeterm = %d\n",t);*/ ! fprintf(stderr,"### cannot find term %x in hashtable at pos %d header = %x\n", (unsigned int)t, hnr, t->header); ! ! ATabort("### cannot find term %n at %p in hashtable at pos %d" ! ", header = %d\n", t, t, hnr, t->header); } if (cur == t) { if(prev) --- 1009,1016 ---- do { if(!cur) { /*printf("freeterm = %d\n",t);*/ ! ATabort("### cannot find term %p in hashtable at pos %d" ! ", header = %x\n", t, hnr, t->header); } if (cur == t) { if(prev) *************** *** 1728,1733 **** --- 1726,1733 ---- hashtable[hnr] = cur; } + assert((hnr & table_mask) == (hash_number(cur, TERM_SIZE_INT) & table_mask)); + return (ATermInt)cur; } diff -rc aterm-2.4.2-orig/aterm.m4 aterm-2.4.2/aterm.m4 *** aterm-2.4.2-orig/aterm.m4 2005-08-03 11:45:19.000000000 +0200 --- aterm-2.4.2/aterm.m4 2006-09-22 13:39:07.000000000 +0200 *************** *** 8,15 **** [AS_HELP_STRING([--with-sharing],[create libraries that do term sharing @<:@yes@:>@])], [if test "$withval" = "no"; then AC_MSG_RESULT([no]) ! AC_DEFINE([NO_SHARING]) ! AC_DEFINE([WITH_STATS]) else if test "$withval" != "yes"; then AC_MSG_RESULT([unknown value specified for --with-sharing.]) --- 8,15 ---- [AS_HELP_STRING([--with-sharing],[create libraries that do term sharing @<:@yes@:>@])], [if test "$withval" = "no"; then AC_MSG_RESULT([no]) ! AC_DEFINE([NO_SHARING], [], [Whether terms are shared.]) ! AC_DEFINE([WITH_STATS], [], [Whether to keep statistics.]) else if test "$withval" != "yes"; then AC_MSG_RESULT([unknown value specified for --with-sharing.]) *************** *** 73,78 **** --- 73,102 ---- AC_SUBST([OPTIMIZECFLAGS]) ]) + # ATERM_64_BIT + # ------------ + # Enable 64-bit mode if pointers are 8 bytes large. + AC_DEFUN([ATERM_64_BIT], [ + AC_CHECK_SIZEOF(void *) + AC_CHECK_SIZEOF(int) + AC_CHECK_SIZEOF(long) + + AC_MSG_CHECKING([what kind of platform this is]) + + AC_SUBST([AT_64BIT], [0]) + if test "$ac_cv_sizeof_void_p" = "8" -a "$ac_cv_sizeof_int" = "4" -a "$ac_cv_sizeof_long" = "8"; then + AC_MSG_RESULT([LP64]) + AC_SUBST([AT_64BIT], [1]) + elif test "$ac_cv_sizeof_void_p" = "8" -a "$ac_cv_sizeof_int" = "8" -a "$ac_cv_sizeof_long" = "8"; then + AC_MSG_RESULT([ILP64 - warning, untested]) + AC_SUBST([AT_64BIT], [1]) + elif test "$ac_cv_sizeof_void_p" = "4" -a "$ac_cv_sizeof_int" = "4" -a "$ac_cv_sizeof_long" = "4"; then + AC_MSG_RESULT([32 bits]) + else + AC_MSG_RESULT([something weird - warning, untested]) + fi + ]) + # XT_SVN_REVISION # --------------- AC_DEFUN([XT_SVN_REVISION], diff -rc aterm-2.4.2-orig/configure.ac aterm-2.4.2/configure.ac *** aterm-2.4.2-orig/configure.ac 2005-08-03 11:45:19.000000000 +0200 --- aterm-2.4.2/configure.ac 2006-09-22 13:39:07.000000000 +0200 *************** *** 30,35 **** --- 30,38 ---- # Add a configuration option to allow users to control sharing. ATERM_WITH_SHARING + # Enable 64-bit mode if pointers are 8 bytes large. + ATERM_64_BIT + CURDATE=`date` AC_SUBST([CURDATE]) *************** *** 45,49 **** --- 48,53 ---- doc/spec/Makefile aterm.spec aterm.pc + aterm/config.h ]) AC_OUTPUT diff -rc aterm-2.4.2-orig/utils/dicttoc.c aterm-2.4.2/utils/dicttoc.c *** aterm-2.4.2-orig/utils/dicttoc.c 2003-10-07 13:57:40.000000000 +0200 --- aterm-2.4.2/utils/dicttoc.c 2006-09-22 13:39:07.000000000 +0200 *************** *** 69,74 **** --- 69,75 ---- fprintf(file, "#ifndef __%s_H\n", code_prefix); fprintf(file, "#define __%s_H\n\n", code_prefix); fprintf(file, "#include \n\n"); + fprintf(file, "#include \n\n"); while (!ATisEmpty(afuns)) { ATerm afun, alias, pair = ATgetFirst(afuns); *************** *** 244,251 **** ATfprintf(file, "{\n"); ATfprintf(file, " ATermList afuns, terms;\n\n"); ! ATfprintf(file, " _%s = ATreadFromBinaryString(_%s_baf, _%s_LEN);\n\n", code_prefix, code_prefix, code_prefix); ATfprintf(file, " ATprotect(&_%s);\n\n", code_prefix); ATfprintf(file, " afuns = (ATermList)ATelementAt((ATermList)_%s, 0);\n\n", code_prefix); --- 245,253 ---- ATfprintf(file, "{\n"); ATfprintf(file, " ATermList afuns, terms;\n\n"); ! ATfprintf(file, " _%s = ATreadFromBinaryString(_%s_baf, _%s_LEN);\n", code_prefix, code_prefix, code_prefix); + ATfprintf(file, " assert(_%s);\n\n", code_prefix); ATfprintf(file, " ATprotect(&_%s);\n\n", code_prefix); ATfprintf(file, " afuns = (ATermList)ATelementAt((ATermList)_%s, 0);\n\n", code_prefix);