You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
116 lines
3.0 KiB
116 lines
3.0 KiB
#include "VirtualMachine.h"
|
|
using namespace std;
|
|
using namespace eth;
|
|
|
|
VirtualMachine::VirtualMachine()
|
|
{
|
|
}
|
|
|
|
VirtualMachine::~VirtualMachine()
|
|
{
|
|
}
|
|
|
|
|
|
void VirtualMachine::go()
|
|
{
|
|
bool stopped = false;
|
|
while (!stopped)
|
|
{
|
|
auto rawInst = m_memory[m_pc];
|
|
if (rawInst > 0xff)
|
|
throw BadInstruction();
|
|
Instruction inst = (Instruction)(uint8_t)rawInst;
|
|
|
|
auto require = [&](uint _n)
|
|
{
|
|
if (m_stack.size() < _n)
|
|
throw StackTooSmall(_n, m_stack.size());
|
|
};
|
|
|
|
switch (inst)
|
|
{
|
|
case Instruction::ADD:
|
|
//pops two items and pushes S[-1] + S[-2] mod 2^256.
|
|
require(2);
|
|
m_stack[m_stack.size() - 2] += m_stack.back();
|
|
m_stack.pop_back();
|
|
case Instruction::MUL:
|
|
//pops two items and pushes S[-1] * S[-2] mod 2^256.
|
|
require(2);
|
|
m_stack[m_stack.size() - 2] *= m_stack.back();
|
|
m_stack.pop_back();
|
|
case Instruction::SUB:
|
|
require(2);
|
|
m_stack[m_stack.size() - 2] = m_stack.back() - m_stack[m_stack.size() - 2];
|
|
m_stack.pop_back();
|
|
case Instruction::DIV:
|
|
require(2);
|
|
m_stack[m_stack.size() - 2] = m_stack.back() / m_stack[m_stack.size() - 2];
|
|
m_stack.pop_back();
|
|
case Instruction::SDIV:
|
|
require(2);
|
|
(s256&)m_stack[m_stack.size() - 2] = (s256&)m_stack.back() / (s256&)m_stack[m_stack.size() - 2];
|
|
m_stack.pop_back();
|
|
case Instruction::MOD:
|
|
require(2);
|
|
m_stack[m_stack.size() - 2] = m_stack.back() % m_stack[m_stack.size() - 2];
|
|
m_stack.pop_back();
|
|
case Instruction::SMOD:
|
|
require(2);
|
|
(s256&)m_stack[m_stack.size() - 2] = (s256&)m_stack.back() % (s256&)m_stack[m_stack.size() - 2];
|
|
m_stack.pop_back();
|
|
case Instruction::EXP:
|
|
require(2);
|
|
// (s256&)m_stack[m_stack.size() - 2] = pow(m_stack.back(), m_stack[m_stack.size() - 2]);
|
|
// m_stack.pop_back();
|
|
case Instruction::NEG:
|
|
case Instruction::LT:
|
|
case Instruction::LE:
|
|
case Instruction::GT:
|
|
case Instruction::GE:
|
|
case Instruction::EQ:
|
|
case Instruction::NOT:
|
|
case Instruction::MYADDRESS:
|
|
case Instruction::MYCREATOR:
|
|
case Instruction::TXSENDER:
|
|
case Instruction::TXVALUE:
|
|
case Instruction::TXFEE:
|
|
case Instruction::TXDATAN:
|
|
case Instruction::TXDATA:
|
|
case Instruction::BLK_PREVHASH:
|
|
case Instruction::BLK_COINBASE:
|
|
case Instruction::BLK_TIMESTAMP:
|
|
case Instruction::BLK_NUMBER:
|
|
case Instruction::BLK_DIFFICULTY:
|
|
case Instruction::SHA256:
|
|
case Instruction::RIPEMD160:
|
|
case Instruction::ECMUL:
|
|
case Instruction::ECADD:
|
|
case Instruction::ECSIGN:
|
|
case Instruction::ECRECOVER:
|
|
case Instruction::ECVALID:
|
|
case Instruction::PUSH:
|
|
case Instruction::POP:
|
|
case Instruction::DUP:
|
|
case Instruction::DUPN:
|
|
case Instruction::SWAP:
|
|
case Instruction::SWAPN:
|
|
case Instruction::LOAD:
|
|
case Instruction::STORE:
|
|
case Instruction::JMP:
|
|
case Instruction::JMPI:
|
|
case Instruction::IND:
|
|
case Instruction::EXTRO:
|
|
case Instruction::BALANCE:
|
|
case Instruction::MKTX:
|
|
break;
|
|
case Instruction::SUICIDE:
|
|
// TODO: Suicide...
|
|
case Instruction::STOP:
|
|
// TODO: Cleanups...
|
|
return;
|
|
default:
|
|
throw BadInstruction();
|
|
}
|
|
}
|
|
}
|
|
|