feat: bumpalo
This commit is contained in:
@@ -467,17 +467,11 @@ pub struct Thunk<'jit, 'vm> {
|
||||
|
||||
#[derive(Debug, IsVariant, Unwrap, Clone)]
|
||||
pub enum _Thunk<'jit, 'vm> {
|
||||
Code(&'vm OpCodes, OnceCell<EnvRef<'jit, 'vm>>),
|
||||
Code(&'vm OpCodes, OnceCell<&'vm VmEnv<'jit, 'vm>>),
|
||||
SuspendedFrom(*const Thunk<'jit, 'vm>),
|
||||
Value(Value<'jit, 'vm>),
|
||||
}
|
||||
|
||||
#[derive(Debug, IsVariant, Unwrap, Clone)]
|
||||
pub enum EnvRef<'jit, 'vm> {
|
||||
Strong(Rc<VmEnv<'jit, 'vm>>),
|
||||
Weak(Weak<VmEnv<'jit, 'vm>>),
|
||||
}
|
||||
|
||||
impl<'jit, 'vm> Thunk<'jit, 'vm> {
|
||||
pub fn new(opcodes: &'vm OpCodes) -> Self {
|
||||
Thunk {
|
||||
@@ -485,15 +479,9 @@ impl<'jit, 'vm> Thunk<'jit, 'vm> {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn capture(&self, env: Rc<VmEnv<'jit, 'vm>>) {
|
||||
pub fn capture(&self, env: &'vm VmEnv<'jit, 'vm>) {
|
||||
if let _Thunk::Code(_, envcell) = &*self.thunk.borrow() {
|
||||
envcell.get_or_init(|| EnvRef::Strong(env));
|
||||
}
|
||||
}
|
||||
|
||||
pub fn capture_weak(&self, env: Weak<VmEnv<'jit, 'vm>>) {
|
||||
if let _Thunk::Code(_, envcell) = &*self.thunk.borrow() {
|
||||
envcell.get_or_init(|| EnvRef::Weak(env));
|
||||
envcell.get_or_init(|| env);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -519,10 +507,7 @@ impl<'jit, 'vm> Thunk<'jit, 'vm> {
|
||||
_Thunk::SuspendedFrom(self as *const Thunk),
|
||||
)
|
||||
.unwrap_code();
|
||||
let env = match env.get().unwrap() {
|
||||
EnvRef::Strong(env) => env.clone(),
|
||||
EnvRef::Weak(env) => env.upgrade().unwrap(),
|
||||
};
|
||||
let env = env.get().unwrap();
|
||||
let value = vm.eval(opcodes.iter().copied(), env)?;
|
||||
let _ = std::mem::replace(&mut *self.thunk.borrow_mut(), _Thunk::Value(value));
|
||||
Ok(match unsafe { &*(&*self.thunk.borrow() as *const _) } {
|
||||
|
||||
Reference in New Issue
Block a user