Skip to content

Commit a62da84

Browse files
authored
Merge pull request swiftlang#5781 from slavapestov/fix-resilience-reflection-symbols
Runtime: Use metadata accessor functions in Reflection.mm and make su…
2 parents 62b6d6b + 7c1adfe commit a62da84

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)