fixed string memory leaks

master
Clyne Sullivan 7 years ago
parent 31458dd042
commit ecbe199cb8

@ -239,8 +239,7 @@ OP_DEF(set)
r->value.f = a->value.f;
} else if (b->type == STRING) {
a->type = STRING;
if (a->value.p != 0)
free((void *)a->value.p);
free((void *)a->value.p);
a->value.p = (uint32_t)strclone((char *)b->value.p);
r->type = STRING;
r->value.p = (uint32_t)strclone((char *)a->value.p);

@ -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;

10
test6

@ -0,0 +1,10 @@
# test6
# used to fix memory leak in setting defined strings
test = "hello"
test = "fail"
a = test
test = "acd"
print(a)
print(test)
Loading…
Cancel
Save