From eec08fcbd97cbb1bb3deeebcf61221b5c6f80c56 Mon Sep 17 00:00:00 2001 From: microproofs Date: Mon, 18 Nov 2024 12:21:40 -0500 Subject: [PATCH] Fix scoped path for list with tail cases only plus wild card fallback --- .../aiken-lang/src/gen_uplc/decision_tree.rs | 15 ++++++++++---- examples/acceptance_tests/114/aiken.toml | 2 ++ examples/acceptance_tests/114/lib/tests.ak | 20 +++++++++++++++++++ 3 files changed, 33 insertions(+), 4 deletions(-) create mode 100644 examples/acceptance_tests/114/aiken.toml create mode 100644 examples/acceptance_tests/114/lib/tests.ak diff --git a/crates/aiken-lang/src/gen_uplc/decision_tree.rs b/crates/aiken-lang/src/gen_uplc/decision_tree.rs index 7be67f44..9c557166 100644 --- a/crates/aiken-lang/src/gen_uplc/decision_tree.rs +++ b/crates/aiken-lang/src/gen_uplc/decision_tree.rs @@ -428,10 +428,17 @@ impl<'a> DecisionTree<'a> { .enumerate() .rev() .for_each(|(index, (_, detree))| { - prev.push(Marker::PopPush( - ScopePath::Case(index + cases.len()), - detree, - )); + if index + cases.len() == 0 { + prev.push(Marker::Push( + ScopePath::Case(index + cases.len()), + detree, + )); + } else { + prev.push(Marker::PopPush( + ScopePath::Case(index + cases.len()), + detree, + )); + } }); cases diff --git a/examples/acceptance_tests/114/aiken.toml b/examples/acceptance_tests/114/aiken.toml new file mode 100644 index 00000000..becdf076 --- /dev/null +++ b/examples/acceptance_tests/114/aiken.toml @@ -0,0 +1,2 @@ +name = "aiken-lang/acceptance_test_006" +version = "0.0.0" diff --git a/examples/acceptance_tests/114/lib/tests.ak b/examples/acceptance_tests/114/lib/tests.ak new file mode 100644 index 00000000..4fe2b14f --- /dev/null +++ b/examples/acceptance_tests/114/lib/tests.ak @@ -0,0 +1,20 @@ +test baz() { + let assets = + [ + ("PolicyId1", [("AssetName", 20)]), + ("PolicyId2", [("AssetName1", 300), ("AssetName2", 4_000)]), + ("PolicyId3", []), + ] + let is_empty_or_contains_policyid2 = + when assets is { + [] -> True + [_head, (p, [_, (a, q), ..] as tokens), ..] -> and { + tokens == [("AssetName1", 300), ("AssetName2", 4000)], + p == "PolicyId2", + a == "AssetName2", + q >= 4_000, + } + _ -> False + } + is_empty_or_contains_policyid2 +}