| Index: pkg/compiler/tool/status_files/rank_stacks.dart
|
| diff --git a/pkg/compiler/tool/status_files/rank_stacks.dart b/pkg/compiler/tool/status_files/rank_stacks.dart
|
| index 5d5f72a73b36f35dcce10d51c46793eb93949efb..f50dad32c1fe8859e411c3e5f688c78dd18f09bc 100644
|
| --- a/pkg/compiler/tool/status_files/rank_stacks.dart
|
| +++ b/pkg/compiler/tool/status_files/rank_stacks.dart
|
| @@ -37,8 +37,8 @@ void die(String why) {
|
| ArgParser argParser = new ArgParser()
|
| ..addOption('stacks',
|
| abbr: 's',
|
| - defaultsTo: '30',
|
| - help: 'Number of highest ranking stacks to print.')
|
| + defaultsTo: '0',
|
| + help: 'Number of highest ranking stacks to print (0 for all).')
|
| ..addOption('length',
|
| abbr: 'l', defaultsTo: '12', help: 'Number of stack frames printed.');
|
|
|
| @@ -74,7 +74,7 @@ main(args) {
|
| records.addAll(parse(text));
|
| }
|
|
|
| - var trie = new TrieNode(null);
|
| + var trie = new TrieNode(null, 0);
|
| for (var record in records) {
|
| enter(record, 0, trie);
|
| }
|
| @@ -83,11 +83,11 @@ main(args) {
|
| leaves.sort(compareNodesByCountAndStack);
|
| for (var leaf in howManyStacks == 0 ? leaves : leaves.take(howManyStacks)) {
|
| print('');
|
| - var examples = leaf.members.map((r) => r.fullReason).toSet().toList();
|
| + var examples = leaf.members.map(fullReasonOf).toSet().toList();
|
| examples.sort();
|
| print('${leaf.length} of:');
|
| for (var example in examples) {
|
| - var count = leaf.members.where((r) => r.fullReason == example).length;
|
| + var count = leaf.members.where((r) => fullReasonOf(r) == example).length;
|
| var countAligned = '$count'.padLeft(6);
|
| if (examples.length == 1) countAligned = ' .';
|
| var indentedExample = '\t' + example.replaceAll('\n', '\n\t');
|
| @@ -100,6 +100,11 @@ main(args) {
|
| }
|
| }
|
|
|
| +String fullReasonOf(Record r) {
|
| + // Some records have no matched reason, so default to test status.
|
| + return r.fullReason ?? r.actual;
|
| +}
|
| +
|
| int compareNodesByCountAndStack(TrieNode a, TrieNode b) {
|
| int r = b.length.compareTo(a.length);
|
| if (r != 0) return r;
|
| @@ -122,14 +127,17 @@ class TrieNode {
|
|
|
| int get length => members.length;
|
|
|
| - TrieNode(this.key, [this.depth = 0]);
|
| + TrieNode(this.key, this.depth);
|
|
|
| String toString() => 'TrieNode(#$length)';
|
| }
|
|
|
| void enter(Record record, int depth, TrieNode root) {
|
| - root.members.add(record);
|
| - if (depth >= record.stack.length) return;
|
| + // Cluster on printed stack.
|
| + if (depth >= stackPrintLength || depth >= record.stack.length) {
|
| + root.members.add(record);
|
| + return;
|
| + }
|
| var key = record.stack[depth];
|
| var node = root.map[key] ??= new TrieNode(key, depth + 1);
|
| enter(record, depth + 1, node);
|
| @@ -144,11 +152,10 @@ void printTrie(TrieNode node) {
|
| }
|
|
|
| trieLeaves(node) sync* {
|
| - if (node.map.isEmpty) {
|
| + if (node.members.isNotEmpty) {
|
| yield node;
|
| - } else {
|
| - for (var v in node.map.values) {
|
| - yield* trieLeaves(v);
|
| - }
|
| + }
|
| + for (var v in node.map.values) {
|
| + yield* trieLeaves(v);
|
| }
|
| }
|
|
|