зеркало из https://github.com/mozilla/gecko-dev.git
Another small modifications to Interpreter to make the following patches
smaller: replacing all brek in the main switch of the interpreter with "continue Loop"
This commit is contained in:
Родитель
945cda1547
Коммит
34e9dc56b7
|
@ -2278,7 +2278,7 @@ public class Interpreter
|
||||||
valBln = ScriptRuntime.cmp_LE(rhs, lhs);
|
valBln = ScriptRuntime.cmp_LE(rhs, lhs);
|
||||||
}
|
}
|
||||||
stack[stackTop] = valBln ? Boolean.TRUE : Boolean.FALSE;
|
stack[stackTop] = valBln ? Boolean.TRUE : Boolean.FALSE;
|
||||||
break;
|
continue Loop;
|
||||||
}
|
}
|
||||||
case Token.LE : {
|
case Token.LE : {
|
||||||
--stackTop;
|
--stackTop;
|
||||||
|
@ -2293,7 +2293,7 @@ public class Interpreter
|
||||||
valBln = ScriptRuntime.cmp_LE(lhs, rhs);
|
valBln = ScriptRuntime.cmp_LE(lhs, rhs);
|
||||||
}
|
}
|
||||||
stack[stackTop] = valBln ? Boolean.TRUE : Boolean.FALSE;
|
stack[stackTop] = valBln ? Boolean.TRUE : Boolean.FALSE;
|
||||||
break;
|
continue Loop;
|
||||||
}
|
}
|
||||||
case Token.GT : {
|
case Token.GT : {
|
||||||
--stackTop;
|
--stackTop;
|
||||||
|
@ -2308,7 +2308,7 @@ public class Interpreter
|
||||||
valBln = ScriptRuntime.cmp_LT(rhs, lhs);
|
valBln = ScriptRuntime.cmp_LT(rhs, lhs);
|
||||||
}
|
}
|
||||||
stack[stackTop] = valBln ? Boolean.TRUE : Boolean.FALSE;
|
stack[stackTop] = valBln ? Boolean.TRUE : Boolean.FALSE;
|
||||||
break;
|
continue Loop;
|
||||||
}
|
}
|
||||||
case Token.LT : {
|
case Token.LT : {
|
||||||
--stackTop;
|
--stackTop;
|
||||||
|
@ -2323,7 +2323,7 @@ public class Interpreter
|
||||||
valBln = ScriptRuntime.cmp_LT(lhs, rhs);
|
valBln = ScriptRuntime.cmp_LT(lhs, rhs);
|
||||||
}
|
}
|
||||||
stack[stackTop] = valBln ? Boolean.TRUE : Boolean.FALSE;
|
stack[stackTop] = valBln ? Boolean.TRUE : Boolean.FALSE;
|
||||||
break;
|
continue Loop;
|
||||||
}
|
}
|
||||||
case Token.IN : {
|
case Token.IN : {
|
||||||
Object rhs = stack[stackTop];
|
Object rhs = stack[stackTop];
|
||||||
|
@ -2333,7 +2333,7 @@ public class Interpreter
|
||||||
if (lhs == DBL_MRK) lhs = doubleWrap(sDbl[stackTop]);
|
if (lhs == DBL_MRK) lhs = doubleWrap(sDbl[stackTop]);
|
||||||
boolean valBln = ScriptRuntime.in(lhs, rhs, scope);
|
boolean valBln = ScriptRuntime.in(lhs, rhs, scope);
|
||||||
stack[stackTop] = valBln ? Boolean.TRUE : Boolean.FALSE;
|
stack[stackTop] = valBln ? Boolean.TRUE : Boolean.FALSE;
|
||||||
break;
|
continue Loop;
|
||||||
}
|
}
|
||||||
case Token.INSTANCEOF : {
|
case Token.INSTANCEOF : {
|
||||||
Object rhs = stack[stackTop];
|
Object rhs = stack[stackTop];
|
||||||
|
@ -2343,31 +2343,31 @@ public class Interpreter
|
||||||
if (lhs == DBL_MRK) lhs = doubleWrap(sDbl[stackTop]);
|
if (lhs == DBL_MRK) lhs = doubleWrap(sDbl[stackTop]);
|
||||||
boolean valBln = ScriptRuntime.instanceOf(lhs, rhs, scope);
|
boolean valBln = ScriptRuntime.instanceOf(lhs, rhs, scope);
|
||||||
stack[stackTop] = valBln ? Boolean.TRUE : Boolean.FALSE;
|
stack[stackTop] = valBln ? Boolean.TRUE : Boolean.FALSE;
|
||||||
break;
|
continue Loop;
|
||||||
}
|
}
|
||||||
case Token.EQ : {
|
case Token.EQ : {
|
||||||
--stackTop;
|
--stackTop;
|
||||||
boolean valBln = do_eq(stack, sDbl, stackTop);
|
boolean valBln = do_eq(stack, sDbl, stackTop);
|
||||||
stack[stackTop] = valBln ? Boolean.TRUE : Boolean.FALSE;
|
stack[stackTop] = valBln ? Boolean.TRUE : Boolean.FALSE;
|
||||||
break;
|
continue Loop;
|
||||||
}
|
}
|
||||||
case Token.NE : {
|
case Token.NE : {
|
||||||
--stackTop;
|
--stackTop;
|
||||||
boolean valBln = !do_eq(stack, sDbl, stackTop);
|
boolean valBln = !do_eq(stack, sDbl, stackTop);
|
||||||
stack[stackTop] = valBln ? Boolean.TRUE : Boolean.FALSE;
|
stack[stackTop] = valBln ? Boolean.TRUE : Boolean.FALSE;
|
||||||
break;
|
continue Loop;
|
||||||
}
|
}
|
||||||
case Token.SHEQ : {
|
case Token.SHEQ : {
|
||||||
--stackTop;
|
--stackTop;
|
||||||
boolean valBln = do_sheq(stack, sDbl, stackTop);
|
boolean valBln = do_sheq(stack, sDbl, stackTop);
|
||||||
stack[stackTop] = valBln ? Boolean.TRUE : Boolean.FALSE;
|
stack[stackTop] = valBln ? Boolean.TRUE : Boolean.FALSE;
|
||||||
break;
|
continue Loop;
|
||||||
}
|
}
|
||||||
case Token.SHNE : {
|
case Token.SHNE : {
|
||||||
--stackTop;
|
--stackTop;
|
||||||
boolean valBln = !do_sheq(stack, sDbl, stackTop);
|
boolean valBln = !do_sheq(stack, sDbl, stackTop);
|
||||||
stack[stackTop] = valBln ? Boolean.TRUE : Boolean.FALSE;
|
stack[stackTop] = valBln ? Boolean.TRUE : Boolean.FALSE;
|
||||||
break;
|
continue Loop;
|
||||||
}
|
}
|
||||||
case Token.IFNE : {
|
case Token.IFNE : {
|
||||||
boolean valBln = stack_boolean(stack, sDbl, stackTop);
|
boolean valBln = stack_boolean(stack, sDbl, stackTop);
|
||||||
|
@ -2384,7 +2384,7 @@ public class Interpreter
|
||||||
continue Loop;
|
continue Loop;
|
||||||
}
|
}
|
||||||
pc += 2;
|
pc += 2;
|
||||||
break;
|
continue Loop;
|
||||||
}
|
}
|
||||||
case Token.IFEQ : {
|
case Token.IFEQ : {
|
||||||
boolean valBln = stack_boolean(stack, sDbl, stackTop);
|
boolean valBln = stack_boolean(stack, sDbl, stackTop);
|
||||||
|
@ -2401,7 +2401,7 @@ public class Interpreter
|
||||||
continue Loop;
|
continue Loop;
|
||||||
}
|
}
|
||||||
pc += 2;
|
pc += 2;
|
||||||
break;
|
continue Loop;
|
||||||
}
|
}
|
||||||
case Icode_IFEQ_POP : {
|
case Icode_IFEQ_POP : {
|
||||||
boolean valBln = stack_boolean(stack, sDbl, stackTop);
|
boolean valBln = stack_boolean(stack, sDbl, stackTop);
|
||||||
|
@ -2419,7 +2419,7 @@ public class Interpreter
|
||||||
continue Loop;
|
continue Loop;
|
||||||
}
|
}
|
||||||
pc += 2;
|
pc += 2;
|
||||||
break;
|
continue Loop;
|
||||||
}
|
}
|
||||||
case Token.GOTO :
|
case Token.GOTO :
|
||||||
if (instructionThreshold != 0) {
|
if (instructionThreshold != 0) {
|
||||||
|
@ -2470,17 +2470,17 @@ public class Interpreter
|
||||||
case Token.POP :
|
case Token.POP :
|
||||||
stack[stackTop] = null;
|
stack[stackTop] = null;
|
||||||
stackTop--;
|
stackTop--;
|
||||||
break;
|
continue Loop;
|
||||||
case Icode_DUP :
|
case Icode_DUP :
|
||||||
stack[stackTop + 1] = stack[stackTop];
|
stack[stackTop + 1] = stack[stackTop];
|
||||||
sDbl[stackTop + 1] = sDbl[stackTop];
|
sDbl[stackTop + 1] = sDbl[stackTop];
|
||||||
stackTop++;
|
stackTop++;
|
||||||
break;
|
continue Loop;
|
||||||
case Icode_DUPSECOND : {
|
case Icode_DUPSECOND : {
|
||||||
stack[stackTop + 1] = stack[stackTop - 1];
|
stack[stackTop + 1] = stack[stackTop - 1];
|
||||||
sDbl[stackTop + 1] = sDbl[stackTop - 1];
|
sDbl[stackTop + 1] = sDbl[stackTop - 1];
|
||||||
stackTop++;
|
stackTop++;
|
||||||
break;
|
continue Loop;
|
||||||
}
|
}
|
||||||
case Icode_SWAP : {
|
case Icode_SWAP : {
|
||||||
Object o = stack[stackTop];
|
Object o = stack[stackTop];
|
||||||
|
@ -2489,14 +2489,14 @@ public class Interpreter
|
||||||
double d = sDbl[stackTop];
|
double d = sDbl[stackTop];
|
||||||
sDbl[stackTop] = sDbl[stackTop - 1];
|
sDbl[stackTop] = sDbl[stackTop - 1];
|
||||||
sDbl[stackTop - 1] = d;
|
sDbl[stackTop - 1] = d;
|
||||||
break;
|
continue Loop;
|
||||||
}
|
}
|
||||||
case Token.POPV :
|
case Token.POPV :
|
||||||
result = stack[stackTop];
|
result = stack[stackTop];
|
||||||
if (result == DBL_MRK) result = doubleWrap(sDbl[stackTop]);
|
if (result == DBL_MRK) result = doubleWrap(sDbl[stackTop]);
|
||||||
stack[stackTop] = null;
|
stack[stackTop] = null;
|
||||||
--stackTop;
|
--stackTop;
|
||||||
break;
|
continue Loop;
|
||||||
case Token.RETURN :
|
case Token.RETURN :
|
||||||
result = stack[stackTop];
|
result = stack[stackTop];
|
||||||
if (result == DBL_MRK) result = doubleWrap(sDbl[stackTop]);
|
if (result == DBL_MRK) result = doubleWrap(sDbl[stackTop]);
|
||||||
|
@ -2511,7 +2511,7 @@ public class Interpreter
|
||||||
int rIntValue = stack_int32(stack, sDbl, stackTop);
|
int rIntValue = stack_int32(stack, sDbl, stackTop);
|
||||||
stack[stackTop] = DBL_MRK;
|
stack[stackTop] = DBL_MRK;
|
||||||
sDbl[stackTop] = ~rIntValue;
|
sDbl[stackTop] = ~rIntValue;
|
||||||
break;
|
continue Loop;
|
||||||
}
|
}
|
||||||
case Token.BITAND : {
|
case Token.BITAND : {
|
||||||
int rIntValue = stack_int32(stack, sDbl, stackTop);
|
int rIntValue = stack_int32(stack, sDbl, stackTop);
|
||||||
|
@ -2519,7 +2519,7 @@ public class Interpreter
|
||||||
int lIntValue = stack_int32(stack, sDbl, stackTop);
|
int lIntValue = stack_int32(stack, sDbl, stackTop);
|
||||||
stack[stackTop] = DBL_MRK;
|
stack[stackTop] = DBL_MRK;
|
||||||
sDbl[stackTop] = lIntValue & rIntValue;
|
sDbl[stackTop] = lIntValue & rIntValue;
|
||||||
break;
|
continue Loop;
|
||||||
}
|
}
|
||||||
case Token.BITOR : {
|
case Token.BITOR : {
|
||||||
int rIntValue = stack_int32(stack, sDbl, stackTop);
|
int rIntValue = stack_int32(stack, sDbl, stackTop);
|
||||||
|
@ -2527,7 +2527,7 @@ public class Interpreter
|
||||||
int lIntValue = stack_int32(stack, sDbl, stackTop);
|
int lIntValue = stack_int32(stack, sDbl, stackTop);
|
||||||
stack[stackTop] = DBL_MRK;
|
stack[stackTop] = DBL_MRK;
|
||||||
sDbl[stackTop] = lIntValue | rIntValue;
|
sDbl[stackTop] = lIntValue | rIntValue;
|
||||||
break;
|
continue Loop;
|
||||||
}
|
}
|
||||||
case Token.BITXOR : {
|
case Token.BITXOR : {
|
||||||
int rIntValue = stack_int32(stack, sDbl, stackTop);
|
int rIntValue = stack_int32(stack, sDbl, stackTop);
|
||||||
|
@ -2535,7 +2535,7 @@ public class Interpreter
|
||||||
int lIntValue = stack_int32(stack, sDbl, stackTop);
|
int lIntValue = stack_int32(stack, sDbl, stackTop);
|
||||||
stack[stackTop] = DBL_MRK;
|
stack[stackTop] = DBL_MRK;
|
||||||
sDbl[stackTop] = lIntValue ^ rIntValue;
|
sDbl[stackTop] = lIntValue ^ rIntValue;
|
||||||
break;
|
continue Loop;
|
||||||
}
|
}
|
||||||
case Token.LSH : {
|
case Token.LSH : {
|
||||||
int rIntValue = stack_int32(stack, sDbl, stackTop);
|
int rIntValue = stack_int32(stack, sDbl, stackTop);
|
||||||
|
@ -2543,7 +2543,7 @@ public class Interpreter
|
||||||
int lIntValue = stack_int32(stack, sDbl, stackTop);
|
int lIntValue = stack_int32(stack, sDbl, stackTop);
|
||||||
stack[stackTop] = DBL_MRK;
|
stack[stackTop] = DBL_MRK;
|
||||||
sDbl[stackTop] = lIntValue << rIntValue;
|
sDbl[stackTop] = lIntValue << rIntValue;
|
||||||
break;
|
continue Loop;
|
||||||
}
|
}
|
||||||
case Token.RSH : {
|
case Token.RSH : {
|
||||||
int rIntValue = stack_int32(stack, sDbl, stackTop);
|
int rIntValue = stack_int32(stack, sDbl, stackTop);
|
||||||
|
@ -2551,7 +2551,7 @@ public class Interpreter
|
||||||
int lIntValue = stack_int32(stack, sDbl, stackTop);
|
int lIntValue = stack_int32(stack, sDbl, stackTop);
|
||||||
stack[stackTop] = DBL_MRK;
|
stack[stackTop] = DBL_MRK;
|
||||||
sDbl[stackTop] = lIntValue >> rIntValue;
|
sDbl[stackTop] = lIntValue >> rIntValue;
|
||||||
break;
|
continue Loop;
|
||||||
}
|
}
|
||||||
case Token.URSH : {
|
case Token.URSH : {
|
||||||
int rIntValue = stack_int32(stack, sDbl, stackTop) & 0x1F;
|
int rIntValue = stack_int32(stack, sDbl, stackTop) & 0x1F;
|
||||||
|
@ -2559,31 +2559,31 @@ public class Interpreter
|
||||||
double lDbl = stack_double(stack, sDbl, stackTop);
|
double lDbl = stack_double(stack, sDbl, stackTop);
|
||||||
stack[stackTop] = DBL_MRK;
|
stack[stackTop] = DBL_MRK;
|
||||||
sDbl[stackTop] = ScriptRuntime.toUint32(lDbl) >>> rIntValue;
|
sDbl[stackTop] = ScriptRuntime.toUint32(lDbl) >>> rIntValue;
|
||||||
break;
|
continue Loop;
|
||||||
}
|
}
|
||||||
case Token.ADD :
|
case Token.ADD :
|
||||||
--stackTop;
|
--stackTop;
|
||||||
do_add(stack, sDbl, stackTop);
|
do_add(stack, sDbl, stackTop);
|
||||||
break;
|
continue Loop;
|
||||||
case Token.SUB : {
|
case Token.SUB : {
|
||||||
double rDbl = stack_double(stack, sDbl, stackTop);
|
double rDbl = stack_double(stack, sDbl, stackTop);
|
||||||
--stackTop;
|
--stackTop;
|
||||||
double lDbl = stack_double(stack, sDbl, stackTop);
|
double lDbl = stack_double(stack, sDbl, stackTop);
|
||||||
stack[stackTop] = DBL_MRK;
|
stack[stackTop] = DBL_MRK;
|
||||||
sDbl[stackTop] = lDbl - rDbl;
|
sDbl[stackTop] = lDbl - rDbl;
|
||||||
break;
|
continue Loop;
|
||||||
}
|
}
|
||||||
case Token.NEG : {
|
case Token.NEG : {
|
||||||
double rDbl = stack_double(stack, sDbl, stackTop);
|
double rDbl = stack_double(stack, sDbl, stackTop);
|
||||||
stack[stackTop] = DBL_MRK;
|
stack[stackTop] = DBL_MRK;
|
||||||
sDbl[stackTop] = -rDbl;
|
sDbl[stackTop] = -rDbl;
|
||||||
break;
|
continue Loop;
|
||||||
}
|
}
|
||||||
case Token.POS : {
|
case Token.POS : {
|
||||||
double rDbl = stack_double(stack, sDbl, stackTop);
|
double rDbl = stack_double(stack, sDbl, stackTop);
|
||||||
stack[stackTop] = DBL_MRK;
|
stack[stackTop] = DBL_MRK;
|
||||||
sDbl[stackTop] = rDbl;
|
sDbl[stackTop] = rDbl;
|
||||||
break;
|
continue Loop;
|
||||||
}
|
}
|
||||||
case Token.MUL : {
|
case Token.MUL : {
|
||||||
double rDbl = stack_double(stack, sDbl, stackTop);
|
double rDbl = stack_double(stack, sDbl, stackTop);
|
||||||
|
@ -2591,7 +2591,7 @@ public class Interpreter
|
||||||
double lDbl = stack_double(stack, sDbl, stackTop);
|
double lDbl = stack_double(stack, sDbl, stackTop);
|
||||||
stack[stackTop] = DBL_MRK;
|
stack[stackTop] = DBL_MRK;
|
||||||
sDbl[stackTop] = lDbl * rDbl;
|
sDbl[stackTop] = lDbl * rDbl;
|
||||||
break;
|
continue Loop;
|
||||||
}
|
}
|
||||||
case Token.DIV : {
|
case Token.DIV : {
|
||||||
double rDbl = stack_double(stack, sDbl, stackTop);
|
double rDbl = stack_double(stack, sDbl, stackTop);
|
||||||
|
@ -2600,7 +2600,7 @@ public class Interpreter
|
||||||
stack[stackTop] = DBL_MRK;
|
stack[stackTop] = DBL_MRK;
|
||||||
// Detect the divide by zero or let Java do it ?
|
// Detect the divide by zero or let Java do it ?
|
||||||
sDbl[stackTop] = lDbl / rDbl;
|
sDbl[stackTop] = lDbl / rDbl;
|
||||||
break;
|
continue Loop;
|
||||||
}
|
}
|
||||||
case Token.MOD : {
|
case Token.MOD : {
|
||||||
double rDbl = stack_double(stack, sDbl, stackTop);
|
double rDbl = stack_double(stack, sDbl, stackTop);
|
||||||
|
@ -2608,18 +2608,18 @@ public class Interpreter
|
||||||
double lDbl = stack_double(stack, sDbl, stackTop);
|
double lDbl = stack_double(stack, sDbl, stackTop);
|
||||||
stack[stackTop] = DBL_MRK;
|
stack[stackTop] = DBL_MRK;
|
||||||
sDbl[stackTop] = lDbl % rDbl;
|
sDbl[stackTop] = lDbl % rDbl;
|
||||||
break;
|
continue Loop;
|
||||||
}
|
}
|
||||||
case Token.NOT : {
|
case Token.NOT : {
|
||||||
stack[stackTop] = stack_boolean(stack, sDbl, stackTop)
|
stack[stackTop] = stack_boolean(stack, sDbl, stackTop)
|
||||||
? Boolean.FALSE : Boolean.TRUE;
|
? Boolean.FALSE : Boolean.TRUE;
|
||||||
break;
|
continue Loop;
|
||||||
}
|
}
|
||||||
case Token.BINDNAME : {
|
case Token.BINDNAME : {
|
||||||
String name = strings[getIndex(iCode, pc)];
|
String name = strings[getIndex(iCode, pc)];
|
||||||
stack[++stackTop] = ScriptRuntime.bind(scope, name);
|
stack[++stackTop] = ScriptRuntime.bind(scope, name);
|
||||||
pc += 2;
|
pc += 2;
|
||||||
break;
|
continue Loop;
|
||||||
}
|
}
|
||||||
case Token.SETNAME : {
|
case Token.SETNAME : {
|
||||||
String name = strings[getIndex(iCode, pc)];
|
String name = strings[getIndex(iCode, pc)];
|
||||||
|
@ -2629,7 +2629,7 @@ public class Interpreter
|
||||||
Scriptable lhs = (Scriptable)stack[stackTop];
|
Scriptable lhs = (Scriptable)stack[stackTop];
|
||||||
stack[stackTop] = ScriptRuntime.setName(lhs, rhs, scope, name);
|
stack[stackTop] = ScriptRuntime.setName(lhs, rhs, scope, name);
|
||||||
pc += 2;
|
pc += 2;
|
||||||
break;
|
continue Loop;
|
||||||
}
|
}
|
||||||
case Token.DELPROP : {
|
case Token.DELPROP : {
|
||||||
Object rhs = stack[stackTop];
|
Object rhs = stack[stackTop];
|
||||||
|
@ -2638,7 +2638,7 @@ public class Interpreter
|
||||||
Object lhs = stack[stackTop];
|
Object lhs = stack[stackTop];
|
||||||
if (lhs == DBL_MRK) lhs = doubleWrap(sDbl[stackTop]);
|
if (lhs == DBL_MRK) lhs = doubleWrap(sDbl[stackTop]);
|
||||||
stack[stackTop] = ScriptRuntime.delete(cx, scope, lhs, rhs);
|
stack[stackTop] = ScriptRuntime.delete(cx, scope, lhs, rhs);
|
||||||
break;
|
continue Loop;
|
||||||
}
|
}
|
||||||
case Token.GETPROP : {
|
case Token.GETPROP : {
|
||||||
String name = (String)stack[stackTop];
|
String name = (String)stack[stackTop];
|
||||||
|
@ -2646,7 +2646,7 @@ public class Interpreter
|
||||||
Object lhs = stack[stackTop];
|
Object lhs = stack[stackTop];
|
||||||
if (lhs == DBL_MRK) lhs = doubleWrap(sDbl[stackTop]);
|
if (lhs == DBL_MRK) lhs = doubleWrap(sDbl[stackTop]);
|
||||||
stack[stackTop] = ScriptRuntime.getProp(lhs, name, scope);
|
stack[stackTop] = ScriptRuntime.getProp(lhs, name, scope);
|
||||||
break;
|
continue Loop;
|
||||||
}
|
}
|
||||||
case Token.SETPROP : {
|
case Token.SETPROP : {
|
||||||
Object rhs = stack[stackTop];
|
Object rhs = stack[stackTop];
|
||||||
|
@ -2657,16 +2657,16 @@ public class Interpreter
|
||||||
Object lhs = stack[stackTop];
|
Object lhs = stack[stackTop];
|
||||||
if (lhs == DBL_MRK) lhs = doubleWrap(sDbl[stackTop]);
|
if (lhs == DBL_MRK) lhs = doubleWrap(sDbl[stackTop]);
|
||||||
stack[stackTop] = ScriptRuntime.setProp(lhs, name, rhs, scope);
|
stack[stackTop] = ScriptRuntime.setProp(lhs, name, rhs, scope);
|
||||||
break;
|
continue Loop;
|
||||||
}
|
}
|
||||||
case Token.GETELEM :
|
case Token.GETELEM :
|
||||||
do_getElem(cx, stack, sDbl, stackTop, scope);
|
do_getElem(cx, stack, sDbl, stackTop, scope);
|
||||||
--stackTop;
|
--stackTop;
|
||||||
break;
|
continue Loop;
|
||||||
case Token.SETELEM :
|
case Token.SETELEM :
|
||||||
do_setElem(cx, stack, sDbl, stackTop, scope);
|
do_setElem(cx, stack, sDbl, stackTop, scope);
|
||||||
stackTop -= 2;
|
stackTop -= 2;
|
||||||
break;
|
continue Loop;
|
||||||
case Icode_PROPINC :
|
case Icode_PROPINC :
|
||||||
case Icode_PROPDEC : {
|
case Icode_PROPDEC : {
|
||||||
String name = (String)stack[stackTop];
|
String name = (String)stack[stackTop];
|
||||||
|
@ -2674,7 +2674,7 @@ public class Interpreter
|
||||||
Object lhs = stack[stackTop];
|
Object lhs = stack[stackTop];
|
||||||
if (lhs == DBL_MRK) lhs = doubleWrap(sDbl[stackTop]);
|
if (lhs == DBL_MRK) lhs = doubleWrap(sDbl[stackTop]);
|
||||||
stack[stackTop] = ScriptRuntime.postIncrDecr(lhs, name, scope, op == Icode_PROPINC);
|
stack[stackTop] = ScriptRuntime.postIncrDecr(lhs, name, scope, op == Icode_PROPINC);
|
||||||
break;
|
continue Loop;
|
||||||
}
|
}
|
||||||
case Icode_ELEMINC :
|
case Icode_ELEMINC :
|
||||||
case Icode_ELEMDEC : {
|
case Icode_ELEMDEC : {
|
||||||
|
@ -2684,7 +2684,7 @@ public class Interpreter
|
||||||
Object lhs = stack[stackTop];
|
Object lhs = stack[stackTop];
|
||||||
if (lhs == DBL_MRK) lhs = doubleWrap(sDbl[stackTop]);
|
if (lhs == DBL_MRK) lhs = doubleWrap(sDbl[stackTop]);
|
||||||
stack[stackTop] = ScriptRuntime.postIncrDecrElem(lhs, rhs, scope, op == Icode_ELEMINC);
|
stack[stackTop] = ScriptRuntime.postIncrDecrElem(lhs, rhs, scope, op == Icode_ELEMINC);
|
||||||
break;
|
continue Loop;
|
||||||
}
|
}
|
||||||
case Token.LOCAL_SAVE : {
|
case Token.LOCAL_SAVE : {
|
||||||
int slot = (iCode[pc] & 0xFF);
|
int slot = (iCode[pc] & 0xFF);
|
||||||
|
@ -2692,7 +2692,7 @@ public class Interpreter
|
||||||
sDbl[LOCAL_SHFT + slot] = sDbl[stackTop];
|
sDbl[LOCAL_SHFT + slot] = sDbl[stackTop];
|
||||||
--stackTop;
|
--stackTop;
|
||||||
++pc;
|
++pc;
|
||||||
break;
|
continue Loop;
|
||||||
}
|
}
|
||||||
case Token.LOCAL_LOAD : {
|
case Token.LOCAL_LOAD : {
|
||||||
int slot = (iCode[pc] & 0xFF);
|
int slot = (iCode[pc] & 0xFF);
|
||||||
|
@ -2700,7 +2700,7 @@ public class Interpreter
|
||||||
stack[stackTop] = stack[LOCAL_SHFT + slot];
|
stack[stackTop] = stack[LOCAL_SHFT + slot];
|
||||||
sDbl[stackTop] = sDbl[LOCAL_SHFT + slot];
|
sDbl[stackTop] = sDbl[LOCAL_SHFT + slot];
|
||||||
++pc;
|
++pc;
|
||||||
break;
|
continue Loop;
|
||||||
}
|
}
|
||||||
case Icode_CALLSPECIAL : {
|
case Icode_CALLSPECIAL : {
|
||||||
if (instructionThreshold != 0) {
|
if (instructionThreshold != 0) {
|
||||||
|
@ -2732,7 +2732,7 @@ public class Interpreter
|
||||||
idata.itsSourceFile, sourceLine);
|
idata.itsSourceFile, sourceLine);
|
||||||
instructionCount = cx.instructionCount;
|
instructionCount = cx.instructionCount;
|
||||||
pc += 6;
|
pc += 6;
|
||||||
break;
|
continue Loop;
|
||||||
}
|
}
|
||||||
case Token.CALL : {
|
case Token.CALL : {
|
||||||
if (instructionThreshold != 0) {
|
if (instructionThreshold != 0) {
|
||||||
|
@ -2784,7 +2784,7 @@ public class Interpreter
|
||||||
|
|
||||||
instructionCount = cx.instructionCount;
|
instructionCount = cx.instructionCount;
|
||||||
pc += 4;
|
pc += 4;
|
||||||
break;
|
continue Loop;
|
||||||
}
|
}
|
||||||
case Token.NEW : {
|
case Token.NEW : {
|
||||||
if (instructionThreshold != 0) {
|
if (instructionThreshold != 0) {
|
||||||
|
@ -2827,61 +2827,62 @@ public class Interpreter
|
||||||
|
|
||||||
}
|
}
|
||||||
instructionCount = cx.instructionCount;
|
instructionCount = cx.instructionCount;
|
||||||
pc += 4; break;
|
pc += 4;
|
||||||
|
continue Loop;
|
||||||
}
|
}
|
||||||
case Token.TYPEOF : {
|
case Token.TYPEOF : {
|
||||||
Object lhs = stack[stackTop];
|
Object lhs = stack[stackTop];
|
||||||
if (lhs == DBL_MRK) lhs = doubleWrap(sDbl[stackTop]);
|
if (lhs == DBL_MRK) lhs = doubleWrap(sDbl[stackTop]);
|
||||||
stack[stackTop] = ScriptRuntime.typeof(lhs);
|
stack[stackTop] = ScriptRuntime.typeof(lhs);
|
||||||
break;
|
continue Loop;
|
||||||
}
|
}
|
||||||
case Icode_TYPEOFNAME : {
|
case Icode_TYPEOFNAME : {
|
||||||
String name = strings[getIndex(iCode, pc)];
|
String name = strings[getIndex(iCode, pc)];
|
||||||
stack[++stackTop] = ScriptRuntime.typeofName(scope, name);
|
stack[++stackTop] = ScriptRuntime.typeofName(scope, name);
|
||||||
pc += 2;
|
pc += 2;
|
||||||
break;
|
continue Loop;
|
||||||
}
|
}
|
||||||
case Icode_NAME_AND_THIS : {
|
case Icode_NAME_AND_THIS : {
|
||||||
String name = strings[getIndex(iCode, pc)];
|
String name = strings[getIndex(iCode, pc)];
|
||||||
boolean skipGetThis = (0 != iCode[pc + 2]);
|
boolean skipGetThis = (0 != iCode[pc + 2]);
|
||||||
stackTop = do_nameAndThis(stack, stackTop, scope, name, skipGetThis);
|
stackTop = do_nameAndThis(stack, stackTop, scope, name, skipGetThis);
|
||||||
pc += 3;
|
pc += 3;
|
||||||
break;
|
continue Loop;
|
||||||
}
|
}
|
||||||
case Token.STRING :
|
case Token.STRING :
|
||||||
stack[++stackTop] = strings[getIndex(iCode, pc)];
|
stack[++stackTop] = strings[getIndex(iCode, pc)];
|
||||||
pc += 2;
|
pc += 2;
|
||||||
break;
|
continue Loop;
|
||||||
case Icode_SHORTNUMBER :
|
case Icode_SHORTNUMBER :
|
||||||
++stackTop;
|
++stackTop;
|
||||||
stack[stackTop] = DBL_MRK;
|
stack[stackTop] = DBL_MRK;
|
||||||
sDbl[stackTop] = getShort(iCode, pc);
|
sDbl[stackTop] = getShort(iCode, pc);
|
||||||
pc += 2;
|
pc += 2;
|
||||||
break;
|
continue Loop;
|
||||||
case Icode_INTNUMBER :
|
case Icode_INTNUMBER :
|
||||||
++stackTop;
|
++stackTop;
|
||||||
stack[stackTop] = DBL_MRK;
|
stack[stackTop] = DBL_MRK;
|
||||||
sDbl[stackTop] = getInt(iCode, pc);
|
sDbl[stackTop] = getInt(iCode, pc);
|
||||||
pc += 4;
|
pc += 4;
|
||||||
break;
|
continue Loop;
|
||||||
case Token.NUMBER :
|
case Token.NUMBER :
|
||||||
++stackTop;
|
++stackTop;
|
||||||
stack[stackTop] = DBL_MRK;
|
stack[stackTop] = DBL_MRK;
|
||||||
sDbl[stackTop] = idata.itsDoubleTable[getIndex(iCode, pc)];
|
sDbl[stackTop] = idata.itsDoubleTable[getIndex(iCode, pc)];
|
||||||
pc += 2;
|
pc += 2;
|
||||||
break;
|
continue Loop;
|
||||||
case Token.NAME : {
|
case Token.NAME : {
|
||||||
String name = strings[getIndex(iCode, pc)];
|
String name = strings[getIndex(iCode, pc)];
|
||||||
stack[++stackTop] = ScriptRuntime.name(scope, name);
|
stack[++stackTop] = ScriptRuntime.name(scope, name);
|
||||||
pc += 2;
|
pc += 2;
|
||||||
break;
|
continue Loop;
|
||||||
}
|
}
|
||||||
case Icode_NAMEINC :
|
case Icode_NAMEINC :
|
||||||
case Icode_NAMEDEC : {
|
case Icode_NAMEDEC : {
|
||||||
String name = strings[getIndex(iCode, pc)];
|
String name = strings[getIndex(iCode, pc)];
|
||||||
stack[++stackTop] = ScriptRuntime.postIncrDecr(scope, name, op == Icode_NAMEINC);
|
stack[++stackTop] = ScriptRuntime.postIncrDecr(scope, name, op == Icode_NAMEINC);
|
||||||
pc += 2;
|
pc += 2;
|
||||||
break;
|
continue Loop;
|
||||||
}
|
}
|
||||||
case Token.SETVAR : {
|
case Token.SETVAR : {
|
||||||
int slot = (iCode[pc] & 0xFF);
|
int slot = (iCode[pc] & 0xFF);
|
||||||
|
@ -2894,7 +2895,7 @@ public class Interpreter
|
||||||
activationPut(fnOrScript, scope, slot, val);
|
activationPut(fnOrScript, scope, slot, val);
|
||||||
}
|
}
|
||||||
++pc;
|
++pc;
|
||||||
break;
|
continue Loop;
|
||||||
}
|
}
|
||||||
case Token.GETVAR : {
|
case Token.GETVAR : {
|
||||||
int slot = (iCode[pc] & 0xFF);
|
int slot = (iCode[pc] & 0xFF);
|
||||||
|
@ -2906,7 +2907,7 @@ public class Interpreter
|
||||||
stack[stackTop] = activationGet(fnOrScript, scope, slot);
|
stack[stackTop] = activationGet(fnOrScript, scope, slot);
|
||||||
}
|
}
|
||||||
++pc;
|
++pc;
|
||||||
break;
|
continue Loop;
|
||||||
}
|
}
|
||||||
case Icode_VARINC :
|
case Icode_VARINC :
|
||||||
case Icode_VARDEC : {
|
case Icode_VARDEC : {
|
||||||
|
@ -2932,53 +2933,53 @@ public class Interpreter
|
||||||
activationPut(fnOrScript, scope, slot, val);
|
activationPut(fnOrScript, scope, slot, val);
|
||||||
}
|
}
|
||||||
++pc;
|
++pc;
|
||||||
break;
|
continue Loop;
|
||||||
}
|
}
|
||||||
case Token.ZERO :
|
case Token.ZERO :
|
||||||
++stackTop;
|
++stackTop;
|
||||||
stack[stackTop] = DBL_MRK;
|
stack[stackTop] = DBL_MRK;
|
||||||
sDbl[stackTop] = 0;
|
sDbl[stackTop] = 0;
|
||||||
break;
|
continue Loop;
|
||||||
case Token.ONE :
|
case Token.ONE :
|
||||||
++stackTop;
|
++stackTop;
|
||||||
stack[stackTop] = DBL_MRK;
|
stack[stackTop] = DBL_MRK;
|
||||||
sDbl[stackTop] = 1;
|
sDbl[stackTop] = 1;
|
||||||
break;
|
continue Loop;
|
||||||
case Token.NULL :
|
case Token.NULL :
|
||||||
stack[++stackTop] = null;
|
stack[++stackTop] = null;
|
||||||
break;
|
continue Loop;
|
||||||
case Token.THIS :
|
case Token.THIS :
|
||||||
stack[++stackTop] = thisObj;
|
stack[++stackTop] = thisObj;
|
||||||
break;
|
continue Loop;
|
||||||
case Token.THISFN :
|
case Token.THISFN :
|
||||||
stack[++stackTop] = fnOrScript;
|
stack[++stackTop] = fnOrScript;
|
||||||
break;
|
continue Loop;
|
||||||
case Token.FALSE :
|
case Token.FALSE :
|
||||||
stack[++stackTop] = Boolean.FALSE;
|
stack[++stackTop] = Boolean.FALSE;
|
||||||
break;
|
continue Loop;
|
||||||
case Token.TRUE :
|
case Token.TRUE :
|
||||||
stack[++stackTop] = Boolean.TRUE;
|
stack[++stackTop] = Boolean.TRUE;
|
||||||
break;
|
continue Loop;
|
||||||
case Token.UNDEFINED :
|
case Token.UNDEFINED :
|
||||||
stack[++stackTop] = Undefined.instance;
|
stack[++stackTop] = Undefined.instance;
|
||||||
break;
|
continue Loop;
|
||||||
case Token.ENTERWITH : {
|
case Token.ENTERWITH : {
|
||||||
Object lhs = stack[stackTop];
|
Object lhs = stack[stackTop];
|
||||||
if (lhs == DBL_MRK) lhs = doubleWrap(sDbl[stackTop]);
|
if (lhs == DBL_MRK) lhs = doubleWrap(sDbl[stackTop]);
|
||||||
--stackTop;
|
--stackTop;
|
||||||
scope = ScriptRuntime.enterWith(lhs, scope);
|
scope = ScriptRuntime.enterWith(lhs, scope);
|
||||||
++withDepth;
|
++withDepth;
|
||||||
break;
|
continue Loop;
|
||||||
}
|
}
|
||||||
case Token.LEAVEWITH :
|
case Token.LEAVEWITH :
|
||||||
scope = ScriptRuntime.leaveWith(scope);
|
scope = ScriptRuntime.leaveWith(scope);
|
||||||
--withDepth;
|
--withDepth;
|
||||||
break;
|
continue Loop;
|
||||||
case Token.CATCH_SCOPE : {
|
case Token.CATCH_SCOPE : {
|
||||||
String name = strings[getIndex(iCode, pc)];
|
String name = strings[getIndex(iCode, pc)];
|
||||||
stack[stackTop] = ScriptRuntime.newCatchScope(name, stack[stackTop]);
|
stack[stackTop] = ScriptRuntime.newCatchScope(name, stack[stackTop]);
|
||||||
pc += 2;
|
pc += 2;
|
||||||
break;
|
continue Loop;
|
||||||
}
|
}
|
||||||
case Token.ENUM_INIT : {
|
case Token.ENUM_INIT : {
|
||||||
int slot = (iCode[pc] & 0xFF);
|
int slot = (iCode[pc] & 0xFF);
|
||||||
|
@ -2987,7 +2988,7 @@ public class Interpreter
|
||||||
--stackTop;
|
--stackTop;
|
||||||
stack[LOCAL_SHFT + slot] = ScriptRuntime.enumInit(lhs, scope);
|
stack[LOCAL_SHFT + slot] = ScriptRuntime.enumInit(lhs, scope);
|
||||||
++pc;
|
++pc;
|
||||||
break;
|
continue Loop;
|
||||||
}
|
}
|
||||||
case Token.ENUM_NEXT :
|
case Token.ENUM_NEXT :
|
||||||
case Token.ENUM_ID : {
|
case Token.ENUM_ID : {
|
||||||
|
@ -2998,13 +2999,13 @@ public class Interpreter
|
||||||
? (Object)ScriptRuntime.enumNext(val)
|
? (Object)ScriptRuntime.enumNext(val)
|
||||||
: (Object)ScriptRuntime.enumId(val);
|
: (Object)ScriptRuntime.enumId(val);
|
||||||
++pc;
|
++pc;
|
||||||
break;
|
continue Loop;
|
||||||
}
|
}
|
||||||
case Icode_PUSH_PARENT : {
|
case Icode_PUSH_PARENT : {
|
||||||
Object lhs = stack[stackTop];
|
Object lhs = stack[stackTop];
|
||||||
if (lhs == DBL_MRK) lhs = doubleWrap(sDbl[stackTop]);
|
if (lhs == DBL_MRK) lhs = doubleWrap(sDbl[stackTop]);
|
||||||
stack[++stackTop] = ScriptRuntime.getParent(lhs);
|
stack[++stackTop] = ScriptRuntime.getParent(lhs);
|
||||||
break;
|
continue Loop;
|
||||||
}
|
}
|
||||||
case Icode_GETPROTO :
|
case Icode_GETPROTO :
|
||||||
case Icode_GETSCOPEPARENT : {
|
case Icode_GETSCOPEPARENT : {
|
||||||
|
@ -3017,7 +3018,7 @@ public class Interpreter
|
||||||
val = ScriptRuntime.getParent(lhs, scope);
|
val = ScriptRuntime.getParent(lhs, scope);
|
||||||
}
|
}
|
||||||
stack[stackTop] = val;
|
stack[stackTop] = val;
|
||||||
break;
|
continue Loop;
|
||||||
}
|
}
|
||||||
case Icode_SETPROTO :
|
case Icode_SETPROTO :
|
||||||
case Icode_SETPARENT : {
|
case Icode_SETPARENT : {
|
||||||
|
@ -3033,18 +3034,18 @@ public class Interpreter
|
||||||
val = ScriptRuntime.setParent(lhs, rhs, scope);
|
val = ScriptRuntime.setParent(lhs, rhs, scope);
|
||||||
}
|
}
|
||||||
stack[stackTop] = val;
|
stack[stackTop] = val;
|
||||||
break;
|
continue Loop;
|
||||||
}
|
}
|
||||||
case Icode_SCOPE :
|
case Icode_SCOPE :
|
||||||
stack[++stackTop] = scope;
|
stack[++stackTop] = scope;
|
||||||
break;
|
continue Loop;
|
||||||
case Icode_CLOSURE : {
|
case Icode_CLOSURE : {
|
||||||
int i = getIndex(iCode, pc);
|
int i = getIndex(iCode, pc);
|
||||||
InterpreterData closureData = idata.itsNestedFunctions[i];
|
InterpreterData closureData = idata.itsNestedFunctions[i];
|
||||||
stack[++stackTop] = createFunction(cx, scope, closureData,
|
stack[++stackTop] = createFunction(cx, scope, closureData,
|
||||||
idata.itsFromEvalCode);
|
idata.itsFromEvalCode);
|
||||||
pc += 2;
|
pc += 2;
|
||||||
break;
|
continue Loop;
|
||||||
}
|
}
|
||||||
case Token.REGEXP : {
|
case Token.REGEXP : {
|
||||||
int i = getIndex(iCode, pc);
|
int i = getIndex(iCode, pc);
|
||||||
|
@ -3059,7 +3060,7 @@ public class Interpreter
|
||||||
}
|
}
|
||||||
stack[++stackTop] = regexp;
|
stack[++stackTop] = regexp;
|
||||||
pc += 2;
|
pc += 2;
|
||||||
break;
|
continue Loop;
|
||||||
}
|
}
|
||||||
case Icode_LITERAL_NEW : {
|
case Icode_LITERAL_NEW : {
|
||||||
int i = getInt(iCode, pc);
|
int i = getInt(iCode, pc);
|
||||||
|
@ -3067,7 +3068,7 @@ public class Interpreter
|
||||||
stack[stackTop] = new Object[i];
|
stack[stackTop] = new Object[i];
|
||||||
sDbl[stackTop] = 0;
|
sDbl[stackTop] = 0;
|
||||||
pc += 4;
|
pc += 4;
|
||||||
break;
|
continue Loop;
|
||||||
}
|
}
|
||||||
case Icode_LITERAL_SET : {
|
case Icode_LITERAL_SET : {
|
||||||
Object value = stack[stackTop];
|
Object value = stack[stackTop];
|
||||||
|
@ -3076,7 +3077,7 @@ public class Interpreter
|
||||||
int i = (int)sDbl[stackTop];
|
int i = (int)sDbl[stackTop];
|
||||||
((Object[])stack[stackTop])[i] = value;
|
((Object[])stack[stackTop])[i] = value;
|
||||||
sDbl[stackTop] = i + 1;
|
sDbl[stackTop] = i + 1;
|
||||||
break;
|
continue Loop;
|
||||||
}
|
}
|
||||||
case Token.ARRAYLIT :
|
case Token.ARRAYLIT :
|
||||||
case Token.OBJECTLIT : {
|
case Token.OBJECTLIT : {
|
||||||
|
@ -3095,7 +3096,7 @@ public class Interpreter
|
||||||
}
|
}
|
||||||
stack[stackTop] = val;
|
stack[stackTop] = val;
|
||||||
pc += 4;
|
pc += 4;
|
||||||
break;
|
continue Loop;
|
||||||
}
|
}
|
||||||
case Icode_LINE : {
|
case Icode_LINE : {
|
||||||
cx.interpreterLineIndex = pc;
|
cx.interpreterLineIndex = pc;
|
||||||
|
@ -3104,15 +3105,14 @@ public class Interpreter
|
||||||
debuggerFrame.onLineChange(cx, line);
|
debuggerFrame.onLineChange(cx, line);
|
||||||
}
|
}
|
||||||
pc += 2;
|
pc += 2;
|
||||||
break;
|
continue Loop;
|
||||||
}
|
}
|
||||||
default : {
|
default : {
|
||||||
dumpICode(idata);
|
dumpICode(idata);
|
||||||
throw new RuntimeException("Unknown icode : "+op+" @ pc : "+(pc-1));
|
throw new RuntimeException("Unknown icode : "+op+" @ pc : "+(pc-1));
|
||||||
}
|
}
|
||||||
// end of interpreter switch
|
} // end of interpreter switch
|
||||||
}
|
} // end of interpreter try
|
||||||
}
|
|
||||||
catch (Throwable ex) {
|
catch (Throwable ex) {
|
||||||
if (instructionThreshold != 0) {
|
if (instructionThreshold != 0) {
|
||||||
if (instructionCount < 0) {
|
if (instructionCount < 0) {
|
||||||
|
@ -3130,7 +3130,7 @@ public class Interpreter
|
||||||
pc = getJavaCatchPC(iCode);
|
pc = getJavaCatchPC(iCode);
|
||||||
continue Loop;
|
continue Loop;
|
||||||
}
|
}
|
||||||
}
|
} // end of interpreter loop
|
||||||
|
|
||||||
cx.interpreterData = savedData;
|
cx.interpreterData = savedData;
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче