From c34344ce21cbe135d43229c249c92337a3bf38b5 Mon Sep 17 00:00:00 2001 From: Kasey White Date: Fri, 26 Aug 2022 03:01:24 -0400 Subject: [PATCH] add a few additional data builtins --- crates/uplc/src/machine/cost_model.rs | 27 ++++++++++++-- crates/uplc/src/machine/runtime.rs | 52 ++++++++++++++++++++------- 2 files changed, 63 insertions(+), 16 deletions(-) diff --git a/crates/uplc/src/machine/cost_model.rs b/crates/uplc/src/machine/cost_model.rs index 03e12753..f81e1f45 100644 --- a/crates/uplc/src/machine/cost_model.rs +++ b/crates/uplc/src/machine/cost_model.rs @@ -837,14 +837,35 @@ impl BuiltinCosts { mem: self.un_list_data.mem.cost(args[0].to_ex_mem()), cpu: self.un_list_data.cpu.cost(args[0].to_ex_mem()), }, - DefaultFunction::UnIData => todo!(), + DefaultFunction::UnIData => ExBudget { + mem: self.un_i_data.mem.cost(args[0].to_ex_mem()), + cpu: self.un_i_data.cpu.cost(args[0].to_ex_mem()), + }, DefaultFunction::UnBData => ExBudget { mem: self.un_b_data.mem.cost(args[0].to_ex_mem()), cpu: self.un_b_data.cpu.cost(args[0].to_ex_mem()), }, - DefaultFunction::EqualsData => todo!(), + DefaultFunction::EqualsData => ExBudget { + mem: self + .equals_data + .mem + .cost(args[0].to_ex_mem(), args[1].to_ex_mem()), + cpu: self + .equals_data + .cpu + .cost(args[0].to_ex_mem(), args[1].to_ex_mem()), + }, DefaultFunction::SerialiseData => todo!(), - DefaultFunction::MkPairData => todo!(), + DefaultFunction::MkPairData => ExBudget { + mem: self + .mk_pair_data + .mem + .cost(args[0].to_ex_mem(), args[1].to_ex_mem()), + cpu: self + .mk_pair_data + .cpu + .cost(args[0].to_ex_mem(), args[1].to_ex_mem()), + }, DefaultFunction::MkNilData => todo!(), DefaultFunction::MkNilPairData => todo!(), } diff --git a/crates/uplc/src/machine/runtime.rs b/crates/uplc/src/machine/runtime.rs index c828b025..440dc3ec 100644 --- a/crates/uplc/src/machine/runtime.rs +++ b/crates/uplc/src/machine/runtime.rs @@ -1,6 +1,6 @@ use std::ops::Deref; -use pallas_primitives::babbage::PlutusData; +use pallas_primitives::babbage::{BigInt, PlutusData}; use crate::{ ast::{Constant, Type}, @@ -123,11 +123,11 @@ impl DefaultFunction { DefaultFunction::UnConstrData => 1, DefaultFunction::UnMapData => 1, DefaultFunction::UnListData => 1, - DefaultFunction::UnIData => todo!(), + DefaultFunction::UnIData => 1, DefaultFunction::UnBData => 1, - DefaultFunction::EqualsData => todo!(), + DefaultFunction::EqualsData => 2, DefaultFunction::SerialiseData => todo!(), - DefaultFunction::MkPairData => todo!(), + DefaultFunction::MkPairData => 2, DefaultFunction::MkNilData => todo!(), DefaultFunction::MkNilPairData => todo!(), } @@ -182,11 +182,11 @@ impl DefaultFunction { DefaultFunction::UnConstrData => 0, DefaultFunction::UnMapData => 0, DefaultFunction::UnListData => 0, - DefaultFunction::UnIData => todo!(), + DefaultFunction::UnIData => 0, DefaultFunction::UnBData => 0, - DefaultFunction::EqualsData => todo!(), + DefaultFunction::EqualsData => 0, DefaultFunction::SerialiseData => todo!(), - DefaultFunction::MkPairData => todo!(), + DefaultFunction::MkPairData => 0, DefaultFunction::MkNilData => todo!(), DefaultFunction::MkNilPairData => todo!(), } @@ -285,11 +285,11 @@ impl DefaultFunction { DefaultFunction::UnConstrData => arg.expect_type(Type::Data), DefaultFunction::UnMapData => arg.expect_type(Type::Data), DefaultFunction::UnListData => arg.expect_type(Type::Data), - DefaultFunction::UnIData => todo!(), + DefaultFunction::UnIData => arg.expect_type(Type::Data), DefaultFunction::UnBData => arg.expect_type(Type::Data), - DefaultFunction::EqualsData => todo!(), + DefaultFunction::EqualsData => arg.expect_type(Type::Data), DefaultFunction::SerialiseData => todo!(), - DefaultFunction::MkPairData => todo!(), + DefaultFunction::MkPairData => arg.expect_type(Type::Data), DefaultFunction::MkNilData => todo!(), DefaultFunction::MkNilPairData => todo!(), } @@ -680,16 +680,42 @@ impl DefaultFunction { } _ => unreachable!(), }, - DefaultFunction::UnIData => todo!(), + DefaultFunction::UnIData => match &args[0] { + Value::Con(Constant::Data(PlutusData::BigInt(b))) => { + if let BigInt::Int(i) = b { + let x: i64 = (*i).try_into().unwrap(); + + Ok(Value::Con(Constant::Integer(x as isize))) + } else { + unreachable!() + } + } + _ => unreachable!(), + }, DefaultFunction::UnBData => match &args[0] { Value::Con(Constant::Data(PlutusData::BoundedBytes(b))) => { Ok(Value::Con(Constant::ByteString(b.to_vec()))) } _ => unreachable!(), }, - DefaultFunction::EqualsData => todo!(), + DefaultFunction::EqualsData => match (&args[0], &args[1]) { + (Value::Con(Constant::Data(d1)), Value::Con(Constant::Data(d2))) => { + Ok(Value::Con(Constant::Bool(d1.eq(d2)))) + } + _ => unreachable!(), + }, DefaultFunction::SerialiseData => todo!(), - DefaultFunction::MkPairData => todo!(), + DefaultFunction::MkPairData => match (&args[0], &args[1]) { + (Value::Con(Constant::Data(d1)), Value::Con(Constant::Data(d2))) => { + Ok(Value::Con(Constant::ProtoPair( + Type::Data, + Type::Data, + Box::new(Constant::Data(d1.clone())), + Box::new(Constant::Data(d2.clone())), + ))) + } + _ => unreachable!(), + }, DefaultFunction::MkNilData => todo!(), DefaultFunction::MkNilPairData => todo!(), }