jetcrab\vm/
stack.rs

1use crate::vm::frame::Frame;
2use crate::vm::types::StackIndex;
3use crate::vm::value::Value;
4
5#[derive(Debug, Default)]
6pub struct Stack {
7    pub values: Vec<Value>,
8    pub frames: Vec<Frame>,
9}
10
11impl Stack {
12    pub fn new() -> Self {
13        Self {
14            values: Vec::new(),
15            frames: Vec::new(),
16        }
17    }
18
19    pub fn push(&mut self, value: Value) {
20        self.values.push(value);
21    }
22
23    pub fn pop(&mut self) -> Option<Value> {
24        self.values.pop()
25    }
26
27    pub fn peek(&self) -> Option<&Value> {
28        self.values.last()
29    }
30
31    pub fn peek_mut(&mut self) -> Option<&mut Value> {
32        self.values.last_mut()
33    }
34
35    pub fn size(&self) -> usize {
36        self.values.len()
37    }
38
39    pub fn is_empty(&self) -> bool {
40        self.values.is_empty()
41    }
42
43    pub fn clear(&mut self) {
44        self.values.clear();
45    }
46
47    pub fn get(&self, index: StackIndex) -> Option<&Value> {
48        self.values.get(index.as_usize())
49    }
50
51    pub fn set(&mut self, index: StackIndex, value: Value) -> Result<(), String> {
52        let idx = index.as_usize();
53        if idx < self.values.len() {
54            self.values[idx] = value;
55            Ok(())
56        } else {
57            Err("Stack index out of bounds".to_string())
58        }
59    }
60
61    pub fn push_frame(&mut self, frame: Frame) {
62        self.frames.push(frame);
63    }
64
65    pub fn pop_frame(&mut self) -> Option<Frame> {
66        self.frames.pop()
67    }
68}