morphic implementations for new list functions

This commit is contained in:
Folkert 2022-07-07 23:20:06 +02:00
parent 56c9787e8f
commit 27094bf6eb
No known key found for this signature in database
GPG Key ID: 1F17F6FFD112B97C

View File

@ -935,6 +935,20 @@ fn list_append(
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(
builder: &mut FuncDefBuilder,
env: &Env,
@ -1029,6 +1043,23 @@ fn lowlevel_spec(
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 => {
let list = env.symbols[&arguments[0]];
let to_insert = env.symbols[&arguments[1]];