mirror of
https://github.com/roc-lang/roc.git
synced 2024-11-14 07:29:02 +03:00
int cast
This commit is contained in:
parent
128741e585
commit
43e71f2ee9
@ -360,6 +360,12 @@ pub fn types() -> MutMap<Symbol, (SolvedType, Region)> {
|
|||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// intCast : Int a -> Int b
|
||||||
|
add_type(
|
||||||
|
Symbol::NUM_INT_CAST,
|
||||||
|
top_level_function(vec![int_type(flex(TVAR1))], Box::new(int_type(flex(TVAR2)))),
|
||||||
|
);
|
||||||
|
|
||||||
// rem : Int a, Int a -> Result (Int a) [ DivByZero ]*
|
// rem : Int a, Int a -> Result (Int a) [ DivByZero ]*
|
||||||
add_type(
|
add_type(
|
||||||
Symbol::NUM_REM,
|
Symbol::NUM_REM,
|
||||||
|
@ -156,6 +156,7 @@ pub fn builtin_defs_map(symbol: Symbol, var_store: &mut VarStore) -> Option<Def>
|
|||||||
NUM_SHIFT_LEFT=> num_shift_left_by,
|
NUM_SHIFT_LEFT=> num_shift_left_by,
|
||||||
NUM_SHIFT_RIGHT => num_shift_right_by,
|
NUM_SHIFT_RIGHT => num_shift_right_by,
|
||||||
NUM_SHIFT_RIGHT_ZERO_FILL => num_shift_right_zf_by,
|
NUM_SHIFT_RIGHT_ZERO_FILL => num_shift_right_zf_by,
|
||||||
|
NUM_INT_CAST=> num_int_cast,
|
||||||
RESULT_MAP => result_map,
|
RESULT_MAP => result_map,
|
||||||
RESULT_MAP_ERR => result_map_err,
|
RESULT_MAP_ERR => result_map_err,
|
||||||
RESULT_WITH_DEFAULT => result_with_default,
|
RESULT_WITH_DEFAULT => result_with_default,
|
||||||
@ -285,6 +286,7 @@ pub fn builtin_defs(var_store: &mut VarStore) -> MutMap<Symbol, Def> {
|
|||||||
Symbol::NUM_SHIFT_LEFT => num_shift_left_by,
|
Symbol::NUM_SHIFT_LEFT => num_shift_left_by,
|
||||||
Symbol::NUM_SHIFT_RIGHT => num_shift_right_by,
|
Symbol::NUM_SHIFT_RIGHT => num_shift_right_by,
|
||||||
Symbol::NUM_SHIFT_RIGHT_ZERO_FILL => num_shift_right_zf_by,
|
Symbol::NUM_SHIFT_RIGHT_ZERO_FILL => num_shift_right_zf_by,
|
||||||
|
Symbol::NUM_INT_CAST=> num_int_cast,
|
||||||
Symbol::RESULT_MAP => result_map,
|
Symbol::RESULT_MAP => result_map,
|
||||||
Symbol::RESULT_MAP_ERR => result_map_err,
|
Symbol::RESULT_MAP_ERR => result_map_err,
|
||||||
Symbol::RESULT_WITH_DEFAULT => result_with_default,
|
Symbol::RESULT_WITH_DEFAULT => result_with_default,
|
||||||
@ -1331,6 +1333,11 @@ fn num_shift_right_zf_by(symbol: Symbol, var_store: &mut VarStore) -> Def {
|
|||||||
lowlevel_2(symbol, LowLevel::NumShiftRightZfBy, var_store)
|
lowlevel_2(symbol, LowLevel::NumShiftRightZfBy, var_store)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Num.intCast: Int a -> Int b
|
||||||
|
fn num_int_cast(symbol: Symbol, var_store: &mut VarStore) -> Def {
|
||||||
|
lowlevel_1(symbol, LowLevel::NumIntCast, var_store)
|
||||||
|
}
|
||||||
|
|
||||||
/// List.isEmpty : List * -> Bool
|
/// List.isEmpty : List * -> Bool
|
||||||
fn list_is_empty(symbol: Symbol, var_store: &mut VarStore) -> Def {
|
fn list_is_empty(symbol: Symbol, var_store: &mut VarStore) -> Def {
|
||||||
let list_var = var_store.fresh();
|
let list_var = var_store.fresh();
|
||||||
|
@ -3983,6 +3983,16 @@ fn run_low_level<'a, 'ctx, 'env>(
|
|||||||
op,
|
op,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
NumIntCast => {
|
||||||
|
debug_assert_eq!(args.len(), 1);
|
||||||
|
|
||||||
|
let arg = load_symbol(scope, &args[0]).into_int_value();
|
||||||
|
|
||||||
|
let to = basic_type_from_layout(env.arena, env.context, layout, env.ptr_bytes)
|
||||||
|
.into_int_type();
|
||||||
|
|
||||||
|
env.builder.build_int_cast(arg, to, "inc_cast").into()
|
||||||
|
}
|
||||||
Eq => {
|
Eq => {
|
||||||
debug_assert_eq!(args.len(), 2);
|
debug_assert_eq!(args.len(), 2);
|
||||||
|
|
||||||
|
@ -83,6 +83,7 @@ pub enum LowLevel {
|
|||||||
NumShiftLeftBy,
|
NumShiftLeftBy,
|
||||||
NumShiftRightBy,
|
NumShiftRightBy,
|
||||||
NumShiftRightZfBy,
|
NumShiftRightZfBy,
|
||||||
|
NumIntCast,
|
||||||
Eq,
|
Eq,
|
||||||
NotEq,
|
NotEq,
|
||||||
And,
|
And,
|
||||||
|
@ -854,6 +854,8 @@ define_builtins! {
|
|||||||
93 NUM_AT_NATURAL: "@Natural"
|
93 NUM_AT_NATURAL: "@Natural"
|
||||||
94 NUM_NATURAL: "Natural" imported
|
94 NUM_NATURAL: "Natural" imported
|
||||||
95 NUM_NAT: "Nat" imported
|
95 NUM_NAT: "Nat" imported
|
||||||
|
96 NUM_INT_CAST: "intCast"
|
||||||
|
|
||||||
}
|
}
|
||||||
2 BOOL: "Bool" => {
|
2 BOOL: "Bool" => {
|
||||||
0 BOOL_BOOL: "Bool" imported // the Bool.Bool type alias
|
0 BOOL_BOOL: "Bool" imported // the Bool.Bool type alias
|
||||||
|
@ -671,7 +671,7 @@ pub fn lowlevel_borrow_signature(arena: &Bump, op: LowLevel) -> &[bool] {
|
|||||||
}
|
}
|
||||||
|
|
||||||
NumAbs | NumNeg | NumSin | NumCos | NumSqrtUnchecked | NumRound | NumCeiling | NumFloor
|
NumAbs | NumNeg | NumSin | NumCos | NumSqrtUnchecked | NumRound | NumCeiling | NumFloor
|
||||||
| NumToFloat | Not | NumIsFinite | NumAtan | NumAcos | NumAsin => {
|
| NumToFloat | Not | NumIsFinite | NumAtan | NumAcos | NumAsin | NumIntCast => {
|
||||||
arena.alloc_slice_copy(&[irrelevant])
|
arena.alloc_slice_copy(&[irrelevant])
|
||||||
}
|
}
|
||||||
StrStartsWith | StrEndsWith => arena.alloc_slice_copy(&[owned, borrowed]),
|
StrStartsWith | StrEndsWith => arena.alloc_slice_copy(&[owned, borrowed]),
|
||||||
|
Loading…
Reference in New Issue
Block a user