34
34
import org .graalvm .visualvm .lib .jfluid .heap .PrimitiveArrayInstance ;
35
35
import org .graalvm .visualvm .lib .profiler .heapwalk .details .spi .DetailsProvider ;
36
36
import org .graalvm .visualvm .lib .profiler .heapwalk .details .spi .DetailsUtils ;
37
+ import org .graalvm .visualvm .lib .ui .Formatters ;
37
38
import org .openide .util .lookup .ServiceProvider ;
38
39
39
40
/**
@@ -56,12 +57,23 @@ public class RubyDetailsProvider extends DetailsProvider.Basic {
56
57
private static final String BASIC_LAYOUT_MASK = "org.truffleruby.core.basicobject.BasicObjectLayoutImpl$BasicObjectType+" ; // NI18N
57
58
private static final String METHOD_INFO_MASK = "org.truffleruby.language.methods.SharedMethodInfo" ; // NOi18N
58
59
private static final String RUBY_ROOT_NODE_MASK = "org.truffleruby.language.RubyRootNode" ; // NOI18N\
60
+ private static final String RUBY_MODULE_MASK = "org.truffleruby.core.module.RubyModule+" ; // NOI18N
61
+ private static final String RUBY_PROC_MASK = "org.truffleruby.core.proc.RubyProc" ; // NOI18N
62
+ private static final String RUBY_STRING_MASK = "org.truffleruby.core.string.RubyString" ; // NOI18N
63
+ private static final String RUBY_ARRAY_MASK = "org.truffleruby.core.array.RubyArray" ; // NOI18N
64
+ private static final String RUBY_SYMBOL_MASK = "org.truffleruby.core.symbol.RubySymbol" ; // NOI18N
65
+ private static final String RUBY_HASH_MASK = "org.truffleruby.core.hash.RubyHash" ; // NOI18N
66
+ private static final String RUBY_ENCODING_MASK = "org.truffleruby.core.encoding.RubyEncoding" ; // NOI18N
67
+ private static final String RUBY_REGEXP_MASK = "org.truffleruby.core.regexp.RubyRegexp" ; // NOI18N
59
68
60
69
public RubyDetailsProvider () {
61
70
super (RUBY_OBJECT_TYPE_MASK ,ASCII_ROPE_MASK ,CONCAT_ROPE_MASK ,SUB_ROPE_MASK ,
62
71
ROPE_TABLE_KEY_MASK ,INVALID_ROPE_MASK ,VALID_ROPE_MASK ,
63
72
INT_ROPE_MASK , ENCODING_MASK , MODULE_FIELDS_MASK ,
64
- BASIC_LAYOUT_MASK , METHOD_INFO_MASK , RUBY_ROOT_NODE_MASK );
73
+ BASIC_LAYOUT_MASK , METHOD_INFO_MASK , RUBY_ROOT_NODE_MASK ,
74
+ RUBY_MODULE_MASK , RUBY_PROC_MASK , RUBY_STRING_MASK , RUBY_ARRAY_MASK ,
75
+ RUBY_SYMBOL_MASK , RUBY_HASH_MASK , RUBY_ENCODING_MASK ,
76
+ RUBY_REGEXP_MASK );
65
77
}
66
78
67
79
public String getDetailsString (String className , Instance instance , Heap heap ) {
@@ -162,6 +174,31 @@ public String getDetailsString(String className, Instance instance, Heap heap) {
162
174
if (RUBY_ROOT_NODE_MASK .equals (className )) {
163
175
return DetailsUtils .getInstanceFieldString (instance , "sharedMethodInfo" , heap ); // NOI18N
164
176
}
177
+ if (RUBY_MODULE_MASK .equals (className )) {
178
+ return DetailsUtils .getInstanceFieldString (instance , "fields" , heap ); // NOI18N
179
+ }
180
+ if (RUBY_PROC_MASK .equals (className )) {
181
+ return DetailsUtils .getInstanceFieldString (instance , "sharedMethodInfo" , heap ); // NOI18N
182
+ }
183
+ if (RUBY_STRING_MASK .equals (className )) {
184
+ return DetailsUtils .getInstanceFieldString (instance , "rope" , heap ); // NOI18N
185
+ }
186
+ if (RUBY_ARRAY_MASK .equals (className ) ||
187
+ RUBY_HASH_MASK .equals (className )) {
188
+ Integer length = (Integer ) instance .getValueOfField ("size" );
189
+ if (length != null ) {
190
+ return Formatters .numberFormat ().format (length ) + (length == 1 ? " item" : " items" ); // NOI18N
191
+ }
192
+ }
193
+ if (RUBY_SYMBOL_MASK .equals (className )) {
194
+ return DetailsUtils .getInstanceFieldString (instance , "string" , heap ); // NOI18N
195
+ }
196
+ if (RUBY_ENCODING_MASK .equals (className )) {
197
+ return DetailsUtils .getInstanceFieldString (instance , "name" , heap ); // NOI18N
198
+ }
199
+ if (RUBY_REGEXP_MASK .equals (className )) {
200
+ return DetailsUtils .getInstanceFieldString (instance , "source" , heap ); // NOI18N
201
+ }
165
202
return null ;
166
203
}
167
204
0 commit comments