From 2d10cd0ecc8c3972716a9cb025e39991d558fd55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Drwi=C4=99ga?= Date: Tue, 17 Oct 2017 14:54:56 +0200 Subject: [PATCH] Fixing JSON WiP. Refactor & Write tests. --- ethcore/src/client/evm_test_client.rs | 2 +- evmbin/src/display/json.rs | 32 ++++++++++++++++++++++++--- evmbin/src/main.rs | 2 +- 3 files changed, 31 insertions(+), 5 deletions(-) diff --git a/ethcore/src/client/evm_test_client.rs b/ethcore/src/client/evm_test_client.rs index ff03554f9..7734d5ad2 100644 --- a/ethcore/src/client/evm_test_client.rs +++ b/ethcore/src/client/evm_test_client.rs @@ -219,7 +219,7 @@ impl<'a> EvmTestClient<'a> { TransactResult::Ok { state_root: *self.state.root(), gas_left: initial_gas - result.receipt.gas_used, - output: result.output + output: result.output, } }, Err(error) => TransactResult::Err { diff --git a/evmbin/src/display/json.rs b/evmbin/src/display/json.rs index b36653c78..3de0d261c 100644 --- a/evmbin/src/display/json.rs +++ b/evmbin/src/display/json.rs @@ -37,6 +37,8 @@ pub struct Informant { stack: Vec, memory: Vec, storage: HashMap, + traces: Vec, + subtraces: Vec, } impl Informant { @@ -57,6 +59,14 @@ impl Informant { } } +impl Drop for Informant { + fn drop(&mut self) { + for trace in &self.traces { + println!("{}", trace); + } + } +} + impl vm::Informant for Informant { fn before_test(&self, name: &str, action: &str) { println!( @@ -104,18 +114,19 @@ impl trace::VMTracer for Informant { fn trace_executed(&mut self, gas_used: U256, stack_push: &[U256], mem_diff: Option<(usize, &[u8])>, store_diff: Option<(U256, U256)>) { let info = ::evm::INSTRUCTIONS[self.instruction as usize]; - println!( + let trace = format!( "{{\"pc\":{pc},\"op\":{op},\"opName\":\"{name}\",\"gas\":{gas},\"gasCost\":{gas_cost},\"memory\":{memory},\"stack\":{stack},\"storage\":{storage},\"depth\":{depth}}}", pc = self.pc, op = self.instruction, name = info.name, - gas = display::u256_as_str(&(gas_used + self.gas_cost)), + gas = display::u256_as_str(&(gas_used.saturating_add(self.gas_cost))), gas_cost = display::u256_as_str(&self.gas_cost), memory = self.memory(), stack = self.stack(), storage = self.storage(), depth = self.depth, ); + self.traces.push(trace); self.gas_used = gas_used; @@ -133,6 +144,11 @@ impl trace::VMTracer for Informant { if let Some((pos, val)) = store_diff { self.storage.insert(pos.into(), val.into()); } + + + if !self.subtraces.is_empty() { + self.traces.extend(::std::mem::replace(&mut self.subtraces, vec![])); + } } fn prepare_subtrace(&self, code: &[u8]) -> Self where Self: Sized { @@ -144,13 +160,23 @@ impl trace::VMTracer for Informant { } fn done_subtrace(&mut self, mut sub: Self) { + let subtraces = ::std::mem::replace(&mut sub.traces, vec![]); if sub.depth == 1 { + self.traces.extend(subtraces); // print last line with final state: sub.gas_cost = 0.into(); let gas_used = sub.gas_used; trace::VMTracer::trace_executed(&mut sub, gas_used, &[], None, None); + } else { + self.subtraces = subtraces; } } - fn drain(self) -> Option { None } + fn drain(self) -> Option { + println!("Drain called."); + for trace in &self.traces { + println!("{}", trace); + } + None + } } diff --git a/evmbin/src/main.rs b/evmbin/src/main.rs index d3668037f..b37654c04 100644 --- a/evmbin/src/main.rs +++ b/evmbin/src/main.rs @@ -187,7 +187,7 @@ impl Args { pub fn gas(&self) -> Result { match self.flag_gas { Some(ref gas) => gas.parse().map_err(to_string), - None => Ok(!U256::zero()), + None => Ok(U256::from(u64::max_value())), } }