feat: lots of optimization
* allocate vm stack on the stack * use Rc instead of Arc * optimize recursive attribute set
This commit is contained in:
@@ -1,12 +1,12 @@
|
||||
use std::cell::RefCell;
|
||||
use std::sync::Arc;
|
||||
use std::cell::{OnceCell, RefCell};
|
||||
use std::rc::Rc;
|
||||
|
||||
use crate::ty::common::Symbol;
|
||||
use crate::ty::internal::{_Thunk, Const, PrimOp, RecAttrSet, Thunk, Value};
|
||||
use crate::vm::Env;
|
||||
|
||||
pub fn env<'vm>() -> Arc<Env<'vm>> {
|
||||
let env = Arc::new(Env::empty());
|
||||
pub fn env<'vm>() -> Rc<Env<'vm>> {
|
||||
let env = Rc::new(Env::empty());
|
||||
env.insert(Symbol::from("true"), Value::Const(Const::Bool(true)));
|
||||
env.insert(Symbol::from("false"), Value::Const(Const::Bool(false)));
|
||||
|
||||
@@ -43,24 +43,22 @@ pub fn env<'vm>() -> Arc<Env<'vm>> {
|
||||
}),
|
||||
];
|
||||
|
||||
let builtins_env = Env::empty();
|
||||
let map = builtins_env.enter_rec();
|
||||
let builtins_env = Rc::new(Env::empty());
|
||||
let map = builtins_env.clone().new_rec();
|
||||
for primop in primops {
|
||||
env.insert(
|
||||
Symbol::from(format!("__{}", primop.name)),
|
||||
Value::PrimOp(primop.clone()),
|
||||
);
|
||||
map.borrow_mut()
|
||||
.insert_mut(Symbol::from(primop.name), Value::PrimOp(primop));
|
||||
map.insert(Symbol::from(primop.name), Value::PrimOp(primop));
|
||||
}
|
||||
let builtins = Value::RecAttrSet(RecAttrSet::from_inner(map.clone()));
|
||||
let thunk = Thunk {
|
||||
thunk: RefCell::new(_Thunk::Value(Box::new(builtins.clone()))),
|
||||
env: RefCell::default(),
|
||||
};
|
||||
thunk.capture(Arc::new(builtins_env));
|
||||
map.borrow_mut()
|
||||
.insert_mut(Symbol::from("builtins"), Value::Thunk(thunk));
|
||||
thunk.capture(builtins_env);
|
||||
map.insert(Symbol::from("builtins"), Value::Thunk(thunk));
|
||||
|
||||
env.insert(Symbol::from("builtins"), builtins);
|
||||
env
|
||||
|
||||
Reference in New Issue
Block a user