use crate::{object::JsObject, vm::CodeBlock};
use boa_gc::{Finalize, Gc, Trace};
#[derive(Clone, Debug, Finalize, Trace)]
pub struct CallFrame {
pub(crate) code: Gc<CodeBlock>,
pub(crate) pc: usize,
#[unsafe_ignore_trace]
pub(crate) catch: Vec<CatchAddresses>,
#[unsafe_ignore_trace]
pub(crate) finally_return: FinallyReturn,
pub(crate) finally_jump: Vec<Option<u32>>,
pub(crate) pop_on_return: usize,
pub(crate) loop_env_stack: Vec<usize>,
#[unsafe_ignore_trace]
pub(crate) try_env_stack: Vec<TryStackEntry>,
pub(crate) param_count: usize,
pub(crate) arg_count: usize,
#[unsafe_ignore_trace]
pub(crate) generator_resume_kind: GeneratorResumeKind,
pub(crate) thrown: bool,
pub(crate) async_generator: Option<JsObject>,
}
impl CallFrame {
pub(crate) fn loop_env_stack_inc(&mut self) {
*self
.loop_env_stack
.last_mut()
.expect("loop environment stack entry must exist") += 1;
}
pub(crate) fn loop_env_stack_dec(&mut self) {
*self
.loop_env_stack
.last_mut()
.expect("loop environment stack entry must exist") -= 1;
}
pub(crate) fn try_env_stack_inc(&mut self) {
self.try_env_stack
.last_mut()
.expect("try environment stack entry must exist")
.num_env += 1;
}
pub(crate) fn try_env_stack_dec(&mut self) {
self.try_env_stack
.last_mut()
.expect("try environment stack entry must exist")
.num_env -= 1;
}
pub(crate) fn try_env_stack_loop_inc(&mut self) {
self.try_env_stack
.last_mut()
.expect("try environment stack entry must exist")
.num_loop_stack_entries += 1;
}
pub(crate) fn try_env_stack_loop_dec(&mut self) {
self.try_env_stack
.last_mut()
.expect("try environment stack entry must exist")
.num_loop_stack_entries -= 1;
}
}
#[derive(Copy, Clone, Debug)]
pub(crate) struct TryStackEntry {
pub(crate) num_env: usize,
pub(crate) num_loop_stack_entries: usize,
}
#[derive(Copy, Clone, Debug)]
pub(crate) struct CatchAddresses {
pub(crate) next: u32,
pub(crate) finally: Option<u32>,
}
#[derive(Copy, Clone, Debug, PartialEq)]
pub(crate) enum FinallyReturn {
None,
Ok,
Err,
}
#[derive(Copy, Clone, Debug, PartialEq)]
pub(crate) enum GeneratorResumeKind {
Normal,
Throw,
Return,
}