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

Side by Side Diff: sdk/lib/_internal/compiler/implementation/deferred_load.dart

Issue 221663005: Load deferred chunks in the right order. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 8 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 | Annotate | Revision Log
OLDNEW
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 'dart2jslib.dart' show 7 import 'dart2jslib.dart' show
8 Compiler, 8 Compiler,
9 CompilerTask, 9 CompilerTask,
10 Constant, 10 Constant,
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
112 /// The OutputUnit that will be loaded when the program starts. 112 /// The OutputUnit that will be loaded when the program starts.
113 final OutputUnit mainOutputUnit = new OutputUnit(); 113 final OutputUnit mainOutputUnit = new OutputUnit();
114 114
115 /// A set containing (eventually) all output units that will result from the 115 /// A set containing (eventually) all output units that will result from the
116 /// program. 116 /// program.
117 final Set<OutputUnit> allOutputUnits = new Set<OutputUnit>(); 117 final Set<OutputUnit> allOutputUnits = new Set<OutputUnit>();
118 118
119 /// Will be `true` if the program contains deferred libraries. 119 /// Will be `true` if the program contains deferred libraries.
120 bool splitProgram = false; 120 bool splitProgram = false;
121 121
122 /// A mapping from the name of a [DeferredLibrary] annotation to all dependent 122 /// A mapping from the name of a defer import to all the output units it
123 /// output units. 123 /// depends on in a list of lists to be loaded in the order they appear.
124 final Map<String, Set<OutputUnit>> hunksToLoad = 124 ///
125 new Map<String, Set<OutputUnit>>(); 125 /// For example {"lib1": [[lib1_lib2_lib3], [lib1_lib2, lib1_lib3],
126 /// [lib1]]} would mean that in order to load "lib1" first the hunk
127 /// lib1_lib2_lib2 should be loaded, then the hunks lib1_lib2 and lib1_lib3
128 /// can be loaded in parallel. And finally lib1 can be loaded.
129 final Map<String, List<List<OutputUnit>>> hunksToLoad =
130 new Map<String, List<List<OutputUnit>>>();
126 final Map<Import, String> importDeferName = new Map<Import, String>(); 131 final Map<Import, String> importDeferName = new Map<Import, String>();
127 132
128 /// A mapping from elements and constants to their output unit. Query this via 133 /// A mapping from elements and constants to their output unit. Query this via
129 /// [outputUnitForElement] 134 /// [outputUnitForElement]
130 final Map<Element, OutputUnit> _elementToOutputUnit = 135 final Map<Element, OutputUnit> _elementToOutputUnit =
131 new Map<Element, OutputUnit>(); 136 new Map<Element, OutputUnit>();
132 137
133 /// A mapping from constants to their output unit. Query this via 138 /// A mapping from constants to their output unit. Query this via
134 /// [outputUnitForConstant] 139 /// [outputUnitForConstant]
135 final Map<Constant, OutputUnit> _constantToOutputUnit = 140 final Map<Constant, OutputUnit> _constantToOutputUnit =
(...skipping 465 matching lines...) Expand 10 before | Expand all | Expand 10 after
601 generatedNames[outputUnit] = outputUnit.name; 606 generatedNames[outputUnit] = outputUnit.name;
602 } 607 }
603 608
604 for (Import import in _allDeferredImports.keys) { 609 for (Import import in _allDeferredImports.keys) {
605 computeImportDeferName(import); 610 computeImportDeferName(import);
606 } 611 }
607 612
608 for (OutputUnit outputUnit in allOutputUnits) { 613 for (OutputUnit outputUnit in allOutputUnits) {
609 computeOutputUnitName(outputUnit); 614 computeOutputUnitName(outputUnit);
610 } 615 }
616 List sortedOutputUnits = new List.from(allOutputUnits);
617 // Sort the outputunits in descending order of the number of imports they
floitsch 2014/04/02 09:32:48 output units
sigurdm 2014/04/02 11:25:30 Done.
618 // include.
floitsch 2014/04/02 09:32:48 Explain why this is necessary and enough.
sigurdm 2014/04/02 11:25:30 I tried to explain it - hope it is not too verbose
619 sortedOutputUnits.sort((a, b) => b.imports.length - a.imports.length);
611 620
612 // For each deferred import we find out which outputUnits to load. 621 // For each deferred import we find out which outputUnits to load.
613 for (Import import in _allDeferredImports.keys) { 622 for (Import import in _allDeferredImports.keys) {
614 if (import == _fakeMainImport) continue; 623 if (import == _fakeMainImport) continue;
615 hunksToLoad[importDeferName[import]] = new Set<OutputUnit>(); 624 hunksToLoad[importDeferName[import]] = new List<List<OutputUnit>>();
616 for (OutputUnit outputUnit in allOutputUnits) { 625 int lastNumberOfImports = 0;
626 List<OutputUnit> currentLastList;
627 for (OutputUnit outputUnit in sortedOutputUnits) {
617 if (outputUnit == mainOutputUnit) continue; 628 if (outputUnit == mainOutputUnit) continue;
618 if (outputUnit.imports.contains(import)) { 629 if (outputUnit.imports.contains(import)) {
619 hunksToLoad[importDeferName[import]].add(outputUnit); 630 if (outputUnit.imports.length != lastNumberOfImports) {
631 lastNumberOfImports = outputUnit.imports.length;
632 currentLastList = new List<OutputUnit>();
633 hunksToLoad[importDeferName[import]].add(currentLastList);
634 }
635 currentLastList.add(outputUnit);
620 } 636 }
621 } 637 }
622 } 638 }
623 } 639 }
624 640
625 void onResolutionComplete(FunctionElement main) { 641 void onResolutionComplete(FunctionElement main) {
626 if (!splitProgram) { 642 if (!splitProgram) {
627 allOutputUnits.add(mainOutputUnit); 643 allOutputUnits.add(mainOutputUnit);
628 return; 644 return;
629 } 645 }
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
748 } 764 }
749 if (splitProgram && compiler.backend is DartBackend) { 765 if (splitProgram && compiler.backend is DartBackend) {
750 // TODO(sigurdm): Implement deferred loading for dart2dart. 766 // TODO(sigurdm): Implement deferred loading for dart2dart.
751 splitProgram = false; 767 splitProgram = false;
752 compiler.reportInfo( 768 compiler.reportInfo(
753 lastDeferred, 769 lastDeferred,
754 MessageKind.DEFERRED_LIBRARY_DART_2_DART); 770 MessageKind.DEFERRED_LIBRARY_DART_2_DART);
755 } 771 }
756 } 772 }
757 } 773 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698