optmization fix
This commit is contained in:
parent
5aecb96668
commit
f5c7d222aa
|
@ -2,9 +2,10 @@ use std::rc::Rc;
|
||||||
|
|
||||||
use indexmap::IndexMap;
|
use indexmap::IndexMap;
|
||||||
use itertools::Itertools;
|
use itertools::Itertools;
|
||||||
|
use pallas_primitives::babbage::{BigInt, PlutusData};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
ast::{Name, Program, Term},
|
ast::{Constant, Data, Name, Program, Term, Type},
|
||||||
builtins::DefaultFunction,
|
builtins::DefaultFunction,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -324,12 +325,11 @@ fn wrap_data_reduce(term: &mut Term<Name>) {
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
|
|
||||||
let Term::Apply { function: inner_func, argument: inner_arg } = Rc::make_mut(argument)
|
if let Term::Apply {
|
||||||
else {
|
function: inner_func,
|
||||||
wrap_data_reduce(Rc::make_mut(argument));
|
argument: inner_arg,
|
||||||
return;
|
} = Rc::make_mut(argument)
|
||||||
};
|
{
|
||||||
|
|
||||||
let Term::Builtin(second_action) = inner_func.as_ref()
|
let Term::Builtin(second_action) = inner_func.as_ref()
|
||||||
else {
|
else {
|
||||||
wrap_data_reduce(Rc::make_mut(argument));
|
wrap_data_reduce(Rc::make_mut(argument));
|
||||||
|
@ -352,6 +352,78 @@ fn wrap_data_reduce(term: &mut Term<Name>) {
|
||||||
wrap_data_reduce(Rc::make_mut(argument));
|
wrap_data_reduce(Rc::make_mut(argument));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else if let Term::Constant(c) = Rc::make_mut(argument) {
|
||||||
|
match (first_action, Rc::make_mut(c)) {
|
||||||
|
(
|
||||||
|
DefaultFunction::UnIData,
|
||||||
|
Constant::Data(PlutusData::BigInt(BigInt::Int(i))),
|
||||||
|
) => {
|
||||||
|
*term = Term::integer(i128::from(*i).into());
|
||||||
|
}
|
||||||
|
(DefaultFunction::IData, Constant::Integer(i)) => {
|
||||||
|
*term = Term::data(Data::integer(i.clone()));
|
||||||
|
}
|
||||||
|
(DefaultFunction::UnBData, Constant::Data(PlutusData::BoundedBytes(b))) => {
|
||||||
|
*term = Term::byte_string(b.clone().into());
|
||||||
|
}
|
||||||
|
(DefaultFunction::BData, Constant::ByteString(b)) => {
|
||||||
|
*term = Term::data(Data::bytestring(b.clone()));
|
||||||
|
}
|
||||||
|
(DefaultFunction::UnListData, Constant::Data(PlutusData::Array(l))) => {
|
||||||
|
*term = Term::list_values(
|
||||||
|
l.iter()
|
||||||
|
.map(|item| Constant::Data(item.clone()))
|
||||||
|
.collect_vec(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
(DefaultFunction::ListData, Constant::ProtoList(_, l)) => {
|
||||||
|
*term = Term::data(Data::list(
|
||||||
|
l.iter()
|
||||||
|
.map(|item| match item {
|
||||||
|
Constant::Data(d) => d.clone(),
|
||||||
|
_ => unreachable!(),
|
||||||
|
})
|
||||||
|
.collect_vec(),
|
||||||
|
));
|
||||||
|
}
|
||||||
|
(DefaultFunction::MapData, Constant::ProtoList(_, m)) => {
|
||||||
|
*term = Term::data(Data::map(
|
||||||
|
m.iter()
|
||||||
|
.map(|m| match m {
|
||||||
|
Constant::ProtoPair(_, _, f, s) => {
|
||||||
|
match (f.as_ref(), s.as_ref()) {
|
||||||
|
(Constant::Data(d), Constant::Data(d2)) => {
|
||||||
|
(d.clone(), d2.clone())
|
||||||
|
}
|
||||||
|
_ => unreachable!(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_ => unreachable!(),
|
||||||
|
})
|
||||||
|
.collect_vec(),
|
||||||
|
));
|
||||||
|
}
|
||||||
|
(DefaultFunction::UnMapData, Constant::Data(PlutusData::Map(m))) => {
|
||||||
|
*term = Term::map_values(
|
||||||
|
m.iter()
|
||||||
|
.map(|item| {
|
||||||
|
Constant::ProtoPair(
|
||||||
|
Type::Data,
|
||||||
|
Type::Data,
|
||||||
|
Constant::Data(item.0.clone()).into(),
|
||||||
|
Constant::Data(item.1.clone()).into(),
|
||||||
|
)
|
||||||
|
})
|
||||||
|
.collect_vec(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
_ => {
|
||||||
|
wrap_data_reduce(Rc::make_mut(argument));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
wrap_data_reduce(Rc::make_mut(argument));
|
||||||
|
};
|
||||||
}
|
}
|
||||||
Term::Force(f) => {
|
Term::Force(f) => {
|
||||||
wrap_data_reduce(Rc::make_mut(f));
|
wrap_data_reduce(Rc::make_mut(f));
|
||||||
|
|
Loading…
Reference in New Issue