diff --git a/src/evm/interpreter.rs b/src/evm/interpreter.rs index 63c4e5869..f60bf868c 100644 --- a/src/evm/interpreter.rs +++ b/src/evm/interpreter.rs @@ -44,7 +44,10 @@ impl Stack for Vec { fn pop_back(&mut self) -> S { let val = self.pop(); match val { - Some(x) => x, + Some(x) => { + // println!("Poping from stack: {}", x); + x + }, None => panic!("Tried to pop from empty stack.") } } @@ -87,8 +90,17 @@ trait Memory { fn read_slice(&self, offset: U256, size: U256) -> &[u8]; /// Retrieve writeable part of memory fn writeable_slice(&mut self, offset: U256, size: U256) -> &mut[u8]; + fn dump(&self); } impl Memory for Vec { + fn dump(&self) { + println!("MemoryDump:"); + for i in self.iter() { + print!("{:02x} ", i); + } + println!(""); + } + fn size(&self) -> usize { return self.len() } @@ -124,7 +136,7 @@ impl Memory for Vec { let mut val = value; let end = off + 32; - for pos in off..end { + for pos in 0..32 { self[end - pos - 1] = val.low_u64() as u8; val = val >> 8; } @@ -157,7 +169,8 @@ impl<'a> CodeReader<'a> { fn read(&mut self, no_of_bytes: usize) -> U256 { let pos = self.position; self.position += no_of_bytes; - U256::from(&self.code[pos..pos+no_of_bytes]) + let max = cmp::min(pos + no_of_bytes, self.code.len()); + U256::from(&self.code[pos..max]) } fn len (&self) -> usize { @@ -724,7 +737,7 @@ impl Interpreter { fn verify_jump(&self, jump_u: U256, valid_jump_destinations: &HashSet) -> Result { let jump = jump_u.low_u64() as usize; - if valid_jump_destinations.contains(&jump) { + if valid_jump_destinations.contains(&jump) && jump_u < U256::from(!0 as usize) { Ok(jump) } else { Err(evm::Error::BadJumpDestination { @@ -1037,13 +1050,13 @@ mod tests { fn test_memory_read_and_write() { // given let mem : &mut super::Memory = &mut vec![]; - mem.resize(32); + mem.resize(0x80 + 32); // when - mem.write(U256::from(0x00), U256::from(0xabcdef)); + mem.write(U256::from(0x80), U256::from(0xabcdef)); // then - assert_eq!(mem.read(U256::from(0x00)), U256::from(0xabcdef)); + assert_eq!(mem.read(U256::from(0x80)), U256::from(0xabcdef)); } #[test] diff --git a/src/tests/executive.rs b/src/tests/executive.rs index 3f6395804..0db31e48a 100644 --- a/src/tests/executive.rs +++ b/src/tests/executive.rs @@ -168,7 +168,7 @@ fn do_json_test_for(vm: &VMType, json_data: &[u8]) -> Vec { let json = Json::from_str(::std::str::from_utf8(json_data).unwrap()).expect("Json is invalid"); let mut failed = Vec::new(); for (name, test) in json.as_object().unwrap() { - // if name != "calldataload_BigOffset" { + // if name != "for_loop1" { // continue; // } println!("name: {:?}", name); @@ -242,7 +242,7 @@ fn do_json_test_for(vm: &VMType, json_data: &[u8]) -> Vec { match res { Err(_) => fail_unless(out_of_gas, "didn't expect to run out of gas."), Ok(gas_left) => { - println!("name: {}, gas_left : {:?}", name, gas_left); + // println!("name: {}, gas_left : {:?}", name, gas_left); fail_unless(!out_of_gas, "expected to run out of gas."); fail_unless(gas_left == xjson!(&test["gas"]), "gas_left is incorrect"); fail_unless(output == Bytes::from_json(&test["out"]), "output is incorrect");