1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-06-08 02:06:01 +02:00

Bug 462988 - Register grouping should work with different

implementations of IRegisters service
This commit is contained in:
Mikhail Khodjaiants 2015-03-24 12:23:22 -04:00
parent 43bc574e90
commit 404c093923
5 changed files with 1363 additions and 9 deletions

View file

@ -33,6 +33,7 @@ import org.eclipse.cdt.dsf.gdb.service.IGDBHardwareAndOS;
import org.eclipse.cdt.dsf.gdb.service.IGDBTraceControl; import org.eclipse.cdt.dsf.gdb.service.IGDBTraceControl;
import org.eclipse.cdt.dsf.mi.service.CSourceLookup; import org.eclipse.cdt.dsf.mi.service.CSourceLookup;
import org.eclipse.cdt.dsf.mi.service.IMIBackend; import org.eclipse.cdt.dsf.mi.service.IMIBackend;
import org.eclipse.cdt.dsf.mi.service.IMIRegisters;
import org.eclipse.cdt.dsf.mi.service.MIBreakpointsManager; import org.eclipse.cdt.dsf.mi.service.MIBreakpointsManager;
import org.eclipse.cdt.dsf.mi.service.MIBreakpointsSynchronizer; import org.eclipse.cdt.dsf.mi.service.MIBreakpointsSynchronizer;
import org.eclipse.cdt.dsf.service.DsfSession; import org.eclipse.cdt.dsf.service.DsfSession;
@ -107,6 +108,10 @@ public class ServicesLaunchSequence extends Sequence {
fLaunch.getServiceFactory().createService(MIBreakpointsManager.class, fSession).initialize(requestMonitor); fLaunch.getServiceFactory().createService(MIBreakpointsManager.class, fSession).initialize(requestMonitor);
}}, }},
new Step() { @Override new Step() { @Override
public void execute(RequestMonitor requestMonitor) {
fLaunch.getServiceFactory().createService(IMIRegisters.class, fSession).initialize(requestMonitor);
}},
new Step() { @Override
public void execute(RequestMonitor requestMonitor) { public void execute(RequestMonitor requestMonitor) {
fLaunch.getServiceFactory().createService(IRegisters.class, fSession).initialize(requestMonitor); fLaunch.getServiceFactory().createService(IRegisters.class, fSession).initialize(requestMonitor);
}}, }},

View file

