use crate::obj::prelude::*; use shredder::{GcSafe, Scan, Scanner}; /// A stack call frame. #[derive(Debug, Clone)] pub enum FrameKind { Root, Native, 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: Locals, kind: FrameKind, } impl Frame { pub fn new(locals: Locals, kind: FrameKind) -> Self { Self { locals, kind, } } pub fn locals(&self) -> &Locals { &self.locals } pub fn locals_mut(&mut self) -> &mut Locals { &mut self.locals } pub fn kind(&self) -> &FrameKind { &self.kind } }