mirror of
https://github.com/roc-lang/roc.git
synced 2025-10-03 00:24:34 +00:00
account for the tag id when doing a memcpy
This commit is contained in:
parent
c0d67edfd3
commit
beed1e3d6e
1 changed files with 21 additions and 2 deletions
|
@ -3921,7 +3921,7 @@ impl<
|
||||||
// it's just a null pointer
|
// it's just a null pointer
|
||||||
self.load_literal_i64(sym, 0);
|
self.load_literal_i64(sym, 0);
|
||||||
} else {
|
} else {
|
||||||
let (largest_variant, _largest_variant_size) = other_tags
|
let (largest_variant_fields, _largest_variant_size) = other_tags
|
||||||
.iter()
|
.iter()
|
||||||
.map(|fields| {
|
.map(|fields| {
|
||||||
let struct_layout = self
|
let struct_layout = self
|
||||||
|
@ -3936,6 +3936,16 @@ impl<
|
||||||
.max_by(|(_, a), (_, b)| a.cmp(b))
|
.max_by(|(_, a), (_, b)| a.cmp(b))
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
|
let largest_variant =
|
||||||
|
if union_layout.stores_tag_id_as_data(self.storage_manager.target_info) {
|
||||||
|
self.layout_interner
|
||||||
|
.insert_direct_no_semantic(LayoutRepr::Struct(
|
||||||
|
self.env.arena.alloc([largest_variant_fields, Layout::U8]),
|
||||||
|
))
|
||||||
|
} else {
|
||||||
|
largest_variant_fields
|
||||||
|
};
|
||||||
|
|
||||||
let other_fields = if tag_id < nullable_id {
|
let other_fields = if tag_id < nullable_id {
|
||||||
other_tags[tag_id as usize]
|
other_tags[tag_id as usize]
|
||||||
} else {
|
} else {
|
||||||
|
@ -4046,7 +4056,7 @@ impl<
|
||||||
let stores_tag_id_as_data =
|
let stores_tag_id_as_data =
|
||||||
union_layout.stores_tag_id_as_data(self.storage_manager.target_info);
|
union_layout.stores_tag_id_as_data(self.storage_manager.target_info);
|
||||||
|
|
||||||
let (largest_variant, _largest_variant_size) = tags
|
let (largest_variant_fields, _largest_variant_size) = tags
|
||||||
.iter()
|
.iter()
|
||||||
.map(|fields| {
|
.map(|fields| {
|
||||||
let struct_layout = self
|
let struct_layout = self
|
||||||
|
@ -4061,6 +4071,15 @@ impl<
|
||||||
.max_by(|(_, a), (_, b)| a.cmp(b))
|
.max_by(|(_, a), (_, b)| a.cmp(b))
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
|
let largest_variant = if stores_tag_id_as_data {
|
||||||
|
self.layout_interner
|
||||||
|
.insert_direct_no_semantic(LayoutRepr::Struct(
|
||||||
|
self.env.arena.alloc([largest_variant_fields, Layout::U8]),
|
||||||
|
))
|
||||||
|
} else {
|
||||||
|
largest_variant_fields
|
||||||
|
};
|
||||||
|
|
||||||
// construct the payload as a struct on the stack
|
// construct the payload as a struct on the stack
|
||||||
let data_struct_layout = self
|
let data_struct_layout = self
|
||||||
.layout_interner
|
.layout_interner
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue