Merge branch 'integer-to-bytearray-cost-fix'
This commit is contained in:
commit
b04bb40532
|
@ -320,7 +320,7 @@ impl Machine {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn eval_builtin_app(&mut self, runtime: BuiltinRuntime) -> Result<Value, Error> {
|
fn eval_builtin_app(&mut self, runtime: BuiltinRuntime) -> Result<Value, Error> {
|
||||||
let cost = runtime.to_ex_budget(&self.costs.builtin_costs);
|
let cost = runtime.to_ex_budget(&self.costs.builtin_costs)?;
|
||||||
|
|
||||||
self.spend_budget(cost)?;
|
self.spend_budget(cost)?;
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
use super::Value;
|
use super::{runtime, Error, Value};
|
||||||
use crate::builtins::DefaultFunction;
|
use crate::builtins::DefaultFunction;
|
||||||
|
use num_bigint::BigInt;
|
||||||
|
use num_traits::Signed;
|
||||||
use pallas_primitives::conway::Language;
|
use pallas_primitives::conway::Language;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
|
||||||
|
@ -1741,8 +1743,8 @@ impl Default for BuiltinCosts {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl BuiltinCosts {
|
impl BuiltinCosts {
|
||||||
pub fn to_ex_budget(&self, fun: DefaultFunction, args: &[Value]) -> ExBudget {
|
pub fn to_ex_budget(&self, fun: DefaultFunction, args: &[Value]) -> Result<ExBudget, Error> {
|
||||||
match fun {
|
Ok(match fun {
|
||||||
DefaultFunction::AddInteger => ExBudget {
|
DefaultFunction::AddInteger => ExBudget {
|
||||||
mem: self
|
mem: self
|
||||||
.add_integer
|
.add_integer
|
||||||
|
@ -2307,18 +2309,37 @@ impl BuiltinCosts {
|
||||||
.cpu
|
.cpu
|
||||||
.cost(args[0].to_ex_mem(), args[1].to_ex_mem()),
|
.cost(args[0].to_ex_mem(), args[1].to_ex_mem()),
|
||||||
},
|
},
|
||||||
DefaultFunction::IntegerToByteString => ExBudget {
|
DefaultFunction::IntegerToByteString => {
|
||||||
|
let size = args[1].unwrap_integer()?;
|
||||||
|
|
||||||
|
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(
|
||||||
|
size.clone(),
|
||||||
|
runtime::INTEGER_TO_BYTE_STRING_MAXIMUM_OUTPUT_LENGTH,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
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(
|
mem: self.integer_to_byte_string.mem.cost(
|
||||||
args[0].to_ex_mem(),
|
args[0].to_ex_mem(),
|
||||||
args[1].to_ex_mem(),
|
arg1_exmem,
|
||||||
args[2].to_ex_mem(),
|
args[2].to_ex_mem(),
|
||||||
),
|
),
|
||||||
cpu: self.integer_to_byte_string.cpu.cost(
|
cpu: self.integer_to_byte_string.cpu.cost(
|
||||||
args[0].to_ex_mem(),
|
args[0].to_ex_mem(),
|
||||||
args[1].to_ex_mem(),
|
arg1_exmem,
|
||||||
args[2].to_ex_mem(),
|
args[2].to_ex_mem(),
|
||||||
),
|
),
|
||||||
},
|
}
|
||||||
|
}
|
||||||
DefaultFunction::ByteStringToInteger => ExBudget {
|
DefaultFunction::ByteStringToInteger => ExBudget {
|
||||||
mem: self
|
mem: self
|
||||||
.byte_string_to_integer
|
.byte_string_to_integer
|
||||||
|
@ -2329,7 +2350,7 @@ impl BuiltinCosts {
|
||||||
.cpu
|
.cpu
|
||||||
.cost(args[0].to_ex_mem(), args[1].to_ex_mem()),
|
.cost(args[0].to_ex_mem(), args[1].to_ex_mem()),
|
||||||
},
|
},
|
||||||
}
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -31,13 +31,7 @@ const BLST_P1_COMPRESSED_SIZE: usize = 48;
|
||||||
|
|
||||||
const BLST_P2_COMPRESSED_SIZE: usize = 96;
|
const BLST_P2_COMPRESSED_SIZE: usize = 96;
|
||||||
|
|
||||||
const INTEGER_TO_BYTE_STRING_MAXIMUM_OUTPUT_LENGTH: i64 = 8192;
|
pub const INTEGER_TO_BYTE_STRING_MAXIMUM_OUTPUT_LENGTH: i64 = 8192;
|
||||||
|
|
||||||
//#[derive(std::cmp::PartialEq)]
|
|
||||||
//pub enum EvalMode {
|
|
||||||
// Immediate,
|
|
||||||
// Deferred,
|
|
||||||
//}
|
|
||||||
|
|
||||||
pub enum BuiltinSemantics {
|
pub enum BuiltinSemantics {
|
||||||
V1,
|
V1,
|
||||||
|
@ -96,7 +90,7 @@ impl BuiltinRuntime {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn to_ex_budget(&self, costs: &BuiltinCosts) -> ExBudget {
|
pub fn to_ex_budget(&self, costs: &BuiltinCosts) -> Result<ExBudget, Error> {
|
||||||
costs.to_ex_budget(self.fun, &self.args)
|
costs.to_ex_budget(self.fun, &self.args)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1384,16 +1378,12 @@ impl DefaultFunction {
|
||||||
let size = args[1].unwrap_integer()?;
|
let size = args[1].unwrap_integer()?;
|
||||||
let input = args[2].unwrap_integer()?;
|
let input = args[2].unwrap_integer()?;
|
||||||
|
|
||||||
if size.is_negative() {
|
// NOTE:
|
||||||
return Err(Error::IntegerToByteStringNegativeSize(size.clone()));
|
// We ought to also check for negative size and too large sizes. These checks
|
||||||
}
|
// however happens prior to calling the builtin as part of the costing step. So by
|
||||||
|
// the time we reach this builtin call, the size can be assumed to be
|
||||||
if size > &INTEGER_TO_BYTE_STRING_MAXIMUM_OUTPUT_LENGTH.into() {
|
//
|
||||||
return Err(Error::IntegerToByteStringSizeTooBig(
|
// >= 0 && < INTEGER_TO_BYTE_STRING_MAXIMUM_OUTPUT_LENGTH
|
||||||
size.clone(),
|
|
||||||
INTEGER_TO_BYTE_STRING_MAXIMUM_OUTPUT_LENGTH,
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
if size.is_zero()
|
if size.is_zero()
|
||||||
&& integer_log2(input.clone())
|
&& integer_log2(input.clone())
|
||||||
|
|
|
@ -1,2 +1,2 @@
|
||||||
({cpu: 1434707
|
({cpu: 1434707
|
||||||
| mem: 801})
|
| mem: 802})
|
||||||
|
|
|
@ -1,2 +1,2 @@
|
||||||
({cpu: 96871400
|
({cpu: 96871400
|
||||||
| mem: 801})
|
| mem: 1824})
|
||||||
|
|
|
@ -1,2 +1,2 @@
|
||||||
({cpu: 1434707
|
({cpu: 1434707
|
||||||
| mem: 801})
|
| mem: 1824})
|
||||||
|
|
|
@ -1,2 +1,2 @@
|
||||||
({cpu: 1434707
|
({cpu: 1434707
|
||||||
| mem: 801})
|
| mem: 802})
|
||||||
|
|
|
@ -1,2 +1,2 @@
|
||||||
({cpu: 96871400
|
({cpu: 96871400
|
||||||
| mem: 801})
|
| mem: 1824})
|
||||||
|
|
|
@ -1,2 +1,2 @@
|
||||||
({cpu: 1434707
|
({cpu: 1434707
|
||||||
| mem: 801})
|
| mem: 802})
|
||||||
|
|
|
@ -1,2 +1,2 @@
|
||||||
({cpu: 96871400
|
({cpu: 96871400
|
||||||
| mem: 801})
|
| mem: 1824})
|
||||||
|
|
|
@ -1,2 +1,2 @@
|
||||||
({cpu: 1434707
|
({cpu: 1434707
|
||||||
| mem: 801})
|
| mem: 1824})
|
||||||
|
|
|
@ -1,2 +1,2 @@
|
||||||
({cpu: 1434707
|
({cpu: 1434707
|
||||||
| mem: 801})
|
| mem: 802})
|
||||||
|
|
|
@ -1,2 +1,2 @@
|
||||||
({cpu: 96871400
|
({cpu: 96871400
|
||||||
| mem: 801})
|
| mem: 1824})
|
||||||
|
|
Loading…
Reference in New Issue