This commit is contained in:
Folkert 2021-05-01 00:13:11 +02:00
parent 503d011c43
commit a2f144f4db
3 changed files with 42 additions and 21 deletions

View file

@ -29,6 +29,7 @@ pub type SendMap<K, V> = im::hashmap::HashMap<K, V, BuildHasher>;
pub type SendSet<K> = im::hashset::HashSet<K, BuildHasher>;
pub type BumpMap<'a, K, V> = hashbrown::HashMap<K, V, BuildHasher, hashbrown::BumpWrapper<'a>>;
pub type BumpSet<'a, K> = hashbrown::HashSet<K, BuildHasher, hashbrown::BumpWrapper<'a>>;
pub trait BumpMapDefault<'a> {
fn new_in(arena: &'a bumpalo::Bump) -> Self;
@ -50,6 +51,20 @@ impl<'a, K, V> BumpMapDefault<'a> for BumpMap<'a, K, V> {
}
}
impl<'a, K> BumpMapDefault<'a> for BumpSet<'a, K> {
fn new_in(arena: &'a bumpalo::Bump) -> Self {
hashbrown::HashSet::with_hasher_in(default_hasher(), hashbrown::BumpWrapper(arena))
}
fn with_capacity_in(capacity: usize, arena: &'a bumpalo::Bump) -> Self {
hashbrown::HashSet::with_capacity_and_hasher_in(
capacity,
default_hasher(),
hashbrown::BumpWrapper(arena),
)
}
}
pub fn arena_join<'a, I>(arena: &'a Bump, strings: &mut I, join_str: &str) -> String<'a>
where
I: Iterator<Item = &'a str>,

View file

@ -8,7 +8,7 @@ use roc_builtins::std::StdLib;
use roc_can::constraint::Constraint;
use roc_can::def::{Declaration, Def};
use roc_can::module::{canonicalize_module_defs, Module};
use roc_collections::all::{default_hasher, BumpMap, MutMap, MutSet};
use roc_collections::all::{default_hasher, BumpMap, BumpMapDefault, BumpSet, MutMap, MutSet};
use roc_constrain::module::{
constrain_imports, pre_constrain_imports, ConstrainableImports, Import,
};
@ -369,7 +369,12 @@ struct ModuleCache<'a> {
header_sources: MutMap<ModuleId, (PathBuf, &'a str)>,
}
fn start_phase<'a>(module_id: ModuleId, phase: Phase, state: &mut State<'a>) -> Vec<BuildTask<'a>> {
fn start_phase<'a>(
module_id: ModuleId,
phase: Phase,
arena: &'a Bump,
state: &mut State<'a>,
) -> Vec<BuildTask<'a>> {
// we blindly assume all dependencies are met
match state
@ -391,7 +396,7 @@ fn start_phase<'a>(module_id: ModuleId, phase: Phase, state: &mut State<'a>) ->
.dependencies
.notify(module_id, phase)
.into_iter()
.map(|(module_id, phase)| start_phase(module_id, phase, state))
.map(|(module_id, phase)| start_phase(module_id, phase, arena, state))
.flatten()
.collect();
}
@ -545,7 +550,7 @@ fn start_phase<'a>(module_id: ModuleId, phase: Phase, state: &mut State<'a>) ->
ident_ids,
} = typechecked;
let mut imported_module_thunks = MutSet::default();
let mut imported_module_thunks = BumpSet::new_in(arena);
if let Some(imports) = state.module_cache.imports.get(&module_id) {
for imported in imports.iter() {
@ -971,7 +976,7 @@ enum BuildTask<'a> {
module_timing: ModuleTiming,
layout_cache: LayoutCache<'a>,
solved_subs: Solved<Subs>,
imported_module_thunks: MutSet<Symbol>,
imported_module_thunks: BumpSet<'a, Symbol>,
module_id: ModuleId,
ident_ids: IdentIds,
decls: Vec<Declaration>,
@ -1603,13 +1608,14 @@ where
}
fn start_tasks<'a>(
work: MutSet<(ModuleId, Phase)>,
arena: &'a Bump,
state: &mut State<'a>,
work: MutSet<(ModuleId, Phase)>,
injector: &Injector<BuildTask<'a>>,
worker_listeners: &'a [Sender<WorkerMsg>],
) -> Result<(), LoadingProblem<'a>> {
for (module_id, phase) in work {
for task in start_phase(module_id, phase, state) {
for task in start_phase(module_id, phase, arena, state) {
enqueue_task(&injector, worker_listeners, task)?
}
}
@ -1731,11 +1737,11 @@ fn update<'a>(
state.module_cache.headers.insert(header.module_id, header);
start_tasks(work, &mut state, &injector, worker_listeners)?;
start_tasks(arena, &mut state, work, &injector, worker_listeners)?;
let work = state.dependencies.notify(home, Phase::LoadHeader);
start_tasks(work, &mut state, &injector, worker_listeners)?;
start_tasks(arena, &mut state, work, &injector, worker_listeners)?;
Ok(state)
}
@ -1768,7 +1774,7 @@ fn update<'a>(
let work = state.dependencies.notify(module_id, Phase::Parse);
start_tasks(work, &mut state, &injector, worker_listeners)?;
start_tasks(arena, &mut state, work, &injector, worker_listeners)?;
Ok(state)
}
@ -1803,7 +1809,7 @@ fn update<'a>(
.dependencies
.notify(module_id, Phase::CanonicalizeAndConstrain);
start_tasks(work, &mut state, &injector, worker_listeners)?;
start_tasks(arena, &mut state, work, &injector, worker_listeners)?;
Ok(state)
}
@ -1854,7 +1860,7 @@ fn update<'a>(
.notify(module_id, Phase::CanonicalizeAndConstrain),
);
start_tasks(work, &mut state, &injector, worker_listeners)?;
start_tasks(arena, &mut state, work, &injector, worker_listeners)?;
Ok(state)
}
@ -1956,7 +1962,7 @@ fn update<'a>(
state.constrained_ident_ids.insert(module_id, ident_ids);
}
start_tasks(work, &mut state, &injector, worker_listeners)?;
start_tasks(arena, &mut state, work, &injector, worker_listeners)?;
}
Ok(state)
@ -2011,7 +2017,7 @@ fn update<'a>(
.dependencies
.notify(module_id, Phase::FindSpecializations);
start_tasks(work, &mut state, &injector, worker_listeners)?;
start_tasks(arena, &mut state, work, &injector, worker_listeners)?;
Ok(state)
}
@ -2104,7 +2110,7 @@ fn update<'a>(
existing.extend(requested);
}
start_tasks(work, &mut state, &injector, worker_listeners)?;
start_tasks(arena, &mut state, work, &injector, worker_listeners)?;
}
Ok(state)
@ -3825,7 +3831,7 @@ fn make_specializations<'a>(
fn build_pending_specializations<'a>(
arena: &'a Bump,
solved_subs: Solved<Subs>,
imported_module_thunks: MutSet<Symbol>,
imported_module_thunks: BumpSet<'a, Symbol>,
home: ModuleId,
mut ident_ids: IdentIds,
decls: Vec<Declaration>,

