]> ocean-lang.org Git - ocean/commitdiff
oceani: clean up interp_prog()
authorNeilBrown <neil@brown.name>
Sun, 17 Oct 2021 02:45:18 +0000 (13:45 +1100)
committerNeilBrown <neil@brown.name>
Sat, 30 Oct 2021 22:19:48 +0000 (09:19 +1100)
In particular, use dup_value() to save the command arguments.
But also re-arrange code to make steps a bit cleaner.

Signed-off-by: NeilBrown <neil@brown.name>
csrc/oceani.mdc

index 8faff44e41b8f8f7ab7c954d1436b554efa7b297..b83f6bca4e5a3683d1166281cca7c2852e4dfd9b 100644 (file)
@@ -4221,22 +4221,27 @@ analysis is a bit more interesting at this level.
                while (al) {
                        struct var *v = cast(var, al->left);
                        struct value *vl = v->var->val;
+                       struct value arg;
 
                        if (argv[0] == NULL) {
                                printf("Not enough args\n");
                                exit(1);
                        }
-                       al = cast(binode, al->right);
-                       if (vl)
-                               free_value(v->var->type, vl);
+                       if (v->var->type != Tstr) {
+                               printf("Arg not string!!\n"); // NOTEST
+                               exit(2);                      // NOTEST
+                       }
                        if (!vl) {
                                vl = val_alloc(c, v->var->type, NULL);
                                v->var->val = vl;
                        }
-                       free_value(v->var->type, vl);
-                       vl->str.len = strlen(argv[0]);
-                       vl->str.txt = malloc(vl->str.len);
-                       memcpy(vl->str.txt, argv[0], vl->str.len);
+
+                       arg.str.txt = argv[0];
+                       arg.str.len = strlen(argv[0]);
+                       free_value(Tstr, vl);
+                       dup_value(Tstr, &arg, vl);
+
+                       al = cast(binode, al->right);
                        argv++;
                }
                v = interp_exec(c, p->right, &vtype);