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}