diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/MIExpressions.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/MIExpressions.java index bc01af2fc03..a0b8f1898bf 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/MIExpressions.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/MIExpressions.java @@ -11,7 +11,6 @@ *******************************************************************************/ package org.eclipse.cdt.dsf.mi.service; -import java.util.Arrays; import java.util.HashMap; import java.util.Hashtable; import java.util.Map; @@ -755,15 +754,42 @@ public class MIExpressions extends AbstractDsfService implements IExpressions, I */ public void getSubExpressions(IExpressionDMContext exprCtx, final int startIndex, final int length, final DataRequestMonitor rm) { - getSubExpressions( - exprCtx, - new DataRequestMonitor(getExecutor(), rm) { - @Override - protected void handleSuccess() { - rm.setData((IExpressionDMContext[])Arrays.asList(getData()).subList(startIndex, startIndex + length).toArray()); - rm.done(); - } - }); + + if (startIndex < 0 || length < 0) { + rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, INVALID_HANDLE, "Invalid range for evaluating sub expressions.", null)); //$NON-NLS-1$ + rm.done(); + return; + } + + if (exprCtx instanceof MIExpressionDMC) { + getSubExpressions( + exprCtx, + new DataRequestMonitor(getExecutor(), rm) { + @Override + protected void handleSuccess() { + IExpressionDMContext[] subExpressions = getData(); + + if (startIndex >= subExpressions.length || startIndex + length > subExpressions.length) { + rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, INVALID_HANDLE, "Invalid range for evaluating sub expressions.", null)); //$NON-NLS-1$ + rm.done(); + return; + } + + IExpressionDMContext[] subRange = new IExpressionDMContext[length]; + for (int i=0; i