24
24
*/
25
25
package org .graalvm .visualvm .heapviewer .truffle .lang .python ;
26
26
27
+ import java .math .BigDecimal ;
28
+ import java .math .BigInteger ;
27
29
import java .util .List ;
30
+ import java .util .Map ;
31
+ import javax .swing .Icon ;
28
32
import org .graalvm .visualvm .heapviewer .HeapContext ;
29
33
import org .graalvm .visualvm .heapviewer .model .HeapViewerNode ;
30
34
import org .graalvm .visualvm .heapviewer .truffle .nodes .TruffleLocalObjectNode ;
31
35
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 ;
34
36
import org .graalvm .visualvm .heapviewer .truffle .nodes .TruffleObjectNode ;
35
37
import org .graalvm .visualvm .heapviewer .truffle .nodes .TruffleObjectReferenceNode ;
36
38
import org .graalvm .visualvm .heapviewer .truffle .nodes .TruffleOpenNodeActionProvider ;
37
39
import org .graalvm .visualvm .heapviewer .truffle .nodes .TruffleTypeNode ;
38
40
import org .graalvm .visualvm .heapviewer .ui .HeapViewerNodeAction ;
39
41
import org .graalvm .visualvm .heapviewer .ui .HeapViewerRenderer ;
40
- import java .util .Map ;
41
- import javax .swing .Icon ;
42
42
import org .graalvm .visualvm .lib .jfluid .heap .FieldValue ;
43
+ import org .graalvm .visualvm .lib .jfluid .heap .Heap ;
43
44
import org .graalvm .visualvm .lib .jfluid .heap .Instance ;
44
45
import org .graalvm .visualvm .lib .jfluid .heap .ObjectFieldValue ;
45
46
import org .graalvm .visualvm .lib .profiler .api .icons .Icons ;
46
47
import org .graalvm .visualvm .lib .profiler .api .icons .LanguageIcons ;
48
+ import org .graalvm .visualvm .lib .profiler .heapwalk .details .api .DetailsSupport ;
47
49
import org .graalvm .visualvm .lib .profiler .heapwalk .details .spi .DetailsUtils ;
48
50
import org .openide .util .lookup .ServiceProvider ;
49
51
@@ -196,6 +198,46 @@ static String getLogicalValue(PythonObject object, String type) {
196
198
} else if ("dict" .equals (type )) { // NOI18N
197
199
List <FieldValue > attributes = object .getAttributes ();
198
200
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
+ }
199
241
}
200
242
201
243
if (logicalValue != null && logicalValue .length () > MAX_LOGVALUE_LENGTH )
@@ -205,6 +247,13 @@ static String getLogicalValue(PythonObject object, String type) {
205
247
DetailsSupport .getDetailsString (object .getInstance ());
206
248
}
207
249
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
+ }
208
257
209
258
private static String computeObjectName (TruffleObjectNode .InstanceBased <PythonObject > node ) {
210
259
String typeString = node .getTypeName ();
0 commit comments