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

Side by Side 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 library dart2js.library_loader; 5 library dart2js.library_loader;
6 6
7 import 'dart:async'; 7 import 'dart:async';
8 import 'dart2jslib.dart' 8 import 'dart2jslib.dart'
9 show Compiler, 9 show Compiler,
10 CompilerTask, 10 CompilerTask,
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
136 /// [LibraryElement] for the library and computes the import/export scope, 136 /// [LibraryElement] for the library and computes the import/export scope,
137 /// loading and computing the import/export scopes of all required libraries 137 /// loading and computing the import/export scopes of all required libraries
138 /// in the process. The method handles cyclic dependency between libraries. 138 /// in the process. The method handles cyclic dependency between libraries.
139 Future<LibraryElement> loadLibrary(Uri resolvedUri); 139 Future<LibraryElement> loadLibrary(Uri resolvedUri);
140 140
141 /// Reset the library loader task to prepare for compilation. If provided, 141 /// Reset the library loader task to prepare for compilation. If provided,
142 /// libraries matching [reuseLibrary] are reused. 142 /// libraries matching [reuseLibrary] are reused.
143 /// 143 ///
144 /// This method is used for incremental compilation. 144 /// This method is used for incremental compilation.
145 void reset({bool reuseLibrary(LibraryElement library)}); 145 void reset({bool reuseLibrary(LibraryElement library)});
146
147 /// Asynchronous version of [reset].
148 Future resetAsync(Future<bool> reuseLibrary(LibraryElement library));
146 } 149 }
147 150
148 /// Handle for creating synthesized/patch libraries during library loading. 151 /// Handle for creating synthesized/patch libraries during library loading.
149 abstract class LibraryLoader { 152 abstract class LibraryLoader {
150 /// This method must be called when a new synthesized/patch library has been 153 /// This method must be called when a new synthesized/patch library has been
151 /// created to ensure that [library] will part of library dependency graph 154 /// created to ensure that [library] will part of library dependency graph
152 /// used for computing import/export scopes. 155 /// used for computing import/export scopes.
153 void registerNewLibrary(LibraryElement library); 156 void registerNewLibrary(LibraryElement library);
154 157
155 /// This method must be called when a new synthesized/patch library has been 158 /// This method must be called when a new synthesized/patch library has been
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
259 262
260 Iterable<LibraryElement> get libraries => libraryCanonicalUriMap.values; 263 Iterable<LibraryElement> get libraries => libraryCanonicalUriMap.values;
261 264
262 LibraryElement lookupLibrary(Uri canonicalUri) { 265 LibraryElement lookupLibrary(Uri canonicalUri) {
263 return libraryCanonicalUriMap[canonicalUri]; 266 return libraryCanonicalUriMap[canonicalUri];
264 } 267 }
265 268
266 void reset({bool reuseLibrary(LibraryElement library)}) { 269 void reset({bool reuseLibrary(LibraryElement library)}) {
267 measure(() { 270 measure(() {
268 assert(currentHandler == null); 271 assert(currentHandler == null);
269 Iterable<LibraryElement> libraries =
270 new List.from(libraryCanonicalUriMap.values);
271 272
273 Iterable<LibraryElement> reusedLibraries = null;
274 if (reuseLibrary != null) {
275 reusedLibraries = compiler.reuseLibraryTask.measure(() {
276 // Call [toList] to force eager calls to [reuseLibrary].
277 return libraryCanonicalUriMap.values.where(reuseLibrary).toList();
278 });
279 }
280
281 resetImplementation(reusedLibraries);
282 });
283 }
284
285 void resetImplementation(Iterable<LibraryElement> reusedLibraries) {
286 measure(() {
272 libraryCanonicalUriMap.clear(); 287 libraryCanonicalUriMap.clear();
273 libraryResourceUriMap.clear(); 288 libraryResourceUriMap.clear();
274 libraryNames.clear(); 289 libraryNames.clear();
275 290
276 if (reuseLibrary == null) return; 291 if (reusedLibraries != null) {
277 292 reusedLibraries.forEach(mapLibrary);
278 compiler.reuseLibraryTask.measure( 293 }
279 () => libraries.where(reuseLibrary).toList()).forEach(mapLibrary);
280 }); 294 });
281 } 295 }
282 296
297 Future resetAsync(Future<bool> reuseLibrary(LibraryElement library)) {
298 return measure(() {
299 assert(currentHandler == null);
300
301 Future<LibraryElement> wrapper(LibraryElement library) {
302 try {
303 return reuseLibrary(library).then(
304 (bool reuse) => reuse ? library : null);
305 } catch (exception, trace) {
306 compiler.diagnoseCrashInUserCode(
307 'Uncaught exception in reuseLibrary', exception, trace);
308 rethrow;
309 }
310 }
311
312 List<Future<LibraryElement>> reusedLibrariesFuture =
313 compiler.reuseLibraryTask.measure(
314 () => libraryCanonicalUriMap.values.map(wrapper).toList());
315
316 return Future.wait(reusedLibrariesFuture).then(
317 (List<LibraryElement> reusedLibraries) {
318 resetImplementation(reusedLibraries.where((e) => e != null));
319 });
320 });
321 }
322
283 /// Insert [library] in the internal maps. Used for compiler reuse. 323 /// Insert [library] in the internal maps. Used for compiler reuse.
284 void mapLibrary(LibraryElement library) { 324 void mapLibrary(LibraryElement library) {
285 libraryCanonicalUriMap[library.canonicalUri] = library; 325 libraryCanonicalUriMap[library.canonicalUri] = library;
286 326
287 Uri resourceUri = library.entryCompilationUnit.script.resourceUri; 327 Uri resourceUri = library.entryCompilationUnit.script.resourceUri;
288 libraryResourceUriMap[resourceUri] = library; 328 libraryResourceUriMap[resourceUri] = library;
289 329
290 String name = library.getLibraryOrScriptName(); 330 String name = library.getLibraryOrScriptName();
291 libraryNames[name] = library; 331 libraryNames[name] = library;
292 } 332 }
(...skipping 692 matching lines...) Expand 10 before | Expand all | Expand 10 after
985 * fixed-point computation of the import/export scopes. 1025 * fixed-point computation of the import/export scopes.
986 */ 1026 */
987 void registerLibraryExports(LibraryElement library) { 1027 void registerLibraryExports(LibraryElement library) {
988 nodeMap[library].registerInitialExports(); 1028 nodeMap[library].registerInitialExports();
989 } 1029 }
990 1030
991 Future processLibraryTags(LibraryElement library) { 1031 Future processLibraryTags(LibraryElement library) {
992 return task.processLibraryTags(this, library); 1032 return task.processLibraryTags(this, library);
993 } 1033 }
994 } 1034 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698