tags have a union layout

This commit is contained in:
Folkert 2021-05-26 18:31:55 +02:00
parent e2b200b84f
commit 06b2beb7ca
3 changed files with 34 additions and 44 deletions

View file

@ -1143,7 +1143,7 @@ pub enum Expr<'a> {
Call(Call<'a>),
Tag {
tag_layout: Layout<'a>,
tag_layout: UnionLayout<'a>,
tag_name: TagName,
tag_id: u8,
union_size: u8,
@ -4128,10 +4128,15 @@ fn construct_closure_data<'a>(
tag_symbols.push(tag_id_symbol);
tag_symbols.extend(symbols);
let tag_layout = match lambda_set.runtime_representation() {
Layout::Union(inner) => inner,
_ => unreachable!(),
};
let expr1 = Expr::Literal(Literal::Int(tag_id as i128));
let expr2 = Expr::Tag {
tag_id,
tag_layout: lambda_set.runtime_representation(),
tag_layout,
union_size,
tag_name,
arguments: tag_symbols.into_bump_slice(),
@ -4293,17 +4298,17 @@ fn convert_tag_union<'a>(
}
debug_assert!(layouts.len() > 1);
let layout = Layout::Union(UnionLayout::Recursive(layouts.into_bump_slice()));
let union_layout = UnionLayout::Recursive(layouts.into_bump_slice());
let tag = Expr::Tag {
tag_layout: layout,
tag_layout: union_layout,
tag_name,
tag_id: tag_id as u8,
union_size,
arguments: field_symbols,
};
(tag, layout)
(tag, Layout::Union(union_layout))
}
NonNullableUnwrapped {
fields,
@ -4321,17 +4326,17 @@ fn convert_tag_union<'a>(
temp.into_bump_slice()
};
let layout = Layout::Union(UnionLayout::NonNullableUnwrapped(fields));
let union_layout = UnionLayout::NonNullableUnwrapped(fields);
let tag = Expr::Tag {
tag_layout: layout,
tag_layout: union_layout,
tag_name,
tag_id: tag_id as u8,
union_size,
arguments: field_symbols,
};
(tag, layout)
(tag, Layout::Union(union_layout))
}
NonRecursive { sorted_tag_layouts } => {
let tag_id_symbol = env.unique_symbol();
@ -4353,18 +4358,17 @@ fn convert_tag_union<'a>(
layouts.push(arg_layouts);
}
let layout =
Layout::Union(UnionLayout::NonRecursive(layouts.into_bump_slice()));
let union_layout = UnionLayout::NonRecursive(layouts.into_bump_slice());
let tag = Expr::Tag {
tag_layout: layout,
tag_layout: union_layout,
tag_name,
tag_id: tag_id as u8,
union_size,
arguments: field_symbols,
};
(tag, layout)
(tag, Layout::Union(union_layout))
}
NullableWrapped {
nullable_id,
@ -4390,20 +4394,20 @@ fn convert_tag_union<'a>(
layouts.push(arg_layouts);
}
let layout = Layout::Union(UnionLayout::NullableWrapped {
let union_layout = UnionLayout::NullableWrapped {
nullable_id,
other_tags: layouts.into_bump_slice(),
});
};
let tag = Expr::Tag {
tag_layout: layout,
tag_layout: union_layout,
tag_name,
tag_id: tag_id as u8,
union_size,
arguments: field_symbols,
};
(tag, layout)
(tag, Layout::Union(union_layout))
}
NullableUnwrapped {
nullable_id,
@ -4425,20 +4429,20 @@ fn convert_tag_union<'a>(
temp.into_bump_slice()
};
let layout = Layout::Union(UnionLayout::NullableUnwrapped {
let union_layout = UnionLayout::NullableUnwrapped {
nullable_id,
other_fields,
});
};
let tag = Expr::Tag {
tag_layout: layout,
tag_layout: union_layout,
tag_name,
tag_id: tag_id as u8,
union_size,
arguments: field_symbols,
};
(tag, layout)
(tag, Layout::Union(union_layout))
}
};