* Use the patched ATerm library.

This commit is contained in:
Eelco Dolstra 2006-11-14 15:36:27 +00:00
parent 745e354b19
commit bce9ff7ece
3 changed files with 5 additions and 892 deletions

12
externals/Makefile.am vendored
View file

@ -35,19 +35,17 @@ endif
# CWI ATerm # CWI ATerm
ATERM = aterm-2.4.2 ATERM = aterm-2.4.2-fixes
$(ATERM).tar.gz: $(ATERM).tar.gz:
@echo "Nix requires the CWI ATerm library to build." @echo "Nix requires the CWI ATerm library to build."
@echo "Please download version 2.4.2 from" @echo "Please download version 2.4.2-fixes from"
@echo " http://www.cwi.nl/projects/MetaEnv/aterm/aterm-2.4.2.tar.gz" @echo " http://losser.st-lab.cs.uu.nl/~eelco/dist/aterm-2.4.2-fixes.tar.bz2"
@echo "and place it in the externals/ directory." @echo "and place it in the externals/ directory."
false false
$(ATERM): $(ATERM).tar.gz $(ATERM): $(ATERM).tar.bz2
gunzip < $(srcdir)/$(ATERM).tar.gz | tar xvf - bunzip2 < $(srcdir)/$(ATERM).tar.bz2 | tar xvf -
(cd $(ATERM) && $(patch) -p1) < $(srcdir)/aterm-aliasing.patch
# (cd $(ATERM) && $(patch) -p1) < $(srcdir)/aterm-64-bit.patch
have-aterm: have-aterm:
$(MAKE) $(ATERM) $(MAKE) $(ATERM)

View file

@ -1,661 +0,0 @@
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; i<nr_unique_symbols; i++) {
sym_read_entry *entry = &read_symbols[i];
! ATunprotectArray(entry->terms);
! if(entry->terms)
free(entry->terms);
if(entry->nr_topsyms)
free(entry->nr_topsyms);
if(entry->sym_width)
--- 1499,1508 ----
for(i=0; i<nr_unique_symbols; i++) {
sym_read_entry *entry = &read_symbols[i];
! if(entry->terms) {
! 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 <stdint.h>
+
/* 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<<SHIFT_TYPE),\
tmp[1]=(MachineWord)0,\
! tmp[2]=(MachineWord)val,\
hash_number(tmp,3))
#else
--- 96,102 ----
#define HASHNUMBER4(t) hash_number(t,4)
#define HASHINT(val) (tmp[0]=(MachineWord)(AT_INT<<SHIFT_TYPE),\
tmp[1]=(MachineWord)0,\
! tmp[2]=(MachineWord)((unsigned int) val),\
hash_number(tmp,3))
#else
***************
*** 127,133 ****
((MachineWord*)t)[2]),((MachineWord*)t)[3]))
#define HASHINT(val) \
! FINISH(COMBINE(START( (AT_INT<<SHIFT_TYPE) ), val))
#endif /* HASHPEM */
--- 127,133 ----
((MachineWord*)t)[2]),((MachineWord*)t)[3]))
#define HASHINT(val) \
! FINISH(COMBINE(START( (AT_INT<<SHIFT_TYPE) ), (unsigned int) val))
#endif /* HASHPEM */
***************
*** 708,714 ****
at_blocks[size] = newblock;
top_at_blocks[size] = newblock->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 <aterm2.h>\n\n");
+ fprintf(file, "#include <assert.h>\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);

View file

@ -1,224 +0,0 @@
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);