diff options
| author | Kai Stevenson <kai@kaistevenson.com> | 2023-02-17 19:47:10 -0800 |
|---|---|---|
| committer | Kai Stevenson <kai@kaistevenson.com> | 2023-02-17 19:47:10 -0800 |
| commit | dab73c05a0c4529bd26410beae0868ec2ff570c2 (patch) | |
| tree | b9a78a184c1369c53b3788df523bed3b50638fda /src/eval.c | |
| parent | 7703117d5cf08fd77e76c656d38436545b3406ea (diff) | |
fixed all the memory leaks
Diffstat (limited to 'src/eval.c')
| -rw-r--r-- | src/eval.c | 48 |
1 files changed, 30 insertions, 18 deletions
@@ -37,16 +37,25 @@ sym_t* eval(sym_t* symbol, hashtable_t* parentScope) { if (p.key != NULL) { sym_t* nextSym = (sym_t*)p.value; /* add params */ + sym_t** addedArgs = malloc(100 * sizeof(sym_t*)); for (int i = 0; i < symbol->argCount && i < 100; i++) { char* keyName = malloc(6 * sizeof(char)); strcpy(keyName, "arg"); char index[3]; snprintf(index, 3, "%d", i); strcat(keyName, index); - pair_t argPair = init_pair(keyName, eval(symbol->args[i], parentScope)); + sym_t* argV = eval(symbol->args[i], parentScope); + addedArgs[i] = argV; + pair_t argPair = init_pair(keyName, argV); + free(keyName); hashtable_add_pair(newScope, argPair); } returnV = eval(nextSym, newScope); + /* clean up args */ + for (int i = 0; i < symbol->argCount && i < 100; i++) { + destroy_sym(addedArgs[i]); + } + free(addedArgs); } else { printf("no matching pair in hashtable\n"); @@ -76,15 +85,17 @@ sym_t* try_eval_internal(sym_t* symbol, hashtable_t* symbolScope) { /* return last arg, that's the function return line */ exec_all(symbol->args, symbol->argCount - 1, symbolScope); return eval(symbol->args[symbol->argCount - 1], symbolScope); - return init_sym_int(0); } /* TODO: rename storel */ else if (hash == get_hash("store")) { /* first arg is value, remaining args are names */ /* TODO: recursion for multiple pairs */ - char* k = symtos(eval(symbol->args[1], symbolScope)); - sym_t* v = symbol->args[0]; - pair_t p = init_pair(k, (void*)v); + sym_t* v = eval(symbol->args[1], symbolScope); + char* k = symtos(v); + destroy_sym(v); + sym_t* value = symbol->args[0]; + pair_t p = init_pair(k, (void*)value); + free(k); hashtable_add_pair(symbolScope->parent, p); return init_sym_int(1); } @@ -101,14 +112,13 @@ sym_t* try_eval_internal(sym_t* symbol, hashtable_t* symbolScope) { type = v->litType; if (type == INT) { firstInt = symtoi(v); - destroy_sym(v); } else if (type == FLOAT) { } else if (type == STRING) { firstString = symtos(v); - free(v); } + destroy_sym(v); } else { /* interpret type */ @@ -127,12 +137,16 @@ sym_t* try_eval_internal(sym_t* symbol, hashtable_t* symbolScope) { char* ss = symtos(v); if (strcmp(ss, firstString) != 0) { destroy_sym(v); + free(firstString); return init_sym_int(0); } destroy_sym(v); } } } + if (type == STRING) { + free(firstString); + } return init_sym_int(1); } else if (hash == get_hash("if")) { @@ -163,17 +177,15 @@ sym_t* try_eval_internal(sym_t* symbol, hashtable_t* symbolScope) { } else if (hash == get_hash("print")) { sym_t* v = eval(symbol->args[0], symbolScope); - switch (v->litType) { - case NO_TYPE: - break; - case INT: - printf("%d\n", symtoi(v)); - break; - case FLOAT: - break; - case STRING: - printf("%s\n", symtos(v)); - break; + if (v->litType == INT) { + printf("%d\n", symtoi(v)); + } + else if (v->litType == FLOAT) { + } + else if (v->litType == STRING) { + char* s = symtos(v); + printf("%s\n", s); + free(s); } destroy_sym(v); return init_sym_int(1); |
