Move ENDTRY, JTHROW, GOSUB and RETSUB from TokenStream to Interpreter as they specific only to Interpreter implementation.

This commit is contained in:
igor%mir2.org 2003-07-22 11:16:54 +00:00
Родитель cef7d514f9
Коммит ebe60fb675
2 изменённых файлов: 108 добавлений и 106 удалений

Просмотреть файл

@ -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";