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

View File

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

View File

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