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