Skip to content

Commit cb58dac

Browse files
committed
GH-432 support for new format of PythonObject added
1 parent d620d43 commit cb58dac

File tree

2 files changed

+25
-10
lines changed

2 files changed

+25
-10
lines changed

visualvm/heapviewer.truffle/src/org/graalvm/visualvm/heapviewer/truffle/lang/python/PythonDetailsProvider.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ public class PythonDetailsProvider extends DetailsProvider.Basic {
7474
private static final String PMFROOT_MASK = "com.oracle.graal.python.nodes.ModuleRootNode";
7575
private static final String PGFROOT_MASK = "com.oracle.graal.python.nodes.generator.GeneratorFunctionRootNode";
7676
private static final String PTFROOT_MASK = "com.oracle.graal.python.nodes.control.TopLevelExceptionHandler";
77+
private static final String DICT_KEY_MASK = "com.oracle.graal.python.builtins.objects.common.EconomicMapStorage$DictKey";
7778

7879
public PythonDetailsProvider() {
7980
super(PCLASS_MASK,PMANAGEDCLASS_MASK,PFUNCTION_MASK,PNONE_MASK,PLIST_MASK,
@@ -83,7 +84,7 @@ public PythonDetailsProvider() {
8384
PMETHOD_MASK, PDECORATEDMETHOD_MASK, PCELL_MASK, BYTE_STORAGE_MASK,
8485
GETSET_DESCRIPTOR_MASK,PBUILTIN_CLASSTYPE_MASK, PLAZY_STRING_MASK,
8586
PRANGE_MASK, PSOCKET_MASK, PFROOT_MASK, PBFROOT_MASK, PMFROOT_MASK,
86-
PGFROOT_MASK, PTFROOT_MASK);
87+
PGFROOT_MASK, PTFROOT_MASK, DICT_KEY_MASK);
8788
}
8889

8990
public String getDetailsString(String className, Instance instance) {
@@ -276,6 +277,9 @@ public String getDetailsString(String className, Instance instance) {
276277
if (PTFROOT_MASK.equals(className)) {
277278
return "<module __main__>"; // NOI18N
278279
}
280+
if (DICT_KEY_MASK.equals(className)) {
281+
return DetailsUtils.getInstanceFieldString(instance, "value"); // NOI18N
282+
}
279283
return null;
280284
}
281285

visualvm/heapviewer.truffle/src/org/graalvm/visualvm/heapviewer/truffle/lang/python/PythonObject.java

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ class PythonObject extends TruffleObject.InstanceBased {
5555
static final String PYTHON_LIST_FQN = "com.oracle.graal.python.builtins.objects.list.PList"; // NOI18N
5656
static final String TREEMAP_ENTRY_FQN = "java.util.TreeMap$Entry"; // NOI18N
5757
static final String TREEMAP_FQN = "java.util.TreeMap"; // NOI18N
58+
private static final String HASHING_STORAGE_FQN = "com.oracle.graal.python.builtins.objects.common.HashingStorage"; // NOI18N
5859

5960
private final Instance instance;
6061
private final Instance storage;
@@ -90,7 +91,7 @@ class PythonObject extends TruffleObject.InstanceBased {
9091
array = (ObjectArrayInstance) values[5];
9192
map = (Instance) values[6];
9293
set = (Instance) values[7];
93-
dictStorage = (Instance) values[8];
94+
dictStorage = computeDict((Instance) values[8], storage);
9495
}
9596

9697
private static Instance computeStorage(Instance storage, Instance pythonInstance) {
@@ -99,6 +100,14 @@ private static Instance computeStorage(Instance storage, Instance pythonInstance
99100
return null;
100101
}
101102

103+
private static Instance computeDict(Instance dict, Instance storage) {
104+
if (dict != null) return dict;
105+
if (isSubClassOf(storage, HASHING_STORAGE_FQN)) {
106+
return storage;
107+
}
108+
return null;
109+
}
110+
102111
private static Instance computePythonClass(Instance pythonClass, Instance storedPythonClass, Instance initialPythonClass, Instance storage) {
103112
if (pythonClass != null) return pythonClass;
104113
if (storedPythonClass != null) return storedPythonClass;
@@ -398,8 +407,13 @@ private List<FieldValue> getEntriesFromKeywords(ObjectArrayInstance keywords) {
398407
}
399408

400409
private List<FieldValue> getEntriesFromEconomicMapStorage(boolean isSet, Instance economicMapStorage) {
410+
Instance entries;
401411
List fields = new ArrayList();
402-
Instance entries = (Instance) economicMapStorage.getValueOfField("entries"); // NOI18N
412+
Instance economicMap = (Instance) economicMapStorage.getValueOfField("map"); // NOI18N
413+
if (economicMap instanceof Instance) {
414+
economicMapStorage = economicMap;
415+
}
416+
entries = (Instance) economicMapStorage.getValueOfField("entries"); // NOI18N
403417

404418
if (entries instanceof ObjectArrayInstance) {
405419
ObjectArrayInstance entriesArr = (ObjectArrayInstance) entries;
@@ -414,14 +428,11 @@ private List<FieldValue> getEntriesFromEconomicMapStorage(boolean isSet, Instanc
414428
if (isSet) {
415429
fields.add(new PythonEconomicEntryFieldValue(key));
416430
} else { // Map
417-
if (value != null) {
418-
if (value instanceof Instance) {
419-
Instance ival = ((Instance)value);
431+
if (value instanceof Instance) {
432+
Instance ival = ((Instance)value);
433+
if (ival.getJavaClass().getName().startsWith(mapClassName)) {
420434
Instance linkValue = (Instance) ival.getValueOfField("value"); // NOI18N
421-
422-
if (linkValue != null && ival.getJavaClass().getName().startsWith(mapClassName)) {
423-
value = linkValue;
424-
}
435+
if (linkValue != null) value = linkValue;
425436
}
426437
}
427438
fields.add(new PythonEconomicEntryFieldValue(key, value));

0 commit comments

Comments
 (0)