diff --git a/crates/aiken-lang/src/uplc.rs b/crates/aiken-lang/src/uplc.rs index 5f7b90a0..7dd80713 100644 --- a/crates/aiken-lang/src/uplc.rs +++ b/crates/aiken-lang/src/uplc.rs @@ -13,6 +13,7 @@ use uplc::{ }, builtins::DefaultFunction, machine::cost_model::ExBudget, + optimize::aiken_optimize_and_intern, parser::interner::Interner, }; @@ -112,9 +113,11 @@ impl<'a> CodeGenerator<'a> { term, }; - let mut interner = Interner::new(); + println!("{}", program.to_pretty()); - interner.program(&mut program); + program = aiken_optimize_and_intern(program); + + println!("{}", program.to_pretty()); program } diff --git a/crates/uplc/src/optimize.rs b/crates/uplc/src/optimize.rs index 3dd876e9..641d07e7 100644 --- a/crates/uplc/src/optimize.rs +++ b/crates/uplc/src/optimize.rs @@ -1,7 +1,16 @@ -use crate::ast::{Name, Program}; +use crate::{ + ast::{Name, Program}, + parser::interner::Interner, +}; pub mod shrinker; -pub fn aiken_optimize(term: Program) -> Program { - term.builtin_force_reduce().lambda_reduce().inline_reduce() +pub fn aiken_optimize_and_intern(program: Program) -> Program { + let mut program = program.builtin_force_reduce(); + + let mut interner = Interner::new(); + + interner.program(&mut program); + + program.lambda_reduce().inline_reduce() } diff --git a/crates/uplc/src/optimize/shrinker.rs b/crates/uplc/src/optimize/shrinker.rs index dd4818aa..d3513dc0 100644 --- a/crates/uplc/src/optimize/shrinker.rs +++ b/crates/uplc/src/optimize/shrinker.rs @@ -89,7 +89,7 @@ fn builtin_force_reduce(term: &mut Term, builtin_map: &mut IndexMap) { fn var_occurrences(term: &Term, search_for: Rc, occurrences: &mut usize) { match term { Term::Var(name) => { - if name.clone() == search_for { + if name.as_ref() == search_for.as_ref() { *occurrences += 1; } } @@ -202,8 +202,7 @@ fn lambda_reduce(term: &mut Term) { { if let replace_term @ (Term::Var(_) | Term::Constant(_)) = argument.as_ref() { let body = Rc::make_mut(body); - lambda_reduce(body); - *body = substitute_term(body, parameter_name.clone(), replace_term); + *term = substitute_term(body, parameter_name.clone(), replace_term); } } } @@ -226,7 +225,7 @@ fn lambda_reduce(term: &mut Term) { fn substitute_term(term: &Term, original: Rc, replace_with: &Term) -> Term { match term { Term::Var(name) => { - if name.clone() == original { + if name.as_ref() == original.as_ref() { replace_with.clone() } else { Term::Var(name.clone()) @@ -239,7 +238,7 @@ fn substitute_term(term: &Term, original: Rc, replace_with: &Term { - if parameter_name.clone() != original { + if parameter_name.as_ref() != original.as_ref() { Term::Lambda { parameter_name: parameter_name.clone(), body: Rc::new(substitute_term(body.as_ref(), original, replace_with)),