use crate::obj::prelude::*; use shredder::{GcSafe, Scan, Scanner}; /// A stack call frame. #[derive(Debug, Clone)] pub enum FrameKind { Native(NativeFunRef, Vec), User { last_pc: usize, stack_base: usize, fun: UserFunRef, }, } unsafe impl Scan for FrameKind { fn scan(&self, scanner: &mut Scanner<'_>) { match self { FrameKind::User { fun, .. } => scanner.scan(fun), _ => { /* no-op */ } } } } unsafe impl GcSafe for FrameKind {} #[derive(Scan, Debug, Clone)] pub struct Frame { locals: Names, kind: FrameKind, } impl Frame { pub fn new(locals: Names, kind: FrameKind) -> Self { Self { locals, kind, } } pub fn locals(&self) -> &Names { &self.locals } pub fn locals_mut(&mut self) -> &mut Names { &mut self.locals } pub fn kind(&self) -> &FrameKind { &self.kind } }