home *** CD-ROM | disk | FTP | other *** search
- package com.netscape.javascript;
-
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.PrintWriter;
- import java.util.Enumeration;
- import java.util.Vector;
-
- public class Interpreter extends LabelTable {
- public static final boolean printICode = false;
- boolean itsInFunctionFlag;
- Vector itsFunctionList;
- InterpreterData itsData;
- int itsTryDepth = 0;
- int itsStackDepth = 0;
- int itsEpilogLabel = -1;
- String itsSourceFile;
- int itsLineNumber = 0;
- InterpretedFunction[] itsNestedFunctions = null;
- static PrintWriter out;
- private static final Double zero = new Double((double)0.0F);
- private static final Double one = new Double((double)1.0F);
- private int version;
-
- private static Number getNumber(Number[] var0, byte[] var1, int var2) {
- int var3 = (var1[var2] << 8) + (var1[var2 + 1] & 255);
- return var0[var3];
- }
-
- private void generateNestedFunctions(Scriptable var1, Context var2, Object var3) {
- this.itsNestedFunctions = new InterpretedFunction[this.itsFunctionList.size()];
-
- for(short var4 = 0; var4 < this.itsFunctionList.size(); ++var4) {
- FunctionNode var5 = (FunctionNode)this.itsFunctionList.elementAt(var4);
- Interpreter var6 = new Interpreter();
- var6.itsData = new InterpreterData(0, 0, 0, var3);
- var6.itsInFunctionFlag = true;
- this.itsNestedFunctions[var4] = var6.generateFunctionICode(var2, var1, var5, var3);
- ((Node)var5).putProp(5, new Short(var4));
- }
-
- }
-
- private final int addByte(byte var1, int var2) {
- if (this.itsData.itsICode.length == var2) {
- byte[] var3 = new byte[var2 * 2];
- System.arraycopy(this.itsData.itsICode, 0, var3, 0, var2);
- this.itsData.itsICode = var3;
- }
-
- this.itsData.itsICode[var2++] = var1;
- return var2;
- }
-
- private static int getTarget(byte[] var0, int var1) {
- int var2 = (var0[var1] << 8) + (var0[var1 + 1] & 255);
- return var1 - 1 + var2;
- }
-
- private int addLocalRef(Node var1, int var2) {
- Integer var4 = (Integer)var1.getProp(7);
- int var3;
- if (var4 == null) {
- var3 = this.itsData.itsMaxLocals++;
- var1.putProp(7, new Integer(var3));
- } else {
- var3 = var4;
- }
-
- var2 = this.addByte((byte)var3, var2);
- if (var3 >= this.itsData.itsMaxLocals) {
- this.itsData.itsMaxLocals = var3 + 1;
- }
-
- return var2;
- }
-
- private void generateICodeFromTree(Node var1, VariableTable var2, boolean var3, Object var4) {
- int var5 = 0;
- this.itsData.itsVariableTable = var2;
- this.itsData.itsNeedsActivation = var3;
- var5 = this.generateICode(var1, var5);
- this.itsData.itsICodeTop = var5;
- if (this.itsEpilogLabel != -1) {
- ((LabelTable)this).markLabel(this.itsEpilogLabel, var5);
- }
-
- for(int var6 = 0; var6 < super.itsLabelTableTop; ++var6) {
- super.itsLabelTable[var6].fixGotos(this.itsData.itsICode);
- }
-
- }
-
- private InterpretedScript generateScriptICode(Context var1, Scriptable var2, Node var3, Object var4) {
- this.itsSourceFile = (String)var3.getProp(16);
- this.itsFunctionList = (Vector)var3.getProp(5);
- if (this.itsFunctionList != null) {
- this.generateNestedFunctions(var2, var1, var4);
- }
-
- NativeRegExp[] var5 = null;
- Vector var6 = (Vector)var3.getProp(12);
- if (var6 != null) {
- var5 = this.generateRegExpLiterals(var6, var2);
- }
-
- VariableTable var7 = (VariableTable)var3.getProp(10);
- this.generateICodeFromTree(var3, var7, false, var4);
- this.itsData.itsNestedFunctions = this.itsNestedFunctions;
- this.itsData.itsRegExpLiterals = var5;
- return new InterpretedScript(this.itsData, var1);
- }
-
- private InterpretedFunction generateFunctionICode(Context var1, Scriptable var2, FunctionNode var3, Object var4) {
- this.itsFunctionList = (Vector)((Node)var3).getProp(5);
- if (this.itsFunctionList != null) {
- this.generateNestedFunctions(var2, var1, var4);
- }
-
- NativeRegExp[] var5 = null;
- Vector var6 = (Vector)((Node)var3).getProp(12);
- if (var6 != null) {
- var5 = this.generateRegExpLiterals(var6, var2);
- }
-
- VariableTable var7 = var3.getVariableTable();
- this.generateICodeFromTree(((Node)var3).getLastChild(), var7, var3.requiresActivation(), var4);
- this.itsData.itsName = var3.getFunctionName();
- this.itsData.itsSource = (String)((Node)var3).getProp(17);
- this.itsData.itsNestedFunctions = this.itsNestedFunctions;
- this.itsData.itsRegExpLiterals = var5;
- return new InterpretedFunction(this.itsData, var1);
- }
-
- private void badTree(Node var1) {
- try {
- out = new PrintWriter(new FileOutputStream("icode.txt", true));
- out.println("Un-handled node : " + var1.toString());
- out.close();
- } catch (IOException var2) {
- }
-
- throw new RuntimeException("Un-handled node : " + var1.toString());
- }
-
- private static String getString(String[] var0, byte[] var1, int var2) {
- int var3 = (var1[var2] << 8) + (var1[var2 + 1] & 255);
- return var0[var3];
- }
-
- private static void dumpICode(InterpreterData var0) {
- }
-
- public Object compile(Context var1, Scriptable var2, Node var3, Object var4, SecuritySupport var5, ClassNameHelper var6) throws IOException {
- this.version = var1.getLanguageVersion();
- this.itsData = new InterpreterData(0, 0, 0, var4);
- if (var3 instanceof FunctionNode) {
- FunctionNode var7 = (FunctionNode)var3;
- InterpretedFunction var8 = this.generateFunctionICode(var1, var2, var7, var4);
- createFunctionObject(var8, var2);
- return var8;
- } else {
- return this.generateScriptICode(var1, var2, var3, var4);
- }
- }
-
- public static Object interpret(InterpreterData var0) throws JavaScriptException {
- Object[] var2 = new Object[var0.itsMaxStack];
- int var3 = -1;
- byte[] var4 = var0.itsICode;
- int var5 = 0;
- int var6 = var0.itsICodeTop;
- Object[] var7 = null;
- if (var0.itsMaxLocals > 0) {
- var7 = new Object[var0.itsMaxLocals];
- }
-
- Object[] var8 = null;
- int var9 = var0.itsVariableTable.size();
- if (var9 > 0) {
- var8 = new Object[var9];
-
- for(var9 = 0; var9 < var0.itsVariableTable.getParameterCount(); ++var9) {
- if (var9 >= var0.itsInArgs.length) {
- var8[var9] = Undefined.instance;
- } else {
- var8[var9] = var0.itsInArgs[var9];
- }
- }
-
- while(var9 < var8.length) {
- var8[var9] = Undefined.instance;
- ++var9;
- }
- }
-
- Context var10 = var0.itsCX;
- Scriptable var11 = var0.itsScope;
- if (var0.itsNestedFunctions != null) {
- for(int var75 = 0; var75 < var0.itsNestedFunctions.length; ++var75) {
- createFunctionObject(var0.itsNestedFunctions[var75], var11);
- }
- }
-
- int[] var22 = null;
- int[] var23 = null;
- Scriptable[] var24 = null;
- int var25 = 0;
- if (var0.itsMaxTryDepth > 0) {
- var22 = new int[var0.itsMaxTryDepth];
- var23 = new int[var0.itsMaxTryDepth];
- var24 = new Scriptable[var0.itsMaxTryDepth];
- }
-
- var10.interpreterSecurityDomain = var0.securityDomain;
- Object var26 = Undefined.instance;
-
- while(var5 < var6) {
- try {
- switch (var4[var5]) {
- case 2:
- var26 = var2[var3--];
- break;
- case 3:
- Object var68 = var2[var3--];
- var11 = ScriptRuntime.enterWith(var68, var11);
- break;
- case 4:
- var11 = ScriptRuntime.leaveWith(var11);
- break;
- case 5:
- var26 = var2[var3--];
- var5 = getTarget(var4, var5 + 1);
- break;
- case 6:
- var5 = getTarget(var4, var5 + 1);
- continue;
- case 7:
- if (ScriptRuntime.toBoolean(var2[var3--])) {
- var5 = getTarget(var4, var5 + 1);
- continue;
- }
-
- var5 += 2;
- break;
- case 8:
- if (!ScriptRuntime.toBoolean(var2[var3--])) {
- var5 = getTarget(var4, var5 + 1);
- continue;
- }
-
- var5 += 2;
- break;
- case 9:
- var2[var3 + 1] = var2[var3];
- ++var3;
- break;
- case 10:
- Object var110 = var2[var3--];
- Object var67 = var2[var3];
- var2[var3] = ScriptRuntime.setName((Scriptable)var67, var110, var11, getString(var0.itsStringTable, var4, var5 + 1));
- var5 += 2;
- break;
- case 11:
- int var137 = ScriptRuntime.toInt32(var2[var3--]);
- int var131 = ScriptRuntime.toInt32(var2[var3]);
- var2[var3] = new Double((double)(var131 | var137));
- break;
- case 12:
- int var136 = ScriptRuntime.toInt32(var2[var3--]);
- int var130 = ScriptRuntime.toInt32(var2[var3]);
- var2[var3] = new Double((double)(var130 ^ var136));
- break;
- case 13:
- int var135 = ScriptRuntime.toInt32(var2[var3--]);
- int var129 = ScriptRuntime.toInt32(var2[var3]);
- var2[var3] = new Double((double)(var129 & var135));
- break;
- case 14:
- Object var109 = var2[var3--];
- Object var66 = var2[var3];
- var2[var3] = ScriptRuntime.eqB(var109, var66);
- break;
- case 15:
- Object var108 = var2[var3--];
- Object var65 = var2[var3];
- var2[var3] = ScriptRuntime.neB(var65, var108);
- break;
- case 16:
- Object var107 = var2[var3--];
- Object var64 = var2[var3];
- var2[var3] = ScriptRuntime.cmp_LTB(var64, var107);
- break;
- case 17:
- Object var106 = var2[var3--];
- Object var63 = var2[var3];
- var2[var3] = ScriptRuntime.cmp_LEB(var63, var106);
- break;
- case 18:
- Object var105 = var2[var3--];
- Object var62 = var2[var3];
- var2[var3] = ScriptRuntime.cmp_LTB(var105, var62);
- break;
- case 19:
- Object var104 = var2[var3--];
- Object var61 = var2[var3];
- var2[var3] = ScriptRuntime.cmp_LEB(var104, var61);
- break;
- case 20:
- int var134 = ScriptRuntime.toInt32(var2[var3--]);
- int var128 = ScriptRuntime.toInt32(var2[var3]);
- var2[var3] = new Double((double)(var128 << var134));
- break;
- case 21:
- int var133 = ScriptRuntime.toInt32(var2[var3--]);
- int var18 = ScriptRuntime.toInt32(var2[var3]);
- var2[var3] = new Double((double)(var18 >> var133));
- break;
- case 22:
- int var132 = ScriptRuntime.toInt32(var2[var3--]) & 31;
- long var19 = ScriptRuntime.toUint32(var2[var3]);
- var2[var3] = new Double((double)(var19 >>> var132));
- break;
- case 23:
- Object var103 = var2[var3--];
- Object var60 = var2[var3];
- var2[var3] = ScriptRuntime.add(var60, var103);
- break;
- case 24:
- Object var102 = var2[var3--];
- Object var59 = var2[var3];
- var2[var3] = new Double(ScriptRuntime.toNumber(var59) - ScriptRuntime.toNumber(var102));
- break;
- case 25:
- Object var101 = var2[var3--];
- Object var58 = var2[var3];
- var2[var3] = new Double(ScriptRuntime.toNumber(var58) * ScriptRuntime.toNumber(var101));
- break;
- case 26:
- Object var100 = var2[var3--];
- Object var57 = var2[var3];
- var2[var3] = new Double(ScriptRuntime.toNumber(var57) / ScriptRuntime.toNumber(var100));
- break;
- case 27:
- Object var99 = var2[var3--];
- Object var56 = var2[var3];
- var2[var3] = new Double(ScriptRuntime.toNumber(var56) % ScriptRuntime.toNumber(var99));
- break;
- case 28:
- int var21 = ScriptRuntime.toInt32(var2[var3]);
- var2[var3] = new Double((double)(~var21));
- break;
- case 29:
- Object var98 = var2[var3];
- var2[var3] = new Double(-ScriptRuntime.toNumber(var98));
- break;
- case 30:
- int var112 = var4[var5 + 1] << 8 | var4[var5 + 2] & 255;
- Object[] var127 = new Object[var112];
-
- for(int var83 = var112 - 1; var83 >= 0; --var83) {
- var127[var83] = var2[var3--];
- }
-
- Object var55 = var2[var3];
- var2[var3] = ScriptRuntime.newObject(var10, var55, var127);
- var5 += 2;
- break;
- case 31:
- Object var97 = var2[var3--];
- Object var54 = var2[var3];
- var2[var3] = ScriptRuntime.delete(var54, var97);
- break;
- case 32:
- Object var53 = var2[var3];
- var2[var3] = ScriptRuntime.typeof(var53);
- break;
- case 33:
- ++var3;
- var2[var3] = ScriptRuntime.postIncrement(var11, getString(var0.itsStringTable, var4, var5 + 1));
- var5 += 2;
- break;
- case 34:
- String var125 = (String)var2[var3--];
- Object var52 = var2[var3];
- var2[var3] = ScriptRuntime.postIncrement(var52, var125, var11);
- break;
- case 35:
- Object var96 = var2[var3--];
- Object var51 = var2[var3];
- var2[var3] = ScriptRuntime.postIncrementElem(var51, var96, var11);
- break;
- case 36:
- ++var3;
- var2[var3] = ScriptRuntime.postDecrement(var11, getString(var0.itsStringTable, var4, var5 + 1));
- var5 += 2;
- break;
- case 37:
- String var124 = (String)var2[var3--];
- Object var50 = var2[var3];
- var2[var3] = ScriptRuntime.postDecrement(var50, var124, var11);
- break;
- case 38:
- Object var95 = var2[var3--];
- Object var49 = var2[var3];
- var2[var3] = ScriptRuntime.postDecrementElem(var49, var95, var11);
- break;
- case 39:
- String var123 = (String)var2[var3--];
- Object var48 = var2[var3];
- var2[var3] = ScriptRuntime.getProp(var48, var123, var11);
- break;
- case 40:
- Object var94 = var2[var3--];
- String var122 = (String)var2[var3--];
- Object var47 = var2[var3];
- var2[var3] = ScriptRuntime.setProp(var47, var122, var94, var11);
- break;
- case 41:
- Object var84 = var2[var3--];
- Object var46 = var2[var3];
- var2[var3] = ScriptRuntime.getElem(var46, var84, var11);
- break;
- case 42:
- Object var93 = var2[var3--];
- Object var12 = var2[var3--];
- Object var45 = var2[var3];
- var2[var3] = ScriptRuntime.setElem(var45, var12, var93, var11);
- break;
- case 43:
- int var111 = var4[var5 + 1] << 8 | var4[var5 + 2] & 255;
- Object[] var126 = new Object[var111];
-
- for(int var82 = var111 - 1; var82 >= 0; --var82) {
- var126[var82] = var2[var3--];
- }
-
- Object var92 = var2[var3--];
- Object var44 = var2[var3];
- var2[var3] = ScriptRuntime.call(var10, var44, var92, var126);
- var5 += 2;
- var10.interpreterSecurityDomain = var0.securityDomain;
- break;
- case 44:
- ++var3;
- var2[var3] = ScriptRuntime.name(var11, getString(var0.itsStringTable, var4, var5 + 1));
- var5 += 2;
- break;
- case 45:
- ++var3;
- var2[var3] = getNumber(var0.itsNumberTable, var4, var5 + 1);
- var5 += 2;
- break;
- case 46:
- ++var3;
- var2[var3] = getString(var0.itsStringTable, var4, var5 + 1);
- var5 += 2;
- break;
- case 47:
- ++var3;
- var2[var3] = zero;
- break;
- case 48:
- ++var3;
- var2[var3] = one;
- break;
- case 49:
- ++var3;
- var2[var3] = null;
- break;
- case 50:
- ++var3;
- var2[var3] = var0.itsThisObj;
- break;
- case 51:
- ++var3;
- var2[var3] = Boolean.FALSE;
- break;
- case 52:
- ++var3;
- var2[var3] = Boolean.TRUE;
- break;
- case 53:
- Object var91 = var2[var3--];
- Object var43 = var2[var3];
- var2[var3] = ScriptRuntime.seqB(var43, var91);
- break;
- case 54:
- Object var90 = var2[var3--];
- Object var42 = var2[var3];
- var2[var3] = ScriptRuntime.sneB(var42, var90);
- break;
- case 55:
- var9 = var4[var5 + 1] << 8 | var4[var5 + 2] & 255;
- ++var3;
- var2[var3] = new NativeClosure(var10, var11, var0.itsNestedFunctions[var9]);
- var5 += 2;
- break;
- case 56:
- var9 = var4[var5 + 1] << 8 | var4[var5 + 2] & 255;
- ++var3;
- var2[var3] = var0.itsRegExpLiterals[var9];
- var5 += 2;
- break;
- case 57:
- --var3;
- break;
- case 58:
- Object var89 = var2[var3];
- var2[var3] = new Double(ScriptRuntime.toNumber(var89));
- break;
- case 59:
- ++var5;
- int var120 = var4[var5] & 255;
- ++var3;
- var2[var3] = var8[var120];
- var8[var120] = ScriptRuntime.postIncrement(var8[var120]);
- break;
- case 60:
- ++var5;
- int var119 = var4[var5] & 255;
- ++var3;
- var2[var3] = var8[var119];
- var8[var119] = ScriptRuntime.postDecrement(var8[var119]);
- break;
- case 61:
- ++var3;
- var2[var3] = ScriptRuntime.bind(var11, getString(var0.itsStringTable, var4, var5 + 1));
- var5 += 2;
- break;
- case 62:
- var10.interpreterSecurityDomain = null;
- throw new JavaScriptException(var2[var3--]);
- case 63:
- Object var88 = var2[var3--];
- Object var41 = var2[var3];
- var2[var3] = new Boolean(ScriptRuntime.in(var41, var88));
- break;
- case 64:
- Object var87 = var2[var3--];
- Object var40 = var2[var3];
- var2[var3] = new Boolean(ScriptRuntime.instanceOf(var40, var87));
- break;
- case 65:
- ++var3;
- var2[var3] = new Integer(var5 + 3);
- var5 = getTarget(var4, var5 + 1);
- continue;
- case 66:
- ++var5;
- int var118 = var4[var5] & 255;
- var5 = (Integer)var7[var118];
- continue;
- case 67:
- var9 = var4[var5 + 1] << 8 | var4[var5 + 2] & 255;
- String var121 = getString(var0.itsStringTable, var4, var5 + 3);
- int var14 = var4[var5 + 5] << 8 | var4[var5 + 6] & 255;
- Object[] var17 = new Object[var14];
-
- for(var9 = var14 - 1; var9 >= 0; --var9) {
- var17[var9] = var2[var3--];
- }
-
- Object var86 = var2[var3--];
- Object var39 = var2[var3];
- var2[var3] = ScriptRuntime.callSpecial(var10, var39, var86, var17, var0.itsThisObj, var11, var121, var9);
- var5 += 6;
- break;
- case 68:
- Object var38 = var2[var3];
- var2[var3] = ScriptRuntime.getThis((Scriptable)var38);
- break;
- case 69:
- Object var37 = var2[var3];
- ++var5;
- int var117 = var4[var5] & 255;
- var7[var117] = var37;
- break;
- case 70:
- ++var5;
- int var116 = var4[var5] & 255;
- ++var3;
- var2[var3] = var7[var116];
- break;
- case 71:
- ++var3;
- var2[var3] = ScriptRuntime.getBase(var11, getString(var0.itsStringTable, var4, var5 + 1));
- var5 += 2;
- break;
- case 72:
- ++var5;
- int var115 = var4[var5] & 255;
- ++var3;
- var2[var3] = var8[var115];
- break;
- case 73:
- Object var36 = var2[var3];
- ++var5;
- int var114 = var4[var5] & 255;
- var8[var114] = var36;
- break;
- case 74:
- ++var3;
- var2[var3] = Undefined.instance;
- break;
- case 75:
- var9 = getTarget(var4, var5 + 1);
- if (var9 == var5) {
- var9 = 0;
- }
-
- var22[var25] = var9;
- var9 = getTarget(var4, var5 + 3);
- if (var9 == var5 + 2) {
- var9 = 0;
- }
-
- var23[var25] = var9;
- var24[var25++] = var11;
- var5 += 4;
- break;
- case 76:
- --var25;
- break;
- case 77:
- ++var3;
- var2[var3] = ScriptRuntime.newScope();
- break;
- case 78:
- String var16 = getString(var0.itsStringTable, var4, var5 + 1);
- ++var3;
- var2[var3] = ScriptRuntime.typeofName(var11, var16);
- var5 += 2;
- break;
- case 79:
- ++var5;
- int var113 = var4[var5] & 255;
- Object var35 = var2[var3--];
- var7[var113] = ScriptRuntime.initEnum(var35, var11);
- break;
- case 80:
- ++var5;
- int var15 = var4[var5] & 255;
- ++var3;
- var2[var3] = ScriptRuntime.nextEnum((Enumeration)var7[var15]);
- break;
- case 81:
- Object var34 = var2[var3];
- var2[var3] = ScriptRuntime.getProto(var34, var11);
- break;
- case 82:
- Object var33 = var2[var3];
- var2[var3] = ScriptRuntime.getParent(var33);
- break;
- case 83:
- Object var85 = var2[var3--];
- Object var32 = var2[var3];
- var2[var3] = ScriptRuntime.setProto(var32, var85, var11);
- break;
- case 84:
- Object var13 = var2[var3--];
- Object var31 = var2[var3];
- var2[var3] = ScriptRuntime.setParent(var31, var13, var11);
- break;
- case 85:
- ++var3;
- var2[var3] = var11;
- break;
- case 86:
- Object var30 = var2[var3];
- var2[var3] = ScriptRuntime.getParent(var30, var11);
- break;
- case 87:
- var10.interpreterSecurityDomain = null;
- Object var1 = var2[var3--];
- if (var1 instanceof JavaScriptException) {
- throw (JavaScriptException)var1;
- }
-
- throw (RuntimeException)var1;
- default:
- dumpICode(var0);
- throw new RuntimeException("Unknown icode : " + (var4[var5] & 255) + " @ pc : " + var5);
- }
-
- ++var5;
- } catch (JavaScriptException var28) {
- var3 = 0;
- var10.interpreterSecurityDomain = var0.securityDomain;
- if (var25 <= 0) {
- throw var28;
- }
-
- --var25;
- var5 = var22[var25];
- var11 = var24[var25];
- if (var5 == 0) {
- var5 = var23[var25];
- if (var5 == 0) {
- throw var28;
- }
-
- var2[0] = var28;
- } else {
- var2[0] = ScriptRuntime.unwrapJavaScriptException(var28);
- }
- } catch (RuntimeException var29) {
- if (var25 <= 0) {
- throw var29;
- }
-
- var3 = 0;
- var2[0] = var29;
- --var25;
- var5 = var23[var25];
- var11 = var24[var25];
- var10.interpreterSecurityDomain = var0.securityDomain;
- if (var5 == 0) {
- throw var29;
- }
- }
- }
-
- var10.interpreterSecurityDomain = null;
- return var26;
- }
-
- private static void createFunctionObject(InterpretedFunction var0, Scriptable var1) {
- ((ScriptableObject)var0).setPrototype(ScriptableObject.getClassPrototype(var1, "Function"));
- ((ScriptableObject)var0).setParentScope(var1);
- if (var0.itsData.itsName.length() > 0) {
- ScriptRuntime.setName(var1, var0, var1, var0.itsData.itsName);
- }
-
- }
-
- private int addGoto(Node var1, int var2, int var3) {
- int var4;
- if (var1.getType() == 5) {
- if (this.itsEpilogLabel == -1) {
- this.itsEpilogLabel = ((LabelTable)this).acquireLabel();
- }
-
- var4 = this.itsEpilogLabel;
- } else {
- Node var5 = (Node)var1.getProp(1);
- Object var6 = var5.getProp(20);
- if (var6 == null) {
- var4 = ((LabelTable)this).acquireLabel();
- var5.putProp(20, new Integer(var4));
- } else {
- var4 = (Integer)var6;
- }
- }
-
- var3 = this.addGoto(var4, (byte)var2, var3);
- return var3;
- }
-
- private int addGoto(int var1, int var2, int var3) {
- int var4 = var3;
- var3 = this.addByte((byte)var2, var3);
- int var5 = var1 & Integer.MAX_VALUE;
- short var6 = super.itsLabelTable[var5].getPC();
- if (var6 != -1) {
- short var7 = (short)(var6 - var4);
- var3 = this.addByte((byte)(var7 >> 8), var3);
- var3 = this.addByte((byte)var7, var3);
- } else {
- super.itsLabelTable[var5].addFixup(var4 + 1);
- var3 = this.addByte((byte)0, var3);
- var3 = this.addByte((byte)0, var3);
- }
-
- return var3;
- }
-
- private NativeRegExp[] generateRegExpLiterals(Vector var1, Scriptable var2) {
- NativeRegExp[] var3 = new NativeRegExp[var1.size()];
-
- for(int var4 = 0; var4 < var1.size(); ++var4) {
- Node var5 = (Node)var1.elementAt(var4);
- Node var6 = var5.getFirstChild();
- Node var7 = var5.getLastChild();
- var3[var4] = new NativeRegExp(var2, var6.getString(), var6 == var7 ? null : var7.getString());
- var5.putProp(12, new Integer(var4));
- }
-
- return var3;
- }
-
- private void updateLineNumber(Node var1) {
- Object var2 = var1.getDatum();
- if (var2 != null && var2 instanceof Number) {
- this.itsLineNumber = ((Number)var2).shortValue();
- }
- }
-
- public Node transform(Node var1, TokenStream var2) {
- return (new NodeTransformer()).transform(var1, (Node)null, var2);
- }
-
- private final int addNumber(Number var1, int var2) {
- var2 = this.addByte((byte)(this.itsData.itsNumberTableIndex >> 8), var2);
- var2 = this.addByte((byte)(this.itsData.itsNumberTableIndex & 255), var2);
- if (this.itsData.itsNumberTable.length == this.itsData.itsNumberTableIndex) {
- Number[] var3 = new Number[this.itsData.itsNumberTableIndex * 2];
- System.arraycopy(this.itsData.itsNumberTable, 0, var3, 0, this.itsData.itsNumberTableIndex);
- this.itsData.itsNumberTable = var3;
- }
-
- this.itsData.itsNumberTable[this.itsData.itsNumberTableIndex++] = var1;
- return var2;
- }
-
- public IRFactory createIRFactory(TokenStream var1, ClassNameHelper var2) {
- return new IRFactory(var1);
- }
-
- private final int addString(String var1, int var2) {
- var2 = this.addByte((byte)(this.itsData.itsStringTableIndex >> 8), var2);
- var2 = this.addByte((byte)(this.itsData.itsStringTableIndex & 255), var2);
- if (this.itsData.itsStringTable.length == this.itsData.itsStringTableIndex) {
- String[] var3 = new String[this.itsData.itsStringTableIndex * 2];
- System.arraycopy(this.itsData.itsStringTable, 0, var3, 0, this.itsData.itsStringTableIndex);
- this.itsData.itsStringTable = var3;
- }
-
- this.itsData.itsStringTable[this.itsData.itsStringTableIndex++] = var1;
- return var2;
- }
-
- private int generateICode(Node var1, int var2) {
- int var3 = var1.getType();
- Node var4 = var1.getFirstChild();
- switch (var3) {
- case 2:
- case 57:
- this.updateLineNumber(var1);
- case 3:
- var2 = this.generateICode(var4, var2);
- var2 = this.addByte((byte)var3, var2);
- this.itsStackDepth += -1;
- break;
- case 4:
- var2 = this.addByte((byte)var3, var2);
- break;
- case 5:
- this.updateLineNumber(var1);
- if (var4 != null) {
- var2 = this.generateICode(var4, var2);
- } else {
- var2 = this.addByte((byte)74, var2);
- ++this.itsStackDepth;
- if (this.itsStackDepth > this.itsData.itsMaxStack) {
- this.itsData.itsMaxStack = this.itsStackDepth;
- }
- }
-
- var2 = this.addGoto(var1, 5, var2);
- this.itsStackDepth += -1;
- break;
- case 7:
- case 8:
- var2 = this.generateICode(var4, var2);
- this.itsStackDepth += -1;
- case 6:
- var2 = this.addGoto(var1, (byte)var3, var2);
- break;
- case 10:
- var2 = this.generateICode(var4, var2);
- Node var111 = var4.getNextSibling();
- var2 = this.generateICode(var111, var2);
- var2 = this.addByte((byte)10, var2);
- var2 = this.addString(var4.getString(), var2);
- this.itsStackDepth += -1;
- break;
- case 11:
- case 12:
- case 13:
- case 20:
- case 21:
- case 22:
- case 23:
- case 24:
- case 25:
- case 26:
- case 27:
- case 31:
- case 41:
- var2 = this.generateICode(var4, var2);
- var4 = var4.getNextSibling();
- var2 = this.generateICode(var4, var2);
- var2 = this.addByte((byte)var3, var2);
- this.itsStackDepth += -1;
- break;
- case 30:
- case 43:
- int var132;
- for(var132 = 0; var4 != null; ++var132) {
- var2 = this.generateICode(var4, var2);
- var4 = var4.getNextSibling();
- }
-
- if (var1.getProp(30) != null) {
- var2 = this.addByte((byte)67, var2);
- var2 = this.addByte((byte)(this.itsLineNumber >> 8), var2);
- var2 = this.addByte((byte)(this.itsLineNumber & 255), var2);
- var2 = this.addString(this.itsSourceFile, var2);
- } else {
- var2 = this.addByte((byte)var3, var2);
- }
-
- this.itsStackDepth -= var132 - 1;
- if (var3 == 30) {
- --var132;
- } else {
- var132 -= 2;
- }
-
- var2 = this.addByte((byte)(var132 >> 8), var2);
- var2 = this.addByte((byte)(var132 & 255), var2);
- if (var132 > this.itsData.itsMaxArgs) {
- this.itsData.itsMaxArgs = var132;
- }
- break;
- case 32:
- String var131 = var1.getString();
- int var145 = -1;
- if (this.itsInFunctionFlag) {
- var145 = this.itsData.itsVariableTable.getOrdinal(var131);
- }
-
- if (var145 == -1) {
- var2 = this.addByte((byte)78, var2);
- var2 = this.addString(var131, var2);
- } else {
- var2 = this.addByte((byte)72, var2);
- var2 = this.addByte((byte)var145, var2);
- var2 = this.addByte((byte)32, var2);
- }
-
- ++this.itsStackDepth;
- if (this.itsStackDepth > this.itsData.itsMaxStack) {
- this.itsData.itsMaxStack = this.itsStackDepth;
- }
- break;
- case 39:
- var2 = this.generateICode(var4, var2);
- String var130 = (String)var1.getProp(19);
- if (var130 != null) {
- if (var130.equals("__proto__")) {
- var2 = this.addByte((byte)81, var2);
- } else if (var130.equals("__parent__")) {
- var2 = this.addByte((byte)86, var2);
- } else {
- this.badTree(var1);
- }
- } else {
- var4 = var4.getNextSibling();
- var2 = this.generateICode(var4, var2);
- var2 = this.addByte((byte)39, var2);
- this.itsStackDepth += -1;
- }
- break;
- case 40:
- var2 = this.generateICode(var4, var2);
- var4 = var4.getNextSibling();
- var2 = this.generateICode(var4, var2);
- String var129 = (String)var1.getProp(19);
- if (var129 != null) {
- if (var129.equals("__proto__")) {
- var2 = this.addByte((byte)83, var2);
- } else if (var129.equals("__parent__")) {
- var2 = this.addByte((byte)84, var2);
- } else {
- this.badTree(var1);
- }
- } else {
- var4 = var4.getNextSibling();
- var2 = this.generateICode(var4, var2);
- var2 = this.addByte((byte)40, var2);
- this.itsStackDepth -= 2;
- }
- break;
- case 42:
- var2 = this.generateICode(var4, var2);
- var4 = var4.getNextSibling();
- var2 = this.generateICode(var4, var2);
- var4 = var4.getNextSibling();
- var2 = this.generateICode(var4, var2);
- var2 = this.addByte((byte)var3, var2);
- this.itsStackDepth -= 2;
- break;
- case 44:
- case 46:
- case 61:
- case 71:
- var2 = this.addByte((byte)var3, var2);
- var2 = this.addString(var1.getString(), var2);
- ++this.itsStackDepth;
- if (this.itsStackDepth > this.itsData.itsMaxStack) {
- this.itsData.itsMaxStack = this.itsStackDepth;
- }
- break;
- case 45:
- Number var128 = (Number)var1.getDatum();
- if (var128.doubleValue() == (double)0.0F) {
- var2 = this.addByte((byte)47, var2);
- } else if (var128.doubleValue() == (double)1.0F) {
- var2 = this.addByte((byte)48, var2);
- } else {
- var2 = this.addByte((byte)45, var2);
- var2 = this.addNumber(var128, var2);
- }
-
- ++this.itsStackDepth;
- if (this.itsStackDepth > this.itsData.itsMaxStack) {
- this.itsData.itsMaxStack = this.itsStackDepth;
- }
- break;
- case 56:
- Node var127 = (Node)var1.getProp(12);
- int var144 = (Integer)var127.getProp(12);
- var2 = this.addByte((byte)56, var2);
- var2 = this.addByte((byte)(var144 >> 8), var2);
- var2 = this.addByte((byte)(var144 & 255), var2);
- ++this.itsStackDepth;
- if (this.itsStackDepth > this.itsData.itsMaxStack) {
- this.itsData.itsMaxStack = this.itsStackDepth;
- }
- break;
- case 62:
- this.updateLineNumber(var1);
- var2 = this.generateICode(var4, var2);
- var2 = this.addByte((byte)62, var2);
- this.itsStackDepth += -1;
- break;
- case 68:
- var2 = this.generateICode(var4, var2);
- var2 = this.addByte((byte)var3, var2);
- break;
- case 69:
- case 143:
- var2 = this.generateICode(var4, var2);
- var2 = this.addByte((byte)69, var2);
- var2 = this.addLocalRef(var1, var2);
- break;
- case 70:
- var2 = this.addByte((byte)70, var2);
- Node var126 = (Node)var1.getProp(6);
- var2 = this.addLocalRef(var126, var2);
- ++this.itsStackDepth;
- if (this.itsStackDepth > this.itsData.itsMaxStack) {
- this.itsData.itsMaxStack = this.itsStackDepth;
- }
- break;
- case 72:
- String var125 = var1.getString();
- if (this.itsData.itsNeedsActivation) {
- var2 = this.addByte((byte)85, var2);
- var2 = this.addByte((byte)46, var2);
- var2 = this.addString(var125, var2);
- this.itsStackDepth += 2;
- if (this.itsStackDepth > this.itsData.itsMaxStack) {
- this.itsData.itsMaxStack = this.itsStackDepth;
- }
-
- var2 = this.addByte((byte)39, var2);
- this.itsStackDepth += -1;
- } else {
- int var143 = this.itsData.itsVariableTable.getOrdinal(var125);
- var2 = this.addByte((byte)72, var2);
- var2 = this.addByte((byte)var143, var2);
- ++this.itsStackDepth;
- if (this.itsStackDepth > this.itsData.itsMaxStack) {
- this.itsData.itsMaxStack = this.itsStackDepth;
- }
- }
- break;
- case 73:
- if (this.itsData.itsNeedsActivation) {
- var4.setType(61);
- var1.setType(10);
- var2 = this.generateICode(var1, var2);
- } else {
- String var124 = var4.getString();
- var4 = var4.getNextSibling();
- var2 = this.generateICode(var4, var2);
- int var142 = this.itsData.itsVariableTable.getOrdinal(var124);
- var2 = this.addByte((byte)73, var2);
- var2 = this.addByte((byte)var142, var2);
- }
- break;
- case 75:
- ++this.itsTryDepth;
- if (this.itsTryDepth > this.itsData.itsMaxTryDepth) {
- this.itsData.itsMaxTryDepth = this.itsTryDepth;
- }
-
- Node var123 = (Node)var1.getProp(1);
- Node var141 = (Node)var1.getProp(21);
- if (var123 == null) {
- var2 = this.addByte((byte)75, var2);
- var2 = this.addByte((byte)0, var2);
- var2 = this.addByte((byte)0, var2);
- } else {
- var2 = this.addGoto(var1, 75, var2);
- }
-
- int var148 = 0;
- if (var141 != null) {
- var148 = ((LabelTable)this).acquireLabel();
- int var151 = var148 & Integer.MAX_VALUE;
- super.itsLabelTable[var151].addFixup(var2);
- }
-
- var2 = this.addByte((byte)0, var2);
- var2 = this.addByte((byte)0, var2);
-
- for(Node var152 = null; var4 != null; var4 = var4.getNextSibling()) {
- if (var152 == var123) {
- this.itsStackDepth = 1;
- if (this.itsStackDepth > this.itsData.itsMaxStack) {
- this.itsData.itsMaxStack = this.itsStackDepth;
- }
- }
-
- var2 = this.generateICode(var4, var2);
- var152 = var4;
- }
-
- this.itsStackDepth = 0;
- var2 = this.addByte((byte)76, var2);
- if (var141 != null) {
- int var155 = ((LabelTable)this).acquireLabel();
- var2 = this.addGoto(var155, 6, var2);
- ((LabelTable)this).markLabel(var148, var2);
- this.itsStackDepth = 1;
- if (this.itsStackDepth > this.itsData.itsMaxStack) {
- this.itsData.itsMaxStack = this.itsStackDepth;
- }
-
- int var156 = this.itsData.itsMaxLocals++;
- int var57 = this.addByte((byte)69, var2);
- int var58 = this.addByte((byte)var156, var57);
- int var59 = this.addByte((byte)57, var58);
- Integer var157 = (Integer)var141.getProp(20);
- int var60 = this.addGoto(var157, 65, var59);
- int var61 = this.addByte((byte)70, var60);
- int var62 = this.addByte((byte)var156, var61);
- var2 = this.addByte((byte)87, var62);
- this.itsStackDepth = 0;
- ((LabelTable)this).markLabel(var155, var2);
- }
-
- this.itsTryDepth += -1;
- break;
- case 77:
- var2 = this.addByte((byte)var3, var2);
- ++this.itsStackDepth;
- if (this.itsStackDepth > this.itsData.itsMaxStack) {
- this.itsData.itsMaxStack = this.itsStackDepth;
- }
- break;
- case 79:
- var2 = this.generateICode(var4, var2);
- var2 = this.addByte((byte)79, var2);
- var2 = this.addLocalRef(var1, var2);
- this.itsStackDepth += -1;
- break;
- case 80:
- var2 = this.addByte((byte)80, var2);
- Node var122 = (Node)var1.getProp(4);
- var2 = this.addLocalRef(var122, var2);
- ++this.itsStackDepth;
- if (this.itsStackDepth > this.itsData.itsMaxStack) {
- this.itsData.itsMaxStack = this.itsStackDepth;
- }
- break;
- case 95:
- var2 = this.generateICode(var4, var2);
- var2 = this.addByte((byte)57, var2);
- this.itsStackDepth += -1;
- var4 = var4.getNextSibling();
- var2 = this.generateICode(var4, var2);
- break;
- case 99:
- var2 = this.generateICode(var4, var2);
- var2 = this.addByte((byte)9, var2);
- ++this.itsStackDepth;
- if (this.itsStackDepth > this.itsData.itsMaxStack) {
- this.itsData.itsMaxStack = this.itsStackDepth;
- }
-
- int var121 = ((LabelTable)this).acquireLabel();
- int var44 = this.addGoto(var121, 7, var2);
- int var45 = this.addByte((byte)57, var44);
- this.itsStackDepth += -1;
- var4 = var4.getNextSibling();
- var2 = this.generateICode(var4, var45);
- ((LabelTable)this).markLabel(var121, var2);
- break;
- case 100:
- var2 = this.generateICode(var4, var2);
- var2 = this.addByte((byte)9, var2);
- ++this.itsStackDepth;
- if (this.itsStackDepth > this.itsData.itsMaxStack) {
- this.itsData.itsMaxStack = this.itsStackDepth;
- }
-
- int var120 = ((LabelTable)this).acquireLabel();
- int var40 = this.addGoto(var120, 8, var2);
- int var41 = this.addByte((byte)57, var40);
- this.itsStackDepth += -1;
- var4 = var4.getNextSibling();
- var2 = this.generateICode(var4, var41);
- ((LabelTable)this).markLabel(var120, var2);
- break;
- case 101:
- case 102:
- var2 = this.generateICode(var4, var2);
- var4 = var4.getNextSibling();
- var2 = this.generateICode(var4, var2);
- int var119 = var1.getInt();
- if (this.version == 120) {
- if (var119 == 14) {
- var119 = 53;
- } else if (var119 == 15) {
- var119 = 54;
- }
- }
-
- var2 = this.addByte((byte)var119, var2);
- this.itsStackDepth += -1;
- break;
- case 104:
- var2 = this.generateICode(var4, var2);
- switch (var1.getInt()) {
- case 23:
- var2 = this.addByte((byte)58, var2);
- return var2;
- case 24:
- var2 = this.addByte((byte)29, var2);
- return var2;
- case 28:
- var2 = this.addByte((byte)28, var2);
- return var2;
- case 32:
- var2 = this.addByte((byte)32, var2);
- return var2;
- case 128:
- int var118 = ((LabelTable)this).acquireLabel();
- int var140 = ((LabelTable)this).acquireLabel();
- int var33 = this.addGoto(var118, 7, var2);
- int var34 = this.addByte((byte)52, var33);
- int var35 = this.addGoto(var140, 6, var34);
- ((LabelTable)this).markLabel(var118, var35);
- var2 = this.addByte((byte)51, var35);
- ((LabelTable)this).markLabel(var140, var2);
- return var2;
- case 131:
- int var32 = this.addByte((byte)57, var2);
- var2 = this.addByte((byte)74, var32);
- return var2;
- default:
- this.badTree(var1);
- return var2;
- }
- case 105:
- case 106:
- int var117 = var4.getType();
- switch (var117) {
- case 39:
- case 41:
- Node var138 = var4.getFirstChild();
- var2 = this.generateICode(var138, var2);
- var138 = var138.getNextSibling();
- var2 = this.generateICode(var138, var2);
- if (var117 == 39) {
- var2 = this.addByte((byte)(var3 == 105 ? 34 : 37), var2);
- } else {
- var2 = this.addByte((byte)(var3 == 105 ? 35 : 38), var2);
- }
-
- this.itsStackDepth += -1;
- return var2;
- case 72:
- String var137 = var4.getString();
- if (this.itsData.itsNeedsActivation) {
- var2 = this.addByte((byte)85, var2);
- var2 = this.addByte((byte)46, var2);
- var2 = this.addString(var137, var2);
- this.itsStackDepth += 2;
- if (this.itsStackDepth > this.itsData.itsMaxStack) {
- this.itsData.itsMaxStack = this.itsStackDepth;
- }
-
- var2 = this.addByte((byte)(var3 == 105 ? 34 : 37), var2);
- this.itsStackDepth += -1;
- } else {
- var2 = this.addByte((byte)(var3 == 105 ? 59 : 60), var2);
- int var147 = this.itsData.itsVariableTable.getOrdinal(var137);
- var2 = this.addByte((byte)var147, var2);
- ++this.itsStackDepth;
- if (this.itsStackDepth > this.itsData.itsMaxStack) {
- this.itsData.itsMaxStack = this.itsStackDepth;
- return var2;
- }
- }
-
- return var2;
- default:
- var2 = this.addByte((byte)(var3 == 105 ? 33 : 36), var2);
- var2 = this.addString(var4.getString(), var2);
- ++this.itsStackDepth;
- if (this.itsStackDepth > this.itsData.itsMaxStack) {
- this.itsData.itsMaxStack = this.itsStackDepth;
- }
-
- return var2;
- }
- case 108:
- var2 = this.addByte((byte)var1.getInt(), var2);
- ++this.itsStackDepth;
- if (this.itsStackDepth > this.itsData.itsMaxStack) {
- this.itsData.itsMaxStack = this.itsStackDepth;
- }
- break;
- case 109:
- var2 = this.addByte((byte)55, var2);
- Node var116 = (Node)var1.getProp(5);
- Short var136 = (Short)var116.getProp(5);
- var2 = this.addByte((byte)(var136 >> 8), var2);
- var2 = this.addByte((byte)(var136 & 255), var2);
- ++this.itsStackDepth;
- if (this.itsStackDepth > this.itsData.itsMaxStack) {
- this.itsData.itsMaxStack = this.itsStackDepth;
- }
- break;
- case 114:
- this.updateLineNumber(var1);
- var2 = this.generateICode(var4, var2);
- int var115 = this.itsData.itsMaxLocals++;
- var2 = this.addByte((byte)69, var2);
- var2 = this.addByte((byte)var115, var2);
- var2 = this.addByte((byte)57, var2);
- this.itsStackDepth += -1;
- Vector var135 = (Vector)var1.getProp(13);
-
- for(int var8 = 0; var8 < var135.size(); ++var8) {
- Node var9 = (Node)var135.elementAt(var8);
- Node var10 = var9.getFirstChild();
- var2 = this.generateICode(var10, var2);
- var2 = this.addByte((byte)70, var2);
- ++this.itsStackDepth;
- if (this.itsStackDepth > this.itsData.itsMaxStack) {
- this.itsData.itsMaxStack = this.itsStackDepth;
- }
-
- var2 = this.addByte((byte)var115, var2);
- var2 = this.addByte((byte)53, var2);
- Node var11 = new Node(136);
- var9.addChildAfter(var11, var10);
- Node var12 = new Node(7);
- var12.putProp(1, var11);
- var2 = this.addGoto(var12, 7, var2);
- this.itsStackDepth += -1;
- }
-
- Node var146 = (Node)var1.getProp(14);
- if (var146 != null) {
- Node var149 = new Node(136);
- var146.getFirstChild().addChildToFront(var149);
- Node var153 = new Node(6);
- var153.putProp(1, var149);
- var2 = this.addGoto(var153, 6, var2);
- }
-
- Node var150 = (Node)var1.getProp(2);
- Node var154 = new Node(6);
- var154.putProp(1, var150);
- var2 = this.addGoto(var154, 6, var2);
- break;
- case 115:
- this.updateLineNumber(var1);
-
- for(Node var99 = var4.getNextSibling(); var99 != null; var99 = var99.getNextSibling()) {
- var2 = this.generateICode(var99, var2);
- }
- break;
- case 116:
- case 123:
- case 127:
- case 131:
- case 132:
- case 135:
- case 137:
- this.updateLineNumber(var1);
-
- while(var4 != null) {
- var2 = this.generateICode(var4, var2);
- var4 = var4.getNextSibling();
- }
- break;
- case 136:
- Object var114 = var1.getProp(20);
- if (var114 == null) {
- int var7 = ((LabelTable)this).markLabel(((LabelTable)this).acquireLabel(), var2);
- var1.putProp(20, new Integer(var7));
- } else {
- int var134 = (Integer)var114;
- ((LabelTable)this).markLabel(var134, var2);
- }
-
- if (var1.getProp(21) != null) {
- this.itsStackDepth = 1;
- if (this.itsStackDepth > this.itsData.itsMaxStack) {
- this.itsData.itsMaxStack = this.itsStackDepth;
- }
- }
- case 138:
- break;
- case 140:
- var2 = this.generateICode(var4, var2);
- var2 = this.addByte((byte)82, var2);
- break;
- case 141:
- var2 = this.generateICode(var4, var2);
- Object var113 = var1.getProp(18);
- if (var113 == ScriptRuntime.NumberClass) {
- var2 = this.addByte((byte)58, var2);
- } else {
- this.badTree(var1);
- }
- break;
- case 142:
- Node var112 = (Node)var1.getProp(1);
- var112.putProp(21, var1);
- var2 = this.addGoto(var1, 65, var2);
- break;
- case 144:
- if (var1.getProp(1) != null) {
- var2 = this.addByte((byte)66, var2);
- } else {
- var2 = this.addByte((byte)70, var2);
- ++this.itsStackDepth;
- if (this.itsStackDepth > this.itsData.itsMaxStack) {
- this.itsData.itsMaxStack = this.itsStackDepth;
- }
- }
-
- Node var6 = (Node)var1.getProp(7);
- var2 = this.addLocalRef(var6, var2);
- break;
- case 145:
- this.updateLineNumber(var1);
-
- for(; var4 != null; var4 = var4.getNextSibling()) {
- if (var4.getType() != 109) {
- var2 = this.generateICode(var4, var2);
- }
- }
- break;
- default:
- this.badTree(var1);
- }
-
- return var2;
- }
- }
-