diff --git a/libevmjit/Compiler.cpp b/libevmjit/Compiler.cpp index a88797413..640561ad9 100644 --- a/libevmjit/Compiler.cpp +++ b/libevmjit/Compiler.cpp @@ -925,6 +925,9 @@ void Compiler::linkBasicBlocks(Stack& stack) { auto& bbInfo = pair.second; + if (bbInfo.predecessors.empty()) + bbInfo.inputItems = 0; // no consequences for other blocks, so leave valuesChanged false + for (auto predInfo : bbInfo.predecessors) { if (predInfo->outputItems < bbInfo.inputItems) @@ -996,11 +999,11 @@ void Compiler::dumpBasicBlockGraph(std::ostream& out) std::vector blocks; for (auto& pair : this->basicBlocks) - { blocks.push_back(&pair.second); - } - blocks.push_back(m_jumpTableBlock.get()); - blocks.push_back(m_badJumpBlock.get()); + if (m_jumpTableBlock.get()) + blocks.push_back(m_jumpTableBlock.get()); + if (m_badJumpBlock.get()) + blocks.push_back(m_badJumpBlock.get()); // Output nodes for (auto bb : blocks) diff --git a/libevmjit/Stack.cpp b/libevmjit/Stack.cpp index 772e6255b..ce7d09471 100644 --- a/libevmjit/Stack.cpp +++ b/libevmjit/Stack.cpp @@ -1,5 +1,8 @@ #include "Stack.h" #include "Runtime.h" +#include "Type.h" + +#include #include #include @@ -51,9 +54,14 @@ extern "C" using namespace dev::eth::jit; +extern std::jmp_buf* rt_jmpBuf; + EXPORT void stack_pop(i256* _ret) { auto& stack = Runtime::getStack(); + if (stack.size() == 0) + longjmp(*rt_jmpBuf, static_cast(ReturnCode::StackTooSmall)); + assert(stack.size() > 0); *_ret = stack.back(); stack.pop_back(); diff --git a/libevmjit/Type.h b/libevmjit/Type.h index 06907b7df..a03bfac38 100644 --- a/libevmjit/Type.h +++ b/libevmjit/Type.h @@ -39,6 +39,7 @@ enum class ReturnCode BadJumpDestination = 101, OutOfGas = 102, + StackTooSmall = 103 }; struct Constant diff --git a/libevmjit/VM.cpp b/libevmjit/VM.cpp index 6b8b3e38b..16011241e 100644 --- a/libevmjit/VM.cpp +++ b/libevmjit/VM.cpp @@ -26,6 +26,8 @@ bytes VM::go(ExtVMFace& _ext) BOOST_THROW_EXCEPTION(BadJumpDestination()); case 102: BOOST_THROW_EXCEPTION(OutOfGas()); + case 103: + BOOST_THROW_EXCEPTION(StackTooSmall(1,0)); } return std::move(engine.returnData);