fix hashing problem related to non-GCable value in 3m

svn: r9493
This commit is contained in:
Matthew Flatt 2008-04-26 16:23:26 +00:00
parent 3d36ce495b
commit b9054b366b
3 changed files with 7 additions and 6 deletions

View File

@ -1196,8 +1196,9 @@ Scheme_Hash_Table *scheme_map_constants_to_globals(void)
for (i = ht->size; i--; ) { for (i = ht->size; i--; ) {
Scheme_Bucket *b = bs[i]; Scheme_Bucket *b = bs[i];
if (b && (((Scheme_Bucket_With_Flags *)b)->flags & GLOB_IS_CONST)) if (b && (((Scheme_Bucket_With_Flags *)b)->flags & GLOB_IS_CONST)) {
scheme_hash_set(result, b->val, (Scheme_Object *)b); scheme_hash_set(result, b->val, (Scheme_Object *)b);
}
} }
return result; return result;

View File

@ -51,8 +51,6 @@ long PTR_TO_LONG(Scheme_Object *o)
v = o->keyex; v = o->keyex;
if (!(v & 0xFFFC)) { if (!(v & 0xFFFC)) {
if (!keygen)
keygen += 4;
v |= (short)keygen; v |= (short)keygen;
#ifdef OBJHEAD_HAS_HASH_BITS #ifdef OBJHEAD_HAS_HASH_BITS
/* In 3m mode, we only have 14 bits of hash code in the /* In 3m mode, we only have 14 bits of hash code in the
@ -65,6 +63,7 @@ long PTR_TO_LONG(Scheme_Object *o)
} else } else
v &= ~0x4000; v &= ~0x4000;
#endif #endif
if (!v) v = 0x1AD0;
o->keyex = v; o->keyex = v;
keygen += 4; keygen += 4;
} }
@ -76,7 +75,8 @@ long PTR_TO_LONG(Scheme_Object *o)
#endif #endif
bits = o->type; bits = o->type;
return (bits << 16) | ((v >> 2) & 0xFFFF); /* Note: low two bits will be ignored */
return (bits << 16) | (v & 0xFFFF);
} }
#else #else
# define PTR_TO_LONG(p) ((long)(p)) # define PTR_TO_LONG(p) ((long)(p))
@ -872,7 +872,7 @@ void scheme_init_hash_key_procs(void)
long scheme_hash_key(Scheme_Object *o) long scheme_hash_key(Scheme_Object *o)
{ {
return PTR_TO_LONG(o); return PTR_TO_LONG(o) >> 2;
} }
END_XFORM_SKIP; END_XFORM_SKIP;

View File

@ -950,7 +950,7 @@ typedef struct {
Otherwise, name is a boxed symbol (or #f) to indicate a method. */ Otherwise, name is a boxed symbol (or #f) to indicate a method. */
#define scheme_make_prim_w_arity2(f, n, mina, maxa, minr, maxr) \ #define scheme_make_prim_w_arity2(f, n, mina, maxa, minr, maxr) \
scheme_make_prim_w_everything(f, 0, n, mina, maxa, 0, minr, maxr) scheme_make_prim_w_everything(f, 1, n, mina, maxa, 0, minr, maxr)
Scheme_Object *scheme_unclose_case_lambda(Scheme_Object *expr, int jit); Scheme_Object *scheme_unclose_case_lambda(Scheme_Object *expr, int jit);