summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJo-Philipp Wich <jo@mein.io>2024-11-29 14:00:09 +0100
committerJo-Philipp Wich <jo@mein.io>2024-11-29 16:45:07 +0100
commita6e06417785288f66c990e828cccbf9fb9836ba7 (patch)
treece163bcc204c377c1f315fb15e153124d244360f
parentef1baabc2c429c715405a39aa8b7fa85060804c0 (diff)
vm: resolve upvalues before pushing them onto the stack
Commit e5fe6b1 ("treewide: refactor vector usage code") accidentially dropped the upvalue resolving logic from uc_vm_stack_push(), leading to unresolved upvalues leaking into the script execution context. Fixes: e5fe6b1 ("treewide: refactor vector usage code") Signed-off-by: Jo-Philipp Wich <jo@mein.io>
-rw-r--r--tests/custom/99_bugs/50_missing_upvalue_resolving27
-rw-r--r--vm.c2
2 files changed, 28 insertions, 1 deletions
diff --git a/tests/custom/99_bugs/50_missing_upvalue_resolving b/tests/custom/99_bugs/50_missing_upvalue_resolving
new file mode 100644
index 0000000..5e96634
--- /dev/null
+++ b/tests/custom/99_bugs/50_missing_upvalue_resolving
@@ -0,0 +1,27 @@
+Commit e5fe6b1 ("treewide: refactor vector usage code") accidentially dropped
+the upvalue resolving logic from uc_vm_stack_push(), leading to unresolved
+upvalues leaking into the script execution context.
+
+-- File test.uc --
+export let obj = { foo: true, bar: false };
+-- End --
+
+-- Testcase --
+import * as test from "./files/test.uc";
+
+printf("%.J\n", [
+ type(test.obj),
+ test.obj.foo
+]);
+-- End --
+
+-- Args --
+-R
+-- End --
+
+-- Expect stdout --
+[
+ "object",
+ true
+]
+-- End --
diff --git a/vm.c b/vm.c
index 3dd054b..9488288 100644
--- a/vm.c
+++ b/vm.c
@@ -431,7 +431,7 @@ uc_vm_resolve_upval(uc_vm_t *vm, uc_value_t *value)
void
uc_vm_stack_push(uc_vm_t *vm, uc_value_t *value)
{
- uc_vector_push(&vm->stack, value);
+ uc_vector_push(&vm->stack, uc_vm_resolve_upval(vm, value));
if (vm->trace) {
fprintf(stderr, " [+%zd] %s\n",