runtime_data, tests in progress
This commit is contained in:
parent
c695e09bba
commit
000d8fe8d0
@ -271,12 +271,12 @@ pub mod ffi {
|
||||
}
|
||||
|
||||
#[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
|
||||
// it may be incorrect due to endianess
|
||||
// if it is, don't use `from_raw_parts`
|
||||
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 output = slice::from_raw_parts_mut(out_hash.words.as_mut_ptr() as *mut u8, outlen);
|
||||
let mut sha3 = Keccak::new_sha3_256();
|
||||
|
@ -3,6 +3,7 @@ use evmjit;
|
||||
use util::hash::*;
|
||||
use util::uint::*;
|
||||
use util::bytes::*;
|
||||
use util::sha3::*;
|
||||
use evm;
|
||||
|
||||
/// 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 {
|
||||
env: evm::Env
|
||||
}
|
||||
@ -158,9 +190,10 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
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 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);
|
||||
}
|
||||
|
||||
|
@ -8,13 +8,13 @@ pub struct RuntimeData {
|
||||
pub address: Address,
|
||||
pub caller: Address,
|
||||
pub origin: Address,
|
||||
pub call_value: U256,
|
||||
pub coinbase: Address,
|
||||
pub difficulty: U256,
|
||||
pub gas_limit: U256,
|
||||
pub number: u64,
|
||||
pub timestamp: u64,
|
||||
pub code: Vec<u8>,
|
||||
pub code_hash: H256
|
||||
pub code: Vec<u8>
|
||||
}
|
||||
|
||||
impl RuntimeData {
|
||||
@ -26,13 +26,13 @@ impl RuntimeData {
|
||||
address: Address::new(),
|
||||
caller: Address::new(),
|
||||
origin: Address::new(),
|
||||
call_value: U256::from(0),
|
||||
coinbase: Address::new(),
|
||||
difficulty: U256::from(0),
|
||||
gas_limit: U256::from(0),
|
||||
number: 0,
|
||||
timestamp: 0,
|
||||
code: vec![],
|
||||
code_hash: H256::new()
|
||||
code: vec![]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user