Skip to content

Commit

Permalink
fix errors
Browse files Browse the repository at this point in the history
  • Loading branch information
MicroProofs committed Apr 27, 2024
1 parent 4a276b1 commit d7600b2
Show file tree
Hide file tree
Showing 4 changed files with 89 additions and 141 deletions.
3 changes: 3 additions & 0 deletions crates/aiken-lang/src/ast.rs
Expand Up @@ -1119,6 +1119,9 @@ impl Annotation {
elems.iter().find_map(|arg| arg.find_node(byte_index))
}
Annotation::Var { .. } | Annotation::Hole { .. } => None,
Annotation::Pair { fst, snd, .. } => fst
.find_node(byte_index)
.or_else(|| snd.find_node(byte_index)),
};

located.or(Some(Located::Annotation(self)))
Expand Down
211 changes: 79 additions & 132 deletions crates/aiken-lang/src/gen_uplc.rs
Expand Up @@ -372,42 +372,32 @@ impl<'a> CodeGenerator<'a> {
},
..
} => {
if tipo.is_pair() {
assert!(args.len() == 2);
let data_type = lookup_data_type_by_tipo(&self.data_types, tipo)
.expect("Creating a record with no record definition.");

let arg1 = self.build(&args[0].value, module_build_name, &[]);

let arg2 = self.build(&args[1].value, module_build_name, &[]);

AirTree::pair(arg1, arg2, tipo.clone())
} else {
let data_type = lookup_data_type_by_tipo(&self.data_types, tipo)
.expect("Creating a record with no record definition.");

let (constr_index, _) = data_type
.constructors
.iter()
.enumerate()
.find(|(_, dt)| &dt.name == constr_name)
.unwrap();
let (constr_index, _) = data_type
.constructors
.iter()
.enumerate()
.find(|(_, dt)| &dt.name == constr_name)
.unwrap();

let constr_args = args
.iter()
.zip(constr_tipo.arg_types().unwrap())
.map(|(arg, tipo)| {
if tipo.is_data() {
AirTree::cast_to_data(
self.build(&arg.value, module_build_name, &[]),
arg.value.tipo(),
)
} else {
self.build(&arg.value, module_build_name, &[])
}
})
.collect_vec();
let constr_args = args
.iter()
.zip(constr_tipo.arg_types().unwrap())
.map(|(arg, tipo)| {
if tipo.is_data() {
AirTree::cast_to_data(
self.build(&arg.value, module_build_name, &[]),
arg.value.tipo(),
)
} else {
self.build(&arg.value, module_build_name, &[])
}
})
.collect_vec();

AirTree::create_constr(constr_index, constr_tipo.clone(), constr_args)
}
AirTree::create_constr(constr_index, constr_tipo.clone(), constr_args)
}

TypedExpr::Var {
Expand Down Expand Up @@ -659,12 +649,6 @@ impl<'a> CodeGenerator<'a> {
} => {
if check_replaceable_opaque_type(&record.tipo(), &self.data_types) {
self.build(record, module_build_name, &[])
} else if record.tipo().is_pair() {
AirTree::pair_index(
*index,
tipo.clone(),
self.build(record, module_build_name, &[]),
)
} else {
let function_name = format!("__access_index_{}", *index);

Expand Down Expand Up @@ -714,19 +698,7 @@ impl<'a> CodeGenerator<'a> {
field_map,
..
} => {
let val_constructor = if tipo.is_pair() {
ValueConstructor::public(
tipo.clone(),
ValueConstructorVariant::Record {
module: "".into(),
name: name.clone(),
field_map: field_map.clone(),
arity: 2,
location: Span::empty(),
constructors_count: 1,
},
)
} else {
let val_constructor = {
let data_type = lookup_data_type_by_tipo(&self.data_types, tipo);

ValueConstructor::public(
Expand Down Expand Up @@ -792,102 +764,76 @@ impl<'a> CodeGenerator<'a> {
TypedExpr::TupleIndex {
index, tuple, tipo, ..
} => {
let function_name = format!("__access_index_{}", *index);
if tuple.tipo().is_pair() {
AirTree::pair_index(
*index,
tipo.clone(),
self.build(tuple, module_build_name, &[]),
)
} else {
let function_name = format!("__access_index_{}", *index);

if self.code_gen_functions.get(&function_name).is_none() {
let mut body = AirTree::local_var("__fields", list(data()));
if self.code_gen_functions.get(&function_name).is_none() {
let mut body = AirTree::local_var("__fields", list(data()));

for _ in 0..*index {
body = AirTree::builtin(
DefaultFunction::TailList,
list(data()),
vec![body],
)
}
for _ in 0..*index {
body = AirTree::builtin(
DefaultFunction::TailList,
list(data()),
vec![body],
)
}

body = AirTree::builtin(DefaultFunction::HeadList, data(), vec![body]);
body = AirTree::builtin(DefaultFunction::HeadList, data(), vec![body]);

self.code_gen_functions.insert(
function_name.clone(),
CodeGenFunction::Function {
body,
params: vec!["__fields".to_string()],
},
);
}
self.code_gen_functions.insert(
function_name.clone(),
CodeGenFunction::Function {
body,
params: vec!["__fields".to_string()],
},
);
}

AirTree::index_access(
function_name,
tipo.clone(),
self.build(tuple, module_build_name, &[]),
)
AirTree::index_access(
function_name,
tipo.clone(),
self.build(tuple, module_build_name, &[]),
)
}
}

TypedExpr::ErrorTerm { tipo, .. } => AirTree::error(tipo.clone(), false),

TypedExpr::RecordUpdate {
tipo, spread, args, ..
} => {
if tipo.is_pair() {
assert!(args.len() == 1);
let mut index_types = vec![];
let mut update_args = vec![];

let Some(arg) = args.first() else {
unreachable!("Pair update with no arguments")
};
let mut highest_index = 0;

for arg in args
.iter()
.sorted_by(|arg1, arg2| arg1.index.cmp(&arg2.index))
{
let arg_val = self.build(&arg.value, module_build_name, &[]);

let other_pair = self.build(spread, module_build_name, &[]);

if arg.index == 0 {
AirTree::pair(
arg_val,
AirTree::pair_index(
1,
tipo.get_inner_types()[1].clone(),
other_pair,
),
tipo.clone(),
)
} else {
AirTree::pair(
AirTree::pair_index(
0,
tipo.get_inner_types()[0].clone(),
other_pair,
),
arg_val,
tipo.clone(),
)
}
} else {
let mut index_types = vec![];
let mut update_args = vec![];

let mut highest_index = 0;

for arg in args
.iter()
.sorted_by(|arg1, arg2| arg1.index.cmp(&arg2.index))
{
let arg_val = self.build(&arg.value, module_build_name, &[]);

if arg.index > highest_index {
highest_index = arg.index;
}

index_types.push((arg.index, arg.value.tipo()));
update_args.push(arg_val);
if arg.index > highest_index {
highest_index = arg.index;
}

AirTree::record_update(
index_types,
highest_index,
tipo.clone(),
self.build(spread, module_build_name, &[]),
update_args,
)
index_types.push((arg.index, arg.value.tipo()));
update_args.push(arg_val);
}

AirTree::record_update(
index_types,
highest_index,
tipo.clone(),
self.build(spread, module_build_name, &[]),
update_args,
)
}
TypedExpr::UnOp { value, op, .. } => {
AirTree::unop(*op, self.build(value, module_build_name, &[]))
Expand Down Expand Up @@ -4512,8 +4458,9 @@ impl<'a> CodeGenerator<'a> {
arg_vec.push(arg_stack.pop().unwrap());
}

let tipo = match tipo.as_ref() {
let ret_tipo = match tipo.as_ref() {
Type::Fn { ret, .. } => ret,
// In this case the Air Opcode only holds the return type and not the function type
_ => &tipo,
};

Expand All @@ -4528,11 +4475,11 @@ impl<'a> CodeGenerator<'a> {
}

DefaultFunction::FstPair | DefaultFunction::SndPair => {
builder::undata_builtin(&func, count, tipo, arg_vec)
builder::undata_builtin(&func, count, ret_tipo, arg_vec)
}

DefaultFunction::HeadList if !tipo.is_pair() => {
builder::undata_builtin(&func, count, tipo, arg_vec)
builder::undata_builtin(&func, count, ret_tipo, arg_vec)
}

DefaultFunction::MkCons | DefaultFunction::MkPairData => {
Expand Down
2 changes: 1 addition & 1 deletion crates/aiken-lang/src/gen_uplc/tree.rs
Expand Up @@ -937,7 +937,7 @@ impl AirTree {
}
}

pub fn pair_index(index: u64, tipo: Rc<Type>, tuple: AirTree) -> AirTree {
pub fn pair_index(index: usize, tipo: Rc<Type>, tuple: AirTree) -> AirTree {
AirTree::cast_from_data(
AirTree::builtin(
if index == 0 {
Expand Down
14 changes: 6 additions & 8 deletions crates/aiken-project/src/tests/gen_uplc.rs
Expand Up @@ -2117,7 +2117,7 @@ fn acceptance_test_22_filter_map() {
fn acceptance_test_23_to_list() {
let src = r#"
pub type Map<key, value> =
List<Pair<key, value>>
List<Pair<key, value>>
pub opaque type AssocList<key, value> {
inner: Map<key, value>,
Expand All @@ -2143,11 +2143,11 @@ fn acceptance_test_23_to_list() {
when elems is {
[] ->
[Pair(k, v)]
[Pair { fst: k2, snd: v2 }, ..rest] ->
[Pair(k2, v2), ..rest] ->
if k == k2 {
[Pair(k, v), ..rest]
[Pair(k, v), ..rest]
} else {
[Pair(k2, v2), ..do_insert(rest, k, v)]
[Pair(k2, v2), ..do_insert(rest, k, v)]
}
}
}
Expand All @@ -2159,7 +2159,7 @@ fn acceptance_test_23_to_list() {
}
test to_list_2() {
to_list(fixture_1()) == [Pair("foo", 42), Pair("bar", 14)]
to_list(fixture_1()) == [Pair("foo", 42).2nd, Pair("bar", 14)]
}
"#;

Expand Down Expand Up @@ -2996,8 +2996,6 @@ fn acceptance_test_28_unique_list() {
#[test]
fn acceptance_test_29_union_pair() {
let src = r#"
type Map<a,b> = List<Pair<a,b>>
pub opaque type AssocList<key, value> {
inner: Map<key, value>,
}
Expand Down Expand Up @@ -3054,7 +3052,7 @@ fn acceptance_test_29_union_pair() {
when left is {
[] ->
right
[Pair{fst: k, snd: v}, ..rest] ->
[Pair(k, v), ..rest] ->
do_union(rest, do_insert(right, k, v))
}
}
Expand Down

0 comments on commit d7600b2

Please sign in to comment.