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

Side by Side Diff: dart/pkg/dart2js_incremental/lib/library_updater.dart

Issue 760383003: Incremental compilation of constants. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge
Patch Set: Merged with r42279 and CL 760383003. Created 6 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 | 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 dart2js_incremental.library_updater; 5 library dart2js_incremental.library_updater;
6 6
7 import 'dart:async' show 7 import 'dart:async' show
8 Future; 8 Future;
9 9
10 import 'dart:convert' show 10 import 'dart:convert' show
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
69 ClassElementX, 69 ClassElementX,
70 CompilationUnitElementX, 70 CompilationUnitElementX,
71 DeclarationSite, 71 DeclarationSite,
72 ElementX, 72 ElementX,
73 FieldElementX, 73 FieldElementX,
74 LibraryElementX; 74 LibraryElementX;
75 75
76 import 'package:compiler/src/universe/universe.dart' show 76 import 'package:compiler/src/universe/universe.dart' show
77 Selector; 77 Selector;
78 78
79 import 'package:compiler/src/constants/values.dart' show
80 ConstantValue;
81
79 import 'diff.dart' show 82 import 'diff.dart' show
80 Difference, 83 Difference,
81 computeDifference; 84 computeDifference;
82 85
83 typedef void Logger(message); 86 typedef void Logger(message);
84 87
85 typedef bool Reuser( 88 typedef bool Reuser(
86 Token diffToken, 89 Token diffToken,
87 PartialElement before, 90 PartialElement before,
88 PartialElement after); 91 PartialElement after);
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
123 126
124 final Set<ElementX> _removedElements = new Set<ElementX>(); 127 final Set<ElementX> _removedElements = new Set<ElementX>();
125 128
126 final Set<ClassElementX> _classesWithSchemaChanges = 129 final Set<ClassElementX> _classesWithSchemaChanges =
127 new Set<ClassElementX>(); 130 new Set<ClassElementX>();
128 131
129 final Set<ClassElementX> _emittedClasses; 132 final Set<ClassElementX> _emittedClasses;
130 133
131 final Set<ClassElementX> _directlyInstantiatedClasses; 134 final Set<ClassElementX> _directlyInstantiatedClasses;
132 135
136 final Set<ConstantValue> _compiledConstants;
137
138 bool _hasComputedNeeds = false;
139
133 LibraryUpdater( 140 LibraryUpdater(
134 Compiler compiler, 141 Compiler compiler,
135 this.inputProvider, 142 this.inputProvider,
136 this.uri, 143 this.uri,
137 this.logTime, 144 this.logTime,
138 this.logVerbose) 145 this.logVerbose)
139 : this.compiler = compiler, 146 : this.compiler = compiler,
140 _emittedClasses = new Set.from( 147 _emittedClasses = new Set.from(
141 compiler == null 148 compiler == null
142 ? [] : compiler.backend.emitter.neededClasses), 149 ? [] : compiler.backend.emitter.neededClasses),
143 _directlyInstantiatedClasses = new Set.from( 150 _directlyInstantiatedClasses = new Set.from(
144 compiler == null 151 compiler == null
145 ? [] : compiler.codegenWorld.directlyInstantiatedClasses); 152 ? [] : compiler.codegenWorld.directlyInstantiatedClasses),
153 _compiledConstants = new Set<ConstantValue>.identity()..addAll(
154 compiler == null
155 ? [] : compiler.backend.constants.compiledConstants);
ahe 2014/12/11 10:09:00 Conflict resolution.
146 156
147 /// When [true], updates must be applied (using [applyUpdates]) before the 157 /// When [true], updates must be applied (using [applyUpdates]) before the
148 /// [compiler]'s state correctly reflects the updated program. 158 /// [compiler]'s state correctly reflects the updated program.
149 bool get hasPendingUpdates => !updates.isEmpty; 159 bool get hasPendingUpdates => !updates.isEmpty;
150 160
151 bool get failed => !_failedUpdates.isEmpty; 161 bool get failed => !_failedUpdates.isEmpty;
152 162
153 /// Used as tear-off passed to [LibraryLoaderTask.resetAsync]. 163 /// Used as tear-off passed to [LibraryLoaderTask.resetAsync].
154 Future<bool> reuseLibrary(LibraryElement library) { 164 Future<bool> reuseLibrary(LibraryElement library) {
155 assert(compiler != null); 165 assert(compiler != null);
(...skipping 445 matching lines...) Expand 10 before | Expand all | Expand 10 after
601 611
602 List<jsAst.Statement> updates = <jsAst.Statement>[]; 612 List<jsAst.Statement> updates = <jsAst.Statement>[];
603 613
604 Set<ClassElementX> newClasses = new Set.from( 614 Set<ClassElementX> newClasses = new Set.from(
605 compiler.codegenWorld.directlyInstantiatedClasses); 615 compiler.codegenWorld.directlyInstantiatedClasses);
606 newClasses.removeAll(_directlyInstantiatedClasses); 616 newClasses.removeAll(_directlyInstantiatedClasses);
607 617
608 if (!newClasses.isEmpty) { 618 if (!newClasses.isEmpty) {
609 // Ask the emitter to compute "needs" (only) if new classes were 619 // Ask the emitter to compute "needs" (only) if new classes were
610 // instantiated. 620 // instantiated.
611 emitter.computeAllNeededEntities(); 621 _ensureNeedsComputed();
ahe 2014/12/11 10:09:00 Conflict resolution.
612 newClasses = new Set.from(emitter.neededClasses); 622 newClasses = new Set.from(emitter.neededClasses);
613 newClasses.removeAll(_emittedClasses); 623 newClasses.removeAll(_emittedClasses);
614 } else { 624 } else {
615 // Make sure that the set of emitted classes is preserved for subsequent 625 // Make sure that the set of emitted classes is preserved for subsequent
616 // updates. 626 // updates.
617 // TODO(ahe): This is a bit convoluted, find a better approach. 627 // TODO(ahe): This is a bit convoluted, find a better approach.
618 emitter.neededClasses 628 emitter.neededClasses
619 ..clear() 629 ..clear()
620 ..addAll(_emittedClasses); 630 ..addAll(_emittedClasses);
621 } 631 }
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
661 update.writeUpdateJsOn(updates); 671 update.writeUpdateJsOn(updates);
662 } 672 }
663 for (Element element in enqueuer.codegen.newlyEnqueuedElements) { 673 for (Element element in enqueuer.codegen.newlyEnqueuedElements) {
664 if (element.isField) { 674 if (element.isField) {
665 updates.addAll(computeFieldUpdateJs(element)); 675 updates.addAll(computeFieldUpdateJs(element));
666 } else { 676 } else {
667 updates.add(computeMethodUpdateJs(element)); 677 updates.add(computeMethodUpdateJs(element));
668 } 678 }
669 } 679 }
670 680
681 Set<ConstantValue> newConstants = new Set<ConstantValue>.identity()..addAll(
682 compiler.backend.constants.compiledConstants);
683 newConstants.removeAll(_compiledConstants);
684
685 if (!newConstants.isEmpty) {
686 _ensureNeedsComputed();
ahe 2014/12/11 10:09:00 Conflict resolution.
687 List<ConstantValue> constants =
688 emitter.outputConstantLists[compiler.deferredLoadTask.mainOutputUnit];
689 if (constants != null) {
690 for (ConstantValue constant in constants) {
691 if (newConstants.contains(constant)) {
692 jsAst.Statement constantInitializer = emitter.oldEmitter
693 .buildConstantInitializer(constant).toStatement();
694 updates.add(constantInitializer);
695 }
696 }
697 }
698 }
699
671 updates.add(js.statement(r''' 700 updates.add(js.statement(r'''
672 if (self.$dart_unsafe_eval.pendingStubs) { 701 if (self.$dart_unsafe_eval.pendingStubs) {
673 self.$dart_unsafe_eval.pendingStubs.map(function(e) { return e(); }); 702 self.$dart_unsafe_eval.pendingStubs.map(function(e) { return e(); });
674 self.$dart_unsafe_eval.pendingStubs = void 0; 703 self.$dart_unsafe_eval.pendingStubs = void 0;
675 } 704 }
676 ''')); 705 '''));
677 706
678 if (updates.length == 1) { 707 if (updates.length == 1) {
679 return prettyPrintJs(updates.single); 708 return prettyPrintJs(updates.single);
680 } else { 709 } else {
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
764 String callNameFor(FunctionElement element) { 793 String callNameFor(FunctionElement element) {
765 // TODO(ahe): Call a method in the compiler to obtain this name. 794 // TODO(ahe): Call a method in the compiler to obtain this name.
766 String callPrefix = namer.callPrefix; 795 String callPrefix = namer.callPrefix;
767 int parameterCount = element.functionSignature.parameterCount; 796 int parameterCount = element.functionSignature.parameterCount;
768 return '$callPrefix\$$parameterCount'; 797 return '$callPrefix\$$parameterCount';
769 } 798 }
770 799
771 List<String> computeFields(ClassElement cls) { 800 List<String> computeFields(ClassElement cls) {
772 return new EmitterHelper(compiler).computeFields(cls); 801 return new EmitterHelper(compiler).computeFields(cls);
773 } 802 }
803
804 void _ensureNeedsComputed() {
805 if (_hasComputedNeeds) return;
806 emitter.computeAllNeededEntities();
ahe 2014/12/11 10:09:00 Conflict resolution (computeAllNeededEntities was
807 _hasComputedNeeds = true;
808 }
774 } 809 }
775 810
776 /// Represents an update (aka patch) of [before] to [after]. We use the word 811 /// Represents an update (aka patch) of [before] to [after]. We use the word
777 /// "update" to avoid confusion with the compiler feature of "patch" methods. 812 /// "update" to avoid confusion with the compiler feature of "patch" methods.
778 abstract class Update { 813 abstract class Update {
779 final Compiler compiler; 814 final Compiler compiler;
780 815
781 PartialElement get before; 816 PartialElement get before;
782 817
783 PartialElement get after; 818 PartialElement get after;
(...skipping 451 matching lines...) Expand 10 before | Expand all | Expand 10 after
1235 List<String> computeFields(ClassElement cls) { 1270 List<String> computeFields(ClassElement cls) {
1236 // TODO(ahe): Rewrite for new emitter. 1271 // TODO(ahe): Rewrite for new emitter.
1237 ClassBuilder builder = new ClassBuilder(cls, namer); 1272 ClassBuilder builder = new ClassBuilder(cls, namer);
1238 classEmitter.emitFields(cls, builder); 1273 classEmitter.emitFields(cls, builder);
1239 return builder.fields; 1274 return builder.fields;
1240 } 1275 }
1241 } 1276 }
1242 1277
1243 // TODO(ahe): Remove this method. 1278 // TODO(ahe): Remove this method.
1244 NO_WARN(x) => x; 1279 NO_WARN(x) => x;
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698