From ef8969133102c2c1aa30983e44cbdca8b46d282a Mon Sep 17 00:00:00 2001 From: KtorZ Date: Thu, 29 Aug 2024 16:56:16 +0200 Subject: [PATCH] Ensure code-gen's Program version/semantic matches Plutus version --- crates/aiken-lang/src/gen_uplc.rs | 38 +++++++------------ crates/aiken-lang/src/plutus_version.rs | 2 +- ..._project__export__tests__basic_export.snap | 4 +- ...oject__export__tests__recursive_types.snap | 4 +- crates/aiken-project/src/tests/gen_uplc.rs | 4 +- 5 files changed, 20 insertions(+), 32 deletions(-) diff --git a/crates/aiken-lang/src/gen_uplc.rs b/crates/aiken-lang/src/gen_uplc.rs index c47f8cfb..a52153be 100644 --- a/crates/aiken-lang/src/gen_uplc.rs +++ b/crates/aiken-lang/src/gen_uplc.rs @@ -163,17 +163,19 @@ impl<'a> CodeGenerator<'a> { self.finalize(term) } - fn finalize(&mut self, mut term: Term) -> Program { - term = self.special_functions.apply_used_functions(term); - + fn new_program(&self, term: Term) -> Program { let version = match self.plutus_version { PlutusVersion::V1 | PlutusVersion::V2 => (1, 0, 0), PlutusVersion::V3 => (1, 1, 0), }; - let mut program = Program { version, term }; + Program { version, term } + } - program = aiken_optimize_and_intern(program); + fn finalize(&mut self, mut term: Term) -> Program { + term = self.special_functions.apply_used_functions(term); + + let program = aiken_optimize_and_intern(self.new_program(term)); // This is very important to call here. // If this isn't done, re-using the same instance @@ -4245,10 +4247,8 @@ impl<'a> CodeGenerator<'a> { .constr_fields_exposer() .constr_index_exposer(); - let mut program: Program = Program { - version: (1, 0, 0), - term: self.special_functions.apply_used_functions(term), - }; + let mut program = + self.new_program(self.special_functions.apply_used_functions(term)); let mut interner = CodeGenInterner::new(); @@ -4358,10 +4358,7 @@ impl<'a> CodeGenerator<'a> { .apply(Term::integer(constr_index.into())) .apply(term); - let mut program: Program = Program { - version: (1, 0, 0), - term, - }; + let mut program = self.new_program(term); let mut interner = CodeGenInterner::new(); @@ -4914,10 +4911,7 @@ impl<'a> CodeGenerator<'a> { }; if extract_constant(term.pierce_no_inlines()).is_some() { - let mut program: Program = Program { - version: (1, 0, 0), - term, - }; + let mut program = self.new_program(term); let mut interner = CodeGenInterner::new(); @@ -4942,10 +4936,7 @@ impl<'a> CodeGenerator<'a> { if extract_constant(term.pierce_no_inlines()).is_some() { term = builder::convert_type_to_data(term, &tipo); - let mut program: Program = Program { - version: (1, 0, 0), - term, - }; + let mut program = self.new_program(term); let mut interner = CodeGenInterner::new(); @@ -5391,10 +5382,7 @@ impl<'a> CodeGenerator<'a> { let maybe_const = extract_constant(item.pierce_no_inlines()); maybe_const.is_some() }) { - let mut program: Program = Program { - version: (1, 0, 0), - term, - }; + let mut program = self.new_program(term); let mut interner = CodeGenInterner::new(); diff --git a/crates/aiken-lang/src/plutus_version.rs b/crates/aiken-lang/src/plutus_version.rs index 66a1d306..69c35701 100644 --- a/crates/aiken-lang/src/plutus_version.rs +++ b/crates/aiken-lang/src/plutus_version.rs @@ -5,8 +5,8 @@ use serde::{Deserialize, Serialize}; #[serde(rename_all = "camelCase")] pub enum PlutusVersion { V1, - #[default] V2, + #[default] V3, } diff --git a/crates/aiken-project/src/snapshots/aiken_project__export__tests__basic_export.snap b/crates/aiken-project/src/snapshots/aiken_project__export__tests__basic_export.snap index e28412b8..03ce0b29 100644 --- a/crates/aiken-project/src/snapshots/aiken_project__export__tests__basic_export.snap +++ b/crates/aiken-project/src/snapshots/aiken_project__export__tests__basic_export.snap @@ -18,8 +18,8 @@ description: "Code:\n\npub fn add(a: Int, b: Int) -> Int {\n a + b\n}\n" } } ], - "compiledCode": "500100002322337000046eb4004dd68009", - "hash": "bcd6700b4dba798a7d19c5769ef3deb21423f8809594a6942860dd1f", + "compiledCode": "500101002322337000046eb4004dd68009", + "hash": "b8374597a772cef80d891b7f6a03588e10cc19b780251228ba4ce9c6", "definitions": { "Int": { "dataType": "integer" diff --git a/crates/aiken-project/src/snapshots/aiken_project__export__tests__recursive_types.snap b/crates/aiken-project/src/snapshots/aiken_project__export__tests__recursive_types.snap index 16e9cdff..1ad945d3 100644 --- a/crates/aiken-project/src/snapshots/aiken_project__export__tests__recursive_types.snap +++ b/crates/aiken-project/src/snapshots/aiken_project__export__tests__recursive_types.snap @@ -18,8 +18,8 @@ description: "Code:\n\npub type Foo {\n Empty\n Bar(a, Foo)\n}\n\npub fn } } ], - "compiledCode": "5901d501000032323232323222323232323253330083002300937540062a666010600460126ea801052000001001132323232533300b3004300c375400c2646464a66601c600e601e6ea80284c8cdc019b80003375a60260026600c0046026602800260206ea8028010c044c048008dd6980800098069baa006001132533300b3005300c375400c2a666016600860186ea801c4c8cdc01bad3010001330034c103d879800030103011001300d375400e00200226466e00dd698078009980118079808000a60103d8798000300c375400a600200244464646464a66601e601260206ea800854ccc03cc024c040dd50018a4000002002264a66601e601060206ea80084c8c8c94ccc048c02cc04cdd500309919b80337000066eb4c05c004ccc02c02c008c05cc060004c050dd5003002180a980b0011bad301400130113754004002264a66601e601260206ea800854ccc03cc020c040dd500189919b80375a6028002666010010980103d8798000301430150013011375400600200226466e00dd698098009998038039809980a000a60103d8798000301037540026022004602060220026601c0046601c00297ae0370e90011b8748000c024008c020c024004cc018008cc0180052f5c0ae6955ceaab9e5740ae855d101", - "hash": "dca86b6e092019b67ef310ba8360682d7bf8284cc728c6b525fb0b0d", + "compiledCode": "5901d501010032323232323222323232323253330083002300937540062a666010600460126ea801052000001001132323232533300b3004300c375400c2646464a66601c600e601e6ea80284c8cdc019b80003375a60260026600c0046026602800260206ea8028010c044c048008dd6980800098069baa006001132533300b3005300c375400c2a666016600860186ea801c4c8cdc01bad3010001330034c103d879800030103011001300d375400e00200226466e00dd698078009980118079808000a60103d8798000300c375400a600200244464646464a66601e601260206ea800854ccc03cc024c040dd50018a4000002002264a66601e601060206ea80084c8c8c94ccc048c02cc04cdd500309919b80337000066eb4c05c004ccc02c02c008c05cc060004c050dd5003002180a980b0011bad301400130113754004002264a66601e601260206ea800854ccc03cc020c040dd500189919b80375a6028002666010010980103d8798000301430150013011375400600200226466e00dd698098009998038039809980a000a60103d8798000301037540026022004602060220026601c0046601c00297ae0370e90011b8748000c024008c020c024004cc018008cc0180052f5c0ae6955ceaab9e5740ae855d101", + "hash": "46254b889c878fb25e55ad7e9eb3d331770a55defec65749c9504581", "definitions": { "Int": { "dataType": "integer" diff --git a/crates/aiken-project/src/tests/gen_uplc.rs b/crates/aiken-project/src/tests/gen_uplc.rs index 659e9247..cc8dae7c 100644 --- a/crates/aiken-project/src/tests/gen_uplc.rs +++ b/crates/aiken-project/src/tests/gen_uplc.rs @@ -57,7 +57,7 @@ fn assert_uplc(source_code: &str, expected: Term, should_fail: bool) { let debruijn_program: Program = program.try_into().unwrap(); let expected = Program { - version: (1, 0, 0), + version: (1, 1, 0), term: expected, }; @@ -97,7 +97,7 @@ fn assert_uplc(source_code: &str, expected: Term, should_fail: bool) { let debruijn_program: Program = program.try_into().unwrap(); let expected = Program { - version: (1, 0, 0), + version: (1, 1, 0), term: expected, };