List takes interned element

This commit is contained in:
Ayaz Hafiz 2022-12-29 08:52:37 -06:00
parent f2a42affd1
commit e4b5252e51
No known key found for this signature in database
GPG key ID: 0E2A37416A25EF58
16 changed files with 173 additions and 83 deletions

View file

@ -136,7 +136,7 @@ fn bytes_as_ascii(bytes: &[u8]) -> String {
pub fn spec_program<'a, I>(
arena: &'a Bump,
interner: &STLayoutInterner<'a>,
interner: &mut STLayoutInterner<'a>,
opt_level: OptLevel,
entry_point: roc_mono::ir::EntryPoint<'a>,
procs: I,
@ -449,7 +449,7 @@ fn build_entry_point<'a>(
fn proc_spec<'a>(
arena: &'a Bump,
interner: &STLayoutInterner<'a>,
interner: &mut STLayoutInterner<'a>,
proc: &Proc<'a>,
) -> Result<(FuncDef, MutSet<UnionLayout<'a>>)> {
let mut builder = FuncDefBuilder::new();
@ -546,7 +546,7 @@ fn apply_refcount_operation<'a>(
fn stmt_spec<'a>(
builder: &mut FuncDefBuilder,
interner: &STLayoutInterner<'a>,
interner: &mut STLayoutInterner<'a>,
env: &mut Env<'a>,
block: BlockId,
layout: &Layout<'a>,
@ -788,7 +788,7 @@ fn add_loop(
fn call_spec<'a>(
builder: &mut FuncDefBuilder,
interner: &STLayoutInterner<'a>,
interner: &mut STLayoutInterner<'a>,
env: &mut Env<'a>,
block: BlockId,
layout: &Layout<'a>,
@ -909,6 +909,8 @@ fn call_spec<'a>(
&WhenRecursive::Unreachable,
)?;
let return_layout = interner.insert(return_layout);
let state_layout = Layout::Builtin(Builtin::List(return_layout));
let state_type = layout_spec(
env,
@ -940,7 +942,9 @@ fn call_spec<'a>(
with_new_heap_cell(builder, block, bag)
};
let state_layout = Layout::Builtin(Builtin::List(&argument_layouts[0]));
let arg0_layout = interner.insert(&argument_layouts[0]);
let state_layout = Layout::Builtin(Builtin::List(arg0_layout));
let state_type = layout_spec(
env,
builder,
@ -979,6 +983,8 @@ fn call_spec<'a>(
&WhenRecursive::Unreachable,
)?;
let return_layout = interner.insert(return_layout);
let state_layout = Layout::Builtin(Builtin::List(return_layout));
let state_type = layout_spec(
env,
@ -1024,6 +1030,8 @@ fn call_spec<'a>(
&WhenRecursive::Unreachable,
)?;
let return_layout = interner.insert(return_layout);
let state_layout = Layout::Builtin(Builtin::List(return_layout));
let state_type = layout_spec(
env,
@ -1075,6 +1083,8 @@ fn call_spec<'a>(
&WhenRecursive::Unreachable,
)?;
let return_layout = interner.insert(return_layout);
let state_layout = Layout::Builtin(Builtin::List(return_layout));
let state_type = layout_spec(
env,
@ -1245,6 +1255,7 @@ fn lowlevel_spec<'a>(
match layout {
Layout::Builtin(Builtin::List(element_layout)) => {
let element_layout = interner.get(*element_layout);
let type_id = layout_spec(
env,
builder,
@ -1413,7 +1424,7 @@ fn worst_case_type(context: &mut impl TypeContext) -> Result<TypeId> {
fn expr_spec<'a>(
builder: &mut FuncDefBuilder,
interner: &STLayoutInterner<'a>,
interner: &mut STLayoutInterner<'a>,
env: &mut Env<'a>,
block: BlockId,
layout: &Layout<'a>,
@ -1583,6 +1594,7 @@ fn expr_spec<'a>(
EmptyArray => match layout {
Layout::Builtin(Builtin::List(element_layout)) => {
let element_layout = interner.get(*element_layout);
let type_id = layout_spec(
env,
builder,
@ -1772,6 +1784,7 @@ fn builtin_spec<'a>(
Decimal | Float(_) => builder.add_tuple_type(&[]),
Str => str_type(builder),
List(element_layout) => {
let element_layout = interner.get(*element_layout);
let element_type =
layout_spec_help(env, builder, interner, element_layout, when_recursive)?;