fix hashing problem related to non-GCable value in 3m
svn: r9493
This commit is contained in:
parent
3d36ce495b
commit
b9054b366b
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user