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 642859c90849f567e60efefc587ea9bc81479547..b50f490e30180ebed4d14f04d35bd5f14e7031bd 100644 |
--- a/dart/pkg/dart2js_incremental/lib/library_updater.dart |
+++ b/dart/pkg/dart2js_incremental/lib/library_updater.dart |
@@ -72,6 +72,9 @@ import 'package:compiler/src/elements/modelx.dart' show |
FieldElementX, |
LibraryElementX; |
+import 'package:compiler/src/universe/universe.dart' show |
+ Selector; |
+ |
import 'diff.dart' show |
Difference, |
computeDifference; |
@@ -568,13 +571,48 @@ class LibraryUpdater extends JsFeatures { |
} |
compiler.processQueue(compiler.enqueuer.codegen, null); |
+ for (Element e in compiler.enqueuer.codegen.generatedCode.keys) { |
+ if (e.isFunction && e.functionSignature.hasOptionalParameters) { |
+ for (Selector selector in compiler.enqueuer.codegen.newlySeenSelectors) { |
Johnni Winther
2014/12/05 09:48:23
Long line.
ahe
2014/12/09 16:28:23
Done.
|
+ // TODO(ahe): Group selectors by name at this point for improved |
+ // performance. |
+ if (e.name == selector.name && |
+ selector.appliesUnnamed(e, compiler.world)) { |
Johnni Winther
2014/12/05 09:48:23
Isn't this the same as `applies`?
ahe
2014/12/09 16:28:23
Not exactly, but I had misunderstood the assertion
|
+ // TODO(ahe): Don't use |
+ // compiler.enqueuer.codegen.newlyEnqueuedElements directly like |
+ // this, make a copy. |
+ compiler.enqueuer.codegen.newlyEnqueuedElements.add(e); |
+ } |
+ if (selector.name == namer.closureInvocationSelectorName) { |
+ selector = new Selector.call( |
+ e.name, e.library, |
+ selector.argumentCount, selector.namedArguments); |
+ if (selector.appliesUnnamed(e, compiler.world)) { |
+ // TODO(ahe): Also make a copy here. |
+ compiler.enqueuer.codegen.newlyEnqueuedElements.add(e); |
+ } |
+ } |
+ } |
+ } |
+ } |
+ |
List<jsAst.Statement> updates = <jsAst.Statement>[]; |
- Set newClasses = new Set.from( |
+ // 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); |
+ |
List<jsAst.Statement> inherits = <jsAst.Statement>[]; |
for (ClassElementX cls in newClasses) { |
@@ -617,9 +655,20 @@ class LibraryUpdater extends JsFeatures { |
for (Element element in compiler.enqueuer.codegen.newlyEnqueuedElements) { |
if (!element.isField) { |
updates.add(computeMemberUpdateJs(element)); |
+ } else { |
+ if (backend.constants.lazyStatics.contains(element)) { |
+ throw new StateError("$element requires lazy initializer."); |
+ } |
} |
} |
+ updates.add(js.statement(r''' |
+if (self.$dart_unsafe_eval.pendingStubs) { |
+ self.$dart_unsafe_eval.pendingStubs.map(function(e) { return e(); }); |
+ self.$dart_unsafe_eval.pendingStubs = void 0; |
+} |
+''')); |
+ |
if (updates.length == 1) { |
return prettyPrintJs(updates.single); |
} else { |