home *** CD-ROM | disk | FTP | other *** search
- package sun.tools.debug;
-
- import java.io.DataOutputStream;
- import java.io.IOException;
- import java.util.Enumeration;
- import java.util.Hashtable;
- import java.util.NoSuchElementException;
- import java.util.Vector;
-
- class BreakpointHandler extends Thread implements AgentConstants {
- static BreakpointQueue the_bkptQ;
- static Hashtable the_bkptHash;
- private Agent agent;
- private Hashtable catchHash;
- private Vector skipLines;
- static final boolean debug = false;
-
- native int setBreakpoint(int var1) throws InvalidPCException;
-
- native void clrBreakpoint(int var1, int var2) throws InvalidPCException;
-
- public static synchronized int getOpcode(int var0) {
- BreakpointSet var1 = (BreakpointSet)the_bkptHash.get(new Integer(var0));
- return var1 == null ? -1 : var1.opcode;
- }
-
- private synchronized int internalAddBreakpoint(Class var1, int var2) throws IOException {
- BreakpointSet var3 = (BreakpointSet)the_bkptHash.get(new Integer(var2));
- if (var3 == null) {
- if (var1 == null) {
- throw new IOException("Invalid classObj in addBreakpoint");
- } else {
- try {
- int var4 = this.setBreakpoint(var2) & 255;
- return var4;
- } catch (InvalidPCException var5) {
- throw new IOException("invalid PC");
- }
- }
- } else {
- return -1;
- }
- }
-
- synchronized void addBreakpoint(Class var1, int var2, int var3, byte[] var4) throws IOException {
- int var5 = this.internalAddBreakpoint(var1, var2);
- if (var5 != -1) {
- BreakpointSet var6 = new BreakpointSet(var2, var5, var1, var3, var4);
- the_bkptHash.put(new Integer(var2), var6);
- if (var4 != null && var4.length > 0) {
- var6.addCondition(var4);
- }
- }
-
- }
-
- synchronized void addScattershotBreakpoints(Class var1, int[] var2, Thread var3) throws IOException {
- for(int var4 = 0; var4 < var2.length; ++var4) {
- int var5 = var2[var4];
- int var6 = this.internalAddBreakpoint(var1, var5);
- if (var6 != -1) {
- BreakpointSet var7 = new BreakpointSet(var5, var6, var1, 4, (byte[])null);
- var7.setCohorts(var2);
- var7.setThread(var3);
- the_bkptHash.put(new Integer(var5), var7);
- }
- }
-
- }
-
- synchronized void deleteBreakpoint(Class var1, int var2) throws IOException {
- BreakpointSet var3 = (BreakpointSet)the_bkptHash.get(new Integer(var2));
- if (var3 != null) {
- try {
- this.clrBreakpoint(var2, var3.opcode);
- } catch (InvalidPCException var4) {
- throw new IOException("invalid PC");
- }
-
- the_bkptHash.remove(new Integer(var2));
- }
- }
-
- synchronized BreakpointSet[] listBreakpoints() {
- BreakpointSet[] var1 = new BreakpointSet[the_bkptHash.size()];
- Enumeration var2 = the_bkptHash.elements();
-
- for(int var3 = 0; var3 < var1.length; ++var3) {
- try {
- var1[var3] = (BreakpointSet)var2.nextElement();
- } catch (NoSuchElementException var5) {
- Agent.error("Internal error" + this.agent.exceptionStackTrace(var5));
- return null;
- }
- }
-
- return var1;
- }
-
- synchronized void catchExceptionClass(Class var1) {
- if (this.catchHash.get(var1) == null) {
- this.catchHash.put(var1, var1);
- }
-
- }
-
- synchronized void ignoreExceptionClass(Class var1) {
- this.catchHash.remove(var1);
- }
-
- Class[] getCatchList() {
- Class[] var1 = new Class[this.catchHash.size()];
- Enumeration var2 = this.catchHash.elements();
-
- for(int var3 = 0; var3 < var1.length; ++var3) {
- var1[var3] = (Class)var2.nextElement();
- }
-
- return var1;
- }
-
- void addSkipLine(LineNumber var1) {
- this.skipLines.addElement(var1);
- }
-
- void removeSkipLine(LineNumber var1) {
- this.skipLines.removeElement(var1);
- }
-
- boolean ignoreSingleStep(Thread var1, int var2) {
- Enumeration var3 = this.skipLines.elements();
-
- while(var3.hasMoreElements()) {
- LineNumber var4 = (LineNumber)var3.nextElement();
- if (var4.thread == var1) {
- if (var2 >= var4.startPC && var2 <= var4.endPC) {
- return true;
- }
-
- this.removeSkipLine(var4);
- }
- }
-
- return false;
- }
-
- BreakpointHandler(Agent var1) {
- super("Breakpoint handler");
- the_bkptQ = new BreakpointQueue();
- the_bkptHash = new Hashtable();
- this.catchHash = new Hashtable();
- this.skipLines = new Vector();
- this.agent = var1;
- }
-
- public void run() {
- Class var1 = this.getClass();
-
- try {
- while(true) {
- the_bkptQ.updated = true;
- synchronized(var1){}
-
- try {
- var1.notifyAll();
- } catch (Throwable var72) {
- throw var72;
- }
-
- if (!the_bkptQ.nextEvent()) {
- return;
- }
-
- if (this.agent.asyncOutputStream != null && !Agent.systemThread(the_bkptQ.thread)) {
- if (the_bkptQ.exception != null) {
- this.agent.setSingleStep(the_bkptQ.thread, false);
- if (the_bkptQ.exception instanceof ThreadDeath) {
- DataOutputStream var81 = this.agent.asyncOutputStream;
- synchronized(var81){}
-
- try {
- this.agent.asyncOutputStream.write(66);
- this.agent.writeObject(the_bkptQ.thread, this.agent.asyncOutputStream);
- this.agent.asyncOutputStream.flush();
- } catch (Throwable var71) {
- throw var71;
- }
- } else {
- Class var80 = the_bkptQ.exception.getClass();
- if (this.catchHash.containsKey(var80) || the_bkptQ.catch_pc == 0) {
- this.agent.suspendAllThreads();
- String var84 = the_bkptQ.catch_pc == 0 ? "Uncaught exception: " : "Exception: ";
- String var86 = this.agent.exceptionStackTrace(the_bkptQ.exception);
- var84 = var84.concat(var86);
- DataOutputStream var6 = this.agent.asyncOutputStream;
- synchronized(var6){}
-
- try {
- this.agent.asyncOutputStream.write(52);
- this.agent.writeObject(the_bkptQ.thread, this.agent.asyncOutputStream);
- this.agent.asyncOutputStream.writeUTF(var84);
- this.agent.asyncOutputStream.flush();
- } catch (Throwable var74) {
- throw var74;
- }
- }
- }
- } else if (the_bkptQ.opcode != -1) {
- this.addBreakpoint((Class)null, the_bkptQ.pc, 1, (byte[])null);
- } else {
- BreakpointSet var2 = (BreakpointSet)the_bkptHash.get(new Integer(the_bkptQ.pc));
- if (var2 == null) {
- if (this.ignoreSingleStep(the_bkptQ.thread, the_bkptQ.pc)) {
- continue;
- }
-
- this.agent.setSingleStep(the_bkptQ.thread, false);
- the_bkptQ.opcode = -1;
- } else {
- if (var2.thread != null && var2.thread != the_bkptQ.thread) {
- continue;
- }
-
- the_bkptQ.opcode = var2.opcode;
- }
-
- this.agent.suspendAllThreads();
- if (var2 != null) {
- if (var2.type == 2) {
- this.deleteBreakpoint(var2.clazz, var2.pc);
- } else if (var2.type == 4) {
- int[] var78 = var2.cohorts;
-
- for(int var83 = 0; var83 < var78.length; ++var83) {
- BreakpointSet var5 = (BreakpointSet)the_bkptHash.get(new Integer(var78[var83]));
- this.deleteBreakpoint(var5.clazz, var5.pc);
- }
- }
- }
-
- DataOutputStream var79 = this.agent.asyncOutputStream;
- synchronized(var79){}
-
- try {
- this.agent.asyncOutputStream.write(46);
- this.agent.writeObject(the_bkptQ.thread, this.agent.asyncOutputStream);
- this.agent.asyncOutputStream.flush();
- } catch (Throwable var73) {
- throw var73;
- }
- }
- }
- }
- } catch (ThreadDeath var75) {
- BreakpointSet var82;
- for(Enumeration var77 = the_bkptHash.elements(); var77.hasMoreElements(); the_bkptHash.remove(new Integer(var82.pc))) {
- var82 = (BreakpointSet)var77.nextElement();
-
- try {
- this.clrBreakpoint(var82.pc, var82.opcode);
- } catch (Exception var70) {
- }
- }
-
- the_bkptQ.updated = true;
- synchronized(var1){}
-
- try {
- var1.notifyAll();
- } catch (Throwable var69) {
- throw var69;
- }
-
- throw var75;
- } catch (Exception var76) {
- Agent.error(this.agent.exceptionStackTrace(var76));
-
- BreakpointSet var4;
- for(Enumeration var3 = the_bkptHash.elements(); var3.hasMoreElements(); the_bkptHash.remove(new Integer(var4.pc))) {
- var4 = (BreakpointSet)var3.nextElement();
-
- try {
- this.clrBreakpoint(var4.pc, var4.opcode);
- } catch (Exception var68) {
- }
- }
-
- the_bkptQ.updated = true;
- synchronized(var1){}
-
- try {
- var1.notifyAll();
- } catch (Throwable var67) {
- throw var67;
- }
-
- }
- }
- }
-