move around hostexposedalias logic

This commit is contained in:
Folkert 2023-08-09 15:09:03 +02:00
parent 5d3c7a9363
commit 7fb4b60b21
No known key found for this signature in database
GPG key ID: 1F17F6FFD112B97C
11 changed files with 120 additions and 123 deletions

View file

@ -307,7 +307,7 @@ pub struct Proc<'a> {
pub closure_data_layout: Option<InLayout<'a>>,
pub ret_layout: InLayout<'a>,
pub is_self_recursive: SelfRecursive,
pub host_exposed_layouts: HostExposedLayouts<'a>,
pub is_host_exposed: bool,
pub is_erased: bool,
}
@ -905,12 +905,16 @@ impl<'a> SpecializationStack<'a> {
}
}
pub type HostExposedLambdaSets<'a> =
std::vec::Vec<(LambdaName<'a>, Symbol, HostExposedLambdaSet<'a>)>;
#[derive(Clone, Debug)]
pub struct Procs<'a> {
pub partial_procs: PartialProcs<'a>,
ability_member_aliases: AbilityAliases,
pending_specializations: PendingSpecializations<'a>,
specialized: Specialized<'a>,
host_exposed_lambda_sets: HostExposedLambdaSets<'a>,
pub runtime_errors: BumpMap<Symbol, &'a str>,
pub externals_we_need: BumpMap<ModuleId, ExternalSpecializations<'a>>,
symbol_specializations: SymbolSpecializations<'a>,
@ -930,6 +934,7 @@ impl<'a> Procs<'a> {
specialized: Specialized::default(),
runtime_errors: BumpMap::new_in(arena),
externals_we_need: BumpMap::new_in(arena),
host_exposed_lambda_sets: std::vec::Vec::new(),
symbol_specializations: Default::default(),
specialization_stack: SpecializationStack(Vec::with_capacity_in(16, arena)),
@ -995,7 +1000,11 @@ impl<'a> Procs<'a> {
pub fn get_specialized_procs_without_rc(
self,
) -> (MutMap<(Symbol, ProcLayout<'a>), Proc<'a>>, ProcsBase<'a>) {
) -> (
MutMap<(Symbol, ProcLayout<'a>), Proc<'a>>,
HostExposedLambdaSets<'a>,
ProcsBase<'a>,
) {
let mut specialized_procs =
MutMap::with_capacity_and_hasher(self.specialized.len(), default_hasher());
@ -1013,7 +1022,11 @@ impl<'a> Procs<'a> {
imported_module_thunks: self.imported_module_thunks,
};
(specialized_procs, restored_procs_base)
(
specialized_procs,
self.host_exposed_lambda_sets,
restored_procs_base,
)
}
// TODO trim these down
@ -3062,9 +3075,9 @@ fn specialize_host_specializations<'a>(
let offset_variable = StorageSubs::merge_into(store, env.subs);
for (symbol, from_app, opt_from_platform) in it {
for (lambda_name, from_app, opt_from_platform) in it {
let from_app = offset_variable(from_app);
let index = specialize_external_help(env, procs, layout_cache, symbol, from_app);
let index = specialize_external_help(env, procs, layout_cache, lambda_name, from_app);
let Some(from_platform) = opt_from_platform else { continue };
@ -3095,8 +3108,6 @@ fn specialize_host_specializations<'a>(
}
}
let mut aliases = BumpMap::default();
for (var, id) in hels {
let symbol = env.unique_symbol();
let lambda_name = LambdaName::no_niche(symbol);
@ -3128,20 +3139,10 @@ fn specialize_host_specializations<'a>(
raw_function_layout,
};
aliases.insert(key, hels);
}
let in_progress = &mut procs.specialized.procedures[index.0];
let InProgressProc::Done(proc) = in_progress else { unreachable!() };
let in_progress = &mut procs.specialized.procedures[index.0];
let InProgressProc::Done(proc) = in_progress else { unreachable!() };
match &mut proc.host_exposed_layouts {
HostExposedLayouts::HostExposed { aliases: old, .. } => old.extend(aliases),
hep @ HostExposedLayouts::NotHostExposed => {
*hep = HostExposedLayouts::HostExposed {
aliases,
rigids: Default::default(),
};
}
procs.host_exposed_lambda_sets.push((proc.name, key, hels));
}
}
}
@ -3308,7 +3309,7 @@ fn generate_runtime_error_function<'a>(
closure_data_layout: None,
ret_layout,
is_self_recursive: SelfRecursive::NotSelfRecursive,
host_exposed_layouts: HostExposedLayouts::NotHostExposed,
is_host_exposed: false,
is_erased,
}
}
@ -3404,7 +3405,7 @@ fn generate_host_exposed_function<'a>(
closure_data_layout: None,
ret_layout: result,
is_self_recursive: SelfRecursive::NotSelfRecursive,
host_exposed_layouts: HostExposedLayouts::NotHostExposed,
is_host_exposed: false,
is_erased: false,
};
@ -3469,7 +3470,7 @@ fn generate_host_exposed_lambda_set<'a>(
closure_data_layout: None,
ret_layout: return_layout,
is_self_recursive: SelfRecursive::NotSelfRecursive,
host_exposed_layouts: HostExposedLayouts::NotHostExposed,
is_host_exposed: false,
is_erased: false,
};
@ -3533,9 +3534,6 @@ fn specialize_proc_help<'a>(
let body = partial_proc.body.clone();
let body_var = partial_proc.body_var;
// host-exposed functions are tagged on later
let host_exposed_layouts = HostExposedLayouts::NotHostExposed;
let mut specialized_body = from_can(env, body_var, body, procs, layout_cache);
let specialized_proc = match specialized {
@ -3567,7 +3565,7 @@ fn specialize_proc_help<'a>(
closure_data_layout: Some(closure_data_layout),
ret_layout,
is_self_recursive: recursivity,
host_exposed_layouts,
is_host_exposed: false,
is_erased,
}
}
@ -3770,7 +3768,7 @@ fn specialize_proc_help<'a>(
closure_data_layout,
ret_layout,
is_self_recursive: recursivity,
host_exposed_layouts,
is_host_exposed: false,
is_erased,
}
}
@ -10330,7 +10328,7 @@ where
closure_data_layout: None,
ret_layout: *field,
is_self_recursive: SelfRecursive::NotSelfRecursive,
host_exposed_layouts: HostExposedLayouts::NotHostExposed,
is_host_exposed: false,
is_erased: false,
};
@ -10426,7 +10424,7 @@ where
closure_data_layout: None,
ret_layout: *field,
is_self_recursive: SelfRecursive::NotSelfRecursive,
host_exposed_layouts: HostExposedLayouts::NotHostExposed,
is_host_exposed: false,
is_erased: false,
};