| OLD | NEW |
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, 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 deferred_load; | 5 library deferred_load; |
| 6 | 6 |
| 7 import 'common/backend_api.dart' show Backend; | 7 import 'common/backend_api.dart' show Backend; |
| 8 import 'common/tasks.dart' show CompilerTask; | 8 import 'common/tasks.dart' show CompilerTask; |
| 9 import 'common.dart'; | 9 import 'common.dart'; |
| 10 import 'compiler.dart' show Compiler; | 10 import 'compiler.dart' show Compiler; |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 145 final Map<_DeferredImport, ImportDescription> _deferredImportDescriptions = | 145 final Map<_DeferredImport, ImportDescription> _deferredImportDescriptions = |
| 146 <_DeferredImport, ImportDescription>{}; | 146 <_DeferredImport, ImportDescription>{}; |
| 147 | 147 |
| 148 // For each deferred import we want to know exactly what elements have to | 148 // For each deferred import we want to know exactly what elements have to |
| 149 // be loaded. | 149 // be loaded. |
| 150 Map<_DeferredImport, Set<Element>> _importedDeferredBy = null; | 150 Map<_DeferredImport, Set<Element>> _importedDeferredBy = null; |
| 151 Map<_DeferredImport, Set<ConstantValue>> _constantsDeferredBy = null; | 151 Map<_DeferredImport, Set<ConstantValue>> _constantsDeferredBy = null; |
| 152 | 152 |
| 153 Set<Element> _mainElements = new Set<Element>(); | 153 Set<Element> _mainElements = new Set<Element>(); |
| 154 | 154 |
| 155 DeferredLoadTask(Compiler compiler) : super(compiler) { | 155 final Compiler compiler; |
| 156 DeferredLoadTask(Compiler compiler) |
| 157 : compiler = compiler, |
| 158 super(compiler.measurer) { |
| 156 mainOutputUnit.imports.add(_fakeMainImport); | 159 mainOutputUnit.imports.add(_fakeMainImport); |
| 157 } | 160 } |
| 158 | 161 |
| 159 Backend get backend => compiler.backend; | 162 Backend get backend => compiler.backend; |
| 163 DiagnosticReporter get reporter => compiler.reporter; |
| 160 | 164 |
| 161 /// Returns the [OutputUnit] where [element] belongs. | 165 /// Returns the [OutputUnit] where [element] belongs. |
| 162 OutputUnit outputUnitForElement(Element element) { | 166 OutputUnit outputUnitForElement(Element element) { |
| 163 if (!isProgramSplit) return mainOutputUnit; | 167 if (!isProgramSplit) return mainOutputUnit; |
| 164 | 168 |
| 165 element = element.implementation; | 169 element = element.implementation; |
| 166 while (!_elementToOutputUnit.containsKey(element)) { | 170 while (!_elementToOutputUnit.containsKey(element)) { |
| 167 // TODO(21051): workaround: it looks like we output annotation constants | 171 // TODO(21051): workaround: it looks like we output annotation constants |
| 168 // for classes that we don't include in the output. This seems to happen | 172 // for classes that we don't include in the output. This seems to happen |
| 169 // when we have reflection but can see that some classes are not needed. | 173 // when we have reflection but can see that some classes are not needed. |
| (...skipping 452 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 622 if (!isProgramSplit) { | 626 if (!isProgramSplit) { |
| 623 allOutputUnits.add(mainOutputUnit); | 627 allOutputUnits.add(mainOutputUnit); |
| 624 return; | 628 return; |
| 625 } | 629 } |
| 626 if (main == null) return; | 630 if (main == null) return; |
| 627 LibraryElement mainLibrary = main.library; | 631 LibraryElement mainLibrary = main.library; |
| 628 _importedDeferredBy = new Map<_DeferredImport, Set<Element>>(); | 632 _importedDeferredBy = new Map<_DeferredImport, Set<Element>>(); |
| 629 _constantsDeferredBy = new Map<_DeferredImport, Set<ConstantValue>>(); | 633 _constantsDeferredBy = new Map<_DeferredImport, Set<ConstantValue>>(); |
| 630 _importedDeferredBy[_fakeMainImport] = _mainElements; | 634 _importedDeferredBy[_fakeMainImport] = _mainElements; |
| 631 | 635 |
| 632 measureElement(mainLibrary, () { | 636 reporter.withCurrentElement(mainLibrary, () => measure(() { |
| 633 // Starting from main, traverse the program and find all dependencies. | 637 // Starting from main, traverse the program and find all dependencies. |
| 634 _mapDependencies(element: compiler.mainFunction, import: _fakeMainImport); | 638 _mapDependencies(element: compiler.mainFunction, import: _fakeMainImport); |
| 635 | 639 |
| 636 // Also add "global" dependencies to the main OutputUnit. These are | 640 // Also add "global" dependencies to the main OutputUnit. These are |
| 637 // things that the backend needs but cannot associate with a particular | 641 // things that the backend needs but cannot associate with a particular |
| 638 // element, for example, startRootIsolate. This set also contains | 642 // element, for example, startRootIsolate. This set also contains |
| 639 // elements for which we lack precise information. | 643 // elements for which we lack precise information. |
| 640 for (Element element in compiler.globalDependencies.otherDependencies) { | 644 for (Element element in compiler.globalDependencies.otherDependencies) { |
| 641 _mapDependencies(element: element, import: _fakeMainImport); | 645 _mapDependencies(element: element, import: _fakeMainImport); |
| 642 } | 646 } |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 703 OutputUnit representative = allOutputUnits.lookup(outputUnit); | 707 OutputUnit representative = allOutputUnits.lookup(outputUnit); |
| 704 if (representative == null) { | 708 if (representative == null) { |
| 705 representative = outputUnit; | 709 representative = outputUnit; |
| 706 allOutputUnits.add(representative); | 710 allOutputUnits.add(representative); |
| 707 } | 711 } |
| 708 _constantToOutputUnit[constant] = representative; | 712 _constantToOutputUnit[constant] = representative; |
| 709 }); | 713 }); |
| 710 | 714 |
| 711 // Generate a unique name for each OutputUnit. | 715 // Generate a unique name for each OutputUnit. |
| 712 _assignNamesToOutputUnits(allOutputUnits); | 716 _assignNamesToOutputUnits(allOutputUnits); |
| 713 }); | 717 })); |
| 714 // Notify the impact strategy impacts are no longer needed for deferred | 718 // Notify the impact strategy impacts are no longer needed for deferred |
| 715 // load. | 719 // load. |
| 716 compiler.impactStrategy.onImpactUsed(IMPACT_USE); | 720 compiler.impactStrategy.onImpactUsed(IMPACT_USE); |
| 717 } | 721 } |
| 718 | 722 |
| 719 void beforeResolution(Compiler compiler) { | 723 void beforeResolution(Compiler compiler) { |
| 720 if (compiler.mainApp == null) return; | 724 if (compiler.mainApp == null) return; |
| 721 _allDeferredImports[_fakeMainImport] = compiler.mainApp; | 725 _allDeferredImports[_fakeMainImport] = compiler.mainApp; |
| 722 var lastDeferred; | 726 var lastDeferred; |
| 723 // When detecting duplicate prefixes of deferred libraries there are 4 | 727 // When detecting duplicate prefixes of deferred libraries there are 4 |
| (...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 998 return result; | 1002 return result; |
| 999 } | 1003 } |
| 1000 | 1004 |
| 1001 bool operator ==(other) { | 1005 bool operator ==(other) { |
| 1002 if (other is! _DeclaredDeferredImport) return false; | 1006 if (other is! _DeclaredDeferredImport) return false; |
| 1003 return declaration == other.declaration; | 1007 return declaration == other.declaration; |
| 1004 } | 1008 } |
| 1005 | 1009 |
| 1006 int get hashCode => declaration.hashCode * 17; | 1010 int get hashCode => declaration.hashCode * 17; |
| 1007 } | 1011 } |
| OLD | NEW |