Chromium Code Reviews| 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 d50113a1ffd925fd8b26f735ea5e3bd3da752533..37e7f2dfb299f4460b4fd8e1a3a2de50a99df9e9 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); |
| + } |
| } |
| /// Requests [serviceId] from [this]. Completes to a [ServiceObject]. |
| @@ -138,6 +142,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) { |
|
turnidge
2014/03/17 21:19:31
Consider adding a comment describing the trie data
Cutch
2014/03/18 14:39:19
Done.
|
| + 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. |
| @@ -446,6 +479,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(); |
| @@ -454,6 +489,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 { |
| @@ -462,6 +498,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; |