diff --git a/crates/uplc/src/machine/cost_model.rs b/crates/uplc/src/machine/cost_model.rs index 9eb8124d..033d421a 100644 --- a/crates/uplc/src/machine/cost_model.rs +++ b/crates/uplc/src/machine/cost_model.rs @@ -1,6 +1,7 @@ use super::{runtime, Error, Value}; use crate::builtins::DefaultFunction; use num_bigint::BigInt; +use num_traits::Signed; use pallas_primitives::conway::Language; use std::collections::HashMap; @@ -2309,26 +2310,32 @@ impl BuiltinCosts { .cost(args[0].to_ex_mem(), args[1].to_ex_mem()), }, DefaultFunction::IntegerToByteString => { - let uplc_int = args[1].unwrap_integer()?; + let size = args[1].unwrap_integer()?; - if uplc_int > &BigInt::from(runtime::INTEGER_TO_BYTE_STRING_MAXIMUM_OUTPUT_LENGTH) { + if size.is_negative() { + return Err(Error::IntegerToByteStringNegativeSize(size.clone())); + } + + if size > &BigInt::from(runtime::INTEGER_TO_BYTE_STRING_MAXIMUM_OUTPUT_LENGTH) { return Err(Error::IntegerToByteStringSizeTooBig( - uplc_int.clone(), + size.clone(), runtime::INTEGER_TO_BYTE_STRING_MAXIMUM_OUTPUT_LENGTH, )); } - let arg1 = u64::try_from(uplc_int).unwrap().try_into().unwrap(); + let arg1: i64 = u64::try_from(size).unwrap().try_into().unwrap(); + + let arg1_exmem = if arg1 == 0 { 0 } else { ((arg1 - 1) / 8) + 1 }; ExBudget { mem: self.integer_to_byte_string.mem.cost( args[0].to_ex_mem(), - arg1, + arg1_exmem, args[2].to_ex_mem(), ), cpu: self.integer_to_byte_string.cpu.cost( args[0].to_ex_mem(), - arg1, + arg1_exmem, args[2].to_ex_mem(), ), } diff --git a/crates/uplc/src/machine/runtime.rs b/crates/uplc/src/machine/runtime.rs index 25387f12..bb4f44c4 100644 --- a/crates/uplc/src/machine/runtime.rs +++ b/crates/uplc/src/machine/runtime.rs @@ -1384,11 +1384,11 @@ impl DefaultFunction { let size = args[1].unwrap_integer()?; let input = args[2].unwrap_integer()?; - if size.is_negative() { - return Err(Error::IntegerToByteStringNegativeSize(size.clone())); - } - // Since this is checked at cost time it is no longer needed + // if size.is_negative() { + // return Err(Error::IntegerToByteStringNegativeSize(size.clone())); + // } + // if size > &INTEGER_TO_BYTE_STRING_MAXIMUM_OUTPUT_LENGTH.into() { // return Err(Error::IntegerToByteStringSizeTooBig( // size.clone(), diff --git a/crates/uplc/test_data/conformance/v3/builtin/semantics/integerToByteString/big-endian/bounded/correct-output-extra-width/correct-output-extra-width.uplc.budget.expected b/crates/uplc/test_data/conformance/v3/builtin/semantics/integerToByteString/big-endian/bounded/correct-output-extra-width/correct-output-extra-width.uplc.budget.expected index ce3a2a71..5e03de21 100644 --- a/crates/uplc/test_data/conformance/v3/builtin/semantics/integerToByteString/big-endian/bounded/correct-output-extra-width/correct-output-extra-width.uplc.budget.expected +++ b/crates/uplc/test_data/conformance/v3/builtin/semantics/integerToByteString/big-endian/bounded/correct-output-extra-width/correct-output-extra-width.uplc.budget.expected @@ -1,2 +1,2 @@ ({cpu: 1434707 -| mem: 801}) +| mem: 802}) diff --git a/crates/uplc/test_data/conformance/v3/builtin/semantics/integerToByteString/big-endian/bounded/max-input-fits-max-width/max-input-fits-max-width.uplc.budget.expected b/crates/uplc/test_data/conformance/v3/builtin/semantics/integerToByteString/big-endian/bounded/max-input-fits-max-width/max-input-fits-max-width.uplc.budget.expected index ef373193..288d460e 100644 --- a/crates/uplc/test_data/conformance/v3/builtin/semantics/integerToByteString/big-endian/bounded/max-input-fits-max-width/max-input-fits-max-width.uplc.budget.expected +++ b/crates/uplc/test_data/conformance/v3/builtin/semantics/integerToByteString/big-endian/bounded/max-input-fits-max-width/max-input-fits-max-width.uplc.budget.expected @@ -1,2 +1,2 @@ ({cpu: 96871400 -| mem: 801}) +| mem: 1824}) diff --git a/crates/uplc/test_data/conformance/v3/builtin/semantics/integerToByteString/big-endian/bounded/maximum-width-zero/maximum-width-zero.uplc.budget.expected b/crates/uplc/test_data/conformance/v3/builtin/semantics/integerToByteString/big-endian/bounded/maximum-width-zero/maximum-width-zero.uplc.budget.expected index ce3a2a71..e05af8ae 100644 --- a/crates/uplc/test_data/conformance/v3/builtin/semantics/integerToByteString/big-endian/bounded/maximum-width-zero/maximum-width-zero.uplc.budget.expected +++ b/crates/uplc/test_data/conformance/v3/builtin/semantics/integerToByteString/big-endian/bounded/maximum-width-zero/maximum-width-zero.uplc.budget.expected @@ -1,2 +1,2 @@ ({cpu: 1434707 -| mem: 801}) +| mem: 1824}) diff --git a/crates/uplc/test_data/conformance/v3/builtin/semantics/integerToByteString/big-endian/bounded/zero/zero.uplc.budget.expected b/crates/uplc/test_data/conformance/v3/builtin/semantics/integerToByteString/big-endian/bounded/zero/zero.uplc.budget.expected index ce3a2a71..5e03de21 100644 --- a/crates/uplc/test_data/conformance/v3/builtin/semantics/integerToByteString/big-endian/bounded/zero/zero.uplc.budget.expected +++ b/crates/uplc/test_data/conformance/v3/builtin/semantics/integerToByteString/big-endian/bounded/zero/zero.uplc.budget.expected @@ -1,2 +1,2 @@ ({cpu: 1434707 -| mem: 801}) +| mem: 802}) diff --git a/crates/uplc/test_data/conformance/v3/builtin/semantics/integerToByteString/big-endian/unbounded/maximum-input/maximum-input.uplc.budget.expected b/crates/uplc/test_data/conformance/v3/builtin/semantics/integerToByteString/big-endian/unbounded/maximum-input/maximum-input.uplc.budget.expected index ef373193..288d460e 100644 --- a/crates/uplc/test_data/conformance/v3/builtin/semantics/integerToByteString/big-endian/unbounded/maximum-input/maximum-input.uplc.budget.expected +++ b/crates/uplc/test_data/conformance/v3/builtin/semantics/integerToByteString/big-endian/unbounded/maximum-input/maximum-input.uplc.budget.expected @@ -1,2 +1,2 @@ ({cpu: 96871400 -| mem: 801}) +| mem: 1824}) diff --git a/crates/uplc/test_data/conformance/v3/builtin/semantics/integerToByteString/little-endian/bounded/correct-output-extra-width/correct-output-extra-width.uplc.budget.expected b/crates/uplc/test_data/conformance/v3/builtin/semantics/integerToByteString/little-endian/bounded/correct-output-extra-width/correct-output-extra-width.uplc.budget.expected index ce3a2a71..5e03de21 100644 --- a/crates/uplc/test_data/conformance/v3/builtin/semantics/integerToByteString/little-endian/bounded/correct-output-extra-width/correct-output-extra-width.uplc.budget.expected +++ b/crates/uplc/test_data/conformance/v3/builtin/semantics/integerToByteString/little-endian/bounded/correct-output-extra-width/correct-output-extra-width.uplc.budget.expected @@ -1,2 +1,2 @@ ({cpu: 1434707 -| mem: 801}) +| mem: 802}) diff --git a/crates/uplc/test_data/conformance/v3/builtin/semantics/integerToByteString/little-endian/bounded/max-input-fits-max-width/max-input-fits-max-width.uplc.budget.expected b/crates/uplc/test_data/conformance/v3/builtin/semantics/integerToByteString/little-endian/bounded/max-input-fits-max-width/max-input-fits-max-width.uplc.budget.expected index ef373193..288d460e 100644 --- a/crates/uplc/test_data/conformance/v3/builtin/semantics/integerToByteString/little-endian/bounded/max-input-fits-max-width/max-input-fits-max-width.uplc.budget.expected +++ b/crates/uplc/test_data/conformance/v3/builtin/semantics/integerToByteString/little-endian/bounded/max-input-fits-max-width/max-input-fits-max-width.uplc.budget.expected @@ -1,2 +1,2 @@ ({cpu: 96871400 -| mem: 801}) +| mem: 1824}) diff --git a/crates/uplc/test_data/conformance/v3/builtin/semantics/integerToByteString/little-endian/bounded/maximum-width-zero/maximum-width-zero.uplc.budget.expected b/crates/uplc/test_data/conformance/v3/builtin/semantics/integerToByteString/little-endian/bounded/maximum-width-zero/maximum-width-zero.uplc.budget.expected index ce3a2a71..e05af8ae 100644 --- a/crates/uplc/test_data/conformance/v3/builtin/semantics/integerToByteString/little-endian/bounded/maximum-width-zero/maximum-width-zero.uplc.budget.expected +++ b/crates/uplc/test_data/conformance/v3/builtin/semantics/integerToByteString/little-endian/bounded/maximum-width-zero/maximum-width-zero.uplc.budget.expected @@ -1,2 +1,2 @@ ({cpu: 1434707 -| mem: 801}) +| mem: 1824}) diff --git a/crates/uplc/test_data/conformance/v3/builtin/semantics/integerToByteString/little-endian/bounded/zero/zero.uplc.budget.expected b/crates/uplc/test_data/conformance/v3/builtin/semantics/integerToByteString/little-endian/bounded/zero/zero.uplc.budget.expected index ce3a2a71..5e03de21 100644 --- a/crates/uplc/test_data/conformance/v3/builtin/semantics/integerToByteString/little-endian/bounded/zero/zero.uplc.budget.expected +++ b/crates/uplc/test_data/conformance/v3/builtin/semantics/integerToByteString/little-endian/bounded/zero/zero.uplc.budget.expected @@ -1,2 +1,2 @@ ({cpu: 1434707 -| mem: 801}) +| mem: 802}) diff --git a/crates/uplc/test_data/conformance/v3/builtin/semantics/integerToByteString/little-endian/unbounded/maximum-input/maximum-input.uplc.budget.expected b/crates/uplc/test_data/conformance/v3/builtin/semantics/integerToByteString/little-endian/unbounded/maximum-input/maximum-input.uplc.budget.expected index ef373193..288d460e 100644 --- a/crates/uplc/test_data/conformance/v3/builtin/semantics/integerToByteString/little-endian/unbounded/maximum-input/maximum-input.uplc.budget.expected +++ b/crates/uplc/test_data/conformance/v3/builtin/semantics/integerToByteString/little-endian/unbounded/maximum-input/maximum-input.uplc.budget.expected @@ -1,2 +1,2 @@ ({cpu: 96871400 -| mem: 801}) +| mem: 1824})