Skip to content

Commit 09605a3

Browse files
committed
support for new Ruby model added
1 parent c7f5fa0 commit 09605a3

File tree

4 files changed

+57
-4
lines changed

4 files changed

+57
-4
lines changed

visualvm/heapviewer.truffle/src/org/graalvm/visualvm/heapviewer/truffle/lang/ruby/RubyDetailsProvider.java

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import org.graalvm.visualvm.lib.jfluid.heap.PrimitiveArrayInstance;
3535
import org.graalvm.visualvm.lib.profiler.heapwalk.details.spi.DetailsProvider;
3636
import org.graalvm.visualvm.lib.profiler.heapwalk.details.spi.DetailsUtils;
37+
import org.graalvm.visualvm.lib.ui.Formatters;
3738
import org.openide.util.lookup.ServiceProvider;
3839

3940
/**
@@ -56,12 +57,23 @@ public class RubyDetailsProvider extends DetailsProvider.Basic {
5657
private static final String BASIC_LAYOUT_MASK= "org.truffleruby.core.basicobject.BasicObjectLayoutImpl$BasicObjectType+"; // NI18N
5758
private static final String METHOD_INFO_MASK = "org.truffleruby.language.methods.SharedMethodInfo"; // NOi18N
5859
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
5968

6069
public RubyDetailsProvider() {
6170
super(RUBY_OBJECT_TYPE_MASK,ASCII_ROPE_MASK,CONCAT_ROPE_MASK,SUB_ROPE_MASK,
6271
ROPE_TABLE_KEY_MASK,INVALID_ROPE_MASK,VALID_ROPE_MASK,
6372
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);
6577
}
6678

6779
public String getDetailsString(String className, Instance instance, Heap heap) {
@@ -162,6 +174,31 @@ public String getDetailsString(String className, Instance instance, Heap heap) {
162174
if (RUBY_ROOT_NODE_MASK.equals(className)) {
163175
return DetailsUtils.getInstanceFieldString(instance, "sharedMethodInfo", heap); // NOI18N
164176
}
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+
}
165202
return null;
166203
}
167204

visualvm/heapviewer.truffle/src/org/graalvm/visualvm/heapviewer/truffle/lang/ruby/RubyHeapFragment.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ class RubyHeapFragment extends DynamicObjectLanguageHeapFragment<RubyObject, Rub
4343

4444
static final String RUBY_LANG_ID = "org.truffleruby.language.RubyObjectType"; // NOI18N
4545
static final String RUBY_LANG_ID1 = "org.truffleruby.interop.RubyObjectType"; // NOI18N
46+
static final String RUBY_LANG_ID2 = "org.truffleruby.language.objects.RubyObjectType"; // NOI18N
4647

4748
private static final String RUBY_HEAP_ID = "ruby_heap"; // NOI18N
4849

visualvm/heapviewer.truffle/src/org/graalvm/visualvm/heapviewer/truffle/lang/ruby/RubyLanguage.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,11 +64,14 @@ protected RubyHeapFragment createFragment(Heap heap) {
6464
Instance langID = getLanguageInfo(heap, RUBY_LANGINFO_ID);
6565
if (langID == null) return null;
6666

67-
JavaClass rubyMainClass = heap.getJavaClassByName(RubyHeapFragment.RUBY_LANG_ID1);
67+
JavaClass rubyMainClass = heap.getJavaClassByName(RubyHeapFragment.RUBY_LANG_ID2);
6868
if (rubyMainClass == null) {
69-
rubyMainClass = heap.getJavaClassByName(RubyHeapFragment.RUBY_LANG_ID);
69+
rubyMainClass = heap.getJavaClassByName(RubyHeapFragment.RUBY_LANG_ID1);
7070
if (rubyMainClass == null) {
71-
return null;
71+
rubyMainClass = heap.getJavaClassByName(RubyHeapFragment.RUBY_LANG_ID);
72+
if (rubyMainClass == null) {
73+
return null;
74+
}
7275
}
7376
}
7477

visualvm/heapviewer.truffle/src/org/graalvm/visualvm/heapviewer/truffle/lang/ruby/RubyObject.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,11 @@
2525
package org.graalvm.visualvm.heapviewer.truffle.lang.ruby;
2626

2727
import org.graalvm.visualvm.heapviewer.truffle.dynamicobject.DynamicObject;
28+
import org.graalvm.visualvm.heapviewer.truffle.lang.javascript.JavaScriptLanguage;
29+
import org.graalvm.visualvm.lib.jfluid.heap.Heap;
2830
import org.graalvm.visualvm.lib.jfluid.heap.Instance;
2931
import org.graalvm.visualvm.lib.jfluid.heap.JavaClass;
32+
import org.graalvm.visualvm.lib.profiler.heapwalk.details.spi.DetailsUtils;
3033

3134
/**
3235
*
@@ -45,6 +48,15 @@ class RubyObject extends DynamicObject {
4548
boolean isRubyObject() {
4649
return isRubyLangId(getLanguageId());
4750
}
51+
52+
@Override
53+
protected String computeType(Heap heap) {
54+
Instance metaClass = (Instance) getInstance().getValueOfField("metaClass");
55+
if (metaClass == null) {
56+
return super.computeType(heap);
57+
}
58+
return DetailsUtils.getInstanceFieldString(metaClass, "nonSingletonClass", heap);
59+
}
4860

4961
static boolean isRubyObject(Instance instance) {
5062
return DynamicObject.isDynamicObject(instance) &&

0 commit comments

Comments
 (0)