| 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));
 | 
| +          });
 | 
|      });
 | 
|    }
 | 
|  
 | 
| 
 |