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

[244435] - [expressions][registers] A register modified in expressions new may not show new value.

This commit is contained in:
Pawel Piech 2008-08-18 16:57:32 +00:00
parent eba5a5fe78
commit 938067e4ce
6 changed files with 230 additions and 246 deletions

View file

@ -45,15 +45,19 @@ public interface IExpressionVMNode extends IVMNode {
public int getDeltaFlagsForExpression(IExpression expression, Object event); public int getDeltaFlagsForExpression(IExpression expression, Object event);
/** /**
* Adds delta flags to the given parent delta based on the expression object * Adds delta flags to the given parent delta based on the expression
* given. * object given. The nodes add flags to the expression view's root
* delta using this method, regardless of whether the node is directly
* below the expression manager or not.
*
*/ */
public void buildDeltaForExpression(IExpression expression, int elementIdx, Object event, VMDelta parentDelta, public void buildDeltaForExpression(IExpression expression, int elementIdx, Object event, VMDelta parentDelta,
TreePath path, RequestMonitor rm); TreePath path, RequestMonitor rm);
/** /**
* Adds delta to the given parent delta based on the given element which was created base on * Adds delta to the given parent delta based on the given element that
* an expression parsed by this node. * was created base on an expression parsed by this node. The VM nodes can
* add a new delta node to the parentDela by implementing this method.
*/ */
public void buildDeltaForExpressionElement(Object element, int elementIdx, Object event, VMDelta parentDelta, final RequestMonitor rm); public void buildDeltaForExpressionElement(Object element, int elementIdx, Object event, VMDelta parentDelta, final RequestMonitor rm);
} }

View file

