Optimize curry with constant arguments.

This commit is contained in:
Stephen Chung 2023-04-10 13:11:33 +08:00
parent 120ff91074
commit 465fdeec21

View File

@ -1112,7 +1112,6 @@ fn optimize_expr(expr: &mut Expr, state: &mut OptimizerState, _chaining: bool) {
// Fn // Fn
Expr::FnCall(x, pos) Expr::FnCall(x, pos)
if !x.is_qualified() // Non-qualified if !x.is_qualified() // Non-qualified
&& state.optimization_level == OptimizationLevel::Simple // simple optimizations
&& x.args.len() == 1 && x.args.len() == 1
&& x.name == KEYWORD_FN_PTR && x.name == KEYWORD_FN_PTR
&& x.constant_args() && x.constant_args()
@ -1129,6 +1128,19 @@ fn optimize_expr(expr: &mut Expr, state: &mut OptimizerState, _chaining: bool) {
optimize_expr(&mut x.args[0], state, false); optimize_expr(&mut x.args[0], state, false);
} }
} }
// curry(FnPtr, constants...)
Expr::FnCall(x, pos)
if !x.is_qualified() // Non-qualified
&& x.args.len() >= 2
&& x.name == KEYWORD_FN_PTR_CURRY
&& matches!(x.args[0], Expr::DynamicConstant(ref v, ..) if v.is_fnptr())
&& x.constant_args()
=> {
let mut fn_ptr = x.args[0].get_literal_value().unwrap().cast::<FnPtr>();
fn_ptr.extend(x.args.iter().skip(1).map(|arg_expr| arg_expr.get_literal_value().unwrap()));
state.set_dirty();
*expr = Expr::DynamicConstant(Box::new(fn_ptr.into()), *pos);
}
// Do not call some special keywords that may have side effects // Do not call some special keywords that may have side effects
Expr::FnCall(x, ..) if DONT_EVAL_KEYWORDS.contains(&x.name.as_str()) => { Expr::FnCall(x, ..) if DONT_EVAL_KEYWORDS.contains(&x.name.as_str()) => {