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

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

Issue 764023002: Incremental compilation of new lazy statics. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge
Patch Set: Address comments and also test for needsDefineClass to see if defineClass is needed. 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 2331ffbfb2554dd4b895202ba22ba54f877a5ed7..b585642e91a49c2cc435e803fd5f16defa0a3f78 100644
--- a/dart/pkg/dart2js_incremental/lib/library_updater.dart
+++ b/dart/pkg/dart2js_incremental/lib/library_updater.dart
@@ -301,17 +301,10 @@ class LibraryUpdater extends JsFeatures {
void addField(FieldElementX element, ScopeContainerElement container) {
invalidateScopesAffectedBy(element, container);
- if (!element.isInstanceMember) {
- cannotReuse(element, "Not an instance field.");
- } else {
- addInstanceField(element, container);
+ if (element.isInstanceMember) {
+ _classesWithSchemaChanges.add(container);
}
- }
-
- void addInstanceField(FieldElementX element, ClassElementX cls) {
- _classesWithSchemaChanges.add(cls);
-
- updates.add(new AddedFieldUpdate(compiler, element, cls));
+ updates.add(new AddedFieldUpdate(compiler, element, container));
}
bool canReuseRemovedElement(
@@ -659,12 +652,10 @@ class LibraryUpdater extends JsFeatures {
update.writeUpdateJsOn(updates);
}
for (Element element in enqueuer.codegen.newlyEnqueuedElements) {
- if (!element.isField) {
- updates.add(computeMemberUpdateJs(element));
+ if (element.isField) {
+ updates.addAll(computeFieldUpdateJs(element));
} else {
- if (backend.constants.lazyStatics.contains(element)) {
- throw new StateError("$element requires lazy initializer.");
- }
+ updates.add(computeMethodUpdateJs(element));
}
}
@@ -695,7 +686,7 @@ if (self.$dart_unsafe_eval.pendingStubs) {
js.string(name), descriptor]);
}
- jsAst.Node computeMemberUpdateJs(Element element) {
+ jsAst.Node computeMethodUpdateJs(Element element) {
MemberInfo info = containerBuilder.analyzeMemberMethod(element);
if (info == null) {
compiler.internalError(element, '${element.runtimeType}');
@@ -728,6 +719,33 @@ if (self.$dart_unsafe_eval.pendingStubs) {
new jsAst.LiteralBool(isStatic), globalFunctionsAccess]);
}
+ List<jsAst.Statement> computeFieldUpdateJs(FieldElementX element) {
+ if (element.isInstanceMember) {
+ // Any initializers are inlined in factory methods, and the field is
+ // declared by adding its class to [_classesWithSchemaChanges].
+ return const <jsAst.Statement>[];
+ }
+ // A static (or top-level) field.
+ if (backend.constants.lazyStatics.contains(element)) {
+ jsAst.Expression init =
+ emitter.oldEmitter.buildLazilyInitializedStaticField(
+ element, namer.currentIsolate);
+ if (init == null) {
+ throw new StateError("Initializer optimized away for $element");
+ }
+ return <jsAst.Statement>[init.toStatement()];
+ } else {
+ // TODO(ahe): When a field is referenced it is enqueued. If the field has
+ // no initializer, it will not have any associated code, so it will
+ // appear as if it was newly enqueued.
+ if (element.initializer == null) {
+ return const <jsAst.Statement>[];
+ } else {
+ throw new StateError("Don't know how to compile $element");
+ }
+ }
+ }
+
String prettyPrintJs(jsAst.Node node) {
jsAst.Printer printer = new jsAst.Printer(compiler, null);
printer.blockOutWithoutBraces(node);
@@ -1062,7 +1080,12 @@ class AddedFieldUpdate extends Update with JsFeatures {
PartialFieldList get after => element.declarationSite;
FieldElementX apply() {
- FieldElementX copy = element.copyWithEnclosing(container);
+ Element enclosing = container;
+ if (enclosing.isLibrary) {
+ // TODO(ahe): Reuse compilation unit of element instead?
+ enclosing = enclosing.compilationUnit;
+ }
+ FieldElementX copy = element.copyWithEnclosing(enclosing);
NO_WARN(container).addMember(copy, compiler);
return copy;
}
« no previous file with comments | « dart/pkg/dart2js_incremental/lib/caching_compiler.dart ('k') | dart/tests/try/web/incremental_compilation_update_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698