@ -43,12 +43,14 @@ import org.eclipse.cdt.dsf.gdb.service.command.GDBControl_7_7;
import org.eclipse.cdt.dsf.mi.service.CSourceLookup; import org.eclipse.cdt.dsf.mi.service.CSourceLookup;
import org.eclipse.cdt.dsf.mi.service.IMIBackend; import org.eclipse.cdt.dsf.mi.service.IMIBackend;
import org.eclipse.cdt.dsf.mi.service.IMIExpressions; import org.eclipse.cdt.dsf.mi.service.IMIExpressions;
import org.eclipse.cdt.dsf.mi.service.IMIRegisters;
import org.eclipse.cdt.dsf.mi.service.MIBreakpoints; import org.eclipse.cdt.dsf.mi.service.MIBreakpoints;
import org.eclipse.cdt.dsf.mi.service.MIBreakpointsManager; import org.eclipse.cdt.dsf.mi.service.MIBreakpointsManager;
import org.eclipse.cdt.dsf.mi.service.MIBreakpointsSynchronizer; import org.eclipse.cdt.dsf.mi.service.MIBreakpointsSynchronizer;
import org.eclipse.cdt.dsf.mi.service.MIDisassembly; import org.eclipse.cdt.dsf.mi.service.MIDisassembly;
import org.eclipse.cdt.dsf.mi.service.MIExpressions; import org.eclipse.cdt.dsf.mi.service.MIExpressions;
import org.eclipse.cdt.dsf.mi.service.MIModules; import org.eclipse.cdt.dsf.mi.service.MIModules;
import org.eclipse.cdt.dsf.mi.service.MIRegisters;
import org.eclipse.cdt.dsf.mi.service.MIStack; import org.eclipse.cdt.dsf.mi.service.MIStack;
import org.eclipse.cdt.dsf.mi.service.command.CommandFactory; import org.eclipse.cdt.dsf.mi.service.command.CommandFactory;
import org.eclipse.cdt.dsf.service.DsfSession; import org.eclipse.cdt.dsf.service.DsfSession;
@ -120,6 +122,9 @@ public class GdbDebugServicesFactory extends AbstractDsfDebugServicesFactory {
else if (MIBreakpointsSynchronizer.class.isAssignableFrom(clazz)) { else if (MIBreakpointsSynchronizer.class.isAssignableFrom(clazz)) {
return (V)createBreakpointsSynchronizerService(session); return (V)createBreakpointsSynchronizerService(session);
} }
else if (IMIRegisters.class.isAssignableFrom(clazz)) {
return (V)createMIRegistersService(session);
}
return super.createService(clazz, session, optionalArguments); return super.createService(clazz, session, optionalArguments);
} }
@ -231,7 +236,7 @@ public class GdbDebugServicesFactory extends AbstractDsfDebugServicesFactory {
@Override @Override
protected IRegisters createRegistersService(DsfSession session) { protected IRegisters createRegistersService(DsfSession session) {
return new GDBRegisters(session); return new GDBManagedRegisterGroups(session);
} }
@Override @Override
@ -286,4 +291,11 @@ public class GdbDebugServicesFactory extends AbstractDsfDebugServicesFactory {
protected MIBreakpointsSynchronizer createBreakpointsSynchronizerService(DsfSession session) { protected MIBreakpointsSynchronizer createBreakpointsSynchronizerService(DsfSession session) {
return new MIBreakpointsSynchronizer(session); return new MIBreakpointsSynchronizer(session);
} }
/**
* @since 4.7
*/
protected IMIRegisters createMIRegistersService(DsfSession session) {
return new MIRegisters(session);
}
} }

View file

@ -0,0 +1,43 @@
/*******************************************************************************
* Copyright (c) 2015 Mentor Graphics 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:
* Mentor Graphics - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.dsf.mi.service;
import org.eclipse.cdt.dsf.debug.service.IRegisters;
import org.eclipse.cdt.dsf.debug.service.IRunControl.IContainerDMContext;
import org.eclipse.cdt.dsf.debug.service.IStack.IFrameDMContext;
/**
* @since 4.7
*/
public interface IMIRegisters extends IRegisters {
public interface IMIRegisterGroupDMContext extends IRegisterGroupDMContext {
public int getGroupNo();
public String getName();
public void setName(String groupName);
}
public interface IMIRegisterDMContext extends IRegisterDMContext {
public int getRegNo();
public String getName();
}
public IMIRegisterGroupDMContext createRegisterGroupDMC(IContainerDMContext contDmc, int groupNo, String groupName);
public IMIRegisterDMContext createRegisterDMC(IMIRegisterGroupDMContext groupDmc, int regNo, String regName);
public IMIRegisterDMContext createRegisterDMC(IMIRegisterGroupDMContext groupDmc, IFrameDMContext frameDmc, int regNo, String regName);
public String getRootRegisterGroupName();
public String getRootRegisterGroupDescription();
}

View file

