use grift_parser::{ArenaIndex, Builtin};
pub trait GcRoots {
fn trace_roots(&self, tracer: &mut dyn FnMut(ArenaIndex));
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct EnvRef(pub(crate) ArenaIndex);
impl EnvRef {
#[inline]
pub const fn index(self) -> ArenaIndex {
self.0
}
#[inline]
pub const fn new(idx: ArenaIndex) -> Self {
EnvRef(idx)
}
}
impl From<ArenaIndex> for EnvRef {
#[inline]
fn from(idx: ArenaIndex) -> Self {
EnvRef(idx)
}
}
impl From<EnvRef> for ArenaIndex {
#[inline]
fn from(r: EnvRef) -> Self {
r.0
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct ExprRef(pub(crate) ArenaIndex);
impl ExprRef {
#[inline]
pub const fn index(self) -> ArenaIndex {
self.0
}
#[inline]
pub const fn new(idx: ArenaIndex) -> Self {
ExprRef(idx)
}
}
impl From<ArenaIndex> for ExprRef {
#[inline]
fn from(idx: ArenaIndex) -> Self {
ExprRef(idx)
}
}
impl From<ExprRef> for ArenaIndex {
#[inline]
fn from(r: ExprRef) -> Self {
r.0
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
#[repr(usize)]
pub enum ContType {
Done = 0,
ApplyForced = 1,
IfBranch = 2,
BuiltinForceArg = 3,
BinaryBuiltinFirst = 4,
BinaryBuiltinSecond = 5,
LambdaFirstBind = 6,
LambdaBindArg = 7,
LambdaRestCollect = 8,
EvalExpr = 9,
BeginSeq = 10,
ApplyFirst = 11,
ApplySecond = 12,
ValuesCollect = 13,
DefineValue = 14,
SetValue = 15,
NativeArgsCollect = 16,
QuasiquoteCar = 17,
QuasiquoteCdr = 18,
QuasiquoteUnquoteWrap = 19,
QuasiquoteNestedWrap = 20,
QuasiquoteSplice = 21,
QuasiquoteSpliceAppend = 22,
LetSyntaxBody = 23,
CallWithValuesProducer = 24,
CallWithValuesConsumer = 25,
CallWithValuesApply = 26,
SyntaxCaseMatch = 27,
SyntaxCaseFender = 28,
CallCcApply = 29,
ContinuationApply = 30,
DynamicWindBefore = 31,
DynamicWindBody = 32,
DynamicWindAfter = 33,
DynamicWindAfterCall = 34,
WindIn = 35,
WindOut = 36,
DynamicWindEvalAfter = 37,
DynamicWindCallBody = 38,
FinishContinuationRestore = 39,
MacroResult = 40,
WithExceptionHandlerEvalThunk = 41,
WithExceptionHandlerCallThunk = 42,
ExceptionHandlerFrame = 43,
RaiseEval = 44,
EvalEnvArg = 45,
VectorMapStep = 46,
VectorForEachStep = 47,
}
impl ContType {
pub fn from_usize(n: usize) -> Option<ContType> {
match n {
0 => Some(ContType::Done),
1 => Some(ContType::ApplyForced),
2 => Some(ContType::IfBranch),
3 => Some(ContType::BuiltinForceArg),
4 => Some(ContType::BinaryBuiltinFirst),
5 => Some(ContType::BinaryBuiltinSecond),
6 => Some(ContType::LambdaFirstBind),
7 => Some(ContType::LambdaBindArg),
8 => Some(ContType::LambdaRestCollect),
9 => Some(ContType::EvalExpr),
10 => Some(ContType::BeginSeq),
11 => Some(ContType::ApplyFirst),
12 => Some(ContType::ApplySecond),
13 => Some(ContType::ValuesCollect),
14 => Some(ContType::DefineValue),
15 => Some(ContType::SetValue),
16 => Some(ContType::NativeArgsCollect),
17 => Some(ContType::QuasiquoteCar),
18 => Some(ContType::QuasiquoteCdr),
19 => Some(ContType::QuasiquoteUnquoteWrap),
20 => Some(ContType::QuasiquoteNestedWrap),
21 => Some(ContType::QuasiquoteSplice),
22 => Some(ContType::QuasiquoteSpliceAppend),
23 => Some(ContType::LetSyntaxBody),
24 => Some(ContType::CallWithValuesProducer),
25 => Some(ContType::CallWithValuesConsumer),
26 => Some(ContType::CallWithValuesApply),
27 => Some(ContType::SyntaxCaseMatch),
28 => Some(ContType::SyntaxCaseFender),
29 => Some(ContType::CallCcApply),
30 => Some(ContType::ContinuationApply),
31 => Some(ContType::DynamicWindBefore),
32 => Some(ContType::DynamicWindBody),
33 => Some(ContType::DynamicWindAfter),
34 => Some(ContType::DynamicWindAfterCall),
35 => Some(ContType::WindIn),
36 => Some(ContType::WindOut),
37 => Some(ContType::DynamicWindEvalAfter),
38 => Some(ContType::DynamicWindCallBody),
39 => Some(ContType::FinishContinuationRestore),
40 => Some(ContType::MacroResult),
41 => Some(ContType::WithExceptionHandlerEvalThunk),
42 => Some(ContType::WithExceptionHandlerCallThunk),
43 => Some(ContType::ExceptionHandlerFrame),
44 => Some(ContType::RaiseEval),
45 => Some(ContType::EvalEnvArg),
46 => Some(ContType::VectorMapStep),
47 => Some(ContType::VectorForEachStep),
_ => None,
}
}
#[inline]
pub const fn as_usize(self) -> usize {
self as usize
}
}
#[derive(Clone, Copy, Debug)]
pub enum TrampolineState {
Eval { expr: ExprRef, env: EnvRef },
Return { val: grift_parser::ArenaIndex },
}
impl GcRoots for TrampolineState {
fn trace_roots(&self, tracer: &mut dyn FnMut(ArenaIndex)) {
match self {
TrampolineState::Eval { expr, env } => {
tracer(expr.0);
tracer(env.0);
}
TrampolineState::Return { val } => {
tracer(*val);
}
}
}
}
pub fn is_binary_builtin(builtin: Builtin) -> bool {
matches!(builtin,
Builtin::Add | Builtin::Sub | Builtin::Mul | Builtin::Div | Builtin::Modulo | Builtin::Remainder |
Builtin::Lt | Builtin::Gt | Builtin::Le | Builtin::Ge | Builtin::NumEq |
Builtin::EqP | Builtin::EqvP | Builtin::Cons
)
}