зеркало из https://github.com/mozilla/gecko-dev.git
Move ENDTRY, JTHROW, GOSUB and RETSUB from TokenStream to Interpreter as they specific only to Interpreter implementation.
This commit is contained in:
Родитель
cef7d514f9
Коммит
ebe60fb675
|
@ -57,8 +57,14 @@ public class Interpreter {
|
|||
// To return undefined value
|
||||
RETURN_UNDEF_ICODE = TokenStream.LAST_TOKEN + 5,
|
||||
|
||||
// Exception handling implementation
|
||||
ENDTRY = TokenStream.LAST_TOKEN + 6,
|
||||
JTHROW = TokenStream.LAST_TOKEN + 7,
|
||||
GOSUB = TokenStream.LAST_TOKEN + 8,
|
||||
RETSUB = TokenStream.LAST_TOKEN + 9,
|
||||
|
||||
// Last icode
|
||||
END_ICODE = TokenStream.LAST_TOKEN + 6;
|
||||
END_ICODE = TokenStream.LAST_TOKEN + 10;
|
||||
|
||||
|
||||
public IRFactory createIRFactory(Context cx, TokenStream ts)
|
||||
|
@ -462,7 +468,7 @@ public class Interpreter {
|
|||
|
||||
case TokenStream.USELOCAL : {
|
||||
if (node.getProp(Node.TARGET_PROP) != null) {
|
||||
iCodeTop = addByte(TokenStream.RETSUB, iCodeTop);
|
||||
iCodeTop = addByte(RETSUB, iCodeTop);
|
||||
} else {
|
||||
iCodeTop = addByte(TokenStream.USETEMP, iCodeTop);
|
||||
itsStackDepth++;
|
||||
|
@ -513,7 +519,7 @@ public class Interpreter {
|
|||
// of pending trys and have some knowledge of how
|
||||
// many trys we need to close when we perform a
|
||||
// GOTO or GOSUB.
|
||||
iCodeTop = addGoto(target, TokenStream.GOSUB, iCodeTop);
|
||||
iCodeTop = addGoto(target, GOSUB, iCodeTop);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -869,7 +875,7 @@ public class Interpreter {
|
|||
(nextSibling == catchTarget ||
|
||||
nextSibling == finallyTarget))
|
||||
{
|
||||
iCodeTop = addByte(TokenStream.ENDTRY, iCodeTop);
|
||||
iCodeTop = addByte(ENDTRY, iCodeTop);
|
||||
insertedEndTry = true;
|
||||
}
|
||||
if (child == catchTarget) {
|
||||
|
@ -889,9 +895,8 @@ public class Interpreter {
|
|||
recordJumpOffset(tryStart + 3, finallyOffset);
|
||||
// Stack depth is handled during generation of
|
||||
// finallyTarget
|
||||
iCodeTop = addGoto(finallyTarget, TokenStream.GOSUB,
|
||||
iCodeTop);
|
||||
iCodeTop = addByte(TokenStream.JTHROW, iCodeTop);
|
||||
iCodeTop = addGoto(finallyTarget, GOSUB, iCodeTop);
|
||||
iCodeTop = addByte(JTHROW, iCodeTop);
|
||||
resolveForwardGoto(skippyJumpStart, iCodeTop);
|
||||
}
|
||||
itsTryDepth--;
|
||||
|
@ -1193,6 +1198,10 @@ public class Interpreter {
|
|||
case SHORTNUMBER_ICODE: return "shortnumber";
|
||||
case INTNUMBER_ICODE: return "intnumber";
|
||||
case RETURN_UNDEF_ICODE: return "return_undef";
|
||||
case ENDTRY: return "endtry";
|
||||
case JTHROW: return "jthrow";
|
||||
case GOSUB: return "gosub";
|
||||
case RETSUB: return "retsub";
|
||||
case END_ICODE: return "end";
|
||||
}
|
||||
}
|
||||
|
@ -1226,7 +1235,7 @@ public class Interpreter {
|
|||
out.println(tname);
|
||||
break;
|
||||
|
||||
case TokenStream.GOSUB :
|
||||
case GOSUB :
|
||||
case TokenStream.GOTO :
|
||||
case TokenStream.IFEQ :
|
||||
case TokenStream.IFNE : {
|
||||
|
@ -1247,7 +1256,7 @@ public class Interpreter {
|
|||
pc += 4;
|
||||
break;
|
||||
}
|
||||
case TokenStream.RETSUB :
|
||||
case RETSUB :
|
||||
case TokenStream.ENUMINIT :
|
||||
case TokenStream.ENUMNEXT :
|
||||
case TokenStream.VARINC :
|
||||
|
@ -1357,10 +1366,10 @@ public class Interpreter {
|
|||
case TokenStream.ENTERWITH :
|
||||
case TokenStream.LEAVEWITH :
|
||||
case TokenStream.RETURN :
|
||||
case TokenStream.ENDTRY :
|
||||
case ENDTRY :
|
||||
case TokenStream.CATCH:
|
||||
case TokenStream.THROW :
|
||||
case TokenStream.JTHROW :
|
||||
case JTHROW :
|
||||
case TokenStream.GETTHIS :
|
||||
case TokenStream.SETELEM :
|
||||
case TokenStream.GETELEM :
|
||||
|
@ -1410,7 +1419,7 @@ public class Interpreter {
|
|||
case END_ICODE:
|
||||
return 1;
|
||||
|
||||
case TokenStream.GOSUB :
|
||||
case GOSUB :
|
||||
case TokenStream.GOTO :
|
||||
case TokenStream.IFEQ :
|
||||
case TokenStream.IFNE :
|
||||
|
@ -1422,7 +1431,7 @@ public class Interpreter {
|
|||
// finally pc offset or 0
|
||||
return 1 + 2 + 2;
|
||||
|
||||
case TokenStream.RETSUB :
|
||||
case RETSUB :
|
||||
case TokenStream.ENUMINIT :
|
||||
case TokenStream.ENUMNEXT :
|
||||
case TokenStream.VARINC :
|
||||
|
@ -1678,7 +1687,7 @@ public class Interpreter {
|
|||
switch (iCode[pc] & 0xff) {
|
||||
// Back indent to ease imlementation reading
|
||||
|
||||
case TokenStream.ENDTRY :
|
||||
case ENDTRY :
|
||||
tryStackTop--;
|
||||
stack[TRY_STACK_SHFT + tryStackTop] = null;
|
||||
break;
|
||||
|
@ -1782,7 +1791,7 @@ public class Interpreter {
|
|||
continue Loop;
|
||||
}
|
||||
case TokenStream.THROW:
|
||||
case TokenStream.JTHROW: {
|
||||
case JTHROW: {
|
||||
if ((iCode[pc] & 0xff) == TokenStream.THROW) {
|
||||
Object value = stack[stackTop];
|
||||
if (value == DBL_MRK) value = doubleWrap(sDbl[stackTop]);
|
||||
|
@ -1965,7 +1974,7 @@ public class Interpreter {
|
|||
}
|
||||
pcPrevBranch = pc = getTarget(iCode, pc + 1);
|
||||
continue Loop;
|
||||
case TokenStream.GOSUB :
|
||||
case GOSUB :
|
||||
sDbl[++stackTop] = pc + 3;
|
||||
if (instructionThreshold != 0) {
|
||||
instructionCount += pc + 3 - pcPrevBranch;
|
||||
|
@ -1975,7 +1984,7 @@ public class Interpreter {
|
|||
}
|
||||
}
|
||||
pcPrevBranch = pc = getTarget(iCode, pc + 1); continue Loop;
|
||||
case TokenStream.RETSUB : {
|
||||
case RETSUB : {
|
||||
int slot = (iCode[pc + 1] & 0xFF);
|
||||
if (instructionThreshold != 0) {
|
||||
instructionCount += pc + 2 - pcPrevBranch;
|
||||
|
|
|
@ -84,8 +84,8 @@ public class TokenStream {
|
|||
ERROR = -1, // well-known as the only code < EOF
|
||||
EOF = 0, // end of file token - (not EOF_CHAR)
|
||||
EOL = 1, // end of line
|
||||
// Beginning here are interpreter bytecodes. Their values
|
||||
// must not exceed 127.
|
||||
|
||||
// Beginning here are interpreter bytecodes.
|
||||
POPV = 2,
|
||||
ENTERWITH = 3,
|
||||
LEAVEWITH = 4,
|
||||
|
@ -149,70 +149,67 @@ public class TokenStream {
|
|||
THROW = 62,
|
||||
IN = 63,
|
||||
INSTANCEOF = 64,
|
||||
GOSUB = 65,
|
||||
RETSUB = 66,
|
||||
CALLSPECIAL = 67,
|
||||
GETTHIS = 68,
|
||||
NEWTEMP = 69,
|
||||
USETEMP = 70,
|
||||
GETBASE = 71,
|
||||
GETVAR = 72,
|
||||
SETVAR = 73,
|
||||
UNDEFINED = 74,
|
||||
TRY = 75,
|
||||
ENDTRY = 76,
|
||||
NEWSCOPE = 77,
|
||||
TYPEOFNAME = 78,
|
||||
ENUMINIT = 79,
|
||||
ENUMNEXT = 80,
|
||||
GETPROTO = 81,
|
||||
GETPARENT = 82,
|
||||
SETPROTO = 83,
|
||||
SETPARENT = 84,
|
||||
SCOPE = 85,
|
||||
GETSCOPEPARENT = 86,
|
||||
THISFN = 87,
|
||||
JTHROW = 88,
|
||||
CALLSPECIAL = 65,
|
||||
GETTHIS = 66,
|
||||
NEWTEMP = 67,
|
||||
USETEMP = 68,
|
||||
GETBASE = 69,
|
||||
GETVAR = 70,
|
||||
SETVAR = 71,
|
||||
UNDEFINED = 72,
|
||||
TRY = 73,
|
||||
NEWSCOPE = 74,
|
||||
TYPEOFNAME = 75,
|
||||
ENUMINIT = 76,
|
||||
ENUMNEXT = 77,
|
||||
GETPROTO = 78,
|
||||
GETPARENT = 79,
|
||||
SETPROTO = 80,
|
||||
SETPARENT = 81,
|
||||
SCOPE = 82,
|
||||
GETSCOPEPARENT = 83,
|
||||
THISFN = 84,
|
||||
|
||||
// End of interpreter bytecodes
|
||||
SEMI = 89, // semicolon
|
||||
LB = 90, // left and right brackets
|
||||
RB = 91,
|
||||
LC = 92, // left and right curlies (braces)
|
||||
RC = 93,
|
||||
LP = 94, // left and right parentheses
|
||||
RP = 95,
|
||||
COMMA = 96, // comma operator
|
||||
ASSIGN = 97, // assignment ops (= += -= etc.)
|
||||
HOOK = 98, // conditional (?:)
|
||||
COLON = 99,
|
||||
OR = 100, // logical or (||)
|
||||
AND = 101, // logical and (&&)
|
||||
EQOP = 102, // equality ops (== !=)
|
||||
RELOP = 103, // relational ops (< <= > >=)
|
||||
SHOP = 104, // shift ops (<< >> >>>)
|
||||
UNARYOP = 105, // unary prefix operator
|
||||
INC = 106, // increment/decrement (++ --)
|
||||
DEC = 107,
|
||||
DOT = 108, // member operator (.)
|
||||
PRIMARY = 109, // true, false, null, this
|
||||
FUNCTION = 110, // function keyword
|
||||
EXPORT = 111, // export keyword
|
||||
IMPORT = 112, // import keyword
|
||||
IF = 113, // if keyword
|
||||
ELSE = 114, // else keyword
|
||||
SWITCH = 115, // switch keyword
|
||||
CASE = 116, // case keyword
|
||||
DEFAULT = 117, // default keyword
|
||||
WHILE = 118, // while keyword
|
||||
DO = 119, // do keyword
|
||||
FOR = 120, // for keyword
|
||||
BREAK = 121, // break keyword
|
||||
CONTINUE = 122, // continue keyword
|
||||
VAR = 123, // var keyword
|
||||
WITH = 124, // with keyword
|
||||
CATCH = 125, // catch keyword
|
||||
FINALLY = 126, // finally keyword
|
||||
RESERVED = 127, // reserved keywords
|
||||
SEMI = 85, // semicolon
|
||||
LB = 86, // left and right brackets
|
||||
RB = 87,
|
||||
LC = 88, // left and right curlies (braces)
|
||||
RC = 89,
|
||||
LP = 90, // left and right parentheses
|
||||
RP = 91,
|
||||
COMMA = 92, // comma operator
|
||||
ASSIGN = 93, // assignment ops (= += -= etc.)
|
||||
HOOK = 94, // conditional (?:)
|
||||
COLON = 95,
|
||||
OR = 96, // logical or (||)
|
||||
AND = 97, // logical and (&&)
|
||||
EQOP = 98, // equality ops (== !=)
|
||||
RELOP = 99, // relational ops (< <= > >=)
|
||||
SHOP = 100, // shift ops (<< >> >>>)
|
||||
UNARYOP = 101, // unary prefix operator
|
||||
INC = 102, // increment/decrement (++ --)
|
||||
DEC = 103,
|
||||
DOT = 104, // member operator (.)
|
||||
PRIMARY = 105, // true, false, null, this
|
||||
FUNCTION = 106, // function keyword
|
||||
EXPORT = 107, // export keyword
|
||||
IMPORT = 108, // import keyword
|
||||
IF = 109, // if keyword
|
||||
ELSE = 110, // else keyword
|
||||
SWITCH = 111, // switch keyword
|
||||
CASE = 112, // case keyword
|
||||
DEFAULT = 113, // default keyword
|
||||
WHILE = 114, // while keyword
|
||||
DO = 115, // do keyword
|
||||
FOR = 116, // for keyword
|
||||
BREAK = 117, // break keyword
|
||||
CONTINUE = 118, // continue keyword
|
||||
VAR = 119, // var keyword
|
||||
WITH = 120, // with keyword
|
||||
CATCH = 121, // catch keyword
|
||||
FINALLY = 122, // finally keyword
|
||||
RESERVED = 123, // reserved keywords
|
||||
|
||||
/** Added by Mike - these are JSOPs in the jsref, but I
|
||||
* don't have them yet in the java implementation...
|
||||
|
@ -221,37 +218,37 @@ public class TokenStream {
|
|||
* Most of these go in the 'op' field when returning
|
||||
* more general token types, eg. 'DIV' as the op of 'ASSIGN'.
|
||||
*/
|
||||
NOP = 128, // NOP
|
||||
NOT = 129, // etc.
|
||||
PRE = 130, // for INC, DEC nodes.
|
||||
POST = 131,
|
||||
NOP = 124, // NOP
|
||||
NOT = 125, // etc.
|
||||
PRE = 126, // for INC, DEC nodes.
|
||||
POST = 127,
|
||||
|
||||
/**
|
||||
* For JSOPs associated with keywords...
|
||||
* eg. op = THIS; token = PRIMARY
|
||||
*/
|
||||
|
||||
VOID = 132,
|
||||
VOID = 128,
|
||||
|
||||
/* types used for the parse tree - these never get returned
|
||||
* by the scanner.
|
||||
*/
|
||||
BLOCK = 133, // statement block
|
||||
ARRAYLIT = 134, // array literal
|
||||
OBJLIT = 135, // object literal
|
||||
LABEL = 136, // label
|
||||
TARGET = 137,
|
||||
LOOP = 138,
|
||||
ENUMDONE = 139,
|
||||
EXPRSTMT = 140,
|
||||
PARENT = 141,
|
||||
CONVERT = 142,
|
||||
JSR = 143,
|
||||
NEWLOCAL = 144,
|
||||
USELOCAL = 145,
|
||||
SCRIPT = 146, // top-level node for entire script
|
||||
BLOCK = 129, // statement block
|
||||
ARRAYLIT = 130, // array literal
|
||||
OBJLIT = 131, // object literal
|
||||
LABEL = 132, // label
|
||||
TARGET = 133,
|
||||
LOOP = 134,
|
||||
ENUMDONE = 135,
|
||||
EXPRSTMT = 136,
|
||||
PARENT = 137,
|
||||
CONVERT = 138,
|
||||
JSR = 139,
|
||||
NEWLOCAL = 140,
|
||||
USELOCAL = 141,
|
||||
SCRIPT = 142, // top-level node for entire script
|
||||
|
||||
LAST_TOKEN = 146;
|
||||
LAST_TOKEN = 142;
|
||||
|
||||
// end enum
|
||||
|
||||
|
@ -325,8 +322,6 @@ public class TokenStream {
|
|||
case THROW: return "throw";
|
||||
case IN: return "in";
|
||||
case INSTANCEOF: return "instanceof";
|
||||
case GOSUB: return "gosub";
|
||||
case RETSUB: return "retsub";
|
||||
case CALLSPECIAL: return "callspecial";
|
||||
case GETTHIS: return "getthis";
|
||||
case NEWTEMP: return "newtemp";
|
||||
|
@ -336,7 +331,6 @@ public class TokenStream {
|
|||
case SETVAR: return "setvar";
|
||||
case UNDEFINED: return "undefined";
|
||||
case TRY: return "try";
|
||||
case ENDTRY: return "endtry";
|
||||
case NEWSCOPE: return "newscope";
|
||||
case TYPEOFNAME: return "typeofname";
|
||||
case ENUMINIT: return "enuminit";
|
||||
|
@ -348,7 +342,6 @@ public class TokenStream {
|
|||
case SCOPE: return "scope";
|
||||
case GETSCOPEPARENT: return "getscopeparent";
|
||||
case THISFN: return "thisfn";
|
||||
case JTHROW: return "jthrow";
|
||||
case SEMI: return "semi";
|
||||
case LB: return "lb";
|
||||
case RB: return "rb";
|
||||
|
|
Загрузка…
Ссылка в новой задаче