void Expression()
{
_stack.Clear();
GetResult();
int dst = _resultVarIndex;
while ((_opCode = ReadByte()) != 0xFF)
{
switch (_opCode & 0x1F)
{
case 1:
// var
_stack.Push(GetVarOrDirectWord(OpCodeParameter.Param1));
break;
case 2:
// add
{
var i = _stack.Pop();
_stack.Push(i + _stack.Pop());
}
break;
case 3:
// sub
{
var i = _stack.Pop();
_stack.Push(_stack.Pop() - i);
}
break;
case 4:
// mul
{
var i = _stack.Pop();
_stack.Push(i * _stack.Pop());
}
break;
case 5:
// div
{
var i = _stack.Pop();
_stack.Push(_stack.Pop() / i);
}
break;
case 6:
// normal opcode
{
_opCode = ReadByte();
ExecuteOpCode(_opCode);
_stack.Push(Variables[0]);
}
break;
default:
throw new NotImplementedException();
}
}
_resultVarIndex = dst;
SetResult(_stack.Pop());
}
}