Skip to content

Commit 231c5c1

Browse files
johnniwinthercommit-bot@chromium.org
authored andcommitted
Create codegen work item for all members
Ensures that constants of effectively constant instance fields are registered also with --omit-implicit-checks. Change-Id: Icc31799f1cc5f565321c832780f30c711e9c8c50 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/96160 Reviewed-by: Sigmund Cherem <[email protected]> Commit-Queue: Sigmund Cherem <[email protected]>
1 parent 0b40a46 commit 231c5c1

File tree

3 files changed

+38
-15
lines changed

3 files changed

+38
-15
lines changed

pkg/compiler/lib/src/js_model/js_strategy.dart

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ import '../js_backend/inferred_data.dart';
2626
import '../js_backend/native_data.dart';
2727
import '../kernel/kernel_strategy.dart';
2828
import '../native/behavior.dart';
29-
import '../options.dart';
3029
import '../ssa/builder_kernel.dart';
3130
import '../ssa/nodes.dart';
3231
import '../ssa/ssa.dart';
@@ -138,21 +137,9 @@ class KernelCodegenWorkItemBuilder implements WorkItemBuilder {
138137
KernelCodegenWorkItemBuilder(
139138
this._backend, this._closedWorld, this._globalInferenceResults);
140139

141-
CompilerOptions get _options => _backend.compiler.options;
142-
143140
@override
144141
CodegenWorkItem createWorkItem(MemberEntity entity) {
145142
if (entity.isAbstract) return null;
146-
147-
// Codegen inlines field initializers. It only needs to generate
148-
// code for checked setters.
149-
if (entity.isField && entity.isInstanceMember) {
150-
if (!_options.parameterCheckPolicy.isEmitted ||
151-
entity.enclosingClass.isClosure) {
152-
return null;
153-
}
154-
}
155-
156143
return new KernelCodegenWorkItem(
157144
_backend, _closedWorld, _globalInferenceResults, entity);
158145
}

pkg/compiler/lib/src/ssa/builder_kernel.dart

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,15 @@ class KernelSsaGraphBuilder extends ir.Visitor
238238
// eager and non-final fields.
239239
backend.constants.registerLazyStatic(targetElement);
240240
}
241+
} else {
242+
assert(targetElement.isInstanceMember);
243+
if (_fieldAnalysis
244+
.getFieldData(targetElement)
245+
.isEffectivelyFinal ||
246+
!options.parameterCheckPolicy.isEmitted) {
247+
// No need for a checked setter.
248+
return null;
249+
}
241250
}
242251
buildField(target);
243252
} else if (target is ir.FunctionExpression) {
@@ -262,8 +271,8 @@ class KernelSsaGraphBuilder extends ir.Visitor
262271
buildConstructorBody(constructor);
263272
break;
264273
case MemberKind.closureField:
265-
failedAt(targetElement, "Unexpected closure field: $targetElement");
266-
break;
274+
// Closure fields have no setter and therefore never require any code.
275+
return null;
267276
case MemberKind.signature:
268277
ir.Node target = definition.node;
269278
ir.FunctionNode originalClosureNode;
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
2+
// for details. All rights reserved. Use of this source code is governed by a
3+
// BSD-style license that can be found in the LICENSE file.
4+
5+
// dart2jsOptions=--omit-implicit-checks
6+
7+
import 'package:expect/expect.dart';
8+
9+
class C {
10+
const C();
11+
}
12+
13+
class A {
14+
var field = const C();
15+
}
16+
17+
class B {
18+
var field;
19+
}
20+
21+
@pragma('dart2js:noInline')
22+
test(o) => o.field;
23+
24+
main() {
25+
Expect.isNotNull(test(new A()));
26+
Expect.isNull(test(new B()));
27+
}

0 commit comments

Comments
 (0)