use crate::environment::FrozenModuleData;
use crate::eval::compiler::stmt::OptimizeOnFreezeContext;
use crate::eval::Evaluator;
use crate::values::FrozenHeap;
use crate::values::Heap;
pub(crate) trait OptCtxEval<'v, 'a, 'e> {
fn heap(&self) -> &'v Heap;
fn frozen_heap(&self) -> &FrozenHeap;
fn eval(&mut self) -> Option<&mut Evaluator<'v, 'a, 'e>>;
fn frozen_module(&self) -> Option<&FrozenModuleData>;
}
impl<'v, 'a, 'e> OptCtxEval<'v, 'a, 'e> for OptimizeOnFreezeContext<'v, 'a> {
fn heap(&self) -> &'v Heap {
self.heap
}
fn frozen_heap(&self) -> &FrozenHeap {
self.frozen_heap
}
fn eval(&mut self) -> Option<&mut Evaluator<'v, 'a, 'e>> {
None
}
fn frozen_module(&self) -> Option<&FrozenModuleData> {
Some(self.module)
}
}
impl<'v, 'a, 'e> OptCtxEval<'v, 'a, 'e> for Evaluator<'v, 'a, 'e> {
fn heap(&self) -> &'v Heap {
self.heap()
}
fn frozen_heap(&self) -> &FrozenHeap {
self.frozen_heap()
}
fn eval(&mut self) -> Option<&mut Evaluator<'v, 'a, 'e>> {
Some(self)
}
fn frozen_module(&self) -> Option<&FrozenModuleData> {
None
}
}
pub(crate) struct OptCtx<'v, 'a, 'e: 'a, 'x> {
pub(crate) eval: &'x mut dyn OptCtxEval<'v, 'a, 'e>,
pub(crate) param_count: u32,
}
impl<'v, 'a, 'e: 'a, 'x> OptCtx<'v, 'a, 'e, 'x> {
pub(crate) fn new(
eval: &'x mut dyn OptCtxEval<'v, 'a, 'e>,
param_count: u32,
) -> OptCtx<'v, 'a, 'e, 'x> {
OptCtx { eval, param_count }
}
pub(crate) fn heap(&self) -> &'v Heap {
self.eval.heap()
}
pub(crate) fn frozen_heap(&self) -> &FrozenHeap {
self.eval.frozen_heap()
}
pub(crate) fn eval(&mut self) -> Option<&mut Evaluator<'v, 'a, 'e>> {
self.eval.eval()
}
pub(crate) fn frozen_module(&self) -> Option<&FrozenModuleData> {
self.eval.frozen_module()
}
}