From 759d2d541d943fe95138789477fa6faddf6e3e08 Mon Sep 17 00:00:00 2001 From: glenda Date: Sun, 11 Sep 2022 09:17:43 +0000 Subject: Clone all symbols in scope when spawning a new thread (closures), since the scope may get freed. --- symbol.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) (limited to 'symbol.c') diff --git a/symbol.c b/symbol.c index 8e51ba9..626a2db 100644 --- a/symbol.c +++ b/symbol.c @@ -319,4 +319,32 @@ void setsyntaxerr(Datum *) { throwerror(nil, ESyntax); +} + +DfnFrame * +dupscope(DfnFrame *dfn) +{ + if(dfn == nil) + return nil; + + DfnFrame *new = emallocz(sizeof(DfnFrame), 1); + new->symtab = newsymtab(); + + /* copy ALL symbols which are in scope, into the new symtab */ + for(DfnFrame *d = dfn; d != nil; d = d->chain){ + /* Add all new symbols */ + for(int i = 0; i < d->symtab->nsyms; i++){ + Symbol *sym = d->symtab->syms[i]; + int found = 0; + for(int j = 0; j < new->symtab->nsyms && !found; j++) + if(runestrcmp(new->symtab->syms[i]->name, d->symtab->syms[j]->name) == 0) + found = 1; + if(!found){ + new->symtab->nsyms++; + new->symtab->syms = erealloc(new->symtab->syms, sizeof(Symbol *) * new->symtab->nsyms); + new->symtab->syms[new->symtab->nsyms-1] = dupsymbol(sym); + } + } + } + return new; } \ No newline at end of file -- cgit v1.2.3