1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

[228062] - [run control][disassembly] Integrate DSF with CDT's toggle instruction step mode action.

This commit is contained in:
Pawel Piech 2008-05-07 17:40:51 +00:00
parent 23afc8c598
commit 05a1a3763b
6 changed files with 227 additions and 119 deletions

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2006 Wind River Systems and others.
* Copyright (c) 2006, 2008 Wind River Systems 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
@ -27,10 +27,12 @@ public class DsfStepIntoCommand implements IStepIntoHandler {
private final DsfExecutor fExecutor;
private final DsfServicesTracker fTracker;
private final DsfSteppingModeTarget fSteppingMode;
public DsfStepIntoCommand(DsfSession session) {
public DsfStepIntoCommand(DsfSession session, DsfSteppingModeTarget steppingMode) {
fExecutor = session.getExecutor();
fTracker = new DsfServicesTracker(DsfDebugUIPlugin.getBundleContext(), session.getId());
fSteppingMode = steppingMode;
}
public void dispose() {
@ -44,10 +46,11 @@ public class DsfStepIntoCommand implements IStepIntoHandler {
return;
}
final StepType stepType= getStepType();
fExecutor.submit(new DsfCommandRunnable(fTracker, request.getElements()[0], request) {
@Override public void doExecute() {
getStepQueueMgr().canEnqueueStep(
getContext(), StepType.STEP_INTO,
getContext(), stepType,
new DataRequestMonitor<Boolean>(ImmediateExecutor.getInstance(), null) {
@Override
protected void handleCompleted() {
@ -65,11 +68,21 @@ public class DsfStepIntoCommand implements IStepIntoHandler {
return false;
}
final StepType stepType= getStepType();
fExecutor.submit(new DsfCommandRunnable(fTracker, request.getElements()[0], request) {
@Override public void doExecute() {
getStepQueueMgr().enqueueStep(getContext(), StepType.STEP_INTO);
getStepQueueMgr().enqueueStep(getContext(), stepType);
}
});
return true;
}
/**
* @return the currently active step type
*/
protected final StepType getStepType() {
boolean instructionSteppingEnabled= fSteppingMode != null && fSteppingMode.isInstructionSteppingEnabled();
return instructionSteppingEnabled ? StepType.INSTRUCTION_STEP_INTO : StepType.STEP_INTO;
}
}

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2006 Wind River Systems and others.
* Copyright (c) 2006, 2008 Wind River Systems 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
@ -27,10 +27,12 @@ public class DsfStepOverCommand implements IStepOverHandler {
private final DsfExecutor fExecutor;
private final DsfServicesTracker fTracker;
private final DsfSteppingModeTarget fSteppingMode;
public DsfStepOverCommand(DsfSession session) {
public DsfStepOverCommand(DsfSession session, DsfSteppingModeTarget steppingMode) {
fExecutor = session.getExecutor();
fTracker = new DsfServicesTracker(DsfDebugUIPlugin.getBundleContext(), session.getId());
fSteppingMode = steppingMode;
}
public void dispose() {
@ -45,9 +47,10 @@ public class DsfStepOverCommand implements IStepOverHandler {
}
fExecutor.submit(new DsfCommandRunnable(fTracker, request.getElements()[0], request) {
final StepType stepType= getStepType();
@Override public void doExecute() {
getStepQueueMgr().canEnqueueStep(
getContext(), StepType.STEP_OVER,
getStepQueueMgr().canEnqueueStep(
getContext(), stepType,
new DataRequestMonitor<Boolean>(ImmediateExecutor.getInstance(), null) {
@Override
protected void handleCompleted() {
@ -59,17 +62,27 @@ public class DsfStepOverCommand implements IStepOverHandler {
});
}
public boolean execute(final IDebugCommandRequest request) {
public boolean execute(final IDebugCommandRequest request) {
if (request.getElements().length != 1) {
request.done();
return false;
}
final StepType stepType= getStepType();
fExecutor.submit(new DsfCommandRunnable(fTracker, request.getElements()[0], request) {
@Override public void doExecute() {
getStepQueueMgr().enqueueStep(getContext(), StepType.STEP_OVER);
getStepQueueMgr().enqueueStep(getContext(), stepType);
}
});
return true;
}
/**
* @return the currently active step type
*/
protected final StepType getStepType() {
boolean instructionSteppingEnabled= fSteppingMode != null && fSteppingMode.isInstructionSteppingEnabled();
return instructionSteppingEnabled ? StepType.INSTRUCTION_STEP_OVER : StepType.STEP_OVER;
}
}

View file

@ -0,0 +1,64 @@
/*******************************************************************************
* Copyright (c) 2008 Wind River Systems, Inc. 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:
* Wind River Systems - initial API and implementation
*******************************************************************************/
package org.eclipse.dd.dsf.debug.ui.actions;
import org.eclipse.cdt.debug.core.model.ISteppingModeTarget;
import org.eclipse.cdt.debug.core.model.ITargetProperties;
import org.eclipse.core.runtime.Preferences;
import org.eclipse.core.runtime.Preferences.IPropertyChangeListener;
/**
*/
public class DsfSteppingModeTarget implements ISteppingModeTarget, ITargetProperties {
private final Preferences fPreferences;
public DsfSteppingModeTarget() {
fPreferences= new Preferences();
fPreferences.setDefault(PREF_INSTRUCTION_STEPPING_MODE, false);
}
/*
* @see org.eclipse.cdt.debug.core.model.ISteppingModeTarget#enableInstructionStepping(boolean)
*/
public void enableInstructionStepping(boolean enabled) {
fPreferences.setValue(PREF_INSTRUCTION_STEPPING_MODE, enabled);
}
/*
* @see org.eclipse.cdt.debug.core.model.ISteppingModeTarget#isInstructionSteppingEnabled()
*/
public boolean isInstructionSteppingEnabled() {
return fPreferences.getBoolean(PREF_INSTRUCTION_STEPPING_MODE);
}
/*
* @see org.eclipse.cdt.debug.core.model.ISteppingModeTarget#supportsInstructionStepping()
*/
public boolean supportsInstructionStepping() {
return true;
}
/*
* @see org.eclipse.cdt.debug.core.model.ITargetProperties#addPropertyChangeListener(org.eclipse.core.runtime.Preferences.IPropertyChangeListener)
*/
public void addPropertyChangeListener(IPropertyChangeListener listener) {
fPreferences.addPropertyChangeListener(listener);
}
/*
* @see org.eclipse.cdt.debug.core.model.ITargetProperties#removePropertyChangeListener(org.eclipse.core.runtime.Preferences.IPropertyChangeListener)
*/
public void removePropertyChangeListener(IPropertyChangeListener listener) {
fPreferences.removePropertyChangeListener(listener);
}
}

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2006 Wind River Systems and others.
* Copyright (c) 2006, 2008 Wind River Systems 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
@ -95,8 +95,8 @@ public class PDAAdapterFactory implements IAdapterFactory, ILaunchesListener2
session.registerModelAdapter(ISourceDisplay.class, fSourceDisplayAdapter);
// Initialize retargetable command handler.
fStepIntoCommand = new DsfStepIntoCommand(session);
fStepOverCommand = new DsfStepOverCommand(session);
fStepIntoCommand = new DsfStepIntoCommand(session, null);
fStepOverCommand = new DsfStepOverCommand(session, null);
fStepReturnCommand = new DsfStepReturnCommand(session);
fSuspendCommand = new DsfSuspendCommand(session);
fResumeCommand = new DsfResumeCommand(session);

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2006 Wind River Systems and others.
* Copyright (c) 2006, 2008 Wind River Systems 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
@ -15,6 +15,7 @@ import java.util.HashMap;
import java.util.Map;
import org.eclipse.cdt.debug.core.model.IRestart;
import org.eclipse.cdt.debug.core.model.ISteppingModeTarget;
import org.eclipse.core.runtime.IAdapterFactory;
import org.eclipse.dd.dsf.concurrent.Immutable;
import org.eclipse.dd.dsf.concurrent.ThreadSafe;
@ -22,6 +23,7 @@ import org.eclipse.dd.dsf.debug.ui.actions.DsfResumeCommand;
import org.eclipse.dd.dsf.debug.ui.actions.DsfStepIntoCommand;
import org.eclipse.dd.dsf.debug.ui.actions.DsfStepOverCommand;
import org.eclipse.dd.dsf.debug.ui.actions.DsfStepReturnCommand;
import org.eclipse.dd.dsf.debug.ui.actions.DsfSteppingModeTarget;
import org.eclipse.dd.dsf.debug.ui.actions.DsfSuspendCommand;
import org.eclipse.dd.dsf.debug.ui.contexts.DsfSuspendTrigger;
import org.eclipse.dd.dsf.debug.ui.sourcelookup.DsfSourceDisplayAdapter;
@ -73,6 +75,7 @@ public class GdbAdapterFactory
final DsfTerminateCommand fTerminateCommand;
final IDebugModelProvider fDebugModelProvider;
final DsfSuspendTrigger fSuspendTrigger;
final DsfSteppingModeTarget fSteppingModeTarget;
SessionAdapterSet(GdbLaunch launch) {
fLaunch = launch;
@ -87,14 +90,16 @@ public class GdbAdapterFactory
}
session.registerModelAdapter(ISourceDisplay.class, fSourceDisplayAdapter);
fStepIntoCommand = new DsfStepIntoCommand(session);
fStepOverCommand = new DsfStepOverCommand(session);
fSteppingModeTarget= new DsfSteppingModeTarget();
fStepIntoCommand = new DsfStepIntoCommand(session, fSteppingModeTarget);
fStepOverCommand = new DsfStepOverCommand(session, fSteppingModeTarget);
fStepReturnCommand = new DsfStepReturnCommand(session);
fSuspendCommand = new DsfSuspendCommand(session);
fResumeCommand = new DsfResumeCommand(session);
fRestartCommand = new GdbRestartCommand(session, fLaunch);
fTerminateCommand = new DsfTerminateCommand(session);
fSuspendTrigger = new DsfSuspendTrigger(session, fLaunch);
session.registerModelAdapter(ISteppingModeTarget.class, fSteppingModeTarget);
session.registerModelAdapter(IStepIntoHandler.class, fStepIntoCommand);
session.registerModelAdapter(IStepOverHandler.class, fStepOverCommand);
session.registerModelAdapter(IStepReturnHandler.class, fStepReturnCommand);
@ -127,6 +132,7 @@ public class GdbAdapterFactory
session.unregisterModelAdapter(ISourceDisplay.class);
if (fSourceDisplayAdapter != null) fSourceDisplayAdapter.dispose();
session.unregisterModelAdapter(ISteppingModeTarget.class);
session.unregisterModelAdapter(IStepIntoHandler.class);
session.unregisterModelAdapter(IStepOverHandler.class);
session.unregisterModelAdapter(IStepReturnHandler.class);

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2006 Wind River Systems and others.
* Copyright (c) 2006, 2008 Wind River Systems 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
@ -33,7 +33,9 @@ import org.eclipse.dd.mi.service.command.commands.MIExecContinue;
import org.eclipse.dd.mi.service.command.commands.MIExecFinish;
import org.eclipse.dd.mi.service.command.commands.MIExecInterrupt;
import org.eclipse.dd.mi.service.command.commands.MIExecNext;
import org.eclipse.dd.mi.service.command.commands.MIExecNextInstruction;
import org.eclipse.dd.mi.service.command.commands.MIExecStep;
import org.eclipse.dd.mi.service.command.commands.MIExecStepInstruction;
import org.eclipse.dd.mi.service.command.commands.MIExecUntil;
import org.eclipse.dd.mi.service.command.commands.MIThreadListIds;
import org.eclipse.dd.mi.service.command.events.MIBreakpointHitEvent;
@ -574,6 +576,16 @@ public class MIRunControl extends AbstractDsfService implements IRunControl
rm.done();
}
break;
case INSTRUCTION_STEP_INTO:
fConnection.queueCommand(
new MIExecStepInstruction(dmc, 1), new DataRequestMonitor<MIInfo>(getExecutor(), rm) {}
);
break;
case INSTRUCTION_STEP_OVER:
fConnection.queueCommand(
new MIExecNextInstruction(dmc, 1), new DataRequestMonitor<MIInfo>(getExecutor(), rm) {}
);
break;
default:
rm.setStatus(new Status(IStatus.ERROR, MIPlugin.PLUGIN_ID, INTERNAL_ERROR, "Given step type not supported", null)); //$NON-NLS-1$
rm.done();