diff --git a/compiler/builtins/bitcode/src/dict.zig b/compiler/builtins/bitcode/src/dict.zig index f17f2dfe98..6ab2c894c2 100644 --- a/compiler/builtins/bitcode/src/dict.zig +++ b/compiler/builtins/bitcode/src/dict.zig @@ -408,7 +408,19 @@ const Dec = fn (?[*]u8) callconv(.C) void; const Caller3 = fn (?[*]u8, ?[*]u8, ?[*]u8, ?[*]u8, ?[*]u8) callconv(.C) void; // Dict.insert : Dict k v, k, v -> Dict k v -pub fn dictInsert(input: RocDict, alignment: Alignment, key: Opaque, key_width: usize, value: Opaque, value_width: usize, hash_fn: HashFn, is_eq: EqFn, dec_key: Dec, dec_value: Dec, output: *RocDict) callconv(.C) void { +pub fn dictInsert( + input: RocDict, + alignment: Alignment, + key: Opaque, + key_width: usize, + value: Opaque, + value_width: usize, + hash_fn: HashFn, + is_eq: EqFn, + dec_key: Dec, + dec_value: Dec, + output: *RocDict, +) callconv(.C) void { var seed: u64 = INITIAL_SEED; var result = input.makeUnique(alignment, key_width, value_width); @@ -549,8 +561,7 @@ pub fn dictKeys( key_width: usize, value_width: usize, inc_key: Inc, - output: *RocList, -) callconv(.C) void { +) callconv(.C) RocList { const size = dict.capacity(); var length: usize = 0; @@ -565,8 +576,7 @@ pub fn dictKeys( } if (length == 0) { - output.* = RocList.empty(); - return; + return RocList.empty(); } const data_bytes = length * key_width; @@ -588,10 +598,16 @@ pub fn dictKeys( } } - output.* = RocList{ .bytes = ptr, .length = length, .capacity = length }; + return RocList{ .bytes = ptr, .length = length, .capacity = length }; } -pub fn dictValues(dict: RocDict, alignment: Alignment, key_width: usize, value_width: usize, inc_value: Inc, output: *RocList) callconv(.C) void { +pub fn dictValues( + dict: RocDict, + alignment: Alignment, + key_width: usize, + value_width: usize, + inc_value: Inc, +) callconv(.C) RocList { const size = dict.capacity(); var length: usize = 0; @@ -606,8 +622,7 @@ pub fn dictValues(dict: RocDict, alignment: Alignment, key_width: usize, value_w } if (length == 0) { - output.* = RocList.empty(); - return; + return RocList.empty(); } const data_bytes = length * value_width; @@ -629,7 +644,7 @@ pub fn dictValues(dict: RocDict, alignment: Alignment, key_width: usize, value_w } } - output.* = RocList{ .bytes = ptr, .length = length, .capacity = length }; + return RocList{ .bytes = ptr, .length = length, .capacity = length }; } fn doNothing(_: Opaque) callconv(.C) void { diff --git a/compiler/gen_llvm/src/llvm/build_dict.rs b/compiler/gen_llvm/src/llvm/build_dict.rs index 68c4e59f52..306ac978ad 100644 --- a/compiler/gen_llvm/src/llvm/build_dict.rs +++ b/compiler/gen_llvm/src/llvm/build_dict.rs @@ -19,6 +19,7 @@ use roc_module::symbol::Symbol; use roc_mono::layout::{Builtin, Layout, LayoutIds}; use roc_target::TargetInfo; +use super::bitcode::call_list_bitcode_fn; use super::build_list::list_to_c_abi; #[repr(transparent)] @@ -431,9 +432,7 @@ pub fn dict_keys<'a, 'ctx, 'env>( let inc_key_fn = build_inc_wrapper(env, layout_ids, key_layout); - let list_ptr = builder.build_alloca(zig_list_type(env), "list_ptr"); - - call_void_bitcode_fn( + call_list_bitcode_fn( env, &[ pass_dict_c_abi(env, dict), @@ -441,21 +440,9 @@ pub fn dict_keys<'a, 'ctx, 'env>( key_width.into(), value_width.into(), inc_key_fn.as_global_value().as_pointer_value().into(), - list_ptr.into(), ], bitcode::DICT_KEYS, - ); - - let list_ptr = env - .builder - .build_bitcast( - list_ptr, - super::convert::zig_list_type(env).ptr_type(AddressSpace::Generic), - "to_roc_list", - ) - .into_pointer_value(); - - env.builder.build_load(list_ptr, "load_keys_list") + ) } fn pass_dict_c_abi<'a, 'ctx, 'env>( @@ -689,9 +676,7 @@ pub fn dict_values<'a, 'ctx, 'env>( let inc_value_fn = build_inc_wrapper(env, layout_ids, value_layout); - let list_ptr = builder.build_alloca(zig_list_type, "list_ptr"); - - call_void_bitcode_fn( + call_list_bitcode_fn( env, &[ pass_dict_c_abi(env, dict), @@ -699,21 +684,9 @@ pub fn dict_values<'a, 'ctx, 'env>( key_width.into(), value_width.into(), inc_value_fn.as_global_value().as_pointer_value().into(), - list_ptr.into(), ], bitcode::DICT_VALUES, - ); - - let list_ptr = env - .builder - .build_bitcast( - list_ptr, - super::convert::zig_list_type(env).ptr_type(AddressSpace::Generic), - "to_roc_list", - ) - .into_pointer_value(); - - env.builder.build_load(list_ptr, "load_keys_list") + ) } #[allow(clippy::too_many_arguments)]