diff options
Diffstat (limited to 'symbol.c')
-rw-r--r-- | symbol.c | 12 |
1 files changed, 11 insertions, 1 deletions
@@ -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; + } } } } |