mirror of
https://github.com/roc-lang/roc.git
synced 2025-08-03 19:58:18 +00:00
remove dict/set lowlevels
This commit is contained in:
parent
79f8ae4e69
commit
8e21fdcb04
9 changed files with 7 additions and 520 deletions
|
@ -2,10 +2,6 @@ use crate::llvm::bitcode::{
|
|||
call_bitcode_fn, call_bitcode_fn_fixing_for_convention, call_list_bitcode_fn,
|
||||
call_str_bitcode_fn, call_void_bitcode_fn,
|
||||
};
|
||||
use crate::llvm::build_dict::{
|
||||
self, dict_contains, dict_difference, dict_empty, dict_get, dict_insert, dict_intersection,
|
||||
dict_keys, dict_len, dict_remove, dict_union, dict_values, dict_walk, set_from_list,
|
||||
};
|
||||
use crate::llvm::build_hash::generic_hash;
|
||||
use crate::llvm::build_list::{
|
||||
self, allocate_list, empty_polymorphic_list, list_append_unsafe, list_concat, list_drop_at,
|
||||
|
@ -2265,15 +2261,6 @@ pub fn allocate_with_refcount_help<'a, 'ctx, 'env>(
|
|||
.into_pointer_value()
|
||||
}
|
||||
|
||||
macro_rules! dict_key_value_layout {
|
||||
($dict_layout:expr) => {
|
||||
match $dict_layout {
|
||||
Layout::Builtin(Builtin::Dict(key_layout, value_layout)) => (key_layout, value_layout),
|
||||
_ => unreachable!("invalid dict layout"),
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
macro_rules! list_element_layout {
|
||||
($list_layout:expr) => {
|
||||
match $list_layout {
|
||||
|
@ -2824,18 +2811,10 @@ pub fn build_exp_stmt<'a, 'ctx, 'env>(
|
|||
build_list::decref(env, value.into_struct_value(), alignment);
|
||||
}
|
||||
Layout::Builtin(Builtin::Dict(key_layout, value_layout)) => {
|
||||
debug_assert!(value.is_struct_value());
|
||||
let alignment = key_layout
|
||||
.alignment_bytes(env.target_info)
|
||||
.max(value_layout.alignment_bytes(env.target_info));
|
||||
|
||||
build_dict::decref(env, value.into_struct_value(), alignment);
|
||||
todo!()
|
||||
}
|
||||
Layout::Builtin(Builtin::Set(key_layout)) => {
|
||||
debug_assert!(value.is_struct_value());
|
||||
let alignment = key_layout.alignment_bytes(env.target_info);
|
||||
|
||||
build_dict::decref(env, value.into_struct_value(), alignment);
|
||||
todo!()
|
||||
}
|
||||
|
||||
_ if layout.is_refcounted() => {
|
||||
|
@ -5341,40 +5320,6 @@ fn run_higher_order_low_level<'a, 'ctx, 'env>(
|
|||
_ => unreachable!("invalid list layout"),
|
||||
}
|
||||
}
|
||||
DictWalk { xs, state } => {
|
||||
let (dict, dict_layout) = load_symbol_and_layout(scope, xs);
|
||||
let (default, default_layout) = load_symbol_and_layout(scope, state);
|
||||
|
||||
let (function, closure, closure_layout) = function_details!();
|
||||
|
||||
match dict_layout {
|
||||
Layout::Builtin(Builtin::Dict(key_layout, value_layout)) => {
|
||||
let argument_layouts = &[*default_layout, **key_layout, **value_layout];
|
||||
|
||||
let roc_function_call = roc_function_call(
|
||||
env,
|
||||
layout_ids,
|
||||
function,
|
||||
closure,
|
||||
closure_layout,
|
||||
function_owns_closure_data,
|
||||
argument_layouts,
|
||||
result_layout,
|
||||
);
|
||||
|
||||
dict_walk(
|
||||
env,
|
||||
roc_function_call,
|
||||
dict,
|
||||
default,
|
||||
key_layout,
|
||||
value_layout,
|
||||
default_layout,
|
||||
)
|
||||
}
|
||||
_ => unreachable!("invalid dict layout"),
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -6135,109 +6080,8 @@ fn run_low_level<'a, 'ctx, 'env>(
|
|||
|
||||
generic_hash(env, layout_ids, seed.into_int_value(), value, layout).into()
|
||||
}
|
||||
DictSize => {
|
||||
debug_assert_eq!(args.len(), 1);
|
||||
dict_len(env, scope, args[0])
|
||||
}
|
||||
DictEmpty => {
|
||||
debug_assert_eq!(args.len(), 0);
|
||||
dict_empty(env)
|
||||
}
|
||||
DictInsert => {
|
||||
debug_assert_eq!(args.len(), 3);
|
||||
|
||||
let (dict, _) = load_symbol_and_layout(scope, &args[0]);
|
||||
let (key, key_layout) = load_symbol_and_layout(scope, &args[1]);
|
||||
let (value, value_layout) = load_symbol_and_layout(scope, &args[2]);
|
||||
dict_insert(env, layout_ids, dict, key, key_layout, value, value_layout)
|
||||
}
|
||||
DictRemove => {
|
||||
debug_assert_eq!(args.len(), 2);
|
||||
|
||||
let (dict, dict_layout) = load_symbol_and_layout(scope, &args[0]);
|
||||
let key = load_symbol(scope, &args[1]);
|
||||
|
||||
let (key_layout, value_layout) = dict_key_value_layout!(dict_layout);
|
||||
dict_remove(env, layout_ids, dict, key, key_layout, value_layout)
|
||||
}
|
||||
DictContains => {
|
||||
debug_assert_eq!(args.len(), 2);
|
||||
|
||||
let (dict, dict_layout) = load_symbol_and_layout(scope, &args[0]);
|
||||
let key = load_symbol(scope, &args[1]);
|
||||
|
||||
let (key_layout, value_layout) = dict_key_value_layout!(dict_layout);
|
||||
dict_contains(env, layout_ids, dict, key, key_layout, value_layout)
|
||||
}
|
||||
DictGetUnsafe => {
|
||||
debug_assert_eq!(args.len(), 2);
|
||||
|
||||
let (dict, dict_layout) = load_symbol_and_layout(scope, &args[0]);
|
||||
let key = load_symbol(scope, &args[1]);
|
||||
|
||||
let (key_layout, value_layout) = dict_key_value_layout!(dict_layout);
|
||||
dict_get(env, layout_ids, dict, key, key_layout, value_layout)
|
||||
}
|
||||
DictKeys => {
|
||||
debug_assert_eq!(args.len(), 1);
|
||||
|
||||
let (dict, dict_layout) = load_symbol_and_layout(scope, &args[0]);
|
||||
|
||||
let (key_layout, value_layout) = dict_key_value_layout!(dict_layout);
|
||||
dict_keys(env, layout_ids, dict, key_layout, value_layout)
|
||||
}
|
||||
DictValues => {
|
||||
debug_assert_eq!(args.len(), 1);
|
||||
|
||||
let (dict, dict_layout) = load_symbol_and_layout(scope, &args[0]);
|
||||
|
||||
let (key_layout, value_layout) = dict_key_value_layout!(dict_layout);
|
||||
dict_values(env, layout_ids, dict, key_layout, value_layout)
|
||||
}
|
||||
DictUnion => {
|
||||
debug_assert_eq!(args.len(), 2);
|
||||
|
||||
let (dict1, dict_layout) = load_symbol_and_layout(scope, &args[0]);
|
||||
let (dict2, _) = load_symbol_and_layout(scope, &args[1]);
|
||||
|
||||
let (key_layout, value_layout) = dict_key_value_layout!(dict_layout);
|
||||
dict_union(env, layout_ids, dict1, dict2, key_layout, value_layout)
|
||||
}
|
||||
DictDifference => {
|
||||
debug_assert_eq!(args.len(), 2);
|
||||
|
||||
let (dict1, dict_layout) = load_symbol_and_layout(scope, &args[0]);
|
||||
let (dict2, _) = load_symbol_and_layout(scope, &args[1]);
|
||||
|
||||
let (key_layout, value_layout) = dict_key_value_layout!(dict_layout);
|
||||
dict_difference(env, layout_ids, dict1, dict2, key_layout, value_layout)
|
||||
}
|
||||
DictIntersection => {
|
||||
debug_assert_eq!(args.len(), 2);
|
||||
|
||||
let (dict1, dict_layout) = load_symbol_and_layout(scope, &args[0]);
|
||||
let (dict2, _) = load_symbol_and_layout(scope, &args[1]);
|
||||
|
||||
let (key_layout, value_layout) = dict_key_value_layout!(dict_layout);
|
||||
dict_intersection(env, layout_ids, dict1, dict2, key_layout, value_layout)
|
||||
}
|
||||
SetFromList => {
|
||||
debug_assert_eq!(args.len(), 1);
|
||||
|
||||
let (list, list_layout) = load_symbol_and_layout(scope, &args[0]);
|
||||
|
||||
let key_layout = list_element_layout!(list_layout);
|
||||
set_from_list(env, layout_ids, list, key_layout)
|
||||
}
|
||||
SetToDict => {
|
||||
debug_assert_eq!(args.len(), 1);
|
||||
|
||||
let (set, _set_layout) = load_symbol_and_layout(scope, &args[0]);
|
||||
|
||||
set
|
||||
}
|
||||
|
||||
ListMap | ListMap2 | ListMap3 | ListMap4 | ListSortWith | DictWalk => {
|
||||
ListMap | ListMap2 | ListMap3 | ListMap4 | ListSortWith => {
|
||||
unreachable!("these are higher order, and are handled elsewhere")
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue