From 4eafdd2d3973b335d9c469d9a14f77503543eda0 Mon Sep 17 00:00:00 2001 From: Kasey White Date: Sun, 26 Jun 2022 21:30:24 -0400 Subject: [PATCH] fix issue with same names causing 0 index debruijn for var --- crates/uplc/src/debruijn.rs | 10 ++++++++++ crates/uplc/src/debruijn/bimap.rs | 7 +++++++ crates/uplc/tests/integ_tests.rs | 2 +- 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/crates/uplc/src/debruijn.rs b/crates/uplc/src/debruijn.rs index 45416f8a..e8e17a3d 100644 --- a/crates/uplc/src/debruijn.rs +++ b/crates/uplc/src/debruijn.rs @@ -59,6 +59,8 @@ impl Converter { self.end_scope(); + self.remove_unique(parameter_name.unique); + Term::Lambda { parameter_name: name, body: Box::new(body), @@ -95,6 +97,8 @@ impl Converter { self.end_scope(); + self.remove_unique(parameter_name.unique); + Term::Lambda { parameter_name: name, body: Box::new(body), @@ -340,6 +344,12 @@ impl Converter { scope.insert(unique, self.current_level); } + fn remove_unique(&mut self, unique: Unique) { + let scope = &mut self.levels[self.current_level.0]; + + scope.remove(unique, self.current_level); + } + fn declare_binder(&mut self) { let scope = &mut self.levels[self.current_level.0]; diff --git a/crates/uplc/src/debruijn/bimap.rs b/crates/uplc/src/debruijn/bimap.rs index af506095..77ebc769 100644 --- a/crates/uplc/src/debruijn/bimap.rs +++ b/crates/uplc/src/debruijn/bimap.rs @@ -4,6 +4,8 @@ use crate::ast::Unique; use super::Level; +#[derive(Debug)] + pub struct BiMap { left: HashMap, right: HashMap, @@ -22,6 +24,11 @@ impl BiMap { self.right.insert(level, unique); } + pub(super) fn remove(&mut self, unique: Unique, level: Level) { + self.left.remove(&unique); + self.right.remove(&level); + } + pub(super) fn get(&self, unique: &Unique) -> Option<&Level> { self.left.get(unique) } diff --git a/crates/uplc/tests/integ_tests.rs b/crates/uplc/tests/integ_tests.rs index 22ec11f3..361fe121 100644 --- a/crates/uplc/tests/integ_tests.rs +++ b/crates/uplc/tests/integ_tests.rs @@ -75,7 +75,6 @@ fn fibonacci() { } // TODO: This is failing, see Bug: https://github.com/txpipe/aiken/issues/10 -#[ignore] #[test] fn one_way_fibonacci() { let bytes = include_bytes!("../test_data/fibonacci/fibonacci.flat"); @@ -86,4 +85,5 @@ fn one_way_fibonacci() { let code = include_str!("../test_data/fibonacci/unsanitary_fibonacci.uplc"); parsed_program_matches_decoded_bytes(bytes, code); + encoded_program_matches_bytes(bytes, code); }