cl-interpret: copy-capture closures

This commit is contained in:
2025-05-18 11:30:17 -04:00
parent d3e20e53d0
commit ccfa4c7723
3 changed files with 20 additions and 12 deletions

View File

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