home *** CD-ROM | disk | FTP | other *** search
/ PC Online 1999 November / PCONLINE_11_99.ISO / filesbbs / OS2 / APCHSSL2.ZIP / OS2HTTPD / jserv / com / netscape / javascript / Interpreter.class (.txt) < prev    next >
Encoding:
Java Class File  |  1999-04-09  |  19.8 KB  |  1,472 lines

  1. package com.netscape.javascript;
  2.  
  3. import java.io.FileOutputStream;
  4. import java.io.IOException;
  5. import java.io.PrintWriter;
  6. import java.util.Enumeration;
  7. import java.util.Vector;
  8.  
  9. public class Interpreter extends LabelTable {
  10.    public static final boolean printICode = false;
  11.    boolean itsInFunctionFlag;
  12.    Vector itsFunctionList;
  13.    InterpreterData itsData;
  14.    int itsTryDepth = 0;
  15.    int itsStackDepth = 0;
  16.    int itsEpilogLabel = -1;
  17.    String itsSourceFile;
  18.    int itsLineNumber = 0;
  19.    InterpretedFunction[] itsNestedFunctions = null;
  20.    static PrintWriter out;
  21.    private static final Double zero = new Double((double)0.0F);
  22.    private static final Double one = new Double((double)1.0F);
  23.    private int version;
  24.  
  25.    private static Number getNumber(Number[] var0, byte[] var1, int var2) {
  26.       int var3 = (var1[var2] << 8) + (var1[var2 + 1] & 255);
  27.       return var0[var3];
  28.    }
  29.  
  30.    private void generateNestedFunctions(Scriptable var1, Context var2, Object var3) {
  31.       this.itsNestedFunctions = new InterpretedFunction[this.itsFunctionList.size()];
  32.  
  33.       for(short var4 = 0; var4 < this.itsFunctionList.size(); ++var4) {
  34.          FunctionNode var5 = (FunctionNode)this.itsFunctionList.elementAt(var4);
  35.          Interpreter var6 = new Interpreter();
  36.          var6.itsData = new InterpreterData(0, 0, 0, var3);
  37.          var6.itsInFunctionFlag = true;
  38.          this.itsNestedFunctions[var4] = var6.generateFunctionICode(var2, var1, var5, var3);
  39.          ((Node)var5).putProp(5, new Short(var4));
  40.       }
  41.  
  42.    }
  43.  
  44.    private final int addByte(byte var1, int var2) {
  45.       if (this.itsData.itsICode.length == var2) {
  46.          byte[] var3 = new byte[var2 * 2];
  47.          System.arraycopy(this.itsData.itsICode, 0, var3, 0, var2);
  48.          this.itsData.itsICode = var3;
  49.       }
  50.  
  51.       this.itsData.itsICode[var2++] = var1;
  52.       return var2;
  53.    }
  54.  
  55.    private static int getTarget(byte[] var0, int var1) {
  56.       int var2 = (var0[var1] << 8) + (var0[var1 + 1] & 255);
  57.       return var1 - 1 + var2;
  58.    }
  59.  
  60.    private int addLocalRef(Node var1, int var2) {
  61.       Integer var4 = (Integer)var1.getProp(7);
  62.       int var3;
  63.       if (var4 == null) {
  64.          var3 = this.itsData.itsMaxLocals++;
  65.          var1.putProp(7, new Integer(var3));
  66.       } else {
  67.          var3 = var4;
  68.       }
  69.  
  70.       var2 = this.addByte((byte)var3, var2);
  71.       if (var3 >= this.itsData.itsMaxLocals) {
  72.          this.itsData.itsMaxLocals = var3 + 1;
  73.       }
  74.  
  75.       return var2;
  76.    }
  77.  
  78.    private void generateICodeFromTree(Node var1, VariableTable var2, boolean var3, Object var4) {
  79.       int var5 = 0;
  80.       this.itsData.itsVariableTable = var2;
  81.       this.itsData.itsNeedsActivation = var3;
  82.       var5 = this.generateICode(var1, var5);
  83.       this.itsData.itsICodeTop = var5;
  84.       if (this.itsEpilogLabel != -1) {
  85.          ((LabelTable)this).markLabel(this.itsEpilogLabel, var5);
  86.       }
  87.  
  88.       for(int var6 = 0; var6 < super.itsLabelTableTop; ++var6) {
  89.          super.itsLabelTable[var6].fixGotos(this.itsData.itsICode);
  90.       }
  91.  
  92.    }
  93.  
  94.    private InterpretedScript generateScriptICode(Context var1, Scriptable var2, Node var3, Object var4) {
  95.       this.itsSourceFile = (String)var3.getProp(16);
  96.       this.itsFunctionList = (Vector)var3.getProp(5);
  97.       if (this.itsFunctionList != null) {
  98.          this.generateNestedFunctions(var2, var1, var4);
  99.       }
  100.  
  101.       NativeRegExp[] var5 = null;
  102.       Vector var6 = (Vector)var3.getProp(12);
  103.       if (var6 != null) {
  104.          var5 = this.generateRegExpLiterals(var6, var2);
  105.       }
  106.  
  107.       VariableTable var7 = (VariableTable)var3.getProp(10);
  108.       this.generateICodeFromTree(var3, var7, false, var4);
  109.       this.itsData.itsNestedFunctions = this.itsNestedFunctions;
  110.       this.itsData.itsRegExpLiterals = var5;
  111.       return new InterpretedScript(this.itsData, var1);
  112.    }
  113.  
  114.    private InterpretedFunction generateFunctionICode(Context var1, Scriptable var2, FunctionNode var3, Object var4) {
  115.       this.itsFunctionList = (Vector)((Node)var3).getProp(5);
  116.       if (this.itsFunctionList != null) {
  117.          this.generateNestedFunctions(var2, var1, var4);
  118.       }
  119.  
  120.       NativeRegExp[] var5 = null;
  121.       Vector var6 = (Vector)((Node)var3).getProp(12);
  122.       if (var6 != null) {
  123.          var5 = this.generateRegExpLiterals(var6, var2);
  124.       }
  125.  
  126.       VariableTable var7 = var3.getVariableTable();
  127.       this.generateICodeFromTree(((Node)var3).getLastChild(), var7, var3.requiresActivation(), var4);
  128.       this.itsData.itsName = var3.getFunctionName();
  129.       this.itsData.itsSource = (String)((Node)var3).getProp(17);
  130.       this.itsData.itsNestedFunctions = this.itsNestedFunctions;
  131.       this.itsData.itsRegExpLiterals = var5;
  132.       return new InterpretedFunction(this.itsData, var1);
  133.    }
  134.  
  135.    private void badTree(Node var1) {
  136.       try {
  137.          out = new PrintWriter(new FileOutputStream("icode.txt", true));
  138.          out.println("Un-handled node : " + var1.toString());
  139.          out.close();
  140.       } catch (IOException var2) {
  141.       }
  142.  
  143.       throw new RuntimeException("Un-handled node : " + var1.toString());
  144.    }
  145.  
  146.    private static String getString(String[] var0, byte[] var1, int var2) {
  147.       int var3 = (var1[var2] << 8) + (var1[var2 + 1] & 255);
  148.       return var0[var3];
  149.    }
  150.  
  151.    private static void dumpICode(InterpreterData var0) {
  152.    }
  153.  
  154.    public Object compile(Context var1, Scriptable var2, Node var3, Object var4, SecuritySupport var5, ClassNameHelper var6) throws IOException {
  155.       this.version = var1.getLanguageVersion();
  156.       this.itsData = new InterpreterData(0, 0, 0, var4);
  157.       if (var3 instanceof FunctionNode) {
  158.          FunctionNode var7 = (FunctionNode)var3;
  159.          InterpretedFunction var8 = this.generateFunctionICode(var1, var2, var7, var4);
  160.          createFunctionObject(var8, var2);
  161.          return var8;
  162.       } else {
  163.          return this.generateScriptICode(var1, var2, var3, var4);
  164.       }
  165.    }
  166.  
  167.    public static Object interpret(InterpreterData var0) throws JavaScriptException {
  168.       Object[] var2 = new Object[var0.itsMaxStack];
  169.       int var3 = -1;
  170.       byte[] var4 = var0.itsICode;
  171.       int var5 = 0;
  172.       int var6 = var0.itsICodeTop;
  173.       Object[] var7 = null;
  174.       if (var0.itsMaxLocals > 0) {
  175.          var7 = new Object[var0.itsMaxLocals];
  176.       }
  177.  
  178.       Object[] var8 = null;
  179.       int var9 = var0.itsVariableTable.size();
  180.       if (var9 > 0) {
  181.          var8 = new Object[var9];
  182.  
  183.          for(var9 = 0; var9 < var0.itsVariableTable.getParameterCount(); ++var9) {
  184.             if (var9 >= var0.itsInArgs.length) {
  185.                var8[var9] = Undefined.instance;
  186.             } else {
  187.                var8[var9] = var0.itsInArgs[var9];
  188.             }
  189.          }
  190.  
  191.          while(var9 < var8.length) {
  192.             var8[var9] = Undefined.instance;
  193.             ++var9;
  194.          }
  195.       }
  196.  
  197.       Context var10 = var0.itsCX;
  198.       Scriptable var11 = var0.itsScope;
  199.       if (var0.itsNestedFunctions != null) {
  200.          for(int var75 = 0; var75 < var0.itsNestedFunctions.length; ++var75) {
  201.             createFunctionObject(var0.itsNestedFunctions[var75], var11);
  202.          }
  203.       }
  204.  
  205.       int[] var22 = null;
  206.       int[] var23 = null;
  207.       Scriptable[] var24 = null;
  208.       int var25 = 0;
  209.       if (var0.itsMaxTryDepth > 0) {
  210.          var22 = new int[var0.itsMaxTryDepth];
  211.          var23 = new int[var0.itsMaxTryDepth];
  212.          var24 = new Scriptable[var0.itsMaxTryDepth];
  213.       }
  214.  
  215.       var10.interpreterSecurityDomain = var0.securityDomain;
  216.       Object var26 = Undefined.instance;
  217.  
  218.       while(var5 < var6) {
  219.          try {
  220.             switch (var4[var5]) {
  221.                case 2:
  222.                   var26 = var2[var3--];
  223.                   break;
  224.                case 3:
  225.                   Object var68 = var2[var3--];
  226.                   var11 = ScriptRuntime.enterWith(var68, var11);
  227.                   break;
  228.                case 4:
  229.                   var11 = ScriptRuntime.leaveWith(var11);
  230.                   break;
  231.                case 5:
  232.                   var26 = var2[var3--];
  233.                   var5 = getTarget(var4, var5 + 1);
  234.                   break;
  235.                case 6:
  236.                   var5 = getTarget(var4, var5 + 1);
  237.                   continue;
  238.                case 7:
  239.                   if (ScriptRuntime.toBoolean(var2[var3--])) {
  240.                      var5 = getTarget(var4, var5 + 1);
  241.                      continue;
  242.                   }
  243.  
  244.                   var5 += 2;
  245.                   break;
  246.                case 8:
  247.                   if (!ScriptRuntime.toBoolean(var2[var3--])) {
  248.                      var5 = getTarget(var4, var5 + 1);
  249.                      continue;
  250.                   }
  251.  
  252.                   var5 += 2;
  253.                   break;
  254.                case 9:
  255.                   var2[var3 + 1] = var2[var3];
  256.                   ++var3;
  257.                   break;
  258.                case 10:
  259.                   Object var110 = var2[var3--];
  260.                   Object var67 = var2[var3];
  261.                   var2[var3] = ScriptRuntime.setName((Scriptable)var67, var110, var11, getString(var0.itsStringTable, var4, var5 + 1));
  262.                   var5 += 2;
  263.                   break;
  264.                case 11:
  265.                   int var137 = ScriptRuntime.toInt32(var2[var3--]);
  266.                   int var131 = ScriptRuntime.toInt32(var2[var3]);
  267.                   var2[var3] = new Double((double)(var131 | var137));
  268.                   break;
  269.                case 12:
  270.                   int var136 = ScriptRuntime.toInt32(var2[var3--]);
  271.                   int var130 = ScriptRuntime.toInt32(var2[var3]);
  272.                   var2[var3] = new Double((double)(var130 ^ var136));
  273.                   break;
  274.                case 13:
  275.                   int var135 = ScriptRuntime.toInt32(var2[var3--]);
  276.                   int var129 = ScriptRuntime.toInt32(var2[var3]);
  277.                   var2[var3] = new Double((double)(var129 & var135));
  278.                   break;
  279.                case 14:
  280.                   Object var109 = var2[var3--];
  281.                   Object var66 = var2[var3];
  282.                   var2[var3] = ScriptRuntime.eqB(var109, var66);
  283.                   break;
  284.                case 15:
  285.                   Object var108 = var2[var3--];
  286.                   Object var65 = var2[var3];
  287.                   var2[var3] = ScriptRuntime.neB(var65, var108);
  288.                   break;
  289.                case 16:
  290.                   Object var107 = var2[var3--];
  291.                   Object var64 = var2[var3];
  292.                   var2[var3] = ScriptRuntime.cmp_LTB(var64, var107);
  293.                   break;
  294.                case 17:
  295.                   Object var106 = var2[var3--];
  296.                   Object var63 = var2[var3];
  297.                   var2[var3] = ScriptRuntime.cmp_LEB(var63, var106);
  298.                   break;
  299.                case 18:
  300.                   Object var105 = var2[var3--];
  301.                   Object var62 = var2[var3];
  302.                   var2[var3] = ScriptRuntime.cmp_LTB(var105, var62);
  303.                   break;
  304.                case 19:
  305.                   Object var104 = var2[var3--];
  306.                   Object var61 = var2[var3];
  307.                   var2[var3] = ScriptRuntime.cmp_LEB(var104, var61);
  308.                   break;
  309.                case 20:
  310.                   int var134 = ScriptRuntime.toInt32(var2[var3--]);
  311.                   int var128 = ScriptRuntime.toInt32(var2[var3]);
  312.                   var2[var3] = new Double((double)(var128 << var134));
  313.                   break;
  314.                case 21:
  315.                   int var133 = ScriptRuntime.toInt32(var2[var3--]);
  316.                   int var18 = ScriptRuntime.toInt32(var2[var3]);
  317.                   var2[var3] = new Double((double)(var18 >> var133));
  318.                   break;
  319.                case 22:
  320.                   int var132 = ScriptRuntime.toInt32(var2[var3--]) & 31;
  321.                   long var19 = ScriptRuntime.toUint32(var2[var3]);
  322.                   var2[var3] = new Double((double)(var19 >>> var132));
  323.                   break;
  324.                case 23:
  325.                   Object var103 = var2[var3--];
  326.                   Object var60 = var2[var3];
  327.                   var2[var3] = ScriptRuntime.add(var60, var103);
  328.                   break;
  329.                case 24:
  330.                   Object var102 = var2[var3--];
  331.                   Object var59 = var2[var3];
  332.                   var2[var3] = new Double(ScriptRuntime.toNumber(var59) - ScriptRuntime.toNumber(var102));
  333.                   break;
  334.                case 25:
  335.                   Object var101 = var2[var3--];
  336.                   Object var58 = var2[var3];
  337.                   var2[var3] = new Double(ScriptRuntime.toNumber(var58) * ScriptRuntime.toNumber(var101));
  338.                   break;
  339.                case 26:
  340.                   Object var100 = var2[var3--];
  341.                   Object var57 = var2[var3];
  342.                   var2[var3] = new Double(ScriptRuntime.toNumber(var57) / ScriptRuntime.toNumber(var100));
  343.                   break;
  344.                case 27:
  345.                   Object var99 = var2[var3--];
  346.                   Object var56 = var2[var3];
  347.                   var2[var3] = new Double(ScriptRuntime.toNumber(var56) % ScriptRuntime.toNumber(var99));
  348.                   break;
  349.                case 28:
  350.                   int var21 = ScriptRuntime.toInt32(var2[var3]);
  351.                   var2[var3] = new Double((double)(~var21));
  352.                   break;
  353.                case 29:
  354.                   Object var98 = var2[var3];
  355.                   var2[var3] = new Double(-ScriptRuntime.toNumber(var98));
  356.                   break;
  357.                case 30:
  358.                   int var112 = var4[var5 + 1] << 8 | var4[var5 + 2] & 255;
  359.                   Object[] var127 = new Object[var112];
  360.  
  361.                   for(int var83 = var112 - 1; var83 >= 0; --var83) {
  362.                      var127[var83] = var2[var3--];
  363.                   }
  364.  
  365.                   Object var55 = var2[var3];
  366.                   var2[var3] = ScriptRuntime.newObject(var10, var55, var127);
  367.                   var5 += 2;
  368.                   break;
  369.                case 31:
  370.                   Object var97 = var2[var3--];
  371.                   Object var54 = var2[var3];
  372.                   var2[var3] = ScriptRuntime.delete(var54, var97);
  373.                   break;
  374.                case 32:
  375.                   Object var53 = var2[var3];
  376.                   var2[var3] = ScriptRuntime.typeof(var53);
  377.                   break;
  378.                case 33:
  379.                   ++var3;
  380.                   var2[var3] = ScriptRuntime.postIncrement(var11, getString(var0.itsStringTable, var4, var5 + 1));
  381.                   var5 += 2;
  382.                   break;
  383.                case 34:
  384.                   String var125 = (String)var2[var3--];
  385.                   Object var52 = var2[var3];
  386.                   var2[var3] = ScriptRuntime.postIncrement(var52, var125, var11);
  387.                   break;
  388.                case 35:
  389.                   Object var96 = var2[var3--];
  390.                   Object var51 = var2[var3];
  391.                   var2[var3] = ScriptRuntime.postIncrementElem(var51, var96, var11);
  392.                   break;
  393.                case 36:
  394.                   ++var3;
  395.                   var2[var3] = ScriptRuntime.postDecrement(var11, getString(var0.itsStringTable, var4, var5 + 1));
  396.                   var5 += 2;
  397.                   break;
  398.                case 37:
  399.                   String var124 = (String)var2[var3--];
  400.                   Object var50 = var2[var3];
  401.                   var2[var3] = ScriptRuntime.postDecrement(var50, var124, var11);
  402.                   break;
  403.                case 38:
  404.                   Object var95 = var2[var3--];
  405.                   Object var49 = var2[var3];
  406.                   var2[var3] = ScriptRuntime.postDecrementElem(var49, var95, var11);
  407.                   break;
  408.                case 39:
  409.                   String var123 = (String)var2[var3--];
  410.                   Object var48 = var2[var3];
  411.                   var2[var3] = ScriptRuntime.getProp(var48, var123, var11);
  412.                   break;
  413.                case 40:
  414.                   Object var94 = var2[var3--];
  415.                   String var122 = (String)var2[var3--];
  416.                   Object var47 = var2[var3];
  417.                   var2[var3] = ScriptRuntime.setProp(var47, var122, var94, var11);
  418.                   break;
  419.                case 41:
  420.                   Object var84 = var2[var3--];
  421.                   Object var46 = var2[var3];
  422.                   var2[var3] = ScriptRuntime.getElem(var46, var84, var11);
  423.                   break;
  424.                case 42:
  425.                   Object var93 = var2[var3--];
  426.                   Object var12 = var2[var3--];
  427.                   Object var45 = var2[var3];
  428.                   var2[var3] = ScriptRuntime.setElem(var45, var12, var93, var11);
  429.                   break;
  430.                case 43:
  431.                   int var111 = var4[var5 + 1] << 8 | var4[var5 + 2] & 255;
  432.                   Object[] var126 = new Object[var111];
  433.  
  434.                   for(int var82 = var111 - 1; var82 >= 0; --var82) {
  435.                      var126[var82] = var2[var3--];
  436.                   }
  437.  
  438.                   Object var92 = var2[var3--];
  439.                   Object var44 = var2[var3];
  440.                   var2[var3] = ScriptRuntime.call(var10, var44, var92, var126);
  441.                   var5 += 2;
  442.                   var10.interpreterSecurityDomain = var0.securityDomain;
  443.                   break;
  444.                case 44:
  445.                   ++var3;
  446.                   var2[var3] = ScriptRuntime.name(var11, getString(var0.itsStringTable, var4, var5 + 1));
  447.                   var5 += 2;
  448.                   break;
  449.                case 45:
  450.                   ++var3;
  451.                   var2[var3] = getNumber(var0.itsNumberTable, var4, var5 + 1);
  452.                   var5 += 2;
  453.                   break;
  454.                case 46:
  455.                   ++var3;
  456.                   var2[var3] = getString(var0.itsStringTable, var4, var5 + 1);
  457.                   var5 += 2;
  458.                   break;
  459.                case 47:
  460.                   ++var3;
  461.                   var2[var3] = zero;
  462.                   break;
  463.                case 48:
  464.                   ++var3;
  465.                   var2[var3] = one;
  466.                   break;
  467.                case 49:
  468.                   ++var3;
  469.                   var2[var3] = null;
  470.                   break;
  471.                case 50:
  472.                   ++var3;
  473.                   var2[var3] = var0.itsThisObj;
  474.                   break;
  475.                case 51:
  476.                   ++var3;
  477.                   var2[var3] = Boolean.FALSE;
  478.                   break;
  479.                case 52:
  480.                   ++var3;
  481.                   var2[var3] = Boolean.TRUE;
  482.                   break;
  483.                case 53:
  484.                   Object var91 = var2[var3--];
  485.                   Object var43 = var2[var3];
  486.                   var2[var3] = ScriptRuntime.seqB(var43, var91);
  487.                   break;
  488.                case 54:
  489.                   Object var90 = var2[var3--];
  490.                   Object var42 = var2[var3];
  491.                   var2[var3] = ScriptRuntime.sneB(var42, var90);
  492.                   break;
  493.                case 55:
  494.                   var9 = var4[var5 + 1] << 8 | var4[var5 + 2] & 255;
  495.                   ++var3;
  496.                   var2[var3] = new NativeClosure(var10, var11, var0.itsNestedFunctions[var9]);
  497.                   var5 += 2;
  498.                   break;
  499.                case 56:
  500.                   var9 = var4[var5 + 1] << 8 | var4[var5 + 2] & 255;
  501.                   ++var3;
  502.                   var2[var3] = var0.itsRegExpLiterals[var9];
  503.                   var5 += 2;
  504.                   break;
  505.                case 57:
  506.                   --var3;
  507.                   break;
  508.                case 58:
  509.                   Object var89 = var2[var3];
  510.                   var2[var3] = new Double(ScriptRuntime.toNumber(var89));
  511.                   break;
  512.                case 59:
  513.                   ++var5;
  514.                   int var120 = var4[var5] & 255;
  515.                   ++var3;
  516.                   var2[var3] = var8[var120];
  517.                   var8[var120] = ScriptRuntime.postIncrement(var8[var120]);
  518.                   break;
  519.                case 60:
  520.                   ++var5;
  521.                   int var119 = var4[var5] & 255;
  522.                   ++var3;
  523.                   var2[var3] = var8[var119];
  524.                   var8[var119] = ScriptRuntime.postDecrement(var8[var119]);
  525.                   break;
  526.                case 61:
  527.                   ++var3;
  528.                   var2[var3] = ScriptRuntime.bind(var11, getString(var0.itsStringTable, var4, var5 + 1));
  529.                   var5 += 2;
  530.                   break;
  531.                case 62:
  532.                   var10.interpreterSecurityDomain = null;
  533.                   throw new JavaScriptException(var2[var3--]);
  534.                case 63:
  535.                   Object var88 = var2[var3--];
  536.                   Object var41 = var2[var3];
  537.                   var2[var3] = new Boolean(ScriptRuntime.in(var41, var88));
  538.                   break;
  539.                case 64:
  540.                   Object var87 = var2[var3--];
  541.                   Object var40 = var2[var3];
  542.                   var2[var3] = new Boolean(ScriptRuntime.instanceOf(var40, var87));
  543.                   break;
  544.                case 65:
  545.                   ++var3;
  546.                   var2[var3] = new Integer(var5 + 3);
  547.                   var5 = getTarget(var4, var5 + 1);
  548.                   continue;
  549.                case 66:
  550.                   ++var5;
  551.                   int var118 = var4[var5] & 255;
  552.                   var5 = (Integer)var7[var118];
  553.                   continue;
  554.                case 67:
  555.                   var9 = var4[var5 + 1] << 8 | var4[var5 + 2] & 255;
  556.                   String var121 = getString(var0.itsStringTable, var4, var5 + 3);
  557.                   int var14 = var4[var5 + 5] << 8 | var4[var5 + 6] & 255;
  558.                   Object[] var17 = new Object[var14];
  559.  
  560.                   for(var9 = var14 - 1; var9 >= 0; --var9) {
  561.                      var17[var9] = var2[var3--];
  562.                   }
  563.  
  564.                   Object var86 = var2[var3--];
  565.                   Object var39 = var2[var3];
  566.                   var2[var3] = ScriptRuntime.callSpecial(var10, var39, var86, var17, var0.itsThisObj, var11, var121, var9);
  567.                   var5 += 6;
  568.                   break;
  569.                case 68:
  570.                   Object var38 = var2[var3];
  571.                   var2[var3] = ScriptRuntime.getThis((Scriptable)var38);
  572.                   break;
  573.                case 69:
  574.                   Object var37 = var2[var3];
  575.                   ++var5;
  576.                   int var117 = var4[var5] & 255;
  577.                   var7[var117] = var37;
  578.                   break;
  579.                case 70:
  580.                   ++var5;
  581.                   int var116 = var4[var5] & 255;
  582.                   ++var3;
  583.                   var2[var3] = var7[var116];
  584.                   break;
  585.                case 71:
  586.                   ++var3;
  587.                   var2[var3] = ScriptRuntime.getBase(var11, getString(var0.itsStringTable, var4, var5 + 1));
  588.                   var5 += 2;
  589.                   break;
  590.                case 72:
  591.                   ++var5;
  592.                   int var115 = var4[var5] & 255;
  593.                   ++var3;
  594.                   var2[var3] = var8[var115];
  595.                   break;
  596.                case 73:
  597.                   Object var36 = var2[var3];
  598.                   ++var5;
  599.                   int var114 = var4[var5] & 255;
  600.                   var8[var114] = var36;
  601.                   break;
  602.                case 74:
  603.                   ++var3;
  604.                   var2[var3] = Undefined.instance;
  605.                   break;
  606.                case 75:
  607.                   var9 = getTarget(var4, var5 + 1);
  608.                   if (var9 == var5) {
  609.                      var9 = 0;
  610.                   }
  611.  
  612.                   var22[var25] = var9;
  613.                   var9 = getTarget(var4, var5 + 3);
  614.                   if (var9 == var5 + 2) {
  615.                      var9 = 0;
  616.                   }
  617.  
  618.                   var23[var25] = var9;
  619.                   var24[var25++] = var11;
  620.                   var5 += 4;
  621.                   break;
  622.                case 76:
  623.                   --var25;
  624.                   break;
  625.                case 77:
  626.                   ++var3;
  627.                   var2[var3] = ScriptRuntime.newScope();
  628.                   break;
  629.                case 78:
  630.                   String var16 = getString(var0.itsStringTable, var4, var5 + 1);
  631.                   ++var3;
  632.                   var2[var3] = ScriptRuntime.typeofName(var11, var16);
  633.                   var5 += 2;
  634.                   break;
  635.                case 79:
  636.                   ++var5;
  637.                   int var113 = var4[var5] & 255;
  638.                   Object var35 = var2[var3--];
  639.                   var7[var113] = ScriptRuntime.initEnum(var35, var11);
  640.                   break;
  641.                case 80:
  642.                   ++var5;
  643.                   int var15 = var4[var5] & 255;
  644.                   ++var3;
  645.                   var2[var3] = ScriptRuntime.nextEnum((Enumeration)var7[var15]);
  646.                   break;
  647.                case 81:
  648.                   Object var34 = var2[var3];
  649.                   var2[var3] = ScriptRuntime.getProto(var34, var11);
  650.                   break;
  651.                case 82:
  652.                   Object var33 = var2[var3];
  653.                   var2[var3] = ScriptRuntime.getParent(var33);
  654.                   break;
  655.                case 83:
  656.                   Object var85 = var2[var3--];
  657.                   Object var32 = var2[var3];
  658.                   var2[var3] = ScriptRuntime.setProto(var32, var85, var11);
  659.                   break;
  660.                case 84:
  661.                   Object var13 = var2[var3--];
  662.                   Object var31 = var2[var3];
  663.                   var2[var3] = ScriptRuntime.setParent(var31, var13, var11);
  664.                   break;
  665.                case 85:
  666.                   ++var3;
  667.                   var2[var3] = var11;
  668.                   break;
  669.                case 86:
  670.                   Object var30 = var2[var3];
  671.                   var2[var3] = ScriptRuntime.getParent(var30, var11);
  672.                   break;
  673.                case 87:
  674.                   var10.interpreterSecurityDomain = null;
  675.                   Object var1 = var2[var3--];
  676.                   if (var1 instanceof JavaScriptException) {
  677.                      throw (JavaScriptException)var1;
  678.                   }
  679.  
  680.                   throw (RuntimeException)var1;
  681.                default:
  682.                   dumpICode(var0);
  683.                   throw new RuntimeException("Unknown icode : " + (var4[var5] & 255) + " @ pc : " + var5);
  684.             }
  685.  
  686.             ++var5;
  687.          } catch (JavaScriptException var28) {
  688.             var3 = 0;
  689.             var10.interpreterSecurityDomain = var0.securityDomain;
  690.             if (var25 <= 0) {
  691.                throw var28;
  692.             }
  693.  
  694.             --var25;
  695.             var5 = var22[var25];
  696.             var11 = var24[var25];
  697.             if (var5 == 0) {
  698.                var5 = var23[var25];
  699.                if (var5 == 0) {
  700.                   throw var28;
  701.                }
  702.  
  703.                var2[0] = var28;
  704.             } else {
  705.                var2[0] = ScriptRuntime.unwrapJavaScriptException(var28);
  706.             }
  707.          } catch (RuntimeException var29) {
  708.             if (var25 <= 0) {
  709.                throw var29;
  710.             }
  711.  
  712.             var3 = 0;
  713.             var2[0] = var29;
  714.             --var25;
  715.             var5 = var23[var25];
  716.             var11 = var24[var25];
  717.             var10.interpreterSecurityDomain = var0.securityDomain;
  718.             if (var5 == 0) {
  719.                throw var29;
  720.             }
  721.          }
  722.       }
  723.  
  724.       var10.interpreterSecurityDomain = null;
  725.       return var26;
  726.    }
  727.  
  728.    private static void createFunctionObject(InterpretedFunction var0, Scriptable var1) {
  729.       ((ScriptableObject)var0).setPrototype(ScriptableObject.getClassPrototype(var1, "Function"));
  730.       ((ScriptableObject)var0).setParentScope(var1);
  731.       if (var0.itsData.itsName.length() > 0) {
  732.          ScriptRuntime.setName(var1, var0, var1, var0.itsData.itsName);
  733.       }
  734.  
  735.    }
  736.  
  737.    private int addGoto(Node var1, int var2, int var3) {
  738.       int var4;
  739.       if (var1.getType() == 5) {
  740.          if (this.itsEpilogLabel == -1) {
  741.             this.itsEpilogLabel = ((LabelTable)this).acquireLabel();
  742.          }
  743.  
  744.          var4 = this.itsEpilogLabel;
  745.       } else {
  746.          Node var5 = (Node)var1.getProp(1);
  747.          Object var6 = var5.getProp(20);
  748.          if (var6 == null) {
  749.             var4 = ((LabelTable)this).acquireLabel();
  750.             var5.putProp(20, new Integer(var4));
  751.          } else {
  752.             var4 = (Integer)var6;
  753.          }
  754.       }
  755.  
  756.       var3 = this.addGoto(var4, (byte)var2, var3);
  757.       return var3;
  758.    }
  759.  
  760.    private int addGoto(int var1, int var2, int var3) {
  761.       int var4 = var3;
  762.       var3 = this.addByte((byte)var2, var3);
  763.       int var5 = var1 & Integer.MAX_VALUE;
  764.       short var6 = super.itsLabelTable[var5].getPC();
  765.       if (var6 != -1) {
  766.          short var7 = (short)(var6 - var4);
  767.          var3 = this.addByte((byte)(var7 >> 8), var3);
  768.          var3 = this.addByte((byte)var7, var3);
  769.       } else {
  770.          super.itsLabelTable[var5].addFixup(var4 + 1);
  771.          var3 = this.addByte((byte)0, var3);
  772.          var3 = this.addByte((byte)0, var3);
  773.       }
  774.  
  775.       return var3;
  776.    }
  777.  
  778.    private NativeRegExp[] generateRegExpLiterals(Vector var1, Scriptable var2) {
  779.       NativeRegExp[] var3 = new NativeRegExp[var1.size()];
  780.  
  781.       for(int var4 = 0; var4 < var1.size(); ++var4) {
  782.          Node var5 = (Node)var1.elementAt(var4);
  783.          Node var6 = var5.getFirstChild();
  784.          Node var7 = var5.getLastChild();
  785.          var3[var4] = new NativeRegExp(var2, var6.getString(), var6 == var7 ? null : var7.getString());
  786.          var5.putProp(12, new Integer(var4));
  787.       }
  788.  
  789.       return var3;
  790.    }
  791.  
  792.    private void updateLineNumber(Node var1) {
  793.       Object var2 = var1.getDatum();
  794.       if (var2 != null && var2 instanceof Number) {
  795.          this.itsLineNumber = ((Number)var2).shortValue();
  796.       }
  797.    }
  798.  
  799.    public Node transform(Node var1, TokenStream var2) {
  800.       return (new NodeTransformer()).transform(var1, (Node)null, var2);
  801.    }
  802.  
  803.    private final int addNumber(Number var1, int var2) {
  804.       var2 = this.addByte((byte)(this.itsData.itsNumberTableIndex >> 8), var2);
  805.       var2 = this.addByte((byte)(this.itsData.itsNumberTableIndex & 255), var2);
  806.       if (this.itsData.itsNumberTable.length == this.itsData.itsNumberTableIndex) {
  807.          Number[] var3 = new Number[this.itsData.itsNumberTableIndex * 2];
  808.          System.arraycopy(this.itsData.itsNumberTable, 0, var3, 0, this.itsData.itsNumberTableIndex);
  809.          this.itsData.itsNumberTable = var3;
  810.       }
  811.  
  812.       this.itsData.itsNumberTable[this.itsData.itsNumberTableIndex++] = var1;
  813.       return var2;
  814.    }
  815.  
  816.    public IRFactory createIRFactory(TokenStream var1, ClassNameHelper var2) {
  817.       return new IRFactory(var1);
  818.    }
  819.  
  820.    private final int addString(String var1, int var2) {
  821.       var2 = this.addByte((byte)(this.itsData.itsStringTableIndex >> 8), var2);
  822.       var2 = this.addByte((byte)(this.itsData.itsStringTableIndex & 255), var2);
  823.       if (this.itsData.itsStringTable.length == this.itsData.itsStringTableIndex) {
  824.          String[] var3 = new String[this.itsData.itsStringTableIndex * 2];
  825.          System.arraycopy(this.itsData.itsStringTable, 0, var3, 0, this.itsData.itsStringTableIndex);
  826.          this.itsData.itsStringTable = var3;
  827.       }
  828.  
  829.       this.itsData.itsStringTable[this.itsData.itsStringTableIndex++] = var1;
  830.       return var2;
  831.    }
  832.  
  833.    private int generateICode(Node var1, int var2) {
  834.       int var3 = var1.getType();
  835.       Node var4 = var1.getFirstChild();
  836.       switch (var3) {
  837.          case 2:
  838.          case 57:
  839.             this.updateLineNumber(var1);
  840.          case 3:
  841.             var2 = this.generateICode(var4, var2);
  842.             var2 = this.addByte((byte)var3, var2);
  843.             this.itsStackDepth += -1;
  844.             break;
  845.          case 4:
  846.             var2 = this.addByte((byte)var3, var2);
  847.             break;
  848.          case 5:
  849.             this.updateLineNumber(var1);
  850.             if (var4 != null) {
  851.                var2 = this.generateICode(var4, var2);
  852.             } else {
  853.                var2 = this.addByte((byte)74, var2);
  854.                ++this.itsStackDepth;
  855.                if (this.itsStackDepth > this.itsData.itsMaxStack) {
  856.                   this.itsData.itsMaxStack = this.itsStackDepth;
  857.                }
  858.             }
  859.  
  860.             var2 = this.addGoto(var1, 5, var2);
  861.             this.itsStackDepth += -1;
  862.             break;
  863.          case 7:
  864.          case 8:
  865.             var2 = this.generateICode(var4, var2);
  866.             this.itsStackDepth += -1;
  867.          case 6:
  868.             var2 = this.addGoto(var1, (byte)var3, var2);
  869.             break;
  870.          case 10:
  871.             var2 = this.generateICode(var4, var2);
  872.             Node var111 = var4.getNextSibling();
  873.             var2 = this.generateICode(var111, var2);
  874.             var2 = this.addByte((byte)10, var2);
  875.             var2 = this.addString(var4.getString(), var2);
  876.             this.itsStackDepth += -1;
  877.             break;
  878.          case 11:
  879.          case 12:
  880.          case 13:
  881.          case 20:
  882.          case 21:
  883.          case 22:
  884.          case 23:
  885.          case 24:
  886.          case 25:
  887.          case 26:
  888.          case 27:
  889.          case 31:
  890.          case 41:
  891.             var2 = this.generateICode(var4, var2);
  892.             var4 = var4.getNextSibling();
  893.             var2 = this.generateICode(var4, var2);
  894.             var2 = this.addByte((byte)var3, var2);
  895.             this.itsStackDepth += -1;
  896.             break;
  897.          case 30:
  898.          case 43:
  899.             int var132;
  900.             for(var132 = 0; var4 != null; ++var132) {
  901.                var2 = this.generateICode(var4, var2);
  902.                var4 = var4.getNextSibling();
  903.             }
  904.  
  905.             if (var1.getProp(30) != null) {
  906.                var2 = this.addByte((byte)67, var2);
  907.                var2 = this.addByte((byte)(this.itsLineNumber >> 8), var2);
  908.                var2 = this.addByte((byte)(this.itsLineNumber & 255), var2);
  909.                var2 = this.addString(this.itsSourceFile, var2);
  910.             } else {
  911.                var2 = this.addByte((byte)var3, var2);
  912.             }
  913.  
  914.             this.itsStackDepth -= var132 - 1;
  915.             if (var3 == 30) {
  916.                --var132;
  917.             } else {
  918.                var132 -= 2;
  919.             }
  920.  
  921.             var2 = this.addByte((byte)(var132 >> 8), var2);
  922.             var2 = this.addByte((byte)(var132 & 255), var2);
  923.             if (var132 > this.itsData.itsMaxArgs) {
  924.                this.itsData.itsMaxArgs = var132;
  925.             }
  926.             break;
  927.          case 32:
  928.             String var131 = var1.getString();
  929.             int var145 = -1;
  930.             if (this.itsInFunctionFlag) {
  931.                var145 = this.itsData.itsVariableTable.getOrdinal(var131);
  932.             }
  933.  
  934.             if (var145 == -1) {
  935.                var2 = this.addByte((byte)78, var2);
  936.                var2 = this.addString(var131, var2);
  937.             } else {
  938.                var2 = this.addByte((byte)72, var2);
  939.                var2 = this.addByte((byte)var145, var2);
  940.                var2 = this.addByte((byte)32, var2);
  941.             }
  942.  
  943.             ++this.itsStackDepth;
  944.             if (this.itsStackDepth > this.itsData.itsMaxStack) {
  945.                this.itsData.itsMaxStack = this.itsStackDepth;
  946.             }
  947.             break;
  948.          case 39:
  949.             var2 = this.generateICode(var4, var2);
  950.             String var130 = (String)var1.getProp(19);
  951.             if (var130 != null) {
  952.                if (var130.equals("__proto__")) {
  953.                   var2 = this.addByte((byte)81, var2);
  954.                } else if (var130.equals("__parent__")) {
  955.                   var2 = this.addByte((byte)86, var2);
  956.                } else {
  957.                   this.badTree(var1);
  958.                }
  959.             } else {
  960.                var4 = var4.getNextSibling();
  961.                var2 = this.generateICode(var4, var2);
  962.                var2 = this.addByte((byte)39, var2);
  963.                this.itsStackDepth += -1;
  964.             }
  965.             break;
  966.          case 40:
  967.             var2 = this.generateICode(var4, var2);
  968.             var4 = var4.getNextSibling();
  969.             var2 = this.generateICode(var4, var2);
  970.             String var129 = (String)var1.getProp(19);
  971.             if (var129 != null) {
  972.                if (var129.equals("__proto__")) {
  973.                   var2 = this.addByte((byte)83, var2);
  974.                } else if (var129.equals("__parent__")) {
  975.                   var2 = this.addByte((byte)84, var2);
  976.                } else {
  977.                   this.badTree(var1);
  978.                }
  979.             } else {
  980.                var4 = var4.getNextSibling();
  981.                var2 = this.generateICode(var4, var2);
  982.                var2 = this.addByte((byte)40, var2);
  983.                this.itsStackDepth -= 2;
  984.             }
  985.             break;
  986.          case 42:
  987.             var2 = this.generateICode(var4, var2);
  988.             var4 = var4.getNextSibling();
  989.             var2 = this.generateICode(var4, var2);
  990.             var4 = var4.getNextSibling();
  991.             var2 = this.generateICode(var4, var2);
  992.             var2 = this.addByte((byte)var3, var2);
  993.             this.itsStackDepth -= 2;
  994.             break;
  995.          case 44:
  996.          case 46:
  997.          case 61:
  998.          case 71:
  999.             var2 = this.addByte((byte)var3, var2);
  1000.             var2 = this.addString(var1.getString(), var2);
  1001.             ++this.itsStackDepth;
  1002.             if (this.itsStackDepth > this.itsData.itsMaxStack) {
  1003.                this.itsData.itsMaxStack = this.itsStackDepth;
  1004.             }
  1005.             break;
  1006.          case 45:
  1007.             Number var128 = (Number)var1.getDatum();
  1008.             if (var128.doubleValue() == (double)0.0F) {
  1009.                var2 = this.addByte((byte)47, var2);
  1010.             } else if (var128.doubleValue() == (double)1.0F) {
  1011.                var2 = this.addByte((byte)48, var2);
  1012.             } else {
  1013.                var2 = this.addByte((byte)45, var2);
  1014.                var2 = this.addNumber(var128, var2);
  1015.             }
  1016.  
  1017.             ++this.itsStackDepth;
  1018.             if (this.itsStackDepth > this.itsData.itsMaxStack) {
  1019.                this.itsData.itsMaxStack = this.itsStackDepth;
  1020.             }
  1021.             break;
  1022.          case 56:
  1023.             Node var127 = (Node)var1.getProp(12);
  1024.             int var144 = (Integer)var127.getProp(12);
  1025.             var2 = this.addByte((byte)56, var2);
  1026.             var2 = this.addByte((byte)(var144 >> 8), var2);
  1027.             var2 = this.addByte((byte)(var144 & 255), var2);
  1028.             ++this.itsStackDepth;
  1029.             if (this.itsStackDepth > this.itsData.itsMaxStack) {
  1030.                this.itsData.itsMaxStack = this.itsStackDepth;
  1031.             }
  1032.             break;
  1033.          case 62:
  1034.             this.updateLineNumber(var1);
  1035.             var2 = this.generateICode(var4, var2);
  1036.             var2 = this.addByte((byte)62, var2);
  1037.             this.itsStackDepth += -1;
  1038.             break;
  1039.          case 68:
  1040.             var2 = this.generateICode(var4, var2);
  1041.             var2 = this.addByte((byte)var3, var2);
  1042.             break;
  1043.          case 69:
  1044.          case 143:
  1045.             var2 = this.generateICode(var4, var2);
  1046.             var2 = this.addByte((byte)69, var2);
  1047.             var2 = this.addLocalRef(var1, var2);
  1048.             break;
  1049.          case 70:
  1050.             var2 = this.addByte((byte)70, var2);
  1051.             Node var126 = (Node)var1.getProp(6);
  1052.             var2 = this.addLocalRef(var126, var2);
  1053.             ++this.itsStackDepth;
  1054.             if (this.itsStackDepth > this.itsData.itsMaxStack) {
  1055.                this.itsData.itsMaxStack = this.itsStackDepth;
  1056.             }
  1057.             break;
  1058.          case 72:
  1059.             String var125 = var1.getString();
  1060.             if (this.itsData.itsNeedsActivation) {
  1061.                var2 = this.addByte((byte)85, var2);
  1062.                var2 = this.addByte((byte)46, var2);
  1063.                var2 = this.addString(var125, var2);
  1064.                this.itsStackDepth += 2;
  1065.                if (this.itsStackDepth > this.itsData.itsMaxStack) {
  1066.                   this.itsData.itsMaxStack = this.itsStackDepth;
  1067.                }
  1068.  
  1069.                var2 = this.addByte((byte)39, var2);
  1070.                this.itsStackDepth += -1;
  1071.             } else {
  1072.                int var143 = this.itsData.itsVariableTable.getOrdinal(var125);
  1073.                var2 = this.addByte((byte)72, var2);
  1074.                var2 = this.addByte((byte)var143, var2);
  1075.                ++this.itsStackDepth;
  1076.                if (this.itsStackDepth > this.itsData.itsMaxStack) {
  1077.                   this.itsData.itsMaxStack = this.itsStackDepth;
  1078.                }
  1079.             }
  1080.             break;
  1081.          case 73:
  1082.             if (this.itsData.itsNeedsActivation) {
  1083.                var4.setType(61);
  1084.                var1.setType(10);
  1085.                var2 = this.generateICode(var1, var2);
  1086.             } else {
  1087.                String var124 = var4.getString();
  1088.                var4 = var4.getNextSibling();
  1089.                var2 = this.generateICode(var4, var2);
  1090.                int var142 = this.itsData.itsVariableTable.getOrdinal(var124);
  1091.                var2 = this.addByte((byte)73, var2);
  1092.                var2 = this.addByte((byte)var142, var2);
  1093.             }
  1094.             break;
  1095.          case 75:
  1096.             ++this.itsTryDepth;
  1097.             if (this.itsTryDepth > this.itsData.itsMaxTryDepth) {
  1098.                this.itsData.itsMaxTryDepth = this.itsTryDepth;
  1099.             }
  1100.  
  1101.             Node var123 = (Node)var1.getProp(1);
  1102.             Node var141 = (Node)var1.getProp(21);
  1103.             if (var123 == null) {
  1104.                var2 = this.addByte((byte)75, var2);
  1105.                var2 = this.addByte((byte)0, var2);
  1106.                var2 = this.addByte((byte)0, var2);
  1107.             } else {
  1108.                var2 = this.addGoto(var1, 75, var2);
  1109.             }
  1110.  
  1111.             int var148 = 0;
  1112.             if (var141 != null) {
  1113.                var148 = ((LabelTable)this).acquireLabel();
  1114.                int var151 = var148 & Integer.MAX_VALUE;
  1115.                super.itsLabelTable[var151].addFixup(var2);
  1116.             }
  1117.  
  1118.             var2 = this.addByte((byte)0, var2);
  1119.             var2 = this.addByte((byte)0, var2);
  1120.  
  1121.             for(Node var152 = null; var4 != null; var4 = var4.getNextSibling()) {
  1122.                if (var152 == var123) {
  1123.                   this.itsStackDepth = 1;
  1124.                   if (this.itsStackDepth > this.itsData.itsMaxStack) {
  1125.                      this.itsData.itsMaxStack = this.itsStackDepth;
  1126.                   }
  1127.                }
  1128.  
  1129.                var2 = this.generateICode(var4, var2);
  1130.                var152 = var4;
  1131.             }
  1132.  
  1133.             this.itsStackDepth = 0;
  1134.             var2 = this.addByte((byte)76, var2);
  1135.             if (var141 != null) {
  1136.                int var155 = ((LabelTable)this).acquireLabel();
  1137.                var2 = this.addGoto(var155, 6, var2);
  1138.                ((LabelTable)this).markLabel(var148, var2);
  1139.                this.itsStackDepth = 1;
  1140.                if (this.itsStackDepth > this.itsData.itsMaxStack) {
  1141.                   this.itsData.itsMaxStack = this.itsStackDepth;
  1142.                }
  1143.  
  1144.                int var156 = this.itsData.itsMaxLocals++;
  1145.                int var57 = this.addByte((byte)69, var2);
  1146.                int var58 = this.addByte((byte)var156, var57);
  1147.                int var59 = this.addByte((byte)57, var58);
  1148.                Integer var157 = (Integer)var141.getProp(20);
  1149.                int var60 = this.addGoto(var157, 65, var59);
  1150.                int var61 = this.addByte((byte)70, var60);
  1151.                int var62 = this.addByte((byte)var156, var61);
  1152.                var2 = this.addByte((byte)87, var62);
  1153.                this.itsStackDepth = 0;
  1154.                ((LabelTable)this).markLabel(var155, var2);
  1155.             }
  1156.  
  1157.             this.itsTryDepth += -1;
  1158.             break;
  1159.          case 77:
  1160.             var2 = this.addByte((byte)var3, var2);
  1161.             ++this.itsStackDepth;
  1162.             if (this.itsStackDepth > this.itsData.itsMaxStack) {
  1163.                this.itsData.itsMaxStack = this.itsStackDepth;
  1164.             }
  1165.             break;
  1166.          case 79:
  1167.             var2 = this.generateICode(var4, var2);
  1168.             var2 = this.addByte((byte)79, var2);
  1169.             var2 = this.addLocalRef(var1, var2);
  1170.             this.itsStackDepth += -1;
  1171.             break;
  1172.          case 80:
  1173.             var2 = this.addByte((byte)80, var2);
  1174.             Node var122 = (Node)var1.getProp(4);
  1175.             var2 = this.addLocalRef(var122, var2);
  1176.             ++this.itsStackDepth;
  1177.             if (this.itsStackDepth > this.itsData.itsMaxStack) {
  1178.                this.itsData.itsMaxStack = this.itsStackDepth;
  1179.             }
  1180.             break;
  1181.          case 95:
  1182.             var2 = this.generateICode(var4, var2);
  1183.             var2 = this.addByte((byte)57, var2);
  1184.             this.itsStackDepth += -1;
  1185.             var4 = var4.getNextSibling();
  1186.             var2 = this.generateICode(var4, var2);
  1187.             break;
  1188.          case 99:
  1189.             var2 = this.generateICode(var4, var2);
  1190.             var2 = this.addByte((byte)9, var2);
  1191.             ++this.itsStackDepth;
  1192.             if (this.itsStackDepth > this.itsData.itsMaxStack) {
  1193.                this.itsData.itsMaxStack = this.itsStackDepth;
  1194.             }
  1195.  
  1196.             int var121 = ((LabelTable)this).acquireLabel();
  1197.             int var44 = this.addGoto(var121, 7, var2);
  1198.             int var45 = this.addByte((byte)57, var44);
  1199.             this.itsStackDepth += -1;
  1200.             var4 = var4.getNextSibling();
  1201.             var2 = this.generateICode(var4, var45);
  1202.             ((LabelTable)this).markLabel(var121, var2);
  1203.             break;
  1204.          case 100:
  1205.             var2 = this.generateICode(var4, var2);
  1206.             var2 = this.addByte((byte)9, var2);
  1207.             ++this.itsStackDepth;
  1208.             if (this.itsStackDepth > this.itsData.itsMaxStack) {
  1209.                this.itsData.itsMaxStack = this.itsStackDepth;
  1210.             }
  1211.  
  1212.             int var120 = ((LabelTable)this).acquireLabel();
  1213.             int var40 = this.addGoto(var120, 8, var2);
  1214.             int var41 = this.addByte((byte)57, var40);
  1215.             this.itsStackDepth += -1;
  1216.             var4 = var4.getNextSibling();
  1217.             var2 = this.generateICode(var4, var41);
  1218.             ((LabelTable)this).markLabel(var120, var2);
  1219.             break;
  1220.          case 101:
  1221.          case 102:
  1222.             var2 = this.generateICode(var4, var2);
  1223.             var4 = var4.getNextSibling();
  1224.             var2 = this.generateICode(var4, var2);
  1225.             int var119 = var1.getInt();
  1226.             if (this.version == 120) {
  1227.                if (var119 == 14) {
  1228.                   var119 = 53;
  1229.                } else if (var119 == 15) {
  1230.                   var119 = 54;
  1231.                }
  1232.             }
  1233.  
  1234.             var2 = this.addByte((byte)var119, var2);
  1235.             this.itsStackDepth += -1;
  1236.             break;
  1237.          case 104:
  1238.             var2 = this.generateICode(var4, var2);
  1239.             switch (var1.getInt()) {
  1240.                case 23:
  1241.                   var2 = this.addByte((byte)58, var2);
  1242.                   return var2;
  1243.                case 24:
  1244.                   var2 = this.addByte((byte)29, var2);
  1245.                   return var2;
  1246.                case 28:
  1247.                   var2 = this.addByte((byte)28, var2);
  1248.                   return var2;
  1249.                case 32:
  1250.                   var2 = this.addByte((byte)32, var2);
  1251.                   return var2;
  1252.                case 128:
  1253.                   int var118 = ((LabelTable)this).acquireLabel();
  1254.                   int var140 = ((LabelTable)this).acquireLabel();
  1255.                   int var33 = this.addGoto(var118, 7, var2);
  1256.                   int var34 = this.addByte((byte)52, var33);
  1257.                   int var35 = this.addGoto(var140, 6, var34);
  1258.                   ((LabelTable)this).markLabel(var118, var35);
  1259.                   var2 = this.addByte((byte)51, var35);
  1260.                   ((LabelTable)this).markLabel(var140, var2);
  1261.                   return var2;
  1262.                case 131:
  1263.                   int var32 = this.addByte((byte)57, var2);
  1264.                   var2 = this.addByte((byte)74, var32);
  1265.                   return var2;
  1266.                default:
  1267.                   this.badTree(var1);
  1268.                   return var2;
  1269.             }
  1270.          case 105:
  1271.          case 106:
  1272.             int var117 = var4.getType();
  1273.             switch (var117) {
  1274.                case 39:
  1275.                case 41:
  1276.                   Node var138 = var4.getFirstChild();
  1277.                   var2 = this.generateICode(var138, var2);
  1278.                   var138 = var138.getNextSibling();
  1279.                   var2 = this.generateICode(var138, var2);
  1280.                   if (var117 == 39) {
  1281.                      var2 = this.addByte((byte)(var3 == 105 ? 34 : 37), var2);
  1282.                   } else {
  1283.                      var2 = this.addByte((byte)(var3 == 105 ? 35 : 38), var2);
  1284.                   }
  1285.  
  1286.                   this.itsStackDepth += -1;
  1287.                   return var2;
  1288.                case 72:
  1289.                   String var137 = var4.getString();
  1290.                   if (this.itsData.itsNeedsActivation) {
  1291.                      var2 = this.addByte((byte)85, var2);
  1292.                      var2 = this.addByte((byte)46, var2);
  1293.                      var2 = this.addString(var137, var2);
  1294.                      this.itsStackDepth += 2;
  1295.                      if (this.itsStackDepth > this.itsData.itsMaxStack) {
  1296.                         this.itsData.itsMaxStack = this.itsStackDepth;
  1297.                      }
  1298.  
  1299.                      var2 = this.addByte((byte)(var3 == 105 ? 34 : 37), var2);
  1300.                      this.itsStackDepth += -1;
  1301.                   } else {
  1302.                      var2 = this.addByte((byte)(var3 == 105 ? 59 : 60), var2);
  1303.                      int var147 = this.itsData.itsVariableTable.getOrdinal(var137);
  1304.                      var2 = this.addByte((byte)var147, var2);
  1305.                      ++this.itsStackDepth;
  1306.                      if (this.itsStackDepth > this.itsData.itsMaxStack) {
  1307.                         this.itsData.itsMaxStack = this.itsStackDepth;
  1308.                         return var2;
  1309.                      }
  1310.                   }
  1311.  
  1312.                   return var2;
  1313.                default:
  1314.                   var2 = this.addByte((byte)(var3 == 105 ? 33 : 36), var2);
  1315.                   var2 = this.addString(var4.getString(), var2);
  1316.                   ++this.itsStackDepth;
  1317.                   if (this.itsStackDepth > this.itsData.itsMaxStack) {
  1318.                      this.itsData.itsMaxStack = this.itsStackDepth;
  1319.                   }
  1320.  
  1321.                   return var2;
  1322.             }
  1323.          case 108:
  1324.             var2 = this.addByte((byte)var1.getInt(), var2);
  1325.             ++this.itsStackDepth;
  1326.             if (this.itsStackDepth > this.itsData.itsMaxStack) {
  1327.                this.itsData.itsMaxStack = this.itsStackDepth;
  1328.             }
  1329.             break;
  1330.          case 109:
  1331.             var2 = this.addByte((byte)55, var2);
  1332.             Node var116 = (Node)var1.getProp(5);
  1333.             Short var136 = (Short)var116.getProp(5);
  1334.             var2 = this.addByte((byte)(var136 >> 8), var2);
  1335.             var2 = this.addByte((byte)(var136 & 255), var2);
  1336.             ++this.itsStackDepth;
  1337.             if (this.itsStackDepth > this.itsData.itsMaxStack) {
  1338.                this.itsData.itsMaxStack = this.itsStackDepth;
  1339.             }
  1340.             break;
  1341.          case 114:
  1342.             this.updateLineNumber(var1);
  1343.             var2 = this.generateICode(var4, var2);
  1344.             int var115 = this.itsData.itsMaxLocals++;
  1345.             var2 = this.addByte((byte)69, var2);
  1346.             var2 = this.addByte((byte)var115, var2);
  1347.             var2 = this.addByte((byte)57, var2);
  1348.             this.itsStackDepth += -1;
  1349.             Vector var135 = (Vector)var1.getProp(13);
  1350.  
  1351.             for(int var8 = 0; var8 < var135.size(); ++var8) {
  1352.                Node var9 = (Node)var135.elementAt(var8);
  1353.                Node var10 = var9.getFirstChild();
  1354.                var2 = this.generateICode(var10, var2);
  1355.                var2 = this.addByte((byte)70, var2);
  1356.                ++this.itsStackDepth;
  1357.                if (this.itsStackDepth > this.itsData.itsMaxStack) {
  1358.                   this.itsData.itsMaxStack = this.itsStackDepth;
  1359.                }
  1360.  
  1361.                var2 = this.addByte((byte)var115, var2);
  1362.                var2 = this.addByte((byte)53, var2);
  1363.                Node var11 = new Node(136);
  1364.                var9.addChildAfter(var11, var10);
  1365.                Node var12 = new Node(7);
  1366.                var12.putProp(1, var11);
  1367.                var2 = this.addGoto(var12, 7, var2);
  1368.                this.itsStackDepth += -1;
  1369.             }
  1370.  
  1371.             Node var146 = (Node)var1.getProp(14);
  1372.             if (var146 != null) {
  1373.                Node var149 = new Node(136);
  1374.                var146.getFirstChild().addChildToFront(var149);
  1375.                Node var153 = new Node(6);
  1376.                var153.putProp(1, var149);
  1377.                var2 = this.addGoto(var153, 6, var2);
  1378.             }
  1379.  
  1380.             Node var150 = (Node)var1.getProp(2);
  1381.             Node var154 = new Node(6);
  1382.             var154.putProp(1, var150);
  1383.             var2 = this.addGoto(var154, 6, var2);
  1384.             break;
  1385.          case 115:
  1386.             this.updateLineNumber(var1);
  1387.  
  1388.             for(Node var99 = var4.getNextSibling(); var99 != null; var99 = var99.getNextSibling()) {
  1389.                var2 = this.generateICode(var99, var2);
  1390.             }
  1391.             break;
  1392.          case 116:
  1393.          case 123:
  1394.          case 127:
  1395.          case 131:
  1396.          case 132:
  1397.          case 135:
  1398.          case 137:
  1399.             this.updateLineNumber(var1);
  1400.  
  1401.             while(var4 != null) {
  1402.                var2 = this.generateICode(var4, var2);
  1403.                var4 = var4.getNextSibling();
  1404.             }
  1405.             break;
  1406.          case 136:
  1407.             Object var114 = var1.getProp(20);
  1408.             if (var114 == null) {
  1409.                int var7 = ((LabelTable)this).markLabel(((LabelTable)this).acquireLabel(), var2);
  1410.                var1.putProp(20, new Integer(var7));
  1411.             } else {
  1412.                int var134 = (Integer)var114;
  1413.                ((LabelTable)this).markLabel(var134, var2);
  1414.             }
  1415.  
  1416.             if (var1.getProp(21) != null) {
  1417.                this.itsStackDepth = 1;
  1418.                if (this.itsStackDepth > this.itsData.itsMaxStack) {
  1419.                   this.itsData.itsMaxStack = this.itsStackDepth;
  1420.                }
  1421.             }
  1422.          case 138:
  1423.             break;
  1424.          case 140:
  1425.             var2 = this.generateICode(var4, var2);
  1426.             var2 = this.addByte((byte)82, var2);
  1427.             break;
  1428.          case 141:
  1429.             var2 = this.generateICode(var4, var2);
  1430.             Object var113 = var1.getProp(18);
  1431.             if (var113 == ScriptRuntime.NumberClass) {
  1432.                var2 = this.addByte((byte)58, var2);
  1433.             } else {
  1434.                this.badTree(var1);
  1435.             }
  1436.             break;
  1437.          case 142:
  1438.             Node var112 = (Node)var1.getProp(1);
  1439.             var112.putProp(21, var1);
  1440.             var2 = this.addGoto(var1, 65, var2);
  1441.             break;
  1442.          case 144:
  1443.             if (var1.getProp(1) != null) {
  1444.                var2 = this.addByte((byte)66, var2);
  1445.             } else {
  1446.                var2 = this.addByte((byte)70, var2);
  1447.                ++this.itsStackDepth;
  1448.                if (this.itsStackDepth > this.itsData.itsMaxStack) {
  1449.                   this.itsData.itsMaxStack = this.itsStackDepth;
  1450.                }
  1451.             }
  1452.  
  1453.             Node var6 = (Node)var1.getProp(7);
  1454.             var2 = this.addLocalRef(var6, var2);
  1455.             break;
  1456.          case 145:
  1457.             this.updateLineNumber(var1);
  1458.  
  1459.             for(; var4 != null; var4 = var4.getNextSibling()) {
  1460.                if (var4.getType() != 109) {
  1461.                   var2 = this.generateICode(var4, var2);
  1462.                }
  1463.             }
  1464.             break;
  1465.          default:
  1466.             this.badTree(var1);
  1467.       }
  1468.  
  1469.       return var2;
  1470.    }
  1471. }
  1472.