aboutsummaryrefslogtreecommitdiffstats
path: root/src/vm.rs
diff options
context:
space:
mode:
authorEdvard Thörnros <edvard.thornros@gmail.com>2021-01-21 20:09:00 +0100
committerEdvard Thörnros <edvard.thornros@gmail.com>2021-01-21 20:09:00 +0100
commit18e7483580c000ee512f4a1f266b39c8f206ba65 (patch)
treed4bbad1dbd1b57e39b48d2a093df32c5bcf01c75 /src/vm.rs
parentd261da01634c5fd62cd68f8c9c39a89422bdd398 (diff)
downloadsylt-18e7483580c000ee512f4a1f266b39c8f206ba65.tar.gz
Pop upvalues
Diffstat (limited to 'src/vm.rs')
-rw-r--r--src/vm.rs10
1 files changed, 10 insertions, 0 deletions
diff --git a/src/vm.rs b/src/vm.rs
index 3a3e752..177c547 100644
--- a/src/vm.rs
+++ b/src/vm.rs
@@ -590,6 +590,12 @@ impl VM {
return Ok(OpResult::Done);
} else {
self.stack[last.stack_offset] = self.stack.pop().unwrap();
+ for slot in last.stack_offset+1..self.stack.len() {
+ if self.upvalues.contains_key(&slot) {
+ let value = self.stack[slot].clone();
+ self.drop_upvalue(slot, value);
+ }
+ }
self.stack.truncate(last.stack_offset + 1);
}
}
@@ -653,6 +659,10 @@ impl VM {
self.stack.push(value.clone());
}
+ Op::PopUpvalue => {
+ self.stack.pop().unwrap();
+ }
+
Op::ReadUpvalue(slot) => {
let value = self.frame().block.borrow().ups[slot].2.as_value();
self.stack.push(value);