Skip to content

Commit 7c1adfe

Browse files
committed
Runtime: Use metadata accessor functions in Reflection.mm and make sure they're public
Correct behavior with resilience requires calling accessors instead of using the metadata symbols directly. For some reason this file gets linked in with SwiftRuntimeTests too, so make the types @_versioned in the stdlib. Fixes <rdar://problem/29213794>.
1 parent 337c71d commit 7c1adfe

File tree

2 files changed

+36
-27
lines changed

2 files changed

+36
-27
lines changed

stdlib/public/core/ReflectionLegacy.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@ public struct _MagicMirrorData {
118118
}
119119
}
120120

121+
@_versioned
121122
struct _OpaqueMirror : _Mirror {
122123
let data: _MagicMirrorData
123124

@@ -147,6 +148,7 @@ func _getTupleCount(_: _MagicMirrorData) -> Int
147148
@_silgen_name("swift_TupleMirror_subscript")
148149
func _getTupleChild<T>(_: Int, _: _MagicMirrorData) -> (T, _Mirror)
149150

151+
@_versioned
150152
internal struct _TupleMirror : _Mirror {
151153
let data: _MagicMirrorData
152154

@@ -170,6 +172,7 @@ func _getStructCount(_: _MagicMirrorData) -> Int
170172
@_silgen_name("swift_StructMirror_subscript")
171173
func _getStructChild<T>(_: Int, _: _MagicMirrorData) -> (T, _Mirror)
172174

175+
@_versioned
173176
struct _StructMirror : _Mirror {
174177
let data: _MagicMirrorData
175178

@@ -200,6 +203,7 @@ func _getEnumChild<T>(_: Int, _: _MagicMirrorData) -> (T, _Mirror)
200203
func _swift_EnumMirror_caseName(
201204
_ data: _MagicMirrorData) -> UnsafePointer<CChar>
202205

206+
@_versioned
203207
struct _EnumMirror : _Mirror {
204208
let data: _MagicMirrorData
205209

@@ -282,6 +286,7 @@ func _getClassPlaygroundQuickLook(_ object: AnyObject) -> PlaygroundQuickLook? {
282286

283287
#endif
284288

289+
@_versioned
285290
struct _ClassMirror : _Mirror {
286291
let data: _MagicMirrorData
287292

@@ -310,6 +315,7 @@ struct _ClassMirror : _Mirror {
310315
var disposition: _MirrorDisposition { return .`class` }
311316
}
312317

318+
@_versioned
313319
struct _ClassSuperMirror : _Mirror {
314320
let data: _MagicMirrorData
315321

@@ -333,6 +339,7 @@ struct _ClassSuperMirror : _Mirror {
333339
var disposition: _MirrorDisposition { return .`class` }
334340
}
335341

342+
@_versioned
336343
struct _MetatypeMirror : _Mirror {
337344
let data: _MagicMirrorData
338345

stdlib/public/runtime/Reflection.mm

Lines changed: 29 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -943,47 +943,49 @@ void swift_ObjCMirror_subscript(String *outString,
943943

944944
// Addresses of the type metadata and Mirror witness tables for the primitive
945945
// mirrors.
946-
extern "C" const Metadata OpaqueMirrorMetadata
947-
__asm__(SWIFT_QUOTED_SYMBOL_NAME(_TMVs13_OpaqueMirror));
946+
typedef const Metadata *(*MetadataFn)();
947+
948+
extern "C" Metadata *OpaqueMirrorMetadata()
949+
__asm__(SWIFT_QUOTED_SYMBOL_NAME(_TMaVs13_OpaqueMirror));
948950
extern "C" const MirrorWitnessTable OpaqueMirrorWitnessTable
949951
__asm__(SWIFT_QUOTED_SYMBOL_NAME(_TWPVs13_OpaqueMirrors7_Mirrors));
950-
extern "C" const Metadata TupleMirrorMetadata
951-
__asm__(SWIFT_QUOTED_SYMBOL_NAME(_TMVs12_TupleMirror));
952+
extern "C" Metadata *TupleMirrorMetadata()
953+
__asm__(SWIFT_QUOTED_SYMBOL_NAME(_TMaVs12_TupleMirror));
952954
extern "C" const MirrorWitnessTable TupleMirrorWitnessTable
953955
__asm__(SWIFT_QUOTED_SYMBOL_NAME(_TWPVs12_TupleMirrors7_Mirrors));
954956

955-
extern "C" const Metadata StructMirrorMetadata
956-
__asm__(SWIFT_QUOTED_SYMBOL_NAME(_TMVs13_StructMirror));
957+
extern "C" Metadata *StructMirrorMetadata()
958+
__asm__(SWIFT_QUOTED_SYMBOL_NAME(_TMaVs13_StructMirror));
957959
extern "C" const MirrorWitnessTable StructMirrorWitnessTable
958960
__asm__(SWIFT_QUOTED_SYMBOL_NAME(_TWPVs13_StructMirrors7_Mirrors));
959961

960-
extern "C" const Metadata EnumMirrorMetadata
961-
__asm__(SWIFT_QUOTED_SYMBOL_NAME(_TMVs11_EnumMirror));
962+
extern "C" Metadata *EnumMirrorMetadata()
963+
__asm__(SWIFT_QUOTED_SYMBOL_NAME(_TMaVs11_EnumMirror));
962964
extern "C" const MirrorWitnessTable EnumMirrorWitnessTable
963965
__asm__(SWIFT_QUOTED_SYMBOL_NAME(_TWPVs11_EnumMirrors7_Mirrors));
964966

965-
extern "C" const Metadata ClassMirrorMetadata
966-
__asm__(SWIFT_QUOTED_SYMBOL_NAME(_TMVs12_ClassMirror));
967+
extern "C" Metadata *ClassMirrorMetadata()
968+
__asm__(SWIFT_QUOTED_SYMBOL_NAME(_TMaVs12_ClassMirror));
967969
extern "C" const MirrorWitnessTable ClassMirrorWitnessTable
968970
__asm__(SWIFT_QUOTED_SYMBOL_NAME(_TWPVs12_ClassMirrors7_Mirrors));
969971

970-
extern "C" const Metadata ClassSuperMirrorMetadata
971-
__asm__(SWIFT_QUOTED_SYMBOL_NAME(_TMVs17_ClassSuperMirror));
972+
extern "C" Metadata *ClassSuperMirrorMetadata()
973+
__asm__(SWIFT_QUOTED_SYMBOL_NAME(_TMaVs17_ClassSuperMirror));
972974
extern "C" const MirrorWitnessTable ClassSuperMirrorWitnessTable
973975
__asm__(SWIFT_QUOTED_SYMBOL_NAME(_TWPVs17_ClassSuperMirrors7_Mirrors));
974976

975-
extern "C" const Metadata MetatypeMirrorMetadata
976-
__asm__(SWIFT_QUOTED_SYMBOL_NAME(_TMVs15_MetatypeMirror));
977+
extern "C" Metadata *MetatypeMirrorMetadata()
978+
__asm__(SWIFT_QUOTED_SYMBOL_NAME(_TMaVs15_MetatypeMirror));
977979
extern "C" const MirrorWitnessTable MetatypeMirrorWitnessTable
978980
__asm__(SWIFT_QUOTED_SYMBOL_NAME(_TWPVs15_MetatypeMirrors7_Mirrors));
979981

980982
#if SWIFT_OBJC_INTEROP
981-
extern "C" const Metadata ObjCMirrorMetadata
982-
__asm__(SWIFT_QUOTED_SYMBOL_NAME(_TMVs11_ObjCMirror));
983+
extern "C" Metadata *ObjCMirrorMetadata()
984+
__asm__(SWIFT_QUOTED_SYMBOL_NAME(_TMaVs11_ObjCMirror));
983985
extern "C" const MirrorWitnessTable ObjCMirrorWitnessTable
984986
__asm__(SWIFT_QUOTED_SYMBOL_NAME(_TWPVs11_ObjCMirrors7_Mirrors));
985-
extern "C" const Metadata ObjCSuperMirrorMetadata
986-
__asm__(SWIFT_QUOTED_SYMBOL_NAME(_TMVs16_ObjCSuperMirror));
987+
extern "C" Metadata *ObjCSuperMirrorMetadata()
988+
__asm__(SWIFT_QUOTED_SYMBOL_NAME(_TMaVs16_ObjCSuperMirror));
987989
extern "C" const MirrorWitnessTable ObjCSuperMirrorWitnessTable
988990
__asm__(SWIFT_QUOTED_SYMBOL_NAME(_TWPVs16_ObjCSuperMirrors7_Mirrors));
989991
#endif
@@ -1004,7 +1006,7 @@ static Mirror getMirrorForSuperclass(const ClassMetadata *sup,
10041006
Mirror resultBuf;
10051007
MagicMirror *result = ::new (&resultBuf) MagicMirror;
10061008

1007-
result->Self = &ClassSuperMirrorMetadata;
1009+
result->Self = ClassSuperMirrorMetadata();
10081010
result->MirrorWitness = &ClassSuperMirrorWitnessTable;
10091011
result->Data.Owner = owner;
10101012
result->Data.Type = sup;
@@ -1023,7 +1025,7 @@ static Mirror ObjC_getMirrorForSuperclass(Class sup,
10231025
Mirror resultBuf;
10241026
MagicMirror *result = ::new (&resultBuf) MagicMirror;
10251027

1026-
result->Self = &ObjCSuperMirrorMetadata;
1028+
result->Self = ObjCSuperMirrorMetadata();
10271029
result->MirrorWitness = &ObjCSuperMirrorWitnessTable;
10281030
result->Data.Owner = owner;
10291031
result->Data.Type = reinterpret_cast<ClassMetadata*>(sup);
@@ -1050,12 +1052,12 @@ static Mirror ObjC_getMirrorForSuperclass(Class sup,
10501052
#if SWIFT_OBJC_INTEROP
10511053
// If this is a pure ObjC class, reflect it using ObjC's runtime facilities.
10521054
if (!isa->isTypeMetadata())
1053-
return {isa, &ObjCMirrorMetadata, &ObjCMirrorWitnessTable};
1055+
return {isa, ObjCMirrorMetadata(), &ObjCMirrorWitnessTable};
10541056
#endif
10551057

10561058
// Otherwise, use the native Swift facilities.
10571059
return std::make_tuple(
1058-
isa, &ClassMirrorMetadata, &ClassMirrorWitnessTable);
1060+
isa, ClassMirrorMetadata(), &ClassMirrorWitnessTable);
10591061
}
10601062

10611063
/// Get the magic mirror witnesses appropriate to a particular type.
@@ -1064,16 +1066,16 @@ static Mirror ObjC_getMirrorForSuperclass(Class sup,
10641066
switch (T->getKind()) {
10651067
case MetadataKind::Tuple:
10661068
return std::make_tuple(
1067-
T, &TupleMirrorMetadata, &TupleMirrorWitnessTable);
1069+
T, TupleMirrorMetadata(), &TupleMirrorWitnessTable);
10681070

10691071
case MetadataKind::Struct:
10701072
return std::make_tuple(
1071-
T, &StructMirrorMetadata, &StructMirrorWitnessTable);
1073+
T, StructMirrorMetadata(), &StructMirrorWitnessTable);
10721074

10731075
case MetadataKind::Enum:
10741076
case MetadataKind::Optional:
10751077
return std::make_tuple(
1076-
T, &EnumMirrorMetadata, &EnumMirrorWitnessTable);
1078+
T, EnumMirrorMetadata(), &EnumMirrorWitnessTable);
10771079

10781080
case MetadataKind::ObjCClassWrapper:
10791081
case MetadataKind::ForeignClass:
@@ -1083,7 +1085,7 @@ static Mirror ObjC_getMirrorForSuperclass(Class sup,
10831085

10841086
case MetadataKind::Metatype:
10851087
case MetadataKind::ExistentialMetatype: {
1086-
return std::make_tuple(T, &MetatypeMirrorMetadata,
1088+
return std::make_tuple(T, MetatypeMirrorMetadata(),
10871089
&MetatypeMirrorWitnessTable);
10881090
}
10891091

@@ -1110,7 +1112,7 @@ static Mirror ObjC_getMirrorForSuperclass(Class sup,
11101112
case MetadataKind::Function:
11111113
case MetadataKind::Existential:
11121114
return std::make_tuple(
1113-
T, &OpaqueMirrorMetadata, &OpaqueMirrorWitnessTable);
1115+
T, OpaqueMirrorMetadata(), &OpaqueMirrorWitnessTable);
11141116

11151117
// Types can't have these kinds.
11161118
case MetadataKind::HeapLocalVariable:

0 commit comments

Comments
 (0)