Index: pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart |
diff --git a/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart b/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart |
index 12245c7003099b09a48977e6ad5879d0eca5d63f..222b1c6293fa443506a3f82cc851627a9864d6fd 100644 |
--- a/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart |
+++ b/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart |
@@ -629,19 +629,29 @@ class FragmentEmitter { |
/// |
/// The constructor is statically built. |
js.Expression emitConstructor(Class cls) { |
- List<js.Name> fieldNames = const <js.Name>[]; |
- |
+ js.Name name = cls.name; |
// If the class is not directly instantiated we only need it for inheritance |
// or RTI. In either case we don't need its fields. |
- if (cls.isDirectlyInstantiated && !cls.isNative) { |
- fieldNames = cls.fields.map((Field field) => field.name).toList(); |
+ if (cls.isNative || !cls.isDirectlyInstantiated) { |
+ return js.js('function #() { }', name); |
+ } |
+ |
+ List<js.Name> fieldNames = |
+ cls.fields.map((Field field) => field.name).toList(); |
+ if (cls.hasRtiField) { |
+ fieldNames.add(namer.rtiFieldName); |
} |
- js.Name name = cls.name; |
Iterable<js.Name> assignments = fieldNames.map((js.Name field) { |
return js.js("this.#field = #field", {"field": field}); |
}); |
+ // TODO(sra): Cache 'this' in a one-character local for 4 or more uses of |
+ // 'this'. i.e. "var _=this;_.a=a;_.b=b;..." |
+ |
+ // TODO(sra): Separate field and field initializer parameter names so the |
+ // latter may be fully minified. |
+ |
return js.js('function #(#) { # }', [name, fieldNames, assignments]); |
} |