Skip to content

Commit 4aa2ecf

Browse files
authored
Merge pull request #38345 from al45tair/problem/74414189
2 parents 4553b8f + e9350fe commit 4aa2ecf

File tree

4 files changed

+147
-26
lines changed

4 files changed

+147
-26
lines changed

stdlib/public/Reflection/TypeLowering.cpp

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -258,13 +258,16 @@ BuiltinTypeInfo::readExtraInhabitantIndex(remote::MemoryReader &reader,
258258
bool RecordTypeInfo::readExtraInhabitantIndex(remote::MemoryReader &reader,
259259
remote::RemoteAddress address,
260260
int *extraInhabitantIndex) const {
261+
*extraInhabitantIndex = -1;
262+
261263
switch (SubKind) {
262264
case RecordKind::Invalid:
263265
case RecordKind::ClosureContext:
264266
return false;
265267

266-
case RecordKind::OpaqueExistential: {
267-
if (Fields.size() != 1) {
268+
case RecordKind::OpaqueExistential:
269+
case RecordKind::ExistentialMetatype: {
270+
if (Fields.size() < 1) {
268271
return false;
269272
}
270273
auto metadata = Fields[0];
@@ -274,7 +277,7 @@ bool RecordTypeInfo::readExtraInhabitantIndex(remote::MemoryReader &reader,
274277
}
275278

276279
case RecordKind::ThickFunction: {
277-
if (Fields.size() != 2) {
280+
if (Fields.size() < 2) {
278281
return false;
279282
}
280283
auto function = Fields[0];
@@ -288,16 +291,25 @@ bool RecordTypeInfo::readExtraInhabitantIndex(remote::MemoryReader &reader,
288291
}
289292

290293
case RecordKind::ClassExistential:
291-
case RecordKind::ExistentialMetatype:
292-
case RecordKind::ErrorExistential:
293-
case RecordKind::ClassInstance: {
294-
return false; // XXX TODO XXX
294+
case RecordKind::ErrorExistential: {
295+
if (Fields.size() < 1) {
296+
return true;
297+
}
298+
auto first = Fields[0];
299+
auto firstFieldAddress = address + first.Offset;
300+
return first.TI.readExtraInhabitantIndex(reader, firstFieldAddress,
301+
extraInhabitantIndex);
295302
}
296303

304+
case RecordKind::ClassInstance:
305+
// This case seems unlikely to ever happen; if we're using XIs with a
306+
// class, it'll be with a reference, not with the instance itself (i.e.
307+
// we'll be in the RecordKind::ClassExistential case).
308+
return false;
309+
297310
case RecordKind::Tuple:
298311
case RecordKind::Struct: {
299312
if (Fields.size() == 0) {
300-
*extraInhabitantIndex = -1;
301313
return true;
302314
}
303315
// Tuples and Structs inherit XIs from their most capacious member

test/RemoteMirror/Inputs/interop.m

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -217,23 +217,21 @@ int main(int argc, char **argv) {
217217
printf("(Builtin value not displayed)\n");
218218
break;
219219
case SWIFT_NO_PAYLOAD_ENUM:
220-
{
221-
int CaseNdx;
222-
223-
if (swift_reflection_interop_projectEnumValue(Context,
224-
Obj + ChildInfo.Offset,
225-
ChildInfo.TR,
226-
&CaseNdx)) {
227-
swift_childinfo_interop_t CaseInfo
228-
= swift_reflection_interop_childOfTypeRef(Context, ChildInfo.TR,
229-
CaseNdx);
230-
231-
printf("Value: %s (%d)\n", CaseInfo.Name, CaseNdx);
232-
} else {
233-
printf("Value: unknown\n");
234-
}
220+
case SWIFT_SINGLE_PAYLOAD_ENUM:
221+
case SWIFT_MULTI_PAYLOAD_ENUM: {
222+
int CaseNdx;
223+
224+
if (swift_reflection_interop_projectEnumValue(
225+
Context, Obj + ChildInfo.Offset, ChildInfo.TR, &CaseNdx)) {
226+
swift_childinfo_interop_t CaseInfo =
227+
swift_reflection_interop_childOfTypeRef(Context, ChildInfo.TR,
228+
CaseNdx);
229+
230+
printf("Value: %s (%d)\n", CaseInfo.Name, CaseNdx);
231+
} else {
232+
printf("Value: unknown\n");
235233
}
236-
break;
234+
} break;
237235
default:
238236
printf("(Value not displayed)\n");
239237
break;

test/RemoteMirror/Inputs/interop.swift

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,99 @@ case two
99
case three
1010
}
1111

12+
enum F {
13+
case one(AnyObject)
14+
case two
15+
case three
16+
}
17+
18+
protocol Frobble {
19+
func frobble()
20+
}
21+
22+
protocol Wibble {
23+
func wibble()
24+
}
25+
26+
class FooErr: Error {}
27+
28+
class Foo: Frobble, Wibble {
29+
func frobble() {}
30+
func wibble() {}
31+
}
32+
33+
// Class existential
34+
enum G {
35+
case one
36+
case two(Foo)
37+
case three
38+
case four
39+
}
40+
41+
// Error existential
42+
enum H {
43+
case one
44+
case two
45+
case three(Error)
46+
case four
47+
}
48+
49+
// Opaque existentials
50+
enum I {
51+
case one
52+
case two
53+
case three
54+
case four(Frobble)
55+
}
56+
57+
enum J {
58+
case one(Frobble & Wibble)
59+
case two
60+
case three
61+
case four
62+
}
63+
64+
// Existential metatype
65+
enum K {
66+
case one
67+
case two(Frobble.Type)
68+
case three
69+
case four
70+
}
71+
1272
class C {
1373
let x = "123"
1474
let y = 456
1575
let e = E.two
76+
77+
let f1 = F.one(Foo())
78+
let f2 = F.two
79+
let f3 = F.three
80+
81+
let g1 = G.one
82+
let g2 = G.two(Foo())
83+
let g3 = G.three
84+
let g4 = G.four
85+
86+
let h1 = H.one
87+
let h2 = H.two
88+
let h3 = H.three(FooErr())
89+
let h4 = H.four
90+
91+
let i1 = I.one
92+
let i2 = I.two
93+
let i3 = I.three
94+
let i4 = I.four(Foo())
95+
96+
let j1 = J.one(Foo())
97+
let j2 = J.two
98+
let j3 = J.three
99+
let j4 = J.four
100+
101+
let k1 = K.one
102+
let k2 = K.two(Foo.self)
103+
let k3 = K.three
104+
let k4 = K.four
16105
}
17106

18107
let c = C()

test/RemoteMirror/interop.swift

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,30 @@
1515
// CHECK-NEXT: Demangled name: InteropTest.C
1616
// CHECK-NEXT: Original metadata: 0x{{[0-9A-Fa-f]+}}
1717
// CHECK-NEXT: Looked up metadata: Metadata=0x{{[0-9A-Fa-f]+}} Library={{[0-9]+}}
18-
// CHECK-NEXT: Kind:17 Size:{{[0-9]+}} Alignment:{{[0-9]+}} Stride:{{[0-9]+}} NumFields:3
18+
// CHECK-NEXT: Kind:17 Size:{{[0-9]+}} Alignment:{{[0-9]+}} Stride:{{[0-9]+}} NumFields:26
1919
// CHECK-NEXT: [0]: x Offset:{{[0-9]+}} Kind:4 Type:Swift.String (Value not displayed)
2020
// CHECK-NEXT: [1]: y Offset:{{[0-9]+}} Kind:4 Type:Swift.Int (Value not displayed)
2121
// CHECK-NEXT: [2]: e Offset:{{[0-9]+}} Kind:5 Type:InteropTest.E Value: two (1)
22-
22+
// CHECK-NEXT: [3]: f1 Offset:{{[0-9]+}} Kind:6 Type:InteropTest.F Value: one (0)
23+
// CHECK-NEXT: [4]: f2 Offset:{{[0-9]+}} Kind:6 Type:InteropTest.F Value: two (1)
24+
// CHECK-NEXT: [5]: f3 Offset:{{[0-9]+}} Kind:6 Type:InteropTest.F Value: three (2)
25+
// CHECK-NEXT: [6]: g1 Offset:{{[0-9]+}} Kind:6 Type:InteropTest.G Value: one (1)
26+
// CHECK-NEXT: [7]: g2 Offset:{{[0-9]+}} Kind:6 Type:InteropTest.G Value: two (0)
27+
// CHECK-NEXT: [8]: g3 Offset:{{[0-9]+}} Kind:6 Type:InteropTest.G Value: three (2)
28+
// CHECK-NEXT: [9]: g4 Offset:{{[0-9]+}} Kind:6 Type:InteropTest.G Value: four (3)
29+
// CHECK-NEXT: [10]: h1 Offset:{{[0-9]+}} Kind:6 Type:InteropTest.H Value: one (1)
30+
// CHECK-NEXT: [11]: h2 Offset:{{[0-9]+}} Kind:6 Type:InteropTest.H Value: two (2)
31+
// CHECK-NEXT: [12]: h3 Offset:{{[0-9]+}} Kind:6 Type:InteropTest.H Value: three (0)
32+
// CHECK-NEXT: [13]: h4 Offset:{{[0-9]+}} Kind:6 Type:InteropTest.H Value: four (3)
33+
// CHECK-NEXT: [14]: i1 Offset:{{[0-9]+}} Kind:6 Type:InteropTest.I Value: one (1)
34+
// CHECK-NEXT: [15]: i2 Offset:{{[0-9]+}} Kind:6 Type:InteropTest.I Value: two (2)
35+
// CHECK-NEXT: [16]: i3 Offset:{{[0-9]+}} Kind:6 Type:InteropTest.I Value: three (3)
36+
// CHECK-NEXT: [17]: i4 Offset:{{[0-9]+}} Kind:6 Type:InteropTest.I Value: four (0)
37+
// CHECK-NEXT: [18]: j1 Offset:{{[0-9]+}} Kind:6 Type:InteropTest.J Value: one (0)
38+
// CHECK-NEXT: [19]: j2 Offset:{{[0-9]+}} Kind:6 Type:InteropTest.J Value: two (1)
39+
// CHECK-NEXT: [20]: j3 Offset:{{[0-9]+}} Kind:6 Type:InteropTest.J Value: three (2)
40+
// CHECK-NEXT: [21]: j4 Offset:{{[0-9]+}} Kind:6 Type:InteropTest.J Value: four (3)
41+
// CHECK-NEXT: [22]: k1 Offset:{{[0-9]+}} Kind:6 Type:InteropTest.K Value: one (1)
42+
// CHECK-NEXT: [23]: k2 Offset:{{[0-9]+}} Kind:6 Type:InteropTest.K Value: two (0)
43+
// CHECK-NEXT: [24]: k3 Offset:{{[0-9]+}} Kind:6 Type:InteropTest.K Value: three (2)
44+
// CHECK-NEXT: [25]: k4 Offset:{{[0-9]+}} Kind:6 Type:InteropTest.K Value: four (3)

0 commit comments

Comments
 (0)