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