From 6ed5b9f6d3fdeeed8ecd43b18bae642ec1ec24b1 Mon Sep 17 00:00:00 2001 From: Peter Mikkelsen Date: Wed, 9 Feb 2022 01:16:03 +0000 Subject: Add much better memory handling (We now track and free Datum * structs) --- lexer.c | 76 ++++++++++++++++++++++++++++++++--------------------------------- 1 file changed, 38 insertions(+), 38 deletions(-) (limited to 'lexer.c') diff --git a/lexer.c b/lexer.c index 864bb3c..ed2c2e4 100644 --- a/lexer.c +++ b/lexer.c @@ -55,7 +55,7 @@ lexline(InputStream *input, int toplevel) { Statement *stmt = emalloc(sizeof(Statement)); stmt->ntoks = 0; - stmt->toks = mallocz(sizeof(Datum) * MAX_LINE_TOKENS, 1); + stmt->toks = emallocz(sizeof(Datum*) * MAX_LINE_TOKENS, 1); stmt->guard = nil; stmt->next = nil; @@ -67,7 +67,7 @@ lexline(InputStream *input, int toplevel) continue; }else if(runestrchr(L"←⋄\n⍝⍬", peek)){ switch(peek){ - case L'←': stmt->toks[stmt->ntoks].tag = ArrowTag; break; + case L'←': stmt->toks[stmt->ntoks] = allocdatum(ArrowTag, 0); break; case L'\n': case L'⋄': if(stmt->ntoks == 0) @@ -81,9 +81,9 @@ lexline(InputStream *input, int toplevel) ungetrune(input); goto end; case L'⍬': - stmt->toks[stmt->ntoks].tag = ArrayTag; - stmt->toks[stmt->ntoks].array = allocarray(AtypeInt, 1, 0); - stmt->toks[stmt->ntoks].array->shape[0] = 0; + stmt->toks[stmt->ntoks] = allocdatum(ArrayTag, 0); + stmt->toks[stmt->ntoks]->array = allocarray(AtypeInt, 1, 0); + stmt->toks[stmt->ntoks]->array->shape[0] = 0; break; } }else if(!toplevel && peek == ':'){ @@ -115,14 +115,14 @@ lexline(InputStream *input, int toplevel) goto syntax_error; *p = 0; if(oplevel == 0){ - stmt->toks[stmt->ntoks].tag = FunctionTag; - stmt->toks[stmt->ntoks].func.type = FunctypeDfn; - stmt->toks[stmt->ntoks].func.dfn = runestrdup(buf); + stmt->toks[stmt->ntoks] = allocdatum(FunctionTag, 0); + stmt->toks[stmt->ntoks]->func.type = FunctypeDfn; + stmt->toks[stmt->ntoks]->func.dfn = runestrdup(buf); }else{ - stmt->toks[stmt->ntoks].tag = oplevel == 1 ? MonadicOpTag : DyadicOpTag; - stmt->toks[stmt->ntoks].operator.type = OperatortypeDop; - stmt->toks[stmt->ntoks].operator.dyadic = oplevel == 2; - stmt->toks[stmt->ntoks].operator.dop = runestrdup(buf); + stmt->toks[stmt->ntoks] = allocdatum(oplevel == 1 ? MonadicOpTag : DyadicOpTag, 0); + stmt->toks[stmt->ntoks]->operator.type = OperatortypeDop; + stmt->toks[stmt->ntoks]->operator.dyadic = oplevel == 2; + stmt->toks[stmt->ntoks]->operator.dop = runestrdup(buf); } }else if(peek == '('){ int unclosed = 1; @@ -138,27 +138,27 @@ lexline(InputStream *input, int toplevel) if(peek != ')') goto syntax_error; *p = 0; - stmt->toks[stmt->ntoks].tag = LParTag; - stmt->toks[stmt->ntoks].stmt = *lexlinestr(buf, toplevel); + stmt->toks[stmt->ntoks] = allocdatum(LParTag, 0); + stmt->toks[stmt->ntoks]->stmt = *lexlinestr(buf, toplevel); stmt->ntoks++; - stmt->toks[stmt->ntoks].tag = RParTag; + stmt->toks[stmt->ntoks] = allocdatum(RParTag, 0); }else if(p = runestrchr(primfuncnames, peek)){ - stmt->toks[stmt->ntoks].tag = FunctionTag; - stmt->toks[stmt->ntoks].func.type = FunctypePrim; - stmt->toks[stmt->ntoks].func.code = p-primfuncnames; + stmt->toks[stmt->ntoks] = allocdatum(FunctionTag, 0); + stmt->toks[stmt->ntoks]->func.type = FunctypePrim; + stmt->toks[stmt->ntoks]->func.code = p-primfuncnames; }else if(p = runestrchr(primmonopnames, peek)){ - stmt->toks[stmt->ntoks].tag = MonadicOpTag; - stmt->toks[stmt->ntoks].operator.type = OperatortypePrim; - stmt->toks[stmt->ntoks].operator.dyadic = 0; - stmt->toks[stmt->ntoks].operator.code = p-primmonopnames; + stmt->toks[stmt->ntoks] = allocdatum(MonadicOpTag, 0); + stmt->toks[stmt->ntoks]->operator.type = OperatortypePrim; + stmt->toks[stmt->ntoks]->operator.dyadic = 0; + stmt->toks[stmt->ntoks]->operator.code = p-primmonopnames; }else if(p = runestrchr(primdyadopnames, peek)){ - stmt->toks[stmt->ntoks].tag = DyadicOpTag; - stmt->toks[stmt->ntoks].operator.type = OperatortypePrim; - stmt->toks[stmt->ntoks].operator.dyadic = 1; - stmt->toks[stmt->ntoks].operator.code = p-primdyadopnames; + stmt->toks[stmt->ntoks] = allocdatum(DyadicOpTag, 0); + stmt->toks[stmt->ntoks]->operator.type = OperatortypePrim; + stmt->toks[stmt->ntoks]->operator.dyadic = 1; + stmt->toks[stmt->ntoks]->operator.code = p-primdyadopnames; }else if(p = runestrchr(primhybridnames, peek)){ - stmt->toks[stmt->ntoks].tag = HybridTag; - stmt->toks[stmt->ntoks].hybrid = p-primhybridnames; + stmt->toks[stmt->ntoks] = allocdatum(HybridTag, 0); + stmt->toks[stmt->ntoks]->hybrid = p-primhybridnames; }else if(isdigitrune(peek) || peek == L'¯'){ char buf[64]; char *p = buf; @@ -180,12 +180,12 @@ get_digits: } *p = 0; ungetrune(input); - stmt->toks[stmt->ntoks].tag = ArrayTag; - stmt->toks[stmt->ntoks].array = floating ? mkscalarfloat(atof(buf)) : mkscalarint(atoll(buf)); + stmt->toks[stmt->ntoks] = allocdatum(ArrayTag, 0); + stmt->toks[stmt->ntoks]->array = floating ? mkscalarfloat(atof(buf)) : mkscalarint(atoll(buf)); }else if(runestrchr(L"⍺⍵⍶⍹", peek)){ Rune name[2] = {peek, 0}; - stmt->toks[stmt->ntoks].tag = NameTag; - stmt->toks[stmt->ntoks].name = runestrdup(name); + stmt->toks[stmt->ntoks] = allocdatum(NameTag, 0); + stmt->toks[stmt->ntoks]->name = runestrdup(name); }else if(isalpharune(peek) || peek == '_'){ Rune buf[64]; Rune *p = buf; @@ -195,8 +195,8 @@ get_digits: } *p = 0; ungetrune(input); - stmt->toks[stmt->ntoks].tag = NameTag; - stmt->toks[stmt->ntoks].name = runestrdup(buf); + stmt->toks[stmt->ntoks] = allocdatum(NameTag, 0); + stmt->toks[stmt->ntoks]->name = runestrdup(buf); }else if(runestrchr(L"⎕⍞", peek)){ /* quad names */ Rune buf[64]; @@ -241,11 +241,11 @@ get_digits: } if(!done) goto syntax_error; - stmt->toks[stmt->ntoks].tag = ArrayTag; + stmt->toks[stmt->ntoks] = allocdatum(ArrayTag, 0); if(runestrlen(buf) == 1) - stmt->toks[stmt->ntoks].array = mkscalarrune(buf[0]); + stmt->toks[stmt->ntoks]->array = mkscalarrune(buf[0]); else - stmt->toks[stmt->ntoks].array = mkrunearray(buf); + stmt->toks[stmt->ntoks]->array = mkrunearray(buf); }else{ Rune *err; syntax_error: @@ -259,7 +259,7 @@ syntax_error: peek = getrune(input); } end: - stmt->toks = realloc(stmt->toks, sizeof(Datum) * stmt->ntoks); + stmt->toks = erealloc(stmt->toks, sizeof(Datum) * stmt->ntoks); return stmt; } -- cgit v1.2.3