diff options
-rw-r--r-- | libguile/ChangeLog | 9 | ||||
-rw-r--r-- | libguile/symbols.c | 12 |
2 files changed, 15 insertions, 6 deletions
diff --git a/libguile/ChangeLog b/libguile/ChangeLog index ebe55bab4..b16dbb77e 100644 --- a/libguile/ChangeLog +++ b/libguile/ChangeLog @@ -1,3 +1,12 @@ +2000-11-01 Dirk Herrmann <D.Herrmann@tu-bs.de> + + * symbols.c (scm_sym2vcell, scm_sym2ovcell_soft, + scm_intern_symbol, scm_unintern_symbol): Symbol objects already + hold their hash values, no need to recompute them. + + (scm_intern_obarray_soft): Speed up search for a matching symbol + by comparing the hash values first. + 2000-10-30 Dirk Herrmann <D.Herrmann@tu-bs.de> * unif.c (scm_make_uve, scm_dimensions_to_uniform_array): Don't diff --git a/libguile/symbols.c b/libguile/symbols.c index 56a4cd9ca..9dd80dd87 100644 --- a/libguile/symbols.c +++ b/libguile/symbols.c @@ -143,8 +143,7 @@ scm_sym2vcell (SCM sym, SCM thunk, SCM definep) SCM lsym; SCM * lsymp; SCM z; - scm_sizet hash - = scm_string_hash (SCM_SYMBOL_UCHARS (sym), SCM_SYMBOL_LENGTH (sym)) % scm_symhash_dim; + scm_sizet hash = SCM_SYMBOL_HASH (sym) % scm_symhash_dim; SCM_DEFER_INTS; for (lsym = SCM_VELTS (scm_symhash)[hash]; SCM_NIMP (lsym); lsym = SCM_CDR (lsym)) @@ -188,8 +187,7 @@ SCM scm_sym2ovcell_soft (SCM sym, SCM obarray) { SCM lsym, z; - scm_sizet hash - = scm_string_hash (SCM_SYMBOL_UCHARS (sym), SCM_SYMBOL_LENGTH (sym)) % SCM_VECTOR_LENGTH (obarray); + scm_sizet hash = SCM_SYMBOL_HASH (sym) % SCM_VECTOR_LENGTH (obarray); SCM_REDEFER_INTS; for (lsym = SCM_VELTS (obarray)[hash]; SCM_NIMP (lsym); @@ -265,6 +263,8 @@ scm_intern_obarray_soft (const char *name,scm_sizet len,SCM obarray,unsigned int SCM a = SCM_CAR (lsym); SCM z = SCM_CAR (a); unsigned char *tmp = SCM_SYMBOL_UCHARS (z); + if (SCM_SYMBOL_HASH (z) != raw_hash) + goto trynext; if (SCM_SYMBOL_LENGTH (z) != len) goto trynext; for (i = len; i--;) @@ -557,7 +557,7 @@ SCM_DEFINE (scm_intern_symbol, "intern-symbol", 2, 0, 0, if (SCM_FALSEP (o)) o = scm_symhash; SCM_VALIDATE_VECTOR (1,o); - hval = scm_string_hash (SCM_SYMBOL_UCHARS (s), SCM_SYMBOL_LENGTH (s)) % SCM_VECTOR_LENGTH (o); + hval = SCM_SYMBOL_HASH (s) % SCM_VECTOR_LENGTH (o); /* If the symbol is already interned, simply return. */ SCM_REDEFER_INTS; { @@ -594,7 +594,7 @@ SCM_DEFINE (scm_unintern_symbol, "unintern-symbol", 2, 0, 0, if (SCM_FALSEP (o)) o = scm_symhash; SCM_VALIDATE_VECTOR (1,o); - hval = scm_string_hash (SCM_SYMBOL_UCHARS (s), SCM_SYMBOL_LENGTH (s)) % SCM_VECTOR_LENGTH (o); + hval = SCM_SYMBOL_HASH (s) % SCM_VECTOR_LENGTH (o); SCM_DEFER_INTS; { SCM lsym_follow; |