mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-22 04:36:42 +00:00
Move some data from stack to JitVM object to save stack space.
This commit is contained in:
parent
6e318f8816
commit
45fb3f5625
2 changed files with 22 additions and 24 deletions
|
|
@ -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
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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…
Reference in a new issue