refactor in progress... evmjit compiling

This commit is contained in:
debris 2016-01-11 03:13:41 +01:00
parent 6d3097ac9e
commit 88409e7dbb
4 changed files with 36 additions and 55 deletions

View File

@ -5,7 +5,7 @@ use evm::{EvmParams, Ext};
/// Evm errors. /// Evm errors.
pub enum EvmError { pub enum EvmError {
/// Returned when transaction execution run out of gas. /// `OutOfGas` is returned when transaction execution runs out of gas.
/// The state should be reverted to the state from before the /// The state should be reverted to the state from before the
/// transaction execution. But it does not mean that transaction /// transaction execution. But it does not mean that transaction
/// was invalid. Balance still should be transfered and nonce /// was invalid. Balance still should be transfered and nonce

View File

@ -503,20 +503,6 @@ mod tests {
use null_engine::*; use null_engine::*;
use std::ops::*; use std::ops::*;
struct TestEngine;
impl TestEngine {
fn new() -> Self {
TestEngine
}
}
impl Engine for TestEngine {
fn name(&self) -> &str { "TestEngine" }
fn spec(&self) -> &Spec { unimplemented!() }
fn evm_schedule(&self, _env_info: &EnvInfo) -> EvmSchedule { EvmSchedule::new_frontier() }
}
#[test] #[test]
fn test_contract_address() { fn test_contract_address() {
let address = Address::from_str("0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6").unwrap(); let address = Address::from_str("0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6").unwrap();
@ -538,12 +524,12 @@ mod tests {
let mut state = State::new_temp(); let mut state = State::new_temp();
state.add_balance(&sender, &U256::from(0x100u64)); state.add_balance(&sender, &U256::from(0x100u64));
let info = EnvInfo::new(); let info = EnvInfo::new();
let engine = TestEngine::new(); let engine = NullEngine::new_boxed(ethereum::new_frontier());
let mut substate = Substate::new(); let mut substate = Substate::new();
{ {
let mut ex = Executive::new(&mut state, &info, &engine); let mut ex = Executive::new(&mut state, &info, engine.deref());
assert_eq!(Executive::create(&mut ex, &params, &mut substate), ExecutionResult::Ok); let _res = ex.create(&params, &mut substate);
} }
assert_eq!(state.storage_at(&address, &H256::new()), H256::from(&U256::from(0xf9u64))); assert_eq!(state.storage_at(&address, &H256::new()), H256::from(&U256::from(0xf9u64)));
@ -565,12 +551,12 @@ mod tests {
let mut state = State::new_temp(); let mut state = State::new_temp();
state.add_balance(&sender, &U256::from(0x100u64)); state.add_balance(&sender, &U256::from(0x100u64));
let info = EnvInfo::new(); let info = EnvInfo::new();
let engine = TestEngine::new(); let engine = NullEngine::new_boxed(ethereum::new_frontier());
let mut substate = Substate::new(); let mut substate = Substate::new();
{ {
let mut ex = Executive::new(&mut state, &info, &engine); let mut ex = Executive::new(&mut state, &info, engine.deref());
assert_eq!(Executive::create(&mut ex, &params, &mut substate), ExecutionResult::Ok); let _res = ex.create(&params, &mut substate);
} }
assert_eq!(state.storage_at(&address, &H256::new()), H256::from(next_address.clone())); assert_eq!(state.storage_at(&address, &H256::new()), H256::from(next_address.clone()));
@ -612,13 +598,12 @@ mod tests {
let mut state = State::new_temp(); let mut state = State::new_temp();
state.init_code(&address, code.clone()); state.init_code(&address, code.clone());
let info = EnvInfo::new(); let info = EnvInfo::new();
//let engine = TestEngine::new();
let engine = NullEngine::new_boxed(ethereum::new_frontier()); let engine = NullEngine::new_boxed(ethereum::new_frontier());
let mut substate = Substate::new(); let mut substate = Substate::new();
{ {
let mut ex = Executive::new(&mut state, &info, engine.deref()); let mut ex = Executive::new(&mut state, &info, engine.deref());
assert_eq!(Executive::call(&mut ex, &params, &mut substate), ExecutionResult::Ok); let _res = ex.call(&params, &mut substate, &mut []);
} }
assert!(false); assert!(false);

View File

@ -210,8 +210,8 @@ impl<'a> evmjit::Ext for ExtAdapter<'a> {
address: *mut evmjit::H256) { address: *mut evmjit::H256) {
unsafe { unsafe {
match self.ext.create(*io_gas, &U256::from_jit(&*endowment), slice::from_raw_parts(init_beg, init_size as usize)) { match self.ext.create(*io_gas, &U256::from_jit(&*endowment), slice::from_raw_parts(init_beg, init_size as usize)) {
Some((addr, gas)) => { Some((gas_left, addr)) => {
*io_gas = gas; *io_gas = gas_left;
*address = addr.into_jit(); *address = addr.into_jit();
}, },
None => () None => ()
@ -235,18 +235,16 @@ impl<'a> evmjit::Ext for ExtAdapter<'a> {
&Address::from_jit(&*receive_address), &Address::from_jit(&*receive_address),
&U256::from_jit(&*value), &U256::from_jit(&*value),
slice::from_raw_parts(in_beg, in_size as usize), slice::from_raw_parts(in_beg, in_size as usize),
&Address::from_jit(&*code_address)); &Address::from_jit(&*code_address),
slice::from_raw_parts_mut(out_beg, out_size as usize));
if opt.is_none() { match opt {
return false; None => false,
Some(gas_left) => {
*io_gas = gas_left;
true
}
} }
// TODO: fix this!
let (mut output, gas) = opt.unwrap();
out_beg = output.as_mut_ptr();
mem::forget(output);
*io_gas = gas;
true
} }
} }
@ -318,18 +316,15 @@ impl evm::Evm for JitEvm {
let mut context = unsafe { evmjit::ContextHandle::new(data.into_jit(), &mut ext_handle) }; let mut context = unsafe { evmjit::ContextHandle::new(data.into_jit(), &mut ext_handle) };
match context.exec() { match context.exec() {
evmjit::ReturnCode::Stop => Ok(evm::EvmOutput::new(U256::from(context.gas_left()), None)), evmjit::ReturnCode::Stop => Ok(U256::from(context.gas_left())),
evmjit::ReturnCode::Return => { evmjit::ReturnCode::Return => match ext.ret(context.gas_left(), context.output_data()) {
if context.output_data().len() as u64 * ext.schedule().create_data_gas as u64 > context.gas_left() { Some(gas_left) => Ok(U256::from(gas_left)),
return Err(evm::EvmError::OutOfGas); None => Err(evm::EvmError::OutOfGas)
}
Ok(evm::EvmOutput::new(U256::from(context.gas_left()), Some(context.output_data().to_vec())))
}, },
evmjit::ReturnCode::Suicide => { evmjit::ReturnCode::Suicide => {
// what if there is a suicide and we run out of gas just after? // what if there is a suicide and we run out of gas just after?
ext.suicide(); ext.suicide();
Ok(evm::EvmOutput::new(U256::from(context.gas_left()), None)) Ok(U256::from(context.gas_left()))
}, },
evmjit::ReturnCode::OutOfGas => Err(evm::EvmError::OutOfGas), evmjit::ReturnCode::OutOfGas => Err(evm::EvmError::OutOfGas),
_err => Err(evm::EvmError::Internal) _err => Err(evm::EvmError::Internal)
@ -408,7 +403,7 @@ mod tests {
let mut substate = Substate::new(); let mut substate = Substate::new();
{ {
let mut ext = Externalities::new(&mut state, &info, &engine, 0, &params, &mut substate); let mut ext = Externalities::new(&mut state, &info, &engine, 0, &params, &mut substate, OutputPolicy::InitContract);
let evm = JitEvm; let evm = JitEvm;
let _res = evm.exec(&params, &mut ext); let _res = evm.exec(&params, &mut ext);
//assert_eq!(evm.exec(&params, &mut ext), EvmResult::Stop); //assert_eq!(evm.exec(&params, &mut ext), EvmResult::Stop);
@ -432,7 +427,7 @@ mod tests {
let mut substate = Substate::new(); let mut substate = Substate::new();
{ {
let mut ext = Externalities::new(&mut state, &info, &engine, 0, &params, &mut substate); let mut ext = Externalities::new(&mut state, &info, &engine, 0, &params, &mut substate, OutputPolicy::InitContract);
let evm = JitEvm; let evm = JitEvm;
let _res = evm.exec(&params, &mut ext); let _res = evm.exec(&params, &mut ext);
//assert_eq!(evm.exec(&params, &mut ext), EvmResult::Stop {}); //assert_eq!(evm.exec(&params, &mut ext), EvmResult::Stop {});
@ -456,7 +451,7 @@ mod tests {
let mut substate = Substate::new(); let mut substate = Substate::new();
{ {
let mut ext = Externalities::new(&mut state, &info, &engine, 0, &params, &mut substate); let mut ext = Externalities::new(&mut state, &info, &engine, 0, &params, &mut substate, OutputPolicy::InitContract);
let evm = JitEvm; let evm = JitEvm;
let _res = evm.exec(&params, &mut ext); let _res = evm.exec(&params, &mut ext);
//assert_eq!(evm.exec(&params, &mut ext), EvmResult::Stop {}); //assert_eq!(evm.exec(&params, &mut ext), EvmResult::Stop {});
@ -481,7 +476,7 @@ mod tests {
let mut substate = Substate::new(); let mut substate = Substate::new();
{ {
let mut ext = Externalities::new(&mut state, &info, &engine, 0, &params, &mut substate); let mut ext = Externalities::new(&mut state, &info, &engine, 0, &params, &mut substate, OutputPolicy::InitContract);
let evm = JitEvm; let evm = JitEvm;
let _res = evm.exec(&params, &mut ext); let _res = evm.exec(&params, &mut ext);
//assert_eq!(evm.exec(&params, &mut ext), EvmResult::Stop {}); //assert_eq!(evm.exec(&params, &mut ext), EvmResult::Stop {});
@ -506,7 +501,7 @@ mod tests {
let mut substate = Substate::new(); let mut substate = Substate::new();
{ {
let mut ext = Externalities::new(&mut state, &info, &engine, 0, &params, &mut substate); let mut ext = Externalities::new(&mut state, &info, &engine, 0, &params, &mut substate, OutputPolicy::InitContract);
let evm = JitEvm; let evm = JitEvm;
let _res = evm.exec(&params, &mut ext); let _res = evm.exec(&params, &mut ext);
//assert_eq!(evm.exec(&params, &mut ext), EvmResult::Stop {}); //assert_eq!(evm.exec(&params, &mut ext), EvmResult::Stop {});
@ -547,7 +542,7 @@ mod tests {
let mut substate = Substate::new(); let mut substate = Substate::new();
{ {
let mut ext = Externalities::new(&mut state, &info, &engine, 0, &params, &mut substate); let mut ext = Externalities::new(&mut state, &info, &engine, 0, &params, &mut substate, OutputPolicy::InitContract);
let evm = JitEvm; let evm = JitEvm;
let _res = evm.exec(&params, &mut ext); let _res = evm.exec(&params, &mut ext);
//assert_eq!(evm.exec(&params, &mut ext), EvmResult::Stop {}); //assert_eq!(evm.exec(&params, &mut ext), EvmResult::Stop {});
@ -573,7 +568,7 @@ mod tests {
let mut substate = Substate::new(); let mut substate = Substate::new();
{ {
let mut ext = Externalities::new(&mut state, &info, &engine, 0, &params, &mut substate); let mut ext = Externalities::new(&mut state, &info, &engine, 0, &params, &mut substate, OutputPolicy::InitContract);
let evm = JitEvm; let evm = JitEvm;
let _res = evm.exec(&params, &mut ext); let _res = evm.exec(&params, &mut ext);
//assert_eq!(evm.exec(&params, &mut ext), EvmResult::Stop {}); //assert_eq!(evm.exec(&params, &mut ext), EvmResult::Stop {});
@ -595,7 +590,7 @@ mod tests {
let engine = TestEngine::new(); let engine = TestEngine::new();
let mut substate = Substate::new(); let mut substate = Substate::new();
{ {
let mut ext = Externalities::new(&mut state, &info, &engine, 0, &params, &mut substate); let mut ext = Externalities::new(&mut state, &info, &engine, 0, &params, &mut substate, OutputPolicy::InitContract);
let evm = JitEvm; let evm = JitEvm;
let _res = evm.exec(&params, &mut ext); let _res = evm.exec(&params, &mut ext);
//assert_eq!(evm.exec(&params, &mut ext), EvmResult::Stop {}); //assert_eq!(evm.exec(&params, &mut ext), EvmResult::Stop {});
@ -630,7 +625,7 @@ mod tests {
let engine = TestEngine::new(); let engine = TestEngine::new();
let mut substate = Substate::new(); let mut substate = Substate::new();
{ {
let mut ext = Externalities::new(&mut state, &info, &engine, 0, &params, &mut substate); let mut ext = Externalities::new(&mut state, &info, &engine, 0, &params, &mut substate, OutputPolicy::InitContract);
let evm = JitEvm; let evm = JitEvm;
let _res = evm.exec(&params, &mut ext); let _res = evm.exec(&params, &mut ext);
//assert_eq!(evm.exec(&params, &mut ext), EvmResult::Stop {}); //assert_eq!(evm.exec(&params, &mut ext), EvmResult::Stop {});
@ -662,7 +657,7 @@ mod tests {
let mut substate = Substate::new(); let mut substate = Substate::new();
{ {
let mut ext = Externalities::new(&mut state, &info, &engine, 0, &params, &mut substate); let mut ext = Externalities::new(&mut state, &info, &engine, 0, &params, &mut substate, OutputPolicy::InitContract);
let evm = JitEvm; let evm = JitEvm;
let _res = evm.exec(&params, &mut ext); let _res = evm.exec(&params, &mut ext);
//assert_eq!(evm.exec(&params, &mut ext), EvmResult::Stop {}); //assert_eq!(evm.exec(&params, &mut ext), EvmResult::Stop {});
@ -688,7 +683,7 @@ mod tests {
let mut substate = Substate::new(); let mut substate = Substate::new();
{ {
let mut ext = Externalities::new(&mut state, &info, &engine, 0, &params, &mut substate); let mut ext = Externalities::new(&mut state, &info, &engine, 0, &params, &mut substate, OutputPolicy::InitContract);
let evm = JitEvm; let evm = JitEvm;
let _res = evm.exec(&params, &mut ext); let _res = evm.exec(&params, &mut ext);
//assert_eq!(evm.exec(&params, &mut ext), EvmResult::Stop {}); //assert_eq!(evm.exec(&params, &mut ext), EvmResult::Stop {});

View File

@ -13,5 +13,6 @@ pub use self::evm::{Evm, EvmError, EvmResult};
pub use self::ext::{Ext}; pub use self::ext::{Ext};
pub use self::logentry::LogEntry; pub use self::logentry::LogEntry;
pub use self::vmfactory::VmFactory; pub use self::vmfactory::VmFactory;
pub use self::executive::{Executive, ExecutionResult, Externalities, Substate}; // TODO: reduce this to absolutely necessary things
pub use self::executive::{Executive, ExecutionResult, Externalities, Substate, OutputPolicy};
pub use self::params::EvmParams; pub use self::params::EvmParams;