summaryrefslogtreecommitdiff
path: root/src/eval.c
diff options
context:
space:
mode:
authorKai Stevenson <kai@kaistevenson.com>2023-02-17 19:47:10 -0800
committerKai Stevenson <kai@kaistevenson.com>2023-02-17 19:47:10 -0800
commitdab73c05a0c4529bd26410beae0868ec2ff570c2 (patch)
treeb9a78a184c1369c53b3788df523bed3b50638fda /src/eval.c
parent7703117d5cf08fd77e76c656d38436545b3406ea (diff)
fixed all the memory leaks
Diffstat (limited to 'src/eval.c')
-rw-r--r--src/eval.c48
1 files changed, 30 insertions, 18 deletions
diff --git a/src/eval.c b/src/eval.c
index 45e727a..dc15223 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -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);