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

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

Issue 564373004: Add LibraryLoader.resetAsync. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge
Patch Set: Restore code. Created 6 years, 3 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: dart/sdk/lib/_internal/compiler/implementation/library_loader.dart
diff --git a/dart/sdk/lib/_internal/compiler/implementation/library_loader.dart b/dart/sdk/lib/_internal/compiler/implementation/library_loader.dart
index be7978a95060d748e4fedfb0587f28a116dccf90..c6c7e11dd1b70dd5ff8a506e404a593305716f47 100644
--- a/dart/sdk/lib/_internal/compiler/implementation/library_loader.dart
+++ b/dart/sdk/lib/_internal/compiler/implementation/library_loader.dart
@@ -143,6 +143,9 @@ abstract class LibraryLoaderTask implements CompilerTask {
///
/// This method is used for incremental compilation.
void reset({bool reuseLibrary(LibraryElement library)});
+
+ /// Asynchronous version of [reset].
+ Future resetAsync(Future<bool> reuseLibrary(LibraryElement library));
}
/// Handle for creating synthesized/patch libraries during library loading.
@@ -266,17 +269,54 @@ class _LibraryLoaderTask extends CompilerTask implements LibraryLoaderTask {
void reset({bool reuseLibrary(LibraryElement library)}) {
measure(() {
assert(currentHandler == null);
- Iterable<LibraryElement> libraries =
- new List.from(libraryCanonicalUriMap.values);
+ Iterable<LibraryElement> reusedLibraries = null;
+ if (reuseLibrary != null) {
+ reusedLibraries = compiler.reuseLibraryTask.measure(() {
+ // Call [toList] to force eager calls to [reuseLibrary].
+ return libraryCanonicalUriMap.values.where(reuseLibrary).toList();
+ });
+ }
+
+ resetImplementation(reusedLibraries);
+ });
+ }
+
+ void resetImplementation(Iterable<LibraryElement> reusedLibraries) {
+ measure(() {
libraryCanonicalUriMap.clear();
libraryResourceUriMap.clear();
libraryNames.clear();
- if (reuseLibrary == null) return;
+ if (reusedLibraries != null) {
+ reusedLibraries.forEach(mapLibrary);
+ }
+ });
+ }
- compiler.reuseLibraryTask.measure(
- () => libraries.where(reuseLibrary).toList()).forEach(mapLibrary);
+ Future resetAsync(Future<bool> reuseLibrary(LibraryElement library)) {
+ return measure(() {
+ assert(currentHandler == null);
+
+ Future<LibraryElement> wrapper(LibraryElement library) {
+ try {
+ return reuseLibrary(library).then(
+ (bool reuse) => reuse ? library : null);
+ } catch (exception, trace) {
+ compiler.diagnoseCrashInUserCode(
+ 'Uncaught exception in reuseLibrary', exception, trace);
+ rethrow;
+ }
+ }
+
+ List<Future<LibraryElement>> reusedLibrariesFuture =
+ compiler.reuseLibraryTask.measure(
+ () => libraryCanonicalUriMap.values.map(wrapper).toList());
+
+ return Future.wait(reusedLibrariesFuture).then(
+ (List<LibraryElement> reusedLibraries) {
+ resetImplementation(reusedLibraries.where((e) => e != null));
+ });
});
}

Powered by Google App Engine
This is Rietveld 408576698