File tree 3 files changed +38
-15
lines changed
3 files changed +38
-15
lines changed Original file line number Diff line number Diff line change @@ -26,7 +26,6 @@ import '../js_backend/inferred_data.dart';
26
26
import '../js_backend/native_data.dart' ;
27
27
import '../kernel/kernel_strategy.dart' ;
28
28
import '../native/behavior.dart' ;
29
- import '../options.dart' ;
30
29
import '../ssa/builder_kernel.dart' ;
31
30
import '../ssa/nodes.dart' ;
32
31
import '../ssa/ssa.dart' ;
@@ -138,21 +137,9 @@ class KernelCodegenWorkItemBuilder implements WorkItemBuilder {
138
137
KernelCodegenWorkItemBuilder (
139
138
this ._backend, this ._closedWorld, this ._globalInferenceResults);
140
139
141
- CompilerOptions get _options => _backend.compiler.options;
142
-
143
140
@override
144
141
CodegenWorkItem createWorkItem (MemberEntity entity) {
145
142
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
-
156
143
return new KernelCodegenWorkItem (
157
144
_backend, _closedWorld, _globalInferenceResults, entity);
158
145
}
Original file line number Diff line number Diff line change @@ -238,6 +238,15 @@ class KernelSsaGraphBuilder extends ir.Visitor
238
238
// eager and non-final fields.
239
239
backend.constants.registerLazyStatic (targetElement);
240
240
}
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
+ }
241
250
}
242
251
buildField (target);
243
252
} else if (target is ir.FunctionExpression ) {
@@ -262,8 +271,8 @@ class KernelSsaGraphBuilder extends ir.Visitor
262
271
buildConstructorBody (constructor);
263
272
break ;
264
273
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 ;
267
276
case MemberKind .signature:
268
277
ir.Node target = definition.node;
269
278
ir.FunctionNode originalClosureNode;
Original file line number Diff line number Diff line change
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
+ }
You can’t perform that action at this time.
0 commit comments