mirror of
https://github.com/roc-lang/roc.git
synced 2025-09-28 14:24:45 +00:00
Avoid a clone
This commit is contained in:
parent
e0fc71526e
commit
72bdeb6e3c
1 changed files with 22 additions and 23 deletions
|
@ -517,34 +517,33 @@ pub fn layout_from_tag_union<'a>(
|
||||||
use UnionVariant::*;
|
use UnionVariant::*;
|
||||||
|
|
||||||
let tags_vec: std::vec::Vec<_> = tags.into_iter().collect();
|
let tags_vec: std::vec::Vec<_> = tags.into_iter().collect();
|
||||||
let first_tag = tags_vec[0].clone();
|
|
||||||
let variant = union_sorted_tags_help(arena, tags_vec, subs, pointer_size);
|
|
||||||
|
|
||||||
match variant {
|
if tags_vec[0].0 != TagName::Private(Symbol::NUM_AT_NUM) {
|
||||||
Never => panic!("TODO gracefully handle trying to instantiate Never"),
|
let variant = union_sorted_tags_help(arena, tags_vec, subs, pointer_size);
|
||||||
Unit => Layout::Struct(&[]),
|
|
||||||
BoolUnion { .. } => Layout::Builtin(Builtin::Int1),
|
|
||||||
ByteUnion(_) => Layout::Builtin(Builtin::Int8),
|
|
||||||
Unwrapped(field_layouts) => match first_tag.0 {
|
|
||||||
TagName::Private(Symbol::NUM_AT_NUM) => {
|
|
||||||
let arguments = first_tag.1;
|
|
||||||
|
|
||||||
debug_assert_eq!(arguments.len(), 1);
|
match variant {
|
||||||
|
Never => panic!("TODO gracefully handle trying to instantiate Never"),
|
||||||
|
Unit => Layout::Struct(&[]),
|
||||||
|
BoolUnion { .. } => Layout::Builtin(Builtin::Int1),
|
||||||
|
ByteUnion(_) => Layout::Builtin(Builtin::Int8),
|
||||||
|
Unwrapped(field_layouts) => Layout::Struct(field_layouts.into_bump_slice()),
|
||||||
|
Wrapped(tags) => {
|
||||||
|
let mut tag_layouts = Vec::with_capacity_in(tags.len(), arena);
|
||||||
|
|
||||||
let var = arguments.iter().next().unwrap();
|
for (_, tag_layout) in tags {
|
||||||
|
tag_layouts.push(tag_layout);
|
||||||
unwrap_num_tag(subs, *var).expect("invalid Num argument")
|
}
|
||||||
|
Layout::Union(tag_layouts.into_bump_slice())
|
||||||
}
|
}
|
||||||
_ => Layout::Struct(field_layouts.into_bump_slice()),
|
|
||||||
},
|
|
||||||
Wrapped(tags) => {
|
|
||||||
let mut tag_layouts = Vec::with_capacity_in(tags.len(), arena);
|
|
||||||
|
|
||||||
for (_, tag_layout) in tags {
|
|
||||||
tag_layouts.push(tag_layout);
|
|
||||||
}
|
|
||||||
Layout::Union(tag_layouts.into_bump_slice())
|
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
let arguments = &tags_vec[0].1;
|
||||||
|
|
||||||
|
debug_assert_eq!(arguments.len(), 1);
|
||||||
|
|
||||||
|
let var = arguments.iter().next().unwrap();
|
||||||
|
|
||||||
|
unwrap_num_tag(subs, *var).expect("invalid Num argument")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue