mirror of
https://github.com/roc-lang/roc.git
synced 2025-09-26 13:29:12 +00:00
morphic implementations for new list functions
This commit is contained in:
parent
56c9787e8f
commit
27094bf6eb
1 changed files with 31 additions and 0 deletions
|
@ -935,6 +935,20 @@ fn list_append(
|
||||||
with_new_heap_cell(builder, block, new_bag)
|
with_new_heap_cell(builder, block, new_bag)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn list_clone(
|
||||||
|
builder: &mut FuncDefBuilder,
|
||||||
|
block: BlockId,
|
||||||
|
update_mode_var: UpdateModeVar,
|
||||||
|
list: ValueId,
|
||||||
|
) -> Result<ValueId> {
|
||||||
|
let bag = builder.add_get_tuple_field(block, list, LIST_BAG_INDEX)?;
|
||||||
|
let cell = builder.add_get_tuple_field(block, list, LIST_CELL_INDEX)?;
|
||||||
|
|
||||||
|
let _unit = builder.add_update(block, update_mode_var, cell)?;
|
||||||
|
|
||||||
|
with_new_heap_cell(builder, block, bag)
|
||||||
|
}
|
||||||
|
|
||||||
fn lowlevel_spec(
|
fn lowlevel_spec(
|
||||||
builder: &mut FuncDefBuilder,
|
builder: &mut FuncDefBuilder,
|
||||||
env: &Env,
|
env: &Env,
|
||||||
|
@ -1029,6 +1043,23 @@ fn lowlevel_spec(
|
||||||
|
|
||||||
with_new_heap_cell(builder, block, bag)
|
with_new_heap_cell(builder, block, bag)
|
||||||
}
|
}
|
||||||
|
ListWithCapacity => {
|
||||||
|
// essentially an empty list, capacity is not relevant for morphic
|
||||||
|
|
||||||
|
match layout {
|
||||||
|
Layout::Builtin(Builtin::List(element_layout)) => {
|
||||||
|
let type_id =
|
||||||
|
layout_spec(builder, element_layout, &WhenRecursive::Unreachable)?;
|
||||||
|
new_list(builder, block, type_id)
|
||||||
|
}
|
||||||
|
_ => unreachable!("empty array does not have a list layout"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ListReserve => {
|
||||||
|
let list = env.symbols[&arguments[0]];
|
||||||
|
|
||||||
|
list_clone(builder, block, update_mode_var, list)
|
||||||
|
}
|
||||||
ListAppendUnsafe => {
|
ListAppendUnsafe => {
|
||||||
let list = env.symbols[&arguments[0]];
|
let list = env.symbols[&arguments[0]];
|
||||||
let to_insert = env.symbols[&arguments[1]];
|
let to_insert = env.symbols[&arguments[1]];
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue