sylt_common/
upvalue.rs

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}