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

Unified Diff: dart/pkg/dart2js_incremental/lib/library_updater.dart

Issue 768993003: Track emitted classes in incremental compiler. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge
Patch Set: Merged with r42279. 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 side-by-side diff with in-line comments
Download patch
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 3ac1e7e8a83eddd2fb34e3ac523f34ac5713baa6..f6a19dc5afb7bc26f7efdc90937e8dffb8124a4b 100644
--- a/dart/pkg/dart2js_incremental/lib/library_updater.dart
+++ b/dart/pkg/dart2js_incremental/lib/library_updater.dart
@@ -126,18 +126,23 @@ class LibraryUpdater extends JsFeatures {
final Set<ClassElementX> _classesWithSchemaChanges =
new Set<ClassElementX>();
- final Set<ClassElementX> _existingClasses = new Set();
+ final Set<ClassElementX> _emittedClasses;
+
+ final Set<ClassElementX> _directlyInstantiatedClasses;
LibraryUpdater(
- this.compiler,
+ Compiler compiler,
this.inputProvider,
this.uri,
this.logTime,
- this.logVerbose) {
- if (compiler != null) {
- _existingClasses.addAll(emitter.neededClasses);
- }
- }
+ this.logVerbose)
+ : this.compiler = compiler,
+ _emittedClasses = new Set.from(
+ compiler == null
+ ? [] : compiler.backend.emitter.neededClasses),
+ _directlyInstantiatedClasses = new Set.from(
+ compiler == null
+ ? [] : compiler.codegenWorld.directlyInstantiatedClasses);
ahe 2014/12/11 09:40:15 Conflict resolution.
/// When [true], updates must be applied (using [applyUpdates]) before the
/// [compiler]'s state correctly reflects the updated program.
@@ -596,20 +601,24 @@ class LibraryUpdater extends JsFeatures {
List<jsAst.Statement> updates = <jsAst.Statement>[];
- // TODO(ahe): allInstantiatedClasses seem to include interfaces that aren't
- // needed.
Set<ClassElementX> newClasses = new Set.from(
- compiler.codegenWorld.allInstantiatedClasses.where(
- emitter.computeClassFilter()));
- newClasses.removeAll(_existingClasses);
-
- // TODO(ahe): When more than one updated is computed, we need to make sure
- // that existing classes aren't overwritten. No test except the one test
- // that tests more than one update is affected by this problem, and only
- // because main is closurized because we always enable tear-off. Is that
- // really necessary? Also, add a test which tests directly that what
- // happens when tear-off is introduced in second update.
- emitter.neededClasses.addAll(newClasses);
+ compiler.codegenWorld.directlyInstantiatedClasses);
+ newClasses.removeAll(_directlyInstantiatedClasses);
+
+ if (!newClasses.isEmpty) {
+ // Ask the emitter to compute "needs" (only) if new classes were
+ // instantiated.
+ emitter.computeAllNeededEntities();
+ newClasses = new Set.from(emitter.neededClasses);
+ newClasses.removeAll(_emittedClasses);
+ } else {
+ // Make sure that the set of emitted classes is preserved for subsequent
+ // updates.
+ // TODO(ahe): This is a bit convoluted, find a better approach.
+ emitter.neededClasses
+ ..clear()
+ ..addAll(_emittedClasses);
+ }
List<jsAst.Statement> inherits = <jsAst.Statement>[];

Powered by Google App Engine
This is Rietveld 408576698