Skip to content

Commit eab47e1

Browse files
committed
Logical value for Python exceptions
1 parent 0d3d4b2 commit eab47e1

File tree

1 file changed

+50
-2
lines changed

1 file changed

+50
-2
lines changed

visualvm/heapviewer.truffle/src/org/graalvm/visualvm/heapviewer/truffle/lang/python/PythonDetailsProvider.java

Lines changed: 50 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,11 @@
2424
*/
2525
package org.graalvm.visualvm.heapviewer.truffle.lang.python;
2626

27+
import java.util.List;
28+
import java.util.UnknownFormatConversionException;
2729
import org.graalvm.visualvm.lib.jfluid.heap.Heap;
2830
import org.graalvm.visualvm.lib.jfluid.heap.Instance;
31+
import org.graalvm.visualvm.lib.jfluid.heap.ObjectArrayInstance;
2932
import org.graalvm.visualvm.lib.jfluid.heap.ObjectFieldValue;
3033
import org.graalvm.visualvm.lib.profiler.heapwalk.details.spi.DetailsProvider;
3134
import org.graalvm.visualvm.lib.profiler.heapwalk.details.spi.DetailsUtils;
@@ -58,6 +61,7 @@ public class PythonDetailsProvider extends DetailsProvider.Basic {
5861
private static final String PCOMPLEX_MASK = "com.oracle.graal.python.builtins.objects.complex.PComplex"; // NOI18N
5962
private static final String PINT_MASK = "com.oracle.graal.python.builtins.objects.ints.PInt"; // NOI18N
6063
private static final String PEXCEPTION_MASK = "com.oracle.graal.python.runtime.exception.PException"; // NOI18N
64+
private static final String PBASEEXCEPTION_MASK = "com.oracle.graal.python.builtins.objects.exception.PBaseException"; // NOI18N
6165
private static final String GETSET_DESCRIPTOR_MASK = "com.oracle.graal.python.builtins.objects.getsetdescriptor.GetSetDescriptor"; // NOI18N
6266
private static final String PBUILTIN_CLASSTYPE_MASK = "com.oracle.graal.python.builtins.PythonBuiltinClassType"; // NOI18N
6367
private static final String PLAZY_STRING_MASK = "com.oracle.graal.python.builtins.objects.str.LazyString"; // NOI18N
@@ -67,7 +71,7 @@ public class PythonDetailsProvider extends DetailsProvider.Basic {
6771
public PythonDetailsProvider() {
6872
super(PCLASS_MASK,PMANAGEDCLASS_MASK,PFUNCTION_MASK,PNONE_MASK,PLIST_MASK,PSTRING_MASK,BASIC_STORAGE_MASK,
6973
PTUPLE_MASK,PMODULE_MASK,PBYTES_MASK,EMPTY_STORAGE_MASK,PINT_MASK,
70-
PCOMPLEX_MASK,PEXCEPTION_MASK,PBUILTIN_FUNCTION_MASK, PBUILTIN_METHOD_MASK, PMETHOD_MASK, PDECORATEDMETHOD_MASK, PCELL_MASK, BYTE_STORAGE_MASK,
74+
PCOMPLEX_MASK,PEXCEPTION_MASK, PBASEEXCEPTION_MASK,PBUILTIN_FUNCTION_MASK, PBUILTIN_METHOD_MASK, PMETHOD_MASK, PDECORATEDMETHOD_MASK, PCELL_MASK, BYTE_STORAGE_MASK,
7175
GETSET_DESCRIPTOR_MASK,PBUILTIN_CLASSTYPE_MASK,PLAZY_STRING_MASK, PRANGE_MASK, PSOCKET_MASK);
7276
}
7377

@@ -169,7 +173,39 @@ public String getDetailsString(String className, Instance instance, Heap heap) {
169173
return DetailsUtils.getInstanceFieldString(instance, "value", heap); // NOI18N
170174
}
171175
if (PEXCEPTION_MASK.equals(className)) {
172-
return DetailsUtils.getInstanceFieldString(instance, "message", heap); // NOI18N
176+
String message = DetailsUtils.getInstanceFieldString(instance, "message", heap); // NOI18N
177+
return message != null ? message : DetailsUtils.getInstanceFieldString(instance, "pythonException", heap); // NOI18N
178+
}
179+
if (PBASEEXCEPTION_MASK.equals(className)) {
180+
String message = DetailsUtils.getInstanceFieldString(instance, "messageFormat", heap); // NOI18N
181+
if (message != null) {
182+
Object args = instance.getValueOfField("messageArgs"); // NOI18N
183+
if (args instanceof ObjectArrayInstance) {
184+
List vals = ((ObjectArrayInstance)args).getValues();
185+
Object[] params = new String[vals.size()];
186+
for (int i = 0; i < params.length; i++)
187+
params[i] = DetailsUtils.getInstanceString((Instance)vals.get(i), heap);
188+
message = safeFormatString(3, message, params);
189+
}
190+
return message;
191+
}
192+
193+
Object args = instance.getValueOfField("args"); // NOI18N
194+
if (args instanceof Instance) {
195+
Object store = ((Instance)args).getValueOfField("store"); // NOI18N
196+
if (store instanceof Instance) {
197+
Object values = ((Instance)store).getValueOfField("values"); // NOI18N
198+
if (values instanceof ObjectArrayInstance) {
199+
ObjectArrayInstance arr = (ObjectArrayInstance)values;
200+
if (arr.getLength() > 0) {
201+
Instance val = (Instance)arr.getValues().get(0);
202+
if (val != null) return DetailsUtils.getInstanceString(val, heap);
203+
}
204+
}
205+
}
206+
}
207+
208+
return null;
173209
}
174210
if (BYTE_STORAGE_MASK.equals(className)) {
175211
return DetailsUtils.getPrimitiveArrayFieldString(instance, "values", 0, -1, ",", "..."); // NOI18N
@@ -219,4 +255,16 @@ private static String toString(double value) {
219255
return Double.toString(value);
220256
}
221257
}
258+
259+
private static String safeFormatString(int maxIterations, String format, Object... args) {
260+
while (maxIterations-- > 0) {
261+
try {
262+
return String.format(format, args);
263+
} catch (UnknownFormatConversionException e) {
264+
format = format.replace("%" + e.getConversion(), "%s"); // NOI18N
265+
}
266+
}
267+
return format;
268+
}
269+
222270
}

0 commit comments

Comments
 (0)