@@ -588,15 +588,6 @@ swift_dynamicCastMetatypeToObjectUnconditional(const Metadata *metatype,
588
588
}
589
589
}
590
590
591
- // internal func _getErrorEmbeddedNSErrorIndirect<T : Error>(
592
- // _ x: UnsafePointer<T>) -> AnyObject?
593
- #define getErrorEmbeddedNSErrorIndirect \
594
- MANGLE_SYM (s32_getErrorEmbeddedNSErrorIndirectyyXlSgSPyxGs0B0RzlF)
595
- SWIFT_CC(swift) SWIFT_RUNTIME_STDLIB_INTERNAL
596
- id getErrorEmbeddedNSErrorIndirect(const OpaqueValue *error,
597
- const Metadata *T,
598
- const WitnessTable *Error);
599
-
600
591
#endif
601
592
602
593
/* *****************************************************************************/
@@ -1256,7 +1247,6 @@ static bool _dynamicCastUnknownClassIndirect(OpaqueValue *dest,
1256
1247
// Okay, we're doing a conditional cast.
1257
1248
void *result =
1258
1249
const_cast <void *>(swift_dynamicCastUnknownClass (object, targetType));
1259
- assert (result == nullptr || object == result);
1260
1250
1261
1251
// If the cast failed, destroy the input and return false.
1262
1252
if (!result) {
@@ -1278,14 +1268,6 @@ static bool _dynamicCastUnknownClassIndirect(OpaqueValue *dest,
1278
1268
/* ******************************* Existentials ********************************/
1279
1269
/* *****************************************************************************/
1280
1270
1281
- #if SWIFT_OBJC_INTEROP
1282
- extern " C" const ProtocolDescriptor PROTOCOL_DESCR_SYM (s5Error);
1283
-
1284
- static const WitnessTable *findErrorWitness (const Metadata *srcType) {
1285
- return swift_conformsToProtocol (srcType, &PROTOCOL_DESCR_SYM (s5Error));
1286
- }
1287
- #endif
1288
-
1289
1271
// / Perform a dynamic cast from an existential type to some kind of
1290
1272
// / class type.
1291
1273
static bool _dynamicCastToUnknownClassFromExistential (OpaqueValue *dest,
@@ -1298,15 +1280,6 @@ static bool _dynamicCastToUnknownClassFromExistential(OpaqueValue *dest,
1298
1280
auto classContainer =
1299
1281
reinterpret_cast <ClassExistentialContainer*>(src);
1300
1282
void *obj = classContainer->Value ;
1301
- #if SWIFT_OBJC_INTEROP
1302
- // If we're casting to NSError, we may need a representation change,
1303
- // so fall into the general swift_dynamicCast path.
1304
- if (targetType == getNSErrorMetadata () ||
1305
- targetType == getNSObjectMetadata ()) {
1306
- return swift_dynamicCast (dest, src, swift_getObjectType ((HeapObject*)obj),
1307
- targetType, flags);
1308
- }
1309
- #endif
1310
1283
return _dynamicCastUnknownClassIndirect (dest, obj, targetType, flags);
1311
1284
}
1312
1285
case ExistentialTypeRepresentation::Opaque: {
@@ -1815,32 +1788,6 @@ static bool _dynamicCastToFunction(OpaqueValue *dest,
1815
1788
}
1816
1789
}
1817
1790
1818
- /* *****************************************************************************/
1819
- /* ***************************** Bridging NSError ******************************/
1820
- /* *****************************************************************************/
1821
-
1822
- #if SWIFT_OBJC_INTEROP
1823
- static id dynamicCastValueToNSError (OpaqueValue *src,
1824
- const Metadata *srcType,
1825
- const WitnessTable *srcErrorWitness,
1826
- DynamicCastFlags flags) {
1827
- // Check whether there is an embedded NSError.
1828
- if (auto embedded = getErrorEmbeddedNSErrorIndirect (src, srcType,
1829
- srcErrorWitness)) {
1830
- if (flags & DynamicCastFlags::TakeOnSuccess)
1831
- srcType->vw_destroy (src);
1832
-
1833
- return embedded;
1834
- }
1835
-
1836
- BoxPair errorBox = swift_allocError (srcType, srcErrorWitness, src,
1837
- /* isTake*/ flags & DynamicCastFlags::TakeOnSuccess);
1838
- auto *error = (SwiftError *)errorBox.object ;
1839
- return _swift_stdlib_bridgeErrorToNSError (error);
1840
- }
1841
-
1842
- #endif
1843
-
1844
1791
/* *****************************************************************************/
1845
1792
/* ******************************** Optionals **********************************/
1846
1793
/* *****************************************************************************/
@@ -2333,26 +2280,6 @@ static bool swift_dynamicCastImpl(OpaqueValue *dest, OpaqueValue *src,
2333
2280
// Casts to class type.
2334
2281
case MetadataKind::Class:
2335
2282
case MetadataKind::ObjCClassWrapper:
2336
- #if SWIFT_OBJC_INTEROP
2337
- // If the destination type is an NSError or NSObject, and the source type
2338
- // is an Error, then the cast can succeed by NSError bridging.
2339
- if (targetType == getNSErrorMetadata () ||
2340
- targetType == getNSObjectMetadata ()) {
2341
- // Don't rebridge if the source is already some kind of NSError.
2342
- if (srcType->isAnyClass ()
2343
- && swift_dynamicCastObjCClass (*reinterpret_cast <id*>(src),
2344
- static_cast <const ObjCClassWrapperMetadata*>(targetType)->Class ))
2345
- return _succeed (dest, src, srcType, flags);
2346
- if (auto srcErrorWitness = findErrorWitness (srcType)) {
2347
- auto error = dynamicCastValueToNSError (src, srcType,
2348
- srcErrorWitness, flags);
2349
- *reinterpret_cast <id *>(dest) = error;
2350
- return true ;
2351
- }
2352
- }
2353
- LLVM_FALLTHROUGH;
2354
- #endif
2355
-
2356
2283
case MetadataKind::ForeignClass:
2357
2284
switch (srcType->getKind ()) {
2358
2285
case MetadataKind::Class:
@@ -2388,6 +2315,21 @@ static bool swift_dynamicCastImpl(OpaqueValue *dest, OpaqueValue *src,
2388
2315
srcBridgeWitness,
2389
2316
flags);
2390
2317
}
2318
+
2319
+ #if SWIFT_OBJC_INTEROP
2320
+ // If the destination type is an NSError or NSObject, and the source type
2321
+ // is an Error, then the cast can succeed by NSError bridging.
2322
+ if (targetType == getNSErrorMetadata () ||
2323
+ targetType == getNSObjectMetadata ()) {
2324
+ if (auto srcErrorWitness = findErrorWitness (srcType)) {
2325
+ auto error = dynamicCastValueToNSError (src, srcType,
2326
+ srcErrorWitness, flags);
2327
+ *reinterpret_cast <id *>(dest) = error;
2328
+ return true ;
2329
+ }
2330
+ }
2331
+ #endif
2332
+
2391
2333
return _fail (src, srcType, targetType, flags);
2392
2334
}
2393
2335
@@ -2847,9 +2789,9 @@ static id bridgeAnythingNonVerbatimToObjectiveC(OpaqueValue *src,
2847
2789
// Handle Errors.
2848
2790
} else if (auto srcErrorWitness = findErrorWitness (srcType)) {
2849
2791
// Bridge the source value to an NSError.
2850
- auto box = swift_allocError (srcType, srcErrorWitness, src, consume)
2851
- . object ;
2852
- return _swift_stdlib_bridgeErrorToNSError ((SwiftError*)box );
2792
+ auto flags = consume ? DynamicCastFlags::TakeOnSuccess
2793
+ : DynamicCastFlags::Default ;
2794
+ return dynamicCastValueToNSError (src, srcType, srcErrorWitness, flags );
2853
2795
}
2854
2796
2855
2797
// Fall back to boxing.
0 commit comments