diff --git a/debug/org.eclipse.cdt.debug.core/ChangeLog b/debug/org.eclipse.cdt.debug.core/ChangeLog
index 5281245fceb..a6a6d0ce03e 100644
--- a/debug/org.eclipse.cdt.debug.core/ChangeLog
+++ b/debug/org.eclipse.cdt.debug.core/ChangeLog
@@ -1,3 +1,19 @@
+2005-05-20 Mikhail Khodjaiants
+ Bug 94139: User-defined register groups.
+ Added API and group serialization.
+ * ICDTLaunchConfigurationConstants.java
+ - ICRegisterManager.java
+ * ICDebugTarget.java
+ + IPersistableRegisterGroup.java
+ + IRegisterDescriptor.java
+ * CRegisterManager.java
+ * InternalDebugCoreMessages.properties
+ * CDebugTarget.java
+ * CoreModelMessages.properties
+ * CRegister.java
+ + CRegisterDescriptor.java
+ * CRegisterGroup.java
+
2005-05-12 Mikhail Khodjaiants
Bug 94905: Error examining structure contents in debugger.
The structure's elements should inherit the enablement flag from parents.
diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/ICDTLaunchConfigurationConstants.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/ICDTLaunchConfigurationConstants.java
index 3c302537fd1..3f07be0aed4 100644
--- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/ICDTLaunchConfigurationConstants.java
+++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/ICDTLaunchConfigurationConstants.java
@@ -94,6 +94,12 @@ public interface ICDTLaunchConfigurationConstants {
*/
public static final String ATTR_DEBUGGER_STOP_AT_MAIN = CDT_LAUNCH_ID + ".DEBUGGER_STOP_AT_MAIN"; //$NON-NLS-1$
+ /**
+ * Launch configuration attribute key. The value is a String specifying
+ * the register groups memento.
+ */
+ public static final String ATTR_DEBUGGER_REGISTER_GROUPS = CDT_LAUNCH_ID + ".DEBUGGER_REGISTER_GROUPS"; //$NON-NLS-1$
+
/**
* Launch configuration attribute key. The value is an int specifying the
* process id to attach to if the ATTR_DEBUGGER_START_MODE is
diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/ICRegisterManager.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/ICRegisterManager.java
deleted file mode 100644
index aa029e8fff3..00000000000
--- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/ICRegisterManager.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 QNX Software Systems and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- *
- * Contributors:
- * QNX Software Systems - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.cdt.debug.core;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.debug.core.model.IRegisterGroup;
-
-/**
- * Provides the access to the register groups' management functions.
- */
-public interface ICRegisterManager extends IAdaptable {
-
- void addRegisterGroup( IRegisterGroup group );
-
- void removeRegisterGroup( IRegisterGroup group );
-
- void removeAllRegisterGroups();
-}
\ No newline at end of file
diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/model/ICDebugTarget.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/model/ICDebugTarget.java
index f5ef1d312be..0979a011f8d 100644
--- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/model/ICDebugTarget.java
+++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/model/ICDebugTarget.java
@@ -12,6 +12,7 @@ package org.eclipse.cdt.debug.core.model;
import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.model.IDebugTarget;
+import org.eclipse.debug.core.model.IRegisterGroup;
/**
* C/C++ extension of IDebugTarget
.
@@ -90,4 +91,33 @@ public interface ICDebugTarget extends IDebugTarget,
* @throws DebugException if this method fails. Reasons include:
*/
public void loadSymbolsForAllModules() throws DebugException;
+
+ /**
+ * Returns the list of descriptors of the target registers
+ *
+ * @return the list register descriptors
+ * @throws DebugException if this method fails. Reasons include:
+ *
+ * @since 3.0
+ */
+ public IRegisterDescriptor[] getRegisterDescriptors() throws DebugException;
+
+ /**
+ * Adds a new user-defined register group to this target
+ *
+ * @param name the group name
+ * @param descriptors the list of registers to be grouped
+ *
+ * @since 3.0
+ */
+ public void addUserDefinedRegisterGroup( String name, IRegisterDescriptor[] descriptors );
+
+ /**
+ * Removes the given register group from the target
+ *
+ * @param group a group to be removed
+ *
+ * @since 3.0
+ */
+ public void removeRegisterGroups( IRegisterGroup[] groups );
}
diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/model/IPersistableRegisterGroup.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/model/IPersistableRegisterGroup.java
new file mode 100644
index 00000000000..1b3f6f3d4ab
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/model/IPersistableRegisterGroup.java
@@ -0,0 +1,39 @@
+/**********************************************************************
+ * Copyright (c) 2004 QNX Software Systems and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors:
+ * QNX Software Systems - Initial API and implementation
+ ***********************************************************************/
+package org.eclipse.cdt.debug.core.model;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.debug.core.model.IRegisterGroup;
+
+/**
+ * A register group to be persisted and restored.
+ * To be used for the user-defined register groups.
+ *
+ * @since 3.0
+ */
+public interface IPersistableRegisterGroup extends IRegisterGroup {
+
+ /**
+ * Returns a memento that can be used to reconstruct this group
+ *
+ * @return a memento that can be used to reconstruct this group
+ * @exception CoreException if unable to construct a memento
+ */
+ public String getMemento() throws CoreException;
+
+ /**
+ * Initializes this group based on the given memento.
+ *
+ * @param memento a memento to initialize this group
+ * @exception CoreException on failure to initialize
+ */
+ public void initializeFromMemento( String memento ) throws CoreException;
+}
diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/model/IRegisterDescriptor.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/model/IRegisterDescriptor.java
new file mode 100644
index 00000000000..d9fc8e50f5d
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/model/IRegisterDescriptor.java
@@ -0,0 +1,33 @@
+/**********************************************************************
+ * Copyright (c) 2004 QNX Software Systems and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors:
+ * QNX Software Systems - Initial API and implementation
+ ***********************************************************************/
+package org.eclipse.cdt.debug.core.model;
+
+/**
+ * Describes a register.
+ *
+ * @since 3.0
+ */
+public interface IRegisterDescriptor {
+
+ /**
+ * Returns the regiser's name
+ *
+ * @return the register's name
+ */
+ public String getName();
+
+ /**
+ * Returns the name of the hardware register group this register belongs to
+ *
+ * @return the name of the hardware register group
+ */
+ public String getGroupName();
+}
diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/CRegisterManager.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/CRegisterManager.java
index 9a9cf6bdcfe..1d8755fcd7d 100644
--- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/CRegisterManager.java
+++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/CRegisterManager.java
@@ -11,22 +11,41 @@
package org.eclipse.cdt.debug.internal.core;
import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import org.eclipse.cdt.debug.core.CDebugCorePlugin;
-import org.eclipse.cdt.debug.core.ICRegisterManager;
+import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants;
import org.eclipse.cdt.debug.core.cdi.CDIException;
+import org.eclipse.cdt.debug.core.cdi.model.ICDIRegisterDescriptor;
import org.eclipse.cdt.debug.core.cdi.model.ICDIRegisterGroup;
+import org.eclipse.cdt.debug.core.model.IRegisterDescriptor;
import org.eclipse.cdt.debug.internal.core.model.CDebugTarget;
+import org.eclipse.cdt.debug.internal.core.model.CRegisterDescriptor;
import org.eclipse.cdt.debug.internal.core.model.CRegisterGroup;
import org.eclipse.cdt.debug.internal.core.model.CStackFrame;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.debug.core.DebugEvent;
import org.eclipse.debug.core.DebugException;
+import org.eclipse.debug.core.DebugPlugin;
+import org.eclipse.debug.core.ILaunchConfiguration;
+import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.debug.core.model.IRegisterGroup;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
/**
* Manages all register groups in a debug target.
*/
-public class CRegisterManager implements ICRegisterManager {
+public class CRegisterManager {
+
+ private static final String ELEMENT_REGISTER_GROUP_LIST = "registerGroups"; //$NON-NLS-1$
+ private static final String ELEMENT_REGISTER_GROUP = "group"; //$NON-NLS-1$
+ private static final String ATTR_REGISTER_GROUP_MEMENTO = "memento"; //$NON-NLS-1$
/**
* The debug target associated with this manager.
@@ -36,12 +55,12 @@ public class CRegisterManager implements ICRegisterManager {
/**
* Collection of register groups added to this target. Values are of type CRegisterGroup
.
*/
- private List fRegisterGroups;
+ protected List fRegisterGroups;
/**
- * The last stack frame.
+ * The list of all register descriptors.
*/
- private CStackFrame fStackFrame;
+ private IRegisterDescriptor[] fRegisterDescriptors;
/**
* Constructor for CRegisterManager.
@@ -54,68 +73,99 @@ public class CRegisterManager implements ICRegisterManager {
* @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
*/
public Object getAdapter( Class adapter ) {
- if ( ICRegisterManager.class.equals( adapter ) )
- return this;
if ( CRegisterManager.class.equals( adapter ) )
return this;
return null;
}
public void dispose() {
- setStackFrame( null );
removeAllRegisterGroups();
}
- /* (non-Javadoc)
- * @see org.eclipse.cdt.debug.core.ICRegisterManager#addRegisterGroup(org.eclipse.debug.core.model.IRegisterGroup)
- */
- public void addRegisterGroup( IRegisterGroup group ) {
- // TODO Auto-generated method stub
+ public IRegisterDescriptor[] getAllRegisterDescriptors() throws DebugException {
+ return fRegisterDescriptors;
}
public IRegisterGroup[] getRegisterGroups( CStackFrame frame ) throws DebugException {
- setStackFrame( frame );
return (IRegisterGroup[])fRegisterGroups.toArray( new IRegisterGroup[fRegisterGroups.size()] );
}
public void initialize() {
- createRegisterGroups();
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.cdt.debug.core.ICRegisterManager#removeAllRegisterGroups()
- */
- public void removeAllRegisterGroups() {
- Iterator it = fRegisterGroups.iterator();
- while( it.hasNext() ) {
- ((CRegisterGroup)it.next()).dispose();
- }
- fRegisterGroups.clear();
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.cdt.debug.core.ICRegisterManager#removeRegisterGroup(org.eclipse.debug.core.model.IRegisterGroup)
- */
- public void removeRegisterGroup( IRegisterGroup group ) {
- fRegisterGroups.remove( group );
- }
-
- private void createRegisterGroups() {
- fRegisterGroups = new ArrayList( 20 );
- createMainRegisterGroup();
- }
-
- private void createMainRegisterGroup() {
- ICDIRegisterGroup[] groups = null;
+ ICDIRegisterGroup[] groups = new ICDIRegisterGroup[0];
try {
groups = getDebugTarget().getCDITarget().getRegisterGroups();
}
catch( CDIException e ) {
CDebugCorePlugin.log( e );
}
- for (int i = 0; i < groups.length; ++i) {
- fRegisterGroups.add( new CRegisterGroup( getDebugTarget(), groups[i] ) ); //$NON-NLS-1$
+ List list = new ArrayList();
+ for( int i = 0; i < groups.length; ++i ) {
+ try {
+ ICDIRegisterDescriptor[] cdiDescriptors = groups[i].getRegisterDescriptors();
+ for ( int j = 0; j < cdiDescriptors.length; ++j ) {
+ list.add( new CRegisterDescriptor( groups[i], cdiDescriptors[j] ) );
+ }
+ }
+ catch( CDIException e ) {
+ CDebugCorePlugin.log( e );
+ }
}
+ fRegisterDescriptors = (IRegisterDescriptor[])list.toArray( new IRegisterDescriptor[list.size()] );
+ createRegisterGroups();
+ }
+
+ public void addRegisterGroup( final String name, final IRegisterDescriptor[] descriptors ) {
+ DebugPlugin.getDefault().asyncExec(
+ new Runnable() {
+ public void run() {
+ fRegisterGroups.add( new CRegisterGroup( getDebugTarget(), name, descriptors ) );
+ getDebugTarget().fireChangeEvent( DebugEvent.CONTENT );
+ }
+ } );
+ }
+
+ public void removeAllRegisterGroups() {
+ DebugPlugin.getDefault().asyncExec(
+ new Runnable() {
+ public void run() {
+ synchronized( fRegisterGroups ) {
+ Iterator it = fRegisterGroups.iterator();
+ while( it.hasNext() ) {
+ ((CRegisterGroup)it.next()).dispose();
+ }
+ fRegisterGroups.clear();
+ }
+ getDebugTarget().fireChangeEvent( DebugEvent.CONTENT );
+ }
+ } );
+ }
+
+ public void removeRegisterGroups( final IRegisterGroup[] groups ) {
+ DebugPlugin.getDefault().asyncExec(
+ new Runnable() {
+ public void run() {
+ for ( int i = 0; i < groups.length; ++i ) {
+ ((CRegisterGroup)groups[i]).dispose();
+ }
+ fRegisterGroups.removeAll( Arrays.asList( groups ) );
+ getDebugTarget().fireChangeEvent( DebugEvent.CONTENT );
+ }
+ } );
+ }
+
+ private void createRegisterGroups() {
+ fRegisterGroups = Collections.synchronizedList( new ArrayList( 20 ) );
+ ILaunchConfiguration config = getDebugTarget().getLaunch().getLaunchConfiguration();
+ try {
+ String memento = config.getAttribute( ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_REGISTER_GROUPS, "" ); //$NON-NLS-1$
+ if ( memento != null && memento.length() > 0 ) {
+ initializeFromMemento( memento );
+ return;
+ }
+ }
+ catch( CoreException e ) {
+ }
+ initializeDefaults();
}
public void targetSuspended() {
@@ -125,15 +175,102 @@ public class CRegisterManager implements ICRegisterManager {
}
}
- public CStackFrame getStackFrame() {
- return fStackFrame;
- }
-
- private void setStackFrame( CStackFrame stackFrame ) {
- fStackFrame = stackFrame;
- }
-
protected CDebugTarget getDebugTarget() {
return fDebugTarget;
}
+
+ private void initializeFromMemento( String memento ) throws CoreException {
+ Node node = DebugPlugin.parseDocument( memento );
+ if ( node.getNodeType() != Node.ELEMENT_NODE ) {
+ abort( InternalDebugCoreMessages.getString( "CRegisterManager.0" ), null ); //$NON-NLS-1$
+ }
+ Element element = (Element)node;
+ if ( !ELEMENT_REGISTER_GROUP_LIST.equals( element.getNodeName() ) ) {
+ abort( InternalDebugCoreMessages.getString( "CRegisterManager.1" ), null ); //$NON-NLS-1$
+ }
+ Node childNode = element.getFirstChild();
+ while( childNode != null ) {
+ if ( childNode.getNodeType() == Node.ELEMENT_NODE ) {
+ Element child = (Element)childNode;
+ if ( ELEMENT_REGISTER_GROUP.equals( child.getNodeName() ) ) {
+ String groupMemento = child.getAttribute( ATTR_REGISTER_GROUP_MEMENTO );
+ CRegisterGroup group = new CRegisterGroup( getDebugTarget() );
+ try {
+ group.initializeFromMemento( groupMemento );
+ doAddRegisterGroup( group );
+ }
+ catch( CoreException e ) {
+ // skip this group
+ }
+ }
+ }
+ childNode = childNode.getNextSibling();
+ }
+ }
+
+ private void initializeDefaults() {
+ String current = null;
+ int startIndex = 0;
+ for ( int i = 0; i < fRegisterDescriptors.length; ++i ) {
+ CRegisterDescriptor d = (CRegisterDescriptor)fRegisterDescriptors[i];
+ if ( current != null && d.getGroupName().compareTo( current ) != 0 ) {
+ IRegisterDescriptor[] descriptors = new IRegisterDescriptor[i - startIndex];
+ System.arraycopy( fRegisterDescriptors, startIndex, descriptors, 0, descriptors.length );
+ fRegisterGroups.add( new CRegisterGroup( getDebugTarget(), current, descriptors ) );
+ startIndex = i;
+ }
+ current = d.getGroupName();
+ }
+ if ( startIndex < fRegisterDescriptors.length - 1 ) {
+ IRegisterDescriptor[] descriptors = new IRegisterDescriptor[fRegisterDescriptors.length - startIndex];
+ System.arraycopy( fRegisterDescriptors, startIndex, descriptors, 0, descriptors.length );
+ fRegisterGroups.add( new CRegisterGroup( getDebugTarget(), current, descriptors ) );
+ }
+ }
+
+ protected synchronized void doAddRegisterGroup( IRegisterGroup group ) {
+ fRegisterGroups.add( group );
+ }
+
+ public void save() {
+ ILaunchConfiguration config = getDebugTarget().getLaunch().getLaunchConfiguration();
+ try {
+ ILaunchConfigurationWorkingCopy wc = config.getWorkingCopy();
+ wc.setAttribute( ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_REGISTER_GROUPS, getMemento() );
+ wc.doSave();
+ }
+ catch( CoreException e ) {
+ CDebugCorePlugin.log( e );
+ }
+ }
+
+ private String getMemento() throws CoreException {
+ if ( fRegisterGroups == null )
+ return ""; //$NON-NLS-1$
+ Document document = DebugPlugin.newDocument();
+ Element element = document.createElement( ELEMENT_REGISTER_GROUP_LIST );
+ Iterator it = fRegisterGroups.iterator();
+ while( it.hasNext() ) {
+ CRegisterGroup group = (CRegisterGroup)it.next();
+ Element child = document.createElement( ELEMENT_REGISTER_GROUP );
+ child.setAttribute( ATTR_REGISTER_GROUP_MEMENTO, group.getMemento() );
+ element.appendChild( child );
+ }
+ document.appendChild( element );
+ return DebugPlugin.serializeDocument( document );
+ }
+
+ private void abort( String message, Throwable exception ) throws CoreException {
+ IStatus status = new Status( IStatus.ERROR, CDebugCorePlugin.getUniqueIdentifier(), CDebugCorePlugin.INTERNAL_ERROR, message, exception );
+ throw new CoreException( status );
+ }
+
+ public IRegisterDescriptor findDescriptor( String groupName, String name ) {
+ for ( int i = 0; i < fRegisterDescriptors.length; ++i ) {
+ IRegisterDescriptor d = fRegisterDescriptors[i];
+ if ( groupName.equals( d.getGroupName() ) && name.equals( d.getName() ) )
+ return d;
+ }
+ return null;
+ }
}
diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/InternalDebugCoreMessages.properties b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/InternalDebugCoreMessages.properties
index 07b66e83a8e..2766bc4b810 100644
--- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/InternalDebugCoreMessages.properties
+++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/InternalDebugCoreMessages.properties
@@ -19,4 +19,6 @@ CMemoryBlockExtensionRetrieval.2=Invalid expression: ''{0}''
DebugConfiguration.0=This debugger no longer supports this operation
CDebugAdapter.0=This debugger does not support debugging external files
CDebugAdapter.1=Debugger Process
-CDebugAdapter.Program_file_not_specified=Program file not specified
\ No newline at end of file
+CDebugAdapter.Program_file_not_specified=Program file not specified
+CRegisterManager.0=Unable to restore register groups - invalid memento.
+CRegisterManager.1=Unable to restore register groups - expecting register group list element.
diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CDebugTarget.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CDebugTarget.java
index e232015f7a5..03d866096f3 100644
--- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CDebugTarget.java
+++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CDebugTarget.java
@@ -25,7 +25,6 @@ import org.eclipse.cdt.debug.core.CDIDebugModel;
import org.eclipse.cdt.debug.core.CDebugCorePlugin;
import org.eclipse.cdt.debug.core.CDebugUtils;
import org.eclipse.cdt.debug.core.ICGlobalVariableManager;
-import org.eclipse.cdt.debug.core.ICRegisterManager;
import org.eclipse.cdt.debug.core.cdi.CDIException;
import org.eclipse.cdt.debug.core.cdi.ICDIAddressLocation;
import org.eclipse.cdt.debug.core.cdi.ICDIBreakpointHit;
@@ -76,6 +75,7 @@ import org.eclipse.cdt.debug.core.model.IExecFileInfo;
import org.eclipse.cdt.debug.core.model.IGlobalVariableDescriptor;
import org.eclipse.cdt.debug.core.model.IJumpToAddress;
import org.eclipse.cdt.debug.core.model.IJumpToLine;
+import org.eclipse.cdt.debug.core.model.IRegisterDescriptor;
import org.eclipse.cdt.debug.core.model.IRunToAddress;
import org.eclipse.cdt.debug.core.model.IRunToLine;
import org.eclipse.cdt.debug.core.sourcelookup.CDirectorySourceContainer;
@@ -827,7 +827,7 @@ public class CDebugTarget extends CDebugElement implements ICDebugTarget, ICDIEv
return getBreakpointManager();
if ( adapter.equals( CSignalManager.class ) )
return getSignalManager();
- if ( adapter.equals( ICRegisterManager.class ) )
+ if ( adapter.equals( CRegisterManager.class ) )
return getRegisterManager();
if ( adapter.equals( ICGlobalVariableManager.class ) )
return getGlobalVariableManager();
@@ -998,6 +998,7 @@ public class CDebugTarget extends CDebugElement implements ICDebugTarget, ICDIEv
disposeGlobalVariableManager();
disposeModuleManager();
disposeSignalManager();
+ saveRegisterGroups();
disposeRegisterManager();
disposeDisassembly();
disposeSourceManager();
@@ -1448,6 +1449,10 @@ public class CDebugTarget extends CDebugElement implements ICDebugTarget, ICDIEv
fSignalManager.dispose();
}
+ protected void saveRegisterGroups() {
+ fRegisterManager.save();
+ }
+
protected void disposeRegisterManager() {
fRegisterManager.dispose();
}
@@ -1871,4 +1876,25 @@ public class CDebugTarget extends CDebugElement implements ICDebugTarget, ICDIEv
}
}
}
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.core.model.ICDebugTarget#getRegisterDescriptors()
+ */
+ public IRegisterDescriptor[] getRegisterDescriptors() throws DebugException {
+ return getRegisterManager().getAllRegisterDescriptors();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.core.model.ICDebugTarget#addUserDefinedRegisterGroup(java.lang.String, org.eclipse.cdt.debug.core.model.IRegisterDescriptor[])
+ */
+ public void addUserDefinedRegisterGroup( String name, IRegisterDescriptor[] descriptors ) {
+ getRegisterManager().addRegisterGroup( name, descriptors );
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.core.model.ICDebugTarget#removeRegisterGroups(org.eclipse.debug.core.model.IRegisterGroup[])
+ */
+ public void removeRegisterGroups( IRegisterGroup[] groups ) {
+ getRegisterManager().removeRegisterGroups( groups );
+ }
}
diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CRegister.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CRegister.java
index 559f4a58d33..6d56af43d83 100644
--- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CRegister.java
+++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CRegister.java
@@ -13,8 +13,8 @@ package org.eclipse.cdt.debug.internal.core.model;
import org.eclipse.cdt.debug.core.CDebugCorePlugin;
import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants;
import org.eclipse.cdt.debug.core.ICDebugConstants;
-import org.eclipse.cdt.debug.core.cdi.model.ICDIRegisterDescriptor;
import org.eclipse.cdt.debug.core.model.CVariableFormat;
+import org.eclipse.cdt.debug.core.model.IRegisterDescriptor;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.model.IRegister;
@@ -28,16 +28,16 @@ public class CRegister extends CGlobalVariable implements IRegister {
/**
* Constructor for CRegister.
*/
- protected CRegister( CRegisterGroup parent, ICDIRegisterDescriptor cdiRegisterDescriptor ) {
- super( parent, null, cdiRegisterDescriptor );
+ protected CRegister( CRegisterGroup parent, IRegisterDescriptor descriptor ) {
+ super( parent, null, ((CRegisterDescriptor)descriptor).getCDIDescriptor() );
setFormat( CVariableFormat.getFormat( CDebugCorePlugin.getDefault().getPluginPreferences().getInt( ICDebugConstants.PREF_DEFAULT_REGISTER_FORMAT ) ) );
}
/**
* Constructor for CRegister.
*/
- protected CRegister( CRegisterGroup parent, ICDIRegisterDescriptor registerObject, String message ) {
- super( parent, null, registerObject, message );
+ protected CRegister( CRegisterGroup parent, IRegisterDescriptor descriptor, String message ) {
+ super( parent, null, ((CRegisterDescriptor)descriptor).getCDIDescriptor(), message );
setFormat( CVariableFormat.getFormat( CDebugCorePlugin.getDefault().getPluginPreferences().getInt( ICDebugConstants.PREF_DEFAULT_REGISTER_FORMAT ) ) );
}
diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CRegisterDescriptor.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CRegisterDescriptor.java
new file mode 100644
index 00000000000..5a2d1d4bcfc
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CRegisterDescriptor.java
@@ -0,0 +1,64 @@
+/**********************************************************************
+ * Copyright (c) 2004 QNX Software Systems and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors:
+ * QNX Software Systems - Initial API and implementation
+ ***********************************************************************/
+package org.eclipse.cdt.debug.internal.core.model;
+
+import org.eclipse.cdt.debug.core.cdi.model.ICDIRegisterDescriptor;
+import org.eclipse.cdt.debug.core.cdi.model.ICDIRegisterGroup;
+import org.eclipse.cdt.debug.core.model.IRegisterDescriptor;
+
+/**
+ * A register descriptor. Temporary, need to change the related CDI interfaces.
+ */
+public class CRegisterDescriptor implements IRegisterDescriptor {
+
+ private String fName;
+ private String fGroupName;
+ private ICDIRegisterDescriptor fCDIDescriptor = null;
+
+ /**
+ * Constructor for CRegisterDescriptor.
+ */
+ public CRegisterDescriptor( String name, String groupName ) {
+ fName = name;
+ fGroupName = groupName;
+ }
+
+ /**
+ * Constructor for CRegisterDescriptor.
+ */
+ public CRegisterDescriptor( ICDIRegisterGroup group, ICDIRegisterDescriptor desc ) {
+ fName = desc.getName();
+ fGroupName = group.getName();
+ fCDIDescriptor = desc;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.core.model.IRegisterDescriptor#getName()
+ */
+ public String getName() {
+ return fName;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.core.model.IRegisterDescriptor#getGroupName()
+ */
+ public String getGroupName() {
+ return fGroupName;
+ }
+
+ public ICDIRegisterDescriptor getCDIDescriptor() {
+ return fCDIDescriptor;
+ }
+
+ public void setCDIDescriptor( ICDIRegisterDescriptor descriptor ) {
+ fCDIDescriptor = descriptor;
+ }
+}
diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CRegisterGroup.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CRegisterGroup.java
index 2846297d777..f24c4cb93ff 100644
--- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CRegisterGroup.java
+++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CRegisterGroup.java
@@ -10,59 +10,83 @@
***********************************************************************/
package org.eclipse.cdt.debug.internal.core.model;
-import org.eclipse.cdt.debug.core.cdi.CDIException;
-import org.eclipse.cdt.debug.core.cdi.model.ICDIRegisterDescriptor;
-import org.eclipse.cdt.debug.core.cdi.model.ICDIRegisterGroup;
+import java.util.ArrayList;
+import org.eclipse.cdt.debug.core.CDebugCorePlugin;
import org.eclipse.cdt.debug.core.model.IEnableDisableTarget;
+import org.eclipse.cdt.debug.core.model.IPersistableRegisterGroup;
+import org.eclipse.cdt.debug.core.model.IRegisterDescriptor;
+import org.eclipse.cdt.debug.internal.core.CRegisterManager;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
import org.eclipse.debug.core.DebugEvent;
import org.eclipse.debug.core.DebugException;
+import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.model.IRegister;
-import org.eclipse.debug.core.model.IRegisterGroup;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
/**
* Represents a group of registers.
*/
-public class CRegisterGroup extends CDebugElement implements IRegisterGroup, IEnableDisableTarget {
+public class CRegisterGroup extends CDebugElement implements IPersistableRegisterGroup, IEnableDisableTarget {
- private ICDIRegisterGroup fCDIRegisterGroup;
+ private static final String ELEMENT_REGISTER_GROUP = "registerGroup"; //$NON-NLS-1$
+ private static final String ATTR_REGISTER_GROUP_NAME = "name"; //$NON-NLS-1$
+ private static final String ATTR_REGISTER_GROUP_ENABLED = "enabled"; //$NON-NLS-1$
+
+ private static final String ELEMENT_REGISTER = "register"; //$NON-NLS-1$
+ private static final String ATTR_REGISTER_NAME = "name"; //$NON-NLS-1$
+ private static final String ATTR_REGISTER_ORIGINAL_GROUP_NAME = "originalGroupName"; //$NON-NLS-1$
+
+ private String fName;
+
+ private IRegisterDescriptor[] fRegisterDescriptors;
private IRegister[] fRegisters;
private boolean fIsEnabled = true;
+
+ private boolean fDisposed = false;
/**
* Constructor for CRegisterGroup.
*/
- public CRegisterGroup( CDebugTarget target, ICDIRegisterGroup regGroup ) {
+ public CRegisterGroup( CDebugTarget target ) {
super( target );
- fCDIRegisterGroup = regGroup;
+ }
+
+ /**
+ * Constructor for CRegisterGroup.
+ */
+ public CRegisterGroup( CDebugTarget target, String name, IRegisterDescriptor[] descriptors ) {
+ super( target );
+ fName = name;
+ fRegisterDescriptors = descriptors;
}
/* (non-Javadoc)
* @see org.eclipse.debug.core.model.IRegisterGroup#getName()
*/
public String getName() throws DebugException {
- return fCDIRegisterGroup.getName();
+ return fName;
}
/* (non-Javadoc)
* @see org.eclipse.debug.core.model.IRegisterGroup#getRegisters()
*/
public IRegister[] getRegisters() throws DebugException {
+ if ( fDisposed )
+ return new IRegister[0];
if ( fRegisters == null ) {
- try {
- ICDIRegisterDescriptor[] regDescs = fCDIRegisterGroup.getRegisterDescriptors();
- fRegisters = new IRegister[regDescs.length];
- for( int i = 0; i < fRegisters.length; ++i ) {
- fRegisters[i] = new CRegister( this, regDescs[i] );
- if ( ((CRegister)fRegisters[i]).isEnabled() ) {
- ((CRegister)fRegisters[i]).setEnabled( isEnabled() );
- }
+ fRegisters = new IRegister[fRegisterDescriptors.length];
+ for( int i = 0; i < fRegisters.length; ++i ) {
+ fRegisters[i] = new CRegister( this, fRegisterDescriptors[i] );
+ if ( ((CRegister)fRegisters[i]).isEnabled() ) {
+ ((CRegister)fRegisters[i]).setEnabled( isEnabled() );
}
}
- catch( CDIException e ) {
- requestFailed( e.getMessage(), null );
- }
}
return fRegisters;
}
@@ -71,24 +95,20 @@ public class CRegisterGroup extends CDebugElement implements IRegisterGroup, IEn
* @see org.eclipse.debug.core.model.IRegisterGroup#hasRegisters()
*/
public boolean hasRegisters() throws DebugException {
- try {
- return fCDIRegisterGroup.hasRegisters();
- } catch( CDIException e ) {
- requestFailed( e.getMessage(), null );
- }
- return false;
+ return ( fRegisterDescriptors.length > 0 );
}
public void dispose() {
+ fDisposed = true;
if (fRegisters == null) {
return;
}
for ( int i = 0; i < fRegisters.length; ++i ) {
if ( fRegisters[i] != null ) {
((CRegister)fRegisters[i]).dispose();
- fRegisters[i] = null;
}
}
+ fRegisters = null;
}
public void targetSuspended() {
@@ -144,4 +164,79 @@ public class CRegisterGroup extends CDebugElement implements IRegisterGroup, IEn
fIsEnabled = enabled;
fireChangeEvent( DebugEvent.CONTENT );
}
+
+ public String getMemento() throws CoreException {
+ Document document = DebugPlugin.newDocument();
+ Element element = document.createElement( ELEMENT_REGISTER_GROUP );
+ element.setAttribute( ATTR_REGISTER_GROUP_NAME, getName() );
+ element.setAttribute( ATTR_REGISTER_GROUP_ENABLED, isEnabled() ? Boolean.TRUE.toString() : Boolean.FALSE.toString() );
+ for ( int i = 0; i < fRegisterDescriptors.length; ++i ) {
+ Element child = document.createElement( ELEMENT_REGISTER );
+ child.setAttribute( ATTR_REGISTER_NAME, fRegisterDescriptors[i].getName() );
+ child.setAttribute( ATTR_REGISTER_ORIGINAL_GROUP_NAME, fRegisterDescriptors[i].getGroupName() );
+ element.appendChild( child );
+ }
+ document.appendChild( element );
+ return DebugPlugin.serializeDocument( document );
+ }
+
+ public void initializeFromMemento( String memento ) throws CoreException {
+ Node node = DebugPlugin.parseDocument( memento );
+ if ( node.getNodeType() != Node.ELEMENT_NODE ) {
+ abort( CoreModelMessages.getString( "CRegisterGroup.0" ), null ); //$NON-NLS-1$
+ }
+ Element element = (Element)node;
+ if ( !ELEMENT_REGISTER_GROUP.equals( element.getNodeName() ) ) {
+ abort( CoreModelMessages.getString( "CRegisterGroup.1" ), null ); //$NON-NLS-1$
+ }
+ String groupName = element.getAttribute( ATTR_REGISTER_GROUP_NAME );
+ if ( groupName == null || groupName.length() == 0 ) {
+ abort( CoreModelMessages.getString( "CRegisterGroup.2" ), null ); //$NON-NLS-1$
+ }
+ String e = element.getAttribute( ATTR_REGISTER_GROUP_ENABLED );
+ boolean enabled = Boolean.valueOf( e ).booleanValue();
+ CRegisterManager rm = getRegisterManager();
+ ArrayList list = new ArrayList();
+ Node childNode = element.getFirstChild();
+ while( childNode != null ) {
+ if ( childNode.getNodeType() == Node.ELEMENT_NODE ) {
+ Element child = (Element)childNode;
+ if ( ELEMENT_REGISTER.equals( child.getNodeName() ) ) {
+ String name = child.getAttribute( ATTR_REGISTER_NAME );
+ String originalGroupName = child.getAttribute( ATTR_REGISTER_ORIGINAL_GROUP_NAME );
+ if ( name == null || name.length() == 0 || originalGroupName == null || originalGroupName.length() == 0 ) {
+ abort( CoreModelMessages.getString( "CRegisterGroup.3" ), null ); //$NON-NLS-1$
+ }
+ else {
+ IRegisterDescriptor d = rm.findDescriptor( originalGroupName, name );
+ if ( d != null )
+ list.add( d );
+ else
+ CDebugCorePlugin.log( CoreModelMessages.getString( "CRegisterGroup.4" ) ); //$NON-NLS-1$
+ }
+ }
+ }
+ childNode = childNode.getNextSibling();
+ }
+ setName( groupName );
+ setRegisterDescriptors( (IRegisterDescriptor[])list.toArray( new IRegisterDescriptor[list.size()] ) );
+ setEnabled( enabled );
+ }
+
+ private void abort( String message, Throwable exception ) throws CoreException {
+ IStatus status = new Status( IStatus.ERROR, CDebugCorePlugin.getUniqueIdentifier(), CDebugCorePlugin.INTERNAL_ERROR, message, exception );
+ throw new CoreException( status );
+ }
+
+ private void setName( String name ) {
+ fName = name;
+ }
+
+ private void setRegisterDescriptors( IRegisterDescriptor[] registerDescriptors ) {
+ fRegisterDescriptors = registerDescriptors;
+ }
+
+ private CRegisterManager getRegisterManager() {
+ return (CRegisterManager)getDebugTarget().getAdapter( CRegisterManager.class );
+ }
}
\ No newline at end of file
diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CoreModelMessages.properties b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CoreModelMessages.properties
index 1c3eec6c940..00657ffd056 100644
--- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CoreModelMessages.properties
+++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CoreModelMessages.properties
@@ -33,3 +33,8 @@ CModule.2=Invalid symbols file.
CModule.4=Not supported
CModuleManager.0=Error loading symbols.
CModuleManager.1=Error loading symbols.
+CRegisterGroup.0=Unable to restore register group - invalid memento.
+CRegisterGroup.1=Unable to restore register group - expecting register group element.
+CRegisterGroup.2=Unable to restore register group - missing name attribute.
+CRegisterGroup.3=Unable to restore register - missing attributes.
+CRegisterGroup.4=Register doesn't exist on this target.