validator params are now converted to type from data

This commit is contained in:
Kasey White 2022-12-29 15:26:28 -05:00 committed by Lucas
parent d5d878e83c
commit 306fa891a0
2 changed files with 39 additions and 13 deletions

View File

@ -7,7 +7,7 @@ use std::{
use indexmap::IndexMap; use indexmap::IndexMap;
use itertools::Itertools; use itertools::Itertools;
use uplc::{ use uplc::{
ast::{Constant as UplcConstant, Name, Term, Type as UplcType}, ast::{builder::apply_wrap, Constant as UplcConstant, Name, Term, Type as UplcType},
builtins::DefaultFunction, builtins::DefaultFunction,
machine::runtime::convert_constr_to_tag, machine::runtime::convert_constr_to_tag,
BigInt, Constr, KeyValuePairs, PlutusData, BigInt, Constr, KeyValuePairs, PlutusData,
@ -15,7 +15,7 @@ use uplc::{
use crate::{ use crate::{
air::Air, air::Air,
ast::{Clause, Constant, Pattern, Span}, ast::{Clause, Constant, Pattern, Span, TypedArg},
expr::TypedExpr, expr::TypedExpr,
tipo::{PatternConstructor, Type, TypeVar, ValueConstructorVariant}, tipo::{PatternConstructor, Type, TypeVar, ValueConstructorVariant},
}; };
@ -1051,6 +1051,39 @@ pub fn convert_constants_to_data(constants: Vec<UplcConstant>) -> Vec<UplcConsta
new_constants new_constants
} }
pub fn wrap_validator_args(term: Term<Name>, arguments: Vec<TypedArg>) -> Term<Name> {
let mut term = term;
for arg in arguments.iter().rev() {
if !matches!(arg.tipo.get_uplc_type(), UplcType::Data) {
term = apply_wrap(
Term::Lambda {
parameter_name: Name {
text: arg.arg_name.get_variable_name().unwrap_or("_").to_string(),
unique: 0.into(),
},
body: term.into(),
},
convert_data_to_type(
Term::Var(Name {
text: arg.arg_name.get_variable_name().unwrap_or("_").to_string(),
unique: 0.into(),
}),
&arg.tipo,
),
);
}
term = Term::Lambda {
parameter_name: Name {
text: arg.arg_name.get_variable_name().unwrap_or("_").to_string(),
unique: 0.into(),
},
body: term.into(),
}
}
term
}
pub fn monomorphize( pub fn monomorphize(
ir: Vec<Air>, ir: Vec<Air>,
generic_types: HashMap<u64, Arc<Type>>, generic_types: HashMap<u64, Arc<Type>>,

View File

@ -30,7 +30,8 @@ use crate::{
check_when_pattern_needs, constants_ir, convert_constants_to_data, convert_data_to_type, check_when_pattern_needs, constants_ir, convert_constants_to_data, convert_data_to_type,
convert_type_to_data, get_common_ancestor, get_generics_and_type, get_variant_name, convert_type_to_data, get_common_ancestor, get_generics_and_type, get_variant_name,
handle_func_deps_ir, list_access_to_uplc, match_ir_for_recursion, monomorphize, handle_func_deps_ir, list_access_to_uplc, match_ir_for_recursion, monomorphize,
rearrange_clauses, ClauseProperties, DataTypeKey, FuncComponents, FunctionAccessKey, rearrange_clauses, wrap_validator_args, ClauseProperties, DataTypeKey, FuncComponents,
FunctionAccessKey,
}, },
expr::TypedExpr, expr::TypedExpr,
tipo::{ tipo::{
@ -104,15 +105,7 @@ impl<'a> CodeGenerator<'a> {
term term
}; };
for arg in arguments.iter().rev() { term = wrap_validator_args(term, arguments);
term = Term::Lambda {
parameter_name: uplc::ast::Name {
text: arg.arg_name.get_variable_name().unwrap_or("_").to_string(),
unique: 0.into(),
},
body: term.into(),
}
}
let mut program = Program { let mut program = Program {
version: (1, 0, 0), version: (1, 0, 0),
@ -3921,7 +3914,7 @@ impl<'a> CodeGenerator<'a> {
let term = Term::Apply { let term = Term::Apply {
function: Term::Apply { function: Term::Apply {
function: Term::Builtin(DefaultFunction::Trace).force_wrap().into(), function: Term::Builtin(DefaultFunction::Trace).force_wrap().into(),
argument: Term::Constant(uplc::ast::Constant::String( argument: Term::Constant(UplcConstant::String(
label.unwrap_or_else(|| "aiken::todo".to_string()), label.unwrap_or_else(|| "aiken::todo".to_string()),
)) ))
.into(), .into(),