Skip to content

Commit d8fb6ab

Browse files
authored
Cleanup ObjectComparison for getting suspended thread (#727)
Use DebugUITools.getDebugContext() to get suspended thread if thread received by first index is not a suspended one Fixes : #726
1 parent 1fa5611 commit d8fb6ab

File tree

1 file changed

+24
-6
lines changed

1 file changed

+24
-6
lines changed

org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/ObjectComparison.java

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,12 @@
2525

2626
import org.eclipse.debug.core.DebugException;
2727
import org.eclipse.debug.core.model.IVariable;
28+
import org.eclipse.debug.ui.DebugUITools;
2829
import org.eclipse.jdt.debug.core.IJavaObject;
2930
import org.eclipse.jdt.debug.core.IJavaThread;
3031
import org.eclipse.jdt.debug.core.IJavaValue;
3132
import org.eclipse.jdt.debug.core.IJavaVariable;
33+
import org.eclipse.jdt.internal.debug.core.model.JDIStackFrame;
3234
import org.eclipse.jface.viewers.IStructuredSelection;
3335
import org.eclipse.osgi.util.NLS;
3436

@@ -68,7 +70,7 @@ public String objectValueExtraction(IJavaValue value) throws DebugException {
6870
}
6971
}
7072
if (interfaceCheck.contains("Number")) {
71-
IJavaThread thread = (IJavaThread) value.getDebugTarget().getThreads()[0];
73+
IJavaThread thread = getSuspendedThread(value);
7274
IJavaValue stringVal = ((IJavaObject) value).sendMessage("doubleValue", "()D", null, thread, false);
7375
return stringVal.getValueString();
7476
}
@@ -85,7 +87,7 @@ public String objectValueExtraction(IJavaValue value) throws DebugException {
8587
*/
8688
@SuppressWarnings("nls")
8789
private String stringValueExtraction(IJavaObject value) throws DebugException {
88-
IJavaThread thread = (IJavaThread) value.getDebugTarget().getThreads()[0];
90+
IJavaThread thread = getSuspendedThread(value);
8991
IJavaValue stringVal = value.sendMessage("toString", "()Ljava/lang/String;", null, thread, false);
9092
return stringVal.getValueString();
9193
}
@@ -122,7 +124,7 @@ public Map<IJavaVariable, Object> setExtraction(List<IStructuredSelection> selec
122124
@SuppressWarnings("nls")
123125
public List<String> setElementsExtraction(IJavaObject javaObject1) throws DebugException {
124126
List<String> contents = new ArrayList<>();
125-
IJavaThread thread = (IJavaThread) javaObject1.getDebugTarget().getThreads()[0];
127+
IJavaThread thread = getSuspendedThread(javaObject1);
126128
IJavaValue toArray = javaObject1.sendMessage("toArray", "()[Ljava/lang/Object;", null, thread, false);
127129
for (IVariable ob : toArray.getVariables()) {
128130
contents.add(objectValueExtraction((IJavaValue) ob.getValue()));
@@ -661,7 +663,7 @@ public Map<IJavaVariable, Object> iterableExtraction(List<IStructuredSelection>
661663
@SuppressWarnings("nls")
662664
public List<String> iterableElementsExtraction(IJavaObject javaObject1) throws DebugException {
663665
List<String> contents = new ArrayList<>();
664-
IJavaThread thread = (IJavaThread) javaObject1.getDebugTarget().getThreads()[0];
666+
IJavaThread thread = getSuspendedThread(javaObject1);
665667
IJavaObject iterator = (IJavaObject) javaObject1.sendMessage("iterator", "()Ljava/util/Iterator;", null, thread, false);
666668
while (true) {
667669
IJavaValue hasNext = iterator.sendMessage("hasNext", "()Z", null, thread, false);
@@ -707,7 +709,7 @@ public Map<IJavaVariable, Object> listExtraction(List<IStructuredSelection> sele
707709
@SuppressWarnings("nls")
708710
public List<String> listElementsExtraction(IJavaObject javaObject1) throws DebugException {
709711
List<String> contents = new ArrayList<>();
710-
IJavaThread thread = (IJavaThread) javaObject1.getDebugTarget().getThreads()[0];
712+
IJavaThread thread = getSuspendedThread(javaObject1);
711713
IJavaValue toArray = javaObject1.sendMessage("toArray", "()[Ljava/lang/Object;", null, thread, false);
712714
for (IVariable ob : toArray.getVariables()) {
713715
contents.add(objectValueExtraction((IJavaValue) ob.getValue()));
@@ -766,9 +768,9 @@ public Map<IJavaVariable, Object> stringExtraction(List<IStructuredSelection> se
766768
@SuppressWarnings("nls")
767769
public Map<String, Object> mapElementsExtraction(IJavaVariable selectedObject1) throws DebugException {
768770
if (selectedObject1.getValue() instanceof IJavaObject javaObject1) {
771+
IJavaThread thread = getSuspendedThread(javaObject1);
769772
Map<String, Object> result = new HashMap<>();
770773
List<String> keySet = new ArrayList<>();
771-
IJavaThread thread = (IJavaThread) javaObject1.getDebugTarget().getThreads()[0];
772774
IJavaObject keySetObject = (IJavaObject) javaObject1.sendMessage("keySet", "()Ljava/util/Set;", null, thread, false);
773775
IJavaValue keyToArray = keySetObject.sendMessage("toArray", "()[Ljava/lang/Object;", null, thread, false);
774776
for (IVariable ob : keyToArray.getVariables()) {
@@ -854,4 +856,20 @@ public static String checkInterfaces(String className) {
854856
}
855857
}
856858

859+
/**
860+
* Returns a suspended thread for vm message operation
861+
*
862+
* @param value
863+
* IJavaValue object
864+
* @return returns a suspended IJavaThread object
865+
*/
866+
private IJavaThread getSuspendedThread(IJavaValue value) throws DebugException {
867+
IJavaThread thread = (IJavaThread) value.getDebugTarget().getThreads()[0];
868+
if (!thread.isSuspended()) {
869+
JDIStackFrame frame = (JDIStackFrame) DebugUITools.getDebugContext();
870+
thread = (IJavaThread) frame.getThread();
871+
}
872+
return thread;
873+
}
874+
857875
}

0 commit comments

Comments
 (0)