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

Side by Side Diff: pkg/compiler/lib/src/enqueue.dart

Issue 3002313002: Use KernelTypeGraphBuilder in KernelInferrerEngine (Closed)
Patch Set: Updated cf. comments. Created 3 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
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.enqueue; 5 library dart2js.enqueue;
6 6
7 import 'dart:collection' show Queue; 7 import 'dart:collection' show Queue;
8 8
9 import 'common/tasks.dart' show CompilerTask; 9 import 'common/tasks.dart' show CompilerTask;
10 import 'common/work.dart' show WorkItem; 10 import 'common/work.dart' show WorkItem;
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after
200 final Set<ClassEntity> _recentClasses = new Setlet<ClassEntity>(); 200 final Set<ClassEntity> _recentClasses = new Setlet<ClassEntity>();
201 bool _recentConstants = false; 201 bool _recentConstants = false;
202 final ResolutionEnqueuerWorldBuilder _worldBuilder; 202 final ResolutionEnqueuerWorldBuilder _worldBuilder;
203 final WorkItemBuilder _workItemBuilder; 203 final WorkItemBuilder _workItemBuilder;
204 final DiagnosticReporter _reporter; 204 final DiagnosticReporter _reporter;
205 205
206 bool queueIsClosed = false; 206 bool queueIsClosed = false;
207 207
208 WorldImpactVisitor _impactVisitor; 208 WorldImpactVisitor _impactVisitor;
209 209
210 /// All declaration elements that have been processed by the resolver.
211 final Set<MemberEntity> _processedEntities = new Set<MemberEntity>();
212
213 final Queue<WorkItem> _queue = new Queue<WorkItem>(); 210 final Queue<WorkItem> _queue = new Queue<WorkItem>();
214 211
215 /// Queue of deferred resolution actions to execute when the resolution queue 212 /// Queue of deferred resolution actions to execute when the resolution queue
216 /// has been emptied. 213 /// has been emptied.
217 final Queue<DeferredAction> _deferredQueue = new Queue<DeferredAction>(); 214 final Queue<DeferredAction> _deferredQueue = new Queue<DeferredAction>();
218 215
219 ResolutionEnqueuer(this.task, this._options, this._reporter, this.strategy, 216 ResolutionEnqueuer(this.task, this._options, this._reporter, this.strategy,
220 this.listener, this._worldBuilder, this._workItemBuilder, 217 this.listener, this._worldBuilder, this._workItemBuilder,
221 [this.name = 'resolution enqueuer']) { 218 [this.name = 'resolution enqueuer']) {
222 _impactVisitor = new EnqueuerImplImpactVisitor(this); 219 _impactVisitor = new EnqueuerImplImpactVisitor(this);
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after
382 applyImpact(listener.registerClosurizedMember(element), 379 applyImpact(listener.registerClosurizedMember(element),
383 impactSource: 'closurized member'); 380 impactSource: 'closurized member');
384 _worldBuilder.registerClosurizedMember(element); 381 _worldBuilder.registerClosurizedMember(element);
385 } 382 }
386 383
387 void forEach(void f(WorkItem work)) { 384 void forEach(void f(WorkItem work)) {
388 do { 385 do {
389 while (_queue.isNotEmpty) { 386 while (_queue.isNotEmpty) {
390 // TODO(johnniwinther): Find an optimal process order. 387 // TODO(johnniwinther): Find an optimal process order.
391 WorkItem work = _queue.removeLast(); 388 WorkItem work = _queue.removeLast();
392 if (!_processedEntities.contains(work.element)) { 389 if (!_worldBuilder.isMemberProcessed(work.element)) {
393 strategy.processWorkItem(f, work); 390 strategy.processWorkItem(f, work);
394 _processedEntities.add(work.element); 391 _worldBuilder.registerProcessedMember(work.element);
395 } 392 }
396 } 393 }
397 List<ClassEntity> recents = _recentClasses.toList(growable: false); 394 List<ClassEntity> recents = _recentClasses.toList(growable: false);
398 _recentClasses.clear(); 395 _recentClasses.clear();
399 _recentConstants = false; 396 _recentConstants = false;
400 if (!_onQueueEmpty(recents)) { 397 if (!_onQueueEmpty(recents)) {
401 _recentClasses.addAll(recents); 398 _recentClasses.addAll(recents);
402 } 399 }
403 } while (_queue.isNotEmpty || 400 } while (_queue.isNotEmpty ||
404 _recentClasses.isNotEmpty || 401 _recentClasses.isNotEmpty ||
405 _deferredQueue.isNotEmpty || 402 _deferredQueue.isNotEmpty ||
406 _recentConstants); 403 _recentConstants);
407 } 404 }
408 405
409 void logSummary(void log(String message)) { 406 void logSummary(void log(String message)) {
410 log('Resolved ${_processedEntities.length} elements.'); 407 log('Resolved ${processedEntities.length} elements.');
411 listener.logSummary(log); 408 listener.logSummary(log);
412 } 409 }
413 410
414 String toString() => 'Enqueuer($name)'; 411 String toString() => 'Enqueuer($name)';
415 412
416 Iterable<MemberEntity> get processedEntities => _processedEntities; 413 Iterable<MemberEntity> get processedEntities =>
414 _worldBuilder.processedMembers;
417 415
418 ImpactUseCase get impactUse => IMPACT_USE; 416 ImpactUseCase get impactUse => IMPACT_USE;
419 417
420 bool get isResolutionQueue => true; 418 bool get isResolutionQueue => true;
421 419
422 /// Registers [entity] as processed by the resolution enqueuer. Used only for 420 /// Registers [entity] as processed by the resolution enqueuer. Used only for
423 /// testing. 421 /// testing.
424 void registerProcessedElementInternal(MemberEntity entity) { 422 void registerProcessedElementInternal(MemberEntity entity) {
425 _processedEntities.add(entity); 423 _worldBuilder.registerProcessedMember(entity);
426 } 424 }
427 425
428 /// Create a [WorkItem] for [entity] and add it to the work list if it has not 426 /// Create a [WorkItem] for [entity] and add it to the work list if it has not
429 /// already been processed. 427 /// already been processed.
430 void _addToWorkList(MemberEntity entity) { 428 void _addToWorkList(MemberEntity entity) {
431 if (_processedEntities.contains(entity)) return; 429 if (_worldBuilder.isMemberProcessed(entity)) return;
432 WorkItem workItem = _workItemBuilder.createWorkItem(entity); 430 WorkItem workItem = _workItemBuilder.createWorkItem(entity);
433 if (workItem == null) return; 431 if (workItem == null) return;
434 432
435 if (queueIsClosed) { 433 if (queueIsClosed) {
436 failedAt( 434 failedAt(
437 entity, "Resolution work list is closed. Trying to add $entity."); 435 entity, "Resolution work list is closed. Trying to add $entity.");
438 } 436 }
439 437
440 applyImpact(listener.registerUsedElement(entity), 438 applyImpact(listener.registerUsedElement(entity),
441 impactSource: 'used element'); 439 impactSource: 'used element');
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
595 final Entity element; 593 final Entity element;
596 final DeferredActionFunction action; 594 final DeferredActionFunction action;
597 595
598 DeferredAction(this.element, this.action); 596 DeferredAction(this.element, this.action);
599 } 597 }
600 598
601 /// Interface for creating work items for enqueued member entities. 599 /// Interface for creating work items for enqueued member entities.
602 abstract class WorkItemBuilder { 600 abstract class WorkItemBuilder {
603 WorkItem createWorkItem(covariant MemberEntity entity); 601 WorkItem createWorkItem(covariant MemberEntity entity);
604 } 602 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/dart2js.dart ('k') | pkg/compiler/lib/src/inferrer/ast_inferrer_engine.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698