401 lines
20 KiB
C#
401 lines
20 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 23:
|
|
short findex1 = (short)((GlobalMemory.MethodArea.MethodBuffer[this._mThread.PC]));
|
|
Float fload = new Float();
|
|
if (this._mThread.currentFrame.LocalVariables[findex1] != null)
|
|
{
|
|
if (this._mThread.currentFrame.LocalVariables[findex1] is Float)
|
|
{
|
|
fload.mValue = ((Float)this._mThread.currentFrame.LocalVariables[findex1]).mValue;
|
|
this._mThread.currentFrame.OpStack.Push(fload);
|
|
}
|
|
}
|
|
this._mThread.PC++;
|
|
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 36:
|
|
if (this._mThread.currentFrame.LocalVariables[2] != null)
|
|
{
|
|
if (this._mThread.currentFrame.LocalVariables[2] is Float)
|
|
{
|
|
Float newfloat = new Float();
|
|
newfloat.mValue = ((Float)this._mThread.currentFrame.LocalVariables[2]).mValue;
|
|
this._mThread.currentFrame.OpStack.Push(newfloat);
|
|
}
|
|
}
|
|
result = true;
|
|
break;
|
|
case 37:
|
|
if (this._mThread.currentFrame.LocalVariables[3] != null)
|
|
{
|
|
if (this._mThread.currentFrame.LocalVariables[3] is Float)
|
|
{
|
|
Float newfloat = new Float();
|
|
newfloat.mValue = ((Float)this._mThread.currentFrame.LocalVariables[3]).mValue;
|
|
this._mThread.currentFrame.OpStack.Push(newfloat);
|
|
}
|
|
}
|
|
result = true;
|
|
break;
|
|
case 56:
|
|
short findex = (short)((GlobalMemory.MethodArea.MethodBuffer[this._mThread.PC] ));
|
|
BaseType fstor = this._mThread.currentFrame.OpStack.Pop();
|
|
if (fstor is Float)
|
|
{
|
|
this._mThread.currentFrame.LocalVariables[findex] = (Float)fstor;
|
|
}
|
|
this._mThread.PC++;
|
|
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 69:
|
|
baset = this._mThread.currentFrame.OpStack.Pop();
|
|
if (baset is Float)
|
|
{
|
|
this._mThread.currentFrame.LocalVariables[2] = (Float)baset;
|
|
}
|
|
result = true;
|
|
break;
|
|
case 70:
|
|
baset = this._mThread.currentFrame.OpStack.Pop();
|
|
if (baset is Float)
|
|
{
|
|
this._mThread.currentFrame.LocalVariables[3] = (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 102:
|
|
BaseType bsf2 = this._mThread.currentFrame.OpStack.Pop();
|
|
BaseType bsf1 = this._mThread.currentFrame.OpStack.Pop();
|
|
if (bsf1 is Float && bsf2 is Float)
|
|
{
|
|
Float resf = new Float();
|
|
resf.mValue = ((Float)bsf1).mValue - ((Float)bsf2).mValue;
|
|
this._mThread.currentFrame.OpStack.Push(resf);
|
|
}
|
|
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 149:
|
|
BaseType flcom2 = this._mThread.currentFrame.OpStack.Pop();
|
|
BaseType flcom1 = this._mThread.currentFrame.OpStack.Pop();
|
|
if (flcom1 is Float && flcom2 is Float)
|
|
{
|
|
Int compres = new Int();
|
|
if (((Float)flcom1).mValue < ((Float)flcom2).mValue)
|
|
{
|
|
compres.mValue = -1;
|
|
}
|
|
else if (((Float)flcom1).mValue > ((Float)flcom2).mValue)
|
|
{
|
|
compres.mValue = 1;
|
|
}
|
|
else
|
|
{
|
|
compres.mValue = 0;
|
|
}
|
|
this._mThread.currentFrame.OpStack.Push(compres);
|
|
}
|
|
result = true;
|
|
break;
|
|
case 158:
|
|
short compareoffset1 = (short)((GlobalMemory.MethodArea.MethodBuffer[this._mThread.PC] << 8) + GlobalMemory.MethodArea.MethodBuffer[this._mThread.PC + 1]);
|
|
BaseType comp1 = this._mThread.currentFrame.OpStack.Pop();
|
|
if (comp1 is Int)
|
|
{
|
|
if (((Int)comp1).mValue <= 0)
|
|
{
|
|
this._mThread.PC += -1 + compareoffset1;
|
|
}
|
|
else
|
|
{
|
|
this._mThread.PC += 2;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
this._mThread.PC += 2;
|
|
}
|
|
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;
|
|
}
|
|
}
|
|
}
|
|
}
|