in rhino/src/main/java/org/mozilla/javascript/Interpreter.java [528:817]
static void dumpICode(InterpreterData idata) {
if (!Token.printICode) {
return;
}
byte[] iCode = idata.itsICode;
int iCodeLength = iCode.length;
String[] strings = idata.itsStringTable;
BigInteger[] bigInts = idata.itsBigIntTable;
PrintStream out = System.out;
out.println("ICode dump, for " + idata.itsName + ", length = " + iCodeLength);
out.println("MaxStack = " + idata.itsMaxStack);
int indexReg = 0;
for (int pc = 0; pc < iCodeLength; ) {
out.flush();
out.print(" [" + pc + "] ");
int token = iCode[pc];
int icodeLength = bytecodeSpan(token);
String tname = Icode.bytecodeName(token);
int old_pc = pc;
++pc;
switch (token) {
default:
if (icodeLength != 1) Kit.codeBug();
out.println(tname);
break;
case Icode_GOSUB:
case Token.GOTO:
case Token.IFEQ:
case Token.IFNE:
case Icode_IFEQ_POP:
case Icode_IF_NULL_UNDEF:
case Icode_IF_NOT_NULL_UNDEF:
case Icode_LEAVEDQ:
{
int newPC = pc + getShort(iCode, pc) - 1;
out.println(tname + " " + newPC);
pc += 2;
break;
}
case Icode_VAR_INC_DEC:
case Icode_NAME_INC_DEC:
case Icode_PROP_INC_DEC:
case Icode_ELEM_INC_DEC:
case Icode_REF_INC_DEC:
{
int incrDecrType = iCode[pc];
out.println(tname + " " + incrDecrType);
++pc;
break;
}
case Icode_CALLSPECIAL:
case Icode_CALLSPECIAL_OPTIONAL:
{
int callType = iCode[pc] & 0xFF;
boolean isNew = (iCode[pc + 1] != 0);
int line = getIndex(iCode, pc + 2);
out.println(
tname + " " + callType + " " + isNew + " " + indexReg + " " + line);
pc += 4;
break;
}
case Token.CATCH_SCOPE:
{
boolean afterFisrtFlag = (iCode[pc] != 0);
out.println(tname + " " + afterFisrtFlag);
++pc;
}
break;
case Token.REGEXP:
out.println(tname + " " + idata.itsRegExpLiterals[indexReg]);
break;
case Icode_LITERAL_NEW_OBJECT:
{
boolean copyArray = iCode[pc++] != 0;
Object[] keys = (Object[]) idata.literalIds[indexReg];
out.println(tname + " " + Arrays.toString(keys) + " " + copyArray);
break;
}
case Icode_SPARE_ARRAYLIT:
out.println(tname + " " + idata.literalIds[indexReg]);
break;
case Icode_CLOSURE_EXPR:
case Icode_CLOSURE_STMT:
out.println(tname + " " + idata.itsNestedFunctions[indexReg]);
break;
case Token.CALL:
case Icode_CALL_ON_SUPER:
case Icode_TAIL_CALL:
case Token.REF_CALL:
case Token.NEW:
out.println(tname + ' ' + indexReg);
break;
case Token.THROW:
case Token.YIELD:
case Icode_YIELD_STAR:
case Icode_GENERATOR:
case Icode_GENERATOR_END:
case Icode_GENERATOR_RETURN:
{
int line = getIndex(iCode, pc);
out.println(tname + " : " + line);
pc += 2;
break;
}
case Icode_SHORTNUMBER:
{
int value = getShort(iCode, pc);
out.println(tname + " " + value);
pc += 2;
break;
}
case Icode_INTNUMBER:
{
int value = getInt(iCode, pc);
out.println(tname + " " + value);
pc += 4;
break;
}
case Token.NUMBER:
{
double value = idata.itsDoubleTable[indexReg];
out.println(tname + " " + value);
break;
}
case Icode_LINE:
{
int line = getIndex(iCode, pc);
out.println(tname + " : " + line);
pc += 2;
break;
}
case Icode_REG_STR1:
{
String str = strings[0xFF & iCode[pc]];
out.println(tname + " \"" + str + '"');
++pc;
break;
}
case Icode_REG_STR2:
{
String str = strings[getIndex(iCode, pc)];
out.println(tname + " \"" + str + '"');
pc += 2;
break;
}
case Icode_REG_STR4:
{
String str = strings[getInt(iCode, pc)];
out.println(tname + " \"" + str + '"');
pc += 4;
break;
}
case Icode_REG_STR_C0:
{
String str = strings[0];
out.println(tname + " \"" + str + '"');
break;
}
case Icode_REG_STR_C1:
{
String str = strings[1];
out.println(tname + " \"" + str + '"');
break;
}
case Icode_REG_STR_C2:
{
String str = strings[2];
out.println(tname + " \"" + str + '"');
break;
}
case Icode_REG_STR_C3:
{
String str = strings[3];
out.println(tname + " \"" + str + '"');
break;
}
case Icode_REG_IND_C0:
indexReg = 0;
out.println(tname);
break;
case Icode_REG_IND_C1:
indexReg = 1;
out.println(tname);
break;
case Icode_REG_IND_C2:
indexReg = 2;
out.println(tname);
break;
case Icode_REG_IND_C3:
indexReg = 3;
out.println(tname);
break;
case Icode_REG_IND_C4:
indexReg = 4;
out.println(tname);
break;
case Icode_REG_IND_C5:
indexReg = 5;
out.println(tname);
break;
case Icode_REG_IND1:
{
indexReg = 0xFF & iCode[pc];
out.println(tname + " " + indexReg);
++pc;
break;
}
case Icode_REG_IND2:
{
indexReg = getIndex(iCode, pc);
out.println(tname + " " + indexReg);
pc += 2;
break;
}
case Icode_REG_IND4:
{
indexReg = getInt(iCode, pc);
out.println(tname + " " + indexReg);
pc += 4;
break;
}
case Icode_GETVAR1:
case Icode_SETVAR1:
case Icode_SETCONSTVAR1:
indexReg = iCode[pc];
out.println(tname + " " + indexReg);
++pc;
break;
// TODO: Icode_REG_STR_C0-3 is not dump. I made this the same it.
case Icode_REG_BIGINT_C0:
case Icode_REG_BIGINT_C1:
case Icode_REG_BIGINT_C2:
case Icode_REG_BIGINT_C3:
Kit.codeBug();
break;
case Icode_REG_BIGINT1:
{
BigInteger bigInt = bigInts[0xFF & iCode[pc]];
out.println(tname + " " + bigInt.toString() + 'n');
++pc;
break;
}
case Icode_REG_BIGINT2:
{
BigInteger bigInt = bigInts[getIndex(iCode, pc)];
out.println(tname + " " + bigInt.toString() + 'n');
pc += 2;
break;
}
case Icode_REG_BIGINT4:
{
BigInteger bigInt = bigInts[getInt(iCode, pc)];
out.println(tname + " " + bigInt.toString() + 'n');
pc += 4;
break;
}
}
if (old_pc + icodeLength != pc) Kit.codeBug();
}
int[] table = idata.itsExceptionTable;
if (table != null) {
out.println("Exception handlers: " + table.length / EXCEPTION_SLOT_SIZE);
for (int i = 0; i != table.length; i += EXCEPTION_SLOT_SIZE) {
int tryStart = table[i + EXCEPTION_TRY_START_SLOT];
int tryEnd = table[i + EXCEPTION_TRY_END_SLOT];
int handlerStart = table[i + EXCEPTION_HANDLER_SLOT];
int type = table[i + EXCEPTION_TYPE_SLOT];
int exceptionLocal = table[i + EXCEPTION_LOCAL_SLOT];
out.println(
" tryStart="
+ tryStart
+ " tryEnd="
+ tryEnd
+ " handlerStart="
+ handlerStart
+ " type="
+ (type == 0 ? "catch" : "finally")
+ " exceptionLocal="
+ exceptionLocal);
}
}
out.flush();
}