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

Unified Diff: sdk/lib/js/dartium/js_dartium.dart

Issue 1833373002: Speed up interop patch file creation (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Requires latest change to WebKit Created 4 years, 9 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:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « sdk/lib/js/dartium/cached_patches.dart ('k') | tools/dartium/generate_app/generate_cached_patches.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: sdk/lib/js/dartium/js_dartium.dart
diff --git a/sdk/lib/js/dartium/js_dartium.dart b/sdk/lib/js/dartium/js_dartium.dart
index 070baf746afd6e570b649f79042ab4275f941732..2c4ccd30880727f13dad0bb36f048efcf980c0ee 100644
--- a/sdk/lib/js/dartium/js_dartium.dart
+++ b/sdk/lib/js/dartium/js_dartium.dart
@@ -95,6 +95,9 @@ import 'dart:html' as html;
import 'dart:html_common' as html_common;
import 'dart:indexed_db' as indexed_db;
import 'dart:typed_data';
+import 'dart:core';
+
+import 'cached_patches.dart';
// Pretend we are always in checked mode as we aren't interested in users
// running Dartium code outside of checked mode.
@@ -278,13 +281,52 @@ void _registerJsInterfaces(List<Type> classes) {
_finalizeJsInterfaces() native "Js_finalizeJsInterfaces";
+// Create the files for the generated Dart files from IDLs. These only change
+// when browser's Dart files change (dart:*).
+@Deprecated("Internal Use Only")
+String createCachedPatchesFile() {
+ var patches = _generateInteropPatchFiles(['dart:html',
+ 'dart:indexed_db',
+ 'dart:web_gl',
+ 'dart:web_sql',
+ 'dart:svg',
+ 'dart:web_audio']);
+ var sb = new StringBuffer();
+
+ sb.write("""
+
+// START_OF_CACHED_PATCHES
+// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// DO NOT EDIT GENERATED FILE.
+
+library cached_patches;
+
+var cached_patches = {""");
+
+ for (var baseIndex = 0; baseIndex < patches.length; baseIndex += 3) {
+ var uri = patches[baseIndex + 0];
+ var uri_js_interop = patches[baseIndex + 1];
+ var source = patches[baseIndex + 2];
+
+ if (uri != 'dart:js') {
+ sb.write('"$uri": ["$uri", "$uri_js_interop", """$source"""],');
+ }
+ }
+
+ sb.write("""};
+// END_OF_CACHED_PATCHES
+ """);
+
+ return "$sb";
+}
+
String _getJsName(mirrors.DeclarationMirror mirror) {
- for (var annotation in mirror.metadata) {
- if (mirrors.MirrorSystem.getName(annotation.type.simpleName) == "JS") {
- mirrors.LibraryMirror library = annotation.type.owner;
- var uri = library.uri;
- // make sure the annotation is from package://js
- if (uri.scheme == 'package' && uri.path == 'js/js.dart') {
+ if (_atJsType != null) {
+ for (var annotation in mirror.metadata) {
+ if (annotation.type.reflectedType == _atJsType) {
try {
var name = annotation.reflectee.name;
return name != null ? name : "";
@@ -312,6 +354,8 @@ bool _isAnonymousClass(mirrors.ClassMirror mirror) {
bool _hasJsName(mirrors.DeclarationMirror mirror) => _getJsName(mirror) != null;
+var _domNameType;
+
bool hasDomName(mirrors.DeclarationMirror mirror) {
var location = mirror.location;
if (location == null || location.sourceUri.scheme != 'dart') return false;
@@ -445,9 +489,37 @@ bool _isExternal(mirrors.MethodMirror mirror) {
return false;
}
-List<String> _generateExternalMethods() {
+List<String> _generateExternalMethods(List<String> libraryPaths) {
var staticCodegen = <String>[];
- mirrors.currentMirrorSystem().libraries.forEach((uri, library) {
+
+ if (libraryPaths.length == 0) {
+ mirrors.currentMirrorSystem().libraries.forEach((uri, library) {
+ var library_name = "${uri.scheme}:${uri.path}";
+ if (cached_patches.containsKey(library_name)) {
+ var patch = cached_patches[library_name];
+ staticCodegen.addAll(patch);
+ } else {
+ _generateLibraryCodegen(uri, library, staticCodegen);
+ }
+ }); // End of library foreach
+ } else {
+ // Used to generate cached_patches.dart file for all IDL generated dart:
+ // files to the WebKit DOM.
+ for (var library_name in libraryPaths) {
+ var parts = library_name.split(':');
+ var uri = new Uri(scheme: parts[0], path: parts[1]);
+ var library = mirrors.currentMirrorSystem().libraries[uri];
+ _generateLibraryCodegen(uri, library, staticCodegen);
+ }
+ }
+
+ return staticCodegen;
+}
+
+_generateLibraryCodegen(uri, library, staticCodegen) {
+ // Is it a dart generated library?
+ var dartLibrary = uri.scheme == 'dart';
+
var sb = new StringBuffer();
String jsLibraryName = _getJsName(library);
library.declarations.forEach((name, declaration) {
@@ -458,7 +530,7 @@ List<String> _generateExternalMethods() {
}
} else if (declaration is mirrors.ClassMirror) {
mirrors.ClassMirror clazz = declaration;
- var isDom = hasDomName(clazz);
+ var isDom = dartLibrary ? hasDomName(clazz) : false;
var isJsInterop = _hasJsName(clazz);
if (isDom || isJsInterop) {
// TODO(jacobr): verify class implements JavaScriptObject.
@@ -519,7 +591,7 @@ List<String> _generateExternalMethods() {
isStatic: true,
memberName: className);
}
- });
+ }); // End of clazz.declarations.forEach
clazz.staticMembers.forEach((memberName, member) {
if (_isExternal(member)) {
@@ -578,18 +650,32 @@ const ${_UNDEFINED_VAR} = const Object();
${sb}
""");
}
- });
-
- return staticCodegen;
}
+// Remember the @JS type to compare annotation type.
+var _atJsType = -1;
+
/**
* Generates part files defining source code for JSObjectImpl, all DOM classes
* classes. This codegen is needed so that type checks for all registered
* JavaScript interop classes pass.
*/
-List<String> _generateInteropPatchFiles() {
- var ret = _generateExternalMethods();
+List<String> _generateInteropPatchFiles(List<String> libraryPaths) {
+ // Cache the @JS Type.
+ if (_atJsType == -1) {
+ var uri = new Uri(scheme: "package", path: "js/js.dart");
+ var jsLibrary = mirrors.currentMirrorSystem().libraries[uri];
+ if (jsLibrary != null) {
+ // @ JS used somewhere.
+ var jsDeclaration = jsLibrary.declarations[new Symbol("JS")];
+ _atJsType = jsDeclaration.reflectedType;
+ } else {
+ // @ JS not used in any library.
+ _atJsType = null;
+ }
+ }
+
+ var ret = _generateExternalMethods(libraryPaths);
var libraryPrefixes = new Map<mirrors.LibraryMirror, String>();
var prefixNames = new Set<String>();
var sb = new StringBuffer();
« no previous file with comments | « sdk/lib/js/dartium/cached_patches.dart ('k') | tools/dartium/generate_app/generate_cached_patches.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698