OpenSimMirror/OpenSim.Scripting.EmbeddedJVM/InterpreterLogic.cs

284 lines
14 KiB
C#

using System;
using System.Collections.Generic;
using System.Text;
using OpenSim.Scripting.EmbeddedJVM.Types;
using OpenSim.Scripting.EmbeddedJVM.Types.PrimitiveTypes;
namespace OpenSim.Scripting.EmbeddedJVM
{
partial class Thread
{
private partial class Interpreter
{
private bool IsLogicOpCode(byte opcode)
{
bool result = false;
switch (opcode)
{
case 2:
Int m_int= new Int();
m_int.mValue = -1;
this._mThread.currentFrame.OpStack.Push(m_int);
result = true;
break;
case 3:
m_int= new Int();
m_int.mValue = 0;
this._mThread.currentFrame.OpStack.Push(m_int);
result = true;
break;
case 4:
m_int = new Int();
m_int.mValue = 1;
this._mThread.currentFrame.OpStack.Push(m_int);
result = true;
break;
case 5:
m_int = new Int();
m_int.mValue = 2;
this._mThread.currentFrame.OpStack.Push(m_int);
result = true;
break;
case 6:
m_int = new Int();
m_int.mValue = 3;
this._mThread.currentFrame.OpStack.Push(m_int);
break;
case 7:
m_int = new Int();
m_int.mValue = 4;
this._mThread.currentFrame.OpStack.Push(m_int);
result = true;
break;
case 8:
m_int = new Int();
m_int.mValue = 5;
this._mThread.currentFrame.OpStack.Push(m_int);
result = true;
break;
case 11:
Float m_float = new Float();
m_float.mValue = 0.0f;
this._mThread.currentFrame.OpStack.Push(m_float);
result = true;
break;
case 12:
m_float = new Float();
m_float.mValue = 1.0f;
this._mThread.currentFrame.OpStack.Push(m_float);
result = true;
break;
case 13:
m_float = new Float();
m_float.mValue = 2.0f;
this._mThread.currentFrame.OpStack.Push(m_float);
result = true;
break;
case 16:
int pushvalue = (int)GlobalMemory.MethodArea.MethodBuffer[this._mThread.PC];
Int pushInt = new Int();
pushInt.mValue = pushvalue;
this._mThread.currentFrame.OpStack.Push(pushInt);
this._mThread.PC++;
result = true;
break;
case 17:
short pushvalue2 = (short)((GlobalMemory.MethodArea.MethodBuffer[this._mThread.PC] << 8) + GlobalMemory.MethodArea.MethodBuffer[this._mThread.PC + 1]);
Int pushInt2 = new Int();
pushInt2.mValue = pushvalue2;
this._mThread.currentFrame.OpStack.Push(pushInt2);
this._mThread.PC += 2;
result = true;
break;
case 26:
if (this._mThread.currentFrame.LocalVariables[0] != null)
{
if (this._mThread.currentFrame.LocalVariables[0] is Int)
{
Int newInt = new Int();
newInt.mValue = ((Int)this._mThread.currentFrame.LocalVariables[0]).mValue;
this._mThread.currentFrame.OpStack.Push(newInt);
}
}
result = true;
break;
case 27:
if (this._mThread.currentFrame.LocalVariables[1] != null)
{
if (this._mThread.currentFrame.LocalVariables[1] is Int)
{
Int newInt = new Int();
newInt.mValue = ((Int)this._mThread.currentFrame.LocalVariables[1]).mValue;
this._mThread.currentFrame.OpStack.Push(newInt);
}
}
result = true;
break;
case 34:
if (this._mThread.currentFrame.LocalVariables[0] != null)
{
if (this._mThread.currentFrame.LocalVariables[0] is Float)
{
Float newfloat = new Float();
newfloat.mValue = ((Float)this._mThread.currentFrame.LocalVariables[0]).mValue;
this._mThread.currentFrame.OpStack.Push(newfloat);
}
}
result = true;
break;
case 35:
if (this._mThread.currentFrame.LocalVariables[1] != null)
{
if (this._mThread.currentFrame.LocalVariables[1] is Float)
{
Float newfloat = new Float();
newfloat.mValue = ((Float)this._mThread.currentFrame.LocalVariables[1]).mValue;
this._mThread.currentFrame.OpStack.Push(newfloat);
}
}
result = true;
break;
case 59:
BaseType baset = this._mThread.currentFrame.OpStack.Pop();
if (baset is Int)
{
this._mThread.currentFrame.LocalVariables[0] = (Int)baset;
}
result = true;
break;
case 60:
baset = this._mThread.currentFrame.OpStack.Pop();
if (baset is Int)
{
this._mThread.currentFrame.LocalVariables[1] = (Int)baset;
}
result = true;
break;
case 67:
baset = this._mThread.currentFrame.OpStack.Pop();
if (baset is Float)
{
this._mThread.currentFrame.LocalVariables[0] = (Float)baset;
}
result = true;
break;
case 68:
baset = this._mThread.currentFrame.OpStack.Pop();
if (baset is Float)
{
this._mThread.currentFrame.LocalVariables[1] = (Float)baset;
}
result = true;
break;
case 87:
this._mThread.currentFrame.OpStack.Pop();
result = true;
break;
case 98:
BaseType bf2 = this._mThread.currentFrame.OpStack.Pop();
BaseType bf1 = this._mThread.currentFrame.OpStack.Pop();
if (bf1 is Float && bf2 is Float)
{
Float nflt = new Float();
nflt.mValue = ((Float)bf1).mValue + ((Float)bf2).mValue;
this._mThread.currentFrame.OpStack.Push(nflt);
}
result = true;
break;
case 104: //check the order of the two values off the stack is correct
BaseType bs2 = this._mThread.currentFrame.OpStack.Pop();
BaseType bs1 = this._mThread.currentFrame.OpStack.Pop();
if (bs1 is Int && bs2 is Int)
{
Int nInt = new Int();
nInt.mValue = ((Int)bs1).mValue * ((Int)bs2).mValue;
this._mThread.currentFrame.OpStack.Push(nInt);
}
result = true;
break;
case 132:
if (this._mThread.currentFrame.LocalVariables[GlobalMemory.MethodArea.MethodBuffer[this._mThread.PC]] != null)
{
if (this._mThread.currentFrame.LocalVariables[GlobalMemory.MethodArea.MethodBuffer[this._mThread.PC]] is Int)
{
((Int)this._mThread.currentFrame.LocalVariables[GlobalMemory.MethodArea.MethodBuffer[this._mThread.PC]]).mValue += (sbyte) GlobalMemory.MethodArea.MethodBuffer[this._mThread.PC + 1];
}
}
this._mThread.PC += 2;
result = true;
break;
case 139:
BaseType conv1 = this._mThread.currentFrame.OpStack.Pop();
if (conv1 is Float)
{
Int newconv = new Int();
newconv.mValue = (int)((Float)conv1).mValue;
this._mThread.currentFrame.OpStack.Push(newconv);
}
result = true;
break;
case 162:
short compareoffset = (short)((GlobalMemory.MethodArea.MethodBuffer[this._mThread.PC] << 8) + GlobalMemory.MethodArea.MethodBuffer[this._mThread.PC + 1]);
BaseType bc2 = this._mThread.currentFrame.OpStack.Pop();
BaseType bc1 = this._mThread.currentFrame.OpStack.Pop();
if (bc1 is Int && bc2 is Int)
{
Console.WriteLine("comparing " + ((Int)bc1).mValue + " and " + ((Int)bc2).mValue);
if (((Int)bc1).mValue >= ((Int)bc2).mValue)
{
Console.WriteLine("branch compare true , offset is " +compareoffset);
Console.WriteLine("current PC is " + this._mThread.PC);
this._mThread.PC += -1 + compareoffset;
Console.WriteLine("new PC is " + this._mThread.PC);
}
else
{
Console.WriteLine("branch compare false");
this._mThread.PC += 2;
}
}
else
{
this._mThread.PC += 2;
}
result = true;
break;
case 164:
short compareloffset = (short)((GlobalMemory.MethodArea.MethodBuffer[this._mThread.PC] << 8) + GlobalMemory.MethodArea.MethodBuffer[this._mThread.PC + 1]);
BaseType bcl2 = this._mThread.currentFrame.OpStack.Pop();
BaseType bcl1 = this._mThread.currentFrame.OpStack.Pop();
if (bcl1 is Int && bcl2 is Int)
{
Console.WriteLine("comparing " + ((Int)bcl1).mValue + " and " + ((Int)bcl2).mValue);
if (((Int)bcl1).mValue <= ((Int)bcl2).mValue)
{
Console.WriteLine("branch compare true , offset is " + compareloffset);
Console.WriteLine("current PC is " + this._mThread.PC);
this._mThread.PC += -1 + compareloffset;
Console.WriteLine("new PC is " + this._mThread.PC);
}
else
{
Console.WriteLine("branch compare false");
this._mThread.PC += 2;
}
}
else
{
this._mThread.PC += 2;
}
result = true;
break;
case 167:
short offset = (short)((GlobalMemory.MethodArea.MethodBuffer[this._mThread.PC] << 8) + GlobalMemory.MethodArea.MethodBuffer[this._mThread.PC+1]);
this._mThread.PC += -1 + offset;
result = true;
break;
}
return result;
}
}
}
}