tweaks to hashing
Faster hasing of booleans, correct potential loss of distinction for a compound structure that ends in a symbol or keyword, and shortcuiting lookup in an empty immutable hash table.
This commit is contained in:
parent
52bfb32cd3
commit
671adc0de2
|
@ -1368,9 +1368,14 @@ XFORM_NONGCING static uintptr_t fast_equal_hash_key(Scheme_Object *o, uintptr_t
|
||||||
|
|
||||||
top:
|
top:
|
||||||
t = SCHEME_TYPE(o);
|
t = SCHEME_TYPE(o);
|
||||||
k += t;
|
|
||||||
|
|
||||||
switch(t) {
|
switch(t) {
|
||||||
|
case scheme_true_type:
|
||||||
|
return k + PTR_TO_LONG(o);
|
||||||
|
break;
|
||||||
|
case scheme_false_type:
|
||||||
|
return k + PTR_TO_LONG(o);
|
||||||
|
break;
|
||||||
case scheme_integer_type:
|
case scheme_integer_type:
|
||||||
{
|
{
|
||||||
uintptr_t iv = to_unsigned_hash(SCHEME_INT_VAL(o));
|
uintptr_t iv = to_unsigned_hash(SCHEME_INT_VAL(o));
|
||||||
|
@ -1484,7 +1489,7 @@ XFORM_NONGCING static uintptr_t fast_equal_hash_key(Scheme_Object *o, uintptr_t
|
||||||
# else
|
# else
|
||||||
case scheme_keyword_type:
|
case scheme_keyword_type:
|
||||||
case scheme_symbol_type:
|
case scheme_symbol_type:
|
||||||
return PTR_TO_LONG(o);
|
return k + PTR_TO_LONG(o);
|
||||||
# endif
|
# endif
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
|
@ -1889,7 +1894,7 @@ intptr_t scheme_equal_hash_key(Scheme_Object *o)
|
||||||
uintptr_t k;
|
uintptr_t k;
|
||||||
int done = 1;
|
int done = 1;
|
||||||
|
|
||||||
k = fast_equal_hash_key(o, 0, &done);
|
k = fast_equal_hash_key(o, SCHEME_TYPE(o), &done);
|
||||||
if (done)
|
if (done)
|
||||||
return to_signed_hash(k);
|
return to_signed_hash(k);
|
||||||
else
|
else
|
||||||
|
@ -1917,6 +1922,10 @@ XFORM_NONGCING static uintptr_t fast_equal_hash_key2(Scheme_Object *o, int *_don
|
||||||
*_done = 1;
|
*_done = 1;
|
||||||
|
|
||||||
switch(t) {
|
switch(t) {
|
||||||
|
case scheme_true_type:
|
||||||
|
return 1;
|
||||||
|
case scheme_false_type:
|
||||||
|
return 2;
|
||||||
case scheme_integer_type:
|
case scheme_integer_type:
|
||||||
return t - SCHEME_INT_VAL(o);
|
return t - SCHEME_INT_VAL(o);
|
||||||
#ifdef MZ_USE_SINGLE_FLOATS
|
#ifdef MZ_USE_SINGLE_FLOATS
|
||||||
|
@ -3202,6 +3211,9 @@ Scheme_Object *scheme_hash_tree_get_w_key_wraps(Scheme_Hash_Tree *tree, Scheme_O
|
||||||
int stype, pos;
|
int stype, pos;
|
||||||
|
|
||||||
tree = resolve_placeholder(tree);
|
tree = resolve_placeholder(tree);
|
||||||
|
if (!tree->count)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
stype = SCHEME_TYPE(tree);
|
stype = SCHEME_TYPE(tree);
|
||||||
|
|
||||||
if (stype == scheme_eq_hash_tree_type)
|
if (stype == scheme_eq_hash_tree_type)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user