mirror of
https://github.com/roc-lang/roc.git
synced 2025-09-29 14:54:47 +00:00
monomorphize addition
This commit is contained in:
parent
8e11d69c45
commit
4c9f2c1b6e
3 changed files with 60 additions and 3 deletions
|
@ -575,6 +575,7 @@ define_builtins! {
|
||||||
4 INT_MOD: "mod"
|
4 INT_MOD: "mod"
|
||||||
5 INT_HIGHEST: "highest"
|
5 INT_HIGHEST: "highest"
|
||||||
6 INT_LOWEST: "lowest"
|
6 INT_LOWEST: "lowest"
|
||||||
|
7 INT_ADD: "add"
|
||||||
}
|
}
|
||||||
3 FLOAT: "Float" => {
|
3 FLOAT: "Float" => {
|
||||||
0 FLOAT_FLOAT: "Float" imported // the Float.Float type alias
|
0 FLOAT_FLOAT: "Float" imported // the Float.Float type alias
|
||||||
|
@ -585,6 +586,7 @@ define_builtins! {
|
||||||
5 FLOAT_SQRT: "sqrt"
|
5 FLOAT_SQRT: "sqrt"
|
||||||
6 FLOAT_HIGHEST: "highest"
|
6 FLOAT_HIGHEST: "highest"
|
||||||
7 FLOAT_LOWEST: "lowest"
|
7 FLOAT_LOWEST: "lowest"
|
||||||
|
8 FLOAT_ADD: "add"
|
||||||
}
|
}
|
||||||
4 BOOL: "Bool" => {
|
4 BOOL: "Bool" => {
|
||||||
0 BOOL_BOOL: "Bool" imported // the Bool.Bool type alias
|
0 BOOL_BOOL: "Bool" imported // the Bool.Bool type alias
|
||||||
|
|
|
@ -264,13 +264,23 @@ fn from_can<'a>(
|
||||||
}
|
}
|
||||||
|
|
||||||
Call(boxed, loc_args, _) => {
|
Call(boxed, loc_args, _) => {
|
||||||
let (fn_var, loc_expr, _) = *boxed;
|
let (fn_var, loc_expr, ret_var) = *boxed;
|
||||||
|
|
||||||
|
let specialize_builtin_functions = {
|
||||||
|
|symbol, subs: &Subs| match dbg!(symbol) {
|
||||||
|
Symbol::NUM_ADD => match to_int_or_float(subs, ret_var) {
|
||||||
|
IntOrFloat::FloatType => Symbol::FLOAT_ADD,
|
||||||
|
IntOrFloat::IntType => Symbol::INT_ADD,
|
||||||
|
},
|
||||||
|
_ => symbol,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
match from_can(env, loc_expr.value, procs, None) {
|
match from_can(env, loc_expr.value, procs, None) {
|
||||||
Expr::Load(proc_name) => {
|
Expr::Load(proc_name) => {
|
||||||
// Some functions can potentially mutate in-place.
|
// Some functions can potentially mutate in-place.
|
||||||
// If we have one of those, switch to the in-place version if appropriate.
|
// If we have one of those, switch to the in-place version if appropriate.
|
||||||
match proc_name {
|
match specialize_builtin_functions(proc_name, &env.subs) {
|
||||||
Symbol::LIST_SET => {
|
Symbol::LIST_SET => {
|
||||||
let subs = &env.subs;
|
let subs = &env.subs;
|
||||||
// The first arg is the one with the List in it.
|
// The first arg is the one with the List in it.
|
||||||
|
@ -302,7 +312,9 @@ fn from_can<'a>(
|
||||||
_ => call_by_name(env, procs, proc_name, loc_args),
|
_ => call_by_name(env, procs, proc_name, loc_args),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_ => call_by_name(env, procs, proc_name, loc_args),
|
specialized_proc_symbol => {
|
||||||
|
call_by_name(env, procs, specialized_proc_symbol, loc_args)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ptr => {
|
ptr => {
|
||||||
|
|
|
@ -78,6 +78,49 @@ mod test_mono {
|
||||||
compiles_to("0.5", Float(0.5));
|
compiles_to("0.5", Float(0.5));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn float_addition() {
|
||||||
|
compiles_to(
|
||||||
|
"3.0 + 4",
|
||||||
|
CallByName(
|
||||||
|
Symbol::FLOAT_ADD,
|
||||||
|
&[
|
||||||
|
(Float(3.0), Layout::Builtin(Builtin::Float64)),
|
||||||
|
(Float(4.0), Layout::Builtin(Builtin::Float64)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn int_addition() {
|
||||||
|
compiles_to(
|
||||||
|
"0xDEADBEEF + 4",
|
||||||
|
CallByName(
|
||||||
|
Symbol::INT_ADD,
|
||||||
|
&[
|
||||||
|
(Int(3735928559), Layout::Builtin(Builtin::Int64)),
|
||||||
|
(Int(4), Layout::Builtin(Builtin::Int64)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn num_addition() {
|
||||||
|
// Default to Int for `Num *`
|
||||||
|
compiles_to(
|
||||||
|
"3 + 5",
|
||||||
|
CallByName(
|
||||||
|
Symbol::INT_ADD,
|
||||||
|
&[
|
||||||
|
(Int(3), Layout::Builtin(Builtin::Int64)),
|
||||||
|
(Int(5), Layout::Builtin(Builtin::Int64)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn bool_literal() {
|
fn bool_literal() {
|
||||||
let arena = Bump::new();
|
let arena = Bump::new();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue