Add recursive_static_params to AIR

Any methods to a recursive function that are unchanged and forwarded
don't need to be applied each time we recurse; instead, you can
define a containing lambda, reducing the number of applications
dramatically when recursing
This commit is contained in:
Pi Lanningham 2023-07-25 23:06:57 -04:00 committed by Kasey
parent 71a941e0b0
commit 586a2d7972
3 changed files with 11 additions and 0 deletions

View File

@ -2707,6 +2707,7 @@ impl<'a> CodeGenerator<'a> {
variant, variant,
func_params.clone(), func_params.clone(),
is_recursive, is_recursive,
vec![],
body, body,
); );
@ -2841,6 +2842,7 @@ impl<'a> CodeGenerator<'a> {
&dep_variant, &dep_variant,
dependent_params, dependent_params,
is_dependent_recursive, is_dependent_recursive,
vec![],
dep_air_tree, dep_air_tree,
)); ));
@ -3704,6 +3706,7 @@ impl<'a> CodeGenerator<'a> {
func_name, func_name,
params, params,
recursive, recursive,
recursive_static_params,
module_name, module_name,
variant_name, variant_name,
} => { } => {
@ -3733,6 +3736,8 @@ impl<'a> CodeGenerator<'a> {
.lambda(func_name) .lambda(func_name)
.apply(func_body); .apply(func_body);
// TODO: use recursive_static_params here
arg_stack.push(term); arg_stack.push(term);
} }
} }

View File

@ -47,6 +47,7 @@ pub enum Air {
module_name: String, module_name: String,
params: Vec<String>, params: Vec<String>,
recursive: bool, recursive: bool,
recursive_static_params: Vec<String>,
variant_name: String, variant_name: String,
}, },
Fn { Fn {

View File

@ -129,6 +129,7 @@ pub enum AirStatement {
module_name: String, module_name: String,
params: Vec<String>, params: Vec<String>,
recursive: bool, recursive: bool,
recursive_static_params: Vec<String>,
variant_name: String, variant_name: String,
func_body: Box<AirTree>, func_body: Box<AirTree>,
}, },
@ -423,6 +424,7 @@ impl AirTree {
variant_name: impl ToString, variant_name: impl ToString,
params: Vec<String>, params: Vec<String>,
recursive: bool, recursive: bool,
recursive_static_params: Vec<String>,
func_body: AirTree, func_body: AirTree,
) -> AirTree { ) -> AirTree {
AirTree::Statement { AirTree::Statement {
@ -431,6 +433,7 @@ impl AirTree {
module_name: module_name.to_string(), module_name: module_name.to_string(),
params, params,
recursive, recursive,
recursive_static_params,
variant_name: variant_name.to_string(), variant_name: variant_name.to_string(),
func_body: func_body.into(), func_body: func_body.into(),
}, },
@ -875,6 +878,7 @@ impl AirTree {
module_name, module_name,
params, params,
recursive, recursive,
recursive_static_params,
variant_name, variant_name,
func_body, func_body,
} => { } => {
@ -883,6 +887,7 @@ impl AirTree {
module_name: module_name.clone(), module_name: module_name.clone(),
params: params.clone(), params: params.clone(),
recursive: *recursive, recursive: *recursive,
recursive_static_params: recursive_static_params.clone(),
variant_name: variant_name.clone(), variant_name: variant_name.clone(),
}); });
func_body.create_air_vec(air_vec); func_body.create_air_vec(air_vec);