Merge pull request #4874 from roc-lang/borrow-own-host-exposed

force host-exposed to always own params
This commit is contained in:
Ayaz 2023-01-10 14:09:09 -06:00 committed by GitHub
commit 9a146d80a4
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 24 additions and 4 deletions

View file

@ -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);

View file

@ -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 = &param_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());

View file

@ -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,
);
}