| Index: runtime/bin/vmservice/client/lib/src/service/object.dart
|
| diff --git a/runtime/bin/vmservice/client/lib/src/service/object.dart b/runtime/bin/vmservice/client/lib/src/service/object.dart
|
| index ea21d2849c01c59d720bceb9c997e5f328a2388d..fd379ffe7ee5d916a6233d0785b58a764e09f245 100644
|
| --- a/runtime/bin/vmservice/client/lib/src/service/object.dart
|
| +++ b/runtime/bin/vmservice/client/lib/src/service/object.dart
|
| @@ -61,6 +61,10 @@ class Isolate extends ServiceObject {
|
| }
|
| _codes._resetProfileData();
|
| _codes._updateProfileData(profile, codeTable);
|
| + var exclusiveTrie = profile['exclusive_trie'];
|
| + if (exclusiveTrie != null) {
|
| + profileTrieRoot = _processProfileTrie(exclusiveTrie, codeTable);
|
| + }
|
| }
|
|
|
| Future<ServiceObject> getDirect(String serviceId) {
|
| @@ -142,6 +146,35 @@ class Isolate extends ServiceObject {
|
| newHeapUsed = map['heap']['usedNew'];
|
| oldHeapUsed = map['heap']['usedOld'];
|
| }
|
| +
|
| + @reflectable CodeTrieNode profileTrieRoot;
|
| + int _trieDataCursor;
|
| + List<int> _trieData;
|
| + CodeTrieNode _readTrieNode(List<Code> codeTable) {
|
| + var index = _trieData[_trieDataCursor++];
|
| + var code = codeTable[index];
|
| + var count = _trieData[_trieDataCursor++];
|
| + var children = _trieData[_trieDataCursor++];
|
| + var node = new CodeTrieNode(code, count);
|
| + for (var i = 0; i < children; i++) {
|
| + var child = _readTrieNode(codeTable);
|
| + node.children.add(child);
|
| + node.summedChildCount += child.count;
|
| + }
|
| + return node;
|
| + }
|
| +
|
| + CodeTrieNode _processProfileTrie(List<int> data, List<Code> codeTable) {
|
| + _trieDataCursor = 0;
|
| + _trieData = data;
|
| + if (_trieData == null) {
|
| + return null;
|
| + }
|
| + if (_trieData.length < 3) {
|
| + return null;
|
| + }
|
| + return _readTrieNode(codeTable);
|
| + }
|
| }
|
|
|
| // TODO(johnmccutchan): Make this into an IsolateCache.
|
| @@ -450,6 +483,8 @@ class CodeKind {
|
| return Collected;
|
| } else if (s == 'Reused') {
|
| return Reused;
|
| + } else if (s == 'Tag') {
|
| + return Tag;
|
| }
|
| Logger.root.warning('Unknown code kind $s');
|
| throw new FallThroughError();
|
| @@ -458,6 +493,7 @@ class CodeKind {
|
| static const Dart = const CodeKind._internal('Dart');
|
| static const Collected = const CodeKind._internal('Collected');
|
| static const Reused = const CodeKind._internal('Reused');
|
| + static const Tag = const CodeKind._internal('Tag');
|
| }
|
|
|
| class CodeCallCount {
|
| @@ -466,6 +502,14 @@ class CodeCallCount {
|
| CodeCallCount(this.code, this.count);
|
| }
|
|
|
| +class CodeTrieNode {
|
| + final Code code;
|
| + final int count;
|
| + final children = new List<CodeTrieNode>();
|
| + int summedChildCount = 0;
|
| + CodeTrieNode(this.code, this.count);
|
| +}
|
| +
|
| class Code extends ServiceObject {
|
| @observable CodeKind kind;
|
| @observable int totalSamplesInProfile = 0;
|
|
|