diff --git a/debug/org.eclipse.cdt.debug.core/cdi/org/eclipse/cdt/debug/core/cdi/model/ICDIBreakpoint.java b/debug/org.eclipse.cdt.debug.core/cdi/org/eclipse/cdt/debug/core/cdi/model/ICDIBreakpoint.java index 7d0d55f0296..0f3d5b21ca3 100644 --- a/debug/org.eclipse.cdt.debug.core/cdi/org/eclipse/cdt/debug/core/cdi/model/ICDIBreakpoint.java +++ b/debug/org.eclipse.cdt.debug.core/cdi/org/eclipse/cdt/debug/core/cdi/model/ICDIBreakpoint.java @@ -37,17 +37,16 @@ public interface ICDIBreakpoint extends ICDIObject { final static public int TEMPORARY = ICBreakpointType.TEMPORARY; /** @deprecated use ICBreakpointTyped.HARDWARE */ final static public int HARDWARE = ICBreakpointType.HARDWARE; + /** - * Returns whether this breakpoint is temporary. - * * @return whether this breakpoint is temporary + * @deprecated by {@link ICDIBreakpoint2#getType()} */ boolean isTemporary(); /** - * Returns whether this breakpoint is hardware-assisted. - * * @return whether this breakpoint is hardware-assisted + * @deprecated by {@link ICDIBreakpoint2#getType()} */ boolean isHardware(); diff --git a/debug/org.eclipse.cdt.debug.core/cdi/org/eclipse/cdt/debug/core/cdi/model/ICDIBreakpoint2.java b/debug/org.eclipse.cdt.debug.core/cdi/org/eclipse/cdt/debug/core/cdi/model/ICDIBreakpoint2.java new file mode 100644 index 00000000000..41aa10fb1a1 --- /dev/null +++ b/debug/org.eclipse.cdt.debug.core/cdi/org/eclipse/cdt/debug/core/cdi/model/ICDIBreakpoint2.java @@ -0,0 +1,38 @@ +/******************************************************************************* + * Copyright (c) 2008 Freescale and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Freescale - Initial API and implementation + *******************************************************************************/ + +package org.eclipse.cdt.debug.core.cdi.model; + +import org.eclipse.cdt.debug.core.model.ICBreakpointType; + +/** + * Extension of the ICDIBreakpoint interface + */ +public interface ICDIBreakpoint2 extends ICDIBreakpoint { + + /** + * Return the type of the breakpoint. If the breakpoint's creation + * originated in CDT, then CDT specified the type as part of that request + * and this method must return that value. If the breakpoint's creation + * originated in the CDI client, then this method is invoked by CDT to + * discover the type of the breakpoint. + * + * If the CDI breakpoint implements this interface, then + * {@link ICDIBreakpoint#isTemporary()} and + * {@link ICDIBreakpoint#isHardware()} will never get called by CDT, as this + * method is meant to replace those. + * + * @return one of the type constants defined in ICBreakpointType (note that + * {@link ICBreakpointType#TEMPORARY} can be bit-applied to any of + * the type values to qualify it as a temporary breakpoint. + */ + int getType(); +} diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/CDIDebugModel.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/CDIDebugModel.java index f5e910a0ab8..e77a3b2cf74 100644 --- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/CDIDebugModel.java +++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/CDIDebugModel.java @@ -179,6 +179,8 @@ public class CDIDebugModel { * the handle to the breakpoint source * @param resource * the resource on which to create the associated breakpoint marker + * @param type + * a type constant from ICBreakpointType * @param lineNumber * the line number on which the breakpoint is set - line numbers are 1 based, associated with the source file in which the breakpoint is set * @param enabled @@ -196,7 +198,7 @@ public class CDIDebugModel { *
  • Failure creating underlying marker. The exception's status contains the underlying exception responsible for the failure.
  • * */ - public static ICLineBreakpoint createLineBreakpoint( String sourceHandle, IResource resource, int lineNumber, boolean enabled, int ignoreCount, String condition, boolean register ) throws CoreException { + public static ICLineBreakpoint createLineBreakpoint( String sourceHandle, IResource resource, int type, int lineNumber, boolean enabled, int ignoreCount, String condition, boolean register ) throws CoreException { HashMap attributes = new HashMap( 10 ); attributes.put( IBreakpoint.ID, getPluginIdentifier() ); attributes.put( IMarker.LINE_NUMBER, new Integer( lineNumber ) ); @@ -204,7 +206,7 @@ public class CDIDebugModel { attributes.put( ICBreakpoint.IGNORE_COUNT, new Integer( ignoreCount ) ); attributes.put( ICBreakpoint.CONDITION, condition ); attributes.put( ICBreakpoint.SOURCE_HANDLE, sourceHandle ); - attributes.put( ICBreakpointType.TYPE, ICBreakpointType.REGULAR ); + attributes.put( ICBreakpointType.TYPE, type ); return new CLineBreakpoint( resource, attributes, register ); } @@ -216,6 +218,7 @@ public class CDIDebugModel { * @param module the module name the breakpoint is set in * @param sourceHandle the handle to the breakpoint source * @param resource the resource on which to create the associated breakpoint marker + * @param type a type constant from ICBreakpointType * @param address the address on which the breakpoint is set * @param enabled whether to enable or disable this breakpoint * @param ignoreCount the number of times this breakpoint will be ignored @@ -229,8 +232,8 @@ public class CDIDebugModel { * failure. * */ - public static ICAddressBreakpoint createAddressBreakpoint( String module, String sourceHandle, IResource resource, IAddress address, boolean enabled, int ignoreCount, String condition, boolean register ) throws CoreException { - return createAddressBreakpoint( module, sourceHandle, resource, -1, address, enabled, ignoreCount, condition, register ); + public static ICAddressBreakpoint createAddressBreakpoint( String module, String sourceHandle, IResource resource, int type, IAddress address, boolean enabled, int ignoreCount, String condition, boolean register ) throws CoreException { + return createAddressBreakpoint( module, sourceHandle, resource, type, -1, address, enabled, ignoreCount, condition, register ); } /** @@ -241,6 +244,7 @@ public class CDIDebugModel { * @param module the module name the breakpoint is set in * @param sourceHandle the handle to the breakpoint source * @param resource the resource on which to create the associated breakpoint marker + * @param type a type constant from ICBreakpointType * @param lineNumber the line number in the source file * @param address the address on which the breakpoint is set * @param enabled whether to enable or disable this breakpoint @@ -255,7 +259,7 @@ public class CDIDebugModel { * failure. * */ - public static ICAddressBreakpoint createAddressBreakpoint( String module, String sourceHandle, IResource resource, int lineNumber, IAddress address, boolean enabled, int ignoreCount, String condition, boolean register ) throws CoreException { + public static ICAddressBreakpoint createAddressBreakpoint( String module, String sourceHandle, IResource resource, int type, int lineNumber, IAddress address, boolean enabled, int ignoreCount, String condition, boolean register ) throws CoreException { HashMap attributes = new HashMap( 10 ); attributes.put( IBreakpoint.ID, getPluginIdentifier() ); attributes.put( IMarker.CHAR_START, new Integer( -1 ) ); @@ -267,6 +271,7 @@ public class CDIDebugModel { attributes.put( ICBreakpoint.CONDITION, condition ); attributes.put( ICBreakpoint.SOURCE_HANDLE, sourceHandle ); attributes.put( ICBreakpoint.MODULE, module ); + attributes.put( ICBreakpointType.TYPE, type ); return new CAddressBreakpoint( resource, attributes, register ); } @@ -394,6 +399,7 @@ public class CDIDebugModel { * * @param sourceHandle the handle to the breakpoint source * @param resource the resource on which to create the associated breakpoint marker + * @param type a type constant from ICBreakpointType * @param function the name of the function this breakpoint suspends execution in * @param charStart the first character index associated with the breakpoint, or * -1 if unspecified, in the source file in which the breakpoint @@ -416,7 +422,7 @@ public class CDIDebugModel { * failure. * */ - public static ICFunctionBreakpoint createFunctionBreakpoint( String sourceHandle, IResource resource, String function, int charStart, int charEnd, int lineNumber, boolean enabled, int ignoreCount, String condition, boolean register ) throws CoreException { + public static ICFunctionBreakpoint createFunctionBreakpoint( String sourceHandle, IResource resource, int type, String function, int charStart, int charEnd, int lineNumber, boolean enabled, int ignoreCount, String condition, boolean register ) throws CoreException { HashMap attributes = new HashMap( 10 ); attributes.put( IBreakpoint.ID, getPluginIdentifier() ); attributes.put( IMarker.CHAR_START, new Integer( charStart ) ); @@ -427,6 +433,7 @@ public class CDIDebugModel { attributes.put( ICBreakpoint.IGNORE_COUNT, new Integer( ignoreCount ) ); attributes.put( ICBreakpoint.CONDITION, condition ); attributes.put( ICBreakpoint.SOURCE_HANDLE, sourceHandle ); + attributes.put( ICBreakpointType.TYPE, type ); return new CFunctionBreakpoint( resource, attributes, register ); } diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/CBreakpointManager.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/CBreakpointManager.java index 592985a8b19..2043e1e8e14 100644 --- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/CBreakpointManager.java +++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/CBreakpointManager.java @@ -49,6 +49,7 @@ import org.eclipse.cdt.debug.core.cdi.event.ICDIEventListener; import org.eclipse.cdt.debug.core.cdi.event.ICDIExecutableReloadedEvent; import org.eclipse.cdt.debug.core.cdi.model.ICDIAddressBreakpoint; import org.eclipse.cdt.debug.core.cdi.model.ICDIBreakpoint; +import org.eclipse.cdt.debug.core.cdi.model.ICDIBreakpoint2; import org.eclipse.cdt.debug.core.cdi.model.ICDIBreakpointManagement2; import org.eclipse.cdt.debug.core.cdi.model.ICDIBreakpointManagement3; import org.eclipse.cdt.debug.core.cdi.model.ICDIEventBreakpoint; @@ -458,6 +459,18 @@ public class CBreakpointManager implements IBreakpointsListener, IBreakpointMana } return ( b instanceof IBreakpoint ) ? (IBreakpoint)b : null; } + + /** + * @return true if the breakpoint is of a temporary type, otherwise false + */ + private boolean isTemporary(ICDIBreakpoint cdiBreakpoint) { + if (cdiBreakpoint instanceof ICDIBreakpoint2) { + return (((ICDIBreakpoint2)cdiBreakpoint).getType() & ICBreakpointType.TEMPORARY) != 0; + } + else { + return cdiBreakpoint.isTemporary(); + } + } private void handleBreakpointCreatedEvent( ICDIBreakpoint cdiBreakpoint ) { if ( cdiBreakpoint instanceof ICDIWatchpoint ) @@ -466,7 +479,7 @@ public class CBreakpointManager implements IBreakpointsListener, IBreakpointMana doHandleCatachpointCreatedEvent( (ICDIEventBreakpoint)cdiBreakpoint ); else if ( cdiBreakpoint instanceof ICDILocationBreakpoint ) doHandleLocationBreakpointCreatedEvent( (ICDILocationBreakpoint)cdiBreakpoint ); - if ( !cdiBreakpoint.isTemporary() && !DebugPlugin.getDefault().getBreakpointManager().isEnabled() ) { + if ( !isTemporary(cdiBreakpoint) && !DebugPlugin.getDefault().getBreakpointManager().isEnabled() ) { changeBreakpointPropertiesOnTarget(cdiBreakpoint, new Boolean(false), null); } } @@ -503,7 +516,7 @@ public class CBreakpointManager implements IBreakpointsListener, IBreakpointMana } private void doHandleLocationBreakpointCreatedEvent( ICDILocationBreakpoint cdiBreakpoint ) { - if ( cdiBreakpoint.isTemporary() ) + if ( isTemporary(cdiBreakpoint) ) return; ICBreakpoint breakpoint = null; synchronized( getBreakpointMap() ) { @@ -934,7 +947,8 @@ public class CBreakpointManager implements IBreakpointsListener, IBreakpointMana private ICLineBreakpoint createLineBreakpoint( String sourceHandle, IResource resource, ICDILocationBreakpoint cdiBreakpoint ) throws CDIException, CoreException { ICLineBreakpoint breakpoint = CDIDebugModel.createLineBreakpoint( sourceHandle, - resource, + resource, + getCdiBreakpointType(cdiBreakpoint), cdiBreakpoint.getLocator().getLineNumber(), cdiBreakpoint.isEnabled(), cdiBreakpoint.getCondition().getIgnoreCount(), @@ -950,12 +964,36 @@ public class CBreakpointManager implements IBreakpointsListener, IBreakpointMana return breakpoint; } + /** + * Utility method that queries the CDI client for the breakpoint type. + * + * @param cdiBreakpoint + * the CDI breakpoint + * @return an ICDIBreakpointType constant + */ + @SuppressWarnings("deprecation") + private int getCdiBreakpointType(ICDIBreakpoint cdiBreakpoint) { + if (cdiBreakpoint instanceof ICDIBreakpoint2) { + // the new way + return ((ICDIBreakpoint2)cdiBreakpoint).getType(); + } + else { + // the old way + int type = cdiBreakpoint.isHardware() ? ICBreakpointType.HARDWARE : ICBreakpointType.REGULAR; + if (cdiBreakpoint.isTemporary()) { + type |= ICBreakpointType.TEMPORARY; + } + return type; + } + } + private ICFunctionBreakpoint createFunctionBreakpoint( String sourceHandle, IResource resource, ICDILocationBreakpoint cdiBreakpoint ) throws CDIException, CoreException { ICDILocator location = cdiBreakpoint.getLocator(); int line = location.getLineNumber(); ICFunctionBreakpoint breakpoint = CDIDebugModel.createFunctionBreakpoint( sourceHandle, - resource, + resource, + getCdiBreakpointType(cdiBreakpoint), location.getFunction(), -1, -1, diff --git a/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/model/Breakpoint.java b/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/model/Breakpoint.java index 99b6bebeb86..19920e3d0aa 100644 --- a/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/model/Breakpoint.java +++ b/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/model/Breakpoint.java @@ -15,7 +15,7 @@ import java.util.List; import org.eclipse.cdt.debug.core.cdi.CDIException; import org.eclipse.cdt.debug.core.cdi.ICDICondition; -import org.eclipse.cdt.debug.core.cdi.model.ICDIBreakpoint; +import org.eclipse.cdt.debug.core.cdi.model.ICDIBreakpoint2; import org.eclipse.cdt.debug.core.model.ICBreakpointType; import org.eclipse.cdt.debug.mi.core.cdi.BreakpointManager; import org.eclipse.cdt.debug.mi.core.cdi.Condition; @@ -24,18 +24,30 @@ import org.eclipse.cdt.debug.mi.core.output.MIBreakpoint; /** */ -public abstract class Breakpoint extends CObject implements ICDIBreakpoint { +public abstract class Breakpoint extends CObject implements ICDIBreakpoint2 { ICDICondition condition; MIBreakpoint[] miBreakpoints; + + /** + * One of the type constants in ICBreakpointType + */ int type; - boolean enable; + + boolean enabled; - public Breakpoint(Target target, int kind, ICDICondition cond, boolean enabled) { + public Breakpoint(Target target, int type, ICDICondition condition, boolean enabled) { super(target); - type = kind; - condition = cond; - enable = enabled; + this.type = type; + this.condition = condition; + this.enabled = enabled; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.debug.core.cdi.model.ICDIBreakpoint2#getType() + */ + public int getType() { + return type; } public MIBreakpoint[] getMIBreakpoints() { @@ -78,21 +90,28 @@ public abstract class Breakpoint extends CObject implements ICDIBreakpoint { * @see org.eclipse.cdt.debug.core.cdi.ICDIBreakpoint#isEnabled() */ public boolean isEnabled() throws CDIException { - return enable; + return enabled; } - /** - * @see org.eclipse.cdt.debug.core.cdi.ICDIBreakpoint#isHardware() + /* (non-Javadoc) + * @see org.eclipse.cdt.debug.core.cdi.model.ICDIBreakpoint#isHardware() + * + * CDT 5.0 won't call this deprecated method (since we implement + * ICDIBreakpoint2), but we use it ourselves. */ public boolean isHardware() { - return (type == ICBreakpointType.HARDWARE); + // ignore the TEMPORARY bit qualifier + return ((type & ~ICBreakpointType.TEMPORARY) == ICBreakpointType.HARDWARE); } - /** - * @see org.eclipse.cdt.debug.core.cdi.ICDIBreakpoint#isTemporary() + /* (non-Javadoc) + * @see org.eclipse.cdt.debug.core.cdi.model.ICDIBreakpoint#isTemporary() + * + * CDT 5.0 won't call this deprecated method (since we implement + * ICDIBreakpoint2), but we use it ourselves. */ public boolean isTemporary() { - return (type == ICBreakpointType.TEMPORARY); + return (type & ICBreakpointType.TEMPORARY) != 0; } /** @@ -123,7 +142,7 @@ public abstract class Breakpoint extends CObject implements ICDIBreakpoint { } public void setEnabled0(boolean on) { - enable = on; + enabled = on; } } diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/ToggleBreakpointAdapter.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/ToggleBreakpointAdapter.java index c7ed54e02db..8b47f28237c 100644 --- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/ToggleBreakpointAdapter.java +++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/ToggleBreakpointAdapter.java @@ -25,6 +25,7 @@ import org.eclipse.cdt.core.model.ISourceRange; import org.eclipse.cdt.core.model.ITranslationUnit; import org.eclipse.cdt.core.model.IVariable; import org.eclipse.cdt.debug.core.CDIDebugModel; +import org.eclipse.cdt.debug.core.model.ICBreakpointType; import org.eclipse.cdt.debug.core.model.ICFunctionBreakpoint; import org.eclipse.cdt.debug.core.model.ICLineBreakpoint; import org.eclipse.cdt.debug.core.model.ICWatchpoint; @@ -131,7 +132,8 @@ public class ToggleBreakpointAdapter implements IToggleBreakpointsTarget { } else { CDIDebugModel.createLineBreakpoint( sourceHandle, - resource, + resource, + ICBreakpointType.REGULAR, lineNumber, true, 0, @@ -509,7 +511,8 @@ public class ToggleBreakpointAdapter implements IToggleBreakpointsTarget { DebugPlugin.log( e ); } CDIDebugModel.createFunctionBreakpoint( sourceHandle, - resource, + resource, + ICBreakpointType.REGULAR, functionName, charStart, charEnd,