--- cvsroot/microscheme/scheme.c 2015/11/28 10:31:40 1.30 +++ cvsroot/microscheme/scheme.c 2015/11/28 10:54:41 1.31 @@ -393,7 +393,7 @@ INTERFACE char * symname (pointer p) { - return strvalue (p); + return strvalue (car (p)); } #if USE_PLIST @@ -1097,7 +1097,7 @@ { int location; - pointer x = mk_string (SCHEME_A_ name); + pointer x = immutable_cons (mk_string (SCHEME_A_ name), NIL); set_typeflag (x, T_SYMBOL); setimmutable (car (x)); @@ -1171,11 +1171,9 @@ static pointer oblist_add_by_name (SCHEME_P_ const char *name) { - pointer x; - - x = immutable_cons (mk_string (SCHEME_A_ name), NIL); + pointer x = mk_string (SCHEME_A_ name); set_typeflag (x, T_SYMBOL); - setimmutable (car (x)); + setimmutable (x); SCHEME_V->oblist = immutable_cons (x, SCHEME_V->oblist); return x; } @@ -2855,6 +2853,21 @@ setenvironment (SCHEME_V->envir); } +static uint32_t +sym_hash (pointer sym, uint32_t size) +{ + uintptr_t ptr = (uintptr_t)sym; + +#if 0 + /* tqable size is prime, so why mix */ + ptr += ptr >> 32; + ptr += ptr >> 16; + ptr += ptr >> 8; +#endif + + return ptr % size; +} + ecb_inline void new_slot_spec_in_env (SCHEME_P_ pointer env, pointer variable, pointer value) { @@ -2862,8 +2875,7 @@ if (is_vector (car (env))) { - int location = hash_fn (symname (variable), veclength (car (env))); - + int location = sym_hash (variable, veclength (car (env))); vector_set (car (env), location, immutable_cons (slot, vector_get (car (env), location))); } else @@ -2874,13 +2886,12 @@ find_slot_in_env (SCHEME_P_ pointer env, pointer hdl, int all) { pointer x, y; - int location; for (x = env; x != NIL; x = cdr (x)) { if (is_vector (car (x))) { - location = hash_fn (symname (hdl), veclength (car (x))); + int location = sym_hash (hdl, veclength (car (x))); y = vector_get (car (x), location); } else