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

Unified Diff: pkg/compiler/lib/src/js_emitter/program_builder.dart

Issue 752553004: dart2js: Support mixins in the new emitter. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Fix typo. 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: pkg/compiler/lib/src/js_emitter/program_builder.dart
diff --git a/pkg/compiler/lib/src/js_emitter/program_builder.dart b/pkg/compiler/lib/src/js_emitter/program_builder.dart
index a348f4014be5eec23efa69018853ac7e64e6b8d0..88d17741cb9d4fa520a6641ec788cab5e341388f 100644
--- a/pkg/compiler/lib/src/js_emitter/program_builder.dart
+++ b/pkg/compiler/lib/src/js_emitter/program_builder.dart
@@ -4,7 +4,9 @@
library dart2js.js_emitter.program_builder;
+import 'js_emitter.dart' show computeMixinClass;
import 'model.dart';
+
import '../common.dart';
import '../js/js.dart' as js;
@@ -78,6 +80,10 @@ class ProgramBuilder {
if (element.superclass != null) {
c.setSuperclass(_classes[element.superclass]);
}
+ if (element.isMixinApplication) {
+ MixinApplication mixinApplication = c;
+ mixinApplication.setMixinClass(_classes[computeMixinClass(element)]);
+ }
});
_markEagerClasses();
@@ -238,9 +244,6 @@ class ProgramBuilder {
}
Class _buildClass(ClassElement element) {
- bool isInstantiated =
- _compiler.codegenWorld.directlyInstantiatedClasses.contains(element);
-
List<Method> methods = [];
List<InstanceField> fields = [];
@@ -258,7 +261,10 @@ class ProgramBuilder {
}
ClassElement implementation = element.implementation;
- if (isInstantiated) {
+
+ // MixinApplications run through the members of their mixin. Here, we are
+ // only interested in direct members.
+ if (!element.isMixinApplication) {
sigurdm 2014/11/27 09:25:54 What about elements that are not instantiated for
floitsch 2014/11/27 12:35:16 The only ones that I can think of are onlyForRti a
implementation.forEachMember(visitMember, includeBackendMembers: true);
}
String name = namer.getNameOfClass(element);
@@ -266,8 +272,21 @@ class ProgramBuilder {
Holder holder = _registry.registerHolder(holderName);
bool onlyForRti =
_task.typeTestEmitter.rtiNeededClasses.contains(element);
- Class result = new Class(name, holder, methods, fields,
- onlyForRti: onlyForRti);
+ bool isInstantiated =
+ _compiler.codegenWorld.directlyInstantiatedClasses.contains(element);
+
+ Class result;
+ if (element.isMixinApplication) {
+ assert(methods.isEmpty);
+ assert(fields.isEmpty);
+ result = new MixinApplication(name, holder,
+ isDirectlyInstantiated: isInstantiated,
+ onlyForRti: onlyForRti);
+ } else {
+ result = new Class(name, holder, methods, fields,
+ isDirectlyInstantiated: isInstantiated,
+ onlyForRti: onlyForRti);
+ }
_classes[element] = result;
return result;
}

Powered by Google App Engine
This is Rietveld 408576698