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 /main.c | |
parent | 8fd005f6185ac76ed0ac2495bd97ee817b472040 (diff) |
Add much better memory handling (We now track and free Datum * structs)
Diffstat (limited to 'main.c')
-rw-r--r-- | main.c | 54 |
1 files changed, 17 insertions, 37 deletions
@@ -52,33 +52,15 @@ restart: } print("\t"); Datum *result = evalline(nil, stdin, 1); - if(result == nil) - continue; - else{ - if(result[0].shy == 0) - print("%S\n", ppdatum(*result)); - if(result->tag == ArrayTag) - freearray(result->array); - free(result); - } - /* print("Unfreed arrays: %d\n", alloccounts); */ + if(result && !result->shy) + print("%S\n", ppdatum(result)); + freedatum(result); +/* + print("Unfreed arrays: %d\n", arrayalloccounts); + print("Unfreed datums: %d\n", datumalloccounts); +*/ } - exits(nil); -} - -Rune * -prompt(Rune *pr) -{ - Rune line[MAX_LINE_LENGTH]; - - print("%S",pr); - - int i = 0; - line[0] = 0; - while(i == 0 || line[i-1] != '\n') - line[i++] = Bgetrune(stdin); - line[i-1] = 0; - return runestrdup(line); + threadexitsall(nil); } Datum * @@ -94,16 +76,14 @@ evalline(Rune *line, Biobuf *bio, int toplevel) Datum *result = eval(stmts, toplevel); if(result) - return result; - else{ - Statement *s = stmts; - while(s != nil){ - Statement *tmp = s; - s = s->next; - free(tmp->toks); - free(tmp); - } - - return nil; + incdatumref(result); + + Statement *s = stmts; + while(s != nil){ + Statement *tmp = s; + s = s->next; + freestatement(*tmp); + free(tmp); } + return result; }
\ No newline at end of file |