]> code.bitgloo.com Git - clyne/interpreter.git/commitdiff
allow solve to error safely
authorClyne Sullivan <clyne@bitgloo.com>
Wed, 28 Mar 2018 15:56:35 +0000 (11:56 -0400)
committerClyne Sullivan <clyne@bitgloo.com>
Wed, 28 Mar 2018 15:56:35 +0000 (11:56 -0400)
builtins.c
parser.c

index c68b3d96873c86b6f93c55f7e927e057fab3da49..883dd207696afc9e8e94a507de2c75ffccbf5d4a 100644 (file)
@@ -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);
index ecf3a506e238e0e56e697eb3c22fb8f34044c42d..a1e96cf74878441e20191d70331d7deab4ae2812 100644 (file)
--- a/parser.c
+++ b/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;