Chromium Code Reviews| Index: dart/pkg/dart2js_incremental/lib/library_updater.dart | 
| diff --git a/dart/pkg/dart2js_incremental/lib/library_updater.dart b/dart/pkg/dart2js_incremental/lib/library_updater.dart | 
| index f6a19dc5afb7bc26f7efdc90937e8dffb8124a4b..18321507666bf52c6506c0e88653ff0b6fdda21a 100644 | 
| --- a/dart/pkg/dart2js_incremental/lib/library_updater.dart | 
| +++ b/dart/pkg/dart2js_incremental/lib/library_updater.dart | 
| @@ -76,6 +76,9 @@ import 'package:compiler/src/elements/modelx.dart' show | 
| import 'package:compiler/src/universe/universe.dart' show | 
| Selector; | 
| +import 'package:compiler/src/constants/values.dart' show | 
| + ConstantValue; | 
| + | 
| import 'diff.dart' show | 
| Difference, | 
| computeDifference; | 
| @@ -130,6 +133,10 @@ class LibraryUpdater extends JsFeatures { | 
| final Set<ClassElementX> _directlyInstantiatedClasses; | 
| + final Set<ConstantValue> _compiledConstants; | 
| + | 
| + bool _hasComputedNeeds = false; | 
| + | 
| LibraryUpdater( | 
| Compiler compiler, | 
| this.inputProvider, | 
| @@ -142,7 +149,10 @@ class LibraryUpdater extends JsFeatures { | 
| ? [] : compiler.backend.emitter.neededClasses), | 
| _directlyInstantiatedClasses = new Set.from( | 
| compiler == null | 
| - ? [] : compiler.codegenWorld.directlyInstantiatedClasses); | 
| + ? [] : compiler.codegenWorld.directlyInstantiatedClasses), | 
| + _compiledConstants = new Set<ConstantValue>.identity()..addAll( | 
| + compiler == null | 
| + ? [] : compiler.backend.constants.compiledConstants); | 
| 
 
ahe
2014/12/11 10:09:00
Conflict resolution.
 
 | 
| /// When [true], updates must be applied (using [applyUpdates]) before the | 
| /// [compiler]'s state correctly reflects the updated program. | 
| @@ -608,7 +618,7 @@ class LibraryUpdater extends JsFeatures { | 
| if (!newClasses.isEmpty) { | 
| // Ask the emitter to compute "needs" (only) if new classes were | 
| // instantiated. | 
| - emitter.computeAllNeededEntities(); | 
| + _ensureNeedsComputed(); | 
| 
 
ahe
2014/12/11 10:09:00
Conflict resolution.
 
 | 
| newClasses = new Set.from(emitter.neededClasses); | 
| newClasses.removeAll(_emittedClasses); | 
| } else { | 
| @@ -668,6 +678,25 @@ class LibraryUpdater extends JsFeatures { | 
| } | 
| } | 
| + Set<ConstantValue> newConstants = new Set<ConstantValue>.identity()..addAll( | 
| + compiler.backend.constants.compiledConstants); | 
| + newConstants.removeAll(_compiledConstants); | 
| + | 
| + if (!newConstants.isEmpty) { | 
| + _ensureNeedsComputed(); | 
| 
 
ahe
2014/12/11 10:09:00
Conflict resolution.
 
 | 
| + List<ConstantValue> constants = | 
| + emitter.outputConstantLists[compiler.deferredLoadTask.mainOutputUnit]; | 
| + if (constants != null) { | 
| + for (ConstantValue constant in constants) { | 
| + if (newConstants.contains(constant)) { | 
| + jsAst.Statement constantInitializer = emitter.oldEmitter | 
| + .buildConstantInitializer(constant).toStatement(); | 
| + updates.add(constantInitializer); | 
| + } | 
| + } | 
| + } | 
| + } | 
| + | 
| updates.add(js.statement(r''' | 
| if (self.$dart_unsafe_eval.pendingStubs) { | 
| self.$dart_unsafe_eval.pendingStubs.map(function(e) { return e(); }); | 
| @@ -771,6 +800,12 @@ if (self.$dart_unsafe_eval.pendingStubs) { | 
| List<String> computeFields(ClassElement cls) { | 
| return new EmitterHelper(compiler).computeFields(cls); | 
| } | 
| + | 
| + void _ensureNeedsComputed() { | 
| + if (_hasComputedNeeds) return; | 
| + emitter.computeAllNeededEntities(); | 
| 
 
ahe
2014/12/11 10:09:00
Conflict resolution (computeAllNeededEntities was
 
 | 
| + _hasComputedNeeds = true; | 
| + } | 
| } | 
| /// Represents an update (aka patch) of [before] to [after]. We use the word |