Chromium Code Reviews| Index: runtime/observatory/lib/src/elements/heap_snapshot.dart |
| diff --git a/runtime/observatory/lib/src/elements/heap_snapshot.dart b/runtime/observatory/lib/src/elements/heap_snapshot.dart |
| index dc08c5d6216257283033761a79793312f3b162ba..b7e879ac98b8663999b74c9ec81d530057544773 100644 |
| --- a/runtime/observatory/lib/src/elements/heap_snapshot.dart |
| +++ b/runtime/observatory/lib/src/elements/heap_snapshot.dart |
| @@ -25,7 +25,12 @@ import 'package:observatory/src/elements/nav/top_menu.dart'; |
| import 'package:observatory/src/elements/nav/vm_menu.dart'; |
| import 'package:observatory/utils.dart'; |
| -enum HeapSnapshotTreeMode { dominatorTree, mergedDominatorTree, groupByClass } |
| +enum HeapSnapshotTreeMode { |
| + dominatorTree, |
| + mergedDominatorTree, |
| + ownershipTable, |
| + groupByClass |
| +} |
| class HeapSnapshotElement extends HtmlElement implements Renderable { |
| static const tag = |
| @@ -294,6 +299,15 @@ class HeapSnapshotElement extends HtmlElement implements Renderable { |
| _tree |
| ]); |
| break; |
| + case HeapSnapshotTreeMode.ownershipTable: |
| + final items = _snapshot.ownershipClasses.toList(); |
|
cbernaschina
2017/08/29 21:07:00
The field ownershipClasses is not defined in M.Hea
rmacnak
2017/08/29 23:59:34
Done.
|
| + items.sort((a, b) => b.size - a.size); |
| + _tree = new VirtualTreeElement(_createOwnershipClass, |
| + _updateOwnershipClass, _getChildrenOwnershipClass, |
| + items: items, queue: _r.queue); |
| + _tree.expand(_snapshot.dominatorTree); |
| + report.add(_tree); |
| + break; |
| case HeapSnapshotTreeMode.groupByClass: |
| final items = _snapshot.classReferences.toList(); |
| items.sort((a, b) => b.shallowSize - a.shallowSize); |
| @@ -363,6 +377,17 @@ class HeapSnapshotElement extends HtmlElement implements Renderable { |
| ]; |
| } |
| + static Element _createOwnershipClass(toggle) { |
| + return new DivElement() |
| + ..classes = ['tree-item'] |
| + ..children = [ |
| + new SpanElement() |
| + ..classes = ['size'] |
| + ..title = 'size', |
| + new SpanElement()..classes = ['name'] |
| + ]; |
| + } |
| + |
| static const int kMaxChildren = 100; |
| static const int kMinRetainedSize = 4096; |
| @@ -393,6 +418,10 @@ class HeapSnapshotElement extends HtmlElement implements Renderable { |
| return const []; |
| } |
| + static _getChildrenOwnershipClass(item) { |
| + return const []; |
| + } |
| + |
| void _updateDominator( |
| HtmlElement element, M.HeapSnapshotDominatorNode node, int depth) { |
| element.children[0].text = Utils.formatSize(node.retainedSize); |
| @@ -510,6 +539,14 @@ class HeapSnapshotElement extends HtmlElement implements Renderable { |
| } |
| } |
| + void _updateOwnershipClass(HtmlElement element, item, int depth) { |
| + _updateLines(element.children[1].children, depth); |
| + element.children[0].text = Utils.formatSize(item.size); |
| + element.children[1] = |
| + new ClassRefElement(_isolate, item.clazz, queue: _r.queue) |
| + ..classes = ['name']; |
| + } |
| + |
| static _updateLines(List<Element> lines, int n) { |
| n = Math.max(0, n); |
| while (lines.length > n) { |
| @@ -554,6 +591,8 @@ class HeapSnapshotElement extends HtmlElement implements Renderable { |
| return 'Dominator tree'; |
| case HeapSnapshotTreeMode.mergedDominatorTree: |
| return 'Dominator tree (merged siblings by class)'; |
| + case HeapSnapshotTreeMode.ownershipTable: |
| + return 'Ownership table'; |
| case HeapSnapshotTreeMode.groupByClass: |
| return 'Group by class'; |
| } |