From 54b36f9ef7a102cc5405cd2435e423c0ea0d130a Mon Sep 17 00:00:00 2001 From: David Schmenk Date: Wed, 24 Jul 2024 11:19:57 -0700 Subject: [PATCH] Hash symbols for much faster lookup --- images/apple/DRAWL.po | Bin 143360 -> 143360 bytes src/lisp/s-expr.pla | 61 ++++++++++++++++++++++++------------------ 2 files changed, 35 insertions(+), 26 deletions(-) diff --git a/images/apple/DRAWL.po b/images/apple/DRAWL.po index 123b0d6364afa17eb5152e9cfc8a562307b9e5a6..d4b2333c2985ab239a773ecefaf01c83e3d76295 100644 GIT binary patch delta 5862 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 Y@uMs6_LiCO2`8jQV1Iq>E&AC1160--T>t<8 delta 5847 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 - sweep_expr(symptr=>apval ^ NULL_HACK) - elsif symptr=>lambda - sweep_expr(symptr=>lambda) - elsif symptr=>array - memptr = symptr=>array=>arraymem - size = symptr=>array=>arraysize - 1 - for i = 0 to size - sweep_expr(memptr=>[i]) - next - fin - symptr = symptr=>link - loop + for h = 0 to HASH_SIZE-1 + symptr = hashtbl[h] + while symptr + // + // Sweep symbol properties + // + if symptr=>apval + sweep_expr(symptr=>apval ^ NULL_HACK) + elsif symptr=>lambda + sweep_expr(symptr=>lambda) + elsif symptr=>array + memptr = symptr=>array=>arraymem + size = symptr=>array=>arraysize - 1 + for i = 0 to size + sweep_expr(memptr=>[i]) + next + fin + symptr = symptr=>link + loop + next if sweep_stack_top // // Sweep in-flight parameters @@ -304,14 +312,14 @@ def new_array(dim0, dim1, dim2, dim3) return aptr end -def match_sym(symstr) +def match_sym(symstr, sym_list) var symptr byte len, typelen, i len = ^symstr typelen = SYM_TYPE | len len--; symstr++ - symptr = sym_list + symptr = sym_list while symptr if symptr->type == typelen for i = 0 to len @@ -327,13 +335,14 @@ def match_sym(symstr) end export def new_sym(symstr)#1 - var symptr + var symptr, index - symptr = match_sym(symstr) + index = (^symstr ^ ((^(symstr+1) << 1) ^ ^(symstr+1 + ^symstr / 2) << 2)) & HASH_MASK + symptr = match_sym(symstr, hashtbl[index]) if symptr; return symptr; fin // Return already existing symbol symptr = heapalloc(t_sym + ^symstr) - symptr=>link = sym_list - sym_list = symptr + symptr=>link = hashtbl[index] + hashtbl[index] = symptr symptr->type = ^symstr | SYM_TYPE symptr=>natv = NULL symptr=>lambda = NULL