allow solve to error safely
This commit is contained in:
parent
2f3ffd1109
commit
7faeef296d
@ -133,8 +133,10 @@ int bn_solve(instance *it)
|
||||
{
|
||||
variable *s = igetarg(it, 0);
|
||||
variable **ops = iparse(it, (const char *)s->value.p);
|
||||
if (ops == 0)
|
||||
return -1;
|
||||
if (ops == 0) {
|
||||
ipush(it, (uint32_t)make_varf(0, 0.0f));
|
||||
return 0;
|
||||
}
|
||||
|
||||
variable *a = isolve(it, ops, 0);
|
||||
free(ops);
|
||||
|
25
parser.c
25
parser.c
@ -290,12 +290,13 @@ int idoline(instance *it, const char *s)
|
||||
return 0;
|
||||
it->lines[it->lnidx] = ops;
|
||||
|
||||
variable **copy;
|
||||
loop:
|
||||
if (it->ret != 0)
|
||||
itryfree(it->ret);
|
||||
it->ret = 0;
|
||||
//if (it->ret != 0)
|
||||
// itryfree(it->ret);
|
||||
//it->ret = 0;
|
||||
|
||||
variable **copy = (variable **)malloc(32 * sizeof(variable *));
|
||||
copy = (variable **)malloc(32 * sizeof(variable *));
|
||||
for (int i = 0; i < 32; i++) {
|
||||
variable *v = it->lines[it->lnidx][i];
|
||||
if (v != 0) {
|
||||
@ -317,8 +318,15 @@ loop:
|
||||
}
|
||||
}
|
||||
it->ret = isolve(it, copy, 0);
|
||||
if (it->ret == 0)
|
||||
if (it->ret == 0) {
|
||||
idelline(copy);
|
||||
} else {
|
||||
variable *ret = igetvar(it, "ANS");
|
||||
ret->type = it->ret->type;
|
||||
ret->value.p = it->ret->value.p;
|
||||
it->ret = ret;
|
||||
}
|
||||
|
||||
free(copy);
|
||||
|
||||
it->lnidx++;
|
||||
@ -580,7 +588,12 @@ variable **iparse(instance *it, const char *s)
|
||||
goto fail;
|
||||
} else {
|
||||
if (ooffset == 0) {
|
||||
ops[ooffset++] = make_varf(0, 0.0f);
|
||||
variable *a;
|
||||
if (it->ret != 0)
|
||||
a = it->ret;
|
||||
else
|
||||
a = make_varf(0, 0.0f);
|
||||
ops[ooffset++] = a;
|
||||
} else if (ops[ooffset - 1]->type == OPERATOR) {
|
||||
free(word);
|
||||
goto fail;
|
||||
|
Loading…
x
Reference in New Issue
Block a user