feat: lookup at downgrade time
works, but leaks memory
This commit is contained in:
@@ -2,15 +2,13 @@ use std::cell::Cell;
|
||||
|
||||
use gc_arena::lock::{GcRefLock, RefLock};
|
||||
use gc_arena::{Collect, Gc, Mutation};
|
||||
use hashbrown::HashMap;
|
||||
use itertools::Itertools;
|
||||
|
||||
use crate::bytecode::Func as BFunc;
|
||||
use crate::env::VmEnv;
|
||||
use crate::error::Result;
|
||||
use crate::ir;
|
||||
use crate::jit::JITFunc;
|
||||
use crate::ty::internal::{Thunk, Value};
|
||||
use crate::ty::internal::Value;
|
||||
use crate::vm::VM;
|
||||
|
||||
#[derive(Debug, Clone, Collect)]
|
||||
@@ -75,45 +73,7 @@ impl<'gc> Func<'gc> {
|
||||
vm: &'gc VM<'gc>,
|
||||
mc: &Mutation<'gc>,
|
||||
) -> Result<Value<'gc>> {
|
||||
use Param::*;
|
||||
|
||||
let mut env = self.env;
|
||||
env = match self.func.param.clone() {
|
||||
Ident(ident) => env.enter_arg(ident, arg, mc),
|
||||
Formals {
|
||||
formals,
|
||||
ellipsis,
|
||||
alias,
|
||||
} => {
|
||||
let arg = arg.unwrap_attr_set();
|
||||
let mut new = HashMap::with_capacity(formals.len() + alias.iter().len());
|
||||
if !ellipsis
|
||||
&& arg
|
||||
.as_inner()
|
||||
.iter()
|
||||
.map(|(k, _)| k)
|
||||
.sorted()
|
||||
.ne(formals.iter().map(|(k, _)| k).sorted())
|
||||
{
|
||||
todo!()
|
||||
}
|
||||
for (formal, default) in formals {
|
||||
let arg = arg
|
||||
.select(formal)
|
||||
.or_else(|| {
|
||||
default
|
||||
.map(|idx| Value::Thunk(Thunk::new(vm.get_thunk(idx), mc)))
|
||||
})
|
||||
.unwrap();
|
||||
new.insert(formal, arg);
|
||||
}
|
||||
if let Some(alias) = alias {
|
||||
new.insert(alias, Value::AttrSet(arg));
|
||||
}
|
||||
env.enter_let(Gc::new(mc, new), mc)
|
||||
}
|
||||
};
|
||||
|
||||
let env = self.env.enter_arg(arg, mc);
|
||||
let compiled = self
|
||||
.compiled
|
||||
.borrow_mut(mc)
|
||||
|
||||
Reference in New Issue
Block a user