[Wasm] memcmp fix and test added (#7590)
* [Wasm] memcmp fix and test added * [Wasm] use reqrep_test! macro for memcmp test
This commit is contained in:
		
							parent
							
								
									c7aed335ce
								
							
						
					
					
						commit
						534692cdae
					
				| @ -1 +1 @@ | ||||
| Subproject commit d9d6133c1bc5dca4c74c9eb758a39546a0d46b45 | ||||
| Subproject commit f25e60e300ade96aba2adffb3ebca8e5b4965720 | ||||
| @ -577,16 +577,18 @@ impl<'a, 'b> Runtime<'a, 'b> { | ||||
| 		//
 | ||||
| 
 | ||||
| 		let len = context.value_stack.pop_as::<i32>()? as u32; | ||||
| 		let cx = context.value_stack.pop_as::<i32>()? as u32; | ||||
| 		let ct = context.value_stack.pop_as::<i32>()? as u32; | ||||
| 		let cx = context.value_stack.pop_as::<i32>()? as u32; | ||||
| 
 | ||||
| 		self.charge(|schedule| schedule.wasm.mem_cmp as u64 * len as u64)?; | ||||
| 
 | ||||
| 		let cx = self.memory.get(cx, len as usize)?; | ||||
| 		let ct = self.memory.get(ct, len as usize)?; | ||||
| 		let cx = self.memory.get(cx, len as usize)?; | ||||
| 
 | ||||
| 		let result = unsafe { | ||||
| 			memcmp(cx.as_ptr() as *const c_void, ct.as_ptr() as *const c_void, len as usize) | ||||
| 		}; | ||||
| 
 | ||||
| 		Ok(Some(Into::into(result))) | ||||
| 	} | ||||
| 
 | ||||
|  | ||||
| @ -29,6 +29,34 @@ macro_rules! load_sample { | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| macro_rules! reqrep_test { | ||||
| 	($name: expr, $input: expr) => { | ||||
| 		reqrep_test!($name, $input, vm::EnvInfo::default(), HashMap::new()) | ||||
| 	}; | ||||
| 	($name: expr, $input: expr, $info: expr, $block_hashes: expr) => { | ||||
| 		{ | ||||
| 			::ethcore_logger::init_log(); | ||||
| 			let code = load_sample!($name); | ||||
| 
 | ||||
| 			let mut params = ActionParams::default(); | ||||
| 			params.gas = U256::from(100_000); | ||||
| 			params.code = Some(Arc::new(code)); | ||||
| 			params.data = Some($input); | ||||
| 
 | ||||
| 			let mut fake_ext = FakeExt::new(); | ||||
| 			fake_ext.info = $info; | ||||
| 			fake_ext.blockhashes = $block_hashes; | ||||
| 
 | ||||
| 			let mut interpreter = wasm_interpreter(); | ||||
| 			interpreter.exec(params, &mut fake_ext) | ||||
| 				.map(|result| match result { | ||||
| 					GasLeft::Known(_) => { panic!("Test is expected to return payload to check"); }, | ||||
| 					GasLeft::NeedsReturn { gas_left: gas, data: result, apply_state: _apply } => (gas, result.to_vec()), | ||||
| 				}) | ||||
| 		} | ||||
| 	}; | ||||
| } | ||||
| 
 | ||||
| fn test_finalize(res: Result<GasLeft, vm::Error>) -> Result<U256, vm::Error> { | ||||
| 	match res { | ||||
| 		Ok(GasLeft::Known(gas)) => Ok(gas), | ||||
| @ -491,6 +519,36 @@ fn keccak() { | ||||
| 	assert_eq!(gas_left, U256::from(81_067)); | ||||
| } | ||||
| 
 | ||||
| // memcmp test.
 | ||||
| #[test] | ||||
| fn memcmp() { | ||||
| 	::ethcore_logger::init_log(); | ||||
| 
 | ||||
| 	let (gas_left, result) = reqrep_test! { | ||||
| 		"memcmp.wasm", | ||||
| 		vec![1u8, 1, 1] | ||||
| 	}.expect("Interpreter to execute without any errors"); | ||||
| 
 | ||||
| 	assert_eq!(0i32, LittleEndian::read_i32(&result)); | ||||
| 	assert_eq!(gas_left, U256::from(96610)); | ||||
| 
 | ||||
| 	let (gas_left, result) = reqrep_test! { | ||||
| 		"memcmp.wasm", | ||||
| 		vec![1u8, 1, 3, 1] | ||||
| 	}.expect("Interpreter to execute without any errors"); | ||||
| 
 | ||||
| 	assert_eq!(2i32, LittleEndian::read_i32(&result)); | ||||
| 	assert_eq!(gas_left, U256::from(96610)); | ||||
| 
 | ||||
| 	let (gas_left, result) = reqrep_test! { | ||||
| 		"memcmp.wasm", | ||||
| 		vec![1u8, 1, 0] | ||||
| 	}.expect("Interpreter to execute without any errors"); | ||||
| 
 | ||||
| 	assert_eq!(-1i32, LittleEndian::read_i32(&result)); | ||||
| 	assert_eq!(gas_left, U256::from(96610)); | ||||
| } | ||||
| 
 | ||||
| // memcpy test.
 | ||||
| #[test] | ||||
| fn memcpy() { | ||||
| @ -580,34 +638,6 @@ fn memset() { | ||||
| 	assert_eq!(gas_left, U256::from(71_921)); | ||||
| } | ||||
| 
 | ||||
| macro_rules! reqrep_test { | ||||
| 	($name: expr, $input: expr) => { | ||||
| 		reqrep_test!($name, $input, vm::EnvInfo::default(), HashMap::new()) | ||||
| 	}; | ||||
| 	($name: expr, $input: expr, $info: expr, $block_hashes: expr) => { | ||||
| 		{ | ||||
| 			::ethcore_logger::init_log(); | ||||
| 			let code = load_sample!($name); | ||||
| 
 | ||||
| 			let mut params = ActionParams::default(); | ||||
| 			params.gas = U256::from(100_000); | ||||
| 			params.code = Some(Arc::new(code)); | ||||
| 			params.data = Some($input); | ||||
| 
 | ||||
| 			let mut fake_ext = FakeExt::new(); | ||||
| 			fake_ext.info = $info; | ||||
| 			fake_ext.blockhashes = $block_hashes; | ||||
| 
 | ||||
| 			let mut interpreter = wasm_interpreter(); | ||||
| 			interpreter.exec(params, &mut fake_ext) | ||||
| 				.map(|result| match result { | ||||
| 					GasLeft::Known(_) => { panic!("Test is expected to return payload to check"); }, | ||||
| 					GasLeft::NeedsReturn { gas_left: gas, data: result, apply_state: _apply } => (gas, result.to_vec()), | ||||
| 				}) | ||||
| 		} | ||||
| 	}; | ||||
| } | ||||
| 
 | ||||
| // math_* tests check the ability of wasm contract to perform big integer operations
 | ||||
| // - addition
 | ||||
| // - multiplication
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user