Skip to content

Commit cf65880

Browse files
committed
More logical values for Python objects
1 parent 38fbbda commit cf65880

File tree

2 files changed

+163
-16
lines changed

2 files changed

+163
-16
lines changed

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

Lines changed: 49 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,11 @@ public class PythonDetailsProvider extends DetailsProvider.Basic {
4141
private static final String PCLASS_MASK = "com.oracle.graal.python.builtins.objects.type.PythonClass+"; // NOI18N
4242
private static final String PMANAGEDCLASS_MASK = "com.oracle.graal.python.builtins.objects.type.PythonManagedClass+"; // NOI18N
4343
private static final String PFUNCTION_MASK = "com.oracle.graal.python.builtins.objects.function.PFunction+"; // NOI18N
44-
private static final String PBUILDIN_FUNCTION_MASK = "com.oracle.graal.python.builtins.objects.function.PBuiltinFunction"; // NOI18N
44+
private static final String PBUILTIN_FUNCTION_MASK = "com.oracle.graal.python.builtins.objects.function.PBuiltinFunction"; // NOI18N
45+
private static final String PBUILTIN_METHOD_MASK = "com.oracle.graal.python.builtins.objects.method.PBuiltinMethod"; // NOI18N
46+
private static final String PMETHOD_MASK = "com.oracle.graal.python.builtins.objects.method.PMethod"; // NOI18N
47+
private static final String PDECORATEDMETHOD_MASK = "com.oracle.graal.python.builtins.objects.method.PDecoratedMethod"; // NOI18N
48+
private static final String PCELL_MASK = "com.oracle.graal.python.builtins.objects.cell.PCell"; // NOI18N
4549
private static final String PNONE_MASK = "com.oracle.graal.python.builtins.objects.PNone"; // NOI18N
4650
private static final String PLIST_MASK = "com.oracle.graal.python.builtins.objects.list.PList"; // NOI18N
4751
private static final String PSTRING_MASK = "com.oracle.graal.python.builtins.objects.str.PString"; // NOI18N
@@ -55,14 +59,16 @@ public class PythonDetailsProvider extends DetailsProvider.Basic {
5559
private static final String PINT_MASK = "com.oracle.graal.python.builtins.objects.ints.PInt"; // NOI18N
5660
private static final String PEXCEPTION_MASK = "com.oracle.graal.python.runtime.exception.PException"; // NOI18N
5761
private static final String GETSET_DESCRIPTOR_MASK = "com.oracle.graal.python.builtins.objects.getsetdescriptor.GetSetDescriptor"; // NOI18N
58-
private static final String PBUILDIN_CLASSTYPE_MASK = "com.oracle.graal.python.builtins.PythonBuiltinClassType"; // NOI18N
62+
private static final String PBUILTIN_CLASSTYPE_MASK = "com.oracle.graal.python.builtins.PythonBuiltinClassType"; // NOI18N
5963
private static final String PLAZY_STRING_MASK = "com.oracle.graal.python.builtins.objects.str.LazyString"; // NOI18N
64+
private static final String PRANGE_MASK = "com.oracle.graal.python.builtins.objects.range.PRange"; // NOI18N
65+
private static final String PSOCKET_MASK = "com.oracle.graal.python.builtins.objects.socket.PSocket"; // NOI18N
6066

6167
public PythonDetailsProvider() {
6268
super(PCLASS_MASK,PMANAGEDCLASS_MASK,PFUNCTION_MASK,PNONE_MASK,PLIST_MASK,PSTRING_MASK,BASIC_STORAGE_MASK,
6369
PTUPLE_MASK,PMODULE_MASK,PBYTES_MASK,EMPTY_STORAGE_MASK,PINT_MASK,
64-
PCOMPLEX_MASK,PEXCEPTION_MASK,PBUILDIN_FUNCTION_MASK, BYTE_STORAGE_MASK,
65-
GETSET_DESCRIPTOR_MASK,PBUILDIN_CLASSTYPE_MASK,PLAZY_STRING_MASK);
70+
PCOMPLEX_MASK,PEXCEPTION_MASK,PBUILTIN_FUNCTION_MASK, PBUILTIN_METHOD_MASK, PMETHOD_MASK, PDECORATEDMETHOD_MASK, PCELL_MASK, BYTE_STORAGE_MASK,
71+
GETSET_DESCRIPTOR_MASK,PBUILTIN_CLASSTYPE_MASK,PLAZY_STRING_MASK, PRANGE_MASK, PSOCKET_MASK);
6672
}
6773

6874
public String getDetailsString(String className, Instance instance, Heap heap) {
@@ -72,29 +78,51 @@ public String getDetailsString(String className, Instance instance, Heap heap) {
7278
if (PMANAGEDCLASS_MASK.equals(className)) {
7379
return DetailsUtils.getInstanceFieldString(instance, "className", heap); // NOI18N
7480
}
75-
if (PBUILDIN_FUNCTION_MASK.equals(className)) {
81+
if (PBUILTIN_FUNCTION_MASK.equals(className)) {
7682
return DetailsUtils.getInstanceFieldString(instance, "name", heap); // NOI18N
7783
}
84+
if (PBUILTIN_METHOD_MASK.equals(className)) {
85+
Object moduleO = instance.getValueOfField("self"); // NOI18N
86+
if (!(moduleO instanceof Instance)) moduleO = null;
87+
else if (!((Instance)moduleO).getJavaClass().getName().equals(PMODULE_MASK)) moduleO = null;
88+
String module = moduleO == null ? null : DetailsUtils.getInstanceString((Instance)moduleO, heap);
89+
String function = DetailsUtils.getInstanceFieldString(instance, "function", heap); // NOI18N
90+
if (function != null) return module != null ? module + "." + function : function; // NOI18N
91+
return null;
92+
}
93+
if (PMETHOD_MASK.equals(className)) {
94+
return DetailsUtils.getInstanceFieldString(instance, "function", heap); // NOI18N
95+
}
96+
if (PDECORATEDMETHOD_MASK.equals(className)) {
97+
return DetailsUtils.getInstanceFieldString(instance, "callable", heap); // NOI18N
98+
}
99+
if (PCELL_MASK.equals(className)) {
100+
Object refO = instance.getValueOfField("ref");
101+
if (!(refO instanceof Instance)) refO = null;
102+
else if (((Instance)refO).getJavaClass().getName().equals(PLIST_MASK)) refO = null;
103+
else if (((Instance)refO).getJavaClass().getName().equals(PTUPLE_MASK)) refO = null;
104+
return refO == null ? null : DetailsUtils.getInstanceString((Instance)refO, heap);
105+
}
78106
if (PFUNCTION_MASK.equals(className)) {
79107
String enclName = DetailsUtils.getInstanceFieldString(instance, "enclosingClassName", heap); // NOI18N
80108
String name = DetailsUtils.getInstanceFieldString(instance, "name", heap); // NOI18N
81109

82110
if (enclName != null && !enclName.isEmpty()) {
83111
if (name != null) {
84-
return enclName+"."+name;
112+
return enclName+"."+name; // NOI18N
85113
}
86114
}
87115
return name;
88116
}
89117
if (PSTRING_MASK.equals(className)) {
90118
return DetailsUtils.getInstanceFieldString(instance, "value", heap); // NOI18N
91119
}
92-
if (PBUILDIN_CLASSTYPE_MASK.equals(className)) {
120+
if (PBUILTIN_CLASSTYPE_MASK.equals(className)) {
93121
// get name field of PythonBuiltinClassType - there is a conflict with name field from Enum
94122
for (Object fv : instance.getFieldValues()) {
95123
if (fv instanceof ObjectFieldValue) {
96124
ObjectFieldValue ofv = (ObjectFieldValue) fv;
97-
if ("name".equals(ofv.getField().getName())) {
125+
if ("name".equals(ofv.getField().getName())) { // NOI18N
98126
return DetailsUtils.getInstanceString(ofv.getInstance(), heap);
99127
}
100128
}
@@ -150,18 +178,24 @@ public String getDetailsString(String className, Instance instance, Heap heap) {
150178
return DetailsUtils.getInstanceFieldString(instance, "name", heap); // NOI18N
151179
}
152180
if (PLAZY_STRING_MASK.equals(className)) {
153-
Object val = instance.getValueOfField("length"); // NOI18N
154181
Object vall = instance.getValueOfField("left"); // NOI18N
155182
Object valr = instance.getValueOfField("right"); // NOI18N
156183

157-
if (val instanceof Integer) {
158-
String left = DetailsUtils.getInstanceString((Instance)vall, heap);
184+
String left = DetailsUtils.getInstanceString((Instance)vall, heap);
159185

160-
if (valr == null || left.length() > DetailsUtils.MAX_ARRAY_LENGTH) {
161-
return left;
162-
}
163-
return left + DetailsUtils.getInstanceString((Instance)valr, heap);
186+
if (valr == null || left.length() > DetailsUtils.MAX_ARRAY_LENGTH) {
187+
return left;
164188
}
189+
return left + DetailsUtils.getInstanceString((Instance)valr, heap);
190+
}
191+
if (PRANGE_MASK.equals(className)) {
192+
int start = DetailsUtils.getIntFieldValue(instance, "start", 0); // NOI18N
193+
int stop = DetailsUtils.getIntFieldValue(instance, "stop", 0); // NOI18N
194+
int step = DetailsUtils.getIntFieldValue(instance, "step", 1); // NOI18N
195+
return "[" + start + ", " + stop + ", " + step + "]"; // NOI18N
196+
}
197+
if (PSOCKET_MASK.equals(className)) {
198+
return DetailsUtils.getInstanceFieldString(instance, "address", heap); // NOI18N
165199
}
166200
return null;
167201
}

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

Lines changed: 114 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
import org.graalvm.visualvm.lib.jfluid.heap.ObjectFieldValue;
4545
import org.graalvm.visualvm.lib.profiler.api.icons.Icons;
4646
import org.graalvm.visualvm.lib.profiler.api.icons.LanguageIcons;
47+
import org.graalvm.visualvm.lib.profiler.heapwalk.details.spi.DetailsUtils;
4748
import org.openide.util.lookup.ServiceProvider;
4849

4950
/**
@@ -77,12 +78,124 @@ static String getLogicalValue(PythonObject object, String type, Heap heap) {
7778
if ("ModuleSpec".equals(type)) { // NOI18N
7879
List<FieldValue> attributes = object.getAttributes();
7980
for (FieldValue attribute : attributes) {
80-
if ("name".equals(attribute.getField().getName()) && attribute instanceof ObjectFieldValue) {
81+
if ("name".equals(attribute.getField().getName()) && attribute instanceof ObjectFieldValue) { // NOI18N
8182
Instance attributeI = ((ObjectFieldValue)attribute).getInstance();
8283
logicalValue = DetailsSupport.getDetailsString(attributeI, heap);
8384
break;
8485
}
8586
}
87+
} else if ("SourceFileLoader".equals(type)) { // NOI18N
88+
List<FieldValue> attributes = object.getAttributes();
89+
for (FieldValue attribute : attributes) {
90+
if ("path".equals(attribute.getField().getName()) && attribute instanceof ObjectFieldValue) { // NOI18N
91+
Instance attributeI = ((ObjectFieldValue)attribute).getInstance();
92+
logicalValue = DetailsSupport.getDetailsString(attributeI, heap);
93+
break;
94+
}
95+
}
96+
} else if ("mappingproxy".equals(type)) { // NOI18N
97+
List<FieldValue> attributes = object.getAttributes();
98+
for (FieldValue attribute : attributes) {
99+
if ("__name__".equals(attribute.getField().getName()) && attribute instanceof ObjectFieldValue) { // NOI18N
100+
Instance attributeI = ((ObjectFieldValue)attribute).getInstance();
101+
logicalValue = DetailsSupport.getDetailsString(attributeI, heap);
102+
break;
103+
}
104+
}
105+
} else if ("generator".equals(type)) { // NOI18N
106+
logicalValue = DetailsUtils.getInstanceFieldString(object.getInstance(), "name", heap); // NOI18N
107+
} else if ("FileIO".equals(type)) { // NOI18N
108+
List<FieldValue> attributes = object.getAttributes();
109+
for (FieldValue attribute : attributes) {
110+
if ("name".equals(attribute.getField().getName()) && attribute instanceof ObjectFieldValue) { // NOI18N
111+
Instance attributeI = ((ObjectFieldValue)attribute).getInstance();
112+
logicalValue = DetailsSupport.getDetailsString(attributeI, heap);
113+
break;
114+
}
115+
}
116+
} else if ("super".equals(type)) { // NOI18N
117+
Object moduleO = object.getInstance().getValueOfField("type"); // NOI18N
118+
if (!(moduleO instanceof Instance)) moduleO = null;
119+
else if (!((Instance)moduleO).getJavaClass().getName().equals("com.oracle.graal.python.builtins.objects.type.PythonClass")) moduleO = null; // NOI18N
120+
logicalValue = moduleO == null ? null : DetailsUtils.getInstanceString((Instance)moduleO, heap);
121+
} else if ("code".equals(type)) { // NOI18N
122+
Object callTarget = object.getInstance().getValueOfField("callTarget"); // NOI18N
123+
if (callTarget instanceof Instance) {
124+
Object rootNode = ((Instance)callTarget).getValueOfField("rootNode"); // NOI18N
125+
if (rootNode instanceof Instance) {
126+
logicalValue = DetailsUtils.getInstanceFieldString((Instance)rootNode, "functionName", heap); // NOI18N
127+
}
128+
}
129+
} else if ("FileFinder".equals(type)) { // NOI18N
130+
List<FieldValue> attributes = object.getAttributes();
131+
for (FieldValue attribute : attributes) {
132+
if ("path".equals(attribute.getField().getName()) && attribute instanceof ObjectFieldValue) { // NOI18N
133+
Instance attributeI = ((ObjectFieldValue)attribute).getInstance();
134+
logicalValue = DetailsSupport.getDetailsString(attributeI, heap);
135+
break;
136+
}
137+
}
138+
} else if ("BufferedReader".equals(type) || "BufferedWriter".equals(type)) { // NOI18N
139+
List<FieldValue> attributes = object.getAttributes();
140+
for (FieldValue attribute : attributes) {
141+
if ("_raw".equals(attribute.getField().getName()) && attribute instanceof ObjectFieldValue) { // NOI18N
142+
Instance attributeI = ((ObjectFieldValue)attribute).getInstance();
143+
if (PythonObject.isPythonObject(attributeI)) {
144+
logicalValue = getLogicalValue(new PythonObject(attributeI), "FileIO", heap); // NOI18N
145+
break;
146+
}
147+
}
148+
}
149+
} else if ("TextIOWrapper".equals(type)) { // NOI18N
150+
List<FieldValue> attributes = object.getAttributes();
151+
for (FieldValue attribute : attributes) {
152+
if ("_buffer".equals(attribute.getField().getName()) && attribute instanceof ObjectFieldValue) { // NOI18N
153+
Instance attributeI = ((ObjectFieldValue)attribute).getInstance();
154+
if (PythonObject.isPythonObject(attributeI)) {
155+
logicalValue = getLogicalValue(new PythonObject(attributeI), "BufferedWriter", heap); // NOI18N
156+
break;
157+
}
158+
}
159+
}
160+
} else if ("TemplateFormatter".equals(type)) { // NOI18N
161+
List<FieldValue> attributes = object.getAttributes();
162+
for (FieldValue attribute : attributes) {
163+
if ("template".equals(attribute.getField().getName()) && attribute instanceof ObjectFieldValue) { // NOI18N
164+
Instance attributeI = ((ObjectFieldValue)attribute).getInstance();
165+
logicalValue = DetailsSupport.getDetailsString(attributeI, heap);
166+
break;
167+
}
168+
}
169+
} else if ("_Printer".equals(type)) { // NOI18N
170+
List<FieldValue> attributes = object.getAttributes();
171+
for (FieldValue attribute : attributes) {
172+
if ("__name".equals(attribute.getField().getName()) && attribute instanceof ObjectFieldValue) { // NOI18N
173+
Instance attributeI = ((ObjectFieldValue)attribute).getInstance();
174+
logicalValue = DetailsSupport.getDetailsString(attributeI, heap);
175+
break;
176+
}
177+
}
178+
} else if ("Quitter".equals(type)) { // NOI18N
179+
List<FieldValue> attributes = object.getAttributes();
180+
for (FieldValue attribute : attributes) {
181+
if ("name".equals(attribute.getField().getName()) && attribute instanceof ObjectFieldValue) { // NOI18N
182+
Instance attributeI = ((ObjectFieldValue)attribute).getInstance();
183+
logicalValue = DetailsSupport.getDetailsString(attributeI, heap);
184+
break;
185+
}
186+
}
187+
} else if ("CodecInfo".equals(type)) { // NOI18N
188+
List<FieldValue> attributes = object.getAttributes();
189+
for (FieldValue attribute : attributes) {
190+
if ("name".equals(attribute.getField().getName()) && attribute instanceof ObjectFieldValue) { // NOI18N
191+
Instance attributeI = ((ObjectFieldValue)attribute).getInstance();
192+
logicalValue = DetailsSupport.getDetailsString(attributeI, heap);
193+
break;
194+
}
195+
}
196+
} else if ("dict".equals(type)) { // NOI18N
197+
List<FieldValue> attributes = object.getAttributes();
198+
logicalValue = attributes.size() + " pairs"; // NOI18N
86199
}
87200

88201
if (logicalValue != null && logicalValue.length() > MAX_LOGVALUE_LENGTH)

0 commit comments

Comments
 (0)