Browse Source

Move some data from stack to JitVM object to save stack space.

cl-refactor
Paweł Bylica 11 years ago
parent
commit
45fb3f5625
  1. 42
      libevmjit-cpp/JitVM.cpp
  2. 4
      libevmjit-cpp/JitVM.h

42
libevmjit-cpp/JitVM.cpp

@ -13,28 +13,25 @@ bytesConstRef JitVM::go(ExtVMFace& _ext, OnOpFunc const&, uint64_t)
{ {
using namespace jit; using namespace jit;
RuntimeData data; m_data.set(RuntimeData::Gas, m_gas);
data.set(RuntimeData::Gas, m_gas); m_data.set(RuntimeData::Address, fromAddress(_ext.myAddress));
data.set(RuntimeData::Address, fromAddress(_ext.myAddress)); m_data.set(RuntimeData::Caller, fromAddress(_ext.caller));
data.set(RuntimeData::Caller, fromAddress(_ext.caller)); m_data.set(RuntimeData::Origin, fromAddress(_ext.origin));
data.set(RuntimeData::Origin, fromAddress(_ext.origin)); m_data.set(RuntimeData::CallValue, _ext.value);
data.set(RuntimeData::CallValue, _ext.value); m_data.set(RuntimeData::CallDataSize, _ext.data.size());
data.set(RuntimeData::CallDataSize, _ext.data.size()); m_data.set(RuntimeData::GasPrice, _ext.gasPrice);
data.set(RuntimeData::GasPrice, _ext.gasPrice); m_data.set(RuntimeData::PrevHash, _ext.previousBlock.hash);
data.set(RuntimeData::PrevHash, _ext.previousBlock.hash); m_data.set(RuntimeData::CoinBase, fromAddress(_ext.currentBlock.coinbaseAddress));
data.set(RuntimeData::CoinBase, fromAddress(_ext.currentBlock.coinbaseAddress)); m_data.set(RuntimeData::TimeStamp, _ext.currentBlock.timestamp);
data.set(RuntimeData::TimeStamp, _ext.currentBlock.timestamp); m_data.set(RuntimeData::Number, _ext.currentBlock.number);
data.set(RuntimeData::Number, _ext.currentBlock.number); m_data.set(RuntimeData::Difficulty, _ext.currentBlock.difficulty);
data.set(RuntimeData::Difficulty, _ext.currentBlock.difficulty); m_data.set(RuntimeData::GasLimit, _ext.currentBlock.gasLimit);
data.set(RuntimeData::GasLimit, _ext.currentBlock.gasLimit); m_data.set(RuntimeData::CodeSize, _ext.code.size());
data.set(RuntimeData::CodeSize, _ext.code.size()); m_data.callData = _ext.data.data();
data.callData = _ext.data.data(); m_data.code = _ext.code.data();
data.code = _ext.code.data();
ExecutionEngine engine;
auto env = reinterpret_cast<Env*>(&_ext); auto env = reinterpret_cast<Env*>(&_ext);
auto exitCode = engine.run(_ext.code, &data, env); auto exitCode = m_engine.run(_ext.code, &m_data, env);
switch (exitCode) switch (exitCode)
{ {
case ReturnCode::BadJumpDestination: case ReturnCode::BadJumpDestination:
@ -49,9 +46,8 @@ bytesConstRef JitVM::go(ExtVMFace& _ext, OnOpFunc const&, uint64_t)
break; break;
} }
m_gas = llvm2eth(data.elems[RuntimeData::Gas]); m_gas = llvm2eth(m_data.elems[RuntimeData::Gas]);
m_output = std::move(engine.returnData); return {m_engine.returnData.data(), m_engine.returnData.size()}; // TODO: This all bytesConstRef is problematic, review.
return {m_output.data(), m_output.size()}; // TODO: This all bytesConstRef stuff sucks
} }
} }

4
libevmjit-cpp/JitVM.h

@ -1,6 +1,7 @@
#pragma once #pragma once
#include <libevm/VMFace.h> #include <libevm/VMFace.h>
#include <evmjit/libevmjit/ExecutionEngine.h>
namespace dev namespace dev
{ {
@ -18,7 +19,8 @@ private:
friend class VMFactory; friend class VMFactory;
explicit JitVM(u256 _gas = 0) : VMFace(_gas) {} explicit JitVM(u256 _gas = 0) : VMFace(_gas) {}
bytes m_output; jit::RuntimeData m_data;
jit::ExecutionEngine m_engine;
}; };

Loading…
Cancel
Save