diff options
author | Peter Mikkelsen <peter@pmikkelsen.com> | 2022-02-09 01:16:03 +0000 |
---|---|---|
committer | Peter Mikkelsen <peter@pmikkelsen.com> | 2022-02-09 01:16:03 +0000 |
commit | 6ed5b9f6d3fdeeed8ecd43b18bae642ec1ec24b1 (patch) | |
tree | cee3f787af7fb7e8b892fb661f63dc9248cd5f61 /symbol.c | |
parent | 8fd005f6185ac76ed0ac2495bd97ee817b472040 (diff) |
Add much better memory handling (We now track and free Datum * structs)
Diffstat (limited to 'symbol.c')
-rw-r--r-- | symbol.c | 64 |
1 files changed, 33 insertions, 31 deletions
@@ -14,8 +14,8 @@ Datum *getalpha(void); Datum *getomega(void); Datum *getalphao(void); Datum *getomegao(void); -void setalpha(Datum); -void setsyntaxerr(Datum); +void setalpha(Datum *); +void setsyntaxerr(Datum *); Symbol * getsym(Rune *name, int fresh) @@ -44,7 +44,7 @@ getsym(Rune *name, int fresh) tab = td->currentdfn->symtab; tab->nsyms++; - tab->syms = realloc(tab->syms, sizeof(Symbol *) * tab->nsyms); + tab->syms = erealloc(tab->syms, sizeof(Symbol *) * tab->nsyms); tab->syms[tab->nsyms-1] = emalloc(sizeof(Symbol)); tab->syms[tab->nsyms-1]->name = runestrdup(name); tab->syms[tab->nsyms-1]->undefined = 1; @@ -71,8 +71,9 @@ freesymtab(Symtab *tab) int i; for(i = 0; i < tab->nsyms; i++){ Symbol *s = tab->syms[i]; - if(s->undefined == 0 && s->value.tag == ArrayTag) - freearray(s->value.array); + if(s->undefined == 0) + freedatum(s->value); + free(s->name); } free(tab->syms); free(tab); @@ -115,18 +116,23 @@ DfnFrame * pushdfnframe(Rune *code, Datum *lefto, Datum *righto, Array *left, Array *right) { ThreadData *td = getthreaddata(); - DfnFrame *new = malloc(sizeof(DfnFrame)); + DfnFrame *new = emalloc(sizeof(DfnFrame)); new->code = code; new->symtab = newsymtab(); new->lefto = lefto; new->righto = righto; + if(lefto) + incdatumref(lefto); + if(righto) + incdatumref(righto); if(left){ - new->left = mallocz(sizeof(Datum), 1); - new->left->tag = ArrayTag; + new->left = allocdatum(ArrayTag, 0); new->left->array = left; + incarrayref(left); }else new->left = nil; new->right = right; + incarrayref(right); new->prev = td->currentdfn; td->currentdfn = new; return new; @@ -139,6 +145,10 @@ popdfnframe(void) if(td->currentdfn != nil){ DfnFrame *prev = td->currentdfn->prev; freesymtab(td->currentdfn->symtab); + freedatum(td->currentdfn->lefto); + freedatum(td->currentdfn->righto); + freedatum(td->currentdfn->left); + freearray(td->currentdfn->right); free(td->currentdfn); td->currentdfn = prev; } @@ -194,14 +204,11 @@ getalpha(void) { DfnFrame *dfn = getcurrentdfn(); Datum *res = nil; - if(dfn == nil) + if(dfn == nil || dfn->left == nil) throwerror(nil, ESyntax); else{ - res = malloc(sizeof(Datum)); - *res = *dfn->left; - if(res->tag == ArrayTag) - incarrayref(res->array); - return res; + res = dfn->left; + incdatumref(res); } return res; } @@ -211,11 +218,10 @@ getomega(void) { DfnFrame *dfn = getcurrentdfn(); Datum *res = nil; - if(dfn == nil) + if(dfn == nil || dfn->right == nil) throwerror(nil, ESyntax); else{ - res = mallocz(sizeof(Datum), 1); - res->tag = ArrayTag; + res = allocdatum(ArrayTag, 0); res->array = dfn->right; incarrayref(res->array); } @@ -227,13 +233,11 @@ getalphao(void) { DfnFrame *dfn = getcurrentdfn(); Datum *res = nil; - if(dfn == nil) + if(dfn == nil || dfn->lefto == nil) throwerror(nil, ESyntax); else{ - res = malloc(sizeof(Datum)); - *res = *dfn->lefto; - if(res->tag == ArrayTag) - incarrayref(res->array); + res = dfn->lefto; + incdatumref(res); } return res; } @@ -243,31 +247,29 @@ getomegao(void) { DfnFrame *dfn = getcurrentdfn(); Datum *res = nil; - if(dfn == nil) + if(dfn == nil || dfn->righto == nil) throwerror(nil, ESyntax); else{ - res = malloc(sizeof(Datum)); - *res = *dfn->righto; - if(res->tag == ArrayTag) - incarrayref(res->array); + res = dfn->righto; + incdatumref(res); } return res; } void -setalpha(Datum new) +setalpha(Datum *new) { DfnFrame *dfn = getcurrentdfn(); if(dfn == nil) throwerror(nil, ESyntax); if(dfn->left == nil){ - dfn->left = malloc(sizeof(Datum)); - *dfn->left = new; + dfn->left = new; + incdatumref(new); } } void -setsyntaxerr(Datum) +setsyntaxerr(Datum *) { throwerror(nil, ESyntax); }
\ No newline at end of file |