Browse Source

Theiretical fix for #525, except GCC can't quite manage it.

cl-refactor
Gav Wood 10 years ago
parent
commit
fa6cb31785
  1. 18
      libevm/VM.h

18
libevm/VM.h

@ -71,8 +71,9 @@ public:
template <class Ext> template <class Ext>
bytesConstRef go(Ext& _ext, OnOpFunc const& _onOp = OnOpFunc(), uint64_t _steps = (uint64_t)-1); bytesConstRef go(Ext& _ext, OnOpFunc const& _onOp = OnOpFunc(), uint64_t _steps = (uint64_t)-1);
void require(u256 _n) { if (m_stack.size() < _n) BOOST_THROW_EXCEPTION(StackTooSmall() << RequirementError((bigint)_n, (bigint)m_stack.size())); } void require(u256 _n) { if (m_stack.size() < _n) { if (m_onFail) m_onFail(); BOOST_THROW_EXCEPTION(StackTooSmall() << RequirementError((bigint)_n, (bigint)m_stack.size())); } }
void requireMem(unsigned _n) { if (m_temp.size() < _n) { m_temp.resize(_n); } } void requireMem(unsigned _n) { if (m_temp.size() < _n) { m_temp.resize(_n); } }
u256 gas() const { return m_gas; } u256 gas() const { return m_gas; }
u256 curPC() const { return m_curPC; } u256 curPC() const { return m_curPC; }
@ -85,6 +86,7 @@ private:
bytes m_temp; bytes m_temp;
u256s m_stack; u256s m_stack;
std::set<u256> m_jumpDests; std::set<u256> m_jumpDests;
std::function<void()> m_onFail;
}; };
} }
@ -129,6 +131,15 @@ template <class Ext> dev::bytesConstRef dev::eth::VM::go(Ext& _ext, OnOpFunc con
// FEES... // FEES...
bigint runGas = c_stepGas; bigint runGas = c_stepGas;
bigint newTempSize = m_temp.size(); bigint newTempSize = m_temp.size();
auto onOperation = [&]()
{
if (_onOp)
_onOp(osteps - _steps - 1, inst, newTempSize > m_temp.size() ? (newTempSize - m_temp.size()) / 32 : bigint(0), runGas, this, &_ext);
};
// should work, but just seems to result in immediate errorless exit on initial execution. yeah. weird.
//m_onFail = std::function<void()>(onOperation);
switch (inst) switch (inst)
{ {
case Instruction::STOP: case Instruction::STOP:
@ -355,8 +366,9 @@ template <class Ext> dev::bytesConstRef dev::eth::VM::go(Ext& _ext, OnOpFunc con
if (newTempSize > m_temp.size()) if (newTempSize > m_temp.size())
runGas += c_memoryGas * (newTempSize - m_temp.size()) / 32; runGas += c_memoryGas * (newTempSize - m_temp.size()) / 32;
if (_onOp) onOperation();
_onOp(osteps - _steps - 1, inst, newTempSize > m_temp.size() ? (newTempSize - m_temp.size()) / 32 : bigint(0), runGas, this, &_ext); // if (_onOp)
// _onOp(osteps - _steps - 1, inst, newTempSize > m_temp.size() ? (newTempSize - m_temp.size()) / 32 : bigint(0), runGas, this, &_ext);
if (m_gas < runGas) if (m_gas < runGas)
{ {

Loading…
Cancel
Save