mirror of
https://github.com/roc-lang/roc.git
synced 2025-09-30 15:21:12 +00:00
Merge remote-tracking branch 'origin/trunk' into specialize-lowlevel
This commit is contained in:
commit
e81087f913
14 changed files with 1156 additions and 730 deletions
|
@ -161,6 +161,14 @@ pub enum Expr {
|
|||
arguments: Vec<(Variable, Located<Expr>)>,
|
||||
},
|
||||
|
||||
ZeroArgumentTag {
|
||||
closure_name: Symbol,
|
||||
variant_var: Variable,
|
||||
ext_var: Variable,
|
||||
name: TagName,
|
||||
arguments: Vec<(Variable, Located<Expr>)>,
|
||||
},
|
||||
|
||||
// Test
|
||||
Expect(Box<Located<Expr>>, Box<Located<Expr>>),
|
||||
|
||||
|
@ -395,6 +403,17 @@ pub fn canonicalize_expr<'a>(
|
|||
name,
|
||||
arguments: args,
|
||||
},
|
||||
ZeroArgumentTag {
|
||||
variant_var,
|
||||
ext_var,
|
||||
name,
|
||||
..
|
||||
} => Tag {
|
||||
variant_var,
|
||||
ext_var,
|
||||
name,
|
||||
arguments: args,
|
||||
},
|
||||
_ => {
|
||||
// This could be something like ((if True then fn1 else fn2) arg1 arg2).
|
||||
Call(
|
||||
|
@ -630,11 +649,14 @@ pub fn canonicalize_expr<'a>(
|
|||
let variant_var = var_store.fresh();
|
||||
let ext_var = var_store.fresh();
|
||||
|
||||
let symbol = env.gen_unique_symbol();
|
||||
|
||||
(
|
||||
Tag {
|
||||
ZeroArgumentTag {
|
||||
name: TagName::Global((*tag).into()),
|
||||
arguments: vec![],
|
||||
variant_var,
|
||||
closure_name: symbol,
|
||||
ext_var,
|
||||
},
|
||||
Output::default(),
|
||||
|
@ -645,13 +667,15 @@ pub fn canonicalize_expr<'a>(
|
|||
let ext_var = var_store.fresh();
|
||||
let tag_ident = env.ident_ids.get_or_insert(&(*tag).into());
|
||||
let symbol = Symbol::new(env.home, tag_ident);
|
||||
let lambda_set_symbol = env.gen_unique_symbol();
|
||||
|
||||
(
|
||||
Tag {
|
||||
ZeroArgumentTag {
|
||||
name: TagName::Private(symbol),
|
||||
arguments: vec![],
|
||||
variant_var,
|
||||
ext_var,
|
||||
closure_name: lambda_set_symbol,
|
||||
},
|
||||
Output::default(),
|
||||
)
|
||||
|
@ -1431,6 +1455,23 @@ pub fn inline_calls(var_store: &mut VarStore, scope: &mut Scope, expr: Expr) ->
|
|||
);
|
||||
}
|
||||
|
||||
ZeroArgumentTag {
|
||||
closure_name,
|
||||
variant_var,
|
||||
ext_var,
|
||||
name,
|
||||
arguments,
|
||||
} => {
|
||||
todo!(
|
||||
"Inlining for ZeroArgumentTag with closure_name {:?}, variant_var {:?}, ext_var {:?}, name {:?}, arguments {:?}",
|
||||
closure_name,
|
||||
variant_var,
|
||||
ext_var,
|
||||
name,
|
||||
arguments
|
||||
);
|
||||
}
|
||||
|
||||
Call(boxed_tuple, args, called_via) => {
|
||||
let (fn_var, loc_expr, closure_var, expr_var) = *boxed_tuple;
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue