Skip to content

Commit ed2092e

Browse files
mkustermanncommit-bot@chromium.org
authored andcommitted
[vm] Add TFA transformer expectation files for unboxing metadata
Issue dart-lang/sdk#33549 Change-Id: Ib1c040390d4de9a00a2a1ed3ae42bb1aa10456a7 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/138922 Reviewed-by: Samir Jindel <[email protected]> Commit-Queue: Martin Kustermann <[email protected]>
1 parent 44a4f36 commit ed2092e

10 files changed

+1069
-0
lines changed
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
// Copyright (c) 2020, 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+
final bool kTrue = int.parse('1') == 1 ? true : false;
6+
final bool kFalse = int.parse('1') == 2 ? true : false;
7+
int get mint => 0xaabbccddaabbccdd;
8+
int get smiOrMint => kTrue ? 1 : mint;
9+
10+
class X {}
11+
12+
class A {
13+
dynamic unboxedSmi;
14+
dynamic unboxedInt;
15+
dynamic unboxedDouble;
16+
dynamic boxedNullableInt;
17+
dynamic boxedNullableDouble;
18+
dynamic boxedNonNullableIntOrDouble;
19+
dynamic boxedNullableIntOrDouble;
20+
dynamic boxedNullableX;
21+
dynamic boxedX;
22+
23+
A(
24+
this.unboxedSmi,
25+
this.unboxedInt,
26+
this.unboxedDouble,
27+
this.boxedNullableInt,
28+
this.boxedNullableDouble,
29+
this.boxedNonNullableIntOrDouble,
30+
this.boxedNullableIntOrDouble,
31+
this.boxedNullableX,
32+
this.boxedX);
33+
}
34+
35+
main() {
36+
final a = A(
37+
kTrue ? 1 : 2,
38+
kTrue ? smiOrMint : 2,
39+
kTrue ? 1.1 : 2.2,
40+
kTrue ? smiOrMint : null,
41+
kTrue ? 1.1 : null,
42+
kTrue ? smiOrMint : 1.1,
43+
kTrue ? (kFalse ? smiOrMint : 1.1) : null,
44+
kTrue ? X() : null,
45+
X());
46+
47+
a.unboxedSmi = kTrue ? 1 : 2;
48+
a.unboxedInt = kTrue ? smiOrMint : 2;
49+
a.unboxedDouble = kTrue ? 1.1 : 2.2;
50+
a.boxedNullableInt = kTrue ? smiOrMint : null;
51+
a.boxedNullableDouble = kTrue ? 1.1 : null;
52+
a.boxedNonNullableIntOrDouble = kTrue ? smiOrMint : 1.1;
53+
a.boxedNullableIntOrDouble = kTrue ? (kFalse ? smiOrMint : 1.1) : null;
54+
a.boxedNullableX = kTrue ? X() : null;
55+
a.boxedX = X();
56+
57+
use(a.unboxedSmi);
58+
use(a.unboxedInt);
59+
use(a.unboxedDouble);
60+
use(a.boxedNullableInt);
61+
use(a.boxedNullableDouble);
62+
use(a.boxedNonNullableIntOrDouble);
63+
use(a.boxedNullableIntOrDouble);
64+
use(a.boxedNullableX);
65+
use(a.boxedX);
66+
}
67+
68+
void use(dynamic object) {}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
library #lib;
2+
import self as self;
3+
import "dart:core" as core;
4+
5+
class X extends core::Object {
6+
synthetic constructor •() → self::X*
7+
: super core::Object::•()
8+
;
9+
}
10+
class A extends core::Object {
11+
[@vm.inferred-type.metadata=dart.core::_Smi] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] field dynamic unboxedSmi;
12+
[@vm.inferred-type.metadata=int] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4] field dynamic unboxedInt;
13+
[@vm.inferred-type.metadata=dart.core::_Double] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6] field dynamic unboxedDouble;
14+
[@vm.inferred-type.metadata=int?] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8] field dynamic boxedNullableInt;
15+
[@vm.inferred-type.metadata=dart.core::_Double?] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:9,getterSelectorId:10] field dynamic boxedNullableDouble;
16+
[@vm.inferred-type.metadata=!] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:11,getterSelectorId:12] field dynamic boxedNonNullableIntOrDouble;
17+
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:13,getterSelectorId:14] field dynamic boxedNullableIntOrDouble;
18+
[@vm.inferred-type.metadata=#lib::X?] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:15,getterSelectorId:16] field dynamic boxedNullableX;
19+
[@vm.inferred-type.metadata=#lib::X] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:17,getterSelectorId:18] field dynamic boxedX;
20+
[@vm.unboxing-info.metadata=(i,i,d,b,b,b,b,b,b)->b] constructor •([@vm.inferred-type.metadata=dart.core::_Smi] dynamic unboxedSmi, [@vm.inferred-type.metadata=int] dynamic unboxedInt, [@vm.inferred-type.metadata=dart.core::_Double] dynamic unboxedDouble, [@vm.inferred-type.metadata=int?] dynamic boxedNullableInt, [@vm.inferred-type.metadata=dart.core::_Double?] dynamic boxedNullableDouble, [@vm.inferred-type.metadata=!] dynamic boxedNonNullableIntOrDouble, dynamic boxedNullableIntOrDouble, [@vm.inferred-type.metadata=#lib::X?] dynamic boxedNullableX, [@vm.inferred-type.metadata=#lib::X] dynamic boxedX) → self::A*
21+
: self::A::unboxedSmi = unboxedSmi, self::A::unboxedInt = unboxedInt, self::A::unboxedDouble = unboxedDouble, self::A::boxedNullableInt = boxedNullableInt, self::A::boxedNullableDouble = boxedNullableDouble, self::A::boxedNonNullableIntOrDouble = boxedNonNullableIntOrDouble, self::A::boxedNullableIntOrDouble = boxedNullableIntOrDouble, self::A::boxedNullableX = boxedNullableX, self::A::boxedX = boxedX, super core::Object::•()
22+
;
23+
}
24+
[@vm.inferred-type.metadata=dart.core::bool?]static final field core::bool* kTrue = [@vm.direct-call.metadata=dart.core::_IntegerImplementation::==] [@vm.inferred-type.metadata=dart.core::bool (skip check)] [@vm.inferred-type.metadata=int] core::int::parse("1").{core::num::==}(1) ?{core::bool*} true : false;
25+
[@vm.inferred-type.metadata=dart.core::bool?]static final field core::bool* kFalse = [@vm.direct-call.metadata=dart.core::_IntegerImplementation::==] [@vm.inferred-type.metadata=dart.core::bool (skip check)] [@vm.inferred-type.metadata=int] core::int::parse("1").{core::num::==}(2) ?{core::bool*} true : false;
26+
static get mint() → core::int*
27+
return -6144092014192636707;
28+
static get smiOrMint() → core::int*
29+
return [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::int*} 1 : [@vm.inferred-type.metadata=int] self::mint;
30+
static method main() → dynamic {
31+
final self::A* a = new self::A::•([@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::int*} 1 : 2, [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::int*} [@vm.inferred-type.metadata=int] self::smiOrMint : 2, [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::double*} 1.1 : 2.2, [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::int*} [@vm.inferred-type.metadata=int] self::smiOrMint : null, [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::double*} 1.1 : null, [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::num*} [@vm.inferred-type.metadata=int] self::smiOrMint : 1.1, [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::num*} [@vm.inferred-type.metadata=dart.core::bool?] self::kFalse ?{core::num*} [@vm.inferred-type.metadata=int] self::smiOrMint : 1.1 : null, [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{self::X*} new self::X::•() : null, new self::X::•());
32+
[@vm.direct-call.metadata=#lib::A::unboxedSmi] [@vm.inferred-type.metadata=!? (skip check)] a.{self::A::unboxedSmi} = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::int*} 1 : 2;
33+
[@vm.direct-call.metadata=#lib::A::unboxedInt] [@vm.inferred-type.metadata=!? (skip check)] a.{self::A::unboxedInt} = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::int*} [@vm.inferred-type.metadata=int] self::smiOrMint : 2;
34+
[@vm.direct-call.metadata=#lib::A::unboxedDouble] [@vm.inferred-type.metadata=!? (skip check)] a.{self::A::unboxedDouble} = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::double*} 1.1 : 2.2;
35+
[@vm.direct-call.metadata=#lib::A::boxedNullableInt] [@vm.inferred-type.metadata=!? (skip check)] a.{self::A::boxedNullableInt} = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::int*} [@vm.inferred-type.metadata=int] self::smiOrMint : null;
36+
[@vm.direct-call.metadata=#lib::A::boxedNullableDouble] [@vm.inferred-type.metadata=!? (skip check)] a.{self::A::boxedNullableDouble} = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::double*} 1.1 : null;
37+
[@vm.direct-call.metadata=#lib::A::boxedNonNullableIntOrDouble] [@vm.inferred-type.metadata=!? (skip check)] a.{self::A::boxedNonNullableIntOrDouble} = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::num*} [@vm.inferred-type.metadata=int] self::smiOrMint : 1.1;
38+
[@vm.direct-call.metadata=#lib::A::boxedNullableIntOrDouble] [@vm.inferred-type.metadata=!? (skip check)] a.{self::A::boxedNullableIntOrDouble} = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::num*} [@vm.inferred-type.metadata=dart.core::bool?] self::kFalse ?{core::num*} [@vm.inferred-type.metadata=int] self::smiOrMint : 1.1 : null;
39+
[@vm.direct-call.metadata=#lib::A::boxedNullableX] [@vm.inferred-type.metadata=!? (skip check)] a.{self::A::boxedNullableX} = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{self::X*} new self::X::•() : null;
40+
[@vm.direct-call.metadata=#lib::A::boxedX] [@vm.inferred-type.metadata=!? (skip check)] a.{self::A::boxedX} = new self::X::•();
41+
self::use([@vm.direct-call.metadata=#lib::A::unboxedSmi] [@vm.inferred-type.metadata=dart.core::_Smi] a.{self::A::unboxedSmi});
42+
self::use([@vm.direct-call.metadata=#lib::A::unboxedInt] [@vm.inferred-type.metadata=int] a.{self::A::unboxedInt});
43+
self::use([@vm.direct-call.metadata=#lib::A::unboxedDouble] [@vm.inferred-type.metadata=dart.core::_Double] a.{self::A::unboxedDouble});
44+
self::use([@vm.direct-call.metadata=#lib::A::boxedNullableInt] [@vm.inferred-type.metadata=int?] a.{self::A::boxedNullableInt});
45+
self::use([@vm.direct-call.metadata=#lib::A::boxedNullableDouble] [@vm.inferred-type.metadata=dart.core::_Double?] a.{self::A::boxedNullableDouble});
46+
self::use([@vm.direct-call.metadata=#lib::A::boxedNonNullableIntOrDouble] [@vm.inferred-type.metadata=!] a.{self::A::boxedNonNullableIntOrDouble});
47+
self::use([@vm.direct-call.metadata=#lib::A::boxedNullableIntOrDouble] a.{self::A::boxedNullableIntOrDouble});
48+
self::use([@vm.direct-call.metadata=#lib::A::boxedNullableX] [@vm.inferred-type.metadata=#lib::X?] a.{self::A::boxedNullableX});
49+
self::use([@vm.direct-call.metadata=#lib::A::boxedX] [@vm.inferred-type.metadata=#lib::X] a.{self::A::boxedX});
50+
}
51+
static method use(dynamic object) → void {}
Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,158 @@
1+
// Copyright (c) 2020, 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+
final bool kTrue = int.parse('1') == 1 ? true : false;
6+
final bool kFalse = int.parse('1') == 2 ? true : false;
7+
int get mint => 0xaabbccddaabbccdd;
8+
int get smiOrMint => kTrue ? 1 : mint;
9+
10+
class X {}
11+
12+
abstract class Interface {
13+
void takePositional(
14+
int unboxedSmi,
15+
dynamic unboxedInt,
16+
dynamic unboxedDouble,
17+
dynamic boxedNullableInt,
18+
dynamic boxedNullableDouble,
19+
dynamic boxedNonNullableIntOrDouble,
20+
dynamic boxedNullableIntOrDouble,
21+
dynamic boxedNullableX,
22+
dynamic boxedX);
23+
24+
dynamic returnUnboxedSmi(X ignored);
25+
dynamic returnUnboxedInt(X ignored);
26+
dynamic returnUnboxedDouble(X ignored);
27+
dynamic returnBoxedNullableInt(X ignored);
28+
dynamic returnBoxedNullableDouble(X ignored);
29+
dynamic returnBoxedIntOrDouble(X ignored);
30+
dynamic returnBoxedNullableIntOrDouble(X ignored);
31+
dynamic returnBoxedNullableX(X ignored);
32+
dynamic returnBoxedX(X ignored);
33+
}
34+
35+
class Impl1 implements Interface {
36+
void takePositional(
37+
int unboxedSmi,
38+
dynamic unboxedInt,
39+
dynamic unboxedDouble,
40+
dynamic boxedNullableInt,
41+
dynamic boxedNullableDouble,
42+
dynamic boxedNonNullableIntOrDouble,
43+
dynamic boxedNullableIntOrDouble,
44+
dynamic boxedNullableX,
45+
dynamic boxedX) {}
46+
47+
dynamic returnUnboxedSmi(X ignored) => 1;
48+
dynamic returnUnboxedInt(X ignored) => 1;
49+
dynamic returnUnboxedDouble(X ignored) => 1.1;
50+
dynamic returnBoxedNullableInt(X ignored) => null;
51+
dynamic returnBoxedNullableDouble(X ignored) => null;
52+
dynamic returnBoxedIntOrDouble(X ignored) => 1;
53+
dynamic returnBoxedNullableIntOrDouble(X ignored) => null;
54+
dynamic returnBoxedNullableX(X ignored) => null;
55+
dynamic returnBoxedX(X ignored) => X();
56+
}
57+
58+
class BaseImpl2 {
59+
void takePositional(
60+
int unboxedSmi,
61+
dynamic unboxedInt,
62+
dynamic unboxedDouble,
63+
dynamic boxedNullableInt,
64+
dynamic boxedNullableDouble,
65+
dynamic boxedNonNullableIntOrDouble,
66+
dynamic boxedNullableIntOrDouble,
67+
dynamic boxedNullableX,
68+
dynamic boxedX) {}
69+
70+
dynamic returnUnboxedSmi(X ignored) => 2;
71+
dynamic returnUnboxedInt(X ignored) => mint;
72+
dynamic returnUnboxedDouble(X ignored) => 2.2;
73+
dynamic returnBoxedNullableInt(X ignored) => 2;
74+
dynamic returnBoxedNullableDouble(X ignored) => 2.2;
75+
dynamic returnBoxedIntOrDouble(X ignored) => 2.2;
76+
dynamic returnBoxedNullableIntOrDouble(X ignored) => 2;
77+
dynamic returnBoxedNullableX(X ignored) => X();
78+
dynamic returnBoxedX(X ignored) => X();
79+
}
80+
81+
class SubImpl3 extends BaseImpl2 implements Interface {
82+
void takePositional(
83+
int unboxedSmi,
84+
dynamic unboxedInt,
85+
dynamic unboxedDouble,
86+
dynamic boxedNullableInt,
87+
dynamic boxedNullableDouble,
88+
dynamic boxedNonNullableIntOrDouble,
89+
dynamic boxedNullableIntOrDouble,
90+
dynamic boxedNullableX,
91+
dynamic boxedX) {}
92+
93+
dynamic returnUnboxedSmi(X ignored) => 3;
94+
dynamic returnUnboxedInt(X ignored) => mint;
95+
dynamic returnUnboxedDouble(X ignored) => 3.3;
96+
dynamic returnBoxedNullableInt(X ignored) => mint;
97+
dynamic returnBoxedNullableDouble(X ignored) => 3.3;
98+
dynamic returnBoxedIntOrDouble(X ignored) => 3.3;
99+
dynamic returnBoxedNullableIntOrDouble(X ignored) => 3.3;
100+
dynamic returnBoxedNullableX(X ignored) => X();
101+
dynamic returnBoxedX(X ignored) => X();
102+
}
103+
104+
main() {
105+
final values = [Impl1(), BaseImpl2(), SubImpl3()];
106+
107+
final a = values[int.parse('0')] as Impl1;
108+
final b = values[int.parse('1')] as BaseImpl2;
109+
final c = values[int.parse('2')] as SubImpl3;
110+
final d = values[int.parse('2')] as Interface;
111+
112+
a.takePositional(1, 1, 1.1, null, null, 1, null, null, X());
113+
b.takePositional(2, 2, 2.2, 2, 2.2, 2.2, 2, X(), X());
114+
c.takePositional(3, mint, 3.3, mint, 3.3, 3.3, 3.3, X(), X());
115+
d.takePositional(3, mint, 3.3, mint, 3.3, 3.3, 3.3, X(), X());
116+
117+
use(a.returnUnboxedSmi(null));
118+
use(a.returnUnboxedInt(null));
119+
use(a.returnUnboxedDouble(null));
120+
use(a.returnBoxedNullableInt(null));
121+
use(a.returnBoxedNullableDouble(null));
122+
use(a.returnBoxedIntOrDouble(null));
123+
use(a.returnBoxedNullableIntOrDouble(null));
124+
use(a.returnBoxedNullableX(null));
125+
use(a.returnBoxedX(null));
126+
127+
use(b.returnUnboxedSmi(null));
128+
use(b.returnUnboxedInt(null));
129+
use(b.returnUnboxedDouble(null));
130+
use(b.returnBoxedNullableInt(null));
131+
use(b.returnBoxedNullableDouble(null));
132+
use(b.returnBoxedIntOrDouble(null));
133+
use(b.returnBoxedNullableIntOrDouble(null));
134+
use(b.returnBoxedNullableX(null));
135+
use(b.returnBoxedX(null));
136+
137+
use(c.returnUnboxedSmi(null));
138+
use(c.returnUnboxedInt(null));
139+
use(c.returnUnboxedDouble(null));
140+
use(c.returnBoxedNullableInt(null));
141+
use(c.returnBoxedNullableDouble(null));
142+
use(c.returnBoxedIntOrDouble(null));
143+
use(c.returnBoxedNullableIntOrDouble(null));
144+
use(c.returnBoxedNullableX(null));
145+
use(c.returnBoxedX(null));
146+
147+
use(d.returnUnboxedSmi(null));
148+
use(d.returnUnboxedInt(null));
149+
use(d.returnUnboxedDouble(null));
150+
use(d.returnBoxedNullableInt(null));
151+
use(d.returnBoxedNullableDouble(null));
152+
use(d.returnBoxedIntOrDouble(null));
153+
use(d.returnBoxedNullableIntOrDouble(null));
154+
use(d.returnBoxedNullableX(null));
155+
use(d.returnBoxedX(null));
156+
}
157+
158+
void use(dynamic value) {}

0 commit comments

Comments
 (0)