Index: runtime/observatory/lib/src/elements/retaining_path.dart |
diff --git a/runtime/observatory/lib/src/elements/retaining_path.dart b/runtime/observatory/lib/src/elements/retaining_path.dart |
index 547b573c90224e012472cda8a9f3fda3ae8ed356..dc6c88c6b81cd9070518cf375e78fbe7df51b19b 100644 |
--- a/runtime/observatory/lib/src/elements/retaining_path.dart |
+++ b/runtime/observatory/lib/src/elements/retaining_path.dart |
@@ -85,27 +85,37 @@ class RetainingPathElement extends HtmlElement implements Renderable { |
if (_path == null) { |
return [new SpanElement()..text = 'Loading']; |
} |
- return _path.elements.map(_createItem).toList(); |
+ |
+ var elements = new List(); |
+ bool first = true; |
+ for (var item in _path.elements) { |
+ elements.add(_createItem(item, first)); |
+ first = false; |
+ } |
+ elements.add(_createGCRootItem()); |
+ return elements; |
} |
- Element _createItem(M.RetainingPathItem item) { |
+ Element _createItem(M.RetainingPathItem item, bool first) { |
final content = <Element>[]; |
- if (item.parentField != null) { |
+ if (first) { |
+ // No prefix. |
+ } else if (item.parentField != null) { |
content.add(new SpanElement() |
..children = [ |
- new SpanElement()..text = 'from ', |
+ new SpanElement()..text = 'retained by ', |
anyRef(_isolate, item.parentField, _instances, queue: _r.queue), |
new SpanElement()..text = ' of ', |
]); |
} else if (item.parentListIndex != null) { |
- content.add( |
- new SpanElement()..text = 'from [ ${item.parentListIndex} ] of '); |
+ content.add(new SpanElement() |
+ ..text = 'retained by [ ${item.parentListIndex} ] of '); |
} else if (item.parentWordOffset != null) { |
content.add(new SpanElement() |
- ..text = 'from word [ ${item.parentWordOffset} ] of '); |
+ ..text = 'retained by offset ${item.parentWordOffset} of '); |
} else { |
- content.add(new SpanElement()..text = 'from '); |
+ content.add(new SpanElement()..text = 'retained by '); |
} |
content.add(anyRef(_isolate, item.source, _instances, queue: _r.queue)); |
@@ -114,4 +124,10 @@ class RetainingPathElement extends HtmlElement implements Renderable { |
..classes = ['indent'] |
..children = content; |
} |
+ |
+ Element _createGCRootItem() { |
+ return new DivElement() |
+ ..classes = ['indent'] |
+ ..text = 'retained by a GC root'; |
+ } |
} |