summaryrefslogtreecommitdiff
path: root/symbol.c
diff options
context:
space:
mode:
Diffstat (limited to 'symbol.c')
-rw-r--r--symbol.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/symbol.c b/symbol.c
index 029ab0c..5d88f96 100644
--- a/symbol.c
+++ b/symbol.c
@@ -180,6 +180,9 @@ dupdfnframe(DfnFrame *f)
void
freedfnframe(DfnFrame *f, int keeperrorguards)
{
+ if(f->keep)
+ return;
+
freesymtab(f->symtab);
freedatum(f->lefto);
freedatum(f->righto);
@@ -337,12 +340,19 @@ dupscope(DfnFrame *dfn)
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)
+ if(runestrcmp(new->symtab->syms[j]->name, d->symtab->syms[i]->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);
+ sym = new->symtab->syms[new->symtab->nsyms-1];
+ if(sym->value){
+ if(sym->value->tag == FunctionTag)
+ sym->value->func.scope->keep = 1;
+ if(sym->value->tag == MonadicOpTag || sym->value->tag == DyadicOpTag)
+ sym->value->operator.scope->keep = 1;
+ }
}
}
}