| Index: pkg/compiler/lib/src/compiler.dart
|
| diff --git a/pkg/compiler/lib/src/compiler.dart b/pkg/compiler/lib/src/compiler.dart
|
| index 1d0587cbc48ac6520004351c3c16b8c9268e308a..e92f260a54734faff8e848b0b7db6cfa53b11b70 100644
|
| --- a/pkg/compiler/lib/src/compiler.dart
|
| +++ b/pkg/compiler/lib/src/compiler.dart
|
| @@ -152,6 +152,7 @@ abstract class Compiler implements LibraryLoaderListener {
|
| TypeCheckerTask checker;
|
| GlobalTypeInferenceTask globalInference;
|
| JavaScriptBackend backend;
|
| + CodegenWorldBuilder _codegenWorldBuilder;
|
|
|
| GenericTask selfTask;
|
|
|
| @@ -280,7 +281,11 @@ abstract class Compiler implements LibraryLoaderListener {
|
|
|
| ResolutionWorldBuilder get resolutionWorldBuilder =>
|
| enqueuer.resolution.worldBuilder;
|
| - CodegenWorldBuilder get codegenWorldBuilder => enqueuer.codegen.worldBuilder;
|
| + CodegenWorldBuilder get codegenWorldBuilder {
|
| + assert(invariant(NO_LOCATION_SPANNABLE, _codegenWorldBuilder != null,
|
| + message: "CodegenWorldBuilder has not been created yet."));
|
| + return _codegenWorldBuilder;
|
| + }
|
|
|
| bool get analyzeAll => options.analyzeAll || compileAll;
|
|
|
| @@ -682,16 +687,19 @@ abstract class Compiler implements LibraryLoaderListener {
|
| reporter.log('Compiling...');
|
| phase = PHASE_COMPILING;
|
|
|
| - codegenWorldBuilder.open(closedWorld);
|
| - enqueuer.codegen.applyImpact(backend.onCodegenStart(closedWorld));
|
| + Enqueuer codegenEnqueuer = enqueuer.createCodegenEnqueuer(closedWorld);
|
| + _codegenWorldBuilder = codegenEnqueuer.worldBuilder;
|
| + _codegenWorldBuilder.open(closedWorld);
|
| + codegenEnqueuer.applyImpact(
|
| + backend.onCodegenStart(closedWorld, _codegenWorldBuilder));
|
| if (compileAll) {
|
| libraryLoader.libraries.forEach((LibraryElement library) {
|
| - enqueuer.codegen.applyImpact(computeImpactForLibrary(library));
|
| + codegenEnqueuer.applyImpact(computeImpactForLibrary(library));
|
| });
|
| }
|
| - processQueue(enqueuer.codegen, mainMethod, libraryLoader.libraries,
|
| + processQueue(codegenEnqueuer, mainMethod, libraryLoader.libraries,
|
| onProgress: showCodegenProgress);
|
| - enqueuer.codegen.logSummary(reporter.log);
|
| + codegenEnqueuer.logSummary(reporter.log);
|
|
|
| int programSize = backend.assembleProgram(closedWorld);
|
|
|
| @@ -702,7 +710,7 @@ abstract class Compiler implements LibraryLoaderListener {
|
|
|
| backend.onCodegenEnd();
|
|
|
| - checkQueues();
|
| + checkQueues(enqueuer.resolution, codegenEnqueuer);
|
| });
|
|
|
| /// Perform the steps needed to fully end the resolution phase.
|
| @@ -792,11 +800,11 @@ abstract class Compiler implements LibraryLoaderListener {
|
| /**
|
| * Empty the [enqueuer] queue.
|
| */
|
| - void emptyQueue(Enqueuer enqueuer, {void onProgress()}) {
|
| + void emptyQueue(Enqueuer enqueuer, {void onProgress(Enqueuer enqueuer)}) {
|
| selfTask.measureSubtask("Compiler.emptyQueue", () {
|
| enqueuer.forEach((WorkItem work) {
|
| if (onProgress != null) {
|
| - onProgress();
|
| + onProgress(enqueuer);
|
| }
|
| reporter.withCurrentElement(
|
| work.element,
|
| @@ -811,7 +819,7 @@ abstract class Compiler implements LibraryLoaderListener {
|
|
|
| void processQueue(Enqueuer enqueuer, MethodElement mainMethod,
|
| Iterable<LibraryEntity> libraries,
|
| - {void onProgress()}) {
|
| + {void onProgress(Enqueuer enqueuer)}) {
|
| selfTask.measureSubtask("Compiler.processQueue", () {
|
| enqueuer.open(impactStrategy, mainMethod, libraries);
|
| if (options.verbose) {
|
| @@ -835,13 +843,13 @@ abstract class Compiler implements LibraryLoaderListener {
|
| * processing the queues). Also compute the number of methods that
|
| * were resolved, but not compiled (aka excess resolution).
|
| */
|
| - checkQueues() {
|
| - for (Enqueuer enqueuer in [enqueuer.resolution, enqueuer.codegen]) {
|
| + checkQueues(Enqueuer resolutionEnqueuer, Enqueuer codegenEnqueuer) {
|
| + for (Enqueuer enqueuer in [resolutionEnqueuer, codegenEnqueuer]) {
|
| enqueuer.checkQueueIsEmpty();
|
| }
|
| if (!REPORT_EXCESS_RESOLUTION) return;
|
| - var resolved = new Set.from(enqueuer.resolution.processedEntities);
|
| - for (Element e in enqueuer.codegen.processedEntities) {
|
| + var resolved = new Set.from(resolutionEnqueuer.processedEntities);
|
| + for (Element e in codegenEnqueuer.processedEntities) {
|
| resolved.remove(e);
|
| }
|
| for (Element e in new Set.from(resolved)) {
|
| @@ -866,23 +874,22 @@ abstract class Compiler implements LibraryLoaderListener {
|
| }
|
| }
|
|
|
| - void showResolutionProgress() {
|
| + void showResolutionProgress(Enqueuer enqueuer) {
|
| if (shouldPrintProgress) {
|
| // TODO(ahe): Add structured diagnostics to the compiler API and
|
| // use it to separate this from the --verbose option.
|
| assert(phase == PHASE_RESOLVING);
|
| - reporter.log('Resolved ${enqueuer.resolution.processedEntities.length} '
|
| + reporter.log('Resolved ${enqueuer.processedEntities.length} '
|
| 'elements.');
|
| progress.reset();
|
| }
|
| }
|
|
|
| - void showCodegenProgress() {
|
| + void showCodegenProgress(Enqueuer enqueuer) {
|
| if (shouldPrintProgress) {
|
| // TODO(ahe): Add structured diagnostics to the compiler API and
|
| // use it to separate this from the --verbose option.
|
| - reporter.log(
|
| - 'Compiled ${enqueuer.codegen.processedEntities.length} methods.');
|
| + reporter.log('Compiled ${enqueuer.processedEntities.length} methods.');
|
| progress.reset();
|
| }
|
| }
|
| @@ -1826,8 +1833,7 @@ class CompilerResolution implements Resolution {
|
| WorldImpact transformResolutionImpact(
|
| Element element, ResolutionImpact resolutionImpact) {
|
| WorldImpact worldImpact = _compiler.backend.impactTransformer
|
| - .transformResolutionImpact(
|
| - _compiler.enqueuer.resolution, resolutionImpact);
|
| + .transformResolutionImpact(enqueuer, resolutionImpact);
|
| _worldImpactCache[element] = worldImpact;
|
| return worldImpact;
|
| }
|
|
|