* Guile does not assume a hash table size of scm_symhash_dim any more.
authorDirk Herrmann <dirk@dirk-herrmanns-seiten.de>
Fri, 8 Dec 2000 13:41:56 +0000 (13:41 +0000)
committerDirk Herrmann <dirk@dirk-herrmanns-seiten.de>
Fri, 8 Dec 2000 13:41:56 +0000 (13:41 +0000)
NEWS
libguile/ChangeLog
libguile/environments.c
libguile/gc.c
libguile/symbols.c
libguile/symbols.h

diff --git a/NEWS b/NEWS
index cc84701..028cb13 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -322,6 +322,8 @@ Use SCM_CDR instead of SCM_GCCDR.
 
 ** Removed function:  scm_struct_init
 
+** Removed variable:  scm_symhash_dim
+
 ** Renamed function: scm_make_cont has been replaced by
 scm_make_continuation, which has a different interface.
 
index 52a2ffc..809d565 100644 (file)
@@ -1,3 +1,23 @@
+2000-12-08  Dirk Herrmann  <D.Herrmann@tu-bs.de>
+
+       * environments.c (DEFAULT_OBARRAY_SIZE), gc.c
+       (DEFAULT_SYMHASH_SIZE):  Added to locally determine arbitrary
+       default values for obarrays, thus removing the dependency from
+       scm_symhash_dim.
+
+       * environments.c (scm_make_leaf_environment,
+       scm_make_eval_environment), gc.c (scm_init_storage):  Don't use
+       scm_symhash_dim.
+
+       * symbols.c (NUM_HASH_BUCKETS), symbols.[ch] (scm_symhash_dim):
+       Removed.
+
+       * symbols.c (scm_sym2vcell, scm_sysintern0_no_module_lookup):
+       Eliminate a redundant SCM_IMP test.
+
+       (scm_sym2vcell, scm_sysintern0_no_module_lookup):
+       Don't assume a fixed obarray size any more.  
+
 2000-12-07  Dirk Herrmann  <D.Herrmann@tu-bs.de>
 
        * gc.c (scm_init_gc):  gc_async is already protected from gc,
index d577e50..8f69106 100644 (file)
@@ -58,6 +58,7 @@
 
 long scm_tc16_environment;
 long scm_tc16_observer;
+#define DEFAULT_OBARRAY_SIZE 137
 
 \f
 
@@ -1036,7 +1037,7 @@ SCM_DEFINE (scm_make_leaf_environment, "make-leaf-environment", 0, 0, 0,
   env = scm_make_environment (body);
 
   core_environments_init (&body->base, &leaf_environment_funcs);
-  body->obarray = scm_make_vector (SCM_MAKINUM (scm_symhash_dim), SCM_EOL);  
+  body->obarray = scm_make_vector (SCM_MAKINUM (DEFAULT_OBARRAY_SIZE), SCM_EOL);  
 
   return env;
 }
