24
24
*/
25
25
package org .graalvm .visualvm .heapviewer .truffle .lang .python ;
26
26
27
+ import java .util .List ;
28
+ import java .util .UnknownFormatConversionException ;
27
29
import org .graalvm .visualvm .lib .jfluid .heap .Heap ;
28
30
import org .graalvm .visualvm .lib .jfluid .heap .Instance ;
31
+ import org .graalvm .visualvm .lib .jfluid .heap .ObjectArrayInstance ;
29
32
import org .graalvm .visualvm .lib .jfluid .heap .ObjectFieldValue ;
30
33
import org .graalvm .visualvm .lib .profiler .heapwalk .details .spi .DetailsProvider ;
31
34
import org .graalvm .visualvm .lib .profiler .heapwalk .details .spi .DetailsUtils ;
@@ -58,6 +61,7 @@ public class PythonDetailsProvider extends DetailsProvider.Basic {
58
61
private static final String PCOMPLEX_MASK = "com.oracle.graal.python.builtins.objects.complex.PComplex" ; // NOI18N
59
62
private static final String PINT_MASK = "com.oracle.graal.python.builtins.objects.ints.PInt" ; // NOI18N
60
63
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
61
65
private static final String GETSET_DESCRIPTOR_MASK = "com.oracle.graal.python.builtins.objects.getsetdescriptor.GetSetDescriptor" ; // NOI18N
62
66
private static final String PBUILTIN_CLASSTYPE_MASK = "com.oracle.graal.python.builtins.PythonBuiltinClassType" ; // NOI18N
63
67
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 {
67
71
public PythonDetailsProvider () {
68
72
super (PCLASS_MASK ,PMANAGEDCLASS_MASK ,PFUNCTION_MASK ,PNONE_MASK ,PLIST_MASK ,PSTRING_MASK ,BASIC_STORAGE_MASK ,
69
73
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 ,
71
75
GETSET_DESCRIPTOR_MASK ,PBUILTIN_CLASSTYPE_MASK ,PLAZY_STRING_MASK , PRANGE_MASK , PSOCKET_MASK );
72
76
}
73
77
@@ -169,7 +173,39 @@ public String getDetailsString(String className, Instance instance, Heap heap) {
169
173
return DetailsUtils .getInstanceFieldString (instance , "value" , heap ); // NOI18N
170
174
}
171
175
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 ;
173
209
}
174
210
if (BYTE_STORAGE_MASK .equals (className )) {
175
211
return DetailsUtils .getPrimitiveArrayFieldString (instance , "values" , 0 , -1 , "," , "..." ); // NOI18N
@@ -219,4 +255,16 @@ private static String toString(double value) {
219
255
return Double .toString (value );
220
256
}
221
257
}
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
+
222
270
}
0 commit comments