feat: less clone, avoid evaluating not depended thunk

This commit is contained in:
2025-06-18 09:32:00 +08:00
parent 3e9f0a72a0
commit d875951c09
14 changed files with 409 additions and 192 deletions

View File

@@ -6,10 +6,10 @@ use hashbrown::HashMap;
use crate::error::{Error, Result};
use crate::stack::Stack;
use crate::ty::internal::{EnvRef, Value};
use crate::ty::internal::Value;
#[derive(Clone)]
pub struct VmEnv {
pub struct Env {
cache: Vec<HashMap<usize, Value>>,
with: Vec<Rc<HashMap<EcoString, Value>>>,
args: Vec<Value>,
@@ -38,7 +38,7 @@ pub enum Type {
With,
}
impl VmEnv {
impl Env {
pub fn new() -> Self {
Self {
cache: Vec::from([HashMap::new()]),
@@ -66,7 +66,7 @@ impl VmEnv {
pub fn lookup_cache(
&mut self,
idx: usize,
f: impl FnOnce(&mut VmEnv) -> Result<Value>,
f: impl FnOnce(&mut Env) -> Result<Value>,
) -> Result<Value> {
for level in self.cache.iter().rev() {
if let Some(ret) = level.get(&idx) {
@@ -99,6 +99,10 @@ impl VmEnv {
self.args.split_off(self.args.len() - len)
}
pub fn reserve_args(&mut self, len: usize) {
self.args.reserve(len);
}
pub fn enter_args(&mut self, args: Vec<Value>) {
self.args.extend(args);
}