mirror of
https://github.com/roc-lang/roc.git
synced 2025-09-27 13:59:08 +00:00
Mark and clear specializations
This commit is contained in:
parent
da604e978e
commit
e31e89ac66
1 changed files with 18 additions and 3 deletions
|
@ -7,7 +7,7 @@ use crate::layout::{
|
||||||
use bumpalo::collections::{CollectIn, Vec};
|
use bumpalo::collections::{CollectIn, Vec};
|
||||||
use bumpalo::Bump;
|
use bumpalo::Bump;
|
||||||
use roc_builtins::bitcode::{FloatWidth, IntWidth};
|
use roc_builtins::bitcode::{FloatWidth, IntWidth};
|
||||||
use roc_can::abilities::AbilitiesStore;
|
use roc_can::abilities::{AbilitiesStore, SpecializationId};
|
||||||
use roc_can::expr::{AnnotatedMark, ClosureData, IntValue};
|
use roc_can::expr::{AnnotatedMark, ClosureData, IntValue};
|
||||||
use roc_collections::all::{default_hasher, BumpMap, BumpMapDefault, MutMap};
|
use roc_collections::all::{default_hasher, BumpMap, BumpMapDefault, MutMap};
|
||||||
use roc_collections::{MutSet, VecMap};
|
use roc_collections::{MutSet, VecMap};
|
||||||
|
@ -2485,7 +2485,7 @@ fn resolve_abilities_in_specialized_body<'a>(
|
||||||
procs: &Procs<'a>,
|
procs: &Procs<'a>,
|
||||||
specialized_body: &roc_can::expr::Expr,
|
specialized_body: &roc_can::expr::Expr,
|
||||||
body_var: Variable,
|
body_var: Variable,
|
||||||
) {
|
) -> std::vec::Vec<SpecializationId> {
|
||||||
use roc_can::expr::Expr;
|
use roc_can::expr::Expr;
|
||||||
use roc_can::traverse::{walk_expr, PatternVisitor, Visitor};
|
use roc_can::traverse::{walk_expr, PatternVisitor, Visitor};
|
||||||
use roc_unify::unify::unify;
|
use roc_unify::unify::unify;
|
||||||
|
@ -2495,6 +2495,7 @@ fn resolve_abilities_in_specialized_body<'a>(
|
||||||
procs: &'a Procs<'a>,
|
procs: &'a Procs<'a>,
|
||||||
abilities_store: &'a mut AbilitiesStore,
|
abilities_store: &'a mut AbilitiesStore,
|
||||||
seen_defs: MutSet<Symbol>,
|
seen_defs: MutSet<Symbol>,
|
||||||
|
specialized: std::vec::Vec<SpecializationId>,
|
||||||
}
|
}
|
||||||
impl PatternVisitor for Resolver<'_> {}
|
impl PatternVisitor for Resolver<'_> {}
|
||||||
impl Visitor for Resolver<'_> {
|
impl Visitor for Resolver<'_> {
|
||||||
|
@ -2558,6 +2559,9 @@ fn resolve_abilities_in_specialized_body<'a>(
|
||||||
|
|
||||||
self.abilities_store
|
self.abilities_store
|
||||||
.insert_resolved(*specialization_id, specialization);
|
.insert_resolved(*specialization_id, specialization);
|
||||||
|
|
||||||
|
debug_assert!(!self.specialized.contains(&specialization_id));
|
||||||
|
self.specialized.push(*specialization_id);
|
||||||
}
|
}
|
||||||
_ => walk_expr(self, expr),
|
_ => walk_expr(self, expr),
|
||||||
}
|
}
|
||||||
|
@ -2569,8 +2573,11 @@ fn resolve_abilities_in_specialized_body<'a>(
|
||||||
procs,
|
procs,
|
||||||
abilities_store: env.abilities_store,
|
abilities_store: env.abilities_store,
|
||||||
seen_defs: MutSet::default(),
|
seen_defs: MutSet::default(),
|
||||||
|
specialized: vec![],
|
||||||
};
|
};
|
||||||
specializer.visit_expr(specialized_body, Region::zero(), body_var);
|
specializer.visit_expr(specialized_body, Region::zero(), body_var);
|
||||||
|
|
||||||
|
specializer.specialized
|
||||||
}
|
}
|
||||||
|
|
||||||
fn specialize_external<'a>(
|
fn specialize_external<'a>(
|
||||||
|
@ -2708,9 +2715,17 @@ fn specialize_external<'a>(
|
||||||
};
|
};
|
||||||
|
|
||||||
let body = partial_proc.body.clone();
|
let body = partial_proc.body.clone();
|
||||||
resolve_abilities_in_specialized_body(env, procs, &body, partial_proc.body_var);
|
let resolved_ability_specializations =
|
||||||
|
resolve_abilities_in_specialized_body(env, procs, &body, partial_proc.body_var);
|
||||||
|
|
||||||
let mut specialized_body = from_can(env, partial_proc.body_var, body, procs, layout_cache);
|
let mut specialized_body = from_can(env, partial_proc.body_var, body, procs, layout_cache);
|
||||||
|
|
||||||
|
// reset the resolved ability specializations so as not to interfere with other specializations
|
||||||
|
// of this proc.
|
||||||
|
resolved_ability_specializations
|
||||||
|
.into_iter()
|
||||||
|
.for_each(|sid| env.abilities_store.remove_resolved(sid));
|
||||||
|
|
||||||
match specialized {
|
match specialized {
|
||||||
SpecializedLayout::FunctionPointerBody {
|
SpecializedLayout::FunctionPointerBody {
|
||||||
ret_layout,
|
ret_layout,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue