feat: less clone, avoid evaluating not depended thunk
This commit is contained in:
12
src/env.rs
12
src/env.rs
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user