calx_vm/vm/
frame.rs

1use core::fmt;
2use std::rc::Rc;
3
4use crate::calx::{Calx, CalxType};
5
6use super::instr::CalxInstr;
7
8#[derive(Debug, Clone, PartialEq, PartialOrd)]
9pub struct CalxFrame {
10  pub name: Rc<String>,
11  pub locals: Vec<Calx>, // params + added locals
12  /** store return values */
13  pub instrs: Rc<Vec<CalxInstr>>,
14  pub pointer: usize,
15  pub initial_stack_size: usize,
16  pub ret_types: Rc<Vec<CalxType>>,
17}
18
19impl Default for CalxFrame {
20  fn default() -> Self {
21    CalxFrame {
22      name: String::from("<zero>").into(),
23      locals: vec![],
24      instrs: Rc::new(vec![]),
25      pointer: 0,
26      initial_stack_size: 0,
27      ret_types: Rc::new(vec![]),
28    }
29  }
30}
31
32impl fmt::Display for CalxFrame {
33  fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
34    f.write_str("CalxFrame ")?;
35    write!(f, "_{} (", self.initial_stack_size)?;
36    for p in &*self.ret_types {
37      write!(f, "{:?} ", p)?;
38    }
39    write!(f, ") @{}", self.pointer)?;
40    for (idx, instr) in self.instrs.iter().enumerate() {
41      write!(f, "\n  {:02} {:?}", idx, instr)?;
42    }
43    f.write_str("\n")?;
44    Ok(())
45  }
46}