summaryrefslogtreecommitdiff
path: root/symbol.c
diff options
context:
space:
mode:
authorPeter Mikkelsen <peter@pmikkelsen.com>2022-02-09 01:16:03 +0000
committerPeter Mikkelsen <peter@pmikkelsen.com>2022-02-09 01:16:03 +0000
commit6ed5b9f6d3fdeeed8ecd43b18bae642ec1ec24b1 (patch)
treecee3f787af7fb7e8b892fb661f63dc9248cd5f61 /symbol.c
parent8fd005f6185ac76ed0ac2495bd97ee817b472040 (diff)
Add much better memory handling (We now track and free Datum * structs)
Diffstat (limited to 'symbol.c')
-rw-r--r--symbol.c64
1 files changed, 33 insertions, 31 deletions
diff --git a/symbol.c b/symbol.c
index 4240ace..046857b 100644
--- a/symbol.c
+++ b/symbol.c
@@ -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