From 48e74e58742767f10de986baaa9080e831715277 Mon Sep 17 00:00:00 2001 From: debris Date: Wed, 13 Jan 2016 22:16:24 +0100 Subject: [PATCH] vm ext ret function used u256 instead of u64 --- src/evm/ext.rs | 2 +- src/evm/jit.rs | 2 +- src/evm/tests.rs | 2 +- src/executive.rs | 14 +++++++------- src/tests/executive.rs | 2 +- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/evm/ext.rs b/src/evm/ext.rs index 631d4ed03..7a11412a9 100644 --- a/src/evm/ext.rs +++ b/src/evm/ext.rs @@ -48,7 +48,7 @@ pub trait Ext { /// Should be called when transaction calls `RETURN` opcode. /// Returns gas_left if cost of returning the data is not too high. - fn ret(&mut self, gas: u64, data: &[u8]) -> Result; + fn ret(&mut self, gas: &U256, data: &[u8]) -> Result; /// Should be called when contract commits suicide. /// Address to which funds should be refunded. diff --git a/src/evm/jit.rs b/src/evm/jit.rs index 062eb88d1..cf7280f70 100644 --- a/src/evm/jit.rs +++ b/src/evm/jit.rs @@ -345,7 +345,7 @@ impl evm::Evm for JitEvm { match res { evmjit::ReturnCode::Stop => Ok(U256::from(context.gas_left())), - evmjit::ReturnCode::Return => ext.ret(context.gas_left(), context.output_data()).map(|gas_left| U256::from(gas_left)), + evmjit::ReturnCode::Return => ext.ret(&U256::from(context.gas_left()), context.output_data()), evmjit::ReturnCode::Suicide => { ext.suicide(&Address::from_jit(&context.suicide_refund_address())); Ok(U256::from(context.gas_left())) diff --git a/src/evm/tests.rs b/src/evm/tests.rs index caaa2fa9c..4a50fcdba 100644 --- a/src/evm/tests.rs +++ b/src/evm/tests.rs @@ -68,7 +68,7 @@ impl Ext for FakeExt { }); } - fn ret(&mut self, _gas: u64, _data: &[u8]) -> result::Result { + fn ret(&mut self, _gas: &U256, _data: &[u8]) -> result::Result { unimplemented!(); } diff --git a/src/executive.rs b/src/executive.rs index a0ef89427..da21e35a7 100644 --- a/src/executive.rs +++ b/src/executive.rs @@ -422,26 +422,26 @@ impl<'a> Ext for Externalities<'a> { self.state.code(address).unwrap_or(vec![]) } - fn ret(&mut self, gas: u64, data: &[u8]) -> Result { + fn ret(&mut self, gas: &U256, data: &[u8]) -> Result { match &mut self.output { &mut OutputPolicy::Return(BytesRef::Fixed(ref mut slice)) => unsafe { let len = cmp::min(slice.len(), data.len()); ptr::copy(data.as_ptr(), slice.as_mut_ptr(), len); - Ok(gas) + Ok(*gas) }, &mut OutputPolicy::Return(BytesRef::Flexible(ref mut vec)) => unsafe { vec.clear(); vec.reserve(data.len()); ptr::copy(data.as_ptr(), vec.as_mut_ptr(), data.len()); vec.set_len(data.len()); - Ok(gas) + Ok(*gas) }, &mut OutputPolicy::InitContract => { - let return_cost = data.len() as u64 * self.schedule.create_data_gas as u64; - if return_cost > gas { + let return_cost = U256::from(data.len()) * U256::from(self.schedule.create_data_gas); + if return_cost > *gas { return match self.schedule.exceptional_failed_code_deposit { true => Err(evm::Error::OutOfGas), - false => Ok(gas) + false => Ok(*gas) } } let mut code = vec![]; @@ -453,7 +453,7 @@ impl<'a> Ext for Externalities<'a> { let address = &self.params.address; self.state.init_code(address, code); self.substate.contracts_created.push(address.clone()); - Ok(gas - return_cost) + Ok(*gas - return_cost) } } } diff --git a/src/tests/executive.rs b/src/tests/executive.rs index c8b916b72..5c47939c0 100644 --- a/src/tests/executive.rs +++ b/src/tests/executive.rs @@ -135,7 +135,7 @@ impl<'a> Ext for TestExt<'a> { self.ext.log(topics, data) } - fn ret(&mut self, gas: u64, data: &[u8]) -> Result { + fn ret(&mut self, gas: &U256, data: &[u8]) -> Result { self.ext.ret(gas, data) }