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>, 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}