diff --git a/plugins/org.eclipse.dd.dsf.ui/src/org/eclipse/dd/dsf/ui/viewmodel/VMElementsUpdate.java b/plugins/org.eclipse.dd.dsf.ui/src/org/eclipse/dd/dsf/ui/viewmodel/VMElementsUpdate.java index 796edc4a6a3..4de36383354 100644 --- a/plugins/org.eclipse.dd.dsf.ui/src/org/eclipse/dd/dsf/ui/viewmodel/VMElementsUpdate.java +++ b/plugins/org.eclipse.dd.dsf.ui/src/org/eclipse/dd/dsf/ui/viewmodel/VMElementsUpdate.java @@ -29,7 +29,7 @@ import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementContentPr public class VMElementsUpdate extends VMViewerUpdate implements IChildrenUpdate { private final int fOffset; private final int fLength; - private final List fElements; + protected final List fElements; public VMElementsUpdate(IChildrenUpdate clientUpdate, int offset, int length, DataRequestMonitor> requestMonitor) { super(clientUpdate, requestMonitor); diff --git a/plugins/org.eclipse.dd.dsf.ui/src/org/eclipse/dd/dsf/ui/viewmodel/dm/AbstractDMVMLayoutNode.java b/plugins/org.eclipse.dd.dsf.ui/src/org/eclipse/dd/dsf/ui/viewmodel/dm/AbstractDMVMLayoutNode.java index 8b49e0d2ed2..7ddb7a4f513 100644 --- a/plugins/org.eclipse.dd.dsf.ui/src/org/eclipse/dd/dsf/ui/viewmodel/dm/AbstractDMVMLayoutNode.java +++ b/plugins/org.eclipse.dd.dsf.ui/src/org/eclipse/dd/dsf/ui/viewmodel/dm/AbstractDMVMLayoutNode.java @@ -504,7 +504,9 @@ abstract public class AbstractDMVMLayoutNode extends Abstract protected void fillUpdateWithVMCs(IChildrenUpdate update, IDMContext[] dmcs) { int startIdx = update.getOffset() != -1 ? update.getOffset() : 0; int endIdx = update.getLength() != -1 ? startIdx + update.getLength() : dmcs.length; - for (int i = startIdx; i < endIdx; i++) { + // Ted: added bounds limitation of dmcs.length + // see https://bugs.eclipse.org/bugs/show_bug.cgi?id=202109 + for (int i = startIdx; i < endIdx && i < dmcs.length; i++) { update.setChild(createVMContext(dmcs[i]), i); } } diff --git a/plugins/org.eclipse.dd.dsf.ui/src/org/eclipse/dd/dsf/ui/viewmodel/update/VMCache.java b/plugins/org.eclipse.dd.dsf.ui/src/org/eclipse/dd/dsf/ui/viewmodel/update/VMCache.java index 3622c0b995b..0e3f337c41e 100644 --- a/plugins/org.eclipse.dd.dsf.ui/src/org/eclipse/dd/dsf/ui/viewmodel/update/VMCache.java +++ b/plugins/org.eclipse.dd.dsf.ui/src/org/eclipse/dd/dsf/ui/viewmodel/update/VMCache.java @@ -272,9 +272,9 @@ public abstract class VMCache @Override protected void handleCompleted() { - if(getStatus().isOK()) + if(getData() != null) { - for(int j = 0; j < update.getLength(); j++) + for(int j = 0; j < getData().size(); j++) { if(isCacheWriteEnabled()) { @@ -289,7 +289,43 @@ public abstract class VMCache } update.done(); } - }); + }) + { + /* See https://bugs.eclipse.org/bugs/show_bug.cgi?id=202109 + * + * A flexible hierarchy bug/optimization causes query with incorrect + * IChildrenUpdate[] array length. + * + * We found this while deleting a register node. Example: + * + * the register view displays: + * PC + * EAX + * EBX + * ECX + * EDX + * + * we delete EBX and force a context refresh. + * + * flexible hierarchy queries for IChildrenUpdate[5] and IChildrenCountUpdate at + * the same time. + * + * VMElementsUpdate, used by VMCache to wrap the IChildrenUpdate, generates an + * IStatus.ERROR with message "Incomplete elements of updates" when fElements + * count (provided by service) does not match the length provided by the original + * update query. + * + * Workaround, respect getData() != null instead of IStatus.OK, override + * VMElementsUpdate.done() to set elements regardless of count + */ + @Override + public void done() { + @SuppressWarnings("unchecked") + DataRequestMonitor> rm = (DataRequestMonitor>)fRequestMonitor; + rm.setData(fElements); + super.done(); + } + }; } return updates;