Skip to content

Commit d620d43

Browse files
committed
GH-431 logical value for Decimal class
1 parent 6282157 commit d620d43

File tree

1 file changed

+53
-4
lines changed
  • visualvm/heapviewer.truffle/src/org/graalvm/visualvm/heapviewer/truffle/lang/python

1 file changed

+53
-4
lines changed

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

Lines changed: 53 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,26 +24,28 @@
2424
*/
2525
package org.graalvm.visualvm.heapviewer.truffle.lang.python;
2626

27+
import java.math.BigDecimal;
28+
import java.math.BigInteger;
2729
import java.util.List;
30+
import java.util.Map;
31+
import javax.swing.Icon;
2832
import org.graalvm.visualvm.heapviewer.HeapContext;
2933
import org.graalvm.visualvm.heapviewer.model.HeapViewerNode;
3034
import org.graalvm.visualvm.heapviewer.truffle.nodes.TruffleLocalObjectNode;
3135
import org.graalvm.visualvm.heapviewer.truffle.nodes.TruffleObjectFieldNode;
32-
import org.graalvm.visualvm.lib.jfluid.heap.Heap;
33-
import org.graalvm.visualvm.lib.profiler.heapwalk.details.api.DetailsSupport;
3436
import org.graalvm.visualvm.heapviewer.truffle.nodes.TruffleObjectNode;
3537
import org.graalvm.visualvm.heapviewer.truffle.nodes.TruffleObjectReferenceNode;
3638
import org.graalvm.visualvm.heapviewer.truffle.nodes.TruffleOpenNodeActionProvider;
3739
import org.graalvm.visualvm.heapviewer.truffle.nodes.TruffleTypeNode;
3840
import org.graalvm.visualvm.heapviewer.ui.HeapViewerNodeAction;
3941
import org.graalvm.visualvm.heapviewer.ui.HeapViewerRenderer;
40-
import java.util.Map;
41-
import javax.swing.Icon;
4242
import org.graalvm.visualvm.lib.jfluid.heap.FieldValue;
43+
import org.graalvm.visualvm.lib.jfluid.heap.Heap;
4344
import org.graalvm.visualvm.lib.jfluid.heap.Instance;
4445
import org.graalvm.visualvm.lib.jfluid.heap.ObjectFieldValue;
4546
import org.graalvm.visualvm.lib.profiler.api.icons.Icons;
4647
import org.graalvm.visualvm.lib.profiler.api.icons.LanguageIcons;
48+
import org.graalvm.visualvm.lib.profiler.heapwalk.details.api.DetailsSupport;
4749
import org.graalvm.visualvm.lib.profiler.heapwalk.details.spi.DetailsUtils;
4850
import org.openide.util.lookup.ServiceProvider;
4951

@@ -196,6 +198,46 @@ static String getLogicalValue(PythonObject object, String type) {
196198
} else if ("dict".equals(type)) { // NOI18N
197199
List<FieldValue> attributes = object.getAttributes();
198200
logicalValue = attributes.size() + " pairs"; // NOI18N
201+
} else if ("Decimal".equals(type)) { // NOI18N
202+
String _int = null;
203+
String _exp = null;
204+
String _sig = null;
205+
String _is_special = null;
206+
207+
for (FieldValue attribute : object.getAttributes()) {
208+
String attrName = attribute.getField().getName();
209+
210+
if ("_int (hidden)".equals(attrName)) { // NOI18N
211+
_int = getAttributeValue(attribute);
212+
} else if ("_exp (hidden)".equals(attrName)) { // NOI18N
213+
_exp = getAttributeValue(attribute);
214+
} else if ("_sign (hidden)".equals(attrName)) { // NOI18N
215+
_sig = getAttributeValue(attribute);
216+
} else if ("_is_special (hidden)".equals(attrName)) { // NOI18N
217+
_is_special = getAttributeValue(attribute);
218+
}
219+
}
220+
if (_int != null && _exp != null && _sig != null && _is_special != null) {
221+
int _sigObj = Integer.valueOf(_sig);
222+
223+
if (_is_special.equals(Boolean.TRUE.toString())) {
224+
// special values
225+
String sign = _sigObj == 1 ? "-" : ""; // NOI18N
226+
if ("F".equals(_exp)) { // NOI18N
227+
return sign + "Infinity"; // NOI18N
228+
} else if ("n".equals(_exp)) { // NOI18N
229+
return sign + "NaN" + _int; // NOI18N
230+
} else if ("N".equals(_exp)) { // NOI18N
231+
return sign + "sNaN" + _int; // NOI18N
232+
}
233+
}
234+
BigInteger _intObj = new BigInteger(_int);
235+
int _expObj = Integer.valueOf(_exp);
236+
if (_sigObj == 1) {
237+
_intObj = _intObj.negate();
238+
}
239+
return new BigDecimal(_intObj, -_expObj).toString();
240+
}
199241
}
200242

201243
if (logicalValue != null && logicalValue.length() > MAX_LOGVALUE_LENGTH)
@@ -205,6 +247,13 @@ static String getLogicalValue(PythonObject object, String type) {
205247
DetailsSupport.getDetailsString(object.getInstance());
206248
}
207249

250+
private static String getAttributeValue(FieldValue attribute) {
251+
if (attribute instanceof ObjectFieldValue) {
252+
Instance attributeI = ((ObjectFieldValue)attribute).getInstance();
253+
return DetailsSupport.getDetailsString(attributeI);
254+
}
255+
return attribute.getValue();
256+
}
208257

209258
private static String computeObjectName(TruffleObjectNode.InstanceBased<PythonObject> node) {
210259
String typeString = node.getTypeName();

0 commit comments

Comments
 (0)