13d2937f76
The initial release assert was added when removing assembler intrinsics for implicit getters and replacing them with graph intrinsics in: https://dart-review.googlesource.com/c/sdk/+/155900 Normally if the return value of a implicit field getter is unboxed, the field itself must be unboxable. That is true, though just because we can unbox a field doesn't mean we always will: The unboxing field bitmap - which e.g. the GC uses - only allows 64-bits. Classes with more fields might have some fields boxed even though they could theoretically be unboxed. Closes https://github.com/flutter/flutter/issues/67803 Change-Id: I39717d356e293ed85becd64c8a664465d2abd31d Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/168100 Commit-Queue: Martin Kustermann <kustermann@google.com> Reviewed-by: Alexander Markov <alexmarkov@google.com>
373 lines
5.8 KiB
Dart
373 lines
5.8 KiB
Dart
// Copyright (c) 2020, 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.
|
|
|
|
import 'package:expect/expect.dart';
|
|
|
|
final bool kTrue = int.parse('1') == 1;
|
|
|
|
main() {
|
|
// Ensure fields are not inferred to be constants and ensure we use all fields
|
|
// (to avoid them being tree shaken).
|
|
final useAllFields = (kTrue ? foo : foo2).toString();
|
|
for (int i = 0; i <= 64; ++i) {
|
|
Expect.isTrue(useAllFields.contains('$i'));
|
|
}
|
|
|
|
// Ensure calling dyn:get:field64 returns the right value.
|
|
Expect.equals(64, ((kTrue ? foo : Baz(10)) as dynamic).field64);
|
|
|
|
// Ensure calling get:field64 returns the right value.
|
|
Expect.equals(64, (kTrue ? foo : Bar(10)).field64);
|
|
|
|
// Ensure potentially inlined, direct field load yield right value.
|
|
Expect.equals(64, (kTrue ? foo : foo2).field64);
|
|
}
|
|
|
|
final foo = Foo(
|
|
0,
|
|
1,
|
|
2,
|
|
3,
|
|
4,
|
|
5,
|
|
6,
|
|
7,
|
|
8,
|
|
9,
|
|
10,
|
|
11,
|
|
12,
|
|
13,
|
|
14,
|
|
15,
|
|
16,
|
|
17,
|
|
18,
|
|
19,
|
|
20,
|
|
21,
|
|
22,
|
|
23,
|
|
24,
|
|
25,
|
|
26,
|
|
27,
|
|
28,
|
|
29,
|
|
30,
|
|
31,
|
|
32,
|
|
33,
|
|
34,
|
|
35,
|
|
36,
|
|
37,
|
|
38,
|
|
39,
|
|
40,
|
|
41,
|
|
42,
|
|
43,
|
|
44,
|
|
45,
|
|
46,
|
|
47,
|
|
48,
|
|
49,
|
|
50,
|
|
51,
|
|
52,
|
|
53,
|
|
54,
|
|
55,
|
|
56,
|
|
57,
|
|
58,
|
|
59,
|
|
60,
|
|
61,
|
|
62,
|
|
63,
|
|
64);
|
|
|
|
final foo2 = Foo(
|
|
2 * 0,
|
|
2 * 1,
|
|
2 * 2,
|
|
2 * 3,
|
|
2 * 4,
|
|
2 * 5,
|
|
2 * 6,
|
|
2 * 7,
|
|
2 * 8,
|
|
2 * 9,
|
|
2 * 10,
|
|
2 * 11,
|
|
2 * 12,
|
|
2 * 13,
|
|
2 * 14,
|
|
2 * 15,
|
|
2 * 16,
|
|
2 * 17,
|
|
2 * 18,
|
|
2 * 19,
|
|
2 * 20,
|
|
2 * 21,
|
|
2 * 22,
|
|
2 * 23,
|
|
2 * 24,
|
|
2 * 25,
|
|
2 * 26,
|
|
2 * 27,
|
|
2 * 28,
|
|
2 * 29,
|
|
2 * 30,
|
|
2 * 31,
|
|
2 * 32,
|
|
2 * 33,
|
|
2 * 34,
|
|
2 * 35,
|
|
2 * 36,
|
|
2 * 37,
|
|
2 * 38,
|
|
2 * 39,
|
|
2 * 40,
|
|
2 * 41,
|
|
2 * 42,
|
|
2 * 43,
|
|
2 * 44,
|
|
2 * 45,
|
|
2 * 46,
|
|
2 * 47,
|
|
2 * 48,
|
|
2 * 49,
|
|
2 * 50,
|
|
2 * 51,
|
|
2 * 52,
|
|
2 * 53,
|
|
2 * 54,
|
|
2 * 55,
|
|
2 * 56,
|
|
2 * 57,
|
|
2 * 58,
|
|
2 * 59,
|
|
2 * 60,
|
|
2 * 61,
|
|
2 * 62,
|
|
2 * 63,
|
|
2 * 64);
|
|
|
|
class Bar {
|
|
final int field64;
|
|
Bar(this.field64);
|
|
}
|
|
|
|
class Baz {
|
|
final int field64;
|
|
Baz(this.field64);
|
|
}
|
|
|
|
class Foo implements Bar {
|
|
final int field0;
|
|
final int field1;
|
|
final int field2;
|
|
final int field3;
|
|
final int field4;
|
|
final int field5;
|
|
final int field6;
|
|
final int field7;
|
|
final int field8;
|
|
final int field9;
|
|
final int field10;
|
|
final int field11;
|
|
final int field12;
|
|
final int field13;
|
|
final int field14;
|
|
final int field15;
|
|
final int field16;
|
|
final int field17;
|
|
final int field18;
|
|
final int field19;
|
|
final int field20;
|
|
final int field21;
|
|
final int field22;
|
|
final int field23;
|
|
final int field24;
|
|
final int field25;
|
|
final int field26;
|
|
final int field27;
|
|
final int field28;
|
|
final int field29;
|
|
final int field30;
|
|
final int field31;
|
|
final int field32;
|
|
final int field33;
|
|
final int field34;
|
|
final int field35;
|
|
final int field36;
|
|
final int field37;
|
|
final int field38;
|
|
final int field39;
|
|
final int field40;
|
|
final int field41;
|
|
final int field42;
|
|
final int field43;
|
|
final int field44;
|
|
final int field45;
|
|
final int field46;
|
|
final int field47;
|
|
final int field48;
|
|
final int field49;
|
|
final int field50;
|
|
final int field51;
|
|
final int field52;
|
|
final int field53;
|
|
final int field54;
|
|
final int field55;
|
|
final int field56;
|
|
final int field57;
|
|
final int field58;
|
|
final int field59;
|
|
final int field60;
|
|
final int field61;
|
|
final int field62;
|
|
final int field63;
|
|
final int field64;
|
|
|
|
Foo(
|
|
this.field0,
|
|
this.field1,
|
|
this.field2,
|
|
this.field3,
|
|
this.field4,
|
|
this.field5,
|
|
this.field6,
|
|
this.field7,
|
|
this.field8,
|
|
this.field9,
|
|
this.field10,
|
|
this.field11,
|
|
this.field12,
|
|
this.field13,
|
|
this.field14,
|
|
this.field15,
|
|
this.field16,
|
|
this.field17,
|
|
this.field18,
|
|
this.field19,
|
|
this.field20,
|
|
this.field21,
|
|
this.field22,
|
|
this.field23,
|
|
this.field24,
|
|
this.field25,
|
|
this.field26,
|
|
this.field27,
|
|
this.field28,
|
|
this.field29,
|
|
this.field30,
|
|
this.field31,
|
|
this.field32,
|
|
this.field33,
|
|
this.field34,
|
|
this.field35,
|
|
this.field36,
|
|
this.field37,
|
|
this.field38,
|
|
this.field39,
|
|
this.field40,
|
|
this.field41,
|
|
this.field42,
|
|
this.field43,
|
|
this.field44,
|
|
this.field45,
|
|
this.field46,
|
|
this.field47,
|
|
this.field48,
|
|
this.field49,
|
|
this.field50,
|
|
this.field51,
|
|
this.field52,
|
|
this.field53,
|
|
this.field54,
|
|
this.field55,
|
|
this.field56,
|
|
this.field57,
|
|
this.field58,
|
|
this.field59,
|
|
this.field60,
|
|
this.field61,
|
|
this.field62,
|
|
this.field63,
|
|
this.field64);
|
|
|
|
toString() => '''
|
|
$field0;
|
|
$field1;
|
|
$field2;
|
|
$field3;
|
|
$field4;
|
|
$field5;
|
|
$field6;
|
|
$field7;
|
|
$field8;
|
|
$field9;
|
|
$field10;
|
|
$field11;
|
|
$field12;
|
|
$field13;
|
|
$field14;
|
|
$field15;
|
|
$field16;
|
|
$field17;
|
|
$field18;
|
|
$field19;
|
|
$field20;
|
|
$field21;
|
|
$field22;
|
|
$field23;
|
|
$field24;
|
|
$field25;
|
|
$field26;
|
|
$field27;
|
|
$field28;
|
|
$field29;
|
|
$field30;
|
|
$field31;
|
|
$field32;
|
|
$field33;
|
|
$field34;
|
|
$field35;
|
|
$field36;
|
|
$field37;
|
|
$field38;
|
|
$field39;
|
|
$field40;
|
|
$field41;
|
|
$field42;
|
|
$field43;
|
|
$field44;
|
|
$field45;
|
|
$field46;
|
|
$field47;
|
|
$field48;
|
|
$field49;
|
|
$field50;
|
|
$field51;
|
|
$field52;
|
|
$field53;
|
|
$field54;
|
|
$field55;
|
|
$field56;
|
|
$field57;
|
|
$field58;
|
|
$field59;
|
|
$field60;
|
|
$field61;
|
|
$field62;
|
|
$field63;
|
|
$field64;
|
|
''';
|
|
}
|