mirror of
https://github.com/roc-lang/roc.git
synced 2025-09-30 15:21:12 +00:00
use helpers in can builtin construction
This commit is contained in:
parent
fbaac9165f
commit
83f875ddca
3 changed files with 21 additions and 230 deletions
|
@ -95,7 +95,7 @@ pub fn gen_from_mono_module(
|
||||||
}
|
}
|
||||||
|
|
||||||
if name.starts_with("roc_builtins.dict") || name.starts_with("dict.RocDict") {
|
if name.starts_with("roc_builtins.dict") || name.starts_with("dict.RocDict") {
|
||||||
function.add_attribute(AttributeLoc::Function, attr);
|
// function.add_attribute(AttributeLoc::Function, attr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1980,46 +1980,12 @@ fn list_map(symbol: Symbol, var_store: &mut VarStore) -> Def {
|
||||||
|
|
||||||
/// Dict.hashTestOnly : k, v -> Nat
|
/// Dict.hashTestOnly : k, v -> Nat
|
||||||
pub fn dict_hash_test_only(symbol: Symbol, var_store: &mut VarStore) -> Def {
|
pub fn dict_hash_test_only(symbol: Symbol, var_store: &mut VarStore) -> Def {
|
||||||
let key_var = var_store.fresh();
|
lowlevel_2(symbol, LowLevel::Hash, var_store)
|
||||||
let value_var = var_store.fresh();
|
|
||||||
let nat_var = var_store.fresh();
|
|
||||||
|
|
||||||
let body = RunLowLevel {
|
|
||||||
op: LowLevel::Hash,
|
|
||||||
args: vec![
|
|
||||||
(key_var, Var(Symbol::ARG_1)),
|
|
||||||
(value_var, Var(Symbol::ARG_2)),
|
|
||||||
],
|
|
||||||
ret_var: nat_var,
|
|
||||||
};
|
|
||||||
|
|
||||||
defn(
|
|
||||||
symbol,
|
|
||||||
vec![(key_var, Symbol::ARG_1), (value_var, Symbol::ARG_2)],
|
|
||||||
var_store,
|
|
||||||
body,
|
|
||||||
nat_var,
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Dict.len : Dict * * -> Nat
|
/// Dict.len : Dict * * -> Nat
|
||||||
fn dict_len(symbol: Symbol, var_store: &mut VarStore) -> Def {
|
fn dict_len(symbol: Symbol, var_store: &mut VarStore) -> Def {
|
||||||
let size_var = var_store.fresh();
|
lowlevel_1(symbol, LowLevel::DictSize, var_store)
|
||||||
let dict_var = var_store.fresh();
|
|
||||||
|
|
||||||
let body = RunLowLevel {
|
|
||||||
op: LowLevel::DictSize,
|
|
||||||
args: vec![(dict_var, Var(Symbol::ARG_1))],
|
|
||||||
ret_var: size_var,
|
|
||||||
};
|
|
||||||
|
|
||||||
defn(
|
|
||||||
symbol,
|
|
||||||
vec![(dict_var, Symbol::ARG_1)],
|
|
||||||
var_store,
|
|
||||||
body,
|
|
||||||
size_var,
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Dict.empty : Dict * *
|
/// Dict.empty : Dict * *
|
||||||
|
@ -2073,78 +2039,17 @@ fn dict_singleton(symbol: Symbol, var_store: &mut VarStore) -> Def {
|
||||||
|
|
||||||
/// Dict.insert : Dict k v, k, v -> Dict k v
|
/// Dict.insert : Dict k v, k, v -> Dict k v
|
||||||
fn dict_insert(symbol: Symbol, var_store: &mut VarStore) -> Def {
|
fn dict_insert(symbol: Symbol, var_store: &mut VarStore) -> Def {
|
||||||
let dict_var = var_store.fresh();
|
lowlevel_3(symbol, LowLevel::DictInsert, var_store)
|
||||||
let key_var = var_store.fresh();
|
|
||||||
let val_var = var_store.fresh();
|
|
||||||
|
|
||||||
let body = RunLowLevel {
|
|
||||||
op: LowLevel::DictInsert,
|
|
||||||
args: vec![
|
|
||||||
(dict_var, Var(Symbol::ARG_1)),
|
|
||||||
(key_var, Var(Symbol::ARG_2)),
|
|
||||||
(val_var, Var(Symbol::ARG_3)),
|
|
||||||
],
|
|
||||||
ret_var: dict_var,
|
|
||||||
};
|
|
||||||
|
|
||||||
defn(
|
|
||||||
symbol,
|
|
||||||
vec![
|
|
||||||
(dict_var, Symbol::ARG_1),
|
|
||||||
(key_var, Symbol::ARG_2),
|
|
||||||
(val_var, Symbol::ARG_3),
|
|
||||||
],
|
|
||||||
var_store,
|
|
||||||
body,
|
|
||||||
dict_var,
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Dict.remove : Dict k v, k -> Dict k v
|
/// Dict.remove : Dict k v, k -> Dict k v
|
||||||
fn dict_remove(symbol: Symbol, var_store: &mut VarStore) -> Def {
|
fn dict_remove(symbol: Symbol, var_store: &mut VarStore) -> Def {
|
||||||
let dict_var = var_store.fresh();
|
lowlevel_2(symbol, LowLevel::DictRemove, var_store)
|
||||||
let key_var = var_store.fresh();
|
|
||||||
|
|
||||||
let body = RunLowLevel {
|
|
||||||
op: LowLevel::DictRemove,
|
|
||||||
args: vec![
|
|
||||||
(dict_var, Var(Symbol::ARG_1)),
|
|
||||||
(key_var, Var(Symbol::ARG_2)),
|
|
||||||
],
|
|
||||||
ret_var: dict_var,
|
|
||||||
};
|
|
||||||
|
|
||||||
defn(
|
|
||||||
symbol,
|
|
||||||
vec![(dict_var, Symbol::ARG_1), (key_var, Symbol::ARG_2)],
|
|
||||||
var_store,
|
|
||||||
body,
|
|
||||||
dict_var,
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Dict.contains : Dict k v, k -> Bool
|
/// Dict.contains : Dict k v, k -> Bool
|
||||||
fn dict_contains(symbol: Symbol, var_store: &mut VarStore) -> Def {
|
fn dict_contains(symbol: Symbol, var_store: &mut VarStore) -> Def {
|
||||||
let dict_var = var_store.fresh();
|
lowlevel_2(symbol, LowLevel::DictContains, var_store)
|
||||||
let key_var = var_store.fresh();
|
|
||||||
let bool_var = var_store.fresh();
|
|
||||||
|
|
||||||
let body = RunLowLevel {
|
|
||||||
op: LowLevel::DictContains,
|
|
||||||
args: vec![
|
|
||||||
(dict_var, Var(Symbol::ARG_1)),
|
|
||||||
(key_var, Var(Symbol::ARG_2)),
|
|
||||||
],
|
|
||||||
ret_var: bool_var,
|
|
||||||
};
|
|
||||||
|
|
||||||
defn(
|
|
||||||
symbol,
|
|
||||||
vec![(dict_var, Symbol::ARG_1), (key_var, Symbol::ARG_2)],
|
|
||||||
var_store,
|
|
||||||
body,
|
|
||||||
bool_var,
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Dict.get : Dict k v, k -> Result v [ KeyNotFound ]*
|
/// Dict.get : Dict k v, k -> Result v [ KeyNotFound ]*
|
||||||
|
@ -2230,108 +2135,32 @@ fn dict_get(symbol: Symbol, var_store: &mut VarStore) -> Def {
|
||||||
|
|
||||||
/// Dict.keys : Dict k v -> List k
|
/// Dict.keys : Dict k v -> List k
|
||||||
fn dict_keys(symbol: Symbol, var_store: &mut VarStore) -> Def {
|
fn dict_keys(symbol: Symbol, var_store: &mut VarStore) -> Def {
|
||||||
let dict_var = var_store.fresh();
|
lowlevel_1(symbol, LowLevel::DictKeys, var_store)
|
||||||
let list_var = var_store.fresh();
|
|
||||||
|
|
||||||
let body = RunLowLevel {
|
|
||||||
op: LowLevel::DictKeys,
|
|
||||||
args: vec![(dict_var, Var(Symbol::ARG_1))],
|
|
||||||
ret_var: list_var,
|
|
||||||
};
|
|
||||||
|
|
||||||
defn(
|
|
||||||
symbol,
|
|
||||||
vec![(dict_var, Symbol::ARG_1)],
|
|
||||||
var_store,
|
|
||||||
body,
|
|
||||||
list_var,
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Dict.values : Dict k v -> List v
|
/// Dict.values : Dict k v -> List v
|
||||||
fn dict_values(symbol: Symbol, var_store: &mut VarStore) -> Def {
|
fn dict_values(symbol: Symbol, var_store: &mut VarStore) -> Def {
|
||||||
let dict_var = var_store.fresh();
|
lowlevel_1(symbol, LowLevel::DictValues, var_store)
|
||||||
let list_var = var_store.fresh();
|
|
||||||
|
|
||||||
let body = RunLowLevel {
|
|
||||||
op: LowLevel::DictValues,
|
|
||||||
args: vec![(dict_var, Var(Symbol::ARG_1))],
|
|
||||||
ret_var: list_var,
|
|
||||||
};
|
|
||||||
|
|
||||||
defn(
|
|
||||||
symbol,
|
|
||||||
vec![(dict_var, Symbol::ARG_1)],
|
|
||||||
var_store,
|
|
||||||
body,
|
|
||||||
list_var,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Dict k v, Dict k v -> Dict k v
|
|
||||||
fn dict_dict_dict(symbol: Symbol, op: LowLevel, var_store: &mut VarStore) -> Def {
|
|
||||||
let dict_var = var_store.fresh();
|
|
||||||
|
|
||||||
let body = RunLowLevel {
|
|
||||||
op,
|
|
||||||
args: vec![
|
|
||||||
(dict_var, Var(Symbol::ARG_1)),
|
|
||||||
(dict_var, Var(Symbol::ARG_2)),
|
|
||||||
],
|
|
||||||
ret_var: dict_var,
|
|
||||||
};
|
|
||||||
|
|
||||||
defn(
|
|
||||||
symbol,
|
|
||||||
vec![(dict_var, Symbol::ARG_1), (dict_var, Symbol::ARG_2)],
|
|
||||||
var_store,
|
|
||||||
body,
|
|
||||||
dict_var,
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Dict.union : Dict k v, Dict k v -> Dict k v
|
/// Dict.union : Dict k v, Dict k v -> Dict k v
|
||||||
fn dict_union(symbol: Symbol, var_store: &mut VarStore) -> Def {
|
fn dict_union(symbol: Symbol, var_store: &mut VarStore) -> Def {
|
||||||
dict_dict_dict(symbol, LowLevel::DictUnion, var_store)
|
lowlevel_2(symbol, LowLevel::DictUnion, var_store)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Dict.difference : Dict k v, Dict k v -> Dict k v
|
/// Dict.difference : Dict k v, Dict k v -> Dict k v
|
||||||
fn dict_difference(symbol: Symbol, var_store: &mut VarStore) -> Def {
|
fn dict_difference(symbol: Symbol, var_store: &mut VarStore) -> Def {
|
||||||
dict_dict_dict(symbol, LowLevel::DictDifference, var_store)
|
lowlevel_2(symbol, LowLevel::DictDifference, var_store)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Dict.intersection : Dict k v, Dict k v -> Dict k v
|
/// Dict.intersection : Dict k v, Dict k v -> Dict k v
|
||||||
fn dict_intersection(symbol: Symbol, var_store: &mut VarStore) -> Def {
|
fn dict_intersection(symbol: Symbol, var_store: &mut VarStore) -> Def {
|
||||||
dict_dict_dict(symbol, LowLevel::DictIntersection, var_store)
|
lowlevel_2(symbol, LowLevel::DictIntersection, var_store)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Dict.walk : Dict k v, (k, v, accum -> accum), accum -> accum
|
/// Dict.walk : Dict k v, (k, v, accum -> accum), accum -> accum
|
||||||
fn dict_walk(symbol: Symbol, var_store: &mut VarStore) -> Def {
|
fn dict_walk(symbol: Symbol, var_store: &mut VarStore) -> Def {
|
||||||
let dict_var = var_store.fresh();
|
lowlevel_3(symbol, LowLevel::DictWalk, var_store)
|
||||||
let func_var = var_store.fresh();
|
|
||||||
let accum_var = var_store.fresh();
|
|
||||||
|
|
||||||
let body = RunLowLevel {
|
|
||||||
op: LowLevel::DictWalk,
|
|
||||||
args: vec![
|
|
||||||
(dict_var, Var(Symbol::ARG_1)),
|
|
||||||
(func_var, Var(Symbol::ARG_2)),
|
|
||||||
(accum_var, Var(Symbol::ARG_3)),
|
|
||||||
],
|
|
||||||
ret_var: accum_var,
|
|
||||||
};
|
|
||||||
|
|
||||||
defn(
|
|
||||||
symbol,
|
|
||||||
vec![
|
|
||||||
(dict_var, Symbol::ARG_1),
|
|
||||||
(func_var, Symbol::ARG_2),
|
|
||||||
(accum_var, Symbol::ARG_3),
|
|
||||||
],
|
|
||||||
var_store,
|
|
||||||
body,
|
|
||||||
accum_var,
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Set.empty : Set *
|
/// Set.empty : Set *
|
||||||
|
@ -2385,42 +2214,22 @@ fn set_singleton(symbol: Symbol, var_store: &mut VarStore) -> Def {
|
||||||
|
|
||||||
/// Set.len : Set * -> Nat
|
/// Set.len : Set * -> Nat
|
||||||
fn set_len(symbol: Symbol, var_store: &mut VarStore) -> Def {
|
fn set_len(symbol: Symbol, var_store: &mut VarStore) -> Def {
|
||||||
let size_var = var_store.fresh();
|
lowlevel_1(symbol, LowLevel::DictSize, var_store)
|
||||||
let set_var = var_store.fresh();
|
|
||||||
|
|
||||||
let body = RunLowLevel {
|
|
||||||
op: LowLevel::DictSize,
|
|
||||||
args: vec![(set_var, Var(Symbol::ARG_1))],
|
|
||||||
ret_var: size_var,
|
|
||||||
};
|
|
||||||
|
|
||||||
defn(
|
|
||||||
symbol,
|
|
||||||
vec![(set_var, Symbol::ARG_1)],
|
|
||||||
var_store,
|
|
||||||
body,
|
|
||||||
size_var,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Set k, Set k -> Set k
|
|
||||||
fn set_set_set(symbol: Symbol, op: LowLevel, var_store: &mut VarStore) -> Def {
|
|
||||||
dict_dict_dict(symbol, op, var_store)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Dict.union : Dict k v, Dict k v -> Dict k v
|
/// Dict.union : Dict k v, Dict k v -> Dict k v
|
||||||
fn set_union(symbol: Symbol, var_store: &mut VarStore) -> Def {
|
fn set_union(symbol: Symbol, var_store: &mut VarStore) -> Def {
|
||||||
set_set_set(symbol, LowLevel::DictUnion, var_store)
|
lowlevel_2(symbol, LowLevel::DictUnion, var_store)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Dict.difference : Dict k v, Dict k v -> Dict k v
|
/// Dict.difference : Dict k v, Dict k v -> Dict k v
|
||||||
fn set_difference(symbol: Symbol, var_store: &mut VarStore) -> Def {
|
fn set_difference(symbol: Symbol, var_store: &mut VarStore) -> Def {
|
||||||
set_set_set(symbol, LowLevel::DictDifference, var_store)
|
lowlevel_2(symbol, LowLevel::DictDifference, var_store)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Dict.intersection : Dict k v, Dict k v -> Dict k v
|
/// Dict.intersection : Dict k v, Dict k v -> Dict k v
|
||||||
fn set_intersection(symbol: Symbol, var_store: &mut VarStore) -> Def {
|
fn set_intersection(symbol: Symbol, var_store: &mut VarStore) -> Def {
|
||||||
set_set_set(symbol, LowLevel::DictIntersection, var_store)
|
lowlevel_2(symbol, LowLevel::DictIntersection, var_store)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Set.toList : Set k -> List k
|
/// Set.toList : Set k -> List k
|
||||||
|
|
|
@ -2245,30 +2245,12 @@ pub fn build_exp_stmt<'a, 'ctx, 'env>(
|
||||||
let (value, layout) = load_symbol_and_layout(scope, symbol);
|
let (value, layout) = load_symbol_and_layout(scope, symbol);
|
||||||
|
|
||||||
if layout.is_refcounted() {
|
if layout.is_refcounted() {
|
||||||
match value {
|
if value.is_pointer_value() {
|
||||||
BasicValueEnum::PointerValue(value_ptr) => {
|
// BasicValueEnum::PointerValue(value_ptr) => {
|
||||||
let refcount_ptr =
|
let value_ptr = value.into_pointer_value();
|
||||||
PointerToRefcount::from_ptr_to_data(env, value_ptr);
|
let refcount_ptr = PointerToRefcount::from_ptr_to_data(env, value_ptr);
|
||||||
refcount_ptr.decrement(env, layout);
|
refcount_ptr.decrement(env, layout);
|
||||||
}
|
}
|
||||||
BasicValueEnum::StructValue(_value_struct) => {
|
|
||||||
match layout {
|
|
||||||
Layout::Builtin(Builtin::Str)
|
|
||||||
| Layout::Builtin(Builtin::List(_, _))
|
|
||||||
| Layout::Builtin(Builtin::Dict(_, _))
|
|
||||||
| Layout::Builtin(Builtin::Set(_)) => {
|
|
||||||
// let refcount_ptr = PointerToRefcount::from_list_wrapper(env, value_struct);
|
|
||||||
// refcount_ptr.decrement(env, layout);
|
|
||||||
eprintln!("we are likely leaking some memory, see #985 for details");
|
|
||||||
}
|
|
||||||
_ => unreachable!(
|
|
||||||
"decref on weird type, likely a closure? {:?}",
|
|
||||||
layout
|
|
||||||
),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
_ => unreachable!("cannot be decref'd"),
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
build_exp_stmt(env, layout_ids, scope, parent, cont)
|
build_exp_stmt(env, layout_ids, scope, parent, cont)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue