[dart2js] Fix for issue 33572
Change-Id: If33e59880c882885b4368a8be91663298deb207c
Reviewed-on: https://dart-review.googlesource.com/61965
Commit-Queue: Stephen Adams <sra@google.com>
Reviewed-by: Sigmund Cherem <sigmund@google.com>
diff --git a/pkg/compiler/lib/src/js_backend/constant_emitter.dart b/pkg/compiler/lib/src/js_backend/constant_emitter.dart
index 7069820..0ce6141 100644
--- a/pkg/compiler/lib/src/js_backend/constant_emitter.dart
+++ b/pkg/compiler/lib/src/js_backend/constant_emitter.dart
@@ -13,6 +13,7 @@
import '../js_emitter/code_emitter_task.dart';
import '../options.dart';
import '../universe/world_builder.dart';
+import 'allocator_analysis.dart' show JAllocatorAnalysis;
import 'constant_system_javascript.dart';
import 'js_backend.dart';
import 'namer.dart';
@@ -40,6 +41,7 @@
final CodegenWorldBuilder _worldBuilder;
final RuntimeTypesNeed _rtiNeed;
final RuntimeTypesEncoder _rtiEncoder;
+ final JAllocatorAnalysis _allocatorAnalysis;
final Namer _namer;
final CodeEmitterTask _task;
final _ConstantReferenceGenerator constantReferenceGenerator;
@@ -56,6 +58,7 @@
this._worldBuilder,
this._rtiNeed,
this._rtiEncoder,
+ this._allocatorAnalysis,
this._namer,
this._task,
this.constantReferenceGenerator,
@@ -325,7 +328,9 @@
_emitter.constructorAccess(constant.type.element);
List<jsAst.Expression> fields = <jsAst.Expression>[];
_worldBuilder.forEachInstanceField(element, (_, FieldEntity field) {
- fields.add(constantReferenceGenerator(constant.fields[field]));
+ if (!_allocatorAnalysis.isInitializedInAllocator(field)) {
+ fields.add(constantReferenceGenerator(constant.fields[field]));
+ }
});
if (_rtiNeed.classNeedsTypeArguments(constant.type.element)) {
fields.add(_reifiedTypeArguments(constant, constant.type.typeArguments));
diff --git a/pkg/compiler/lib/src/js_emitter/full_emitter/emitter.dart b/pkg/compiler/lib/src/js_emitter/full_emitter/emitter.dart
index 407b49e..19692ba 100644
--- a/pkg/compiler/lib/src/js_emitter/full_emitter/emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/full_emitter/emitter.dart
@@ -166,6 +166,7 @@
compiler.codegenWorldBuilder,
_closedWorld.rtiNeed,
compiler.backend.rtiEncoder,
+ _closedWorld.allocatorAnalysis,
namer,
task,
this.constantReference,
diff --git a/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart b/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart
index edda727..46bce90 100644
--- a/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart
@@ -83,6 +83,7 @@
compiler.codegenWorldBuilder,
_closedWorld.rtiNeed,
compiler.backend.rtiEncoder,
+ _closedWorld.allocatorAnalysis,
namer,
task,
this.generateConstantReference,
diff --git a/tests/compiler/dart2js_extra/33572_test.dart b/tests/compiler/dart2js_extra/33572_test.dart
new file mode 100644
index 0000000..b8d475f
--- /dev/null
+++ b/tests/compiler/dart2js_extra/33572_test.dart
@@ -0,0 +1,27 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Regression test for issue 32853.
+
+import "package:expect/expect.dart";
+import "package:meta/dart2js.dart" show noInline;
+
+class A {
+ final x = null;
+ final y;
+ const A(this.y);
+}
+
+main() {
+ var a1 = new A(1);
+ var a2 = const A(2);
+ test(a1, null, 1);
+ test(a2, null, 2);
+}
+
+@noInline
+test(a, expectedX, expectedY) {
+ Expect.equals(expectedX, a.x);
+ Expect.equals(expectedY, a.y);
+}