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

Unified Diff: sdk/lib/_internal/compiler/implementation/library_loader.dart

Issue 17759007: First pass at asynchronous input loading in dart2js. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 7 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:
View side-by-side diff with in-line comments
Download patch
Index: sdk/lib/_internal/compiler/implementation/library_loader.dart
diff --git a/sdk/lib/_internal/compiler/implementation/library_loader.dart b/sdk/lib/_internal/compiler/implementation/library_loader.dart
index 0e70958a74d6299085472ea2feec45a6f276cbfe..b783105d1a023e163aaac50f2e7525f7d34cc091 100644
--- a/sdk/lib/_internal/compiler/implementation/library_loader.dart
+++ b/sdk/lib/_internal/compiler/implementation/library_loader.dart
@@ -113,12 +113,13 @@ abstract class LibraryLoader extends CompilerTask {
*/
// TODO(johnniwinther): Remove [canonicalUri] together with
// [Compiler.scanBuiltinLibrary].
- LibraryElement loadLibrary(Uri resolvedUri, Node node, Uri canonicalUri);
+ Future<LibraryElement> loadLibrary(Uri resolvedUri, Node node,
+ Uri canonicalUri);
// TODO(johnniwinther): Remove this when patches don't need special parsing.
- void registerLibraryFromTag(LibraryDependencyHandler handler,
- LibraryElement library,
- LibraryDependency tag);
+ Future registerLibraryFromTag(LibraryDependencyHandler handler,
+ LibraryElement library,
+ LibraryDependency tag);
/**
* Adds the elements in the export scope of [importedLibrary] to the import
@@ -226,15 +227,15 @@ class LibraryLoaderTask extends LibraryLoader {
LibraryDependencyHandler currentHandler;
- LibraryElement loadLibrary(Uri resolvedUri, Node node, Uri canonicalUri) {
- return measure(() {
+ Future<LibraryElement> loadLibrary(Uri resolvedUri, Node node, Uri canonicalUri) {
ahe 2013/06/26 07:02:00 Long line.
Bob Nystrom 2013/06/27 00:38:18 Done.
+ return measureAsync(() {
ahe 2013/06/26 07:02:00 I think this should be measure
Bob Nystrom 2013/06/27 00:38:18 Done.
assert(currentHandler == null);
currentHandler = new LibraryDependencyHandler(compiler);
- LibraryElement library =
- createLibrary(currentHandler, null, resolvedUri, node, canonicalUri);
- currentHandler.computeExports();
- currentHandler = null;
- return library;
+ return createLibrary(currentHandler, null, resolvedUri, node, canonicalUri).then((library) {
Bob Nystrom 2013/06/26 01:03:24 I'll fix these long lines.
ahe 2013/06/26 07:02:00 An then wrap this is in measure as well.
ahe 2013/06/26 07:02:00 Please restore the type of "library".
Bob Nystrom 2013/06/27 00:38:18 Done.
Bob Nystrom 2013/06/27 00:38:18 Done.
+ currentHandler.computeExports();
+ currentHandler = null;
+ return library;
+ });
});
}
@@ -244,7 +245,7 @@ class LibraryLoaderTask extends LibraryLoader {
* The imported/exported libraries are loaded and processed recursively but
* the import/export scopes are not set up.
*/
- void processLibraryTags(LibraryDependencyHandler handler,
+ Future processLibraryTags(LibraryDependencyHandler handler,
LibraryElement library) {
int tagState = TagState.NO_TAG_SEEN;
@@ -264,7 +265,8 @@ class LibraryLoaderTask extends LibraryLoader {
bool importsDartCore = false;
var libraryDependencies = new LinkBuilder<LibraryDependency>();
Uri base = library.entryCompilationUnit.script.uri;
- for (LibraryTag tag in library.tags.reverse()) {
+
+ return Future.forEach(library.tags.reverse(), (tag) {
ahe 2013/06/26 07:02:00 I need to figure out what this does.
Bob Nystrom 2013/06/27 00:38:18 It should be semantically equivalent to the previo
if (tag.isImport) {
Import import = tag;
tagState = checkTag(TagState.IMPORT_OR_EXPORT, import);
@@ -288,25 +290,27 @@ class LibraryLoaderTask extends LibraryLoader {
StringNode uri = part.uri;
Uri resolvedUri = base.resolve(uri.dartString.slowToString());
tagState = checkTag(TagState.SOURCE, part);
- scanPart(part, resolvedUri, library);
+ return scanPart(part, resolvedUri, library);
} else {
compiler.internalError("Unhandled library tag.", node: tag);
}
- }
-
- // Apply patch, if any.
- if (library.isPlatformLibrary) {
- patchDartLibrary(handler, library, library.canonicalUri.path);
- }
-
- // Import dart:core if not already imported.
- if (!importsDartCore && !isDartCore(library.canonicalUri)) {
- handler.registerDependency(library, null, loadCoreLibrary(handler));
- }
-
- for (LibraryDependency tag in libraryDependencies.toLink()) {
- registerLibraryFromTag(handler, library, tag);
- }
+ }).then((_) {
+ // Apply patch, if any.
+ if (library.isPlatformLibrary) {
+ return patchDartLibrary(handler, library, library.canonicalUri.path);
+ }
+ }).then((_) {
+ // Import dart:core if not already imported.
+ if (!importsDartCore && !isDartCore(library.canonicalUri)) {
+ return loadCoreLibrary(handler).then((coreLibrary) {
+ handler.registerDependency(library, null, coreLibrary);
+ });
+ }
+ }).then((_) {
+ return Future.forEach(libraryDependencies.toLink(), (tag) {
+ return registerLibraryFromTag(handler, library, tag);
+ });
+ });
}
void checkDuplicatedLibraryName(LibraryElement library) {
@@ -335,49 +339,53 @@ class LibraryLoaderTask extends LibraryLoader {
/**
* Lazily loads and returns the [LibraryElement] for the dart:core library.
*/
- LibraryElement loadCoreLibrary(LibraryDependencyHandler handler) {
- if (compiler.coreLibrary == null) {
- Uri coreUri = new Uri(scheme: 'dart', path: 'core');
- compiler.coreLibrary
- = createLibrary(handler, null, coreUri, null, coreUri);
+ Future<LibraryElement> loadCoreLibrary(LibraryDependencyHandler handler) {
+ if (compiler.coreLibrary != null) {
+ return new Future.value(compiler.coreLibrary);
}
- return compiler.coreLibrary;
+
+ Uri coreUri = new Uri(scheme: 'dart', path: 'core');
+ return createLibrary(handler, null, coreUri, null, coreUri).then((library) {
+ compiler.coreLibrary = library;
+ return library;
+ });
}
- void patchDartLibrary(LibraryDependencyHandler handler,
+ Future patchDartLibrary(LibraryDependencyHandler handler,
LibraryElement library, String dartLibraryPath) {
- if (library.isPatched) return;
+ if (library.isPatched) return new Future.value();
Uri patchUri = compiler.resolvePatchUri(dartLibraryPath);
- if (patchUri != null) {
- compiler.patchParser.patchLibrary(handler, patchUri, library);
- }
+ if (patchUri == null) return new Future.value();
+
+ return compiler.patchParser.patchLibrary(handler, patchUri, library);
}
/**
* Handle a part tag in the scope of [library]. The [resolvedUri] given is
* used as is, any URI resolution should be done beforehand.
*/
- void scanPart(Part part, Uri resolvedUri, LibraryElement library) {
+ Future scanPart(Part part, Uri resolvedUri, LibraryElement library) {
if (!resolvedUri.isAbsolute) throw new ArgumentError(resolvedUri);
Uri readableUri = compiler.translateResolvedUri(library, resolvedUri, part);
- Script sourceScript = compiler.readScript(readableUri, part);
- CompilationUnitElement unit =
- new CompilationUnitElementX(sourceScript, library);
- compiler.withCurrentElement(unit, () {
- compiler.scanner.scan(unit);
- if (unit.partTag == null) {
- bool wasDiagnosticEmitted = false;
- compiler.withCurrentElement(library, () {
- wasDiagnosticEmitted =
- compiler.onDeprecatedFeature(part, 'missing part-of tag');
- });
- if (wasDiagnosticEmitted) {
- compiler.reportMessage(
- compiler.spanFromElement(unit),
- MessageKind.MISSING_PART_OF_TAG.error(),
- api.Diagnostic.INFO);
+ return compiler.readScript(readableUri, part).then((sourceScript) {
+ CompilationUnitElement unit =
+ new CompilationUnitElementX(sourceScript, library);
+ compiler.withCurrentElement(unit, () {
+ compiler.scanner.scan(unit);
+ if (unit.partTag == null) {
+ bool wasDiagnosticEmitted = false;
+ compiler.withCurrentElement(library, () {
+ wasDiagnosticEmitted =
+ compiler.onDeprecatedFeature(part, 'missing part-of tag');
+ });
+ if (wasDiagnosticEmitted) {
+ compiler.reportMessage(
+ compiler.spanFromElement(unit),
+ MessageKind.MISSING_PART_OF_TAG.error(),
+ api.Diagnostic.INFO);
+ }
}
- }
+ });
});
}
@@ -386,21 +394,21 @@ class LibraryLoaderTask extends LibraryLoader {
* registering its dependency in [handler] for the computation of the import/
* export scope.
*/
- void registerLibraryFromTag(LibraryDependencyHandler handler,
+ Future registerLibraryFromTag(LibraryDependencyHandler handler,
LibraryElement library,
LibraryDependency tag) {
Uri base = library.entryCompilationUnit.script.uri;
Uri resolvedUri = base.resolve(tag.uri.dartString.slowToString());
- LibraryElement loadedLibrary =
- createLibrary(handler, library, resolvedUri, tag.uri, resolvedUri);
- handler.registerDependency(library, tag, loadedLibrary);
-
- if (!loadedLibrary.hasLibraryName()) {
- compiler.withCurrentElement(library, () {
- compiler.reportError(tag == null ? null : tag.uri,
- 'no library name found in ${loadedLibrary.canonicalUri}');
- });
- }
+ return createLibrary(handler, library, resolvedUri, tag.uri, resolvedUri)
+ .then((loadedLibrary) {
+ handler.registerDependency(library, tag, loadedLibrary);
+ if (!loadedLibrary.hasLibraryName()) {
+ compiler.withCurrentElement(library, () {
+ compiler.reportError(tag == null ? null : tag.uri,
+ 'no library name found in ${loadedLibrary.canonicalUri}');
+ });
+ }
+ });
}
/**
@@ -411,37 +419,36 @@ class LibraryLoaderTask extends LibraryLoader {
*/
// TODO(johnniwinther): Remove [canonicalUri] and make [resolvedUri] the
// canonical uri when [Compiler.scanBuiltinLibrary] is removed.
- LibraryElement createLibrary(LibraryDependencyHandler handler,
+ Future<LibraryElement> createLibrary(LibraryDependencyHandler handler,
LibraryElement importingLibrary,
Uri resolvedUri, Node node, Uri canonicalUri) {
- bool newLibrary = false;
Uri readableUri =
compiler.translateResolvedUri(importingLibrary, resolvedUri, node);
if (readableUri == null) return null;
- LibraryElement createLibrary() {
- newLibrary = true;
- Script script = compiler.readScript(readableUri, node);
+
+ if (canonicalUri != null) {
+ LibraryElement library = compiler.libraries[canonicalUri.toString()];
+ if (library != null) {
+ return new Future.value(library);
+ }
+ }
+
+ return compiler.readScript(readableUri, node).then((script) {
LibraryElement element = new LibraryElementX(script, canonicalUri);
handler.registerNewLibrary(element);
native.maybeEnableNative(compiler, element);
- return element;
- }
- LibraryElement library;
- if (canonicalUri == null) {
- library = createLibrary();
- } else {
- library = compiler.libraries.putIfAbsent(canonicalUri.toString(),
- createLibrary);
- }
- if (newLibrary) {
- compiler.withCurrentElement(library, () {
- compiler.scanner.scanLibrary(library);
- processLibraryTags(handler, library);
- handler.registerLibraryExports(library);
- compiler.onLibraryScanned(library, resolvedUri);
+ compiler.libraries[canonicalUri.toString()] = element;
+ return compiler.withCurrentElement(element, () {
+ compiler.scanner.scanLibrary(element);
+ return processLibraryTags(handler, element);
+ }).then((_) {
+ compiler.withCurrentElement(element, () {
+ handler.registerLibraryExports(element);
+ compiler.onLibraryScanned(element, resolvedUri);
+ });
+ return element;
});
- }
- return library;
+ });
}
// TODO(johnniwinther): Remove this method when 'js_helper' is handled by

Powered by Google App Engine
This is Rietveld 408576698