@@ -222,11 +222,13 @@ private HeapViewerNode[] computeInstancesReferences(final InstancesWrapper insta
222
222
progress .step ();
223
223
List <Value > references = instance .getReferences ();
224
224
Set <Instance > referers = new HashSet ();
225
- for (Value reference : references ) {
225
+ if (references .isEmpty ()) {
226
+ referers .add (null );
227
+ } else for (Value reference : references ) {
226
228
referers .add (logicalReferer (reference .getDefiningInstance ()));
227
229
}
228
230
for (Instance referer : referers ) {
229
- long refererID = referer .getInstanceId ();
231
+ long refererID = referer == null ? - 1 : referer .getInstanceId ();
230
232
Integer count = values .get (refererID );
231
233
if (count == null ) count = 0 ;
232
234
values .put (refererID , ++count );
@@ -244,7 +246,8 @@ protected boolean sorts(DataType dataType) {
244
246
return true ;
245
247
}
246
248
protected HeapViewerNode createNode (final Map .Entry <Long , Integer > node ) {
247
- return new ReferenceNode (heap .getInstanceByID (node .getKey ())) {
249
+ long refererID = node .getKey ();
250
+ return new ReferenceNode (refererID == -1 ? null : heap .getInstanceByID (refererID )) {
248
251
@ Override
249
252
int getCount () { return node .getValue (); }
250
253
@ Override
@@ -294,7 +297,7 @@ private static void storeItem(String itemName, boolean value) {
294
297
"ReferenceNode_SamplesContainer=<sample {0} instances>" ,
295
298
"ReferenceNode_NodesContainer=<instances {0}-{1}>"
296
299
})
297
- private abstract class ReferenceNode extends InstanceNode {
300
+ private abstract class ReferenceNode extends InstanceNode . IncludingNull {
298
301
299
302
ReferenceNode (Instance reference ) {
300
303
super (reference );
@@ -325,6 +328,7 @@ protected ProgressIterator<Instance> objectsIterator(int index, Progress _progre
325
328
@ Override
326
329
protected boolean exclude (Instance instance ) {
327
330
List <Value > references = instance .getReferences ();
331
+ if (_instance == null ) return !references .isEmpty ();
328
332
for (Value reference : references )
329
333
if (_instance .equals (logicalReferer (reference .getDefiningInstance ())))
330
334
return false ;
@@ -354,6 +358,10 @@ protected Object getValue(DataType type, Heap heap) {
354
358
return super .getValue (type , heap );
355
359
}
356
360
361
+ public boolean isLeaf () {
362
+ return false ;
363
+ }
364
+
357
365
}
358
366
359
367
private static class ReferenceNodeRenderer extends InstanceNodeRenderer {
@@ -363,6 +371,21 @@ private static class ReferenceNodeRenderer extends InstanceNodeRenderer {
363
371
ReferenceNodeRenderer (Heap heap ) {
364
372
super (heap );
365
373
}
374
+
375
+ @ Override
376
+ public void setValue (Object value , int row ) {
377
+ if (value != null ) {
378
+ ReferenceNode node = (ReferenceNode )value ;
379
+ if (node .getInstance () == null ) {
380
+ setNormalValue (Bundle .JavaReferencesPlugin_NoReferences ());
381
+ setBoldValue ("" ); // NOI18N
382
+ setGrayValue ("" ); // NOI18N
383
+ setIcon (ICON );
384
+ return ;
385
+ }
386
+ }
387
+ super .setValue (value , row );
388
+ }
366
389
367
390
@ Override
368
391
protected ImageIcon getIcon (Instance instance , boolean isGCRoot ) {
@@ -383,11 +406,13 @@ protected HeapViewerNode[] lazilyComputeChildren(Heap heap, String viewID, HeapV
383
406
HeapOperations .initializeReferences (heap );
384
407
385
408
Instance referer = getReferer ();
409
+ if (referer == null ) return HeapViewerNode .NO_NODES ;
410
+
386
411
final List <Value > references = getInstance ().getReferences ();
387
412
Iterator <Value > referencesI = references .iterator ();
388
- while (referencesI .hasNext ())
389
- if (!referer .equals (logicalReferer (referencesI .next ().getDefiningInstance ())))
390
- referencesI .remove ();
413
+ while (referencesI .hasNext ())
414
+ if (!referer .equals (logicalReferer (referencesI .next ().getDefiningInstance ())))
415
+ referencesI .remove ();
391
416
392
417
NodesComputer <Value > computer = new NodesComputer <Value >(references .size (), 20 ) {
393
418
protected boolean sorts (DataType dataType ) {
@@ -414,6 +439,10 @@ protected String getNodesContainerString(String firstNodeIdx, String lastNodeIdx
414
439
return computer .computeNodes (ReferredInstanceNode .this , heap , viewID , null , dataTypes , sortOrders , progress );
415
440
}
416
441
442
+ public boolean isLeaf () {
443
+ return getReferer () == null ;
444
+ }
445
+
417
446
}
418
447
419
448
@@ -423,6 +452,7 @@ protected String getNodesContainerString(String firstNodeIdx, String lastNodeIdx
423
452
}));
424
453
425
454
private Instance logicalReferer (Instance realReferer ) {
455
+ if (realReferer == null ) return null ;
426
456
return logicalReferences ? logicalRefererImpl (realReferer ) : realReferer ;
427
457
}
428
458
0 commit comments