feat: lots of optimization

* allocate vm stack on the stack
* use Rc instead of Arc
* optimize recursive attribute set
This commit is contained in:
2025-05-11 12:57:29 +08:00
parent 07b486848f
commit 05e82d4021
12 changed files with 137 additions and 111 deletions

View File

@@ -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