Browse Source

VM refactor: place CALL params on stack (reduces OS stack usage by ~30%).

cl-refactor
Paweł Bylica 10 years ago
parent
commit
32fe8b893d
  1. 30
      libevm/VM.cpp

30
libevm/VM.cpp

@ -186,8 +186,6 @@ bytesConstRef VM::execImpl(u256& io_gas, ExtVMFace& _ext, OnOpFunc const& _onOp)
{ {
m_stack.reserve((unsigned)c_stackLimit); m_stack.reserve((unsigned)c_stackLimit);
unique_ptr<CallParameters> callParams;
for (size_t i = 0; i < _ext.code.size(); ++i) for (size_t i = 0; i < _ext.code.size(); ++i)
{ {
if (_ext.code[i] == (byte)Instruction::JUMPDEST) if (_ext.code[i] == (byte)Instruction::JUMPDEST)
@ -612,16 +610,14 @@ bytesConstRef VM::execImpl(u256& io_gas, ExtVMFace& _ext, OnOpFunc const& _onOp)
case Instruction::CALL: case Instruction::CALL:
case Instruction::CALLCODE: case Instruction::CALLCODE:
{ {
if (!callParams) CallParameters callParams;
callParams.reset(new CallParameters); callParams.gas = m_stack.back();
callParams->gas = m_stack.back();
if (m_stack[m_stack.size() - 3] > 0) if (m_stack[m_stack.size() - 3] > 0)
callParams->gas += c_callStipend; callParams.gas += c_callStipend;
m_stack.pop_back(); m_stack.pop_back();
callParams->codeAddress = asAddress(m_stack.back()); callParams.codeAddress = asAddress(m_stack.back());
m_stack.pop_back(); m_stack.pop_back();
callParams->value = m_stack.back(); callParams.value = m_stack.back();
m_stack.pop_back(); m_stack.pop_back();
unsigned inOff = (unsigned)m_stack.back(); unsigned inOff = (unsigned)m_stack.back();
@ -633,19 +629,19 @@ bytesConstRef VM::execImpl(u256& io_gas, ExtVMFace& _ext, OnOpFunc const& _onOp)
unsigned outSize = (unsigned)m_stack.back(); unsigned outSize = (unsigned)m_stack.back();
m_stack.pop_back(); m_stack.pop_back();
if (_ext.balance(_ext.myAddress) >= callParams->value && _ext.depth < 1024) if (_ext.balance(_ext.myAddress) >= callParams.value && _ext.depth < 1024)
{ {
callParams->onOp = _onOp; callParams.onOp = _onOp;
callParams->senderAddress = _ext.myAddress; callParams.senderAddress = _ext.myAddress;
callParams->receiveAddress = inst == Instruction::CALL ? callParams->codeAddress : callParams->senderAddress; callParams.receiveAddress = inst == Instruction::CALL ? callParams.codeAddress : callParams.senderAddress;
callParams->data = bytesConstRef(m_temp.data() + inOff, inSize); callParams.data = bytesConstRef(m_temp.data() + inOff, inSize);
callParams->out = bytesRef(m_temp.data() + outOff, outSize); callParams.out = bytesRef(m_temp.data() + outOff, outSize);
m_stack.push_back(_ext.call(*callParams)); m_stack.push_back(_ext.call(callParams));
} }
else else
m_stack.push_back(0); m_stack.push_back(0);
io_gas += callParams->gas; io_gas += callParams.gas;
break; break;
} }
case Instruction::RETURN: case Instruction::RETURN:

Loading…
Cancel
Save