runtime_data, tests in progress
This commit is contained in:
parent
c695e09bba
commit
000d8fe8d0
@ -271,12 +271,12 @@ pub mod ffi {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern fn env_sha3(begin: *const u8, size: *const u64, out_hash: *mut JitI256) {
|
pub unsafe extern fn env_sha3(begin: *const u8, size: u64, out_hash: *mut JitI256) {
|
||||||
// TODO: write tests
|
// TODO: write tests
|
||||||
// it may be incorrect due to endianess
|
// it may be incorrect due to endianess
|
||||||
// if it is, don't use `from_raw_parts`
|
// if it is, don't use `from_raw_parts`
|
||||||
let out_hash = &mut *out_hash;
|
let out_hash = &mut *out_hash;
|
||||||
let input = slice::from_raw_parts(begin, *size as usize);
|
let input = slice::from_raw_parts(begin, size as usize);
|
||||||
let outlen = out_hash.words.len() * 8;
|
let outlen = out_hash.words.len() * 8;
|
||||||
let output = slice::from_raw_parts_mut(out_hash.words.as_mut_ptr() as *mut u8, outlen);
|
let output = slice::from_raw_parts_mut(out_hash.words.as_mut_ptr() as *mut u8, outlen);
|
||||||
let mut sha3 = Keccak::new_sha3_256();
|
let mut sha3 = Keccak::new_sha3_256();
|
||||||
|
@ -3,6 +3,7 @@ use evmjit;
|
|||||||
use util::hash::*;
|
use util::hash::*;
|
||||||
use util::uint::*;
|
use util::uint::*;
|
||||||
use util::bytes::*;
|
use util::bytes::*;
|
||||||
|
use util::sha3::*;
|
||||||
use evm;
|
use evm;
|
||||||
|
|
||||||
/// Should be used to convert jit types to ethcore
|
/// Should be used to convert jit types to ethcore
|
||||||
@ -56,6 +57,37 @@ impl IntoJit<evmjit::I256> for H256 {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl IntoJit<evmjit::I256> for Address {
|
||||||
|
fn into_jit(self) -> evmjit::I256 {
|
||||||
|
H256::from(self).into_jit()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl IntoJit<evmjit::RuntimeDataHandle> for evm::RuntimeData {
|
||||||
|
fn into_jit(self) -> evmjit::RuntimeDataHandle {
|
||||||
|
let mut data = evmjit::RuntimeDataHandle::new();
|
||||||
|
data.gas = self.gas as i64;
|
||||||
|
data.gas_price = self.gas_price as i64;
|
||||||
|
data.call_data = self.call_data.as_ptr();
|
||||||
|
data.call_data_size = self.call_data.len() as u64;
|
||||||
|
mem::forget(self.call_data);
|
||||||
|
data.address = self.address.into_jit();
|
||||||
|
data.caller = self.caller.into_jit();
|
||||||
|
data.origin = self.origin.into_jit();
|
||||||
|
data.call_value = self.call_value.into_jit();
|
||||||
|
data.coinbase = self.coinbase.into_jit();
|
||||||
|
data.difficulty = self.difficulty.into_jit();
|
||||||
|
data.gas_limit = self.gas_limit.into_jit();
|
||||||
|
data.number = self.number;
|
||||||
|
data.timestamp = self.timestamp as i64;
|
||||||
|
data.code = self.code.as_ptr();
|
||||||
|
data.code_size = self.code.len() as u64;
|
||||||
|
data.code_hash = self.code.sha3().into_jit();
|
||||||
|
mem::forget(self.code);
|
||||||
|
data
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub struct EnvAdapter {
|
pub struct EnvAdapter {
|
||||||
env: evm::Env
|
env: evm::Env
|
||||||
}
|
}
|
||||||
@ -158,9 +190,10 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_env_adapter() {
|
fn test_env_adapter() {
|
||||||
let data = RuntimeDataHandle::new();
|
let mut data = RuntimeData::new();
|
||||||
|
data.code = vec![0x60, 0x00, 0x60, 0x00, 0x20, 0x60, 0x00, 0x55];
|
||||||
let env = EnvAdapter::new();
|
let env = EnvAdapter::new();
|
||||||
let mut context = ContextHandle::new(data, EnvHandle::new(env));
|
let mut context = ContextHandle::new(data.into_jit(), EnvHandle::new(env));
|
||||||
assert_eq!(context.exec(), ReturnCode::Stop);
|
assert_eq!(context.exec(), ReturnCode::Stop);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8,13 +8,13 @@ pub struct RuntimeData {
|
|||||||
pub address: Address,
|
pub address: Address,
|
||||||
pub caller: Address,
|
pub caller: Address,
|
||||||
pub origin: Address,
|
pub origin: Address,
|
||||||
|
pub call_value: U256,
|
||||||
pub coinbase: Address,
|
pub coinbase: Address,
|
||||||
pub difficulty: U256,
|
pub difficulty: U256,
|
||||||
pub gas_limit: U256,
|
pub gas_limit: U256,
|
||||||
pub number: u64,
|
pub number: u64,
|
||||||
pub timestamp: u64,
|
pub timestamp: u64,
|
||||||
pub code: Vec<u8>,
|
pub code: Vec<u8>
|
||||||
pub code_hash: H256
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl RuntimeData {
|
impl RuntimeData {
|
||||||
@ -26,13 +26,13 @@ impl RuntimeData {
|
|||||||
address: Address::new(),
|
address: Address::new(),
|
||||||
caller: Address::new(),
|
caller: Address::new(),
|
||||||
origin: Address::new(),
|
origin: Address::new(),
|
||||||
|
call_value: U256::from(0),
|
||||||
coinbase: Address::new(),
|
coinbase: Address::new(),
|
||||||
difficulty: U256::from(0),
|
difficulty: U256::from(0),
|
||||||
gas_limit: U256::from(0),
|
gas_limit: U256::from(0),
|
||||||
number: 0,
|
number: 0,
|
||||||
timestamp: 0,
|
timestamp: 0,
|
||||||
code: vec![],
|
code: vec![]
|
||||||
code_hash: H256::new()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user