From 45fb3f5625e5ce01c69cd7ce47f94c1a6da39ef1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Bylica?= Date: Mon, 15 Dec 2014 12:16:44 +0100 Subject: [PATCH] Move some data from stack to JitVM object to save stack space. --- libevmjit-cpp/JitVM.cpp | 42 +++++++++++++++++++---------------------- libevmjit-cpp/JitVM.h | 4 +++- 2 files changed, 22 insertions(+), 24 deletions(-) diff --git a/libevmjit-cpp/JitVM.cpp b/libevmjit-cpp/JitVM.cpp index a676780123..46dabe2758 100644 --- a/libevmjit-cpp/JitVM.cpp +++ b/libevmjit-cpp/JitVM.cpp @@ -13,28 +13,25 @@ bytesConstRef JitVM::go(ExtVMFace& _ext, OnOpFunc const&, uint64_t) { using namespace jit; - RuntimeData data; - data.set(RuntimeData::Gas, m_gas); - data.set(RuntimeData::Address, fromAddress(_ext.myAddress)); - data.set(RuntimeData::Caller, fromAddress(_ext.caller)); - data.set(RuntimeData::Origin, fromAddress(_ext.origin)); - data.set(RuntimeData::CallValue, _ext.value); - data.set(RuntimeData::CallDataSize, _ext.data.size()); - data.set(RuntimeData::GasPrice, _ext.gasPrice); - data.set(RuntimeData::PrevHash, _ext.previousBlock.hash); - data.set(RuntimeData::CoinBase, fromAddress(_ext.currentBlock.coinbaseAddress)); - data.set(RuntimeData::TimeStamp, _ext.currentBlock.timestamp); - data.set(RuntimeData::Number, _ext.currentBlock.number); - data.set(RuntimeData::Difficulty, _ext.currentBlock.difficulty); - data.set(RuntimeData::GasLimit, _ext.currentBlock.gasLimit); - data.set(RuntimeData::CodeSize, _ext.code.size()); - data.callData = _ext.data.data(); - data.code = _ext.code.data(); + m_data.set(RuntimeData::Gas, m_gas); + m_data.set(RuntimeData::Address, fromAddress(_ext.myAddress)); + m_data.set(RuntimeData::Caller, fromAddress(_ext.caller)); + m_data.set(RuntimeData::Origin, fromAddress(_ext.origin)); + m_data.set(RuntimeData::CallValue, _ext.value); + m_data.set(RuntimeData::CallDataSize, _ext.data.size()); + m_data.set(RuntimeData::GasPrice, _ext.gasPrice); + m_data.set(RuntimeData::PrevHash, _ext.previousBlock.hash); + m_data.set(RuntimeData::CoinBase, fromAddress(_ext.currentBlock.coinbaseAddress)); + m_data.set(RuntimeData::TimeStamp, _ext.currentBlock.timestamp); + m_data.set(RuntimeData::Number, _ext.currentBlock.number); + m_data.set(RuntimeData::Difficulty, _ext.currentBlock.difficulty); + m_data.set(RuntimeData::GasLimit, _ext.currentBlock.gasLimit); + m_data.set(RuntimeData::CodeSize, _ext.code.size()); + m_data.callData = _ext.data.data(); + m_data.code = _ext.code.data(); - ExecutionEngine engine; auto env = reinterpret_cast(&_ext); - auto exitCode = engine.run(_ext.code, &data, env); - + auto exitCode = m_engine.run(_ext.code, &m_data, env); switch (exitCode) { case ReturnCode::BadJumpDestination: @@ -49,9 +46,8 @@ bytesConstRef JitVM::go(ExtVMFace& _ext, OnOpFunc const&, uint64_t) break; } - m_gas = llvm2eth(data.elems[RuntimeData::Gas]); - m_output = std::move(engine.returnData); - return {m_output.data(), m_output.size()}; // TODO: This all bytesConstRef stuff sucks + m_gas = llvm2eth(m_data.elems[RuntimeData::Gas]); + return {m_engine.returnData.data(), m_engine.returnData.size()}; // TODO: This all bytesConstRef is problematic, review. } } diff --git a/libevmjit-cpp/JitVM.h b/libevmjit-cpp/JitVM.h index 4b5fedab0e..90855127e0 100644 --- a/libevmjit-cpp/JitVM.h +++ b/libevmjit-cpp/JitVM.h @@ -1,6 +1,7 @@ #pragma once #include +#include namespace dev { @@ -18,7 +19,8 @@ private: friend class VMFactory; explicit JitVM(u256 _gas = 0) : VMFace(_gas) {} - bytes m_output; + jit::RuntimeData m_data; + jit::ExecutionEngine m_engine; };