@@ -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,14 +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
- return swift_dynamicCast (dest, src, swift_getObjectType ((HeapObject*)obj),
1306
- targetType, flags);
1307
- }
1308
- #endif
1309
1283
return _dynamicCastUnknownClassIndirect (dest, obj, targetType, flags);
1310
1284
}
1311
1285
case ExistentialTypeRepresentation::Opaque: {
@@ -1814,32 +1788,6 @@ static bool _dynamicCastToFunction(OpaqueValue *dest,
1814
1788
}
1815
1789
}
1816
1790
1817
- /* *****************************************************************************/
1818
- /* ***************************** Bridging NSError ******************************/
1819
- /* *****************************************************************************/
1820
-
1821
- #if SWIFT_OBJC_INTEROP
1822
- static id dynamicCastValueToNSError (OpaqueValue *src,
1823
- const Metadata *srcType,
1824
- const WitnessTable *srcErrorWitness,
1825
- DynamicCastFlags flags) {
1826
- // Check whether there is an embedded NSError.
1827
- if (auto embedded = getErrorEmbeddedNSErrorIndirect (src, srcType,
1828
- srcErrorWitness)) {
1829
- if (flags & DynamicCastFlags::TakeOnSuccess)
1830
- srcType->vw_destroy (src);
1831
-
1832
- return embedded;
1833
- }
1834
-
1835
- BoxPair errorBox = swift_allocError (srcType, srcErrorWitness, src,
1836
- /* isTake*/ flags & DynamicCastFlags::TakeOnSuccess);
1837
- auto *error = (SwiftError *)errorBox.object ;
1838
- return _swift_stdlib_bridgeErrorToNSError (error);
1839
- }
1840
-
1841
- #endif
1842
-
1843
1791
/* *****************************************************************************/
1844
1792
/* ******************************** Optionals **********************************/
1845
1793
/* *****************************************************************************/
@@ -2332,26 +2280,6 @@ static bool swift_dynamicCastImpl(OpaqueValue *dest, OpaqueValue *src,
2332
2280
// Casts to class type.
2333
2281
case MetadataKind::Class:
2334
2282
case MetadataKind::ObjCClassWrapper:
2335
- #if SWIFT_OBJC_INTEROP
2336
- // If the destination type is an NSError or NSObject, and the source type
2337
- // is an Error, then the cast can succeed by NSError bridging.
2338
- if (targetType == getNSErrorMetadata () ||
2339
- targetType == getNSObjectMetadata ()) {
2340
- // Don't rebridge if the source is already some kind of NSError.
2341
- if (srcType->isAnyClass ()
2342
- && swift_dynamicCastObjCClass (*reinterpret_cast <id*>(src),
2343
- static_cast <const ObjCClassWrapperMetadata*>(targetType)->Class ))
2344
- return _succeed (dest, src, srcType, flags);
2345
- if (auto srcErrorWitness = findErrorWitness (srcType)) {
2346
- auto error = dynamicCastValueToNSError (src, srcType,
2347
- srcErrorWitness, flags);
2348
- *reinterpret_cast <id *>(dest) = error;
2349
- return true ;
2350
- }
2351
- }
2352
- LLVM_FALLTHROUGH;
2353
- #endif
2354
-
2355
2283
case MetadataKind::ForeignClass:
2356
2284
switch (srcType->getKind ()) {
2357
2285
case MetadataKind::Class:
@@ -2387,6 +2315,21 @@ static bool swift_dynamicCastImpl(OpaqueValue *dest, OpaqueValue *src,
2387
2315
srcBridgeWitness,
2388
2316
flags);
2389
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
+
2390
2333
return _fail (src, srcType, targetType, flags);
2391
2334
}
2392
2335
@@ -2846,9 +2789,9 @@ static id bridgeAnythingNonVerbatimToObjectiveC(OpaqueValue *src,
2846
2789
// Handle Errors.
2847
2790
} else if (auto srcErrorWitness = findErrorWitness (srcType)) {
2848
2791
// Bridge the source value to an NSError.
2849
- auto box = swift_allocError (srcType, srcErrorWitness, src, consume)
2850
- . object ;
2851
- return _swift_stdlib_bridgeErrorToNSError ((SwiftError*)box );
2792
+ auto flags = consume ? DynamicCastFlags::TakeOnSuccess
2793
+ : DynamicCastFlags::Default ;
2794
+ return dynamicCastValueToNSError (src, srcType, srcErrorWitness, flags );
2852
2795
}
2853
2796
2854
2797
// Fall back to boxing.
0 commit comments