| Index: runtime/observatory/lib/src/elements/cpu_profile/virtual_tree.dart
|
| diff --git a/runtime/observatory/lib/src/elements/cpu_profile/virtual_tree.dart b/runtime/observatory/lib/src/elements/cpu_profile/virtual_tree.dart
|
| index 3eed1fb738df1ecb8ad2a8d5cd009770bf8a05ca..7617a20da4ada1bc6083171d19f10695b4699cf2 100644
|
| --- a/runtime/observatory/lib/src/elements/cpu_profile/virtual_tree.dart
|
| +++ b/runtime/observatory/lib/src/elements/cpu_profile/virtual_tree.dart
|
| @@ -29,14 +29,12 @@ class CpuProfileVirtualTreeElement extends HtmlElement implements Renderable {
|
|
|
| M.ProfileTreeDirection _direction;
|
| ProfileTreeMode _mode;
|
| - M.SampleProfileType _type;
|
| M.IsolateRef _isolate;
|
| M.SampleProfile _profile;
|
| Iterable<M.CallTreeNodeFilter> _filters;
|
|
|
| M.ProfileTreeDirection get direction => _direction;
|
| ProfileTreeMode get mode => _mode;
|
| - M.SampleProfileType get type => _type;
|
| M.IsolateRef get isolate => _isolate;
|
| M.SampleProfile get profile => _profile;
|
| Iterable<M.CallTreeNodeFilter> get filters => _filters;
|
| @@ -52,9 +50,9 @@ class CpuProfileVirtualTreeElement extends HtmlElement implements Renderable {
|
| factory CpuProfileVirtualTreeElement(
|
| M.IsolateRef isolate, M.SampleProfile profile,
|
| {ProfileTreeMode mode: ProfileTreeMode.function,
|
| - M.SampleProfileType type: M.SampleProfileType.cpu,
|
| M.ProfileTreeDirection direction: M.ProfileTreeDirection.exclusive,
|
| RenderingQueue queue}) {
|
| + assert(isolate != null);
|
| assert(profile != null);
|
| assert(mode != null);
|
| assert(direction != null);
|
| @@ -63,7 +61,6 @@ class CpuProfileVirtualTreeElement extends HtmlElement implements Renderable {
|
| e._isolate = isolate;
|
| e._profile = profile;
|
| e._mode = mode;
|
| - e._type = type;
|
| e._direction = direction;
|
| return e;
|
| }
|
| @@ -87,37 +84,18 @@ class CpuProfileVirtualTreeElement extends HtmlElement implements Renderable {
|
|
|
| void render() {
|
| var tree;
|
| - var create;
|
| var update;
|
| -
|
| - switch (type) {
|
| - case M.SampleProfileType.cpu:
|
| - create = _createCpuRow;
|
| - if (mode == ProfileTreeMode.code) {
|
| - update = _updateCpuCodeRow;
|
| - tree = _profile.loadCodeTree(_direction);
|
| - } else if (mode == ProfileTreeMode.function) {
|
| - update = _updateCpuFunctionRow;
|
| - tree = _profile.loadFunctionTree(_direction);
|
| - } else {
|
| - throw new Exception('Unknown ProfileTreeMode: $mode');
|
| - }
|
| + switch (mode) {
|
| + case ProfileTreeMode.code:
|
| + tree = _profile.loadCodeTree(_direction);
|
| + update = _updateCodeRow;
|
| break;
|
| - case M.SampleProfileType.memory:
|
| - create = _createMemoryRow;
|
| - if (mode == ProfileTreeMode.code) {
|
| - update = _updateMemoryCodeRow;
|
| - tree = _profile.loadCodeTree(_direction);
|
| - } else if (mode == ProfileTreeMode.function) {
|
| - update = _updateMemoryFunctionRow;
|
| - tree = _profile.loadFunctionTree(_direction);
|
| - } else {
|
| - throw new Exception('Unknown ProfileTreeMode: $mode');
|
| - }
|
| + case ProfileTreeMode.function:
|
| + tree = _profile.loadFunctionTree(_direction);
|
| + update = _updateFunctionRow;
|
| break;
|
| default:
|
| - throw new Exception('Unknown SampleProfileType: $type');
|
| - break;
|
| + throw new Exception('Unknown ProfileTreeMode: $mode');
|
| }
|
| if (filters != null) {
|
| tree = filters.fold(tree, (tree, filter) {
|
| @@ -128,7 +106,7 @@ class CpuProfileVirtualTreeElement extends HtmlElement implements Renderable {
|
| children = [new HeadingElement.h1()..text = 'No Results'];
|
| return;
|
| }
|
| - _tree = new VirtualTreeElement(create, update, _getChildren,
|
| + _tree = new VirtualTreeElement(_createRow, update, _getChildren,
|
| items: tree.root.children, queue: _r.queue);
|
| if (tree.root.children.length == 1) {
|
| _tree.expand(tree.root.children.first, autoExpandSingleChildNodes: true);
|
| @@ -136,7 +114,7 @@ class CpuProfileVirtualTreeElement extends HtmlElement implements Renderable {
|
| children = [_tree];
|
| }
|
|
|
| - static Element _createCpuRow(toggle) {
|
| + static Element _createRow(toggle) {
|
| return new DivElement()
|
| ..classes = ['tree-item']
|
| ..children = [
|
| @@ -157,33 +135,9 @@ class CpuProfileVirtualTreeElement extends HtmlElement implements Renderable {
|
| ];
|
| }
|
|
|
| - static Element _createMemoryRow(toggle) {
|
| - return new DivElement()
|
| - ..classes = ['tree-item']
|
| - ..children = [
|
| - new SpanElement()
|
| - ..classes = ['inclusive']
|
| - ..title = 'memory allocated from resulting calls: ',
|
| - new SpanElement()
|
| - ..classes = ['exclusive']
|
| - ..title = 'memory allocated during execution: ',
|
| - new SpanElement()..classes = ['lines'],
|
| - new ButtonElement()
|
| - ..classes = ['expander']
|
| - ..onClick.listen((_) => toggle(autoToggleSingleChildNodes: true)),
|
| - new SpanElement()
|
| - ..classes = ['percentage']
|
| - ..title = 'tree node %',
|
| - new SpanElement()..classes = ['name']
|
| - ];
|
| - }
|
| -
|
| static _getChildren(M.CallTreeNode node) => node.children;
|
|
|
| - static const String _expandedIcon = '▼';
|
| - static const String _collapsedIcon = '►';
|
| -
|
| - void _updateCpuFunctionRow(
|
| + void _updateFunctionRow(
|
| HtmlElement element, M.FunctionCallTreeNode item, int depth) {
|
| element.children[0].text = Utils
|
| .formatPercentNormalized(item.profileFunction.normalizedInclusiveTicks);
|
| @@ -191,8 +145,7 @@ class CpuProfileVirtualTreeElement extends HtmlElement implements Renderable {
|
| .formatPercentNormalized(item.profileFunction.normalizedExclusiveTicks);
|
| _updateLines(element.children[2].children, depth);
|
| if (item.children.isNotEmpty) {
|
| - element.children[3].text =
|
| - _tree.isExpanded(item) ? _expandedIcon : _collapsedIcon;
|
| + element.children[3].text = _tree.isExpanded(item) ? '▼' : '►';
|
| } else {
|
| element.children[3].text = '';
|
| }
|
| @@ -202,39 +155,14 @@ class CpuProfileVirtualTreeElement extends HtmlElement implements Renderable {
|
| ..classes = ['name'];
|
| }
|
|
|
| - void _updateMemoryFunctionRow(
|
| - HtmlElement element, M.FunctionCallTreeNode item, int depth) {
|
| - element.children[0].text =
|
| - Utils.formatSize(item.inclusiveNativeAllocations);
|
| - element.children[0].title = 'memory allocated from resulting calls: ' +
|
| - '${item.inclusiveNativeAllocations}B';
|
| - element.children[1].text =
|
| - Utils.formatSize(item.exclusiveNativeAllocations);
|
| - element.children[1].title = 'memory allocated during execution: ' +
|
| - '${item.exclusiveNativeAllocations}B';
|
| - _updateLines(element.children[2].children, depth);
|
| - if (item.children.isNotEmpty) {
|
| - element.children[3].text =
|
| - _tree.isExpanded(item) ? _expandedIcon : _collapsedIcon;
|
| - } else {
|
| - element.children[3].text = '';
|
| - }
|
| - element.children[4].text = Utils.formatPercentNormalized(item.percentage);
|
| - element.children[5] = new FunctionRefElement(
|
| - null, item.profileFunction.function, queue: _r.queue)
|
| - ..classes = ['name'];
|
| - }
|
| -
|
| - void _updateCpuCodeRow(
|
| - HtmlElement element, M.CodeCallTreeNode item, int depth) {
|
| + void _updateCodeRow(HtmlElement element, M.CodeCallTreeNode item, int depth) {
|
| element.children[0].text = Utils
|
| .formatPercentNormalized(item.profileCode.normalizedInclusiveTicks);
|
| element.children[1].text = Utils
|
| .formatPercentNormalized(item.profileCode.normalizedExclusiveTicks);
|
| _updateLines(element.children[2].children, depth);
|
| if (item.children.isNotEmpty) {
|
| - element.children[3].text =
|
| - _tree.isExpanded(item) ? _expandedIcon : _collapsedIcon;
|
| + element.children[3].text = _tree.isExpanded(item) ? '▼' : '►';
|
| } else {
|
| element.children[3].text = '';
|
| }
|
| @@ -243,28 +171,6 @@ class CpuProfileVirtualTreeElement extends HtmlElement implements Renderable {
|
| queue: _r.queue)..classes = ['name'];
|
| }
|
|
|
| - void _updateMemoryCodeRow(
|
| - HtmlElement element, M.CodeCallTreeNode item, int depth) {
|
| - element.children[0].text =
|
| - Utils.formatSize(item.inclusiveNativeAllocations);
|
| - element.children[0].title = 'memory allocated from resulting calls: ' +
|
| - '${item.inclusiveNativeAllocations}B';
|
| - element.children[1].text =
|
| - Utils.formatSize(item.exclusiveNativeAllocations);
|
| - element.children[1].title = 'memory allocated during execution: ' +
|
| - '${item.exclusiveNativeAllocations}B';
|
| - _updateLines(element.children[2].children, depth);
|
| - if (item.children.isNotEmpty) {
|
| - element.children[3].text =
|
| - _tree.isExpanded(item) ? _expandedIcon : _collapsedIcon;
|
| - } else {
|
| - element.children[3].text = '';
|
| - }
|
| - element.children[4].text = Utils.formatPercentNormalized(item.percentage);
|
| - element.children[5] = new CodeRefElement(null, item.profileCode.code,
|
| - queue: _r.queue)..classes = ['name'];
|
| - }
|
| -
|
| static _updateLines(List<Element> lines, int n) {
|
| n = Math.max(0, n);
|
| while (lines.length > n) {
|
|
|