Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(8)

Unified Diff: lib/runtime/dart_sdk.js

Issue 2024353002: Profile dynamic calls. (Closed) Base URL: https://github.com/dart-lang/dev_compiler.git@master
Patch Set: Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
Download patch
« no previous file with comments | « no previous file | tool/input_sdk/private/ddc_runtime/operations.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: lib/runtime/dart_sdk.js
diff --git a/lib/runtime/dart_sdk.js b/lib/runtime/dart_sdk.js
index ef5c8aed4fa232bfe28c579a26d6205b07cb706c..7e8c20fbc08cc46c4feb5b4ef5c21f13f903af33 100644
--- a/lib/runtime/dart_sdk.js
+++ b/lib/runtime/dart_sdk.js
@@ -30,6 +30,8 @@ dart_library.library('dart_sdk', null, /* Imports */[
const web_audio = Object.create(null);
const web_gl = Object.create(null);
const web_sql = Object.create(null);
+ let ListOfProfileEntry = () => (ListOfProfileEntry = dart.constFn(core.List$(dart.ProfileEntry)))();
+ let MapOfString$int = () => (MapOfString$int = dart.constFn(core.Map$(core.String, core.int)))();
let ListOfString = () => (ListOfString = dart.constFn(core.List$(core.String)))();
let JSArrayOfFormatter = () => (JSArrayOfFormatter = dart.constFn(_interceptors.JSArray$(_debugger.Formatter)))();
let JSArrayOfNameValuePair = () => (JSArrayOfNameValuePair = dart.constFn(_interceptors.JSArray$(_debugger.NameValuePair)))();
@@ -470,6 +472,7 @@ dart_library.library('dart_sdk', null, /* Imports */[
let ListOfTransform = () => (ListOfTransform = dart.constFn(core.List$(svg$.Transform)))();
let CompleterOfAudioBuffer = () => (CompleterOfAudioBuffer = dart.constFn(async.Completer$(web_audio.AudioBuffer)))();
let EventStreamProviderOfAudioProcessingEvent = () => (EventStreamProviderOfAudioProcessingEvent = dart.constFn(html$.EventStreamProvider$(web_audio.AudioProcessingEvent)))();
+ let StringAndStringToint = () => (StringAndStringToint = dart.constFn(dart.definiteFunctionType(core.int, [core.String, core.String])))();
let dynamicToString = () => (dynamicToString = dart.constFn(dart.definiteFunctionType(core.String, [dart.dynamic])))();
let dynamicToListOfString = () => (dynamicToListOfString = dart.constFn(dart.definiteFunctionType(ListOfString(), [dart.dynamic])))();
let dynamicToList = () => (dynamicToList = dart.constFn(dart.definiteFunctionType(core.List, [dart.dynamic])))();
@@ -975,6 +978,7 @@ dart_library.library('dart_sdk', null, /* Imports */[
};
dart.dload = function(obj, field) {
field = dart._canonicalFieldName(obj, field, [], field);
+ dart._trackCall(obj, field);
if (dart.hasMethod(obj, field)) {
return dart.bind(obj, field);
}
@@ -983,6 +987,7 @@ dart_library.library('dart_sdk', null, /* Imports */[
};
dart.dput = function(obj, field, value) {
field = dart._canonicalFieldName(obj, field, [value], field);
+ dart._trackCall(obj, field);
obj[field] = value;
return value;
};
@@ -1026,6 +1031,7 @@ dart_library.library('dart_sdk', null, /* Imports */[
dart.throwNoSuchMethod(obj, name, pArgs);
};
dart._checkAndCall = function(f, ftype, obj, typeArgs, args, name) {
+ dart._trackCall(obj, name);
let originalFunction = f;
if (!(f instanceof Function)) {
if (f != null) {
@@ -1070,6 +1076,39 @@ dart_library.library('dart_sdk', null, /* Imports */[
dart.dgcall = function(f, typeArgs, ...args) {
return dart._checkAndCall(f, dart._getRuntimeType(f), void 0, typeArgs, args, 'call');
};
+ dart.getDynamicStats = function() {
+ let ret = ListOfProfileEntry().new();
+ let keys = dart._callMethodStats[dartx.keys][dartx.toList]();
+ keys[dartx.sort](dart.fn((a, b) => dart._callMethodStats[dartx.get](b)[dartx.compareTo](dart._callMethodStats[dartx.get](a)), StringAndStringToint()));
+ for (let key of keys) {
+ let count = dart._callMethodStats[dartx.get](key);
+ ret[dartx.add](new dart.ProfileEntry(key, count));
+ }
+ return ret;
+ };
+ dart.clearDynamicStats = function() {
+ dart._callMethodStats[dartx.clear]();
+ };
+ dart._trackCall = function(obj, name) {
+ if (!window.trackDdcProfile) return;
+ let actual = dart.getReifiedType(obj);
+ let stackStr = new Error().stack;
+ let stack = stackStr[dartx.split]('\n at ');
+ let src = '';
+ for (let i = 2; i < dart.notNull(stack[dartx.length]); ++i) {
+ let frame = stack[dartx.get](i);
+ if (!dart.test(frame[dartx.contains]('dev_compiler/lib/runtime/dart_sdk.js'))) {
+ src = frame;
+ break;
+ }
+ }
+ name = dart.str`${dart.typeName(actual)}.${name} <${src}>`;
+ if (dart.test(dart._callMethodStats[dartx.containsKey](name))) {
+ dart._callMethodStats[dartx.set](dart.as(name, core.String), dart.notNull(dart._callMethodStats[dartx.get](name)) + 1);
+ } else {
+ dart._callMethodStats[dartx.set](dart.as(name, core.String), 1);
+ }
+ };
dart._callMethod = function(obj, name, typeArgs, args, displayName) {
let symbol = dart._canonicalFieldName(obj, name, args, displayName);
let f = obj != null ? obj[symbol] : null;
@@ -1819,32 +1858,12 @@ dart_library.library('dart_sdk', null, /* Imports */[
this.controller.addError(error, stackTrace);
}
};
- dart._ignoreTypeFailure = (() => {
- return dart._ignoreMemo((actual, type) => {
- if (!!dart.isSubtype(type, core.Iterable) && !!dart.isSubtype(actual, core.Iterable) || !!dart.isSubtype(type, async.Future) && !!dart.isSubtype(actual, async.Future) || !!dart.isSubtype(type, core.Map) && !!dart.isSubtype(actual, core.Map) || dart.isFunctionType(type) && dart.isFunctionType(actual) || !!dart.isSubtype(type, async.Stream) && !!dart.isSubtype(actual, async.Stream) || !!dart.isSubtype(type, async.StreamSubscription) && !!dart.isSubtype(actual, async.StreamSubscription)) {
- console.warn('Ignoring cast fail from ' + dart.typeName(actual) + ' to ' + dart.typeName(type));
- return true;
- }
- return false;
- });
- })();
- dart._stack = new WeakMap();
- dart._value = Symbol("_value");
- dart.constants = new Map();
- dart.constantLists = new Map();
- dart.JsIterator = class JsIterator {
- constructor(dartIterator) {
- this.dartIterator = dartIterator;
- }
- next() {
- let i = this.dartIterator;
- let done = !i.moveNext();
- return {done: done, value: done ? void 0 : i.current};
- }
- };
- dart._runtimeType = Symbol("_runtimeType");
- dart.metadata = Symbol("metadata");
- dart._typeObject = Symbol("typeObject");
+ dart.defineLazy(dart, {
+ get _callMethodStats() {
+ return MapOfString$int().new();
+ },
+ set _callMethodStats(_) {}
+ });
core.Object = class Object {
constructor(...args) {
return this.new.apply(this, args);
@@ -1875,6 +1894,41 @@ dart_library.library('dart_sdk', null, /* Imports */[
noSuchMethod: dart.definiteFunctionType(dart.dynamic, [core.Invocation])
})
});
+ dart.ProfileEntry = class ProfileEntry extends core.Object {
+ new(key, count) {
+ this.key = key;
+ this.count = count;
+ }
+ };
+ dart.setSignature(dart.ProfileEntry, {
+ constructors: () => ({new: dart.definiteFunctionType(dart.ProfileEntry, [core.String, core.num])})
+ });
+ dart._ignoreTypeFailure = (() => {
+ return dart._ignoreMemo((actual, type) => {
+ if (!!dart.isSubtype(type, core.Iterable) && !!dart.isSubtype(actual, core.Iterable) || !!dart.isSubtype(type, async.Future) && !!dart.isSubtype(actual, async.Future) || !!dart.isSubtype(type, core.Map) && !!dart.isSubtype(actual, core.Map) || dart.isFunctionType(type) && dart.isFunctionType(actual) || !!dart.isSubtype(type, async.Stream) && !!dart.isSubtype(actual, async.Stream) || !!dart.isSubtype(type, async.StreamSubscription) && !!dart.isSubtype(actual, async.StreamSubscription)) {
+ console.warn('Ignoring cast fail from ' + dart.typeName(actual) + ' to ' + dart.typeName(type));
+ return true;
+ }
+ return false;
+ });
+ })();
+ dart._stack = new WeakMap();
+ dart._value = Symbol("_value");
+ dart.constants = new Map();
+ dart.constantLists = new Map();
+ dart.JsIterator = class JsIterator {
+ constructor(dartIterator) {
+ this.dartIterator = dartIterator;
+ }
+ next() {
+ let i = this.dartIterator;
+ let done = !i.moveNext();
+ return {done: done, value: done ? void 0 : i.current};
+ }
+ };
+ dart._runtimeType = Symbol("_runtimeType");
+ dart.metadata = Symbol("metadata");
+ dart._typeObject = Symbol("typeObject");
dart.TypeRep = class TypeRep extends core.Object {
get name() {
return this.toString();
@@ -2111,7 +2165,8 @@ dart_library.library('dart_sdk', null, /* Imports */[
Object.setPrototypeOf(StrongModeError.prototype, Error.prototype);
return StrongModeError;
})();
- _debugger.skipDartConfig = dart.const(new core.Object());
+ _debugger.skipDartConfig = "skipDartConfig";
+ _debugger.keyToStringConfig = "keyToStringConfig";
_debugger.maxIterableChildrenToDisplay = 50;
dart.defineLazy(_debugger, {
get _devtoolsFormatter() {
@@ -2195,9 +2250,11 @@ dart_library.library('dart_sdk', null, /* Imports */[
let name = opts && 'name' in opts ? opts.name : null;
let value = opts && 'value' in opts ? opts.value : null;
let skipDart = opts && 'skipDart' in opts ? opts.skipDart : null;
+ let keyToString = opts && 'keyToString' in opts ? opts.keyToString : null;
this.name = name;
this.value = value;
this.skipDart = skipDart == true;
+ this.keyToString = keyToString == true;
}
['=='](other) {
return dart.is(other, _debugger.NameValuePair) && other.name == this.name;
@@ -2207,7 +2264,7 @@ dart_library.library('dart_sdk', null, /* Imports */[
}
};
dart.setSignature(_debugger.NameValuePair, {
- constructors: () => ({new: dart.definiteFunctionType(_debugger.NameValuePair, [], {name: core.String, value: core.Object, skipDart: core.bool})})
+ constructors: () => ({new: dart.definiteFunctionType(_debugger.NameValuePair, [], {name: core.String, value: core.Object, skipDart: core.bool, keyToString: core.bool})})
});
_debugger.MapEntry = class MapEntry extends core.Object {
new(opts) {
@@ -2218,7 +2275,7 @@ dart_library.library('dart_sdk', null, /* Imports */[
}
};
dart.setSignature(_debugger.MapEntry, {
- constructors: () => ({new: dart.definiteFunctionType(_debugger.MapEntry, [], {key: core.String, value: core.Object})})
+ constructors: () => ({new: dart.definiteFunctionType(_debugger.MapEntry, [], {key: core.Object, value: core.Object})})
});
_debugger.ClassMetadata = class ClassMetadata extends core.Object {
new(object) {
@@ -2310,6 +2367,9 @@ dart_library.library('dart_sdk', null, /* Imports */[
}
let c = this[_simpleFormatter].preview(object);
if (c == null) return null;
+ if (core.identical(config, _debugger.keyToStringConfig)) {
+ c = dart.toString(object);
+ }
let element = new _debugger.JsonMLElement('span');
element.setStyle('background-color: #d9edf7');
element.createTextChild(c);
@@ -2334,6 +2394,9 @@ dart_library.library('dart_sdk', null, /* Imports */[
if (dart.test(child.skipDart)) {
objectTag.addAttribute('config', _debugger.skipDartConfig);
}
+ if (dart.test(child.keyToString)) {
+ objectTag.addAttribute('config', _debugger.keyToStringConfig);
+ }
if (!dart.test(this[_simpleFormatter].hasChildren(child.value))) {
li.setStyle("padding-left: 13px;");
}
@@ -2536,7 +2599,7 @@ dart_library.library('dart_sdk', null, /* Imports */[
let map = dart.as(object, core.Map);
let entries = LinkedHashSetOfNameValuePair().new();
map[dartx.forEach](dart.fn((key, value) => {
- let entryWrapper = new _debugger.MapEntry({key: dart.as(key, core.String), value: value});
+ let entryWrapper = new _debugger.MapEntry({key: key, value: value});
entries.add(new _debugger.NameValuePair({name: dart.toString(entries.length), value: entryWrapper}));
}, dynamicAnddynamicTovoid()));
this.addMetadataChildren(object, entries);
@@ -2633,7 +2696,7 @@ dart_library.library('dart_sdk', null, /* Imports */[
return true;
}
children(object) {
- return JSArrayOfNameValuePair().of([new _debugger.NameValuePair({name: 'key', value: dart.dload(object, 'key')}), new _debugger.NameValuePair({name: 'value', value: dart.dload(object, 'value')})]);
+ return JSArrayOfNameValuePair().of([new _debugger.NameValuePair({name: 'key', value: dart.dload(object, 'key'), keyToString: true}), new _debugger.NameValuePair({name: 'value', value: dart.dload(object, 'value')})]);
}
};
_debugger.MapEntryFormatter[dart.implements] = () => [_debugger.Formatter];
« no previous file with comments | « no previous file | tool/input_sdk/private/ddc_runtime/operations.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698