aboutsummaryrefslogtreecommitdiffstats
path: root/src/vm.rs
diff options
context:
space:
mode:
authorEdvard Thörnros <edvard.thornros@gmail.com>2021-03-05 21:17:11 +0100
committerEdvard Thörnros <edvard.thornros@gmail.com>2021-03-05 21:17:11 +0100
commitde7ddbe322b615eeeba17730486da4b9d024ebe2 (patch)
tree0ee61640bab0780e0c081e126453c8edbe2b8791 /src/vm.rs
parentba7ebb200cc5560ba0a2237df4a4985fe927b08c (diff)
downloadsylt-de7ddbe322b615eeeba17730486da4b9d024ebe2.tar.gz
fix the hard test ;)
Diffstat (limited to 'src/vm.rs')
-rw-r--r--src/vm.rs32
1 files changed, 18 insertions, 14 deletions
diff --git a/src/vm.rs b/src/vm.rs
index 2237896..7cfc8d3 100644
--- a/src/vm.rs
+++ b/src/vm.rs
@@ -236,22 +236,26 @@ impl VM {
let offset = self.frame().stack_offset;
let constant = self.constant(value).clone();
let value = match constant {
- Value::Function(_, block) => {
- let mut ups = Vec::new();
- for (slot, is_up, _) in block.borrow().upvalues.iter() {
- let up = if *is_up {
- if let Value::Function(local_ups, _) = &self.stack[offset] {
- Rc::clone(&local_ups[*slot])
+ Value::Function(ups, block) => {
+ if matches!(block.borrow().linking, BlockLinkState::Linked) {
+ Value::Function(ups.clone(), block)
+ } else {
+ let mut ups = Vec::new();
+ for (slot, is_up, _) in block.borrow().upvalues.iter() {
+ let up = if *is_up {
+ if let Value::Function(local_ups, _) = &self.stack[offset] {
+ Rc::clone(&local_ups[*slot])
+ } else {
+ unreachable!()
+ }
} else {
- unreachable!()
- }
- } else {
- let slot = self.frame().stack_offset + slot;
- Rc::clone(self.find_upvalue(slot))
- };
- ups.push(up);
+ let slot = self.frame().stack_offset + slot;
+ Rc::clone(self.find_upvalue(slot))
+ };
+ ups.push(up);
+ }
+ Value::Function(ups, block)
}
- Value::Function(ups, block)
},
value => value,
};