Skip to content

Commit c7f5fa0

Browse files
committed
support for new JavaScript model added
1 parent f397172 commit c7f5fa0

File tree

4 files changed

+97
-28
lines changed

4 files changed

+97
-28
lines changed

visualvm/heapviewer.truffle/src/org/graalvm/visualvm/heapviewer/truffle/dynamicobject/DynamicObject.java

Lines changed: 61 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -222,9 +222,10 @@ private void initFields() {
222222
values = new ArrayList();
223223
staticValues = new ArrayList();
224224
boolean hasExtRef = hasField(instance.getJavaClass(), "extRef"); // NOI18N
225+
boolean hasShortNames = hasField(instance.getJavaClass(), "o0"); // NOI18N
225226

226227
for (Instance ip : getMapValues(propertyMap)) {
227-
Property p = new Property(ip, hasExtRef);
228+
Property p = new Property(ip, hasExtRef, hasShortNames);
228229
// properties.add(p);
229230
if (p.isStatic()) staticValues.add(p.getValue(instance));
230231
else values.add(p.getValue(instance));
@@ -440,13 +441,15 @@ private static class Property implements Field {
440441
String propertyName;
441442
boolean isStatic;
442443
boolean hasExtRef;
444+
boolean hasShortNames;
443445

444-
private Property(Instance p, boolean extRef) {
446+
private Property(Instance p, boolean extRef, boolean shortNames) {
445447
assert p.getJavaClass().getName().equals(PROPERTY_FQN);
446448
property = p;
447449
propertyName = DetailsUtils.getInstanceString(p, null);
448450
location = (Instance) property.getValueOfField("location"); // NOI18N
449451
hasExtRef = extRef;
452+
hasShortNames = shortNames;
450453
}
451454

452455
String getPropertyName() {
@@ -515,19 +518,19 @@ FieldValue getValueImpl(Instance loc, final Instance dynamicObject) {
515518
String superClassName = locClass.getSuperClass().getName();
516519
if (superClassName.contains("SimpleObjectFieldLocation")) { // NOI18N
517520
Integer index = (Integer) loc.getValueOfField("index"); // NOI18N
518-
return getInstanceFieldValue(dynamicObject, "object" + (index + 1)); // NOI18N
521+
return getObjectInstanceFieldValue(dynamicObject, index);
519522
}
520523
if (superClassName.contains("SimpleLongFieldLocation")) { // NOI18N
521524
Integer index = (Integer) loc.getValueOfField("index"); // NOI18N
522-
return getInstanceFieldValue(dynamicObject, "primitive" + (index + 1)); // NOI18N
525+
return getPrimitiveInstanceFieldValue(dynamicObject, index);
523526
}
524527
if (superClassName.contains("BasicObjectFieldLocation")) { // NOI18N
525528
Integer index = (Integer) loc.getValueOfField("index"); // NOI18N
526-
return getInstanceFieldValue(dynamicObject, "object" + (index + 1)); // NOI18N
529+
return getObjectInstanceFieldValue(dynamicObject, index);
527530
}
528531
if (superClassName.contains("BasicLongFieldLocation")) { // NOI18N
529532
Integer index = (Integer) loc.getValueOfField("index"); // NOI18N
530-
return getInstanceFieldValue(dynamicObject, "primitive" + (index + 1)); // NOI18N
533+
return getPrimitiveInstanceFieldValue(dynamicObject,index);
531534
}
532535
return new DynObjFieldValue(dynamicObject, this) {
533536
@Override
@@ -543,6 +546,16 @@ private ObjectArrayInstance getObjectStore(final Instance dynamicObject) {
543546
return (ObjectArrayInstance) dynamicObject.getValueOfField(fieldName);
544547
}
545548

549+
private FieldValue getObjectInstanceFieldValue(Instance dynObj, int index) {
550+
String fieldName = getObjectFieldName(index);
551+
return getInstanceFieldValue(dynObj, dynObj, fieldName);
552+
}
553+
554+
private FieldValue getPrimitiveInstanceFieldValue(Instance dynObj, int index) {
555+
String fieldName = getPrimitiveFieldName(index);
556+
return getInstanceFieldValue(dynObj, dynObj, fieldName);
557+
}
558+
546559
private FieldValue getInstanceFieldValue(Instance dynObj, String fieldName) {
547560
return getInstanceFieldValue(dynObj, dynObj, fieldName);
548561
}
@@ -680,7 +693,8 @@ private FieldValue getEnterpriseValue(Instance loc, String className, Instance d
680693
if (className.contains("ObjectFieldLocation")) { // NOI18N
681694
Integer index = (Integer) loc.getValueOfField("index"); // NOI18N
682695
int objectIndex = hasExtRef ? index : index + 2;
683-
FieldValue ret = getInstanceFieldValue(dynamicObject, "object" + objectIndex); // NOI18N
696+
String prefix = hasShortNames ? "o" : "object"; // NOI18N
697+
FieldValue ret = getInstanceFieldValue(dynamicObject, prefix + objectIndex);
684698
if (ret == null) {
685699
// extVal is encoded as non-existing index
686700
return getObjectFieldValue(dynamicObject, (Instance) dynamicObject.getValueOfField("extVal")); // NOI18N
@@ -690,27 +704,45 @@ private FieldValue getEnterpriseValue(Instance loc, String className, Instance d
690704
if (className.contains("IntFieldLocation")) { // NOI18N
691705
Integer index = (Integer) loc.getValueOfField("index"); // NOI18N
692706
int objectIndex = hasExtRef ? index : index + 1;
693-
return getInstanceFieldValue(dynamicObject, "primitive" + objectIndex); // NOI18N
707+
String prefix = hasShortNames ? "p" : "primitive"; // NOI18N
708+
return getInstanceFieldValue(dynamicObject, prefix + objectIndex);
694709
}
695710
if (className.contains("BooleanFieldLocation")) { // NOI18N
696711
Integer index = (Integer) loc.getValueOfField("index"); // NOI18N
697712
int objectIndex = hasExtRef ? index : index + 1;
698-
Integer i1 = (Integer) dynamicObject.getValueOfField("primitive" + objectIndex); // NOI18N
713+
String prefix = hasShortNames ? "p" : "primitive"; // NOI18N
714+
Integer i1 = (Integer) dynamicObject.getValueOfField(prefix + objectIndex);
699715
return getFieldValue(dynamicObject, Boolean.toString(i1.intValue() != 0));
700716
}
701717
if (className.contains("DoubleFieldLocation")) { // NOI18N
702718
Integer index = (Integer) loc.getValueOfField("index"); // NOI18N
703719
int objectIndex = hasExtRef ? index : index + 1;
704-
Integer i1 = (Integer) dynamicObject.getValueOfField("primitive" + objectIndex); // NOI18N
705-
Integer i2 = (Integer) dynamicObject.getValueOfField("primitive" + (objectIndex + 1)); // NOI18N
706-
return getFieldValue(dynamicObject, getDouble(getLong(i1, i2)));
720+
String prefix = hasShortNames ? "p" : "primitive"; // NOI18N
721+
Number i1 = (Number) dynamicObject.getValueOfField(prefix + objectIndex);
722+
long val;
723+
724+
if (i1 instanceof Long) {
725+
val = i1.longValue();
726+
} else {
727+
Integer i2 = (Integer) dynamicObject.getValueOfField(prefix + (objectIndex + 1));
728+
val = getLong(i1.intValue(), i2);
729+
}
730+
return getFieldValue(dynamicObject, getDouble(val));
707731
}
708732
if (className.contains("LongFieldLocation")) { // NOI18N
709733
Integer index = (Integer) loc.getValueOfField("index"); // NOI18N
710734
int objectIndex = hasExtRef ? index : index + 1;
711-
Integer i1 = (Integer) dynamicObject.getValueOfField("primitive" + objectIndex); // NOI18N
712-
Integer i2 = (Integer) dynamicObject.getValueOfField("primitive" + (objectIndex + 1)); // NOI18N
713-
return getFieldValue(dynamicObject, Long.toString(getLong(i1, i2)));
735+
String prefix = hasShortNames ? "p" : "primitive"; // NOI18N
736+
Number i1 = (Number) dynamicObject.getValueOfField(prefix + objectIndex);
737+
long val;
738+
739+
if (i1 instanceof Long) {
740+
val = i1.longValue();
741+
} else {
742+
Integer i2 = (Integer) dynamicObject.getValueOfField(prefix + (objectIndex + 1));
743+
val = getLong(i1.intValue(), i2);
744+
}
745+
return getFieldValue(dynamicObject, Long.toString(val));
714746
}
715747
if (className.contains("ObjectArrayLocation")) { // NOI18N
716748
Integer index = (Integer) loc.getValueOfField("index"); // NOI18N
@@ -979,6 +1011,20 @@ private static String getDouble(long l) {
9791011

9801012
return Double.toString(d);
9811013
}
1014+
1015+
private String getObjectFieldName(int index) {
1016+
if (hasShortNames) {
1017+
return "o"+(index); // NOI18N
1018+
}
1019+
return "object"+(index+1); // NOI18N
1020+
}
1021+
1022+
private String getPrimitiveFieldName(int index) {
1023+
if (hasShortNames) {
1024+
return "p"+(index); // NOI18N
1025+
}
1026+
return "primitive"+(index+1); // NOI18N
1027+
}
9821028
}
9831029

9841030
private static class ObjType implements Type {

visualvm/heapviewer.truffle/src/org/graalvm/visualvm/heapviewer/truffle/lang/javascript/JavaScriptDetailsProvider.java

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ public class JavaScriptDetailsProvider extends DetailsProvider.Basic {
4949
private static final String JS_NODE_MASK = "com.oracle.truffle.js.nodes.JavaScriptNode+"; // NOI18N
5050
private static final String JS_STRING_MASK = "com.oracle.truffle.js.runtime.objects.JSLazyString"; // NOI18N
5151
private static final String JS_INT_MASK = "com.oracle.truffle.js.runtime.objects.JSLazyString$JSLazyIntWrapper"; // NOI18N
52+
private static final String JS_FUNCTION_MASK = "com.oracle.truffle.js.runtime.builtins.JSFunctionObject+"; // NOI18N
5253
private static final String JS_FDATA_MASK = "com.oracle.truffle.js.runtime.builtins.JSFunctionData"; // NOI18N
5354
private static final String JS_FUNCTION_ROOT_NODE_MASK = "com.oracle.truffle.js.nodes.function.FunctionRootNode"; // NOI18N
5455
private static final String JS_CONSTRUCTOR_ROOT_NODE_MASK = "com.oracle.truffle.js.nodes.function.ConstructorRootNode"; // NOI18N
@@ -57,12 +58,14 @@ public class JavaScriptDetailsProvider extends DetailsProvider.Basic {
5758
private static final String JS_FUNCTION_TEMPLATE_MASK = "com.oracle.truffle.trufflenode.info.FunctionTemplate"; // NOI18N
5859
private static final String JS_REGEX_NODE_MASK = "com.oracle.truffle.regex.RegexNode+"; // NOI18N
5960
private static final String JS_TREGEX_NODE_MASK = "com.oracle.truffle.regex.tregex.TRegexRootNode+"; // NOi18N
61+
private static final String JS_JAVA_PACKAGE_MASK = "com.oracle.truffle.js.runtime.java.JavaPackageObject"; // NOI18N
6062

6163
public JavaScriptDetailsProvider() {
62-
super(SYMBOL_MASK, JS_NODE_MASK, JS_STRING_MASK, JS_INT_MASK, JS_FDATA_MASK,
63-
JS_FUNCTION_ROOT_NODE_MASK, JS_CONSTRUCTOR_ROOT_NODE_MASK,
64+
super(SYMBOL_MASK, JS_NODE_MASK, JS_STRING_MASK, JS_INT_MASK, JS_FUNCTION_MASK,
65+
JS_FDATA_MASK, JS_FUNCTION_ROOT_NODE_MASK, JS_CONSTRUCTOR_ROOT_NODE_MASK,
6466
JS_NEW_TARGET_ROOT_NODE_MASK, JS_NATIVE_FUNCTION_ROOT_NODE_MASK,
65-
JS_FUNCTION_TEMPLATE_MASK, JS_REGEX_NODE_MASK, JS_TREGEX_NODE_MASK);
67+
JS_FUNCTION_TEMPLATE_MASK, JS_REGEX_NODE_MASK, JS_TREGEX_NODE_MASK,
68+
JS_JAVA_PACKAGE_MASK);
6669
}
6770

6871
public String getDetailsString(String className, Instance instance, Heap heap) {
@@ -93,6 +96,9 @@ public String getDetailsString(String className, Instance instance, Heap heap) {
9396
int value = DetailsUtils.getIntFieldValue(instance, "value", 0); // NOI18N
9497
return Integer.toString(value);
9598
}
99+
if (JS_FUNCTION_MASK.equals(className)) {
100+
return DetailsUtils.getInstanceFieldString(instance, "functionData", heap); // NOI18N
101+
}
96102
if (JS_FDATA_MASK.equals(className)) {
97103
String name = DetailsUtils.getInstanceFieldString(instance, "name", heap); // NOI18N
98104
if (name == null || name.isEmpty()) {
@@ -165,6 +171,9 @@ public String getDetailsString(String className, Instance instance, Heap heap) {
165171
return "TRegex fwd " + patternSource; // NOI18N
166172
}
167173
}
174+
if (JS_JAVA_PACKAGE_MASK.equals(className)) {
175+
return DetailsUtils.getInstanceFieldString(instance, "packageName", heap); // NOI18N
176+
}
168177
return null;
169178
}
170179

visualvm/heapviewer.truffle/src/org/graalvm/visualvm/heapviewer/truffle/lang/javascript/JavaScriptHeapFragment.java

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import org.graalvm.visualvm.heapviewer.utils.ExcludingIterator;
3939
import org.graalvm.visualvm.lib.jfluid.heap.FieldValue;
4040
import org.graalvm.visualvm.lib.jfluid.heap.ObjectFieldValue;
41+
import org.graalvm.visualvm.lib.profiler.heapwalk.details.api.DetailsSupport;
4142
import org.openide.util.NbBundle;
4243

4344
/**
@@ -139,19 +140,25 @@ String getObjectType(Instance instance, Instance shape) {
139140

140141
private static Instance getPrototype(Instance instance) {
141142
JavaScriptObject jsobj = new JavaScriptObject(instance);
142-
List<FieldValue> staticFields = jsobj.getStaticFieldValues();
143-
for (FieldValue staticField : staticFields) {
144-
if ("__proto__ (hidden)".equals(staticField.getField().getName())) { // NOI18N
145-
return ((ObjectFieldValue)staticField).getInstance();
143+
Instance prototype = getPrototype(jsobj.getStaticFieldValues());
144+
145+
if (prototype != null) {
146+
return prototype;
147+
}
148+
return getPrototype(jsobj.getFieldValues());
149+
}
150+
151+
private static Instance getPrototype(List<FieldValue> fields) {
152+
for (FieldValue field : fields) {
153+
String fieldName = field.getField().getName();
154+
if ("__proto__ (hidden)".equals(fieldName) || // NOI18N
155+
"[[Prototype]] (hidden)".equals(fieldName)) { // NOI18N
156+
return ((ObjectFieldValue)field).getInstance();
146157
}
147158
}
148-
149-
FieldValue field = jsobj.getFieldValue("__proto__ (hidden)"); // NOI18N
150-
if (field != null) return ((ObjectFieldValue)field).getInstance();
151-
152159
return null;
153160
}
154-
161+
155162
private static String getJSType(Instance prototype, JavaScriptHeapFragment fragment) {
156163
if (prototype == null) return Bundle.JavaScriptHeapFragment_UnknownType();
157164

visualvm/heapviewer.truffle/src/org/graalvm/visualvm/heapviewer/truffle/lang/javascript/JavaScriptNodes.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,11 +91,13 @@ static String getLogicalValue(JavaScriptObject object, String type, Heap heap) {
9191
// Instance data = (Instance)getInstance().getValueOfField("object2");
9292
logicalValue = data == null ? null : DetailsSupport.getDetailsString(data, heap);
9393
if (logicalValue != null) logicalValue += "()";
94+
else logicalValue = DetailsSupport.getDetailsString(object.getInstance(), heap);
9495
} else if ("JavaPackage".equals(type)) { // NOI18N
9596
FieldValue nameField = object.getFieldValue("packageName (hidden)"); // NOI18N
9697
Instance name = nameField instanceof ObjectFieldValue ? ((ObjectFieldValue)nameField).getInstance() : null;
9798
// Instance name = (Instance)getInstance().getValueOfField("object2");
9899
logicalValue = name == null ? null : DetailsSupport.getDetailsString(name, heap);
100+
if (logicalValue == null) logicalValue = DetailsSupport.getDetailsString(object.getInstance(), heap);
99101
} else if ("Object".equals(type) || "JSObject".equals(type)) { // NOI18N
100102
String head = "properties ["; // NOI18N
101103
String sep = ", "; // NOI18N
@@ -119,8 +121,13 @@ static String getLogicalValue(JavaScriptObject object, String type, Heap heap) {
119121
if (lengthField == null) {
120122
lengthField = object.getFieldValue("usedLength (hidden)"); // NOI18N
121123
}
124+
Integer length;
122125
if (lengthField != null) {
123-
Integer length = Integer.parseInt(lengthField.getValue());
126+
length = Integer.parseInt(lengthField.getValue());
127+
} else {
128+
length = (Integer) object.getInstance().getValueOfField("length");
129+
}
130+
if (length != null) {
124131
logicalValue = Formatters.numberFormat().format(length) + (length == 1 ? " item" : " items"); // NOI18N
125132
}
126133
} else if ("Null$NullClass".equals(type)) { // NOI18N

0 commit comments

Comments
 (0)