From d26524048e2cbe64d6766d4eb3832376f310ba34 Mon Sep 17 00:00:00 2001 From: microproofs Date: Sat, 13 Jan 2024 18:55:39 -0500 Subject: [PATCH] fix: headlist builtin on assoc lists implement chooseunit for 0 args --- crates/aiken-lang/src/gen_uplc.rs | 35 ++++++++++++++++------- crates/aiken-lang/src/gen_uplc/builder.rs | 19 ++++++------ 2 files changed, 32 insertions(+), 22 deletions(-) diff --git a/crates/aiken-lang/src/gen_uplc.rs b/crates/aiken-lang/src/gen_uplc.rs index f6b3be2f..b4481f1e 100644 --- a/crates/aiken-lang/src/gen_uplc.rs +++ b/crates/aiken-lang/src/gen_uplc.rs @@ -3770,14 +3770,25 @@ impl<'a> CodeGenerator<'a> { builder::special_case_builtin(builtin, 0, vec![]) } - DefaultFunction::FstPair - | DefaultFunction::SndPair - | DefaultFunction::HeadList => builder::undata_builtin( - builtin, - 0, - &constructor.tipo.return_type().unwrap(), - vec![], - ), + DefaultFunction::FstPair | DefaultFunction::SndPair => { + builder::undata_builtin( + builtin, + 0, + &constructor.tipo.return_type().unwrap(), + vec![], + ) + } + + DefaultFunction::HeadList + if !constructor.tipo.return_type().unwrap().is_2_tuple() => + { + builder::undata_builtin( + builtin, + 0, + &constructor.tipo.return_type().unwrap(), + vec![], + ) + } DefaultFunction::MkCons | DefaultFunction::MkPairData => { unimplemented!("MkCons and MkPairData should be handled by an anon function or using [] or ( a, b, .., z).\n") @@ -4164,9 +4175,11 @@ impl<'a> CodeGenerator<'a> { builder::special_case_builtin(&func, count, arg_vec) } - DefaultFunction::FstPair - | DefaultFunction::SndPair - | DefaultFunction::HeadList => { + DefaultFunction::FstPair | DefaultFunction::SndPair => { + builder::undata_builtin(&func, count, tipo, arg_vec) + } + + DefaultFunction::HeadList if !tipo.is_2_tuple() => { builder::undata_builtin(&func, count, tipo, arg_vec) } diff --git a/crates/aiken-lang/src/gen_uplc/builder.rs b/crates/aiken-lang/src/gen_uplc/builder.rs index 017e7eb4..b5567d1a 100644 --- a/crates/aiken-lang/src/gen_uplc/builder.rs +++ b/crates/aiken-lang/src/gen_uplc/builder.rs @@ -1543,7 +1543,14 @@ pub fn special_case_builtin( mut args: Vec>, ) -> Term { match func { - DefaultFunction::IfThenElse + DefaultFunction::ChooseUnit if count > 0 => { + let term = args.pop().unwrap(); + let unit = args.pop().unwrap(); + + term.lambda("_").apply(unit) + } + DefaultFunction::ChooseUnit + | DefaultFunction::IfThenElse | DefaultFunction::ChooseList | DefaultFunction::ChooseData | DefaultFunction::Trace => { @@ -1580,16 +1587,6 @@ pub fn special_case_builtin( term } - DefaultFunction::ChooseUnit => { - if count == 0 { - unimplemented!("Honestly, why are you doing this?") - } else { - let term = args.pop().unwrap(); - let unit = args.pop().unwrap(); - - term.lambda("_").apply(unit) - } - } DefaultFunction::UnConstrData => { let mut term: Term = (*func).into();