refactor in progress... evmjit compiling
This commit is contained in:
		
							parent
							
								
									6d3097ac9e
								
							
						
					
					
						commit
						88409e7dbb
					
				| @ -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
 | ||||||
|  | |||||||
| @ -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, ¶ms, &mut substate), ExecutionResult::Ok); | 			let _res = ex.create(¶ms, &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, ¶ms, &mut substate), ExecutionResult::Ok); | 			let _res = ex.create(¶ms, &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, ¶ms, &mut substate), ExecutionResult::Ok); | 			let _res = ex.call(¶ms, &mut substate, &mut []); | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		assert!(false); | 		assert!(false); | ||||||
|  | |||||||
| @ -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,20 +235,18 @@ 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; | ||||||
| 			// TODO: fix this!
 |  | ||||||
| 			let (mut output, gas) = opt.unwrap(); |  | ||||||
| 			out_beg = output.as_mut_ptr(); |  | ||||||
| 			mem::forget(output); |  | ||||||
| 			*io_gas = gas; |  | ||||||
| 					true | 					true | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
| 
 | 
 | ||||||
| 	fn log(&mut self, | 	fn log(&mut self, | ||||||
| 		   beg: *const u8, | 		   beg: *const u8, | ||||||
| @ -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, ¶ms, &mut substate); | 			let mut ext = Externalities::new(&mut state, &info, &engine, 0, ¶ms, &mut substate, OutputPolicy::InitContract); | ||||||
| 			let evm = JitEvm; | 			let evm = JitEvm; | ||||||
| 			let _res = evm.exec(¶ms, &mut ext); | 			let _res = evm.exec(¶ms, &mut ext); | ||||||
| 			//assert_eq!(evm.exec(¶ms, &mut ext), EvmResult::Stop);
 | 			//assert_eq!(evm.exec(¶ms, &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, ¶ms, &mut substate); | 			let mut ext = Externalities::new(&mut state, &info, &engine, 0, ¶ms, &mut substate, OutputPolicy::InitContract); | ||||||
| 			let evm = JitEvm; | 			let evm = JitEvm; | ||||||
| 			let _res = evm.exec(¶ms, &mut ext); | 			let _res = evm.exec(¶ms, &mut ext); | ||||||
| 			//assert_eq!(evm.exec(¶ms, &mut ext), EvmResult::Stop {});
 | 			//assert_eq!(evm.exec(¶ms, &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, ¶ms, &mut substate); | 			let mut ext = Externalities::new(&mut state, &info, &engine, 0, ¶ms, &mut substate, OutputPolicy::InitContract); | ||||||
| 			let evm = JitEvm; | 			let evm = JitEvm; | ||||||
| 			let _res = evm.exec(¶ms, &mut ext); | 			let _res = evm.exec(¶ms, &mut ext); | ||||||
| 			//assert_eq!(evm.exec(¶ms, &mut ext), EvmResult::Stop {});
 | 			//assert_eq!(evm.exec(¶ms, &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, ¶ms, &mut substate); | 			let mut ext = Externalities::new(&mut state, &info, &engine, 0, ¶ms, &mut substate, OutputPolicy::InitContract); | ||||||
| 			let evm = JitEvm; | 			let evm = JitEvm; | ||||||
| 			let _res = evm.exec(¶ms, &mut ext); | 			let _res = evm.exec(¶ms, &mut ext); | ||||||
| 			//assert_eq!(evm.exec(¶ms, &mut ext), EvmResult::Stop {});
 | 			//assert_eq!(evm.exec(¶ms, &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, ¶ms, &mut substate); | 			let mut ext = Externalities::new(&mut state, &info, &engine, 0, ¶ms, &mut substate, OutputPolicy::InitContract); | ||||||
| 			let evm = JitEvm; | 			let evm = JitEvm; | ||||||
| 			let _res = evm.exec(¶ms, &mut ext); | 			let _res = evm.exec(¶ms, &mut ext); | ||||||
| 			//assert_eq!(evm.exec(¶ms, &mut ext), EvmResult::Stop {});
 | 			//assert_eq!(evm.exec(¶ms, &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, ¶ms, &mut substate); | 			let mut ext = Externalities::new(&mut state, &info, &engine, 0, ¶ms, &mut substate, OutputPolicy::InitContract); | ||||||
| 			let evm = JitEvm; | 			let evm = JitEvm; | ||||||
| 			let _res = evm.exec(¶ms, &mut ext); | 			let _res = evm.exec(¶ms, &mut ext); | ||||||
| 			//assert_eq!(evm.exec(¶ms, &mut ext), EvmResult::Stop {});
 | 			//assert_eq!(evm.exec(¶ms, &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, ¶ms, &mut substate); | 			let mut ext = Externalities::new(&mut state, &info, &engine, 0, ¶ms, &mut substate, OutputPolicy::InitContract); | ||||||
| 			let evm = JitEvm; | 			let evm = JitEvm; | ||||||
| 			let _res = evm.exec(¶ms, &mut ext); | 			let _res = evm.exec(¶ms, &mut ext); | ||||||
| 			//assert_eq!(evm.exec(¶ms, &mut ext), EvmResult::Stop {});
 | 			//assert_eq!(evm.exec(¶ms, &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, ¶ms, &mut substate); | 			let mut ext = Externalities::new(&mut state, &info, &engine, 0, ¶ms, &mut substate, OutputPolicy::InitContract); | ||||||
| 			let evm = JitEvm; | 			let evm = JitEvm; | ||||||
| 			let _res = evm.exec(¶ms, &mut ext); | 			let _res = evm.exec(¶ms, &mut ext); | ||||||
| 			//assert_eq!(evm.exec(¶ms, &mut ext), EvmResult::Stop {});
 | 			//assert_eq!(evm.exec(¶ms, &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, ¶ms, &mut substate); | 			let mut ext = Externalities::new(&mut state, &info, &engine, 0, ¶ms, &mut substate, OutputPolicy::InitContract); | ||||||
| 			let evm = JitEvm; | 			let evm = JitEvm; | ||||||
| 			let _res = evm.exec(¶ms, &mut ext); | 			let _res = evm.exec(¶ms, &mut ext); | ||||||
| 			//assert_eq!(evm.exec(¶ms, &mut ext), EvmResult::Stop {});
 | 			//assert_eq!(evm.exec(¶ms, &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, ¶ms, &mut substate); | 			let mut ext = Externalities::new(&mut state, &info, &engine, 0, ¶ms, &mut substate, OutputPolicy::InitContract); | ||||||
| 			let evm = JitEvm; | 			let evm = JitEvm; | ||||||
| 			let _res = evm.exec(¶ms, &mut ext); | 			let _res = evm.exec(¶ms, &mut ext); | ||||||
| 			//assert_eq!(evm.exec(¶ms, &mut ext), EvmResult::Stop {});
 | 			//assert_eq!(evm.exec(¶ms, &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, ¶ms, &mut substate); | 			let mut ext = Externalities::new(&mut state, &info, &engine, 0, ¶ms, &mut substate, OutputPolicy::InitContract); | ||||||
| 			let evm = JitEvm; | 			let evm = JitEvm; | ||||||
| 			let _res = evm.exec(¶ms, &mut ext); | 			let _res = evm.exec(¶ms, &mut ext); | ||||||
| 			//assert_eq!(evm.exec(¶ms, &mut ext), EvmResult::Stop {});
 | 			//assert_eq!(evm.exec(¶ms, &mut ext), EvmResult::Stop {});
 | ||||||
|  | |||||||
| @ -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; | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user