@ -29,15 +29,15 @@ import org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.numberformat.I
import org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.register.RegisterBitFieldCellModifier.BitFieldEditorStyle; import org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.register.RegisterBitFieldCellModifier.BitFieldEditorStyle;
import org.eclipse.dd.dsf.debug.internal.ui.DsfDebugUIPlugin; import org.eclipse.dd.dsf.debug.internal.ui.DsfDebugUIPlugin;
import org.eclipse.dd.dsf.debug.service.IFormattedValues; import org.eclipse.dd.dsf.debug.service.IFormattedValues;
import org.eclipse.dd.dsf.debug.service.IMemory;
import org.eclipse.dd.dsf.debug.service.IRegisters; import org.eclipse.dd.dsf.debug.service.IRegisters;
import org.eclipse.dd.dsf.debug.service.IRunControl;
import org.eclipse.dd.dsf.debug.service.IFormattedValues.FormattedValueDMContext; import org.eclipse.dd.dsf.debug.service.IFormattedValues.FormattedValueDMContext;
import org.eclipse.dd.dsf.debug.service.IFormattedValues.FormattedValueDMData; import org.eclipse.dd.dsf.debug.service.IFormattedValues.FormattedValueDMData;
import org.eclipse.dd.dsf.debug.service.IMemory.IMemoryChangedEvent;
import org.eclipse.dd.dsf.debug.service.IRegisters.IBitFieldChangedDMEvent; import org.eclipse.dd.dsf.debug.service.IRegisters.IBitFieldChangedDMEvent;
import org.eclipse.dd.dsf.debug.service.IRegisters.IBitFieldDMContext; import org.eclipse.dd.dsf.debug.service.IRegisters.IBitFieldDMContext;
import org.eclipse.dd.dsf.debug.service.IRegisters.IBitFieldDMData; import org.eclipse.dd.dsf.debug.service.IRegisters.IBitFieldDMData;
import org.eclipse.dd.dsf.debug.service.IRegisters.IMnemonic; import org.eclipse.dd.dsf.debug.service.IRegisters.IMnemonic;
import org.eclipse.dd.dsf.debug.service.IRegisters.IRegisterChangedDMEvent;
import org.eclipse.dd.dsf.debug.service.IRegisters.IRegisterDMContext; import org.eclipse.dd.dsf.debug.service.IRegisters.IRegisterDMContext;
import org.eclipse.dd.dsf.debug.service.IRegisters.IRegisterDMData; import org.eclipse.dd.dsf.debug.service.IRegisters.IRegisterDMData;
import org.eclipse.dd.dsf.debug.service.IRegisters.IRegisterGroupDMData; import org.eclipse.dd.dsf.debug.service.IRegisters.IRegisterGroupDMData;
@ -154,7 +154,7 @@ public class RegisterBitFieldVMNode extends AbstractExpressionVMNode
private final IFormattedValuePreferenceStore fFormattedPrefStore; private final IFormattedValuePreferenceStore fFormattedPrefStore;
public RegisterBitFieldVMNode(IFormattedValuePreferenceStore prefStore, AbstractDMVMProvider provider, DsfSession session, SyncRegisterDataAccess access) { public RegisterBitFieldVMNode(IFormattedValuePreferenceStore prefStore, AbstractDMVMProvider provider, DsfSession session, SyncRegisterDataAccess access) {
super(provider, session, IRegisters.IBitFieldDMContext.class); super(provider, session, IBitFieldDMContext.class);
fSyncRegisterDataAccess = access; fSyncRegisterDataAccess = access;
fFormattedPrefStore = prefStore; fFormattedPrefStore = prefStore;
} }
@ -324,7 +324,7 @@ public class RegisterBitFieldVMNode extends AbstractExpressionVMNode
continue; continue;
} }
final IBitFieldDMContext dmc = findDmcInPath(update.getViewerInput(), update.getElementPath(), IRegisters.IBitFieldDMContext.class); final IBitFieldDMContext dmc = findDmcInPath(update.getViewerInput(), update.getElementPath(), IBitFieldDMContext.class);
getDMVMProvider().getModelData( getDMVMProvider().getModelData(
this, this,
@ -507,24 +507,19 @@ public class RegisterBitFieldVMNode extends AbstractExpressionVMNode
* @see org.eclipse.dd.dsf.ui.viewmodel.IVMNode#getDeltaFlags(java.lang.Object) * @see org.eclipse.dd.dsf.ui.viewmodel.IVMNode#getDeltaFlags(java.lang.Object)
*/ */
public int getDeltaFlags(Object e) { public int getDeltaFlags(Object e) {
if (e instanceof IRunControl.ISuspendedDMEvent) { if ( e instanceof ISuspendedDMEvent ||
return IModelDelta.CONTENT; e instanceof IMemoryChangedEvent ||
} e instanceof IRegisterChangedDMEvent ||
(e instanceof PropertyChangeEvent &&
if (e instanceof IRegisters.IBitFieldChangedDMEvent) { ((PropertyChangeEvent)e).getProperty() == IDebugVMConstants.CURRENT_FORMAT_STORAGE) )
return IModelDelta.STATE;
}
if (e instanceof IMemory.IMemoryChangedEvent) {
return IModelDelta.CONTENT;
}
if (e instanceof PropertyChangeEvent &&
((PropertyChangeEvent)e).getProperty() == IDebugVMConstants.CURRENT_FORMAT_STORAGE)
{ {
return IModelDelta.CONTENT; return IModelDelta.CONTENT;
} }
if (e instanceof IBitFieldChangedDMEvent) {
return IModelDelta.STATE;
}
return IModelDelta.NO_CHANGE; return IModelDelta.NO_CHANGE;
} }
@ -533,28 +528,22 @@ public class RegisterBitFieldVMNode extends AbstractExpressionVMNode
* @see org.eclipse.dd.dsf.ui.viewmodel.IVMNode#buildDelta(java.lang.Object, org.eclipse.dd.dsf.ui.viewmodel.VMDelta, int, org.eclipse.dd.dsf.concurrent.RequestMonitor) * @see org.eclipse.dd.dsf.ui.viewmodel.IVMNode#buildDelta(java.lang.Object, org.eclipse.dd.dsf.ui.viewmodel.VMDelta, int, org.eclipse.dd.dsf.concurrent.RequestMonitor)
*/ */
public void buildDelta(Object e, VMDelta parentDelta, int nodeOffset, RequestMonitor rm) { public void buildDelta(Object e, VMDelta parentDelta, int nodeOffset, RequestMonitor rm) {
if (e instanceof IRunControl.ISuspendedDMEvent) { // The following events can affect any bit field's values,
// Create a delta that the whole register group has changed. // refresh the contents of the parent element (i.e. all the registers).
parentDelta.setFlags(parentDelta.getFlags() | IModelDelta.CONTENT); if ( e instanceof ISuspendedDMEvent ||
} e instanceof IMemoryChangedEvent ||
e instanceof IRegisterChangedDMEvent ||
if (e instanceof IRegisters.IBitFieldChangedDMEvent) { (e instanceof PropertyChangeEvent &&
/* ((PropertyChangeEvent)e).getProperty() == IDebugVMConstants.CURRENT_FORMAT_STORAGE) )
* Create a delta indicating the bit field has changed.
*/
parentDelta.addNode( createVMContext(((IRegisters.IBitFieldChangedDMEvent)e).getDMContext()), IModelDelta.STATE );
}
if (e instanceof IMemory.IMemoryChangedEvent) {
parentDelta.setFlags(parentDelta.getFlags() | IModelDelta.CONTENT);
}
if (e instanceof PropertyChangeEvent &&
((PropertyChangeEvent)e).getProperty() == IDebugVMConstants.CURRENT_FORMAT_STORAGE)
{ {
parentDelta.setFlags(parentDelta.getFlags() | IModelDelta.CONTENT); parentDelta.setFlags(parentDelta.getFlags() | IModelDelta.CONTENT);
} }
if (e instanceof IBitFieldChangedDMEvent) {
// Create a delta indicating that the value of bit field has changed.
parentDelta.addNode( createVMContext(((IBitFieldChangedDMEvent)e).getDMContext()), IModelDelta.STATE );
}
rm.done(); rm.done();
} }
@ -761,7 +750,7 @@ public class RegisterBitFieldVMNode extends AbstractExpressionVMNode
* @see org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.expression.IExpressionVMNode#getDeltaFlagsForExpression(org.eclipse.debug.core.model.IExpression, java.lang.Object) * @see org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.expression.IExpressionVMNode#getDeltaFlagsForExpression(org.eclipse.debug.core.model.IExpression, java.lang.Object)
*/ */
public int getDeltaFlagsForExpression(IExpression expression, Object event) { public int getDeltaFlagsForExpression(IExpression expression, Object event) {
if (event instanceof IRunControl.ISuspendedDMEvent) { if (event instanceof ISuspendedDMEvent) {
return IModelDelta.CONTENT; return IModelDelta.CONTENT;
} }
@ -770,7 +759,7 @@ public class RegisterBitFieldVMNode extends AbstractExpressionVMNode
return IModelDelta.CONTENT; return IModelDelta.CONTENT;
} }
if (event instanceof IMemory.IMemoryChangedEvent) { if (event instanceof IMemoryChangedEvent) {
return IModelDelta.CONTENT; return IModelDelta.CONTENT;
} }
@ -783,16 +772,11 @@ public class RegisterBitFieldVMNode extends AbstractExpressionVMNode
*/ */
public void buildDeltaForExpression(final IExpression expression, final int elementIdx, final Object event, final VMDelta parentDelta, final TreePath path, final RequestMonitor rm) public void buildDeltaForExpression(final IExpression expression, final int elementIdx, final Object event, final VMDelta parentDelta, final TreePath path, final RequestMonitor rm)
{ {
// Always refresh the contents of the view upon suspended event.
if (event instanceof ISuspendedDMEvent) { if (event instanceof ISuspendedDMEvent) {
// Mark the parent delta indicating that elements were added and/or removed.
parentDelta.setFlags(parentDelta.getFlags() | IModelDelta.CONTENT); parentDelta.setFlags(parentDelta.getFlags() | IModelDelta.CONTENT);
} }
else if (event instanceof IRegisters.IRegisterChangedDMEvent) {
parentDelta.setFlags(parentDelta.getFlags() | IModelDelta.CONTENT);
}
else if (event instanceof IMemory.IMemoryChangedEvent) {
parentDelta.setFlags(parentDelta.getFlags() | IModelDelta.CONTENT);
}
rm.done(); rm.done();
} }
@ -802,18 +786,14 @@ public class RegisterBitFieldVMNode extends AbstractExpressionVMNode
*/ */
public void buildDeltaForExpressionElement(Object element, int elementIdx, Object event, VMDelta parentDelta, final RequestMonitor rm) public void buildDeltaForExpressionElement(Object element, int elementIdx, Object event, VMDelta parentDelta, final RequestMonitor rm)
{ {
if (event instanceof IMemory.IMemoryChangedEvent) { // The following events can affect register values, refresh the state
parentDelta.addNode(element, IModelDelta.STATE); // of the expression.
} if ( event instanceof IRegisterChangedDMEvent ||
event instanceof IMemoryChangedEvent ||
if (event instanceof IBitFieldChangedDMEvent) { (event instanceof PropertyChangeEvent &&
parentDelta.addNode(element, IModelDelta.STATE); ((PropertyChangeEvent)event).getProperty() == IDebugVMConstants.CURRENT_FORMAT_STORAGE) )
}
if (event instanceof PropertyChangeEvent &&
((PropertyChangeEvent)event).getProperty() == IDebugVMConstants.CURRENT_FORMAT_STORAGE)
{ {
parentDelta.addNode(element, IModelDelta.CONTENT); parentDelta.addNode(element, IModelDelta.STATE);
} }
rm.done(); rm.done();

View file

@ -27,10 +27,11 @@ import org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.expression.Abs
import org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.expression.WatchExpressionCellModifier; import org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.expression.WatchExpressionCellModifier;
import org.eclipse.dd.dsf.debug.internal.ui.DsfDebugUIPlugin; import org.eclipse.dd.dsf.debug.internal.ui.DsfDebugUIPlugin;
import org.eclipse.dd.dsf.debug.service.IRegisters; import org.eclipse.dd.dsf.debug.service.IRegisters;
import org.eclipse.dd.dsf.debug.service.IRunControl;
import org.eclipse.dd.dsf.debug.service.IRegisters.IGroupChangedDMEvent; import org.eclipse.dd.dsf.debug.service.IRegisters.IGroupChangedDMEvent;
import org.eclipse.dd.dsf.debug.service.IRegisters.IGroupsChangedDMEvent;
import org.eclipse.dd.dsf.debug.service.IRegisters.IRegisterGroupDMContext; import org.eclipse.dd.dsf.debug.service.IRegisters.IRegisterGroupDMContext;
import org.eclipse.dd.dsf.debug.service.IRegisters.IRegisterGroupDMData; import org.eclipse.dd.dsf.debug.service.IRegisters.IRegisterGroupDMData;
import org.eclipse.dd.dsf.debug.service.IRunControl.ISuspendedDMEvent;
import org.eclipse.dd.dsf.service.DsfSession; import org.eclipse.dd.dsf.service.DsfSession;
import org.eclipse.dd.dsf.ui.concurrent.ViewerDataRequestMonitor; import org.eclipse.dd.dsf.ui.concurrent.ViewerDataRequestMonitor;
import org.eclipse.dd.dsf.ui.viewmodel.IVMContext; import org.eclipse.dd.dsf.ui.viewmodel.IVMContext;
@ -130,7 +131,7 @@ public class RegisterGroupVMNode extends AbstractExpressionVMNode
private WatchExpressionCellModifier fWatchExpressionCellModifier = new WatchExpressionCellModifier(); private WatchExpressionCellModifier fWatchExpressionCellModifier = new WatchExpressionCellModifier();
public RegisterGroupVMNode(AbstractDMVMProvider provider, DsfSession session, SyncRegisterDataAccess syncDataAccess) { public RegisterGroupVMNode(AbstractDMVMProvider provider, DsfSession session, SyncRegisterDataAccess syncDataAccess) {
super(provider, session, IRegisters.IRegisterGroupDMContext.class); super(provider, session, IRegisterGroupDMContext.class);
fSyncRegisterDataAccess = syncDataAccess; fSyncRegisterDataAccess = syncDataAccess;
} }
@ -303,13 +304,13 @@ public class RegisterGroupVMNode extends AbstractExpressionVMNode
* @see org.eclipse.dd.dsf.ui.viewmodel.IVMNode#getDeltaFlags(java.lang.Object) * @see org.eclipse.dd.dsf.ui.viewmodel.IVMNode#getDeltaFlags(java.lang.Object)
*/ */
public int getDeltaFlags(Object e) { public int getDeltaFlags(Object e) {
if (e instanceof IRunControl.ISuspendedDMEvent) { if (e instanceof ISuspendedDMEvent) {
return IModelDelta.CONTENT; return IModelDelta.CONTENT;
} }
else if (e instanceof IRegisters.IGroupsChangedDMEvent) { else if (e instanceof IGroupsChangedDMEvent) {
return IModelDelta.CONTENT; return IModelDelta.CONTENT;
} }
else if (e instanceof IRegisters.IGroupChangedDMEvent) { else if (e instanceof IGroupChangedDMEvent) {
return IModelDelta.STATE; return IModelDelta.STATE;
} }
return IModelDelta.NO_CHANGE; return IModelDelta.NO_CHANGE;
@ -320,15 +321,18 @@ public class RegisterGroupVMNode extends AbstractExpressionVMNode
* @see org.eclipse.dd.dsf.ui.viewmodel.IVMNode#buildDelta(java.lang.Object, org.eclipse.dd.dsf.ui.viewmodel.VMDelta, int, org.eclipse.dd.dsf.concurrent.RequestMonitor) * @see org.eclipse.dd.dsf.ui.viewmodel.IVMNode#buildDelta(java.lang.Object, org.eclipse.dd.dsf.ui.viewmodel.VMDelta, int, org.eclipse.dd.dsf.concurrent.RequestMonitor)
*/ */
public void buildDelta(Object e, VMDelta parentDelta, int nodeOffset, RequestMonitor rm) { public void buildDelta(Object e, VMDelta parentDelta, int nodeOffset, RequestMonitor rm) {
if (e instanceof IRunControl.ISuspendedDMEvent) { // Although the register groups themselves are not affected by the
// suspended event, typically all the registers are. Add a CONTENT changed
// flag to the parent to repaint all the groups and their registers.
if (e instanceof ISuspendedDMEvent) {
// Create a delta that indicates all groups have changed // Create a delta that indicates all groups have changed
parentDelta.setFlags(parentDelta.getFlags() | IModelDelta.CONTENT); parentDelta.setFlags(parentDelta.getFlags() | IModelDelta.CONTENT);
} }
else if (e instanceof IRegisters.IGroupsChangedDMEvent) { else if (e instanceof IGroupsChangedDMEvent) {
// Create a delta that indicates all groups have changed // Create a delta that indicates all groups have changed
parentDelta.setFlags(parentDelta.getFlags() | IModelDelta.CONTENT); parentDelta.setFlags(parentDelta.getFlags() | IModelDelta.CONTENT);
} }
else if (e instanceof IRegisters.IGroupChangedDMEvent) { else if (e instanceof IGroupChangedDMEvent) {
// Create a delta that indicates that specific group changed // Create a delta that indicates that specific group changed
parentDelta.addNode( createVMContext(((IGroupChangedDMEvent)e).getDMContext()), IModelDelta.STATE ); parentDelta.addNode( createVMContext(((IGroupChangedDMEvent)e).getDMContext()), IModelDelta.STATE );
} }
@ -365,10 +369,17 @@ public class RegisterGroupVMNode extends AbstractExpressionVMNode
* @see org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.expression.IExpressionVMNode#getDeltaFlagsForExpression(org.eclipse.debug.core.model.IExpression, java.lang.Object) * @see org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.expression.IExpressionVMNode#getDeltaFlagsForExpression(org.eclipse.debug.core.model.IExpression, java.lang.Object)
*/ */
public int getDeltaFlagsForExpression(IExpression expression, Object event) { public int getDeltaFlagsForExpression(IExpression expression, Object event) {
if (event instanceof IRunControl.ISuspendedDMEvent) {
if (event instanceof ISuspendedDMEvent ||
event instanceof IGroupsChangedDMEvent)
{
return IModelDelta.CONTENT; return IModelDelta.CONTENT;
} }
if (event instanceof IGroupChangedDMEvent) {
return IModelDelta.STATE;
}
return IModelDelta.NO_CHANGE; return IModelDelta.NO_CHANGE;
} }
@ -379,10 +390,19 @@ public class RegisterGroupVMNode extends AbstractExpressionVMNode
public void buildDeltaForExpression(IExpression expression, int elementIdx, Object event, VMDelta parentDelta, public void buildDeltaForExpression(IExpression expression, int elementIdx, Object event, VMDelta parentDelta,
TreePath path, RequestMonitor rm) TreePath path, RequestMonitor rm)
{ {
if (event instanceof IRunControl.ISuspendedDMEvent) { if (event instanceof ISuspendedDMEvent) {
// Mark the parent delta indicating that elements were added and/or removed. // Mark the parent delta indicating that elements were added and/or removed.
parentDelta.setFlags(parentDelta.getFlags() | IModelDelta.CONTENT); parentDelta.setFlags(parentDelta.getFlags() | IModelDelta.CONTENT);
} }
// If the group definitions have changed, refresh the whole expressions
// view contents since previously invalid expressions may now evaluate
// to valid groups
if (event instanceof IGroupsChangedDMEvent) {
parentDelta.setFlags(parentDelta.getFlags() | IModelDelta.CONTENT);
}
rm.done(); rm.done();
} }
@ -392,10 +412,7 @@ public class RegisterGroupVMNode extends AbstractExpressionVMNode
*/ */
public void buildDeltaForExpressionElement(Object element, int elementIdx, Object event, VMDelta parentDelta, final RequestMonitor rm) public void buildDeltaForExpressionElement(Object element, int elementIdx, Object event, VMDelta parentDelta, final RequestMonitor rm)
{ {
if (event instanceof IRegisters.IGroupsChangedDMEvent) { if (event instanceof IGroupChangedDMEvent) {
parentDelta.addNode(element, IModelDelta.CONTENT);
}
if (event instanceof IRegisters.IGroupChangedDMEvent) {
parentDelta.addNode(element, IModelDelta.STATE); parentDelta.addNode(element, IModelDelta.STATE);
} }
rm.done(); rm.done();

View file

@ -28,15 +28,16 @@ import org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.numberformat.I
import org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.numberformat.IFormattedValueVMContext; import org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.numberformat.IFormattedValueVMContext;
import org.eclipse.dd.dsf.debug.internal.ui.DsfDebugUIPlugin; import org.eclipse.dd.dsf.debug.internal.ui.DsfDebugUIPlugin;
import org.eclipse.dd.dsf.debug.service.IFormattedValues; import org.eclipse.dd.dsf.debug.service.IFormattedValues;
import org.eclipse.dd.dsf.debug.service.IMemory;
import org.eclipse.dd.dsf.debug.service.IRegisters; import org.eclipse.dd.dsf.debug.service.IRegisters;
import org.eclipse.dd.dsf.debug.service.IRunControl;
import org.eclipse.dd.dsf.debug.service.IFormattedValues.FormattedValueDMContext; import org.eclipse.dd.dsf.debug.service.IFormattedValues.FormattedValueDMContext;
import org.eclipse.dd.dsf.debug.service.IFormattedValues.FormattedValueDMData; import org.eclipse.dd.dsf.debug.service.IFormattedValues.FormattedValueDMData;
import org.eclipse.dd.dsf.debug.service.IMemory.IMemoryChangedEvent;
import org.eclipse.dd.dsf.debug.service.IRegisters.IRegisterChangedDMEvent; import org.eclipse.dd.dsf.debug.service.IRegisters.IRegisterChangedDMEvent;
import org.eclipse.dd.dsf.debug.service.IRegisters.IRegisterDMContext; import org.eclipse.dd.dsf.debug.service.IRegisters.IRegisterDMContext;
import org.eclipse.dd.dsf.debug.service.IRegisters.IRegisterDMData; import org.eclipse.dd.dsf.debug.service.IRegisters.IRegisterDMData;
import org.eclipse.dd.dsf.debug.service.IRegisters.IRegisterGroupDMData; import org.eclipse.dd.dsf.debug.service.IRegisters.IRegisterGroupDMData;
import org.eclipse.dd.dsf.debug.service.IRegisters.IRegistersChangedDMEvent;
import org.eclipse.dd.dsf.debug.service.IRunControl.ISuspendedDMEvent;
import org.eclipse.dd.dsf.service.DsfSession; import org.eclipse.dd.dsf.service.DsfSession;
import org.eclipse.dd.dsf.ui.concurrent.ViewerDataRequestMonitor; import org.eclipse.dd.dsf.ui.concurrent.ViewerDataRequestMonitor;
import org.eclipse.dd.dsf.ui.viewmodel.IVMContext; import org.eclipse.dd.dsf.ui.viewmodel.IVMContext;
@ -53,6 +54,7 @@ import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementEditor;
import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementLabelProvider; import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementLabelProvider;
import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementMementoProvider; import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementMementoProvider;
import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementMementoRequest; import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementMementoRequest;
import org.eclipse.debug.internal.ui.viewers.model.provisional.IHasChildrenUpdate;
import org.eclipse.debug.internal.ui.viewers.model.provisional.ILabelUpdate; import org.eclipse.debug.internal.ui.viewers.model.provisional.ILabelUpdate;
import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta; import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta;
import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext; import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
@ -146,7 +148,7 @@ public class RegisterVMNode extends AbstractExpressionVMNode
private final IFormattedValuePreferenceStore fFormattedPrefStore; private final IFormattedValuePreferenceStore fFormattedPrefStore;
public RegisterVMNode(IFormattedValuePreferenceStore prefStore, AbstractDMVMProvider provider, DsfSession session, SyncRegisterDataAccess syncDataAccess) { public RegisterVMNode(IFormattedValuePreferenceStore prefStore, AbstractDMVMProvider provider, DsfSession session, SyncRegisterDataAccess syncDataAccess) {
super(provider, session, IRegisters.IRegisterDMContext.class); super(provider, session, IRegisterDMContext.class);
fSyncRegisterDataAccess = syncDataAccess; fSyncRegisterDataAccess = syncDataAccess;
fFormattedPrefStore = prefStore; fFormattedPrefStore = prefStore;
} }
@ -306,7 +308,7 @@ public class RegisterVMNode extends AbstractExpressionVMNode
protected void updateLabelInSessionThread(ILabelUpdate[] updates) { protected void updateLabelInSessionThread(ILabelUpdate[] updates) {
for (final ILabelUpdate update : updates) { for (final ILabelUpdate update : updates) {
final IRegisterDMContext dmc = findDmcInPath(update.getViewerInput(), update.getElementPath(), IRegisters.IRegisterDMContext.class); final IRegisterDMContext dmc = findDmcInPath(update.getViewerInput(), update.getElementPath(), IRegisterDMContext.class);
if ( dmc == null ) { if ( dmc == null ) {
handleFailedUpdate(update); handleFailedUpdate(update);
continue; continue;
@ -455,6 +457,16 @@ public class RegisterVMNode extends AbstractExpressionVMNode
} }
} }
@Override
public void update(IHasChildrenUpdate[] updates) {
// As an optimization, always indicate that register groups have
// children.
for (IHasChildrenUpdate update : updates) {
update.setHasChilren(true);
update.done();
}
}
/* /*
* (non-Javadoc) * (non-Javadoc)
* @see org.eclipse.dd.dsf.ui.viewmodel.datamodel.AbstractDMVMNode#updateElementsInSessionThread(org.eclipse.debug.internal.ui.viewers.model.provisional.IChildrenUpdate) * @see org.eclipse.dd.dsf.ui.viewmodel.datamodel.AbstractDMVMNode#updateElementsInSessionThread(org.eclipse.debug.internal.ui.viewers.model.provisional.IChildrenUpdate)
@ -498,32 +510,19 @@ public class RegisterVMNode extends AbstractExpressionVMNode
* @see org.eclipse.dd.dsf.ui.viewmodel.IVMNode#getDeltaFlags(java.lang.Object) * @see org.eclipse.dd.dsf.ui.viewmodel.IVMNode#getDeltaFlags(java.lang.Object)
*/ */
public int getDeltaFlags(Object e) { public int getDeltaFlags(Object e) {
if (e instanceof IRunControl.ISuspendedDMEvent) { if ( e instanceof ISuspendedDMEvent ||
return IModelDelta.CONTENT; e instanceof IMemoryChangedEvent ||
} e instanceof IRegistersChangedDMEvent ||
(e instanceof PropertyChangeEvent &&
if (e instanceof IRegisters.IRegistersChangedDMEvent) { ((PropertyChangeEvent)e).getProperty() == IDebugVMConstants.CURRENT_FORMAT_STORAGE) )
return IModelDelta.CONTENT;
}
if (e instanceof IMemory.IMemoryChangedEvent) {
return IModelDelta.CONTENT;
}
if (e instanceof IRegisters.IRegisterChangedDMEvent) {
/*
* Logically one would think that STATE should be specified here. But we specify CONTENT
* as well so that if there are sub-registers ( BIT FIELDS ) they will be forced to update
* and show new values when the total register changes.
*/
return IModelDelta.CONTENT;
}
if (e instanceof PropertyChangeEvent &&
((PropertyChangeEvent)e).getProperty() == IDebugVMConstants.CURRENT_FORMAT_STORAGE)
{ {
return IModelDelta.CONTENT; return IModelDelta.CONTENT;
} }
if (e instanceof IRegisterChangedDMEvent) {
return IModelDelta.STATE;
}
return IModelDelta.NO_CHANGE; return IModelDelta.NO_CHANGE;
} }
@ -532,28 +531,20 @@ public class RegisterVMNode extends AbstractExpressionVMNode
* @see org.eclipse.dd.dsf.ui.viewmodel.IVMNode#buildDelta(java.lang.Object, org.eclipse.dd.dsf.ui.viewmodel.VMDelta, int, org.eclipse.dd.dsf.concurrent.RequestMonitor) * @see org.eclipse.dd.dsf.ui.viewmodel.IVMNode#buildDelta(java.lang.Object, org.eclipse.dd.dsf.ui.viewmodel.VMDelta, int, org.eclipse.dd.dsf.concurrent.RequestMonitor)
*/ */
public void buildDelta(Object e, VMDelta parentDelta, int nodeOffset, RequestMonitor rm) { public void buildDelta(Object e, VMDelta parentDelta, int nodeOffset, RequestMonitor rm) {
if (e instanceof IRunControl.ISuspendedDMEvent) { // The following events can affect any register's values,
// refresh the contents of the parent element (i.e. all the registers).
if ( e instanceof ISuspendedDMEvent ||
e instanceof IMemoryChangedEvent ||
e instanceof IRegistersChangedDMEvent ||
(e instanceof PropertyChangeEvent &&
((PropertyChangeEvent)e).getProperty() == IDebugVMConstants.CURRENT_FORMAT_STORAGE) )
{
// Create a delta that the whole register group has changed. // Create a delta that the whole register group has changed.
parentDelta.setFlags(parentDelta.getFlags() | IModelDelta.CONTENT); parentDelta.setFlags(parentDelta.getFlags() | IModelDelta.CONTENT);
} }
if (e instanceof IRegisters.IRegistersChangedDMEvent) { if (e instanceof IRegisterChangedDMEvent) {
parentDelta.setFlags(parentDelta.getFlags() | IModelDelta.CONTENT);; parentDelta.addNode( createVMContext(((IRegisterChangedDMEvent)e).getDMContext()), IModelDelta.STATE );
}
if (e instanceof IMemory.IMemoryChangedEvent) {
// Mark the parent delta indicating that elements were added and/or removed.
parentDelta.setFlags(parentDelta.getFlags() | IModelDelta.CONTENT);
}
if (e instanceof IRegisters.IRegisterChangedDMEvent) {
parentDelta.addNode( createVMContext(((IRegisterChangedDMEvent)e).getDMContext()), IModelDelta.CONTENT | IModelDelta.STATE );
}
if (e instanceof PropertyChangeEvent &&
((PropertyChangeEvent)e).getProperty() == IDebugVMConstants.CURRENT_FORMAT_STORAGE)
{
parentDelta.setFlags(parentDelta.getFlags() | IModelDelta.CONTENT);
} }
rm.done(); rm.done();
@ -563,7 +554,6 @@ public class RegisterVMNode extends AbstractExpressionVMNode
* Expected format: GRP( GroupName ).REG( RegisterName ) * Expected format: GRP( GroupName ).REG( RegisterName )
* or: $RegisterName * or: $RegisterName
*/ */
public boolean canParseExpression(IExpression expression) { public boolean canParseExpression(IExpression expression) {
return parseExpressionForRegisterName(expression.getExpressionText()) != null; return parseExpressionForRegisterName(expression.getExpressionText()) != null;
} }
@ -670,17 +660,18 @@ public class RegisterVMNode extends AbstractExpressionVMNode
* @see org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.expression.IExpressionVMNode#getDeltaFlagsForExpression(org.eclipse.debug.core.model.IExpression, java.lang.Object) * @see org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.expression.IExpressionVMNode#getDeltaFlagsForExpression(org.eclipse.debug.core.model.IExpression, java.lang.Object)
*/ */
public int getDeltaFlagsForExpression(IExpression expression, Object event) { public int getDeltaFlagsForExpression(IExpression expression, Object event) {
if (event instanceof IRunControl.ISuspendedDMEvent) { if ( event instanceof IRegisterChangedDMEvent ||
return IModelDelta.CONTENT; event instanceof IMemoryChangedEvent ||
} (event instanceof PropertyChangeEvent &&
if (event instanceof PropertyChangeEvent && ((PropertyChangeEvent)event).getProperty() == IDebugVMConstants.CURRENT_FORMAT_STORAGE) )
((PropertyChangeEvent)event).getProperty() == IDebugVMConstants.CURRENT_FORMAT_STORAGE)
{ {
return IModelDelta.CONTENT; return IModelDelta.STATE;
} }
if (event instanceof IMemory.IMemoryChangedEvent) { if (event instanceof IRegistersChangedDMEvent ||
return IModelDelta.CONTENT; event instanceof ISuspendedDMEvent)
{
return IModelDelta.CONTENT;
} }
return IModelDelta.NO_CHANGE; return IModelDelta.NO_CHANGE;
@ -693,13 +684,17 @@ public class RegisterVMNode extends AbstractExpressionVMNode
public void buildDeltaForExpression(IExpression expression, int elementIdx, Object event, VMDelta parentDelta, public void buildDeltaForExpression(IExpression expression, int elementIdx, Object event, VMDelta parentDelta,
TreePath path, RequestMonitor rm) TreePath path, RequestMonitor rm)
{ {
if (event instanceof IRunControl.ISuspendedDMEvent) { // If the register definition has changed, refresh all the
// Mark the parent delta indicating that elements were added and/or removed. // expressions in the expression manager. This is because some
parentDelta.setFlags(parentDelta.getFlags() | IModelDelta.CONTENT); // expressions that were previously invalid, may now represent new
// registers.
if (event instanceof IRegistersChangedDMEvent) {
parentDelta.setFlags(parentDelta.getFlags() | IModelDelta.CONTENT);
} }
if (event instanceof IMemory.IMemoryChangedEvent) { // Always refresh the contents of the view upon suspended event.
parentDelta.setFlags(parentDelta.getFlags() | IModelDelta.CONTENT); if (event instanceof ISuspendedDMEvent) {
parentDelta.setFlags(parentDelta.getFlags() | IModelDelta.CONTENT);
} }
rm.done(); rm.done();
@ -711,22 +706,14 @@ public class RegisterVMNode extends AbstractExpressionVMNode
*/ */
public void buildDeltaForExpressionElement(Object element, int elementIdx, Object event, VMDelta parentDelta, final RequestMonitor rm) public void buildDeltaForExpressionElement(Object element, int elementIdx, Object event, VMDelta parentDelta, final RequestMonitor rm)
{ {
if (event instanceof IRegisters.IRegisterChangedDMEvent) { // The following events can affect register values, refresh the state
parentDelta.addNode(element, IModelDelta.STATE); // of the expression.
} if ( event instanceof IRegisterChangedDMEvent ||
event instanceof IMemoryChangedEvent ||
if (event instanceof IRegisters.IRegistersChangedDMEvent) { (event instanceof PropertyChangeEvent &&
parentDelta.addNode(element, IModelDelta.STATE); ((PropertyChangeEvent)event).getProperty() == IDebugVMConstants.CURRENT_FORMAT_STORAGE) )
}
if (event instanceof IMemory.IMemoryChangedEvent) {
parentDelta.addNode(element, IModelDelta.CONTENT);
}
if (event instanceof PropertyChangeEvent &&
((PropertyChangeEvent)event).getProperty() == IDebugVMConstants.CURRENT_FORMAT_STORAGE)
{ {
parentDelta.addNode(element, IModelDelta.CONTENT); parentDelta.addNode(element, IModelDelta.STATE);
} }
rm.done(); rm.done();

View file

@ -34,13 +34,14 @@ import org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.numberformat.I
import org.eclipse.dd.dsf.debug.internal.ui.DsfDebugUIPlugin; import org.eclipse.dd.dsf.debug.internal.ui.DsfDebugUIPlugin;
import org.eclipse.dd.dsf.debug.service.IExpressions; import org.eclipse.dd.dsf.debug.service.IExpressions;
import org.eclipse.dd.dsf.debug.service.IFormattedValues; import org.eclipse.dd.dsf.debug.service.IFormattedValues;
import org.eclipse.dd.dsf.debug.service.IMemory;
import org.eclipse.dd.dsf.debug.service.IRunControl;
import org.eclipse.dd.dsf.debug.service.IStack; import org.eclipse.dd.dsf.debug.service.IStack;
import org.eclipse.dd.dsf.debug.service.IExpressions.IExpressionChangedDMEvent;
import org.eclipse.dd.dsf.debug.service.IExpressions.IExpressionDMContext; import org.eclipse.dd.dsf.debug.service.IExpressions.IExpressionDMContext;
import org.eclipse.dd.dsf.debug.service.IExpressions.IExpressionDMData; import org.eclipse.dd.dsf.debug.service.IExpressions.IExpressionDMData;
import org.eclipse.dd.dsf.debug.service.IFormattedValues.FormattedValueDMContext; import org.eclipse.dd.dsf.debug.service.IFormattedValues.FormattedValueDMContext;
import org.eclipse.dd.dsf.debug.service.IFormattedValues.FormattedValueDMData; import org.eclipse.dd.dsf.debug.service.IFormattedValues.FormattedValueDMData;
import org.eclipse.dd.dsf.debug.service.IMemory.IMemoryChangedEvent;
import org.eclipse.dd.dsf.debug.service.IRunControl.ISuspendedDMEvent;
import org.eclipse.dd.dsf.debug.service.IStack.IFrameDMContext; import org.eclipse.dd.dsf.debug.service.IStack.IFrameDMContext;
import org.eclipse.dd.dsf.debug.service.IStack.IVariableDMContext; import org.eclipse.dd.dsf.debug.service.IStack.IVariableDMContext;
import org.eclipse.dd.dsf.debug.service.IStack.IVariableDMData; import org.eclipse.dd.dsf.debug.service.IStack.IVariableDMData;
@ -78,49 +79,6 @@ public class VariableVMNode extends AbstractExpressionVMNode
implements IElementEditor, IElementLabelProvider, IElementMementoProvider implements IElementEditor, IElementLabelProvider, IElementMementoProvider
{ {
//private final static int MAX_STRING_VALUE_LENGTH = 40;
public int getDeltaFlags(Object e) {
/*
* @see buildDelta()
*/
// When an expression changes or memory, we must do a full refresh
// see Bug 213061 and Bug 214550
if (e instanceof IRunControl.ISuspendedDMEvent ||
e instanceof IExpressions.IExpressionChangedDMEvent ||
e instanceof IMemory.IMemoryChangedEvent) {
return IModelDelta.CONTENT;
}
if (e instanceof PropertyChangeEvent &&
((PropertyChangeEvent)e).getProperty() == IDebugVMConstants.CURRENT_FORMAT_STORAGE)
{
return IModelDelta.CONTENT;
}
return IModelDelta.NO_CHANGE;
}
public void buildDelta(final Object event, final VMDelta parentDelta, final int nodeOffset, final RequestMonitor requestMonitor) {
// When an expression changes or memory, we must do a full refresh
// see Bug 213061 and Bug 214550
if (event instanceof IRunControl.ISuspendedDMEvent ||
event instanceof IExpressions.IExpressionChangedDMEvent ||
event instanceof IMemory.IMemoryChangedEvent) {
parentDelta.setFlags(parentDelta.getFlags() | IModelDelta.CONTENT);
}
if (event instanceof PropertyChangeEvent &&
((PropertyChangeEvent)event).getProperty() == IDebugVMConstants.CURRENT_FORMAT_STORAGE)
{
parentDelta.setFlags(parentDelta.getFlags() | IModelDelta.CONTENT);
}
requestMonitor.done();
}
private final IFormattedValuePreferenceStore fFormattedPrefStore; private final IFormattedValuePreferenceStore fFormattedPrefStore;
private final SyncVariableDataAccess fSyncVariableDataAccess; private final SyncVariableDataAccess fSyncVariableDataAccess;
@ -519,49 +477,6 @@ public class VariableVMNode extends AbstractExpressionVMNode
} }
} }
public int getDeltaFlagsForExpression(IExpression expression, Object event) {
// When an expression changes or memory, we must do a full refresh
// see Bug 213061 and Bug 214550
if (event instanceof IRunControl.ISuspendedDMEvent ||
event instanceof IExpressions.IExpressionChangedDMEvent ||
event instanceof IMemory.IMemoryChangedEvent) {
return IModelDelta.CONTENT;
}
if (event instanceof PropertyChangeEvent &&
((PropertyChangeEvent)event).getProperty() == IDebugVMConstants.CURRENT_FORMAT_STORAGE)
{
return IModelDelta.CONTENT;
}
return IModelDelta.NO_CHANGE;
}
public void buildDeltaForExpression(IExpression expression, int elementIdx, Object event, VMDelta parentDelta,
TreePath path, RequestMonitor rm)
{
rm.done();
}
public void buildDeltaForExpressionElement(Object element, int elementIdx, Object event, VMDelta parentDelta,
RequestMonitor rm)
{
// When an expression changes or memory, we must do a full refresh
// see Bug 213061 and Bug 214550
if (event instanceof IRunControl.ISuspendedDMEvent ||
event instanceof IExpressions.IExpressionChangedDMEvent ||
event instanceof IMemory.IMemoryChangedEvent) {
parentDelta.setFlags(parentDelta.getFlags() | IModelDelta.CONTENT);
}
if (event instanceof PropertyChangeEvent &&
((PropertyChangeEvent)event).getProperty() == IDebugVMConstants.CURRENT_FORMAT_STORAGE)
{
parentDelta.addNode(element, IModelDelta.CONTENT);
}
rm.done();
}
@Override @Override
protected void updateElementsInSessionThread(final IChildrenUpdate update) { protected void updateElementsInSessionThread(final IChildrenUpdate update) {
// Get the data model context object for the current node in the hierarchy. // Get the data model context object for the current node in the hierarchy.
@ -730,6 +645,85 @@ public class VariableVMNode extends AbstractExpressionVMNode
stackFrameService.getLocals(frameDmc, rm); stackFrameService.getLocals(frameDmc, rm);
} }
//private final static int MAX_STRING_VALUE_LENGTH = 40;
public int getDeltaFlags(Object e) {
if ( e instanceof ISuspendedDMEvent ||
e instanceof IMemoryChangedEvent ||
e instanceof IExpressionChangedDMEvent ||
(e instanceof PropertyChangeEvent &&
((PropertyChangeEvent)e).getProperty() == IDebugVMConstants.CURRENT_FORMAT_STORAGE) )
{
// Create a delta that the whole register group has changed.
return IModelDelta.CONTENT;
}
return IModelDelta.NO_CHANGE;
}
public void buildDelta(final Object e, final VMDelta parentDelta, final int nodeOffset, final RequestMonitor requestMonitor) {
// The following events can affect any expression's values,
// refresh the contents of the parent element (i.e. all the expressions).
if ( e instanceof ISuspendedDMEvent ||
e instanceof IMemoryChangedEvent ||
e instanceof IExpressionChangedDMEvent ||
(e instanceof PropertyChangeEvent &&
((PropertyChangeEvent)e).getProperty() == IDebugVMConstants.CURRENT_FORMAT_STORAGE) )
{
// Create a delta that the whole register group has changed.
parentDelta.setFlags(parentDelta.getFlags() | IModelDelta.CONTENT);
}
requestMonitor.done();
}
public int getDeltaFlagsForExpression(IExpression expression, Object event) {
if ( event instanceof IExpressionChangedDMEvent ||
event instanceof IMemoryChangedEvent ||
(event instanceof PropertyChangeEvent &&
((PropertyChangeEvent)event).getProperty() == IDebugVMConstants.CURRENT_FORMAT_STORAGE) )
{
return IModelDelta.STATE;
}
if (event instanceof ISuspendedDMEvent)
{
return IModelDelta.CONTENT;
}
return IModelDelta.NO_CHANGE;
}
public void buildDeltaForExpression(IExpression expression, int elementIdx, Object event, VMDelta parentDelta,
TreePath path, RequestMonitor rm)
{
// Always refresh the contents of the view upon suspended event.
if (event instanceof ISuspendedDMEvent) {
parentDelta.setFlags(parentDelta.getFlags() | IModelDelta.CONTENT);
}
rm.done();
}
public void buildDeltaForExpressionElement(Object element, int elementIdx, Object event, VMDelta parentDelta,
RequestMonitor rm)
{
// The following events can affect expression values, refresh the state
// of the expression.
if ( event instanceof IExpressionChangedDMEvent ||
event instanceof IMemoryChangedEvent ||
(event instanceof PropertyChangeEvent &&
((PropertyChangeEvent)event).getProperty() == IDebugVMConstants.CURRENT_FORMAT_STORAGE) )
{
parentDelta.addNode(element, IModelDelta.STATE);
}
rm.done();
}
/* /*
* (non-Javadoc) * (non-Javadoc)
* @see org.eclipse.debug.internal.ui.viewers.model.provisional.IElementMementoProvider#compareElements(org.eclipse.debug.internal.ui.viewers.model.provisional.IElementCompareRequest[]) * @see org.eclipse.debug.internal.ui.viewers.model.provisional.IElementMementoProvider#compareElements(org.eclipse.debug.internal.ui.viewers.model.provisional.IElementCompareRequest[])

View file

@ -97,7 +97,7 @@ public interface IFormattedValues extends IDMService {
@Override @Override
public String toString() { public String toString() {
return super.toString() + ".format(" + getFormatID() + ")"; //$NON-NLS-1$ //$NON-NLS-2$ return baseToString() + ".format(" + getFormatID() + ")"; //$NON-NLS-1$ //$NON-NLS-2$
} }
} }
@ -112,5 +112,7 @@ public interface IFormattedValues extends IDMService {
public String getFormattedValue() { public String getFormattedValue() {
return fValue; return fValue;
} }
} }
} }