fix: zero arg functions were grabbing extra dependencies they didn't need to

fix: Had the wrong conversion for constant maps to plutus data. Fixed to check for right conversion
This commit is contained in:
microproofs 2023-06-04 15:23:36 -04:00
parent cf6d04e95b
commit bfd2a50a6b
4 changed files with 84 additions and 11 deletions

View File

@ -962,17 +962,40 @@ pub fn convert_constants_to_data(constants: Vec<Rc<UplcConstant>>) -> Vec<UplcCo
.map_or(Some((*b).into()), |_| None),
fields: vec![],
})),
UplcConstant::ProtoList(_, constants) => {
let inner_constants =
convert_constants_to_data(constants.iter().cloned().map(Rc::new).collect())
.into_iter()
.map(|constant| match constant {
UplcConstant::Data(d) => d,
_ => todo!(),
UplcConstant::ProtoList(list_type, constants) => {
if matches!(list_type, UplcType::Pair(_, _)) {
let inner_constants = constants
.iter()
.cloned()
.map(|pair| match pair {
UplcConstant::ProtoPair(_, _, left, right) => {
let inner_constants = vec![left, right];
let inner_constants = convert_constants_to_data(inner_constants)
.into_iter()
.map(|constant| match constant {
UplcConstant::Data(d) => d,
_ => todo!(),
})
.collect_vec();
(inner_constants[0].clone(), inner_constants[1].clone())
}
_ => unreachable!(),
})
.collect_vec();
UplcConstant::Data(PlutusData::Array(inner_constants))
UplcConstant::Data(PlutusData::Map(KeyValuePairs::Def(inner_constants)))
} else {
let inner_constants =
convert_constants_to_data(constants.iter().cloned().map(Rc::new).collect())
.into_iter()
.map(|constant| match constant {
UplcConstant::Data(d) => d,
_ => todo!(),
})
.collect_vec();
UplcConstant::Data(PlutusData::Array(inner_constants))
}
}
UplcConstant::ProtoPair(_, _, left, right) => {
let inner_constants = vec![left.clone(), right.clone()];
@ -984,10 +1007,10 @@ pub fn convert_constants_to_data(constants: Vec<Rc<UplcConstant>>) -> Vec<UplcCo
})
.collect_vec();
UplcConstant::Data(PlutusData::Map(KeyValuePairs::Def(vec![(
UplcConstant::Data(PlutusData::Array(vec![
inner_constants[0].clone(),
inner_constants[1].clone(),
)])))
]))
}
d @ UplcConstant::Data(_) => d.clone(),
UplcConstant::Unit => UplcConstant::Data(PlutusData::Constr(Constr {
@ -1540,7 +1563,7 @@ pub fn handle_func_dependencies(
.unwrap_or_else(|| unreachable!());
if (dep_scope.common_ancestor(func_scope) == *func_scope && !depend_comp.args.is_empty())
|| function_component.args.is_empty()
|| (function_component.args.is_empty() && !depend_comp.args.is_empty())
{
let mut recursion_ir = vec![];
handle_recursion_ir(&dependency, depend_comp, &mut recursion_ir);

View File

@ -0,0 +1,13 @@
# This file was generated by Aiken
# You typically do not need to edit this file
[[requirements]]
name = "aiken-lang/stdlib"
version = "main"
source = "github"
[[packages]]
name = "aiken-lang/stdlib"
version = "main"
requirements = []
source = "github"

View File

@ -0,0 +1,8 @@
name = "aiken-lang/acceptance_test_082"
version = "0.0.0"
description = ""
[[dependencies]]
name = 'aiken-lang/stdlib'
version = 'main'
source = 'github'

View File

@ -0,0 +1,29 @@
use aiken/list
use aiken/transaction/value.{Value}
test foldl_value_test1() {
let val1 = value.from_lovelace(1000000)
let val2 = value.from_lovelace(2000000)
let foo =
fn(i: Value, acc: (Value, Int)) {
let (v, int) = acc
(value.add(i, v), int + 1)
}
list.foldl([val1, val2], foo, (value.zero(), 0)) == (
value.from_lovelace(3000000),
2,
)
}
// test foldl_value_test2() {
// let val1 = value.from_lovelace(1000000)
// let val2 = value.from_lovelace(2000000)
// let foo =
// fn(i: Value, acc: (Value, Int)) {
// let (v, int) = acc
// (value.add(i, v), int + 1)
// }
// list.foldl([val1, val2], foo, (value.from_lovelace(0), 0)) == (
// value.from_lovelace(3000000),
// 2,
// )
// }