feat(wasm): LowLevel::ListLen

This commit is contained in:
rvcas 2021-12-16 21:50:12 -05:00
parent b35deacebe
commit 40da207859
2 changed files with 21 additions and 4 deletions

View file

@ -52,8 +52,25 @@ pub fn decode_low_level<'a>(
return NotImplemented; return NotImplemented;
} }
StrTrim => return BuiltinCall(bitcode::STR_TRIM), StrTrim => return BuiltinCall(bitcode::STR_TRIM),
ListLen => match ret_layout {
WasmLayout::StackMemory { .. } => return NotImplemented,
WasmLayout::Primitive(value_type, _) => match value_type {
I32 => {
if let StoredValue::StackMemory { location, .. } = storage.get(&args[0]) {
let (local_id, offset) =
location.local_and_offset(storage.stack_frame_pointer);
ListLen | ListGetUnsafe | ListSet | ListSingle | ListRepeat | ListReverse | ListConcat code_builder.get_local(local_id);
code_builder.i32_load(Align::Bytes4, offset + 4);
} else {
internal_error!("Unexpected storage for {:?}", args[0]);
};
}
_ => return NotImplemented,
},
},
ListGetUnsafe | ListSet | ListSingle | ListRepeat | ListReverse | ListConcat
| ListContains | ListAppend | ListPrepend | ListJoin | ListRange | ListMap | ListMap2 | ListContains | ListAppend | ListPrepend | ListJoin | ListRange | ListMap | ListMap2
| ListMap3 | ListMap4 | ListMapWithIndex | ListKeepIf | ListWalk | ListWalkUntil | ListMap3 | ListMap4 | ListMapWithIndex | ListKeepIf | ListWalk | ListWalkUntil
| ListWalkBackwards | ListKeepOks | ListKeepErrs | ListSortWith | ListSublist | ListWalkBackwards | ListKeepOks | ListKeepErrs | ListSortWith | ListSublist

View file

@ -1390,19 +1390,19 @@ fn list_concat_large() {
} }
#[test] #[test]
#[cfg(any(feature = "gen-llvm"))] #[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))]
fn empty_list_len() { fn empty_list_len() {
assert_evals_to!("List.len []", 0, usize); assert_evals_to!("List.len []", 0, usize);
} }
#[test] #[test]
#[cfg(any(feature = "gen-llvm"))] #[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))]
fn basic_int_list_len() { fn basic_int_list_len() {
assert_evals_to!("List.len [ 12, 9, 6, 3 ]", 4, usize); assert_evals_to!("List.len [ 12, 9, 6, 3 ]", 4, usize);
} }
#[test] #[test]
#[cfg(any(feature = "gen-llvm"))] #[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))]
fn loaded_int_list_len() { fn loaded_int_list_len() {
assert_evals_to!( assert_evals_to!(
indoc!( indoc!(