feat(env): move env out of vm,
This commit is contained in:
@@ -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 => {
|
||||
|
||||
Reference in New Issue
Block a user