diff --git a/compiler/load/src/file.rs b/compiler/load/src/file.rs index 8707d9def6..dde4ff6363 100644 --- a/compiler/load/src/file.rs +++ b/compiler/load/src/file.rs @@ -3952,7 +3952,7 @@ fn make_specializations<'a>( let mut procs = Procs::new_in(arena); procs.partial_procs = procs_base.partial_procs; - procs.module_thunks.extend(procs_base.module_thunks); + procs.module_thunks = procs_base.module_thunks; procs.runtime_errors = procs_base.runtime_errors; procs.imported_module_thunks = procs_base.imported_module_thunks; @@ -3990,7 +3990,7 @@ fn make_specializations<'a>( #[derive(Clone, Debug)] struct ProcsBase<'a> { partial_procs: BumpMap>, - module_thunks: std::vec::Vec, + module_thunks: &'a [Symbol], pending_specializations: BumpMap, PendingSpecialization<'a>>>, runtime_errors: BumpMap, imported_module_thunks: &'a [Symbol], @@ -4028,9 +4028,11 @@ fn build_pending_specializations<'a>( ) -> Msg<'a> { let find_specializations_start = SystemTime::now(); + let mut module_thunks = bumpalo::collections::Vec::new_in(arena); + let mut procs_base = ProcsBase { partial_procs: BumpMap::default(), - module_thunks: std::vec::Vec::new(), + module_thunks: &[], pending_specializations: BumpMap::default(), runtime_errors: BumpMap::default(), imported_module_thunks, @@ -4058,6 +4060,7 @@ fn build_pending_specializations<'a>( Declare(def) | Builtin(def) => add_def_to_module( &mut layout_cache, &mut procs_base, + &mut module_thunks, &mut mono_env, def, &exposed_to_host, @@ -4068,6 +4071,7 @@ fn build_pending_specializations<'a>( add_def_to_module( &mut layout_cache, &mut procs_base, + &mut module_thunks, &mut mono_env, def, &exposed_to_host, @@ -4082,6 +4086,8 @@ fn build_pending_specializations<'a>( } } + procs_base.module_thunks = module_thunks.into_bump_slice(); + let problems = mono_env.problems.to_vec(); let find_specializations_end = SystemTime::now(); @@ -4103,6 +4109,7 @@ fn build_pending_specializations<'a>( fn add_def_to_module<'a>( layout_cache: &mut LayoutCache<'a>, procs: &mut ProcsBase<'a>, + module_thunks: &mut bumpalo::collections::Vec<'a, Symbol>, mono_env: &mut roc_mono::ir::Env<'a, '_>, def: roc_can::def::Def, exposed_to_host: &MutMap, @@ -4193,7 +4200,7 @@ fn add_def_to_module<'a>( } body => { // mark this symbols as a top-level thunk before any other work on the procs - procs.module_thunks.push(symbol); + module_thunks.push(symbol); // If this is an exposed symbol, we need to // register it as such. Otherwise, since it diff --git a/compiler/mono/src/ir.rs b/compiler/mono/src/ir.rs index 18f785ea5c..7726726542 100644 --- a/compiler/mono/src/ir.rs +++ b/compiler/mono/src/ir.rs @@ -8,7 +8,7 @@ use crate::layout::{ }; use bumpalo::collections::Vec; use bumpalo::Bump; -use roc_collections::all::{default_hasher, BumpMap, BumpMapDefault, BumpSet, MutMap, MutSet}; +use roc_collections::all::{default_hasher, BumpMap, BumpMapDefault, MutMap, MutSet}; use roc_module::ident::{ForeignSymbol, Lowercase, TagName}; use roc_module::low_level::LowLevel; use roc_module::symbol::{IdentIds, ModuleId, Symbol}; @@ -418,7 +418,7 @@ impl<'a> ExternalSpecializations<'a> { pub struct Procs<'a> { pub partial_procs: BumpMap>, pub imported_module_thunks: &'a [Symbol], - pub module_thunks: BumpSet, + pub module_thunks: &'a [Symbol], pub pending_specializations: Option, PendingSpecialization<'a>>>>, pub specialized: BumpMap<(Symbol, ProcLayout<'a>), InProgressProc<'a>>, @@ -432,7 +432,7 @@ impl<'a> Procs<'a> { Self { partial_procs: BumpMap::new_in(arena), imported_module_thunks: &[], - module_thunks: BumpSet::new_in(arena), + module_thunks: &[], pending_specializations: Some(BumpMap::new_in(arena)), specialized: BumpMap::new_in(arena), runtime_errors: BumpMap::new_in(arena),