cl-interpret: copy-capture closures
This commit is contained in:
@@ -7,12 +7,7 @@ use cl_ast::{
|
||||
use std::collections::{HashMap, HashSet};
|
||||
|
||||
pub fn collect_upvars(f: &Function, env: &Environment) -> super::Upvars {
|
||||
CollectUpvars::new(env)
|
||||
.visit(f)
|
||||
.finish()
|
||||
.into_iter()
|
||||
.map(|(k, v)| (k, env.get_id(v).cloned()))
|
||||
.collect()
|
||||
CollectUpvars::new(env).visit(f).finish_copied()
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
@@ -31,6 +26,14 @@ impl<'env> CollectUpvars<'env> {
|
||||
std::mem::take(&mut self.upvars)
|
||||
}
|
||||
|
||||
pub fn finish_copied(&mut self) -> super::Upvars {
|
||||
let Self { env, upvars, blacklist: _ } = self;
|
||||
std::mem::take(upvars)
|
||||
.into_iter()
|
||||
.map(|(k, v)| (k, env.get_id(v).cloned()))
|
||||
.collect()
|
||||
}
|
||||
|
||||
pub fn add_upvar(&mut self, name: &Sym) {
|
||||
let Self { env, upvars, blacklist } = self;
|
||||
if blacklist.contains(name) || upvars.contains_key(name) {
|
||||
|
||||
Reference in New Issue
Block a user