mirror of
https://github.com/roc-lang/roc.git
synced 2025-08-31 17:17:26 +00:00
WIP
This commit is contained in:
parent
4a9514d2c4
commit
0247237fe8
16 changed files with 625 additions and 163 deletions
|
@ -1422,6 +1422,38 @@ fn expr_spec<'a>(
|
|||
builder.add_get_tuple_field(block, variant_id, index)
|
||||
}
|
||||
},
|
||||
UnionFieldPtrAtIndex {
|
||||
index,
|
||||
tag_id,
|
||||
structure,
|
||||
union_layout,
|
||||
} => {
|
||||
let index = (*index) as u32;
|
||||
let tag_value_id = env.symbols[structure];
|
||||
|
||||
let type_name_bytes = recursive_tag_union_name_bytes(union_layout).as_bytes();
|
||||
let type_name = TypeName(&type_name_bytes);
|
||||
|
||||
// unwrap the named wrapper
|
||||
let union_id = builder.add_unwrap_named(block, MOD_APP, type_name, tag_value_id)?;
|
||||
|
||||
// now we have a tuple (cell, union { ... }); decompose
|
||||
let heap_cell = builder.add_get_tuple_field(block, union_id, TAG_CELL_INDEX)?;
|
||||
let union_data = builder.add_get_tuple_field(block, union_id, TAG_DATA_INDEX)?;
|
||||
|
||||
// we're reading from this value, so touch the heap cell
|
||||
builder.add_touch(block, heap_cell)?;
|
||||
|
||||
// next, unwrap the union at the tag id that we've got
|
||||
let variant_id = builder.add_unwrap_union(block, union_data, *tag_id as u32)?;
|
||||
|
||||
let value = builder.add_get_tuple_field(block, variant_id, index)?;
|
||||
|
||||
// construct the box. Here the heap_cell of the tag is re-used, I'm hoping that that
|
||||
// conveys to morphic that we're borrowing into the existing tag?!
|
||||
builder.add_make_tuple(block, &[heap_cell, value])
|
||||
}
|
||||
|
||||
StructAtIndex {
|
||||
index, structure, ..
|
||||
} => {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue