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

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

Issue 2527403002: Further encapsulate Enqueuer (Closed)
Patch Set: Cleanup. Created 4 years 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
« no previous file with comments | « no previous file | pkg/compiler/lib/src/enqueue.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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.compiler_base; 5 library dart2js.compiler_base;
6 6
7 import 'dart:async' show EventSink, Future; 7 import 'dart:async' show EventSink, Future;
8 8
9 import '../compiler_new.dart' as api; 9 import '../compiler_new.dart' as api;
10 import 'cache_strategy.dart' show CacheStrategy; 10 import 'cache_strategy.dart' show CacheStrategy;
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
49 LibraryLoaderTask, 49 LibraryLoaderTask,
50 LoadedLibraries, 50 LoadedLibraries,
51 LibraryLoaderListener, 51 LibraryLoaderListener,
52 ScriptLoader; 52 ScriptLoader;
53 import 'mirrors_used.dart' show MirrorUsageAnalyzerTask; 53 import 'mirrors_used.dart' show MirrorUsageAnalyzerTask;
54 import 'null_compiler_output.dart' show NullCompilerOutput, NullSink; 54 import 'null_compiler_output.dart' show NullCompilerOutput, NullSink;
55 import 'options.dart' show CompilerOptions, DiagnosticOptions; 55 import 'options.dart' show CompilerOptions, DiagnosticOptions;
56 import 'parser/diet_parser_task.dart' show DietParserTask; 56 import 'parser/diet_parser_task.dart' show DietParserTask;
57 import 'parser/parser_task.dart' show ParserTask; 57 import 'parser/parser_task.dart' show ParserTask;
58 import 'patch_parser.dart' show PatchParserTask; 58 import 'patch_parser.dart' show PatchParserTask;
59 import 'resolution/registry.dart' show ResolutionRegistry;
60 import 'resolution/resolution.dart' show ResolverTask; 59 import 'resolution/resolution.dart' show ResolverTask;
61 import 'resolution/tree_elements.dart' show TreeElementMapping;
62 import 'resolved_uri_translator.dart'; 60 import 'resolved_uri_translator.dart';
63 import 'scanner/scanner_task.dart' show ScannerTask; 61 import 'scanner/scanner_task.dart' show ScannerTask;
64 import 'script.dart' show Script; 62 import 'script.dart' show Script;
65 import 'serialization/task.dart' show SerializationTask; 63 import 'serialization/task.dart' show SerializationTask;
66 import 'ssa/nodes.dart' show HInstruction; 64 import 'ssa/nodes.dart' show HInstruction;
67 import 'tokens/token.dart' show StringToken, Token, TokenPair; 65 import 'tokens/token.dart' show StringToken, Token, TokenPair;
68 import 'tokens/token_map.dart' show TokenMap; 66 import 'tokens/token_map.dart' show TokenMap;
69 import 'tracer.dart' show Tracer; 67 import 'tracer.dart' show Tracer;
70 import 'tree/tree.dart' show Node, TypeAnnotation; 68 import 'tree/tree.dart' show Node, TypeAnnotation;
71 import 'typechecker.dart' show TypeCheckerTask; 69 import 'typechecker.dart' show TypeCheckerTask;
72 import 'types/types.dart' show GlobalTypeInferenceTask; 70 import 'types/types.dart' show GlobalTypeInferenceTask;
73 import 'types/masks.dart' show CommonMasks;
74 import 'universe/selector.dart' show Selector; 71 import 'universe/selector.dart' show Selector;
75 import 'universe/world_builder.dart' 72 import 'universe/world_builder.dart'
76 show ResolutionWorldBuilder, CodegenWorldBuilder; 73 show ResolutionWorldBuilder, CodegenWorldBuilder;
77 import 'universe/use.dart' show StaticUse; 74 import 'universe/use.dart' show StaticUse, TypeUse;
78 import 'universe/world_impact.dart' 75 import 'universe/world_impact.dart'
79 show 76 show
80 ImpactStrategy, 77 ImpactStrategy,
81 WorldImpact, 78 WorldImpact,
82 WorldImpactBuilder, 79 WorldImpactBuilder,
83 WorldImpactBuilderImpl; 80 WorldImpactBuilderImpl;
84 import 'util/util.dart' show Link, Setlet; 81 import 'util/util.dart' show Link, Setlet;
85 import 'world.dart' show ClosedWorld, ClosedWorldRefiner, OpenWorld, WorldImpl; 82 import 'world.dart' show ClosedWorld, ClosedWorldRefiner, OpenWorld, WorldImpl;
86 83
87 typedef Backend MakeBackendFuncion(Compiler compiler); 84 typedef Backend MakeBackendFuncion(Compiler compiler);
(...skipping 536 matching lines...) Expand 10 before | Expand all | Expand 10 after
624 /// This operation assumes an unclosed resolution queue and is only supported 621 /// This operation assumes an unclosed resolution queue and is only supported
625 /// when the '--analyze-main' option is used. 622 /// when the '--analyze-main' option is used.
626 Future<LibraryElement> analyzeUri(Uri libraryUri, 623 Future<LibraryElement> analyzeUri(Uri libraryUri,
627 {bool skipLibraryWithPartOfTag: true}) { 624 {bool skipLibraryWithPartOfTag: true}) {
628 assert(options.analyzeMain); 625 assert(options.analyzeMain);
629 reporter.log('Analyzing $libraryUri (${options.buildId})'); 626 reporter.log('Analyzing $libraryUri (${options.buildId})');
630 return libraryLoader 627 return libraryLoader
631 .loadLibrary(libraryUri, skipFileWithPartOfTag: true) 628 .loadLibrary(libraryUri, skipFileWithPartOfTag: true)
632 .then((LibraryElement library) { 629 .then((LibraryElement library) {
633 if (library == null) return null; 630 if (library == null) return null;
634 fullyEnqueueLibrary(library, enqueuer.resolution); 631 enqueuer.resolution.applyImpact(computeImpactForLibrary(library));
635 emptyQueue(enqueuer.resolution); 632 emptyQueue(enqueuer.resolution);
636 enqueuer.resolution.logSummary(reporter.log); 633 enqueuer.resolution.logSummary(reporter.log);
637 return library; 634 return library;
638 }); 635 });
639 } 636 }
640 637
641 /// Performs the compilation when all libraries have been loaded. 638 /// Performs the compilation when all libraries have been loaded.
642 void compileLoadedLibraries() => 639 void compileLoadedLibraries() =>
643 selfTask.measureSubtask("Compiler.compileLoadedLibraries", () { 640 selfTask.measureSubtask("Compiler.compileLoadedLibraries", () {
644 WorldImpact mainImpact = computeMain(); 641 WorldImpact mainImpact = computeMain();
(...skipping 10 matching lines...) Expand all
655 supportDumpInfo: options.dumpInfo, 652 supportDumpInfo: options.dumpInfo,
656 supportSerialization: serialization.supportSerialization); 653 supportSerialization: serialization.supportSerialization);
657 654
658 phase = PHASE_RESOLVING; 655 phase = PHASE_RESOLVING;
659 enqueuer.resolution.applyImpact(mainImpact); 656 enqueuer.resolution.applyImpact(mainImpact);
660 if (options.resolveOnly) { 657 if (options.resolveOnly) {
661 libraryLoader.libraries.where((LibraryElement library) { 658 libraryLoader.libraries.where((LibraryElement library) {
662 return !serialization.isDeserialized(library); 659 return !serialization.isDeserialized(library);
663 }).forEach((LibraryElement library) { 660 }).forEach((LibraryElement library) {
664 reporter.log('Enqueuing ${library.canonicalUri}'); 661 reporter.log('Enqueuing ${library.canonicalUri}');
665 fullyEnqueueLibrary(library, enqueuer.resolution); 662 enqueuer.resolution.applyImpact(computeImpactForLibrary(library));
666 }); 663 });
667 } else if (analyzeAll) { 664 } else if (analyzeAll) {
668 libraryLoader.libraries.forEach((LibraryElement library) { 665 libraryLoader.libraries.forEach((LibraryElement library) {
669 reporter.log('Enqueuing ${library.canonicalUri}'); 666 reporter.log('Enqueuing ${library.canonicalUri}');
670 fullyEnqueueLibrary(library, enqueuer.resolution); 667 enqueuer.resolution.applyImpact(computeImpactForLibrary(library));
671 }); 668 });
672 } else if (options.analyzeMain) { 669 } else if (options.analyzeMain) {
673 if (mainApp != null) { 670 if (mainApp != null) {
674 fullyEnqueueLibrary(mainApp, enqueuer.resolution); 671 enqueuer.resolution.applyImpact(computeImpactForLibrary(mainApp));
675 } 672 }
676 if (librariesToAnalyzeWhenRun != null) { 673 if (librariesToAnalyzeWhenRun != null) {
677 for (Uri libraryUri in librariesToAnalyzeWhenRun) { 674 for (Uri libraryUri in librariesToAnalyzeWhenRun) {
678 fullyEnqueueLibrary( 675 enqueuer.resolution.applyImpact(computeImpactForLibrary(
679 libraryLoader.lookupLibrary(libraryUri), enqueuer.resolution); 676 libraryLoader.lookupLibrary(libraryUri)));
680 } 677 }
681 } 678 }
682 } 679 }
683 if (deferredLoadTask.isProgramSplit) { 680 if (deferredLoadTask.isProgramSplit) {
684 enqueuer.resolution 681 enqueuer.resolution
685 .applyImpact(backend.computeDeferredLoadingImpact()); 682 .applyImpact(backend.computeDeferredLoadingImpact());
686 } 683 }
687 // Elements required by enqueueHelpers are global dependencies 684 // Elements required by enqueueHelpers are global dependencies
688 // that are not pulled in by a particular element. 685 // that are not pulled in by a particular element.
689 enqueuer.resolution.applyImpact(backend.computeHelpersImpact()); 686 enqueuer.resolution.applyImpact(backend.computeHelpersImpact());
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
732 729
733 reporter.log('Inferring types...'); 730 reporter.log('Inferring types...');
734 globalInference.runGlobalTypeInference(mainFunction); 731 globalInference.runGlobalTypeInference(mainFunction);
735 732
736 if (stopAfterTypeInference) return; 733 if (stopAfterTypeInference) return;
737 734
738 backend.onTypeInferenceComplete(); 735 backend.onTypeInferenceComplete();
739 736
740 reporter.log('Compiling...'); 737 reporter.log('Compiling...');
741 phase = PHASE_COMPILING; 738 phase = PHASE_COMPILING;
739
742 backend.onCodegenStart(); 740 backend.onCodegenStart();
743 if (hasIsolateSupport) { 741 if (hasIsolateSupport) {
744 enqueuer.codegen 742 enqueuer.codegen
745 .applyImpact(backend.enableIsolateSupport(forResolution: false)); 743 .applyImpact(backend.enableIsolateSupport(forResolution: false));
746 } 744 }
747 if (compileAll) { 745 if (compileAll) {
748 libraryLoader.libraries.forEach((LibraryElement library) { 746 libraryLoader.libraries.forEach((LibraryElement library) {
749 fullyEnqueueLibrary(library, enqueuer.codegen); 747 enqueuer.codegen.applyImpact(computeImpactForLibrary(library));
750 }); 748 });
751 } 749 }
752 processQueue(enqueuer.codegen, mainFunction); 750 processQueue(enqueuer.codegen, mainFunction);
753 enqueuer.codegen.logSummary(reporter.log); 751 enqueuer.codegen.logSummary(reporter.log);
754 752
755 int programSize = backend.assembleProgram(); 753 int programSize = backend.assembleProgram();
756 754
757 if (options.dumpInfo) { 755 if (options.dumpInfo) {
758 dumpInfoTask.reportSize(programSize); 756 dumpInfoTask.reportSize(programSize);
759 dumpInfoTask.dumpInfo(); 757 dumpInfoTask.dumpInfo();
(...skipping 13 matching lines...) Expand all
773 // require the information computed in [world.closeWorld].) 771 // require the information computed in [world.closeWorld].)
774 backend.onResolutionComplete(); 772 backend.onResolutionComplete();
775 773
776 deferredLoadTask.onResolutionComplete(mainFunction); 774 deferredLoadTask.onResolutionComplete(mainFunction);
777 775
778 // TODO(johnniwinther): Move this after rti computation but before 776 // TODO(johnniwinther): Move this after rti computation but before
779 // reflection members computation, and (re-)close the world afterwards. 777 // reflection members computation, and (re-)close the world afterwards.
780 closureToClassMapper.createClosureClasses(); 778 closureToClassMapper.createClosureClasses();
781 } 779 }
782 780
783 void fullyEnqueueLibrary(LibraryElement library, Enqueuer world) { 781 /// Compute the [WorldImpact] for accessing all elements in [library].
784 void enqueueAll(Element element) { 782 WorldImpact computeImpactForLibrary(LibraryElement library) {
785 fullyEnqueueTopLevelElement(element, world); 783 WorldImpactBuilderImpl impactBuilder = new WorldImpactBuilderImpl();
784
785 void registerStaticUse(Element element) {
786 impactBuilder.registerStaticUse(new StaticUse.directUse(element));
786 } 787 }
787 788
788 library.implementation.forEachLocalMember(enqueueAll); 789 void registerElement(Element element) {
790 if (element.isClass) {
791 ClassElement cls = element;
792 cls.ensureResolved(resolution);
793 cls.forEachLocalMember(registerStaticUse);
794 impactBuilder.registerTypeUse(new TypeUse.instantiation(cls.rawType));
795 } else {
796 registerStaticUse(element);
797 }
798 }
799
800 library.implementation.forEachLocalMember(registerElement);
801
789 library.imports.forEach((ImportElement import) { 802 library.imports.forEach((ImportElement import) {
790 if (import.isDeferred) { 803 if (import.isDeferred) {
791 // `import.prefix` and `loadLibrary` may be `null` when the deferred 804 // `import.prefix` and `loadLibrary` may be `null` when the deferred
792 // import has compile-time errors. 805 // import has compile-time errors.
793 GetterElement loadLibrary = import.prefix?.loadLibrary; 806 GetterElement loadLibrary = import.prefix?.loadLibrary;
794 if (loadLibrary != null) { 807 if (loadLibrary != null) {
795 world.addToWorkList(loadLibrary); 808 registerStaticUse(loadLibrary);
796 } 809 }
797 } 810 }
798 if (serialization.supportSerialization) { 811 if (serialization.supportSerialization) {
799 for (MetadataAnnotation metadata in import.metadata) { 812 for (MetadataAnnotation metadata in import.metadata) {
800 metadata.ensureResolved(resolution); 813 metadata.ensureResolved(resolution);
801 } 814 }
802 } 815 }
803 }); 816 });
804 if (serialization.supportSerialization) { 817 if (serialization.supportSerialization) {
805 library.exports.forEach((ExportElement export) { 818 library.exports.forEach((ExportElement export) {
806 for (MetadataAnnotation metadata in export.metadata) { 819 for (MetadataAnnotation metadata in export.metadata) {
807 metadata.ensureResolved(resolution); 820 metadata.ensureResolved(resolution);
808 } 821 }
809 }); 822 });
810 library.compilationUnits.forEach((CompilationUnitElement unit) { 823 library.compilationUnits.forEach((CompilationUnitElement unit) {
811 for (MetadataAnnotation metadata in unit.metadata) { 824 for (MetadataAnnotation metadata in unit.metadata) {
812 metadata.ensureResolved(resolution); 825 metadata.ensureResolved(resolution);
813 } 826 }
814 }); 827 });
815 } 828 }
816 } 829 return impactBuilder;
817
818 void fullyEnqueueTopLevelElement(Element element, Enqueuer world) {
819 if (element.isClass) {
820 ClassElement cls = element;
821 cls.ensureResolved(resolution);
822 cls.forEachLocalMember(enqueuer.resolution.addToWorkList);
823 world.registerInstantiatedType(cls.rawType);
824 } else {
825 world.addToWorkList(element);
826 }
827 } 830 }
828 831
829 // Resolves metadata on library elements. This is necessary in order to 832 // Resolves metadata on library elements. This is necessary in order to
830 // resolve metadata classes referenced only from metadata on library tags. 833 // resolve metadata classes referenced only from metadata on library tags.
831 // TODO(ahe): Figure out how to do this lazily. 834 // TODO(ahe): Figure out how to do this lazily.
832 void resolveLibraryMetadata() { 835 void resolveLibraryMetadata() {
833 for (LibraryElement library in libraryLoader.libraries) { 836 for (LibraryElement library in libraryLoader.libraries) {
834 if (library.metadata != null) { 837 if (library.metadata != null) {
835 for (MetadataAnnotation metadata in library.metadata) { 838 for (MetadataAnnotation metadata in library.metadata) {
836 metadata.ensureResolved(resolution); 839 metadata.ensureResolved(resolution);
(...skipping 1417 matching lines...) Expand 10 before | Expand all | Expand 10 after
2254 _ElementScanner(this.scanner); 2257 _ElementScanner(this.scanner);
2255 void scanLibrary(LibraryElement library) => scanner.scanLibrary(library); 2258 void scanLibrary(LibraryElement library) => scanner.scanLibrary(library);
2256 void scanUnit(CompilationUnitElement unit) => scanner.scan(unit); 2259 void scanUnit(CompilationUnitElement unit) => scanner.scan(unit);
2257 } 2260 }
2258 2261
2259 class _EmptyEnvironment implements Environment { 2262 class _EmptyEnvironment implements Environment {
2260 const _EmptyEnvironment(); 2263 const _EmptyEnvironment();
2261 2264
2262 String valueOf(String key) => null; 2265 String valueOf(String key) => null;
2263 } 2266 }
OLDNEW
« no previous file with comments | « no previous file | pkg/compiler/lib/src/enqueue.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698