@ -64,9 +64,10 @@ import org.osgi.framework.BundleContext;
* events being issued. Doing this in the handlers as opposed to when * events being issued. Doing this in the handlers as opposed to when
* the events are generated, guarantees that the state of the service will * the events are generated, guarantees that the state of the service will
* always be consistent with the events. * always be consistent with the events.
* @since 4.7
*/ */
public class MIRegisters extends AbstractDsfService implements IRegisters, ICachingService { public class MIRegisters extends AbstractDsfService implements IMIRegisters, ICachingService {
/** /**
* @since 4.6 * @since 4.6
*/ */
@ -83,7 +84,7 @@ public class MIRegisters extends AbstractDsfService implements IRegisters, ICach
* Support class used to construct Register Group DMCs. * Support class used to construct Register Group DMCs.
*/ */
public static class MIRegisterGroupDMC extends AbstractDMContext implements IRegisterGroupDMContext { public static class MIRegisterGroupDMC extends AbstractDMContext implements IMIRegisterGroupDMContext {
private int fGroupNo; private int fGroupNo;
private String fGroupName; private String fGroupName;
@ -93,11 +94,16 @@ public class MIRegisters extends AbstractDsfService implements IRegisters, ICach
fGroupName = groupName; fGroupName = groupName;
} }
public int getGroupNo() { return fGroupNo; } @Override
public String getName() { return fGroupName; } public int getGroupNo() { return fGroupNo; }
@Override
public String getName() { return fGroupName; }
/** /**
* @since 4.6 * @since 4.6
*/ */
@Override
public void setName(String groupName) { public void setName(String groupName) {
fGroupName = groupName; fGroupName = groupName;
} }
@ -110,6 +116,7 @@ public class MIRegisters extends AbstractDsfService implements IRegisters, ICach
@Override @Override
public int hashCode() { return super.baseHashCode() ^ fGroupNo; } public int hashCode() { return super.baseHashCode() ^ fGroupNo; }
@Override @Override
public String toString() { return baseToString() + ".group[" + fGroupNo + "," + fGroupName + "]"; } //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ public String toString() { return baseToString() + ".group[" + fGroupNo + "," + fGroupName + "]"; } //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
} }
@ -118,7 +125,7 @@ public class MIRegisters extends AbstractDsfService implements IRegisters, ICach
* Support class used to construct Register DMCs. * Support class used to construct Register DMCs.
*/ */
public static class MIRegisterDMC extends AbstractDMContext implements IRegisterDMContext { public static class MIRegisterDMC extends AbstractDMContext implements IMIRegisterDMContext {
private int fRegNo; private int fRegNo;
private String fRegName; private String fRegName;
@ -158,8 +165,11 @@ public class MIRegisters extends AbstractDsfService implements IRegisters, ICach
fRegName = regName; fRegName = regName;
} }
public int getRegNo() { return fRegNo; } @Override
public String getName() { return fRegName; } public int getRegNo() { return fRegNo; }
@Override
public String getName() { return fRegName; }
@Override @Override
public boolean equals(Object other) { public boolean equals(Object other) {
@ -278,7 +288,12 @@ public class MIRegisters extends AbstractDsfService implements IRegisters, ICach
/* /*
* Make ourselves known so clients can use us. * Make ourselves known so clients can use us.
*/ */
register(new String[]{IRegisters.class.getName(), MIRegisters.class.getName()}, new Hashtable<String,String>()); register(
new String[]{
IMIRegisters.class.getName(),
MIRegisters.class.getName()
},
new Hashtable<String,String>());
requestMonitor.done(); requestMonitor.done();
} }
@ -802,4 +817,46 @@ public class MIRegisters extends AbstractDsfService implements IRegisters, ICach
fRegisterNameCache.reset(context); fRegisterNameCache.reset(context);
fRegisterValueCache.reset(context); fRegisterValueCache.reset(context);
} }
/**
* @since 4.7
*/
@Override
public IMIRegisterGroupDMContext createRegisterGroupDMC(IContainerDMContext contDmc, int groupNo, String groupName) {
return new MIRegisterGroupDMC(this, contDmc, groupNo, groupName);
}
/**
* @since 4.7
*/
@Override
public IMIRegisterDMContext createRegisterDMC(IMIRegisterGroupDMContext groupDmc, int regNo, String regName) {
assert (groupDmc instanceof MIRegisterGroupDMC);
return new MIRegisterDMC(this, (MIRegisterGroupDMC)groupDmc, regNo, regName);
}
/**
* @since 4.7
*/
@Override
public IMIRegisterDMContext createRegisterDMC(IMIRegisterGroupDMContext groupDmc, IFrameDMContext frameDmc, int regNo, String regName) {
assert (groupDmc instanceof MIRegisterGroupDMC);
return new MIRegisterDMC(this, (MIRegisterGroupDMC)groupDmc, frameDmc, regNo, regName);
}
/**
* @since 4.7
*/
@Override
public String getRootRegisterGroupName() {
return ROOT_GROUP_NAME;
}
/**
* @since 4.7
*/
@Override
public String getRootRegisterGroupDescription() {
return ROOT_GROUP_DESCRIPTION;
}
} }