|
What this is
Other links
The source code/* * Sun Public License Notice * * The contents of this file are subject to the Sun Public License * Version 1.0 (the "License"). You may not use this file except in * compliance with the License. A copy of the License is available at * http://www.sun.com/ * * The Original Code is NetBeans. The Initial Developer of the Original * Code is Sun Microsystems, Inc. Portions Copyright 1997-2000 Sun * Microsystems, Inc. All Rights Reserved. */ package org.netbeans.modules.debugger.jpda.breakpoints; import com.sun.jdi.IncompatibleThreadStateException; import com.sun.jdi.ReferenceType; import com.sun.jdi.StackFrame; import com.sun.jdi.ThreadReference; import com.sun.jdi.VMDisconnectedException; import com.sun.jdi.Value; import com.sun.jdi.VirtualMachine; import com.sun.jdi.request.EventRequest; import com.sun.jdi.request.EventRequestManager; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeEvent; import org.netbeans.api.debugger.jpda.InvalidExpressionException; import org.netbeans.api.debugger.jpda.JPDABreakpoint; import org.netbeans.api.debugger.jpda.JPDABreakpointEvent; import org.netbeans.api.debugger.jpda.JPDADebugger; import org.netbeans.modules.debugger.jpda.JPDADebuggerImpl; import org.netbeans.modules.debugger.jpda.expr.Expression; import org.netbeans.modules.debugger.jpda.expr.ParseException; import org.netbeans.modules.debugger.jpda.util.Executor; /** * * @author Jan Jancura */ public abstract class BreakpointImpl implements Executor, PropertyChangeListener { private static boolean verbose = System.getProperty ("netbeans.debugger.breakpoints") != null; private JPDADebuggerImpl debugger; private JPDABreakpoint breakpoint; private Expression compiledCondition; private List requests = new ArrayList (); protected BreakpointImpl (JPDABreakpoint p, JPDADebuggerImpl debugger) { this.debugger = debugger; breakpoint = p; } /** * Called from XXXBreakpointImpl constructor only. */ final void set () { breakpoint.addPropertyChangeListener (this); update (); } /** * Called when Fix&Continue is invoked. Reqritten in LineBreakpointImpl. */ void fixed () { update (); } /** * Called from set () and propertyChanged. */ final void update () { if ( (getVirtualMachine () == null) || (getDebugger ().getState () == JPDADebugger.STATE_DISCONNECTED) ) return; removeAllEventRequests (); if (breakpoint.isEnabled ()) { setRequests (); } } public void propertyChange (PropertyChangeEvent evt) { update (); } protected abstract void setRequests (); protected final void remove () { removeAllEventRequests (); breakpoint.removePropertyChangeListener(this); } protected JPDABreakpoint getBreakpoint () { return breakpoint; } protected JPDADebuggerImpl getDebugger () { return debugger; } protected VirtualMachine getVirtualMachine () { return getDebugger ().getVirtualMachine (); } protected EventRequestManager getEventRequestManager () { return getVirtualMachine ().eventRequestManager (); } protected void addEventRequest (EventRequest r) { if (verbose) System.out.println ("B addEventRequest: " + r); requests.add (r); getDebugger ().getOperator ().register (r, this); r.setSuspendPolicy (getBreakpoint ().getSuspend ()); r.enable (); } private void removeAllEventRequests () { if (requests.size () == 0) return; if (getDebugger ().getVirtualMachine () == null) return; int i, k = requests.size (); try { for (i = 0; i < k; i++) { EventRequest r = (EventRequest) requests.get (i); if (verbose) System.out.println ("B removeEventRequest: " + r); getDebugger ().getVirtualMachine ().eventRequestManager (). deleteEventRequest (r); getDebugger ().getOperator ().unregister (r); } } catch (VMDisconnectedException e) { } catch (com.sun.jdi.InternalException e) { } requests = new LinkedList (); } public boolean perform ( String condition, ThreadReference thread, ReferenceType referenceType, Value value ) { boolean resume; if ((condition == null) || condition.equals ("")) { JPDABreakpointEvent e = new JPDABreakpointEvent ( getBreakpoint (), debugger, JPDABreakpointEvent.CONDITION_NONE, debugger.getThread (thread), referenceType, debugger.getVariable (value) ); getDebugger ().fireBreakpointEvent ( getBreakpoint (), e ); resume = getBreakpoint().getSuspend() == JPDABreakpoint.SUSPEND_NONE || e.getResume (); if (verbose) System.out.println ("B perform breakpoint (no condition): " + this + " resume: " + resume); } else { resume = evaluateCondition ( condition, thread, referenceType, value ); } if (!resume) getDebugger ().setStoppedState (thread); return resume; } private boolean evaluateCondition ( String condition, ThreadReference thread, ReferenceType referenceType, Value value ) { try { StackFrame sf = thread.frame (0); try { boolean result = evaluateConditionIn (condition, sf); JPDABreakpointEvent ev = new JPDABreakpointEvent ( getBreakpoint (), debugger, result ? JPDABreakpointEvent.CONDITION_TRUE : JPDABreakpointEvent.CONDITION_FALSE, debugger.getThread (thread), referenceType, debugger.getVariable (value) ); getDebugger ().fireBreakpointEvent ( getBreakpoint (), ev ); // condition true => stop here (do not resume) // condition false => resume if (verbose) System.out.println ("B perform breakpoint (condition = " + result + "): " + this + " resume: " + (!result || ev.getResume ())); return !result || ev.getResume (); } catch (ParseException ex) { JPDABreakpointEvent ev = new JPDABreakpointEvent ( getBreakpoint (), debugger, ex, debugger.getThread (thread), referenceType, debugger.getVariable (value) ); getDebugger ().fireBreakpointEvent ( getBreakpoint (), ev ); if (verbose) System.out.println ("B perform breakpoint (bad condition): " + this + " resume: " + ev.getResume ()); return ev.getResume (); } catch (InvalidExpressionException ex) { JPDABreakpointEvent ev = new JPDABreakpointEvent ( getBreakpoint (), debugger, ex, debugger.getThread (thread), referenceType, debugger.getVariable (value) ); getDebugger ().fireBreakpointEvent ( getBreakpoint (), ev ); return ev.getResume (); } } catch (IncompatibleThreadStateException ex) { // should not occurre ex.printStackTrace (); } // some error occured during evaluation of expression => do not resume return false; // do not resume } /** * Evaluates given condition. Returns value of condition evaluation. * Returns true othervise (bad expression). */ private boolean evaluateConditionIn ( String condExpr, StackFrame frame ) throws ParseException, InvalidExpressionException { // 1) compile expression if ( compiledCondition == null || !compiledCondition.getExpression ().equals (condExpr) ) compiledCondition = Expression.parse ( condExpr, Expression.LANGUAGE_JAVA_1_5 ); // 2) evaluate expression synchronized (debugger.LOCK) { com.sun.jdi.Value value = getDebugger ().evaluateIn ( compiledCondition, frame ); try { return ((com.sun.jdi.BooleanValue) value).booleanValue (); } catch (ClassCastException e) { throw new InvalidExpressionException (e); } } } } |
... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.