Index: pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/operations.dart |
diff --git a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/operations.dart b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/operations.dart |
index 72538db5a005269ca2e398814d8718390f395448..d30b6280fa7028158bad9f2c0091dcf0a7aa13af 100644 |
--- a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/operations.dart |
+++ b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/operations.dart |
@@ -33,7 +33,7 @@ class InvocationImpl extends Invocation { |
dload(obj, field) { |
var f = _canonicalMember(obj, field); |
- _trackCall(obj, f); |
+ _trackCall(obj); |
if (f != null) { |
if (hasMethod(obj, f)) return bind(obj, f, JS('', 'void 0')); |
return JS('', '#[#]', obj, f); |
@@ -44,7 +44,7 @@ dload(obj, field) { |
dput(obj, field, value) { |
var f = _canonicalMember(obj, field); |
- _trackCall(obj, f); |
+ _trackCall(obj); |
if (f != null) { |
return JS('', '#[#] = #', obj, f, value); |
} |
@@ -106,7 +106,7 @@ extractNamedArgs(args) { |
} |
_checkAndCall(f, ftype, obj, typeArgs, args, name) => JS('', '''(() => { |
- $_trackCall($obj, $name); |
+ $_trackCall($obj); |
let originalTarget = obj === void 0 ? f : obj; |
@@ -182,17 +182,28 @@ dcall(f, @rest args) => _checkAndCall( |
dgcall(f, typeArgs, @rest args) => _checkAndCall( |
f, _getRuntimeType(f), JS('', 'void 0'), typeArgs, args, 'call'); |
-Map<String, int> _callMethodStats = new Map(); |
+class _MethodStats { |
+ final String typeName; |
+ final String frame; |
+ int count; |
+ |
+ _MethodStats(this.typeName, this.frame) { |
+ count = 0; |
+ } |
+} |
+ |
+Map<String, _MethodStats> _callMethodStats = new Map(); |
List<List<Object>> getDynamicStats() { |
List<List<Object>> ret = []; |
var keys = _callMethodStats.keys.toList(); |
- keys.sort((a, b) => _callMethodStats[b].compareTo(_callMethodStats[a])); |
+ keys.sort((a, b) => _callMethodStats[b].count.compareTo( |
+ _callMethodStats[a].count)); |
for (var key in keys) { |
- int count = _callMethodStats[key]; |
- ret.add([key, count]); |
+ var stats = _callMethodStats[key]; |
+ ret.add([stats.typeName, stats.frame, stats.count]); |
} |
return ret; |
@@ -204,7 +215,7 @@ clearDynamicStats() { |
bool trackProfile = JS('bool', 'dart.global.trackDdcProfile'); |
-_trackCall(obj, name) { |
+_trackCall(obj) { |
if (JS('bool', '!#', trackProfile)) return; |
var actual = getReifiedType(obj); |
@@ -219,12 +230,9 @@ _trackCall(obj, name) { |
} |
} |
- name = "${typeName(actual)}.$name <$src>"; |
- if (_callMethodStats.containsKey(name)) { |
- _callMethodStats[name] = _callMethodStats[name] + 1; |
- } else { |
- _callMethodStats[name] = 1; |
- } |
+ var actualTypeName = typeName(actual); |
+ _callMethodStats.putIfAbsent("$actualTypeName <$src>", |
+ () => new _MethodStats(actualTypeName, src)).count++; |
} |
/// Shared code for dsend, dindex, and dsetindex. |