mirror of
https://github.com/roc-lang/roc.git
synced 2025-08-04 12:18:19 +00:00
Merge branch 'main' into rust1_65
Signed-off-by: Anton-4 <17049058+Anton-4@users.noreply.github.com>
This commit is contained in:
commit
bbf35af8fa
179 changed files with 7089 additions and 3846 deletions
|
@ -17,7 +17,7 @@ use roc_mono::ir::{
|
|||
Literal, ModifyRc, OptLevel, Proc, ProcLayout, SingleEntryPoint, Stmt,
|
||||
};
|
||||
use roc_mono::layout::{
|
||||
Builtin, FieldOrderHash, Layout, LayoutInterner, Niche, RawFunctionLayout, STLayoutInterner,
|
||||
Builtin, InLayout, Layout, LayoutInterner, Niche, RawFunctionLayout, STLayoutInterner,
|
||||
UnionLayout,
|
||||
};
|
||||
|
||||
|
@ -34,7 +34,7 @@ pub fn func_name_bytes(proc: &Proc) -> [u8; SIZE] {
|
|||
proc.name.name(),
|
||||
proc.args.iter().map(|x| x.0),
|
||||
proc.name.niche(),
|
||||
&proc.ret_layout,
|
||||
proc.ret_layout,
|
||||
);
|
||||
bytes
|
||||
}
|
||||
|
@ -78,10 +78,10 @@ pub fn func_name_bytes_help<'a, I>(
|
|||
symbol: Symbol,
|
||||
argument_layouts: I,
|
||||
niche: Niche<'a>,
|
||||
return_layout: &Layout<'a>,
|
||||
return_layout: InLayout<'a>,
|
||||
) -> [u8; SIZE]
|
||||
where
|
||||
I: IntoIterator<Item = Layout<'a>>,
|
||||
I: IntoIterator<Item = InLayout<'a>>,
|
||||
{
|
||||
let mut name_bytes = [0u8; SIZE];
|
||||
|
||||
|
@ -192,13 +192,13 @@ where
|
|||
RawFunctionLayout::Function(_, _, _) => {
|
||||
let it = top_level.arguments.iter().copied();
|
||||
let bytes =
|
||||
func_name_bytes_help(*symbol, it, Niche::NONE, &top_level.result);
|
||||
func_name_bytes_help(*symbol, it, Niche::NONE, top_level.result);
|
||||
|
||||
host_exposed_functions.push((bytes, top_level.arguments));
|
||||
}
|
||||
RawFunctionLayout::ZeroArgumentThunk(_) => {
|
||||
let bytes =
|
||||
func_name_bytes_help(*symbol, [], Niche::NONE, &top_level.result);
|
||||
func_name_bytes_help(*symbol, [], Niche::NONE, top_level.result);
|
||||
|
||||
host_exposed_functions.push((bytes, top_level.arguments));
|
||||
}
|
||||
|
@ -232,11 +232,11 @@ where
|
|||
entry_point_symbol,
|
||||
entry_point_layout.arguments.iter().copied(),
|
||||
Niche::NONE,
|
||||
&entry_point_layout.result,
|
||||
entry_point_layout.result,
|
||||
);
|
||||
let roc_main = FuncName(&roc_main_bytes);
|
||||
|
||||
let mut env = Env::new(arena);
|
||||
let mut env = Env::new();
|
||||
|
||||
let entry_point_function = build_entry_point(
|
||||
&mut env,
|
||||
|
@ -255,10 +255,7 @@ where
|
|||
// construct a big pattern match picking one of the expects at random
|
||||
let layout: ProcLayout<'a> = ProcLayout {
|
||||
arguments: &[],
|
||||
result: Layout::Struct {
|
||||
field_order_hash: FieldOrderHash::from_ordered_fields(&[]),
|
||||
field_layouts: &[],
|
||||
},
|
||||
result: Layout::UNIT,
|
||||
niche: Niche::NONE,
|
||||
};
|
||||
|
||||
|
@ -266,13 +263,13 @@ where
|
|||
.iter()
|
||||
.map(|symbol| {
|
||||
(
|
||||
func_name_bytes_help(*symbol, [], Niche::NONE, &layout.result),
|
||||
func_name_bytes_help(*symbol, [], Niche::NONE, layout.result),
|
||||
[].as_slice(),
|
||||
)
|
||||
})
|
||||
.collect();
|
||||
|
||||
let mut env = Env::new(arena);
|
||||
let mut env = Env::new();
|
||||
let entry_point_function =
|
||||
build_entry_point(&mut env, interner, layout, None, &host_exposed)?;
|
||||
|
||||
|
@ -289,7 +286,7 @@ where
|
|||
|
||||
let mut builder = TypeDefBuilder::new();
|
||||
|
||||
let mut env = Env::new(arena);
|
||||
let mut env = Env::new();
|
||||
let variant_types =
|
||||
recursive_variant_types(&mut env, &mut builder, interner, &union_layout)?;
|
||||
|
||||
|
@ -354,10 +351,10 @@ fn terrible_hack(builder: &mut FuncDefBuilder, block: BlockId, type_id: TypeId)
|
|||
|
||||
fn build_entry_point<'a>(
|
||||
env: &mut Env<'a>,
|
||||
interner: &STLayoutInterner<'a>,
|
||||
interner: &mut STLayoutInterner<'a>,
|
||||
layout: roc_mono::ir::ProcLayout<'a>,
|
||||
entry_point_function: Option<FuncName>,
|
||||
host_exposed_functions: &[([u8; SIZE], &'a [Layout<'a>])],
|
||||
host_exposed_functions: &[([u8; SIZE], &'a [InLayout<'a>])],
|
||||
) -> Result<FuncDef> {
|
||||
let mut builder = FuncDefBuilder::new();
|
||||
let outer_block = builder.add_block();
|
||||
|
@ -403,11 +400,12 @@ fn build_entry_point<'a>(
|
|||
|
||||
let block = builder.add_block();
|
||||
|
||||
let struct_layout = interner.insert(Layout::struct_no_name_order(layouts));
|
||||
let type_id = layout_spec(
|
||||
env,
|
||||
&mut builder,
|
||||
interner,
|
||||
env.arena.alloc(Layout::struct_no_name_order(layouts)),
|
||||
struct_layout,
|
||||
&WhenRecursive::Unreachable,
|
||||
)?;
|
||||
|
||||
|
@ -442,7 +440,7 @@ fn proc_spec<'a>(
|
|||
proc: &Proc<'a>,
|
||||
) -> Result<(FuncDef, MutSet<UnionLayout<'a>>)> {
|
||||
let mut builder = FuncDefBuilder::new();
|
||||
let mut env = Env::new(arena);
|
||||
let mut env = Env::new();
|
||||
|
||||
let block = builder.add_block();
|
||||
|
||||
|
@ -460,25 +458,26 @@ fn proc_spec<'a>(
|
|||
interner,
|
||||
&mut env,
|
||||
block,
|
||||
&proc.ret_layout,
|
||||
proc.ret_layout,
|
||||
&proc.body,
|
||||
)?;
|
||||
|
||||
let root = BlockExpr(block, value_id);
|
||||
let args_struct_layout = interner.insert(Layout::struct_no_name_order(
|
||||
argument_layouts.into_bump_slice(),
|
||||
));
|
||||
let arg_type_id = layout_spec(
|
||||
&mut env,
|
||||
&mut builder,
|
||||
interner,
|
||||
arena.alloc(Layout::struct_no_name_order(
|
||||
argument_layouts.into_bump_slice(),
|
||||
)),
|
||||
args_struct_layout,
|
||||
&WhenRecursive::Unreachable,
|
||||
)?;
|
||||
let ret_type_id = layout_spec(
|
||||
&mut env,
|
||||
&mut builder,
|
||||
interner,
|
||||
&proc.ret_layout,
|
||||
proc.ret_layout,
|
||||
&WhenRecursive::Unreachable,
|
||||
)?;
|
||||
|
||||
|
@ -488,16 +487,14 @@ fn proc_spec<'a>(
|
|||
}
|
||||
|
||||
struct Env<'a> {
|
||||
arena: &'a Bump,
|
||||
symbols: MutMap<Symbol, ValueId>,
|
||||
join_points: MutMap<roc_mono::ir::JoinPointId, morphic_lib::ContinuationId>,
|
||||
type_names: MutSet<UnionLayout<'a>>,
|
||||
}
|
||||
|
||||
impl<'a> Env<'a> {
|
||||
fn new(arena: &'a Bump) -> Self {
|
||||
fn new() -> Self {
|
||||
Self {
|
||||
arena,
|
||||
symbols: Default::default(),
|
||||
join_points: Default::default(),
|
||||
type_names: Default::default(),
|
||||
|
@ -538,14 +535,14 @@ fn stmt_spec<'a>(
|
|||
interner: &mut STLayoutInterner<'a>,
|
||||
env: &mut Env<'a>,
|
||||
block: BlockId,
|
||||
layout: &Layout<'a>,
|
||||
layout: InLayout<'a>,
|
||||
stmt: &Stmt<'a>,
|
||||
) -> Result<ValueId> {
|
||||
use Stmt::*;
|
||||
|
||||
match stmt {
|
||||
Let(symbol, expr, expr_layout, mut continuation) => {
|
||||
let value_id = expr_spec(builder, interner, env, block, expr_layout, expr)?;
|
||||
let value_id = expr_spec(builder, interner, env, block, *expr_layout, expr)?;
|
||||
env.symbols.insert(*symbol, value_id);
|
||||
|
||||
let mut queue = vec![symbol];
|
||||
|
@ -553,7 +550,8 @@ fn stmt_spec<'a>(
|
|||
loop {
|
||||
match continuation {
|
||||
Let(symbol, expr, expr_layout, c) => {
|
||||
let value_id = expr_spec(builder, interner, env, block, expr_layout, expr)?;
|
||||
let value_id =
|
||||
expr_spec(builder, interner, env, block, *expr_layout, expr)?;
|
||||
env.symbols.insert(*symbol, value_id);
|
||||
|
||||
queue.push(symbol);
|
||||
|
@ -623,7 +621,7 @@ fn stmt_spec<'a>(
|
|||
env,
|
||||
builder,
|
||||
interner,
|
||||
&p.layout,
|
||||
p.layout,
|
||||
&WhenRecursive::Unreachable,
|
||||
)?);
|
||||
}
|
||||
|
@ -720,13 +718,13 @@ fn build_recursive_tuple_type<'a>(
|
|||
env: &mut Env<'a>,
|
||||
builder: &mut impl TypeContext,
|
||||
interner: &STLayoutInterner<'a>,
|
||||
layouts: &[Layout<'a>],
|
||||
layouts: &[InLayout<'a>],
|
||||
when_recursive: &WhenRecursive,
|
||||
) -> Result<TypeId> {
|
||||
let mut field_types = Vec::new();
|
||||
|
||||
for field in layouts.iter() {
|
||||
let type_id = layout_spec_help(env, builder, interner, field, when_recursive)?;
|
||||
let type_id = layout_spec_help(env, builder, interner, *field, when_recursive)?;
|
||||
field_types.push(type_id);
|
||||
}
|
||||
|
||||
|
@ -737,13 +735,13 @@ fn build_tuple_type<'a>(
|
|||
env: &mut Env<'a>,
|
||||
builder: &mut impl TypeContext,
|
||||
interner: &STLayoutInterner<'a>,
|
||||
layouts: &[Layout<'a>],
|
||||
layouts: &[InLayout<'a>],
|
||||
when_recursive: &WhenRecursive,
|
||||
) -> Result<TypeId> {
|
||||
let mut field_types = Vec::new();
|
||||
|
||||
for field in layouts.iter() {
|
||||
field_types.push(layout_spec(env, builder, interner, field, when_recursive)?);
|
||||
field_types.push(layout_spec(env, builder, interner, *field, when_recursive)?);
|
||||
}
|
||||
|
||||
builder.add_tuple_type(&field_types)
|
||||
|
@ -780,7 +778,7 @@ fn call_spec<'a>(
|
|||
interner: &mut STLayoutInterner<'a>,
|
||||
env: &mut Env<'a>,
|
||||
block: BlockId,
|
||||
layout: &Layout<'a>,
|
||||
layout: InLayout<'a>,
|
||||
call: &Call<'a>,
|
||||
) -> Result<ValueId> {
|
||||
use CallType::*;
|
||||
|
@ -798,7 +796,7 @@ fn call_spec<'a>(
|
|||
let arg_value_id = build_tuple_value(builder, env, block, call.arguments)?;
|
||||
let args_it = arg_layouts.iter().copied();
|
||||
let captures_niche = name.niche();
|
||||
let bytes = func_name_bytes_help(name.name(), args_it, captures_niche, ret_layout);
|
||||
let bytes = func_name_bytes_help(name.name(), args_it, captures_niche, *ret_layout);
|
||||
let name = FuncName(&bytes);
|
||||
let module = MOD_APP;
|
||||
builder.add_call(block, spec_var, module, name, arg_value_id)
|
||||
|
@ -817,7 +815,7 @@ fn call_spec<'a>(
|
|||
env,
|
||||
builder,
|
||||
interner,
|
||||
ret_layout,
|
||||
*ret_layout,
|
||||
&WhenRecursive::Unreachable,
|
||||
)?;
|
||||
|
||||
|
@ -854,7 +852,7 @@ fn call_spec<'a>(
|
|||
passed_function.name.name(),
|
||||
args_it,
|
||||
captures_niche,
|
||||
&passed_function.return_layout,
|
||||
passed_function.return_layout,
|
||||
);
|
||||
let name = FuncName(&bytes);
|
||||
let module = MOD_APP;
|
||||
|
@ -894,18 +892,17 @@ fn call_spec<'a>(
|
|||
env,
|
||||
builder,
|
||||
interner,
|
||||
return_layout,
|
||||
*return_layout,
|
||||
&WhenRecursive::Unreachable,
|
||||
)?;
|
||||
|
||||
let return_layout = interner.insert(return_layout);
|
||||
|
||||
let state_layout = Layout::Builtin(Builtin::List(return_layout));
|
||||
let state_layout =
|
||||
interner.insert(Layout::Builtin(Builtin::List(*return_layout)));
|
||||
let state_type = layout_spec(
|
||||
env,
|
||||
builder,
|
||||
interner,
|
||||
&state_layout,
|
||||
state_layout,
|
||||
&WhenRecursive::Unreachable,
|
||||
)?;
|
||||
|
||||
|
@ -931,14 +928,14 @@ fn call_spec<'a>(
|
|||
with_new_heap_cell(builder, block, bag)
|
||||
};
|
||||
|
||||
let arg0_layout = interner.insert(&argument_layouts[0]);
|
||||
let arg0_layout = argument_layouts[0];
|
||||
|
||||
let state_layout = Layout::Builtin(Builtin::List(arg0_layout));
|
||||
let state_layout = interner.insert(Layout::Builtin(Builtin::List(arg0_layout)));
|
||||
let state_type = layout_spec(
|
||||
env,
|
||||
builder,
|
||||
interner,
|
||||
&state_layout,
|
||||
state_layout,
|
||||
&WhenRecursive::Unreachable,
|
||||
)?;
|
||||
let init_state = list;
|
||||
|
@ -968,18 +965,17 @@ fn call_spec<'a>(
|
|||
env,
|
||||
builder,
|
||||
interner,
|
||||
return_layout,
|
||||
*return_layout,
|
||||
&WhenRecursive::Unreachable,
|
||||
)?;
|
||||
|
||||
let return_layout = interner.insert(return_layout);
|
||||
|
||||
let state_layout = Layout::Builtin(Builtin::List(return_layout));
|
||||
let state_layout =
|
||||
interner.insert(Layout::Builtin(Builtin::List(*return_layout)));
|
||||
let state_type = layout_spec(
|
||||
env,
|
||||
builder,
|
||||
interner,
|
||||
&state_layout,
|
||||
state_layout,
|
||||
&WhenRecursive::Unreachable,
|
||||
)?;
|
||||
|
||||
|
@ -1015,18 +1011,17 @@ fn call_spec<'a>(
|
|||
env,
|
||||
builder,
|
||||
interner,
|
||||
return_layout,
|
||||
*return_layout,
|
||||
&WhenRecursive::Unreachable,
|
||||
)?;
|
||||
|
||||
let return_layout = interner.insert(return_layout);
|
||||
|
||||
let state_layout = Layout::Builtin(Builtin::List(return_layout));
|
||||
let state_layout =
|
||||
interner.insert(Layout::Builtin(Builtin::List(*return_layout)));
|
||||
let state_type = layout_spec(
|
||||
env,
|
||||
builder,
|
||||
interner,
|
||||
&state_layout,
|
||||
state_layout,
|
||||
&WhenRecursive::Unreachable,
|
||||
)?;
|
||||
|
||||
|
@ -1068,18 +1063,17 @@ fn call_spec<'a>(
|
|||
env,
|
||||
builder,
|
||||
interner,
|
||||
return_layout,
|
||||
*return_layout,
|
||||
&WhenRecursive::Unreachable,
|
||||
)?;
|
||||
|
||||
let return_layout = interner.insert(return_layout);
|
||||
|
||||
let state_layout = Layout::Builtin(Builtin::List(return_layout));
|
||||
let state_layout =
|
||||
interner.insert(Layout::Builtin(Builtin::List(*return_layout)));
|
||||
let state_type = layout_spec(
|
||||
env,
|
||||
builder,
|
||||
interner,
|
||||
&state_layout,
|
||||
state_layout,
|
||||
&WhenRecursive::Unreachable,
|
||||
)?;
|
||||
|
||||
|
@ -1129,7 +1123,7 @@ fn lowlevel_spec<'a>(
|
|||
interner: &STLayoutInterner<'a>,
|
||||
env: &mut Env<'a>,
|
||||
block: BlockId,
|
||||
layout: &Layout<'a>,
|
||||
layout: InLayout<'a>,
|
||||
op: &LowLevel,
|
||||
update_mode: roc_mono::ir::UpdateModeId,
|
||||
arguments: &[Symbol],
|
||||
|
@ -1209,21 +1203,21 @@ fn lowlevel_spec<'a>(
|
|||
let new_list = with_new_heap_cell(builder, block, bag)?;
|
||||
|
||||
// depending on the types, the list or value will come first in the struct
|
||||
let fields = match layout {
|
||||
let fields = match interner.get(layout) {
|
||||
Layout::Struct { field_layouts, .. } => field_layouts,
|
||||
_ => unreachable!(),
|
||||
};
|
||||
|
||||
match fields {
|
||||
[Layout::Builtin(Builtin::List(_)), Layout::Builtin(Builtin::List(_))] => {
|
||||
match (interner.get(fields[0]), interner.get(fields[1])) {
|
||||
(Layout::Builtin(Builtin::List(_)), Layout::Builtin(Builtin::List(_))) => {
|
||||
// field name is the tie breaker, list is first in
|
||||
// { list : List a, value : a }
|
||||
builder.add_make_tuple(block, &[new_list, old_value])
|
||||
}
|
||||
[Layout::Builtin(Builtin::List(_)), _] => {
|
||||
(Layout::Builtin(Builtin::List(_)), _) => {
|
||||
builder.add_make_tuple(block, &[new_list, old_value])
|
||||
}
|
||||
[_, Layout::Builtin(Builtin::List(_))] => {
|
||||
(_, Layout::Builtin(Builtin::List(_))) => {
|
||||
builder.add_make_tuple(block, &[old_value, new_list])
|
||||
}
|
||||
_ => unreachable!(),
|
||||
|
@ -1242,9 +1236,8 @@ fn lowlevel_spec<'a>(
|
|||
ListWithCapacity => {
|
||||
// essentially an empty list, capacity is not relevant for morphic
|
||||
|
||||
match layout {
|
||||
match interner.get(layout) {
|
||||
Layout::Builtin(Builtin::List(element_layout)) => {
|
||||
let element_layout = interner.get(*element_layout);
|
||||
let type_id = layout_spec(
|
||||
env,
|
||||
builder,
|
||||
|
@ -1307,7 +1300,7 @@ fn recursive_tag_variant<'a>(
|
|||
builder: &mut impl TypeContext,
|
||||
interner: &STLayoutInterner<'a>,
|
||||
union_layout: &UnionLayout,
|
||||
fields: &[Layout<'a>],
|
||||
fields: &[InLayout<'a>],
|
||||
) -> Result<TypeId> {
|
||||
let when_recursive = WhenRecursive::Loop(*union_layout);
|
||||
|
||||
|
@ -1416,7 +1409,7 @@ fn expr_spec<'a>(
|
|||
interner: &mut STLayoutInterner<'a>,
|
||||
env: &mut Env<'a>,
|
||||
block: BlockId,
|
||||
layout: &Layout<'a>,
|
||||
layout: InLayout<'a>,
|
||||
expr: &Expr<'a>,
|
||||
) -> Result<ValueId> {
|
||||
use Expr::*;
|
||||
|
@ -1554,7 +1547,7 @@ fn expr_spec<'a>(
|
|||
env,
|
||||
builder,
|
||||
interner,
|
||||
elem_layout,
|
||||
*elem_layout,
|
||||
&WhenRecursive::Unreachable,
|
||||
)?;
|
||||
|
||||
|
@ -1581,9 +1574,8 @@ fn expr_spec<'a>(
|
|||
}
|
||||
}
|
||||
|
||||
EmptyArray => match layout {
|
||||
EmptyArray => match interner.get(layout) {
|
||||
Layout::Builtin(Builtin::List(element_layout)) => {
|
||||
let element_layout = interner.get(*element_layout);
|
||||
let type_id = layout_spec(
|
||||
env,
|
||||
builder,
|
||||
|
@ -1601,12 +1593,12 @@ fn expr_spec<'a>(
|
|||
} => {
|
||||
let tag_value_id = env.symbols[symbol];
|
||||
|
||||
let union_layout = match layout {
|
||||
let union_layout = match interner.get(layout) {
|
||||
Layout::Union(ul) => ul,
|
||||
_ => unreachable!(),
|
||||
};
|
||||
|
||||
let type_name_bytes = recursive_tag_union_name_bytes(union_layout).as_bytes();
|
||||
let type_name_bytes = recursive_tag_union_name_bytes(&union_layout).as_bytes();
|
||||
let type_name = TypeName(&type_name_bytes);
|
||||
|
||||
// unwrap the named wrapper
|
||||
|
@ -1654,7 +1646,7 @@ fn layout_spec<'a>(
|
|||
env: &mut Env<'a>,
|
||||
builder: &mut impl TypeContext,
|
||||
interner: &STLayoutInterner<'a>,
|
||||
layout: &Layout<'a>,
|
||||
layout: InLayout<'a>,
|
||||
when_recursive: &WhenRecursive,
|
||||
) -> Result<TypeId> {
|
||||
layout_spec_help(env, builder, interner, layout, when_recursive)
|
||||
|
@ -1664,7 +1656,7 @@ fn non_recursive_variant_types<'a>(
|
|||
env: &mut Env<'a>,
|
||||
builder: &mut impl TypeContext,
|
||||
interner: &STLayoutInterner<'a>,
|
||||
tags: &[&[Layout<'a>]],
|
||||
tags: &[&[InLayout<'a>]],
|
||||
// If there is a recursive pointer latent within this layout, coming from a containing layout.
|
||||
when_recursive: &WhenRecursive,
|
||||
) -> Result<Vec<TypeId>> {
|
||||
|
@ -1687,13 +1679,13 @@ fn layout_spec_help<'a>(
|
|||
env: &mut Env<'a>,
|
||||
builder: &mut impl TypeContext,
|
||||
interner: &STLayoutInterner<'a>,
|
||||
layout: &Layout<'a>,
|
||||
layout: InLayout<'a>,
|
||||
when_recursive: &WhenRecursive,
|
||||
) -> Result<TypeId> {
|
||||
use Layout::*;
|
||||
|
||||
match layout {
|
||||
Builtin(builtin) => builtin_spec(env, builder, interner, builtin, when_recursive),
|
||||
match interner.get(layout) {
|
||||
Builtin(builtin) => builtin_spec(env, builder, interner, &builtin, when_recursive),
|
||||
Struct { field_layouts, .. } => {
|
||||
build_recursive_tuple_type(env, builder, interner, field_layouts, when_recursive)
|
||||
}
|
||||
|
@ -1701,7 +1693,7 @@ fn layout_spec_help<'a>(
|
|||
env,
|
||||
builder,
|
||||
interner,
|
||||
&lambda_set.runtime_representation(interner),
|
||||
lambda_set.runtime_representation(),
|
||||
when_recursive,
|
||||
),
|
||||
Union(union_layout) => {
|
||||
|
@ -1721,10 +1713,10 @@ fn layout_spec_help<'a>(
|
|||
| UnionLayout::NullableUnwrapped { .. }
|
||||
| UnionLayout::NullableWrapped { .. }
|
||||
| UnionLayout::NonNullableUnwrapped(_) => {
|
||||
let type_name_bytes = recursive_tag_union_name_bytes(union_layout).as_bytes();
|
||||
let type_name_bytes = recursive_tag_union_name_bytes(&union_layout).as_bytes();
|
||||
let type_name = TypeName(&type_name_bytes);
|
||||
|
||||
env.type_names.insert(*union_layout);
|
||||
env.type_names.insert(union_layout);
|
||||
|
||||
Ok(builder.add_named_type(MOD_APP, type_name))
|
||||
}
|
||||
|
@ -1732,7 +1724,6 @@ fn layout_spec_help<'a>(
|
|||
}
|
||||
|
||||
Boxed(inner_layout) => {
|
||||
let inner_layout = interner.get(*inner_layout);
|
||||
let inner_type =
|
||||
layout_spec_help(env, builder, interner, inner_layout, when_recursive)?;
|
||||
let cell_type = builder.add_heap_cell_type();
|
||||
|
@ -1773,9 +1764,8 @@ 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)?;
|
||||
layout_spec_help(env, builder, interner, *element_layout, when_recursive)?;
|
||||
|
||||
let cell = builder.add_heap_cell_type();
|
||||
let bag = builder.add_bag_type(element_type)?;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue