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);
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;
free(it->names);
free(it->stack);
- itryfree(it->ret);
free(it);
}
// 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;
}
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;