View file

@ -6,7 +6,7 @@ use crate::layout::{
};
use bumpalo::collections::Vec;
use bumpalo::Bump;
use roc_collections::all::{default_hasher, BumpMap, BumpMapDefault, MutMap, MutSet};
use roc_collections::all::{default_hasher, BumpMap, BumpMapDefault, BumpSet, MutMap, MutSet};
use roc_module::ident::{ForeignSymbol, Lowercase, TagName};
use roc_module::low_level::LowLevel;
use roc_module::symbol::{IdentIds, ModuleId, Symbol};
@ -277,8 +277,8 @@ impl ExternalSpecializations {
#[derive(Clone, Debug)]
pub struct Procs<'a> {
pub partial_procs: BumpMap<'a, Symbol, PartialProc<'a>>,
pub imported_module_thunks: MutSet<Symbol>,
pub module_thunks: MutSet<Symbol>,
pub imported_module_thunks: BumpSet<'a, Symbol>,
pub module_thunks: BumpSet<'a, Symbol>,
pub pending_specializations:
Option<MutMap<Symbol, MutMap<Layout<'a>, PendingSpecialization<'a>>>>,
pub specialized: BumpMap<'a, (Symbol, Layout<'a>), InProgressProc<'a>>,
@ -292,8 +292,8 @@ impl<'a> Procs<'a> {
pub fn new_in(arena: &'a Bump) -> Self {
Self {
partial_procs: BumpMap::new_in(arena),
imported_module_thunks: MutSet::default(),
module_thunks: MutSet::default(),
imported_module_thunks: BumpSet::new_in(arena),
module_thunks: BumpSet::new_in(arena),
pending_specializations: Some(MutMap::default()),
specialized: BumpMap::new_in(arena),
runtime_errors: BumpMap::new_in(arena),