mirror of
https://github.com/roc-lang/roc.git
synced 2025-08-04 12:18:19 +00:00
Merge pull request #4874 from roc-lang/borrow-own-host-exposed
force host-exposed to always own params
This commit is contained in:
commit
9a146d80a4
3 changed files with 24 additions and 4 deletions
|
@ -3100,6 +3100,11 @@ fn update<'a>(
|
|||
|
||||
debug_print_ir!(state, &layout_interner, ROC_PRINT_IR_AFTER_RESET_REUSE);
|
||||
|
||||
let host_exposed_procs = bumpalo::collections::Vec::from_iter_in(
|
||||
state.exposed_to_host.values.keys().copied(),
|
||||
arena,
|
||||
);
|
||||
|
||||
Proc::insert_refcount_operations(
|
||||
arena,
|
||||
&layout_interner,
|
||||
|
@ -3107,6 +3112,7 @@ fn update<'a>(
|
|||
ident_ids,
|
||||
&mut update_mode_ids,
|
||||
&mut state.procedures,
|
||||
&host_exposed_procs,
|
||||
);
|
||||
|
||||
debug_print_ir!(state, &layout_interner, ROC_PRINT_IR_AFTER_REFCOUNT);
|
||||
|
|
|
@ -34,6 +34,7 @@ impl Ownership {
|
|||
pub fn infer_borrow<'a>(
|
||||
arena: &'a Bump,
|
||||
procs: &MutMap<(Symbol, ProcLayout<'a>), Proc<'a>>,
|
||||
host_exposed_procs: &[Symbol],
|
||||
) -> ParamMap<'a> {
|
||||
// intern the layouts
|
||||
|
||||
|
@ -94,8 +95,12 @@ pub fn infer_borrow<'a>(
|
|||
loop {
|
||||
for index in group.iter_ones() {
|
||||
let (key, proc) = &procs.iter().nth(index).unwrap();
|
||||
|
||||
// host-exposed functions must always own their arguments.
|
||||
let is_host_exposed = host_exposed_procs.contains(&key.0);
|
||||
|
||||
let param_offset = param_map.get_param_offset(key.0, key.1);
|
||||
env.collect_proc(&mut param_map, proc, param_offset);
|
||||
env.collect_proc(&mut param_map, proc, param_offset, is_host_exposed);
|
||||
}
|
||||
|
||||
if !env.modified {
|
||||
|
@ -868,6 +873,7 @@ impl<'a> BorrowInfState<'a> {
|
|||
param_map: &mut ParamMap<'a>,
|
||||
proc: &Proc<'a>,
|
||||
param_offset: ParamOffset,
|
||||
is_host_exposed: bool,
|
||||
) {
|
||||
let old = self.param_set.clone();
|
||||
|
||||
|
@ -876,7 +882,14 @@ impl<'a> BorrowInfState<'a> {
|
|||
self.current_proc = proc.name.name();
|
||||
|
||||
// ensure that current_proc is in the owned map
|
||||
self.owned.entry(proc.name.name()).or_default();
|
||||
let owned_entry = self.owned.entry(proc.name.name()).or_default();
|
||||
|
||||
// host-exposed must own all its params
|
||||
if is_host_exposed {
|
||||
let ParamOffset(index) = param_offset;
|
||||
let params = ¶m_map.declarations[index..][..proc.args.len()];
|
||||
owned_entry.extend(params.iter().map(|p| p.symbol));
|
||||
}
|
||||
|
||||
self.collect_stmt(param_map, &proc.body);
|
||||
self.update_param_map_declaration(param_map, param_offset, proc.args.len());
|
||||
|
|
|
@ -401,8 +401,9 @@ impl<'a> Proc<'a> {
|
|||
ident_ids: &'i mut IdentIds,
|
||||
update_mode_ids: &'i mut UpdateModeIds,
|
||||
procs: &mut MutMap<(Symbol, ProcLayout<'a>), Proc<'a>>,
|
||||
host_exposed_procs: &[Symbol],
|
||||
) {
|
||||
let borrow_params = arena.alloc(crate::borrow::infer_borrow(arena, procs));
|
||||
let borrow_params = crate::borrow::infer_borrow(arena, procs, host_exposed_procs);
|
||||
|
||||
crate::inc_dec::visit_procs(
|
||||
arena,
|
||||
|
@ -410,7 +411,7 @@ impl<'a> Proc<'a> {
|
|||
home,
|
||||
ident_ids,
|
||||
update_mode_ids,
|
||||
borrow_params,
|
||||
arena.alloc(borrow_params),
|
||||
procs,
|
||||
);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue