fix: generic edge case with tuples that allowed 2 tuples and 3 tuples to use the same monomorphized function.

Also massively reduced the space taken up by generics in scripts when using generics with list and tuples
This commit is contained in:
microproofs 2024-01-13 16:34:38 -05:00 committed by Kasey
parent f934e87b1d
commit c7af27a6ba
33 changed files with 171 additions and 62 deletions

View File

@ -27,7 +27,7 @@ use crate::{
gen_uplc::builder::{ gen_uplc::builder::{
check_replaceable_opaque_type, convert_opaque_type, erase_opaque_type_operations, check_replaceable_opaque_type, convert_opaque_type, erase_opaque_type_operations,
find_and_replace_generics, find_list_clause_or_default_first, get_arg_type_name, find_and_replace_generics, find_list_clause_or_default_first, get_arg_type_name,
get_generic_id_and_type, get_src_code_by_span, get_variant_name, monomorphize, get_generic_id_and_type, get_generic_variant_name, get_src_code_by_span, monomorphize,
pattern_has_conditions, wrap_as_multi_validator, wrap_validator_condition, CodeGenFunction, pattern_has_conditions, wrap_as_multi_validator, wrap_validator_condition, CodeGenFunction,
SpecificClause, SpecificClause,
}, },
@ -3547,6 +3547,7 @@ impl<'a> CodeGenerator<'a> {
.push((generic_function_key.clone(), "".to_string())); .push((generic_function_key.clone(), "".to_string()));
} }
// Code gen functions are already monomorphized
if let Some(func_variants) = function_usage.get_mut(&generic_function_key) { if let Some(func_variants) = function_usage.get_mut(&generic_function_key) {
let (path, _) = func_variants.get_mut("").unwrap(); let (path, _) = func_variants.get_mut("").unwrap();
*path = path.common_ancestor(tree_path); *path = path.common_ancestor(tree_path);
@ -3606,20 +3607,20 @@ impl<'a> CodeGenerator<'a> {
let mono_types: IndexMap<u64, Rc<Type>> = if !function_def_types.is_empty() { let mono_types: IndexMap<u64, Rc<Type>> = if !function_def_types.is_empty() {
function_def_types function_def_types
.into_iter() .iter()
.zip(function_var_types) .zip(function_var_types.iter())
.flat_map(|(func_tipo, var_tipo)| { .flat_map(|(func_tipo, var_tipo)| {
get_generic_id_and_type(&func_tipo, &var_tipo) get_generic_id_and_type(func_tipo, var_tipo)
}) })
.collect() .collect()
} else { } else {
IndexMap::new() IndexMap::new()
}; };
// Don't sort here. Mono types map is already in argument order.
let variant = mono_types let variant = mono_types
.iter() .iter()
.sorted_by(|(id, _), (id2, _)| id.cmp(id2)) .map(|(_, tipo)| get_generic_variant_name(tipo))
.map(|(_, tipo)| get_variant_name(tipo))
.join(""); .join("");
*variant_name = variant.clone(); *variant_name = variant.clone();

View File

@ -589,7 +589,7 @@ pub fn handle_clause_guard(clause_guard: &TypedClauseGuard) -> AirTree {
} }
} }
pub fn get_variant_name(t: &Rc<Type>) -> String { pub fn get_generic_variant_name(t: &Rc<Type>) -> String {
if t.is_string() { if t.is_string() {
"_string".to_string() "_string".to_string()
} else if t.is_int() { } else if t.is_int() {
@ -605,27 +605,13 @@ pub fn get_variant_name(t: &Rc<Type>) -> String {
} else if t.is_ml_result() { } else if t.is_ml_result() {
"_ml_result".to_string() "_ml_result".to_string()
} else if t.is_map() { } else if t.is_map() {
let mut full_type = vec!["_map".to_string()]; "_map".to_string()
let pair_type = &t.get_inner_types()[0]; } else if t.is_2_tuple() {
let fst_type = &pair_type.get_inner_types()[0]; "_pair".to_string()
let snd_type = &pair_type.get_inner_types()[1];
full_type.push(get_variant_name(fst_type));
full_type.push(get_variant_name(snd_type));
full_type.join("")
} else if t.is_list() { } else if t.is_list() {
let full_type = "_list".to_string(); "_list".to_string()
let list_type = &t.get_inner_types()[0];
format!("{}{}", full_type, get_variant_name(list_type))
} else if t.is_tuple() { } else if t.is_tuple() {
let mut full_type = vec!["_tuple".to_string()]; "_tuple".to_string()
let inner_types = t.get_inner_types();
for arg_type in inner_types {
full_type.push(get_variant_name(&arg_type));
}
full_type.join("")
} else if t.is_unbound() { } else if t.is_unbound() {
"_unbound".to_string() "_unbound".to_string()
} else { } else {

View File

@ -186,15 +186,10 @@ impl Type {
match self { match self {
Self::App { Self::App {
module, name, args, .. module, name, args, ..
} if "List" == name && module.is_empty() => { } if "List" == name && module.is_empty() => args
if let Type::Tuple { elems } = &*args[0] { .first()
elems.len() == 2 .expect("unreachable: List should have an inner type")
} else if let Type::Var { tipo } = &*args[0] { .is_2_tuple(),
matches!(tipo.borrow().get_uplc_type(), Some(UplcType::Pair(_, _)))
} else {
false
}
}
Self::Var { tipo } => tipo.borrow().is_map(), Self::Var { tipo } => tipo.borrow().is_map(),
_ => false, _ => false,
} }
@ -322,6 +317,12 @@ impl Type {
Self::Var { tipo } => tipo.borrow().get_uplc_type().unwrap(), Self::Var { tipo } => tipo.borrow().get_uplc_type().unwrap(),
_ => unreachable!(), _ => unreachable!(),
} }
} else if self.is_bls381_12_g1() {
UplcType::Bls12_381G1Element
} else if self.is_bls381_12_g2() {
UplcType::Bls12_381G2Element
} else if self.is_ml_result() {
UplcType::Bls12_381MlResult
} else { } else {
UplcType::Data UplcType::Data
} }

View File

@ -13,4 +13,4 @@ requirements = []
source = "github" source = "github"
[etags] [etags]
"aiken-lang/stdlib@main" = [{ secs_since_epoch = 1704340543, nanos_since_epoch = 17966000 }, "cf946239d3dd481ed41f20e56bf24910b5229ea35aa171a708edc2a47fc20a7b"] "aiken-lang/stdlib@main" = [{ secs_since_epoch = 1705181051, nanos_since_epoch = 270212000 }, "cf946239d3dd481ed41f20e56bf24910b5229ea35aa171a708edc2a47fc20a7b"]

View File

@ -5,7 +5,7 @@
"plutusVersion": "v2", "plutusVersion": "v2",
"compiler": { "compiler": {
"name": "Aiken", "name": "Aiken",
"version": "v1.0.21-alpha+631757e" "version": "v1.0.21-alpha+0161cf6"
} }
}, },
"validators": [ "validators": [

View File

@ -5,7 +5,7 @@
"plutusVersion": "v2", "plutusVersion": "v2",
"compiler": { "compiler": {
"name": "Aiken", "name": "Aiken",
"version": "v1.0.21-alpha+631757e" "version": "v1.0.21-alpha+0161cf6"
} }
}, },
"validators": [ "validators": [

View File

@ -13,4 +13,4 @@ requirements = []
source = "github" source = "github"
[etags] [etags]
"aiken-lang/stdlib@main" = [{ secs_since_epoch = 1704340540, nanos_since_epoch = 434572000 }, "cf946239d3dd481ed41f20e56bf24910b5229ea35aa171a708edc2a47fc20a7b"] "aiken-lang/stdlib@main" = [{ secs_since_epoch = 1705181048, nanos_since_epoch = 152219000 }, "cf946239d3dd481ed41f20e56bf24910b5229ea35aa171a708edc2a47fc20a7b"]

View File

@ -13,4 +13,4 @@ requirements = []
source = "github" source = "github"
[etags] [etags]
"aiken-lang/stdlib@main" = [{ secs_since_epoch = 1704340543, nanos_since_epoch = 225382000 }, "cf946239d3dd481ed41f20e56bf24910b5229ea35aa171a708edc2a47fc20a7b"] "aiken-lang/stdlib@main" = [{ secs_since_epoch = 1705181051, nanos_since_epoch = 995566000 }, "cf946239d3dd481ed41f20e56bf24910b5229ea35aa171a708edc2a47fc20a7b"]

View File

@ -13,4 +13,4 @@ requirements = []
source = "github" source = "github"
[etags] [etags]
"aiken-lang/stdlib@main" = [{ secs_since_epoch = 1704340554, nanos_since_epoch = 369598000 }, "cf946239d3dd481ed41f20e56bf24910b5229ea35aa171a708edc2a47fc20a7b"] "aiken-lang/stdlib@main" = [{ secs_since_epoch = 1705181064, nanos_since_epoch = 69739000 }, "cf946239d3dd481ed41f20e56bf24910b5229ea35aa171a708edc2a47fc20a7b"]

View File

@ -13,4 +13,4 @@ requirements = []
source = "github" source = "github"
[etags] [etags]
"aiken-lang/stdlib@main" = [{ secs_since_epoch = 1704340543, nanos_since_epoch = 584877000 }, "cf946239d3dd481ed41f20e56bf24910b5229ea35aa171a708edc2a47fc20a7b"] "aiken-lang/stdlib@main" = [{ secs_since_epoch = 1705181052, nanos_since_epoch = 418642000 }, "cf946239d3dd481ed41f20e56bf24910b5229ea35aa171a708edc2a47fc20a7b"]

View File

@ -13,4 +13,4 @@ requirements = []
source = "github" source = "github"
[etags] [etags]
"aiken-lang/stdlib@main" = [{ secs_since_epoch = 1704340557, nanos_since_epoch = 10227000 }, "cf946239d3dd481ed41f20e56bf24910b5229ea35aa171a708edc2a47fc20a7b"] "aiken-lang/stdlib@main" = [{ secs_since_epoch = 1705181066, nanos_since_epoch = 607926000 }, "cf946239d3dd481ed41f20e56bf24910b5229ea35aa171a708edc2a47fc20a7b"]

View File

@ -13,4 +13,4 @@ requirements = []
source = "github" source = "github"
[etags] [etags]
"aiken-lang/stdlib@main" = [{ secs_since_epoch = 1704340555, nanos_since_epoch = 229103000 }, "cf946239d3dd481ed41f20e56bf24910b5229ea35aa171a708edc2a47fc20a7b"] "aiken-lang/stdlib@main" = [{ secs_since_epoch = 1705181064, nanos_since_epoch = 977089000 }, "cf946239d3dd481ed41f20e56bf24910b5229ea35aa171a708edc2a47fc20a7b"]

View File

@ -0,0 +1,16 @@
# 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"
[etags]
"aiken-lang/stdlib@main" = [{ secs_since_epoch = 1705179899, nanos_since_epoch = 505049000 }, "cf946239d3dd481ed41f20e56bf24910b5229ea35aa171a708edc2a47fc20a7b"]

View File

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

View File

@ -0,0 +1,97 @@
pub fn generic_wrap(x: a) -> Option<a> {
Some(x)
}
pub fn generic_in_list(x: a) -> List<a> {
[x]
}
test multiple_wraps() {
let a = 1
let b = ""
let c =
[0]
let d =
[""]
let e =
[]
let f = (1, "")
let g = ("", 1)
let h = (1, 2, "")
let i = None
let j = Some("")
let k =
[(1, "")]
let l =
[(2, 3, "")]
and {
generic_wrap(a) == Some(a),
generic_wrap(b) == Some(b),
generic_wrap(c) == Some(c),
generic_wrap(d) == Some(d),
generic_wrap(e) == Some(e),
generic_wrap(f) == Some(f),
generic_wrap(g) == Some(g),
generic_wrap(h) == Some(h),
generic_wrap(i) == Some(i),
generic_wrap(j) == Some(j),
generic_wrap(k) == Some(k),
generic_wrap(l) == Some(l),
}
}
test multiple_in_list() {
let a = 1
let b = ""
let c =
[0]
let d =
[""]
let e =
[]
let f = (1, "")
let g = ("", 1)
let h = (1, 2, "")
let i = None
let j = Some("")
let k =
[(1, "")]
let l =
[(2, 3, "")]
and {
generic_in_list(a) == [a],
generic_in_list(b) == [b],
generic_in_list(c) == [c],
generic_in_list(d) == [d],
generic_in_list(e) == [e],
generic_in_list(f) == [f],
generic_in_list(g) == [g],
generic_in_list(h) == [h],
generic_in_list(i) == [i],
generic_in_list(j) == [j],
generic_in_list(k) == [k],
generic_in_list(l) == [l],
}
}
test edge_case_wrap() {
let a = (1, (1, 1, 1))
let b = (1, (1, 1), 1)
and {
generic_wrap(a) == Some(a),
generic_wrap(b) == Some(b),
}
}
test edge_case_in_list() {
let a = (1, (1, 1, 1))
let b = (1, (1, 1), 1)
and {
generic_in_list(a) == [a],
generic_in_list(b) == [b],
}
}

View File

@ -13,4 +13,4 @@ requirements = []
source = "github" source = "github"
[etags] [etags]
"aiken-lang/stdlib@main" = [{ secs_since_epoch = 1704340537, nanos_since_epoch = 228257000 }, "cf946239d3dd481ed41f20e56bf24910b5229ea35aa171a708edc2a47fc20a7b"] "aiken-lang/stdlib@main" = [{ secs_since_epoch = 1705181045, nanos_since_epoch = 255817000 }, "cf946239d3dd481ed41f20e56bf24910b5229ea35aa171a708edc2a47fc20a7b"]

View File

@ -5,7 +5,7 @@
"plutusVersion": "v2", "plutusVersion": "v2",
"compiler": { "compiler": {
"name": "Aiken", "name": "Aiken",
"version": "v1.0.21-alpha+631757e" "version": "v1.0.21-alpha+0161cf6"
} }
}, },
"validators": [ "validators": [

View File

@ -13,4 +13,4 @@ requirements = []
source = "github" source = "github"
[etags] [etags]
"aiken-lang/stdlib@main" = [{ secs_since_epoch = 1704340550, nanos_since_epoch = 584623000 }, "cf946239d3dd481ed41f20e56bf24910b5229ea35aa171a708edc2a47fc20a7b"] "aiken-lang/stdlib@main" = [{ secs_since_epoch = 1705181059, nanos_since_epoch = 86246000 }, "cf946239d3dd481ed41f20e56bf24910b5229ea35aa171a708edc2a47fc20a7b"]

View File

@ -13,4 +13,4 @@ requirements = []
source = "github" source = "github"
[etags] [etags]
"aiken-lang/stdlib@main" = [{ secs_since_epoch = 1704340547, nanos_since_epoch = 394912000 }, "cf946239d3dd481ed41f20e56bf24910b5229ea35aa171a708edc2a47fc20a7b"] "aiken-lang/stdlib@main" = [{ secs_since_epoch = 1705181056, nanos_since_epoch = 151986000 }, "cf946239d3dd481ed41f20e56bf24910b5229ea35aa171a708edc2a47fc20a7b"]

View File

@ -13,4 +13,4 @@ requirements = []
source = "github" source = "github"
[etags] [etags]
"aiken-lang/stdlib@main" = [{ secs_since_epoch = 1704340535, nanos_since_epoch = 549750000 }, "cf946239d3dd481ed41f20e56bf24910b5229ea35aa171a708edc2a47fc20a7b"] "aiken-lang/stdlib@main" = [{ secs_since_epoch = 1705181044, nanos_since_epoch = 445717000 }, "cf946239d3dd481ed41f20e56bf24910b5229ea35aa171a708edc2a47fc20a7b"]

View File

@ -5,7 +5,7 @@
"plutusVersion": "v2", "plutusVersion": "v2",
"compiler": { "compiler": {
"name": "Aiken", "name": "Aiken",
"version": "v1.0.21-alpha+631757e" "version": "v1.0.21-alpha+0161cf6"
} }
}, },
"validators": [ "validators": [

View File

@ -5,7 +5,7 @@
"plutusVersion": "v2", "plutusVersion": "v2",
"compiler": { "compiler": {
"name": "Aiken", "name": "Aiken",
"version": "v1.0.21-alpha+631757e" "version": "v1.0.21-alpha+0161cf6"
} }
}, },
"validators": [ "validators": [

View File

@ -13,4 +13,4 @@ requirements = []
source = "github" source = "github"
[etags] [etags]
"aiken-lang/stdlib@main" = [{ secs_since_epoch = 1704340537, nanos_since_epoch = 243457000 }, "cf946239d3dd481ed41f20e56bf24910b5229ea35aa171a708edc2a47fc20a7b"] "aiken-lang/stdlib@main" = [{ secs_since_epoch = 1705181045, nanos_since_epoch = 361146000 }, "cf946239d3dd481ed41f20e56bf24910b5229ea35aa171a708edc2a47fc20a7b"]

View File

@ -13,4 +13,4 @@ requirements = []
source = "github" source = "github"
[etags] [etags]
"aiken-lang/stdlib@main" = [{ secs_since_epoch = 1704340535, nanos_since_epoch = 540401000 }, "cf946239d3dd481ed41f20e56bf24910b5229ea35aa171a708edc2a47fc20a7b"] "aiken-lang/stdlib@main" = [{ secs_since_epoch = 1705181044, nanos_since_epoch = 445541000 }, "cf946239d3dd481ed41f20e56bf24910b5229ea35aa171a708edc2a47fc20a7b"]

View File

@ -13,4 +13,4 @@ requirements = []
source = "github" source = "github"
[etags] [etags]
"aiken-lang/stdlib@main" = [{ secs_since_epoch = 1704340536, nanos_since_epoch = 374601000 }, "cf946239d3dd481ed41f20e56bf24910b5229ea35aa171a708edc2a47fc20a7b"] "aiken-lang/stdlib@main" = [{ secs_since_epoch = 1705181045, nanos_since_epoch = 301366000 }, "cf946239d3dd481ed41f20e56bf24910b5229ea35aa171a708edc2a47fc20a7b"]

View File

@ -13,4 +13,4 @@ requirements = []
source = "github" source = "github"
[etags] [etags]
"aiken-lang/stdlib@main" = [{ secs_since_epoch = 1704340537, nanos_since_epoch = 11039000 }, "cf946239d3dd481ed41f20e56bf24910b5229ea35aa171a708edc2a47fc20a7b"] "aiken-lang/stdlib@main" = [{ secs_since_epoch = 1705181045, nanos_since_epoch = 320068000 }, "cf946239d3dd481ed41f20e56bf24910b5229ea35aa171a708edc2a47fc20a7b"]

View File

@ -13,4 +13,4 @@ requirements = []
source = "github" source = "github"
[etags] [etags]
"aiken-lang/stdlib@main" = [{ secs_since_epoch = 1704340550, nanos_since_epoch = 288401000 }, "cf946239d3dd481ed41f20e56bf24910b5229ea35aa171a708edc2a47fc20a7b"] "aiken-lang/stdlib@main" = [{ secs_since_epoch = 1705181059, nanos_since_epoch = 76573000 }, "cf946239d3dd481ed41f20e56bf24910b5229ea35aa171a708edc2a47fc20a7b"]

View File

@ -5,7 +5,7 @@
"plutusVersion": "v2", "plutusVersion": "v2",
"compiler": { "compiler": {
"name": "Aiken", "name": "Aiken",
"version": "v1.0.21-alpha+631757e" "version": "v1.0.21-alpha+0161cf6"
} }
}, },
"validators": [ "validators": [

View File

@ -13,4 +13,4 @@ requirements = []
source = "github" source = "github"
[etags] [etags]
"aiken-lang/stdlib@main" = [{ secs_since_epoch = 1704340546, nanos_since_epoch = 592776000 }, "cf946239d3dd481ed41f20e56bf24910b5229ea35aa171a708edc2a47fc20a7b"] "aiken-lang/stdlib@main" = [{ secs_since_epoch = 1705181055, nanos_since_epoch = 546831000 }, "cf946239d3dd481ed41f20e56bf24910b5229ea35aa171a708edc2a47fc20a7b"]

View File

@ -13,4 +13,4 @@ requirements = []
source = "github" source = "github"
[etags] [etags]
"aiken-lang/stdlib@main" = [{ secs_since_epoch = 1704340551, nanos_since_epoch = 543964000 }, "cf946239d3dd481ed41f20e56bf24910b5229ea35aa171a708edc2a47fc20a7b"] "aiken-lang/stdlib@main" = [{ secs_since_epoch = 1705181060, nanos_since_epoch = 328311000 }, "cf946239d3dd481ed41f20e56bf24910b5229ea35aa171a708edc2a47fc20a7b"]

View File

@ -13,4 +13,4 @@ requirements = []
source = "github" source = "github"
[etags] [etags]
"aiken-lang/stdlib@main" = [{ secs_since_epoch = 1704340546, nanos_since_epoch = 51186000 }, "cf946239d3dd481ed41f20e56bf24910b5229ea35aa171a708edc2a47fc20a7b"] "aiken-lang/stdlib@main" = [{ secs_since_epoch = 1705181054, nanos_since_epoch = 373675000 }, "cf946239d3dd481ed41f20e56bf24910b5229ea35aa171a708edc2a47fc20a7b"]

View File

@ -13,4 +13,4 @@ requirements = []
source = "github" source = "github"
[etags] [etags]
"aiken-lang/stdlib@main" = [{ secs_since_epoch = 1704341807, nanos_since_epoch = 247364000 }, "cf946239d3dd481ed41f20e56bf24910b5229ea35aa171a708edc2a47fc20a7b"] "aiken-lang/stdlib@main" = [{ secs_since_epoch = 1705181303, nanos_since_epoch = 777227000 }, "cf946239d3dd481ed41f20e56bf24910b5229ea35aa171a708edc2a47fc20a7b"]

View File

@ -5,7 +5,7 @@
"plutusVersion": "v2", "plutusVersion": "v2",
"compiler": { "compiler": {
"name": "Aiken", "name": "Aiken",
"version": "v1.0.21-alpha+631757e" "version": "v1.0.21-alpha+0161cf6"
} }
}, },
"validators": [ "validators": [