fix hashing problem related to non-GCable value in 3m
svn: r9493
This commit is contained in:
parent
3d36ce495b
commit
b9054b366b
|
@ -1196,9 +1196,10 @@ Scheme_Hash_Table *scheme_map_constants_to_globals(void)
|
|||
|
||||
for (i = ht->size; 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);
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
|
|
@ -51,8 +51,6 @@ long PTR_TO_LONG(Scheme_Object *o)
|
|||
v = o->keyex;
|
||||
|
||||
if (!(v & 0xFFFC)) {
|
||||
if (!keygen)
|
||||
keygen += 4;
|
||||
v |= (short)keygen;
|
||||
#ifdef OBJHEAD_HAS_HASH_BITS
|
||||
/* 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
|
||||
v &= ~0x4000;
|
||||
#endif
|
||||
if (!v) v = 0x1AD0;
|
||||
o->keyex = v;
|
||||
keygen += 4;
|
||||
}
|
||||
|
@ -76,7 +75,8 @@ long PTR_TO_LONG(Scheme_Object *o)
|
|||
#endif
|
||||
bits = o->type;
|
||||
|
||||
return (bits << 16) | ((v >> 2) & 0xFFFF);
|
||||
/* Note: low two bits will be ignored */
|
||||
return (bits << 16) | (v & 0xFFFF);
|
||||
}
|
||||
#else
|
||||
# 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)
|
||||
{
|
||||
return PTR_TO_LONG(o);
|
||||
return PTR_TO_LONG(o) >> 2;
|
||||
}
|
||||
|
||||
END_XFORM_SKIP;
|
||||
|
|
|
@ -950,7 +950,7 @@ typedef struct {
|
|||
Otherwise, name is a boxed symbol (or #f) to indicate a method. */
|
||||
|
||||
#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);
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user