From 586a2d7972ca2cca624451df399d49fd3e45975f Mon Sep 17 00:00:00 2001 From: Pi Lanningham Date: Tue, 25 Jul 2023 23:06:57 -0400 Subject: [PATCH] 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 --- crates/aiken-lang/src/gen_uplc.rs | 5 +++++ crates/aiken-lang/src/gen_uplc/air.rs | 1 + crates/aiken-lang/src/gen_uplc/tree.rs | 5 +++++ 3 files changed, 11 insertions(+) diff --git a/crates/aiken-lang/src/gen_uplc.rs b/crates/aiken-lang/src/gen_uplc.rs index 73436721..0426a6ad 100644 --- a/crates/aiken-lang/src/gen_uplc.rs +++ b/crates/aiken-lang/src/gen_uplc.rs @@ -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); } } diff --git a/crates/aiken-lang/src/gen_uplc/air.rs b/crates/aiken-lang/src/gen_uplc/air.rs index c99541bb..b2d388a8 100644 --- a/crates/aiken-lang/src/gen_uplc/air.rs +++ b/crates/aiken-lang/src/gen_uplc/air.rs @@ -47,6 +47,7 @@ pub enum Air { module_name: String, params: Vec, recursive: bool, + recursive_static_params: Vec, variant_name: String, }, Fn { diff --git a/crates/aiken-lang/src/gen_uplc/tree.rs b/crates/aiken-lang/src/gen_uplc/tree.rs index e02a25fd..0b4fcb44 100644 --- a/crates/aiken-lang/src/gen_uplc/tree.rs +++ b/crates/aiken-lang/src/gen_uplc/tree.rs @@ -129,6 +129,7 @@ pub enum AirStatement { module_name: String, params: Vec, recursive: bool, + recursive_static_params: Vec, variant_name: String, func_body: Box, }, @@ -423,6 +424,7 @@ impl AirTree { variant_name: impl ToString, params: Vec, recursive: bool, + recursive_static_params: Vec, 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);