@@ -1428,7 +1429,7 @@ SCM_DEFINE (scm_make_eval_environment, "make-eval-environment", 2, 0, 0,
   env = scm_make_environment (body);
 
   core_environments_init (&body->base, &eval_environment_funcs);
-  body->obarray = scm_make_vector (SCM_MAKINUM (scm_symhash_dim), SCM_EOL);  
+  body->obarray = scm_make_vector (SCM_MAKINUM (DEFAULT_OBARRAY_SIZE), SCM_EOL);  
   body->imported = imported;
   body->imported_observer
     = SCM_ENVIRONMENT_OBSERVE (imported, eval_environment_observer, env, 1);
index b50281c..e04d50b 100644 (file)
@@ -2506,9 +2506,12 @@ scm_init_storage (scm_sizet init_heap_size_1, int gc_trigger_1,
   scm_listofnull = scm_cons (SCM_EOL, SCM_EOL);
   scm_nullstr = scm_makstr (0L, 0);
   scm_nullvect = scm_make_vector (SCM_INUM0, SCM_UNDEFINED);
-  scm_symhash = scm_make_vector (SCM_MAKINUM (scm_symhash_dim), SCM_EOL);
-  scm_weak_symhash = scm_make_weak_key_hash_table (SCM_MAKINUM (scm_symhash_dim));
-  scm_symhash_vars = scm_make_vector (SCM_MAKINUM (scm_symhash_dim), SCM_EOL);
+
+#define DEFAULT_SYMHASH_SIZE 277
+  scm_symhash = scm_make_vector (SCM_MAKINUM (DEFAULT_SYMHASH_SIZE), SCM_EOL);
+  scm_weak_symhash = scm_make_weak_key_hash_table (SCM_MAKINUM (DEFAULT_SYMHASH_SIZE));
+  scm_symhash_vars = scm_make_vector (SCM_MAKINUM (DEFAULT_SYMHASH_SIZE), SCM_EOL);
+
   scm_stand_in_procs = SCM_EOL;
   scm_permobjs = SCM_EOL;
   scm_protects = scm_make_vector (SCM_MAKINUM (31), SCM_EOL);
index e4add27..aef98d0 100644 (file)
 
 \f
 
-/* NUM_HASH_BUCKETS is the number of symbol scm_hash table buckets. 
- */
-#define NUM_HASH_BUCKETS 137
-
-\f
-
 static char *
 duplicate_string (const char * src, unsigned long length)
 {
@@ -109,9 +103,6 @@ scm_string_hash (const unsigned char *str, scm_sizet len)
 }
 
 
-int scm_symhash_dim = NUM_HASH_BUCKETS;
-
-
 /* scm_sym2vcell
  * looks up the symbol in the symhash table. 
  */
@@ -131,24 +122,23 @@ scm_sym2vcell (SCM sym, SCM thunk, SCM definep)
 
       if (SCM_FALSEP (var))
        return SCM_BOOL_F;
+      else if (SCM_VARIABLEP (var))
+       return SCM_VARVCELL (var);
       else
-       {
-         if (SCM_IMP(var) || !SCM_VARIABLEP (var))
-           scm_wta (sym, "strangely interned symbol? ", "");
-         return SCM_VARVCELL (var);
-       }
+       scm_wta (sym, "strangely interned symbol? ", "");
     }
   else
     {
       SCM lsym;
       SCM * lsymp;
-      SCM z;
-      scm_sizet hash = SCM_SYMBOL_HASH (sym) % scm_symhash_dim;
+      scm_sizet hash1;
+      scm_sizet hash2;
 
       SCM_DEFER_INTS;
-      for (lsym = SCM_VELTS (scm_symhash)[hash]; SCM_NIMP (lsym); lsym = SCM_CDR (lsym))
+      hash1 = SCM_SYMBOL_HASH (sym) % SCM_VECTOR_LENGTH (scm_symhash);
+      for (lsym = SCM_VELTS (scm_symhash)[hash1]; SCM_NIMP (lsym); lsym = SCM_CDR (lsym))
        {
-         z = SCM_CAR (lsym);
+         SCM z = SCM_CAR (lsym);
          if (SCM_EQ_P (SCM_CAR (z), sym))
            {
              SCM_ALLOW_INTS;
@@ -156,19 +146,20 @@ scm_sym2vcell (SCM sym, SCM thunk, SCM definep)
            }
        }
 
-      for (lsym = *(lsymp = &SCM_VELTS (scm_weak_symhash)[hash]);
+      hash2 = SCM_SYMBOL_HASH (sym) % SCM_VECTOR_LENGTH (scm_weak_symhash);
+      for (lsym = *(lsymp = &SCM_VELTS (scm_weak_symhash)[hash2]);
           SCM_NIMP (lsym);
           lsym = *(lsymp = SCM_CDRLOC (lsym)))
        {
-         z = SCM_CAR (lsym);
+         SCM z = SCM_CAR (lsym);
          if (SCM_EQ_P (SCM_CAR (z), sym))
            {
              if (SCM_NFALSEP (definep))
                {
                  /* Move handle from scm_weak_symhash to scm_symhash. */
                  *lsymp = SCM_CDR (lsym);
-                 SCM_SETCDR (lsym, SCM_VELTS(scm_symhash)[hash]);
-                 SCM_VELTS(scm_symhash)[hash] = lsym;
+                 SCM_SETCDR (lsym, SCM_VELTS(scm_symhash)[hash1]);
+                 SCM_VELTS(scm_symhash)[hash1] = lsym;
                }
              SCM_ALLOW_INTS;
              return z;
@@ -363,7 +354,7 @@ scm_sysintern0_no_module_lookup (const char *name)
       SCM lsym;
       scm_sizet len = strlen (name);
       scm_sizet raw_hash = scm_string_hash ((unsigned char *) name, len);
-      scm_sizet hash = raw_hash % scm_symhash_dim;
+      scm_sizet hash = raw_hash % SCM_VECTOR_LENGTH (scm_symhash);
 
       SCM_NEWCELL2 (lsym);
       SCM_SET_SYMBOL_CHARS (lsym, name);
index 2ce6986..7db965d 100644 (file)
@@ -50,8 +50,6 @@
 #include "libguile/__scm.h"
 \f
 
-extern int scm_symhash_dim;
-
 /* SCM_SYMBOL_LENGTH(SYM) is the length of SYM's name in characters, and
  * SCM_SYMBOL_CHARS(SYM) is the address of the first character of SYM's name.
  */