diff --git a/Makefile b/Makefile index 5b7b6247..e27b1793 100644 --- a/Makefile +++ b/Makefile @@ -10,7 +10,7 @@ INCDIR=$(PREFIX)/include/chibi-scheme MODDIR=$(PREFIX)/share/chibi-scheme SO=.dylib -CFLAGS=-Wall -g -fno-inline -save-temps -Os +CFLAGS=-Wall -g -save-temps -Os GC_OBJ=./gc/gc.a diff --git a/defaults.h b/defaults.h index 25c99b47..c463c75e 100644 --- a/defaults.h +++ b/defaults.h @@ -31,6 +31,10 @@ #define USE_HUFF_SYMS 1 #endif +#ifndef USE_HASH_SYMS +#define USE_HASH_SYMS 1 +#endif + #ifndef USE_DEBUG #define USE_DEBUG 1 #endif diff --git a/init.scm b/init.scm index 5270fdf2..16e8a236 100644 --- a/init.scm +++ b/init.scm @@ -1,7 +1,4 @@ -;; syntax-rules -;; symbol->string string->symbol - ;; provide c[ad]{2,4}r (define (caar x) (car (car x))) @@ -314,6 +311,9 @@ ;; string utils +(define (symbol->string sym) + (call-with-output-string (lambda (out) (write sym out)))) + (define (list->string ls) (let ((str (make-string (length ls) #\space))) (let lp ((ls ls) (i 0)) diff --git a/opcodes.c b/opcodes.c index 10347def..9e94820f 100644 --- a/opcodes.c +++ b/opcodes.c @@ -85,6 +85,7 @@ _FN2OPT(SEXP_FIXNUM, SEXP_CHAR, "make-string", sexp_make_character(' '), sexp_ma _FN2(SEXP_STRING, SEXP_STRING, "string-cmp", 0, sexp_string_cmp), _FN2(SEXP_STRING, SEXP_STRING, "string-cmp-ci", 0, sexp_string_cmp_ci), _FN3(SEXP_STRING, SEXP_FIXNUM, "substring", 0, sexp_substring), +_FN1(SEXP_STRING, "string->symbol", 0, sexp_string_to_symbol), _FN1(SEXP_PAIR, "string-concatenate", 0, sexp_string_concatenate), _FN2(0, SEXP_PAIR, "memq", 0, sexp_memq), _FN2(0, SEXP_PAIR, "assq", 0, sexp_assq), diff --git a/sexp.c b/sexp.c index 936d70e3..bedd30e2 100644 --- a/sexp.c +++ b/sexp.c @@ -45,13 +45,13 @@ static int is_separator(int c) { return 0 d*4) { - fprintf(stderr, "resizing symbol table!!!!!\n"); - newtable = sexp_alloc(symbol_table_primes[symbol_table_prime_index++] - * sizeof(sexp)); - /* XXXX rehash */ - sexp_free(symbol_table); - symbol_table = newtable; - } - - sym = sexp_alloc_type(symbol, SEXP_SYMBOL); +#if USE_HASH_SYMS + bucket = (sexp_string_hash(p, res) % SEXP_SYMBOL_TABLE_SIZE); +#else + bucket = 0; +#endif len = strlen(str); + for (ls=symbol_table[bucket]; sexp_pairp(ls); ls=sexp_cdr(ls)) + if (strncmp(str, sexp_symbol_data(sexp_car(ls)), len) == 0) + return sexp_car(ls); + + /* not found, make a new symbol */ + sym = sexp_alloc_type(symbol, SEXP_SYMBOL); mystr = sexp_alloc(len+1); memcpy(mystr, str, len+1); mystr[len]=0; sexp_symbol_length(sym) = len; sexp_symbol_data(sym) = mystr; - symbol_table[cell] = sym; - return symbol_table[cell]; + sexp_push(symbol_table[bucket], sym); + return sym; +} + +sexp sexp_string_to_symbol (sexp str) { + return sexp_intern(sexp_string_data(str)); } sexp sexp_make_vector(sexp len, sexp dflt) { @@ -1035,6 +1025,7 @@ sexp sexp_read_from_string(char *str) { } void sexp_init() { + int i; if (! sexp_initialized_p) { sexp_initialized_p = 1; #if USE_BOEHM @@ -1042,7 +1033,8 @@ void sexp_init() { GC_add_roots((char*)&symbol_table, ((char*)&symbol_table)+sizeof(symbol_table)+1); #endif - symbol_table = sexp_alloc(symbol_table_primes[0]*sizeof(sexp)); + for (i=0; i