From 63c5e49a32fb7bdb98c0d34f2d75ee2621ee4c68 Mon Sep 17 00:00:00 2001 From: Peter Mikkelsen Date: Mon, 24 Jan 2022 00:40:00 +0000 Subject: Fix symbol lookup --- apl9.h | 2 +- functions.c | 4 ++-- lexer.c | 4 ++-- quadnames.c | 2 +- symbol.c | 7 +++++-- 5 files changed, 11 insertions(+), 8 deletions(-) diff --git a/apl9.h b/apl9.h index b6c1138..aaa8d87 100644 --- a/apl9.h +++ b/apl9.h @@ -223,7 +223,7 @@ Array *fillelement(Array *); Datum *eval(Statement *, int); /* symbol.c */ -Symbol *getsym(Rune *); +Symbol *getsym(Rune *, int); void initsymtab(void); DfnFrame *getcurrentdfn(void); DfnFrame *pushdfnframe(Rune *); diff --git a/functions.c b/functions.c index 207daeb..71e99c5 100644 --- a/functions.c +++ b/functions.c @@ -131,14 +131,14 @@ runfunc(Function f, Array *left, Array *right) if(f.type == FunctypeDfn){ pushdfnframe(f.dfn); if(left){ - Symbol *alpha = getsym(L"⍺"); + Symbol *alpha = getsym(L"⍺", 1); alpha->value.tag = ArrayTag; alpha->value.array = left; alpha->undefined = 0; incref(left); } - Symbol *omega = getsym(L"⍵"); + Symbol *omega = getsym(L"⍵", 1); omega->value.tag = ArrayTag; omega->value.array = right; omega->undefined = 0; diff --git a/lexer.c b/lexer.c index 0515727..24d7e00 100644 --- a/lexer.c +++ b/lexer.c @@ -168,7 +168,7 @@ get_digits: }else if(runestrchr(L"⍺⍵", peek)){ Rune name[2] = {peek, 0}; stmt->toks[stmt->ntoks].tag = NameTag; - stmt->toks[stmt->ntoks].symbol = getsym(name); + stmt->toks[stmt->ntoks].symbol = getsym(name, 0); }else if(isalpharune(peek)){ Rune buf[64]; Rune *p = buf; @@ -179,7 +179,7 @@ get_digits: *p = 0; ungetrune(input); stmt->toks[stmt->ntoks].tag = NameTag; - stmt->toks[stmt->ntoks].symbol = getsym(buf); + stmt->toks[stmt->ntoks].symbol = getsym(buf, 0); }else if(runestrchr(L"⎕⍞", peek)){ /* quad names */ Rune buf[64]; diff --git a/quadnames.c b/quadnames.c index be543ff..093a234 100644 --- a/quadnames.c +++ b/quadnames.c @@ -34,7 +34,7 @@ quadnamedatum(QuadnameDef q) d.tag = q.tag; switch(q.tag){ case NameTag: - d.symbol = getsym(q.name); + d.symbol = getsym(q.name, 0); d.symbol->getfn = q.get; d.symbol->setfn = q.set; d.symbol->undefined = 0; diff --git a/symbol.c b/symbol.c index e67f043..e10ee7a 100644 --- a/symbol.c +++ b/symbol.c @@ -11,10 +11,11 @@ Symtab *newsymtab(void); void freesymtab(Symtab *); Symbol * -getsym(Rune *name) +getsym(Rune *name, int fresh) { DfnFrame *dfn = currentdfn; Symtab *tab; + int done = 0; do{ if(dfn != nil) tab = dfn->symtab; @@ -26,7 +27,9 @@ getsym(Rune *name) return tab->syms[i]; if(dfn) dfn = dfn->prev; - }while(dfn != nil); + else + done = 1; + }while(!done && !fresh); tab->nsyms++; tab->syms = realloc(tab->syms, sizeof(Symbol *) * tab->nsyms); -- cgit v1.2.3