mirror of
https://github.com/roc-lang/roc.git
synced 2025-09-24 20:42:29 +00:00
List takes interned element
This commit is contained in:
parent
f2a42affd1
commit
e4b5252e51
16 changed files with 173 additions and 83 deletions
|
@ -630,12 +630,14 @@ fn eq_list<'a>(
|
|||
ident_ids: &mut IdentIds,
|
||||
ctx: &mut Context<'a>,
|
||||
layout_interner: &mut STLayoutInterner<'a>,
|
||||
elem_layout: &Layout<'a>,
|
||||
elem_layout: InLayout<'a>,
|
||||
) -> Stmt<'a> {
|
||||
use LowLevel::*;
|
||||
let layout_isize = root.layout_isize;
|
||||
let arena = root.arena;
|
||||
|
||||
let elem_layout = layout_interner.get(elem_layout);
|
||||
|
||||
// A "Box" layout (heap pointer to a single list element)
|
||||
let box_union_layout = UnionLayout::NonNullableUnwrapped(root.arena.alloc([*elem_layout]));
|
||||
let box_layout = Layout::Union(box_union_layout);
|
||||
|
|
|
@ -444,10 +444,11 @@ impl<'a> CodeGenHelp<'a> {
|
|||
layout: Layout<'a>,
|
||||
) -> Layout<'a> {
|
||||
match layout {
|
||||
Layout::Builtin(Builtin::List(v)) => Layout::Builtin(Builtin::List(
|
||||
self.arena
|
||||
.alloc(self.replace_rec_ptr(ctx, layout_interner, *v)),
|
||||
)),
|
||||
Layout::Builtin(Builtin::List(v)) => {
|
||||
let v = self.replace_rec_ptr(ctx, layout_interner, *layout_interner.get(v));
|
||||
let v = layout_interner.insert(self.arena.alloc(v));
|
||||
Layout::Builtin(Builtin::List(v))
|
||||
}
|
||||
|
||||
Layout::Builtin(_) => layout,
|
||||
|
||||
|
|
|
@ -11,7 +11,7 @@ use crate::code_gen_help::let_lowlevel;
|
|||
use crate::ir::{
|
||||
BranchInfo, Call, CallType, Expr, JoinPointId, Literal, ModifyRc, Param, Stmt, UpdateModeId,
|
||||
};
|
||||
use crate::layout::{Builtin, Layout, STLayoutInterner, TagIdIntType, UnionLayout};
|
||||
use crate::layout::{Builtin, InLayout, Layout, STLayoutInterner, TagIdIntType, UnionLayout};
|
||||
|
||||
use super::{CodeGenHelp, Context, HelperOp};
|
||||
|
||||
|
@ -425,7 +425,10 @@ where
|
|||
use UnionLayout::*;
|
||||
|
||||
match layout {
|
||||
Layout::Builtin(Builtin::List(elem_layout)) => is_rc_implemented_yet(interner, elem_layout),
|
||||
Layout::Builtin(Builtin::List(elem_layout)) => {
|
||||
let elem_layout = interner.get(*elem_layout);
|
||||
is_rc_implemented_yet(interner, elem_layout)
|
||||
}
|
||||
Layout::Builtin(_) => true,
|
||||
Layout::Struct { field_layouts, .. } => field_layouts
|
||||
.iter()
|
||||
|
@ -761,12 +764,14 @@ fn refcount_list<'a>(
|
|||
ctx: &mut Context<'a>,
|
||||
layout_interner: &mut STLayoutInterner<'a>,
|
||||
layout: &Layout,
|
||||
elem_layout: &'a Layout,
|
||||
elem_layout: InLayout<'a>,
|
||||
structure: Symbol,
|
||||
) -> Stmt<'a> {
|
||||
let layout_isize = root.layout_isize;
|
||||
let arena = root.arena;
|
||||
|
||||
let elem_layout = layout_interner.get(elem_layout);
|
||||
|
||||
// A "Box" layout (heap pointer to a single list element)
|
||||
let box_union_layout = UnionLayout::NonNullableUnwrapped(arena.alloc([*elem_layout]));
|
||||
let box_layout = Layout::Union(box_union_layout);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue