1use serde::{Deserialize, Serialize};
2
3use crate::value::Value;
4
5#[derive(Debug)]
6#[derive(Deserialize, Serialize)]
7pub struct UpValue {
8 pub slot: usize,
9 pub value: Value,
10}
11
12impl UpValue {
13 pub fn new(slot: usize) -> Self {
14 Self {
15 slot,
16 value: Value::Nil,
17 }
18 }
19
20 pub fn get(&self, stack: &[Value]) -> Value {
21 if self.is_closed() {
22 self.value.clone()
23 } else {
24 stack[self.slot].clone()
25 }
26 }
27
28 pub fn set(&mut self, stack: &mut [Value], value: Value) {
29 if self.is_closed() {
30 self.value = value;
31 } else {
32 stack[self.slot] = value;
33 }
34 }
35
36 pub fn is_closed(&self) -> bool {
37 self.slot == 0
38 }
39
40 pub fn close(&mut self, value: Value) {
41 self.slot = 0;
42 self.value = value;
43 }
44}