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

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

Issue 720813002: Incremental compilation of new classes with fields. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge
Patch Set: Merged with r41823. Created 6 years, 1 month 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 7a8bbe893a367623c4e3f1ada527b87396413855..11df1333c0b9503930eadf8d2672c2bdbaa6cd72 100644
--- a/dart/pkg/dart2js_incremental/lib/library_updater.dart
+++ b/dart/pkg/dart2js_incremental/lib/library_updater.dart
@@ -44,8 +44,11 @@ import 'package:compiler/src/js/js.dart' show
import 'package:compiler/src/js/js.dart' as jsAst;
import 'package:compiler/src/js_emitter/js_emitter.dart' show
+ ClassBuilder,
+ ClassEmitter,
CodeEmitterTask,
- MemberInfo;
+ MemberInfo,
+ computeMixinClass;
import 'package:_internal/compiler/js_lib/shared/embedded_names.dart'
as embeddedNames;
@@ -410,32 +413,39 @@ class LibraryUpdater extends JsFeatures {
new Set.from(compiler.codegenWorld.directlyInstantiatedClasses);
newClasses.removeAll(existingClasses);
- for (ClassElementX cls in newClasses) {
- jsAst.Node access = namer.elementAccess(cls);
- String name = namer.getNameOfClass(cls);
-
- // TODO(ahe): Compute arguments.
- List<jsAst.Node> arguments = <jsAst.Node>[];
-
- // TODO(ahe): Compute statements, that is initializers.
- List<jsAst.Statement> statements = <jsAst.Statement>[];
-
- updates.add(
- js.statement(
- '# = function $name(#) {#}', [access, arguments, statements]));
- }
+ List<jsAst.Statement> inherits = <jsAst.Statement>[];
for (ClassElementX cls in newClasses) {
- if (cls.isObject) continue;
jsAst.Node classAccess = namer.elementAccess(cls);
- jsAst.Node superAccess = namer.elementAccess(cls.superclass);
+ String name = namer.getNameOfClass(cls);
- updates.add(
- js.statement(
- r'self.$dart_unsafe_eval.inheritFrom(#, #)',
- [classAccess, superAccess]));
+ var descriptor = js('Object.create(null)');
+
+ jsAst.Statement defineClass = js.statement(
+ r'''
+# = (new Function(
+ "$collectedClasses", "$desc",
+ self.$dart_unsafe_eval.defineClass(#, #) +"\n;return " + #))({#: #})
+''',
+ [classAccess,
+ js.string(name), js.stringArray(computeFields(cls)),
+ js.string(name),
+ js.string(name), descriptor]);
+
+ updates.add(defineClass);
+
+ ClassElement superclass = cls.superclass;
+ if (superclass != null) {
+ jsAst.Node superAccess = namer.elementAccess(superclass);
+ inherits.add(
+ js.statement(
+ r'self.$dart_unsafe_eval.inheritFrom(#, #)',
+ [classAccess, superAccess]));
+ }
}
+ updates.addAll(inherits);
+
for (Element element in compiler.enqueuer.codegen.newlyEnqueuedElements) {
if (!element.isField) {
updates.add(computeMemberUpdateJs(element));
@@ -506,6 +516,10 @@ class LibraryUpdater extends JsFeatures {
int parameterCount = element.functionSignature.parameterCount;
return '$callPrefix\$$parameterCount';
}
+
+ List<String> computeFields(ClassElement cls) {
+ return new EmitterHelper(compiler).computeFields(cls);
+ }
}
/// Represents an update (aka patch) of [before] to [after]. We use the word
@@ -754,3 +768,18 @@ abstract class JsFeatures {
CodeEmitterTask get emitter => backend.emitter;
}
+
+class EmitterHelper extends JsFeatures {
+ final Compiler compiler;
+
+ EmitterHelper(this.compiler);
+
+ ClassEmitter get classEmitter => backend.emitter.oldEmitter.classEmitter;
+
+ List<String> computeFields(ClassElement cls) {
+ // TODO(ahe): Rewrite for new emitter.
+ ClassBuilder builder = new ClassBuilder(cls, namer);
+ classEmitter.emitFields(cls, builder, "");
+ return builder.fields;
+ }
+}
« 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