add more runtime checking for a few of the data to primitive conversions

This commit is contained in:
microproofs 2024-03-06 14:41:37 -05:00 committed by Kasey
parent 4c97240900
commit 892da06e14
1 changed files with 79 additions and 18 deletions

View File

@ -1175,26 +1175,51 @@ pub fn convert_data_to_type(term: Term<Name>, field_type: &Type) -> Term<Name> {
} else if field_type.is_void() { } else if field_type.is_void() {
Term::equals_integer() Term::equals_integer()
.apply(Term::integer(0.into())) .apply(Term::integer(0.into()))
.apply(Term::fst_pair().apply(Term::unconstr_data().apply(term))) .apply(Term::fst_pair().apply(Term::var("__pair__")))
.delayed_if_then_else(Term::unit(), Term::Error) .delayed_if_then_else(
Term::snd_pair()
.apply(Term::var("__pair__").delayed_choose_list(Term::unit(), Term::Error)),
Term::Error,
)
.lambda("__pair__")
.apply(Term::unconstr_data().apply(term))
} else if field_type.is_map() { } else if field_type.is_map() {
Term::unmap_data().apply(term) Term::unmap_data().apply(term)
} else if field_type.is_string() { } else if field_type.is_string() {
Term::Builtin(DefaultFunction::DecodeUtf8).apply(Term::un_b_data().apply(term)) Term::Builtin(DefaultFunction::DecodeUtf8).apply(Term::un_b_data().apply(term))
} else if field_type.is_tuple() && matches!(field_type.get_uplc_type(), UplcType::Pair(_, _)) { } else if field_type.is_tuple() && matches!(field_type.get_uplc_type(), UplcType::Pair(_, _)) {
Term::tail_list()
.apply(Term::tail_list().apply(Term::var("__list_data")))
.delayed_choose_list(
Term::mk_pair_data() Term::mk_pair_data()
.apply(Term::head_list().apply(Term::var("__list_data"))) .apply(Term::head_list().apply(Term::var("__list_data")))
.apply(Term::head_list().apply(Term::var("__tail"))) .apply(
.lambda("__tail") Term::head_list().apply(Term::tail_list().apply(Term::var("__list_data"))),
.apply(Term::tail_list().apply(Term::var("__list_data"))) ),
Term::Error,
)
.lambda("__list_data") .lambda("__list_data")
.apply(Term::unlist_data().apply(term)) .apply(Term::unlist_data().apply(term))
} else if field_type.is_list() || field_type.is_tuple() { } else if field_type.is_list() || field_type.is_tuple() {
Term::unlist_data().apply(term) Term::unlist_data().apply(term)
} else if field_type.is_bool() { } else if field_type.is_bool() {
Term::snd_pair()
.apply(Term::var("__pair__"))
.delayed_choose_list(
Term::equals_integer() Term::equals_integer()
.apply(Term::integer(1.into())) .apply(Term::integer(1.into()))
.apply(Term::fst_pair().apply(Term::unconstr_data().apply(term))) .apply(Term::fst_pair().apply(Term::var("__pair__")))
.delayed_if_then_else(
Term::bool(true),
Term::equals_integer()
.apply(Term::integer(0.into()))
.apply(Term::fst_pair().apply(Term::var("__pair__")))
.delayed_if_then_else(Term::bool(false), Term::Error),
),
Term::Error,
)
.lambda("__pair__")
.apply(Term::unconstr_data().apply(term))
} else if field_type.is_bls381_12_g1() { } else if field_type.is_bls381_12_g1() {
Term::bls12_381_g1_uncompress().apply(Term::un_b_data().apply(term)) Term::bls12_381_g1_uncompress().apply(Term::un_b_data().apply(term))
} else if field_type.is_bls381_12_g2() { } else if field_type.is_bls381_12_g2() {
@ -1239,7 +1264,14 @@ pub fn convert_data_to_type_debug(
Term::equals_integer() Term::equals_integer()
.apply(Term::integer(0.into())) .apply(Term::integer(0.into()))
.apply(Term::fst_pair().apply(Term::unconstr_data().apply(Term::var("__val")))) .apply(Term::fst_pair().apply(Term::unconstr_data().apply(Term::var("__val"))))
.delayed_if_then_else(Term::unit(), error_term.clone()), .delayed_if_then_else(
Term::snd_pair().apply(
Term::unconstr_data()
.apply(Term::var("__val"))
.delayed_choose_list(Term::unit(), error_term.clone()),
),
error_term.clone(),
),
error_term.clone(), error_term.clone(),
error_term.clone(), error_term.clone(),
error_term.clone(), error_term.clone(),
@ -1275,11 +1307,26 @@ pub fn convert_data_to_type_debug(
.delayed_choose_data( .delayed_choose_data(
error_term.clone(), error_term.clone(),
error_term.clone(), error_term.clone(),
Term::var("__list_data")
.delayed_choose_list(
error_term.clone(),
Term::var("__tail")
.delayed_choose_list(
error_term.clone(),
Term::tail_list()
.apply(Term::var("__tail"))
.delayed_choose_list(
Term::mk_pair_data() Term::mk_pair_data()
.apply(Term::head_list().apply(Term::var("__list_data"))) .apply(
.apply(Term::head_list().apply(Term::var("__tail"))) Term::head_list().apply(Term::var("__list_data")),
)
.apply(Term::head_list().apply(Term::var("__tail"))),
error_term.clone(),
),
)
.lambda("__tail") .lambda("__tail")
.apply(Term::tail_list().apply(Term::var("__list_data"))) .apply(Term::tail_list().apply(Term::var("__list_data"))),
)
.lambda("__list_data") .lambda("__list_data")
.apply(Term::unlist_data().apply(Term::var("__val"))), .apply(Term::unlist_data().apply(Term::var("__val"))),
error_term.clone(), error_term.clone(),
@ -1301,9 +1348,23 @@ pub fn convert_data_to_type_debug(
} else if field_type.is_bool() { } else if field_type.is_bool() {
Term::var("__val") Term::var("__val")
.delayed_choose_data( .delayed_choose_data(
Term::snd_pair()
.apply(Term::var("__pair__"))
.delayed_choose_list(
Term::equals_integer() Term::equals_integer()
.apply(Term::integer(1.into())) .apply(Term::integer(1.into()))
.apply(Term::fst_pair().apply(Term::unconstr_data().apply(Term::var("__val")))), .apply(Term::fst_pair().apply(Term::var("__pair__")))
.delayed_if_then_else(
Term::bool(true),
Term::equals_integer()
.apply(Term::integer(0.into()))
.apply(Term::fst_pair().apply(Term::var("__pair__")))
.delayed_if_then_else(Term::bool(false), error_term.clone()),
),
error_term.clone(),
)
.lambda("__pair__")
.apply(Term::unconstr_data().apply(Term::var("__val"))),
error_term.clone(), error_term.clone(),
error_term.clone(), error_term.clone(),
error_term.clone(), error_term.clone(),