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

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

Issue 736893003: Refactor superclass change. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge
Patch Set: Merged with r41891 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
« no previous file with comments | « dart/pkg/compiler/lib/src/js_emitter/old_emitter/emitter.dart ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 c6c790387f1e938cbacdbb59bf66eb0c2e226182..a480c692b9d63046e228a0570907ef3d111c40d2 100644
--- a/dart/pkg/dart2js_incremental/lib/library_updater.dart
+++ b/dart/pkg/dart2js_incremental/lib/library_updater.dart
@@ -481,20 +481,9 @@ class LibraryUpdater extends JsFeatures {
jsAst.Node classAccess = namer.elementAccess(cls);
String name = namer.getNameOfClass(cls);
- 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);
+ updates.add(
+ js.statement(
+ r'# = #', [classAccess, invokeDefineClass(cls)]));
ClassElement superclass = cls.superclass;
if (superclass != null) {
@@ -506,22 +495,20 @@ class LibraryUpdater extends JsFeatures {
}
}
+ // Call inheritFrom after all classes have been created. This way we don't
+ // need to sort the classes by having superclasses defined before their
+ // subclasses.
updates.addAll(inherits);
for (ClassElementX cls in changedClasses) {
ClassElement superclass = cls.superclass;
- if (superclass != null) {
- jsAst.Node classAccess = namer.elementAccess(cls);
- jsAst.Node superAccess = namer.elementAccess(superclass);
- updates.add(
- js.statement(
- r'#.prototype.__proto__ = #.prototype',
- [classAccess, superAccess]));
- updates.add(
- js.statement(
- r'#.prototype.constructor = #',
- [classAccess, classAccess]));
- }
+ jsAst.Node superAccess =
+ superclass == null ? js('null') : namer.elementAccess(superclass);
+ jsAst.Node classAccess = namer.elementAccess(cls);
+ updates.add(
+ js.statement(
+ r'# = self.$dart_unsafe_eval.schemaChange(#, #, #)',
+ [classAccess, invokeDefineClass(cls), classAccess, superAccess]));
}
for (RemovedFunctionUpdate update in removals) {
@@ -540,6 +527,19 @@ class LibraryUpdater extends JsFeatures {
}
}
+ jsAst.Expression invokeDefineClass(ClassElementX cls) {
+ String name = namer.getNameOfClass(cls);
+ var descriptor = js('Object.create(null)');
+ return js(
+ r'''
+(new Function(
+ "$collectedClasses", "$desc",
+ self.$dart_unsafe_eval.defineClass(#, #) +"\n;return " + #))({#: #})''',
+ [js.string(name), js.stringArray(computeFields(cls)),
+ js.string(name),
+ js.string(name), descriptor]);
+ }
+
jsAst.Node computeMemberUpdateJs(Element element) {
MemberInfo info = emitter.oldEmitter.containerBuilder
.analyzeMemberMethod(element);
« no previous file with comments | « dart/pkg/compiler/lib/src/js_emitter/old_emitter/emitter.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698