home *** CD-ROM | disk | FTP | other *** search
/ Symantec Visual Cafe for Java 2.5 / symantec-visual-cafe-2.5-database-dev-edition.iso / VPage / Java.bin / CLASSES.ZIP / sun / tools / ttydebug / TTY.class (.txt)
Encoding:
Java Class File  |  1997-07-08  |  27.1 KB  |  1,439 lines

  1. package sun.tools.ttydebug;
  2.  
  3. import java.io.DataInputStream;
  4. import java.io.File;
  5. import java.io.FileInputStream;
  6. import java.io.IOException;
  7. import java.io.InputStream;
  8. import java.io.PrintStream;
  9. import java.net.InetAddress;
  10. import java.net.SocketException;
  11. import java.util.NoSuchElementException;
  12. import java.util.StringTokenizer;
  13. import sun.tools.debug.DebuggerCallback;
  14. import sun.tools.debug.NoSuchLineNumberException;
  15. import sun.tools.debug.RemoteArray;
  16. import sun.tools.debug.RemoteClass;
  17. import sun.tools.debug.RemoteDebugger;
  18. import sun.tools.debug.RemoteField;
  19. import sun.tools.debug.RemoteInt;
  20. import sun.tools.debug.RemoteObject;
  21. import sun.tools.debug.RemoteStackFrame;
  22. import sun.tools.debug.RemoteStackVariable;
  23. import sun.tools.debug.RemoteThread;
  24. import sun.tools.debug.RemoteThreadGroup;
  25. import sun.tools.debug.RemoteValue;
  26.  
  27. public class TTY implements DebuggerCallback {
  28.    RemoteDebugger debugger;
  29.    RemoteThread currentThread;
  30.    RemoteThreadGroup currentThreadGroup;
  31.    PrintStream out;
  32.    PrintStream console;
  33.    private String lastArgs;
  34.  
  35.    private RemoteThread indexToThread(int var1) throws Exception {
  36.       this.setDefaultThreadGroup();
  37.       RemoteThread[] var2 = this.currentThreadGroup.listThreads(true);
  38.       return var1 != 0 && var1 <= var2.length ? var2[var1 - 1] : null;
  39.    }
  40.  
  41.    private int parseThreadId(String var1) throws Exception {
  42.       if (var1.startsWith("t@")) {
  43.          var1 = var1.substring(2);
  44.       }
  45.  
  46.       int var2;
  47.       try {
  48.          var2 = Integer.valueOf(var1);
  49.       } catch (NumberFormatException var3) {
  50.          var2 = 0;
  51.       }
  52.  
  53.       if (this.indexToThread(var2) == null) {
  54.          this.out.println("\"" + var1 + "\" is not a valid thread id.");
  55.          return 0;
  56.       } else {
  57.          return var2;
  58.       }
  59.    }
  60.  
  61.    private void printPrompt() throws Exception {
  62.       if (this.currentThread == null) {
  63.          this.out.print("> ");
  64.       } else {
  65.          this.out.print(this.currentThread.getName() + "[" + (this.currentThread.getCurrentFrameIndex() + 1) + "] ");
  66.       }
  67.  
  68.       this.out.flush();
  69.    }
  70.  
  71.    public synchronized void printToConsole(String var1) throws Exception {
  72.       this.console.print(var1);
  73.       this.console.flush();
  74.    }
  75.  
  76.    public void breakpointEvent(RemoteThread var1) throws Exception {
  77.       this.out.print("\nBreakpoint hit: ");
  78.       RemoteStackFrame[] var2 = var1.dumpStack();
  79.       if (var2.length > 0) {
  80.          this.out.println(var2[0].toString());
  81.          this.currentThread = var1;
  82.       } else {
  83.          this.out.println("Invalid thread specified in breakpoint.");
  84.       }
  85.  
  86.       this.printPrompt();
  87.    }
  88.  
  89.    public void exceptionEvent(RemoteThread var1, String var2) throws Exception {
  90.       this.out.println("\n" + var2);
  91.       var1.setCurrentFrameIndex(0);
  92.       this.currentThread = var1;
  93.       this.printPrompt();
  94.    }
  95.  
  96.    public void threadDeathEvent(RemoteThread var1) throws Exception {
  97.       this.out.println("\n" + var1.getName() + " died.");
  98.       if (var1 == this.currentThread) {
  99.          this.currentThread = null;
  100.       }
  101.  
  102.       this.printPrompt();
  103.    }
  104.  
  105.    public void quitEvent() throws Exception {
  106.       String var1 = null;
  107.       if (this.lastArgs != null) {
  108.          StringTokenizer var2 = new StringTokenizer(this.lastArgs);
  109.          if (var2.hasMoreTokens()) {
  110.             var1 = new String("\n" + var2.nextToken() + " exited");
  111.          }
  112.       }
  113.  
  114.       if (var1 == null) {
  115.          var1 = new String("\nThe application exited");
  116.       }
  117.  
  118.       this.out.println(var1);
  119.       this.currentThread = null;
  120.       System.exit(0);
  121.    }
  122.  
  123.    void classes() throws Exception {
  124.       RemoteClass[] var1 = this.debugger.listClasses();
  125.       this.out.println("** classes list **");
  126.  
  127.       for(int var2 = 0; var2 < var1.length; ++var2) {
  128.          this.out.println(var1[var2].description());
  129.       }
  130.  
  131.    }
  132.  
  133.    void methods(StringTokenizer var1) throws Exception {
  134.       if (!var1.hasMoreTokens()) {
  135.          this.out.println("No class specified.");
  136.       } else {
  137.          String var2 = var1.nextToken();
  138.  
  139.          try {
  140.             RemoteClass var3 = this.getClassFromToken(var2);
  141.             RemoteField[] var4 = var3.getMethods();
  142.  
  143.             for(int var5 = 0; var5 < var4.length; ++var5) {
  144.                this.out.println(var4[var5].getTypedName());
  145.             }
  146.  
  147.          } catch (IllegalArgumentException var6) {
  148.             this.out.println("\"" + var2 + "\" is not a valid id or class name.");
  149.          }
  150.       }
  151.    }
  152.  
  153.    int printThreadGroup(RemoteThreadGroup var1, int var2) throws Exception {
  154.       this.out.println("Group " + var1.getName() + ":");
  155.       RemoteThread[] var3 = var1.listThreads(false);
  156.       int var4 = 0;
  157.       int var5 = 0;
  158.  
  159.       for(int var6 = 0; var6 < var3.length; ++var6) {
  160.          int var7 = var3[var6].description().length();
  161.          if (var7 > var4) {
  162.             var4 = var7;
  163.          }
  164.  
  165.          String var8 = var3[var6].getName();
  166.          int var9 = var8.lastIndexOf(46);
  167.          if (var9 >= 0 && var8.length() > var9) {
  168.             var8 = var8.substring(var9 + 1);
  169.          }
  170.  
  171.          if (var8.length() > var5) {
  172.             var5 = var8.length();
  173.          }
  174.       }
  175.  
  176.       for(int var14 = 0; var14 < var3.length; ++var14) {
  177.          char[] var15 = new char[80];
  178.  
  179.          for(int var17 = 0; var17 < 79; ++var17) {
  180.             var15[var17] = ' ';
  181.          }
  182.  
  183.          var15[79] = 0;
  184.          StringBuffer var10 = new StringBuffer();
  185.          var10.append(var15);
  186.          var10.insert(var14 + var2 + 1 < 10 ? 1 : 0, var14 + var2 + 1);
  187.          var10.insert(2, ".");
  188.          int var11 = 4;
  189.          var10.insert(var11, var3[var14].description());
  190.          var11 += var4 + 1;
  191.          String var12 = var3[var14].getName();
  192.          int var13 = var12.lastIndexOf(46);
  193.          if (var13 >= 0 && var12.length() > var13) {
  194.             var12 = var12.substring(var13 + 1);
  195.          }
  196.  
  197.          var10.insert(var11, var12);
  198.          var11 += var5 + 1;
  199.          var10.insert(var11, var3[var14].getStatus());
  200.          var10.setLength(79);
  201.          this.out.println(var10.toString());
  202.       }
  203.  
  204.       RemoteThreadGroup[] var16 = this.debugger.listThreadGroups(var1);
  205.  
  206.       for(int var18 = 0; var18 < var16.length; ++var18) {
  207.          if (var1 != var16[var18]) {
  208.             var2 += this.printThreadGroup(var16[var18], var2 + var3.length);
  209.          }
  210.       }
  211.  
  212.       return var3.length;
  213.    }
  214.  
  215.    private void setDefaultThreadGroup() throws Exception {
  216.       if (this.currentThreadGroup == null) {
  217.          RemoteThreadGroup[] var1 = this.debugger.listThreadGroups((RemoteThreadGroup)null);
  218.          this.currentThreadGroup = var1[0];
  219.       }
  220.  
  221.    }
  222.  
  223.    void threads(StringTokenizer var1) throws Exception {
  224.       if (!var1.hasMoreTokens()) {
  225.          this.setDefaultThreadGroup();
  226.          this.printThreadGroup(this.currentThreadGroup, 0);
  227.       } else {
  228.          String var2 = var1.nextToken();
  229.          RemoteThreadGroup[] var3 = this.debugger.listThreadGroups((RemoteThreadGroup)null);
  230.  
  231.          for(int var4 = 0; var4 < var3.length; ++var4) {
  232.             if (var2.equals(var3[var4].getName())) {
  233.                this.printThreadGroup(var3[var4], 0);
  234.                return;
  235.             }
  236.          }
  237.  
  238.          this.out.println(var2 + " is not a valid threadgroup name.");
  239.       }
  240.    }
  241.  
  242.    void threadGroups() throws Exception {
  243.       RemoteThreadGroup[] var1 = this.debugger.listThreadGroups((RemoteThreadGroup)null);
  244.  
  245.       for(int var2 = 0; var2 < var1.length; ++var2) {
  246.          this.out.println((new Integer(var2 + 1)).toString() + ". " + var1[var2].description() + " " + var1[var2].getName());
  247.       }
  248.  
  249.    }
  250.  
  251.    void setThread(int var1) throws Exception {
  252.       this.setDefaultThreadGroup();
  253.       RemoteThread var2 = this.indexToThread(var1);
  254.       if (var2 == null) {
  255.          this.out.println("\"" + var1 + "\" is not a valid thread id.");
  256.       } else {
  257.          this.currentThread = var2;
  258.       }
  259.    }
  260.  
  261.    void thread(StringTokenizer var1) throws Exception {
  262.       if (!var1.hasMoreTokens()) {
  263.          this.out.println("Thread number not specified.");
  264.       } else {
  265.          int var2 = this.parseThreadId(var1.nextToken());
  266.          if (var2 != 0) {
  267.             this.setThread(var2);
  268.          }
  269.       }
  270.    }
  271.  
  272.    void threadGroup(StringTokenizer var1) throws Exception {
  273.       if (!var1.hasMoreTokens()) {
  274.          this.out.println("Threadgroup name not specified.");
  275.       } else {
  276.          String var2 = var1.nextToken();
  277.          RemoteThreadGroup[] var3 = this.debugger.listThreadGroups((RemoteThreadGroup)null);
  278.  
  279.          for(int var4 = 0; var4 < var3.length; ++var4) {
  280.             if (var2.equals(var3[var4].getName())) {
  281.                this.currentThreadGroup = var3[var4];
  282.                return;
  283.             }
  284.          }
  285.  
  286.          this.out.println(var2 + " is not a valid threadgroup name.");
  287.       }
  288.    }
  289.  
  290.    void run(StringTokenizer var1) throws Exception {
  291.       String[] var2 = new String[100];
  292.       int var3 = 0;
  293.       if (!var1.hasMoreTokens() && this.lastArgs != null) {
  294.          var1 = new StringTokenizer(this.lastArgs);
  295.          this.out.println("run " + this.lastArgs);
  296.       }
  297.  
  298.       while(var1.hasMoreTokens()) {
  299.          var2[var3++] = var1.nextToken();
  300.          if (var3 == 1) {
  301.             RemoteClass var4 = this.debugger.findClass(var2[0]);
  302.             if (var4 == null) {
  303.                this.out.println("Could not load the " + var2[0] + " class.");
  304.                return;
  305.             }
  306.  
  307.             var2[0] = var4.getName();
  308.          }
  309.       }
  310.  
  311.       if (var3 > 0) {
  312.          RemoteThreadGroup var5 = this.debugger.run(var3, var2);
  313.          if (var5 != null) {
  314.             this.currentThreadGroup = var5;
  315.             this.setThread(1);
  316.             this.out.println("running ...");
  317.          } else {
  318.             this.out.println(var2[0] + " failed.");
  319.          }
  320.       } else {
  321.          this.out.println("No class name specified.");
  322.       }
  323.    }
  324.  
  325.    void load(StringTokenizer var1) throws Exception {
  326.       if (!var1.hasMoreTokens()) {
  327.          this.out.println("Class name not specified.");
  328.       } else {
  329.          String var2 = var1.nextToken();
  330.          RemoteClass var3 = this.debugger.findClass(var2);
  331.          if (var3 == null) {
  332.             this.out.print(var2 + " not found");
  333.             this.out.println(var2.indexOf(46) > 0 ? " (try the full name)" : "");
  334.          } else {
  335.             this.out.println(var3.toString());
  336.          }
  337.       }
  338.    }
  339.  
  340.    void suspend(StringTokenizer var1) throws Exception {
  341.       if (!var1.hasMoreTokens()) {
  342.          this.setDefaultThreadGroup();
  343.          RemoteThread[] var6 = this.currentThreadGroup.listThreads(true);
  344.  
  345.          for(int var7 = 0; var7 < var6.length; ++var7) {
  346.             var6[var7].suspend();
  347.          }
  348.  
  349.          this.out.println("All (non-system) threads suspended.");
  350.       } else {
  351.          while(var1.hasMoreTokens()) {
  352.             String var2 = var1.nextToken();
  353.  
  354.             int var3;
  355.             try {
  356.                var3 = Integer.valueOf(var2);
  357.             } catch (NumberFormatException var5) {
  358.                var3 = 0;
  359.             }
  360.  
  361.             RemoteThread var4 = this.indexToThread(var3);
  362.             if (var4 == null) {
  363.                this.out.println("\"" + var2 + "\" is not a valid thread id.");
  364.             } else {
  365.                var4.suspend();
  366.             }
  367.          }
  368.  
  369.       }
  370.    }
  371.  
  372.    void resume(StringTokenizer var1) throws Exception {
  373.       if (!var1.hasMoreTokens()) {
  374.          this.setDefaultThreadGroup();
  375.          RemoteThread[] var6 = this.currentThreadGroup.listThreads(true);
  376.  
  377.          for(int var7 = 0; var7 < var6.length; ++var7) {
  378.             var6[var7].resume();
  379.          }
  380.  
  381.          if (this.currentThread != null) {
  382.             this.currentThread.resetCurrentFrameIndex();
  383.          }
  384.  
  385.          this.out.println("All threads resumed.");
  386.       } else {
  387.          while(var1.hasMoreTokens()) {
  388.             String var2 = var1.nextToken();
  389.  
  390.             int var3;
  391.             try {
  392.                var3 = Integer.valueOf(var2);
  393.             } catch (NumberFormatException var5) {
  394.                var3 = 0;
  395.             }
  396.  
  397.             RemoteThread var4 = this.indexToThread(var3);
  398.             if (var4 == null) {
  399.                this.out.println("\"" + var2 + "\" is not a valid thread id.");
  400.             } else {
  401.                var4.resume();
  402.                if (var4 == this.currentThread) {
  403.                   this.currentThread.resetCurrentFrameIndex();
  404.                }
  405.             }
  406.          }
  407.  
  408.       }
  409.    }
  410.  
  411.    void cont() throws Exception {
  412.       if (this.currentThread == null) {
  413.          this.out.println("Nothing suspended.");
  414.       } else {
  415.          this.debugger.cont();
  416.       }
  417.    }
  418.  
  419.    void step() throws Exception {
  420.       if (this.currentThread == null) {
  421.          this.out.println("Nothing suspended.");
  422.       } else {
  423.          try {
  424.             this.currentThread.step(true);
  425.          } catch (IllegalAccessError var1) {
  426.             this.out.println("Current thread is not at breakpoint.");
  427.          }
  428.       }
  429.    }
  430.  
  431.    void next() throws Exception {
  432.       if (this.currentThread == null) {
  433.          this.out.println("Nothing suspended.");
  434.       } else {
  435.          try {
  436.             this.currentThread.next();
  437.          } catch (IllegalAccessError var1) {
  438.             this.out.println("Current thread is not at breakpoint.");
  439.          }
  440.       }
  441.    }
  442.  
  443.    void kill(StringTokenizer var1) throws Exception {
  444.       if (!var1.hasMoreTokens()) {
  445.          this.out.println("Usage: kill <threadgroup name> or <thread id>");
  446.       } else {
  447.          while(var1.hasMoreTokens()) {
  448.             String var2 = var1.nextToken();
  449.  
  450.             int var3;
  451.             try {
  452.                var3 = Integer.valueOf(var2);
  453.             } catch (NumberFormatException var7) {
  454.                var3 = 0;
  455.             }
  456.  
  457.             RemoteThread var4 = this.indexToThread(var3);
  458.             if (var4 != null) {
  459.                this.out.println("killing thread: " + var4.getName());
  460.                var4.stop();
  461.                return;
  462.             }
  463.  
  464.             RemoteThreadGroup[] var5 = this.debugger.listThreadGroups((RemoteThreadGroup)null);
  465.             var5 = this.debugger.listThreadGroups(var5[0]);
  466.  
  467.             for(int var6 = 0; var6 < var5.length; ++var6) {
  468.                if (var5[var6].getName().equals(var2)) {
  469.                   this.out.println("killing threadgroup: " + var2);
  470.                   var5[var6].stop();
  471.                   return;
  472.                }
  473.             }
  474.  
  475.             this.out.println("\"" + var2 + "\" is not a valid threadgroup or id.");
  476.          }
  477.  
  478.       }
  479.    }
  480.  
  481.    void catchException(StringTokenizer var1) throws Exception {
  482.       if (var1.hasMoreTokens()) {
  483.          String var5 = var1.nextToken();
  484.  
  485.          try {
  486.             RemoteClass var6 = this.getClassFromToken(var5);
  487.             var6.catchExceptions();
  488.          } catch (Exception var4) {
  489.             this.out.println("Invalid exception class name: " + var5);
  490.          }
  491.       } else {
  492.          String[] var2 = this.debugger.getExceptionCatchList();
  493.  
  494.          for(int var3 = 0; var3 < var2.length; ++var3) {
  495.             this.out.print("  " + var2[var3]);
  496.             if ((var3 & 4) == 3 || var3 == var2.length - 1) {
  497.                this.out.println();
  498.             }
  499.          }
  500.  
  501.       }
  502.    }
  503.  
  504.    void ignoreException(StringTokenizer var1) throws Exception {
  505.       if (var1.hasMoreTokens()) {
  506.          String var5 = var1.nextToken();
  507.  
  508.          try {
  509.             RemoteClass var6 = this.getClassFromToken(var5);
  510.             var6.ignoreExceptions();
  511.          } catch (Exception var4) {
  512.             this.out.println("Invalid exception class name: " + var5);
  513.          }
  514.       } else {
  515.          String[] var2 = this.debugger.getExceptionCatchList();
  516.  
  517.          for(int var3 = 0; var3 < var2.length; ++var3) {
  518.             this.out.print("  " + var2[var3]);
  519.             if ((var3 & 4) == 3 || var3 == var2.length - 1) {
  520.                this.out.println();
  521.             }
  522.          }
  523.  
  524.       }
  525.    }
  526.  
  527.    // $FF: renamed from: up (java.util.StringTokenizer) void
  528.    void method_0(StringTokenizer var1) throws Exception {
  529.       if (this.currentThread == null) {
  530.          this.out.println("Current thread not set.");
  531.       } else {
  532.          int var2 = 1;
  533.          if (var1.hasMoreTokens()) {
  534.             String var3 = var1.nextToken();
  535.  
  536.             int var4;
  537.             try {
  538.                var4 = Integer.valueOf(var3);
  539.             } catch (NumberFormatException var7) {
  540.                var4 = 0;
  541.             }
  542.  
  543.             if (var4 == 0) {
  544.                this.out.println("Usage: up [n frames]");
  545.                return;
  546.             }
  547.  
  548.             var2 = var4;
  549.          }
  550.  
  551.          try {
  552.             this.currentThread.up(var2);
  553.          } catch (IllegalAccessError var5) {
  554.             this.out.println("Thread isn't suspended.");
  555.          } catch (ArrayIndexOutOfBoundsException var6) {
  556.             this.out.println("End of stack.");
  557.          }
  558.       }
  559.    }
  560.  
  561.    void down(StringTokenizer var1) throws Exception {
  562.       if (this.currentThread == null) {
  563.          this.out.println("Current thread not set.");
  564.       } else {
  565.          int var2 = 1;
  566.          if (var1.hasMoreTokens()) {
  567.             String var3 = var1.nextToken();
  568.  
  569.             int var4;
  570.             try {
  571.                var4 = Integer.valueOf(var3);
  572.             } catch (NumberFormatException var7) {
  573.                var4 = 0;
  574.             }
  575.  
  576.             if (var4 == 0) {
  577.                this.out.println("usage: down [n frames]");
  578.                return;
  579.             }
  580.  
  581.             var2 = var4;
  582.          }
  583.  
  584.          try {
  585.             this.currentThread.down(var2);
  586.          } catch (IllegalAccessError var5) {
  587.             this.out.println("Thread isn't suspended.");
  588.          } catch (ArrayIndexOutOfBoundsException var6) {
  589.             this.out.println("End of stack.");
  590.          }
  591.       }
  592.    }
  593.  
  594.    void dumpStack(RemoteThread var1) throws Exception {
  595.       RemoteStackFrame[] var2 = var1.dumpStack();
  596.       if (var2.length == 0) {
  597.          this.out.println("Thread is not running (no stack).");
  598.       } else {
  599.          int var3 = var2.length;
  600.  
  601.          for(int var4 = var1.getCurrentFrameIndex(); var4 < var3; ++var4) {
  602.             this.out.print("  [" + (var4 + 1) + "] ");
  603.             this.out.println(var2[var4].toString());
  604.          }
  605.  
  606.       }
  607.    }
  608.  
  609.    void where(StringTokenizer var1) throws Exception {
  610.       if (!var1.hasMoreTokens()) {
  611.          if (this.currentThread == null) {
  612.             this.out.println("No thread specified.");
  613.          } else {
  614.             this.dumpStack(this.currentThread);
  615.          }
  616.       } else {
  617.          String var2 = var1.nextToken();
  618.          if (!var2.toLowerCase().equals("all")) {
  619.             int var5 = this.parseThreadId(var2);
  620.             if (var5 != 0) {
  621.                this.dumpStack(this.indexToThread(var5));
  622.             }
  623.          } else {
  624.             this.setDefaultThreadGroup();
  625.             RemoteThread[] var3 = this.currentThreadGroup.listThreads(true);
  626.  
  627.             for(int var4 = 0; var4 < var3.length; ++var4) {
  628.                this.out.println(var3[var4].getName() + ": ");
  629.                this.dumpStack(var3[var4]);
  630.             }
  631.  
  632.          }
  633.       }
  634.    }
  635.  
  636.    void trace(String var1, StringTokenizer var2) throws Exception {
  637.       if (!var2.hasMoreTokens()) {
  638.          this.out.println("(i)trace < \"on\" | \"off\" >");
  639.       } else {
  640.          String var3 = var2.nextToken();
  641.          boolean var4;
  642.          if (var3.equals("on")) {
  643.             var4 = true;
  644.          } else {
  645.             if (!var3.equals("off")) {
  646.                this.out.println("(i)trace < \"on\" | \"off\" >");
  647.                return;
  648.             }
  649.  
  650.             var4 = false;
  651.          }
  652.  
  653.          if (var1.equals("trace")) {
  654.             this.debugger.trace(var4);
  655.          } else {
  656.             this.debugger.itrace(var4);
  657.          }
  658.       }
  659.    }
  660.  
  661.    void memory() throws Exception {
  662.       this.out.println("Free: " + this.debugger.freeMemory() + ", total: " + this.debugger.totalMemory());
  663.    }
  664.  
  665.    // $FF: renamed from: gc () void
  666.    void method_1() throws Exception {
  667.       RemoteObject[] var1 = new RemoteObject[]{this.currentThread, this.currentThreadGroup};
  668.       this.debugger.gc(var1);
  669.    }
  670.  
  671.    private RemoteClass getClassFromToken(String var1) throws Exception {
  672.       Object var2;
  673.       if (!var1.startsWith("0x") && !Character.isDigit(var1.charAt(0))) {
  674.          var2 = this.debugger.findClass(var1);
  675.          if (var2 == null) {
  676.             throw new IllegalArgumentException();
  677.          }
  678.       } else {
  679.          int var3;
  680.          try {
  681.             var3 = RemoteValue.fromHex(var1);
  682.          } catch (NumberFormatException var4) {
  683.             var3 = 0;
  684.          }
  685.  
  686.          if (var3 == 0 || (var2 = this.debugger.get(new Integer(var3))) == null) {
  687.             throw new IllegalArgumentException();
  688.          }
  689.  
  690.          if (!(var2 instanceof RemoteClass)) {
  691.             throw new IllegalArgumentException();
  692.          }
  693.       }
  694.  
  695.       return (RemoteClass)var2;
  696.    }
  697.  
  698.    void listBreakpoints() throws Exception {
  699.       String[] var1 = this.debugger.listBreakpoints();
  700.       if (var1.length <= 0) {
  701.          this.out.println("No breakpoints set.");
  702.       } else {
  703.          this.out.println("Current breakpoints set:");
  704.  
  705.          for(int var2 = 0; var2 < var1.length; ++var2) {
  706.             this.out.println("\t" + var1[var2]);
  707.          }
  708.  
  709.       }
  710.    }
  711.  
  712.    void stop(StringTokenizer var1) throws Exception {
  713.       if (!var1.hasMoreTokens()) {
  714.          this.listBreakpoints();
  715.       } else {
  716.          Object var2 = null;
  717.  
  718.          try {
  719.             String var3 = var1.nextToken();
  720.             if (var3.equals("at")) {
  721.                boolean var4 = true;
  722.             } else {
  723.                if (!var3.equals("in")) {
  724.                   this.out.println("Usage: stop at <class>:<line_number> or");
  725.                   this.out.println("       stop in <class>.<method_name>");
  726.                   return;
  727.                }
  728.  
  729.                boolean var17 = false;
  730.             }
  731.  
  732.             if (var3.equals("at")) {
  733.                String var16 = var1.nextToken(": \t\n\r");
  734.                RemoteClass var19 = this.getClassFromToken(var16);
  735.                String var20 = var1.nextToken();
  736.                int var22 = Integer.valueOf(var20);
  737.                String var23 = var19.setBreakpointLine(var22);
  738.                if (var23.length() > 0) {
  739.                   this.out.println(var23);
  740.                } else {
  741.                   this.out.println("Breakpoint set at " + var19.getName() + ":" + var22);
  742.                }
  743.             } else {
  744.                String var14 = var1.nextToken(": \t\n\r");
  745.                Object var5 = null;
  746.                String var6 = null;
  747.  
  748.                try {
  749.                   var18 = this.getClassFromToken(var14);
  750.                } catch (IllegalArgumentException var10) {
  751.                   int var7 = var14.lastIndexOf(".");
  752.                   if (var7 == -1) {
  753.                      this.out.println("\"" + var14 + "\" is not a valid id or class name.");
  754.                      return;
  755.                   }
  756.  
  757.                   var6 = var14.substring(var7 + 1);
  758.                   var14 = var14.substring(0, var7);
  759.                   var18 = this.getClassFromToken(var14);
  760.                }
  761.  
  762.                if (var6 == null) {
  763.                   var6 = var1.nextToken();
  764.                }
  765.  
  766.                RemoteField var21;
  767.                try {
  768.                   var21 = var18.getMethod(var6);
  769.                } catch (NoSuchMethodException var9) {
  770.                   this.out.println("Class " + var18.getName() + " doesn't have a method " + var6);
  771.                   return;
  772.                }
  773.  
  774.                String var8 = var18.setBreakpointMethod(var21);
  775.                if (var8.length() > 0) {
  776.                   this.out.println(var8);
  777.                } else {
  778.                   this.out.println("Breakpoint set in " + var18.getName() + "." + var6);
  779.                }
  780.             }
  781.          } catch (NoSuchElementException var11) {
  782.             this.out.println("Usage: stop at <class>:<line_number> or");
  783.             this.out.println("       stop in <class>.<method_name>");
  784.          } catch (NumberFormatException var12) {
  785.             this.out.println("Invalid line number.");
  786.          } catch (IllegalArgumentException var13) {
  787.             this.out.println("\"" + var2 + "\" is not a valid id or class name.");
  788.          }
  789.       }
  790.    }
  791.  
  792.    void clear(StringTokenizer var1) throws Exception {
  793.       if (!var1.hasMoreTokens()) {
  794.          this.listBreakpoints();
  795.       } else {
  796.          Object var2 = null;
  797.          Object var3 = null;
  798.          Object var4 = null;
  799.  
  800.          try {
  801.             String var13 = var1.nextToken(": \t\n\r");
  802.  
  803.             try {
  804.                var17 = this.getClassFromToken(var13);
  805.             } catch (IllegalArgumentException var9) {
  806.                int var5 = var13.lastIndexOf(".");
  807.                if (var5 == -1) {
  808.                   this.out.println("\"" + var13 + "\" is not a valid id or class name.");
  809.                   return;
  810.                }
  811.  
  812.                String var15 = var13.substring(var5 + 1);
  813.                var13 = var13.substring(0, var5);
  814.                RemoteClass var16 = this.getClassFromToken(var13);
  815.  
  816.                RemoteField var6;
  817.                try {
  818.                   var6 = var16.getMethod(var15);
  819.                } catch (NoSuchMethodException var8) {
  820.                   this.out.println("\"" + var15 + "\" is not a valid method name of class " + var16.getName());
  821.                   return;
  822.                }
  823.  
  824.                String var7 = var16.clearBreakpointMethod(var6);
  825.                if (var7.length() > 0) {
  826.                   this.out.println(var7);
  827.                   return;
  828.                }
  829.  
  830.                this.out.println("Breakpoint cleared at " + var16.getName() + "." + var15);
  831.                return;
  832.             }
  833.  
  834.             String var18 = var1.nextToken();
  835.             int var19 = Integer.valueOf(var18);
  836.             String var20 = var17.clearBreakpointLine(var19);
  837.             if (var20.length() > 0) {
  838.                this.out.println(var20);
  839.             } else {
  840.                this.out.println("Breakpoint cleared at " + var17.getName() + ": " + var19);
  841.             }
  842.          } catch (NoSuchElementException var10) {
  843.             this.out.println("Usage: clear <class>:<line_number>");
  844.             this.out.println("   or: clear <class>.<method>");
  845.          } catch (NumberFormatException var11) {
  846.             this.out.println("Usage: clear <class>:<line_number>");
  847.             this.out.println("   or: clear <class>.<method>");
  848.          } catch (IllegalArgumentException var12) {
  849.             this.out.println("\"" + var2 + "\" is not a valid id or class name.");
  850.          }
  851.       }
  852.    }
  853.  
  854.    void list(StringTokenizer var1) throws Exception {
  855.       Object var2 = null;
  856.       if (this.currentThread == null) {
  857.          this.out.println("No thread specified.");
  858.       } else {
  859.          try {
  860.             var16 = this.currentThread.getCurrentFrame();
  861.          } catch (IllegalAccessError var14) {
  862.             this.out.println("Current thread isn't suspended.");
  863.             return;
  864.          } catch (ArrayIndexOutOfBoundsException var15) {
  865.             this.out.println("Thread is not running (no stack).");
  866.             return;
  867.          }
  868.  
  869.          int var3;
  870.          if (var1.hasMoreTokens()) {
  871.             String var4 = var1.nextToken();
  872.  
  873.             try {
  874.                var3 = Integer.valueOf(var4);
  875.             } catch (NumberFormatException var13) {
  876.                try {
  877.                   var3 = var16.getRemoteClass().getMethodLineNumber(var4);
  878.                } catch (NoSuchMethodException var11) {
  879.                   this.out.println(var4 + " is not a valid line number or " + "method name for class " + var16.getRemoteClass().getName());
  880.                   return;
  881.                } catch (NoSuchLineNumberException var12) {
  882.                   this.out.println("Line number information not found in " + var16.getRemoteClass().getName());
  883.                   return;
  884.                }
  885.             }
  886.          } else {
  887.             var3 = var16.getLineNumber();
  888.          }
  889.  
  890.          int var17 = var3 > 4 ? var3 - 4 : 1;
  891.          int var5 = var17 + 9;
  892.          InputStream var6 = var16.getRemoteClass().getSourceFile();
  893.          if (var6 == null) {
  894.             this.out.println("Unable to find " + var16.getRemoteClass().getSourceFileName());
  895.          } else {
  896.             DataInputStream var7 = new DataInputStream(var6);
  897.             String var8 = null;
  898.  
  899.             for(int var9 = 1; var9 <= var17; ++var9) {
  900.                var8 = var7.readLine();
  901.             }
  902.  
  903.             if (var8 == null) {
  904.                this.out.println((new Integer(var3)).toString() + " is an invalid line number for the file " + var16.getRemoteClass().getSourceFileName());
  905.             }
  906.  
  907.             for(int var10 = var17; var10 < var5 && var8 != null; ++var10) {
  908.                this.out.print((new Integer(var10)).toString() + "\t" + (var10 == var3 ? "=> " : "   "));
  909.                this.out.println(var8);
  910.                var8 = var7.readLine();
  911.             }
  912.  
  913.          }
  914.       }
  915.    }
  916.  
  917.    void use(StringTokenizer var1) throws Exception {
  918.       if (!var1.hasMoreTokens()) {
  919.          this.out.println(this.debugger.getSourcePath());
  920.       } else {
  921.          this.debugger.setSourcePath(var1.nextToken());
  922.       }
  923.    }
  924.  
  925.    private void printVar(RemoteStackVariable var1) {
  926.       this.out.print("  " + var1.getName());
  927.       if (var1.inScope()) {
  928.          RemoteValue var2 = var1.getValue();
  929.          this.out.println(" = " + (var2 == null ? "null" : var2.toString()));
  930.       } else {
  931.          this.out.println(" is not in scope");
  932.       }
  933.    }
  934.  
  935.    void locals() throws Exception {
  936.       if (this.currentThread == null) {
  937.          this.out.println("No default thread specified: use the \"thread\" command first.");
  938.       } else {
  939.          RemoteStackVariable[] var1 = this.currentThread.getStackVariables();
  940.          if (var1 != null && var1.length != 0) {
  941.             this.out.println("Method arguments:");
  942.  
  943.             for(int var2 = 0; var2 < var1.length; ++var2) {
  944.                if (var1[var2].methodArgument()) {
  945.                   this.printVar(var1[var2]);
  946.                }
  947.             }
  948.  
  949.             this.out.println("Local variables:");
  950.  
  951.             for(int var3 = 0; var3 < var1.length; ++var3) {
  952.                if (!var1[var3].methodArgument()) {
  953.                   this.printVar(var1[var3]);
  954.                }
  955.             }
  956.  
  957.          } else {
  958.             this.out.println("No local variables: try compiling with -g");
  959.          }
  960.       }
  961.    }
  962.  
  963.    boolean print(StringTokenizer var1, boolean var2, boolean var3) throws Exception {
  964.       if (!var1.hasMoreTokens()) {
  965.          this.out.println("No objects specified.");
  966.          return false;
  967.       } else {
  968.          while(var1.hasMoreTokens()) {
  969.             Object var5 = null;
  970.             String var6 = ".[(";
  971.             String var7 = var1.nextToken();
  972.             StringTokenizer var8 = new StringTokenizer(var7, var6, true);
  973.             String var9 = var8.nextToken();
  974.             if (var9.startsWith("t@")) {
  975.                this.setDefaultThreadGroup();
  976.                RemoteThread[] var30 = this.currentThreadGroup.listThreads(true);
  977.  
  978.                int var24;
  979.                try {
  980.                   var24 = Integer.valueOf(var9.substring(2));
  981.                } catch (NumberFormatException var23) {
  982.                   var24 = 0;
  983.                }
  984.  
  985.                if (var24 <= 0 || var24 > var30.length) {
  986.                   this.out.println("\"" + var9 + "\" is not a valid thread id.");
  987.                   return false;
  988.                }
  989.  
  990.                var5 = var30[var24 - 1];
  991.             } else if (var9.startsWith("$s")) {
  992.                int var29;
  993.                try {
  994.                   var29 = Integer.valueOf(var9.substring(2));
  995.                } catch (NumberFormatException var22) {
  996.                   this.out.println("\"" + var9 + "\" is not a valid slot.");
  997.                   return false;
  998.                }
  999.  
  1000.                if (this.currentThread != null) {
  1001.                   RemoteStackVariable[] var12 = this.currentThread.getStackVariables();
  1002.                   if (var12 == null || var29 >= var12.length) {
  1003.                      this.out.println("\"" + var9 + "\" is not a valid slot.");
  1004.                      return false;
  1005.                   }
  1006.  
  1007.                   var5 = var12[var29].getValue();
  1008.                }
  1009.             } else if (!var9.startsWith("0x") && !Character.isDigit(var9.charAt(0))) {
  1010.                if (this.currentThread != null) {
  1011.                   RemoteStackVariable var11 = this.currentThread.getStackVariable(var9);
  1012.                   if (var11 != null && !var11.inScope()) {
  1013.                      this.out.println(var9 + " is not in scope.");
  1014.                      return false;
  1015.                   }
  1016.  
  1017.                   var5 = var11 == null ? null : var11.getValue();
  1018.                }
  1019.  
  1020.                if (var5 == null) {
  1021.                   if (!var9.equals("this")) {
  1022.                      String var28 = "this." + var9;
  1023.                      if (this.print(new StringTokenizer(var28), var2, true)) {
  1024.                         return true;
  1025.                      }
  1026.                   }
  1027.  
  1028.                   var5 = this.debugger.findClass(var9);
  1029.                   if (var5 == null) {
  1030.                      if (!var3) {
  1031.                         this.out.println("\"" + var7 + "\" is not a " + "valid id or class name.");
  1032.                      }
  1033.  
  1034.                      return false;
  1035.                   }
  1036.                }
  1037.             } else {
  1038.                int var4;
  1039.                try {
  1040.                   var4 = RemoteValue.fromHex(var9);
  1041.                } catch (NumberFormatException var19) {
  1042.                   var4 = 0;
  1043.                }
  1044.  
  1045.                if (var4 == 0 || (var5 = this.debugger.get(new Integer(var4))) == null) {
  1046.                   this.out.println("\"" + var9 + "\" is not a valid id.");
  1047.                   return false;
  1048.                }
  1049.             }
  1050.  
  1051.             RemoteInt var31 = new RemoteInt(-1);
  1052.             Object var32 = var31;
  1053.             String var13 = "";
  1054.             var9 = var8.hasMoreTokens() ? var8.nextToken() : null;
  1055.  
  1056.             while(var9 != null) {
  1057.                if (!var9.equals(".")) {
  1058.                   if (!var9.equals("[")) {
  1059.                      if (var9.equals("(")) {
  1060.                         this.out.println("print <method> not supported yet.");
  1061.                         return false;
  1062.                      }
  1063.  
  1064.                      this.out.println("invalid expression");
  1065.                      return false;
  1066.                   }
  1067.  
  1068.                   if (!var8.hasMoreTokens()) {
  1069.                      this.out.println("\"" + var7 + "\" is not a valid expression.");
  1070.                      return false;
  1071.                   }
  1072.  
  1073.                   var9 = var8.nextToken("]");
  1074.  
  1075.                   try {
  1076.                      int var14 = Integer.valueOf(var9);
  1077.                      var32 = ((RemoteArray)var32).getElement(var14);
  1078.                   } catch (NumberFormatException var20) {
  1079.                      this.out.println("\"" + var9 + "\" is not a valid decimal number.");
  1080.                      return false;
  1081.                   } catch (ArrayIndexOutOfBoundsException var21) {
  1082.                      this.out.println(var9 + " is out of bounds for " + ((RemoteValue)var5).description());
  1083.                      return false;
  1084.                   }
  1085.  
  1086.                   if (var32 != null && ((RemoteValue)var32).isObject()) {
  1087.                      var5 = var32;
  1088.                      var32 = var31;
  1089.                   }
  1090.  
  1091.                   if (!var8.hasMoreTokens() || !var8.nextToken().equals("]")) {
  1092.                      this.out.println("\"" + var7 + "\" is not a valid expression.");
  1093.                      return false;
  1094.                   }
  1095.  
  1096.                   var9 = var8.hasMoreTokens() ? var8.nextToken(var6) : null;
  1097.                } else {
  1098.                   if (!var8.hasMoreTokens()) {
  1099.                      this.out.println("\"" + var7 + "\" is not a valid expression.");
  1100.                      return false;
  1101.                   }
  1102.  
  1103.                   var9 = var8.nextToken();
  1104.                   if (var32 != var31) {
  1105.                      this.out.println("\"" + var13 + "\" is not an object.");
  1106.                      return false;
  1107.                   }
  1108.  
  1109.                   var13 = var9;
  1110.                   var32 = ((RemoteObject)var5).getFieldValue(var9);
  1111.                   if (var32 == null) {
  1112.                      this.out.println("\"" + var9 + "\" is not a valid field of " + ((RemoteValue)var5).description());
  1113.                      return false;
  1114.                   }
  1115.  
  1116.                   if (((RemoteValue)var32).isObject()) {
  1117.                      var5 = var32;
  1118.                      var32 = var31;
  1119.                   }
  1120.  
  1121.                   var9 = var8.hasMoreTokens() ? var8.nextToken() : null;
  1122.                }
  1123.             }
  1124.  
  1125.             this.out.print(var7 + " = ");
  1126.             if (var32 != var31) {
  1127.                this.out.println(var32 == null ? "null" : ((RemoteValue)var32).description());
  1128.             } else if (var2 && var5 instanceof RemoteObject) {
  1129.                this.out.println(((RemoteValue)var5).description() + " {");
  1130.                if (var5 instanceof RemoteClass) {
  1131.                   RemoteClass var33 = (RemoteClass)var5;
  1132.                   this.out.print("    superclass = ");
  1133.                   RemoteClass var15 = var33.getSuperclass();
  1134.                   this.out.println(var15 == null ? "null" : var15.description());
  1135.                   this.out.print("    loader = ");
  1136.                   RemoteObject var16 = var33.getClassLoader();
  1137.                   this.out.println(var16 == null ? "null" : var16.description());
  1138.                   RemoteClass[] var17 = var33.getInterfaces();
  1139.                   if (var17 != null && var17.length > 0) {
  1140.                      this.out.println("    interfaces:");
  1141.  
  1142.                      for(int var18 = 0; var18 < var17.length; ++var18) {
  1143.                         this.out.println("        " + var17[var18]);
  1144.                      }
  1145.                   }
  1146.                }
  1147.  
  1148.                RemoteField[] var34 = ((RemoteObject)var5).getFields();
  1149.                if (var5 instanceof RemoteClass && var34.length > 0) {
  1150.                   this.out.println();
  1151.                }
  1152.  
  1153.                for(int var35 = 0; var35 < var34.length; ++var35) {
  1154.                   String var36 = var34[var35].getTypedName();
  1155.                   String var37 = var34[var35].getModifiers();
  1156.                   this.out.print("    " + var37 + var36 + " = ");
  1157.                   RemoteValue var38 = ((RemoteObject)var5).getFieldValue(var35);
  1158.                   this.out.println(var38 == null ? "null" : var38.description());
  1159.                }
  1160.  
  1161.                this.out.println("}");
  1162.             } else {
  1163.                this.out.println(var5.toString());
  1164.             }
  1165.          }
  1166.  
  1167.          return true;
  1168.       }
  1169.    }
  1170.  
  1171.    void help() {
  1172.       this.out.println("** command list **");
  1173.       this.out.println("threads [threadgroup]     -- list threads");
  1174.       this.out.println("thread <thread id>        -- set default thread");
  1175.       this.out.println("suspend [thread id(s)]    -- suspend threads (default: all)");
  1176.       this.out.println("resume [thread id(s)]     -- resume threads (default: all)");
  1177.       this.out.println("where [thread id] | all   -- dump a thread's stack");
  1178.       this.out.println("threadgroups              -- list threadgroups");
  1179.       this.out.println("threadgroup <name>        -- set current threadgroup\n");
  1180.       this.out.println("print <id> [id(s)]        -- print object or field");
  1181.       this.out.println("dump <id> [id(s)]         -- print all object information\n");
  1182.       this.out.println("locals                    -- print all local variables in current stack frame\n");
  1183.       this.out.println("classes                   -- list currently known classes");
  1184.       this.out.println("methods <class id>        -- list a class's methods\n");
  1185.       this.out.println("stop in <class id>.<method> -- set a breakpoint in a method");
  1186.       this.out.println("stop at <class id>:<line> -- set a breakpoint at a line");
  1187.       this.out.println("up [n frames]             -- move up a thread's stack");
  1188.       this.out.println("down [n frames]           -- move down a thread's stack");
  1189.       this.out.println("clear <class id>:<line>   -- clear a breakpoint");
  1190.       this.out.println("step                      -- execute current line");
  1191.       this.out.println("cont                      -- continue execution from breakpoint\n");
  1192.       this.out.println("catch <class id>          -- break for the specified exception");
  1193.       this.out.println("ignore <class id>         -- ignore when the specified exception\n");
  1194.       this.out.println("list [line number|method] -- print source code");
  1195.       this.out.println("use [source file path]    -- display or change the source path\n");
  1196.       this.out.println("memory                    -- report memory usage");
  1197.       this.out.println("gc                        -- free unused objects\n");
  1198.       this.out.println("load classname            -- load Java class to be debugged");
  1199.       this.out.println("run <class> [args]        -- start execution of a loaded Java class");
  1200.       this.out.println("!!                        -- repeat last command");
  1201.       this.out.println("help (or ?)               -- list commands");
  1202.       this.out.println("exit (or quit)            -- exit debugger");
  1203.    }
  1204.  
  1205.    void executeCommand(StringTokenizer var1) {
  1206.       String var2 = var1.nextToken().toLowerCase();
  1207.  
  1208.       try {
  1209.          if (var2.equals("print")) {
  1210.             this.print(var1, false, false);
  1211.          } else if (var2.equals("dump")) {
  1212.             this.print(var1, true, false);
  1213.          } else if (var2.equals("locals")) {
  1214.             this.locals();
  1215.          } else if (var2.equals("classes")) {
  1216.             this.classes();
  1217.          } else if (var2.equals("methods")) {
  1218.             this.methods(var1);
  1219.          } else if (var2.equals("threads")) {
  1220.             this.threads(var1);
  1221.          } else if (var2.equals("thread")) {
  1222.             this.thread(var1);
  1223.          } else if (var2.equals("suspend")) {
  1224.             this.suspend(var1);
  1225.          } else if (var2.equals("resume")) {
  1226.             this.resume(var1);
  1227.          } else if (var2.equals("threadgroups")) {
  1228.             this.threadGroups();
  1229.          } else if (var2.equals("threadgroup")) {
  1230.             this.threadGroup(var1);
  1231.          } else if (var2.equals("catch")) {
  1232.             this.catchException(var1);
  1233.          } else if (var2.equals("ignore")) {
  1234.             this.ignoreException(var1);
  1235.          } else if (var2.equals("cont")) {
  1236.             this.cont();
  1237.          } else if (var2.equals("step")) {
  1238.             this.step();
  1239.          } else if (var2.equals("next")) {
  1240.             this.next();
  1241.          } else if (var2.equals("kill")) {
  1242.             this.kill(var1);
  1243.          } else if (var2.equals("where")) {
  1244.             this.where(var1);
  1245.          } else if (var2.equals("up")) {
  1246.             this.method_0(var1);
  1247.          } else if (var2.equals("down")) {
  1248.             this.down(var1);
  1249.          } else if (var2.equals("load")) {
  1250.             this.load(var1);
  1251.          } else if (var2.equals("run")) {
  1252.             this.run(var1);
  1253.          } else if (var2.equals("memory")) {
  1254.             this.memory();
  1255.          } else if (var2.equals("gc")) {
  1256.             this.method_1();
  1257.          } else if (!var2.equals("trace") && !var2.equals("itrace")) {
  1258.             if (var2.equals("stop")) {
  1259.                this.stop(var1);
  1260.             } else if (var2.equals("clear")) {
  1261.                this.clear(var1);
  1262.             } else if (var2.equals("list")) {
  1263.                this.list(var1);
  1264.             } else if (var2.equals("use")) {
  1265.                this.use(var1);
  1266.             } else if (!var2.equals("help") && !var2.equals("?")) {
  1267.                if (!var2.equals("quit") && !var2.equals("exit")) {
  1268.                   this.out.println("huh? Try help...");
  1269.                } else {
  1270.                   this.debugger.close();
  1271.                   System.exit(0);
  1272.                }
  1273.             } else {
  1274.                this.help();
  1275.             }
  1276.          } else {
  1277.             this.trace(var2, var1);
  1278.          }
  1279.       } catch (Exception var4) {
  1280.          this.out.println("Internal exception:");
  1281.          this.out.flush();
  1282.          ((Throwable)var4).printStackTrace();
  1283.       }
  1284.    }
  1285.  
  1286.    void readCommandFile(File var1) {
  1287.       try {
  1288.          if (var1.canRead()) {
  1289.             DataInputStream var2 = new DataInputStream(new FileInputStream(var1));
  1290.  
  1291.             String var3;
  1292.             while((var3 = var2.readLine()) != null) {
  1293.                StringTokenizer var4 = new StringTokenizer(var3);
  1294.                if (var4.hasMoreTokens()) {
  1295.                   this.executeCommand(var4);
  1296.                }
  1297.             }
  1298.  
  1299.             return;
  1300.          }
  1301.       } catch (IOException var5) {
  1302.       }
  1303.  
  1304.    }
  1305.  
  1306.    public TTY(String var1, String var2, String var3, String var4, PrintStream var5, PrintStream var6, boolean var7) throws Exception {
  1307.       System.out.println("Initializing jdb...");
  1308.       this.out = var5;
  1309.       this.console = var6;
  1310.       if (var2 == null) {
  1311.          this.debugger = new RemoteDebugger(var3, this, var7);
  1312.       } else {
  1313.          this.debugger = new RemoteDebugger(var1, var2, this, var7);
  1314.       }
  1315.  
  1316.       DataInputStream var8 = new DataInputStream(System.in);
  1317.       String var9 = null;
  1318.       if (var4 != null && var4.length() > 0) {
  1319.          StringTokenizer var10 = new StringTokenizer(var4);
  1320.          this.load(var10);
  1321.          this.lastArgs = var4;
  1322.       }
  1323.  
  1324.       Thread.currentThread().setPriority(5);
  1325.       File var13 = new File(System.getProperty("user.home") + System.getProperty("file.separator") + "jdb.ini");
  1326.       if (!var13.canRead()) {
  1327.          var13 = new File(System.getProperty("user.home") + System.getProperty("file.separator") + ".jdbrc");
  1328.       }
  1329.  
  1330.       this.readCommandFile(var13);
  1331.       var13 = new File(System.getProperty("user.dir") + System.getProperty("file.separator") + "startup.jdb");
  1332.       this.readCommandFile(var13);
  1333.  
  1334.       while(true) {
  1335.          this.printPrompt();
  1336.          String var11 = var8.readLine();
  1337.          if (var11 == null) {
  1338.             this.out.println("Input stream closed.");
  1339.             return;
  1340.          }
  1341.  
  1342.          if (var11.startsWith("!!") && var9 != null) {
  1343.             var11 = var9 + var11.substring(2);
  1344.             this.out.println(var11);
  1345.          }
  1346.  
  1347.          StringTokenizer var12 = new StringTokenizer(var11);
  1348.          if (var12.hasMoreTokens()) {
  1349.             var9 = var11;
  1350.             this.executeCommand(var12);
  1351.          }
  1352.       }
  1353.    }
  1354.  
  1355.    public static void main(String[] var0) {
  1356.       String var1;
  1357.       try {
  1358.          var1 = InetAddress.getLocalHost().getHostName();
  1359.       } catch (Exception var12) {
  1360.          var1 = null;
  1361.       }
  1362.  
  1363.       if (var1 == null) {
  1364.          var1 = "localhost";
  1365.       }
  1366.  
  1367.       String var2 = null;
  1368.       String var3 = null;
  1369.       String var4 = "";
  1370.       String var5 = "";
  1371.       boolean var6 = false;
  1372.  
  1373.       for(int var7 = 0; var7 < var0.length; ++var7) {
  1374.          String var8 = var0[var7];
  1375.          if (var8.equals("-dbgtrace")) {
  1376.             var6 = true;
  1377.          } else if (!var8.equals("-cs") && !var8.equals("-checksource") && !var8.equals("-noasyncgc") && !var8.equals("-prof") && !var8.equals("-v") && !var8.equals("-verbose") && !var8.equals("-verify") && !var8.equals("-noverify") && !var8.equals("-verifyremote") && !var8.equals("-verbosegc") && !var8.startsWith("-ms") && !var8.startsWith("-mx") && !var8.startsWith("-ss") && !var8.startsWith("-oss") && !var8.startsWith("-D")) {
  1378.             if (var8.equals("-classpath")) {
  1379.                if (var7 == var0.length - 1) {
  1380.                   System.out.println("No classpath specified.");
  1381.                   System.exit(1);
  1382.                }
  1383.  
  1384.                StringBuffer var10000 = (new StringBuffer(String.valueOf(var5))).append(var8).append(" ");
  1385.                ++var7;
  1386.                var5 = var10000.append(var0[var7]).append(" ").toString();
  1387.             } else if (var8.equals("-host")) {
  1388.                if (var7 == var0.length - 1) {
  1389.                   System.out.println("No host specified.");
  1390.                   System.exit(1);
  1391.                }
  1392.  
  1393.                ++var7;
  1394.                var2 = var0[var7];
  1395.             } else if (var8.equals("-password")) {
  1396.                if (var7 == var0.length - 1) {
  1397.                   System.out.println("No password specified.");
  1398.                   System.exit(1);
  1399.                }
  1400.  
  1401.                ++var7;
  1402.                var3 = var0[var7];
  1403.             } else {
  1404.                var4 = var4 + var8 + " ";
  1405.             }
  1406.          } else {
  1407.             var5 = var5 + var8 + " ";
  1408.          }
  1409.       }
  1410.  
  1411.       if (var2 != null && var3 == null) {
  1412.          System.out.println("A debug password must be specified for remote debugging.");
  1413.          System.exit(1);
  1414.       }
  1415.  
  1416.       if (var2 == null) {
  1417.          var2 = var1;
  1418.       }
  1419.  
  1420.       try {
  1421.          if (!var2.equals(var1) && var3.length() == 0) {
  1422.             System.out.println("No password supplied for accessing remote Java interpreter.");
  1423.             System.out.println("The password is reported by the remote interpreterwhen it is started.");
  1424.             System.exit(1);
  1425.          }
  1426.  
  1427.          new TTY(var2, var3, var5, var4, System.out, System.out, var6);
  1428.       } catch (SocketException var9) {
  1429.          System.out.println("Failed accessing debugging session on " + var2 + ": invalid password.");
  1430.       } catch (NumberFormatException var10) {
  1431.          System.out.println("Failed accessing debugging session on " + var2 + ": invalid password.");
  1432.       } catch (Exception var11) {
  1433.          System.out.print("Internal exception:  ");
  1434.          System.out.flush();
  1435.          ((Throwable)var11).printStackTrace();
  1436.       }
  1437.    }
  1438. }
  1439.