/** * Constructs a DsfMIBreakpoint from a back-end object * * @param dsfMIBreakpoint back-end breakpoint */ public MIBreakpointDMData(MIBreakpoint dsfMIBreakpoint) { // No support for catchpoints yet fBreakpoint = dsfMIBreakpoint; if (dsfMIBreakpoint.isTracepoint()) { fNature = MIBreakpointNature.TRACEPOINT; } else if (dsfMIBreakpoint.isWatchpoint()) { fNature = MIBreakpointNature.WATCHPOINT; } else if (dsfMIBreakpoint.isCatchpoint()) { fNature = MIBreakpointNature.CATCHPOINT; } else { fNature = MIBreakpointNature.BREAKPOINT; } fProperties = new HashMap<String, Object>(); switch (fNature) { case BREAKPOINT: { // Note that this may in fact be a catchpoint. See comment below in // CATCHPOINT case // Generic breakpoint attributes fProperties.put(MIBreakpoints.BREAKPOINT_TYPE, MIBreakpoints.BREAKPOINT); fProperties.put(MIBreakpoints.FILE_NAME, dsfMIBreakpoint.getFile()); fProperties.put(MIBreakpoints.LINE_NUMBER, dsfMIBreakpoint.getLine()); fProperties.put(MIBreakpoints.FUNCTION, dsfMIBreakpoint.getFunction()); fProperties.put(MIBreakpoints.ADDRESS, dsfMIBreakpoint.getAddress()); fProperties.put(MIBreakpoints.CONDITION, dsfMIBreakpoint.getCondition()); fProperties.put(MIBreakpoints.IGNORE_COUNT, dsfMIBreakpoint.getIgnoreCount()); fProperties.put(MIBreakpoints.IS_ENABLED, new Boolean(dsfMIBreakpoint.isEnabled())); fProperties.put(MIBreakpoints.COMMANDS, dsfMIBreakpoint.getCommands()); // MI-specific breakpoint attributes fProperties.put(NUMBER, dsfMIBreakpoint.getNumber()); fProperties.put(TYPE, dsfMIBreakpoint.getType()); fProperties.put(THREAD_ID, dsfMIBreakpoint.getThreadId()); fProperties.put(FULL_NAME, dsfMIBreakpoint.getFullName()); fProperties.put(HITS, dsfMIBreakpoint.getTimes()); fProperties.put(IS_TEMPORARY, new Boolean(dsfMIBreakpoint.isTemporary())); fProperties.put(IS_HARDWARE, new Boolean(dsfMIBreakpoint.isHardware())); fProperties.put(LOCATION, formatLocation()); break; } case WATCHPOINT: { // Generic breakpoint attributes fProperties.put(MIBreakpoints.BREAKPOINT_TYPE, MIBreakpoints.WATCHPOINT); fProperties.put(MIBreakpoints.EXPRESSION, dsfMIBreakpoint.getExpression()); fProperties.put( MIBreakpoints.READ, dsfMIBreakpoint.isAccessWatchpoint() || dsfMIBreakpoint.isReadWatchpoint()); fProperties.put( MIBreakpoints.WRITE, dsfMIBreakpoint.isAccessWatchpoint() || dsfMIBreakpoint.isWriteWatchpoint()); // MI-specific breakpoint attributes fProperties.put(NUMBER, dsfMIBreakpoint.getNumber()); break; } case TRACEPOINT: { // Generic breakpoint attributes fProperties.put(MIBreakpoints.BREAKPOINT_TYPE, MIBreakpoints.TRACEPOINT); fProperties.put(MIBreakpoints.FILE_NAME, dsfMIBreakpoint.getFile()); fProperties.put(MIBreakpoints.LINE_NUMBER, dsfMIBreakpoint.getLine()); fProperties.put(MIBreakpoints.FUNCTION, dsfMIBreakpoint.getFunction()); fProperties.put(MIBreakpoints.ADDRESS, dsfMIBreakpoint.getAddress()); fProperties.put(MIBreakpoints.CONDITION, dsfMIBreakpoint.getCondition()); fProperties.put(MIBreakpoints.PASS_COUNT, dsfMIBreakpoint.getPassCount()); fProperties.put(MIBreakpoints.IS_ENABLED, new Boolean(dsfMIBreakpoint.isEnabled())); fProperties.put(MIBreakpoints.COMMANDS, dsfMIBreakpoint.getCommands()); // MI-specific breakpoint attributes fProperties.put(NUMBER, dsfMIBreakpoint.getNumber()); fProperties.put(TYPE, dsfMIBreakpoint.getType()); fProperties.put(THREAD_ID, dsfMIBreakpoint.getThreadId()); fProperties.put(FULL_NAME, dsfMIBreakpoint.getFullName()); fProperties.put(HITS, dsfMIBreakpoint.getTimes()); fProperties.put(IS_TEMPORARY, new Boolean(dsfMIBreakpoint.isTemporary())); fProperties.put(IS_HARDWARE, new Boolean(dsfMIBreakpoint.isHardware())); fProperties.put(LOCATION, formatLocation()); break; } case CATCHPOINT: { // Because gdb doesn't support catchpoints in mi, we end up using // CLI to set the catchpoint. The sort of MIBreakpoint we create // at that time is minimal as the only information we get back from // gdb is the breakpoint number and type of the catchpoint we just // set. See MIBreakpoint(String) // // The only type of MIBreakpoint that will be of this CATCHPOINT type // is the instance we create from the response of the CLI command we // use to set the catchpoint. If we later query gdb for the breakpoint // list, we'll unfortunately end up creating an MIBreakpoint of type // BREAKPOINT. Maybe one day gdb will treats catchpoints like first // class citizens and this messy situation will go away. fProperties.put(MIBreakpoints.BREAKPOINT_TYPE, MIBreakpoints.CATCHPOINT); fProperties.put(MIBreakpoints.CATCHPOINT_TYPE, dsfMIBreakpoint.getCatchpointType()); fProperties.put(NUMBER, dsfMIBreakpoint.getNumber()); break; } // Not reachable default: { fProperties.put(MIBreakpoints.BREAKPOINT_TYPE, null); break; } } }
public boolean isReadWatchpoint() { return fBreakpoint.isReadWatchpoint(); }