| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 } |
| OLD | NEW |