mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-06-07 17:56:01 +02:00
Bug 516053: Allow MIBreakpoint to be extended
New API to allow third-parties to extend MIBreakpoint with their own custom Breakpoint handling. Change-Id: I64abfc41916a2053cfbed7e3db2357fbf2572050
This commit is contained in:
parent
bda21e55ab
commit
a36ecd3839
6 changed files with 101 additions and 13 deletions
|
@ -145,7 +145,7 @@ public class GDBBreakpoints_7_4 extends GDBBreakpoints_7_2 implements IEventList
|
||||||
MIValue val = results[i].getMIValue();
|
MIValue val = results[i].getMIValue();
|
||||||
if (var.equals("bkpt")) { //$NON-NLS-1$
|
if (var.equals("bkpt")) { //$NON-NLS-1$
|
||||||
if (val instanceof MITuple) {
|
if (val instanceof MITuple) {
|
||||||
bpt = new MIBreakpoint((MITuple)val);
|
bpt = createMIBreakpoint((MITuple)val);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,6 +27,7 @@ import org.eclipse.cdt.dsf.concurrent.ImmediateRequestMonitor;
|
||||||
import org.eclipse.cdt.dsf.concurrent.Immutable;
|
import org.eclipse.cdt.dsf.concurrent.Immutable;
|
||||||
import org.eclipse.cdt.dsf.concurrent.RequestMonitor;
|
import org.eclipse.cdt.dsf.concurrent.RequestMonitor;
|
||||||
import org.eclipse.cdt.dsf.concurrent.Sequence.Step;
|
import org.eclipse.cdt.dsf.concurrent.Sequence.Step;
|
||||||
|
import org.eclipse.cdt.dsf.concurrent.ThreadSafe;
|
||||||
import org.eclipse.cdt.dsf.datamodel.AbstractDMContext;
|
import org.eclipse.cdt.dsf.datamodel.AbstractDMContext;
|
||||||
import org.eclipse.cdt.dsf.datamodel.AbstractDMEvent;
|
import org.eclipse.cdt.dsf.datamodel.AbstractDMEvent;
|
||||||
import org.eclipse.cdt.dsf.datamodel.DMContexts;
|
import org.eclipse.cdt.dsf.datamodel.DMContexts;
|
||||||
|
@ -49,6 +50,7 @@ import org.eclipse.cdt.dsf.mi.service.command.output.MIBreakInsertInfo;
|
||||||
import org.eclipse.cdt.dsf.mi.service.command.output.MIBreakListInfo;
|
import org.eclipse.cdt.dsf.mi.service.command.output.MIBreakListInfo;
|
||||||
import org.eclipse.cdt.dsf.mi.service.command.output.MIBreakpoint;
|
import org.eclipse.cdt.dsf.mi.service.command.output.MIBreakpoint;
|
||||||
import org.eclipse.cdt.dsf.mi.service.command.output.MIInfo;
|
import org.eclipse.cdt.dsf.mi.service.command.output.MIInfo;
|
||||||
|
import org.eclipse.cdt.dsf.mi.service.command.output.MITuple;
|
||||||
import org.eclipse.cdt.dsf.service.AbstractDsfService;
|
import org.eclipse.cdt.dsf.service.AbstractDsfService;
|
||||||
import org.eclipse.cdt.dsf.service.DsfServiceEventHandler;
|
import org.eclipse.cdt.dsf.service.DsfServiceEventHandler;
|
||||||
import org.eclipse.cdt.dsf.service.DsfSession;
|
import org.eclipse.cdt.dsf.service.DsfSession;
|
||||||
|
@ -165,6 +167,19 @@ public class MIBreakpoints extends AbstractDsfService implements IBreakpoints, I
|
||||||
return map;
|
return map;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new MI breakpoint
|
||||||
|
*
|
||||||
|
* @param tuple
|
||||||
|
* from backend communication
|
||||||
|
* @return breakpoint
|
||||||
|
* @since 5.3
|
||||||
|
*/
|
||||||
|
@ThreadSafe
|
||||||
|
public MIBreakpoint createMIBreakpoint(MITuple tuple) {
|
||||||
|
return new MIBreakpoint(tuple);
|
||||||
|
}
|
||||||
|
|
||||||
// Error messages
|
// Error messages
|
||||||
/** @since 3.0 */
|
/** @since 3.0 */
|
||||||
public static final String NULL_STRING = ""; //$NON-NLS-1$
|
public static final String NULL_STRING = ""; //$NON-NLS-1$
|
||||||
|
|
|
@ -48,7 +48,19 @@ public class CLICatchInfo extends MIInfo {
|
||||||
}
|
}
|
||||||
|
|
||||||
private MIBreakpoint parseCatchpoint(String str) {
|
private MIBreakpoint parseCatchpoint(String str) {
|
||||||
return str.startsWith("Catchpoint ") ? new MIBreakpoint(str) : null; //$NON-NLS-1$
|
return str.startsWith("Catchpoint ") ? createMIBreakpoint(str) : null; //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a target specific MIBreakpoint
|
||||||
|
*
|
||||||
|
* @param value
|
||||||
|
* tuple suitable for passing to MIBreakpoint constructor
|
||||||
|
* @return new breakpoint
|
||||||
|
* @since 5.3
|
||||||
|
*/
|
||||||
|
protected MIBreakpoint createMIBreakpoint(String str) {
|
||||||
|
return new MIBreakpoint(str);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -43,23 +43,23 @@ public class MIBreakInsertInfo extends MIInfo {
|
||||||
MIBreakpoint bpt = null;
|
MIBreakpoint bpt = null;
|
||||||
if (var.equals("wpt")) { //$NON-NLS-1$
|
if (var.equals("wpt")) { //$NON-NLS-1$
|
||||||
if (val instanceof MITuple) {
|
if (val instanceof MITuple) {
|
||||||
bpt = new MIBreakpoint((MITuple)val);
|
bpt = createMIBreakpoint((MITuple)val);
|
||||||
bpt.setEnabled(true);
|
bpt.setEnabled(true);
|
||||||
bpt.setWriteWatchpoint(true);
|
bpt.setWriteWatchpoint(true);
|
||||||
}
|
}
|
||||||
} else if (var.equals("bkpt")) { //$NON-NLS-1$
|
} else if (var.equals("bkpt")) { //$NON-NLS-1$
|
||||||
if (val instanceof MITuple) {
|
if (val instanceof MITuple) {
|
||||||
bpt = new MIBreakpoint((MITuple)val);
|
bpt = createMIBreakpoint((MITuple)val);
|
||||||
}
|
}
|
||||||
} else if (var.equals("hw-awpt")) { //$NON-NLS-1$
|
} else if (var.equals("hw-awpt")) { //$NON-NLS-1$
|
||||||
if (val instanceof MITuple) {
|
if (val instanceof MITuple) {
|
||||||
bpt = new MIBreakpoint((MITuple)val);
|
bpt = createMIBreakpoint((MITuple)val);
|
||||||
bpt.setAccessWatchpoint(true);
|
bpt.setAccessWatchpoint(true);
|
||||||
bpt.setEnabled(true);
|
bpt.setEnabled(true);
|
||||||
}
|
}
|
||||||
} else if (var.equals("hw-rwpt")) { //$NON-NLS-1$
|
} else if (var.equals("hw-rwpt")) { //$NON-NLS-1$
|
||||||
if (val instanceof MITuple) {
|
if (val instanceof MITuple) {
|
||||||
bpt = new MIBreakpoint((MITuple)val);
|
bpt = createMIBreakpoint((MITuple)val);
|
||||||
bpt.setReadWatchpoint(true);
|
bpt.setReadWatchpoint(true);
|
||||||
bpt.setEnabled(true);
|
bpt.setEnabled(true);
|
||||||
}
|
}
|
||||||
|
@ -76,4 +76,17 @@ public class MIBreakInsertInfo extends MIInfo {
|
||||||
public MIBreakpoint[] getMIBreakpoints() {
|
public MIBreakpoint[] getMIBreakpoints() {
|
||||||
return breakpoints;
|
return breakpoints;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a target specific MIBreakpoint
|
||||||
|
*
|
||||||
|
* @param value
|
||||||
|
* tuple suitable for passing to MIBreakpoint constructor
|
||||||
|
* @return new breakpoint
|
||||||
|
* @since 5.3
|
||||||
|
*/
|
||||||
|
protected MIBreakpoint createMIBreakpoint(MITuple tuple) {
|
||||||
|
return new MIBreakpoint(tuple);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -77,10 +77,22 @@ public class MIBreakListInfo extends MIInfo {
|
||||||
if (b.equals("bkpt")) { //$NON-NLS-1$
|
if (b.equals("bkpt")) { //$NON-NLS-1$
|
||||||
MIValue value = bkpts[i].getMIValue();
|
MIValue value = bkpts[i].getMIValue();
|
||||||
if (value instanceof MITuple) {
|
if (value instanceof MITuple) {
|
||||||
aList.add(new MIBreakpoint((MITuple)value));
|
aList.add(createMIBreakpoint((MITuple)value));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a target specific MIBreakpoint
|
||||||
|
*
|
||||||
|
* @param value
|
||||||
|
* tuple suitable for passing to MIBreakpoint constructor
|
||||||
|
* @return new breakpoint
|
||||||
|
* @since 5.3
|
||||||
|
*/
|
||||||
|
protected MIBreakpoint createMIBreakpoint(MITuple tuple) {
|
||||||
|
return new MIBreakpoint(tuple);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,6 +23,7 @@ import java.util.List;
|
||||||
import java.util.StringTokenizer;
|
import java.util.StringTokenizer;
|
||||||
|
|
||||||
import org.eclipse.cdt.dsf.gdb.internal.tracepointactions.TracepointActionManager;
|
import org.eclipse.cdt.dsf.gdb.internal.tracepointactions.TracepointActionManager;
|
||||||
|
import org.eclipse.cdt.dsf.mi.service.MIBreakpoints;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Contain info about the GDB/MI breakpoint.
|
* Contain info about the GDB/MI breakpoint.
|
||||||
|
@ -64,6 +65,12 @@ import org.eclipse.cdt.dsf.gdb.internal.tracepointactions.TracepointActionManage
|
||||||
* ^done,bkpt={number="9",type="breakpoint",disp="keep",enabled="y",addr="<PENDING>",pending="NotLoadedLibrary.c:26",times="0",original-location="NotLoadedLibrary.c:26"}
|
* ^done,bkpt={number="9",type="breakpoint",disp="keep",enabled="y",addr="<PENDING>",pending="NotLoadedLibrary.c:26",times="0",original-location="NotLoadedLibrary.c:26"}
|
||||||
*
|
*
|
||||||
* Note that any breakpoint that fails to install will be marked as pending when the -f option is used.
|
* Note that any breakpoint that fails to install will be marked as pending when the -f option is used.
|
||||||
|
* <p>
|
||||||
|
* <b>Note on using constructor directly:</b></a> As this class can be extended by third-parties it is
|
||||||
|
* important to allow third parties the ability to have the correct version of MIBreakpoint
|
||||||
|
* created. {@code MIBreakpoint}s should therefore be created via factory methods that can be overloaded.
|
||||||
|
* For examples, see {@link MIBreakpoints#createMIBreakpoint(MITuple)} or
|
||||||
|
* {@link MIBreakInsertInfo#createMIBreakpoint(MITuple)}
|
||||||
*/
|
*/
|
||||||
public class MIBreakpoint {
|
public class MIBreakpoint {
|
||||||
|
|
||||||
|
@ -123,9 +130,25 @@ public class MIBreakpoint {
|
||||||
*/
|
*/
|
||||||
private String[] groupIds;
|
private String[] groupIds;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* No arguments constructor.
|
||||||
|
* <p>
|
||||||
|
* See {@link MIBreakpoint} class comment "Note on using constructor
|
||||||
|
* directly"
|
||||||
|
*/
|
||||||
public MIBreakpoint() {
|
public MIBreakpoint() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Copy-constructor
|
||||||
|
* <p>
|
||||||
|
* See {@link MIBreakpoint} class comment "Note on using constructor
|
||||||
|
* directly"
|
||||||
|
* <p>
|
||||||
|
*
|
||||||
|
* @param other
|
||||||
|
* breakpoint to copy from
|
||||||
|
*/
|
||||||
public MIBreakpoint(MIBreakpoint other) {
|
public MIBreakpoint(MIBreakpoint other) {
|
||||||
number = other.number;
|
number = other.number;
|
||||||
type = other.type;
|
type = other.type;
|
||||||
|
@ -159,6 +182,16 @@ public class MIBreakpoint {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Construct an MIBreakpoint from the MI Tuple received from GDB
|
||||||
|
* <p>
|
||||||
|
* See {@link MIBreakpoint} class comment "Note on using constructor
|
||||||
|
* directly"
|
||||||
|
* <p>
|
||||||
|
*
|
||||||
|
* @param tuple
|
||||||
|
* data received from GDB
|
||||||
|
*/
|
||||||
public MIBreakpoint(MITuple tuple) {
|
public MIBreakpoint(MITuple tuple) {
|
||||||
parse(tuple);
|
parse(tuple);
|
||||||
}
|
}
|
||||||
|
@ -192,6 +225,9 @@ public class MIBreakpoint {
|
||||||
* able to tell it's a catchpoint. Quite the mess. Wish gdb would treat
|
* able to tell it's a catchpoint. Quite the mess. Wish gdb would treat
|
||||||
* catchpoints like first class citizens.
|
* catchpoints like first class citizens.
|
||||||
*
|
*
|
||||||
|
* <p>
|
||||||
|
* See {@link MIBreakpoint} class comment "Note on using constructor directly"
|
||||||
|
*
|
||||||
* @param cliResult
|
* @param cliResult
|
||||||
* the output from the CLI command. Example:
|
* the output from the CLI command. Example:
|
||||||
* "Catchpoint 1 (catch)"
|
* "Catchpoint 1 (catch)"
|
||||||
|
|
Loading…
Add table
Reference in a new issue