reset ref implementation

This commit is contained in:
J.Teeuwissen 2023-03-30 09:30:09 +02:00
parent d4ed6f7778
commit 9e8b1c0dee
No known key found for this signature in database
GPG key ID: DB5F7A1ED8D478AD
5 changed files with 214 additions and 82 deletions

View file

@ -31,7 +31,6 @@ pub enum HelperOp {
Dec,
DecRef(JoinPointId),
Reset,
// TODO update all usages
ResetRef,
Eq,
}
@ -195,6 +194,38 @@ impl<'a> CodeGenHelp<'a> {
(expr, ctx.new_linker_data)
}
// TODO update to not decrement children.
pub fn call_resetref_refcount(
&mut self,
ident_ids: &mut IdentIds,
layout_interner: &mut STLayoutInterner<'a>,
layout: InLayout<'a>,
argument: Symbol,
) -> (Expr<'a>, Vec<'a, (Symbol, ProcLayout<'a>)>) {
let mut ctx = Context {
new_linker_data: Vec::new_in(self.arena),
recursive_union: None,
op: HelperOp::Reset,
};
let proc_name = self.find_or_create_proc(ident_ids, &mut ctx, layout_interner, layout);
let arguments = self.arena.alloc([argument]);
let ret_layout = layout;
let arg_layouts = self.arena.alloc([layout]);
let expr = Expr::Call(Call {
call_type: CallType::ByName {
name: LambdaName::no_niche(proc_name),
ret_layout,
arg_layouts,
specialization_id: CallSpecId::BACKEND_DUMMY,
},
arguments,
});
(expr, ctx.new_linker_data)
}
/// Generate a refcount increment procedure, *without* a Call expression.
/// *This method should be rarely used* - only when the proc is to be called from Zig.
/// Otherwise you want to generate the Proc and the Call together, using another method.
@ -348,7 +379,7 @@ impl<'a> CodeGenHelp<'a> {
Symbol::ARG_1,
),
),
Reset | ResetRef => (
Reset => (
layout,
refcount::refcount_reset_proc_body(
self,
@ -359,6 +390,17 @@ impl<'a> CodeGenHelp<'a> {
Symbol::ARG_1,
),
),
ResetRef => (
layout,
refcount::refcount_resetref_proc_body(
self,
ident_ids,
ctx,
layout_interner,
layout,
Symbol::ARG_1,
),
),
Eq => (
LAYOUT_BOOL,
equality::eq_generic(self, ident_ids, ctx, layout_interner, layout),