2424 */
2525package org .graalvm .visualvm .heapviewer .truffle .lang .python ;
2626
27+ import java .util .List ;
28+ import java .util .UnknownFormatConversionException ;
2729import org .graalvm .visualvm .lib .jfluid .heap .Heap ;
2830import org .graalvm .visualvm .lib .jfluid .heap .Instance ;
31+ import org .graalvm .visualvm .lib .jfluid .heap .ObjectArrayInstance ;
2932import org .graalvm .visualvm .lib .jfluid .heap .ObjectFieldValue ;
3033import org .graalvm .visualvm .lib .profiler .heapwalk .details .spi .DetailsProvider ;
3134import 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