From 7e5de5f5c79361742820f6634bfb469bf476dcc1 Mon Sep 17 00:00:00 2001 From: Tomusdrw Date: Thu, 14 Jan 2016 01:31:45 +0100 Subject: [PATCH] More descriptive interpreter errors --- src/evm/evm.rs | 12 ++++++++++-- src/evm/factory.rs | 2 +- src/evm/interpreter.rs | 12 ++++++++++-- src/evm/tests.rs | 4 ++-- src/executive.rs | 4 ++-- 5 files changed, 25 insertions(+), 9 deletions(-) diff --git a/src/evm/evm.rs b/src/evm/evm.rs index 589af13a5..fd87efd32 100644 --- a/src/evm/evm.rs +++ b/src/evm/evm.rs @@ -19,9 +19,17 @@ pub enum Error { BadInstruction, /// `StackUnderflow` when there is not enough stack elements to execute instruction /// First parameter says how many elements were needed and the second how many were actually on Stack - StackUnderflow(/*wanted*/usize, /*on_stack*/usize), + StackUnderflow { + instruction: &'static str, + wanted: usize, + on_stack: usize + }, /// When execution would exceed defined Stack Limit - OutOfStack(/*wanted*/usize, /*stack_limit*/usize), + OutOfStack { + instruction: &'static str, + wanted: usize, + limit: usize + }, /// Returned on evm internal error. Should never be ignored during development. /// Likely to cause consensus issues. Internal, diff --git a/src/evm/factory.rs b/src/evm/factory.rs index 67ffe9766..39019cd8d 100644 --- a/src/evm/factory.rs +++ b/src/evm/factory.rs @@ -15,7 +15,7 @@ impl Factory { /// Returns native rust evm #[cfg(not(feature = "jit"))] pub fn create() -> Box { - Box::new(super::interpreter::Interpreter::new()) + Box::new(super::interpreter::Interpreter) } } diff --git a/src/evm/interpreter.rs b/src/evm/interpreter.rs index bbe5a45e1..786277b83 100644 --- a/src/evm/interpreter.rs +++ b/src/evm/interpreter.rs @@ -626,9 +626,17 @@ impl Interpreter { stack_limit: usize, stack: &Stack) -> Result<(), evm::Error> { if !stack.has(info.args) { - Err(evm::Error::StackUnderflow(info.args, stack.size())) + Err(evm::Error::StackUnderflow { + instruction: info.name, + wanted: info.args, + on_stack: stack.size() + }) } else if stack.size() - info.args + info.ret > stack_limit { - Err(evm::Error::OutOfStack(info.ret - info.args, stack_limit)) + Err(evm::Error::OutOfStack { + instruction: info.name, + wanted: info.ret - info.args, + limit: stack_limit + }) } else { Ok(()) } diff --git a/src/evm/tests.rs b/src/evm/tests.rs index 3d29464fe..ab5dd9dbd 100644 --- a/src/evm/tests.rs +++ b/src/evm/tests.rs @@ -112,9 +112,9 @@ fn test_stack_underflow() { }; match err { - evm::Error::StackUnderflow(wanted, stack) => { + evm::Error::StackUnderflow {instruction: _, wanted, on_stack} => { assert_eq!(wanted, 2); - assert_eq!(stack, 0); + assert_eq!(on_stack, 0); } _ => { assert!(false, "Expected StackUndeflow") diff --git a/src/executive.rs b/src/executive.rs index 97dea7b05..23782e314 100644 --- a/src/executive.rs +++ b/src/executive.rs @@ -221,8 +221,8 @@ impl<'a> Executive<'a> { Err(evm::Error::OutOfGas) | Err(evm::Error::BadJumpDestination) | Err(evm::Error::BadInstruction) - | Err(evm::Error::StackUnderflow(_, _)) - | Err(evm::Error::OutOfStack(_, _)) => { + | Err(evm::Error::StackUnderflow {instruction: _, wanted: _, on_stack: _}) + | Err(evm::Error::OutOfStack {instruction: _, wanted: _, limit: _}) => { *self.state = backup; Ok(Executed { gas: t.gas,