feat(env): move env out of vm,

This commit is contained in:
2025-05-23 19:19:20 +08:00
parent 5291e49313
commit b41fd38bcc
10 changed files with 62 additions and 41 deletions

View File

@@ -5,6 +5,7 @@ use std::cell::{Cell, OnceCell, RefCell};
use crate::builtins::env;
use crate::bytecode::{BinOp, Func as F, OpCode, OpCodes, Program, UnOp};
use crate::env::VmEnv;
use crate::error::*;
use crate::jit::{JITContext, JITFunc};
use crate::stack::Stack;
@@ -14,9 +15,6 @@ use crate::ty::public::{self as p, Symbol};
use derive_more::Constructor;
use ecow::EcoString;
pub use env::VmEnv;
mod env;
#[cfg(test)]
mod test;
@@ -156,7 +154,7 @@ impl<'vm, 'jit: 'vm> VM<'jit> {
Sub => {
rhs.neg();
lhs.add(rhs);
},
}
Mul => lhs.mul(rhs),
Div => lhs.div(rhs)?,
And => lhs.and(rhs),
@@ -187,7 +185,17 @@ impl<'vm, 'jit: 'vm> VM<'jit> {
}
OpCode::FinalizeRec => {
let new = self.bump.alloc(HashMap::new_in(&self.bump));
*env = env.enter_let(stack.tos().as_ref().unwrap_attr_set().as_inner().iter().map(|(&k, v)| (k, v.clone())).collect_into(new), &self.bump);
*env = env.enter_let(
stack
.tos()
.as_ref()
.unwrap_attr_set()
.as_inner()
.iter()
.map(|(&k, v)| (k, v.clone()))
.collect_into(new),
&self.bump,
);
stack.tos_mut().as_mut().unwrap_attr_set().capture(env);
}
OpCode::PushStaticAttr { name } => {
@@ -249,12 +257,30 @@ impl<'vm, 'jit: 'vm> VM<'jit> {
}
OpCode::EnterLetEnv => {
let new = self.bump.alloc(HashMap::new_in(&self.bump));
*env = env.enter_let(stack.pop().unwrap_attr_set().into_inner().iter().map(|(&k, v)| (k, v.clone())).collect_into(new), &self.bump);
*env = env.enter_let(
stack
.pop()
.unwrap_attr_set()
.into_inner()
.iter()
.map(|(&k, v)| (k, v.clone()))
.collect_into(new),
&self.bump,
);
}
OpCode::LeaveLetEnv => *env = env.leave(),
OpCode::EnterWithEnv => {
let new = self.bump.alloc(HashMap::new_in(&self.bump));
*env = env.enter_with(stack.pop().unwrap_attr_set().into_inner().iter().map(|(&k, v)| (k, v.clone())).collect_into(new), &self.bump);
*env = env.enter_with(
stack
.pop()
.unwrap_attr_set()
.into_inner()
.iter()
.map(|(&k, v)| (k, v.clone()))
.collect_into(new),
&self.bump,
);
}
OpCode::LeaveWithEnv => *env = env.leave(),
OpCode::Assert => {