From 9e98e1c58af49338d0a0710e27ad0529a32345e6 Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Sun, 17 Oct 2021 13:45:18 +1100 Subject: [PATCH] oceani: clean up interp_prog() 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 --- csrc/oceani.mdc | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/csrc/oceani.mdc b/csrc/oceani.mdc index 8faff44..b83f6bc 100644 --- a/csrc/oceani.mdc +++ b/csrc/oceani.mdc @@ -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); -- 2.43.0