diff options
author | Clyne Sullivan <tullivan99@gmail.com> | 2018-04-02 16:34:22 -0400 |
---|---|---|
committer | Clyne Sullivan <tullivan99@gmail.com> | 2018-04-02 16:34:22 -0400 |
commit | ecbe199cb823a5017eab8f0f13ce9a91ba61980b (patch) | |
tree | 56f987543b1f10e798648575b78b750c330df9e7 /parser.c | |
parent | 31458dd042da2a3ce732546cd94318457b4f5bcf (diff) |
fixed string memory leaks
Diffstat (limited to 'parser.c')
-rw-r--r-- | parser.c | 12 |
1 files changed, 9 insertions, 3 deletions
@@ -75,6 +75,8 @@ instance *inewinstance(void) void idelline(variable **ops); void idelinstance(instance *it) { + itryfree(it->ret); + for (uint32_t i = 0; i < MAX_LINES; i++) { if (it->lines[i] == 0) continue; @@ -93,7 +95,6 @@ void idelinstance(instance *it) free(it->names); free(it->stack); - itryfree(it->ret); free(it); } @@ -230,7 +231,12 @@ loop: // move result global variable "ANS" variable *ret = igetvar(it, "ANS"); ret->type = it->ret->type; - ret->value.p = it->ret->value.p; + if (ret->type == STRING) { + free((void *)ret->value.p); + ret->value.p = (uint32_t)strclone((char *)it->ret->value.p); + } else { + ret->value.p = it->ret->value.p; + } itryfree(it->ret); it->ret = ret; } @@ -349,7 +355,7 @@ variable *isolve_(instance *it, variable **ops, uint32_t count) return 0; if (!(it->sindent & SKIP)) { - variable *v = !ops[aidx]->tmp ? varclone(ops[aidx]) : ops[aidx]; + variable *v = !ops[aidx]->tmp ? make_varf(0, 0.0f) : ops[aidx]; if (func(v, ops[aidx], ops[bidx]) != 0) return 0; ops[aidx] = v; |