diff options
| author | Edvard Thörnros <edvard.thornros@gmail.com> | 2021-03-05 21:17:11 +0100 |
|---|---|---|
| committer | Edvard Thörnros <edvard.thornros@gmail.com> | 2021-03-05 21:17:11 +0100 |
| commit | de7ddbe322b615eeeba17730486da4b9d024ebe2 (patch) | |
| tree | 0ee61640bab0780e0c081e126453c8edbe2b8791 | |
| parent | ba7ebb200cc5560ba0a2237df4a4985fe927b08c (diff) | |
| download | sylt-de7ddbe322b615eeeba17730486da4b9d024ebe2.tar.gz | |
fix the hard test ;)
| -rw-r--r-- | src/vm.rs | 32 |
1 files changed, 18 insertions, 14 deletions
@@ -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, }; |
