@@ -872,6 +872,16 @@ swift_dynamicCastMetatypeToObjectUnconditional(const Metadata *metatype) {
872872 }
873873 }
874874}
875+
876+ // @_silgen_name("swift_stdlib_getErrorEmbeddedNSErrorIndirect")
877+ // public func _stdlib_getErrorEmbeddedNSErrorIndirect<T : Error>(
878+ // / _ x: UnsafePointer<T>) -> AnyObject?
879+ SWIFT_CC (swift)
880+ extern "C" id swift_stdlib_getErrorEmbeddedNSErrorIndirect(
881+ const OpaqueValue *error,
882+ const Metadata *T,
883+ const WitnessTable *Error);
884+
875885#endif
876886
877887// / Perform a dynamic cast to an existential type.
@@ -1040,7 +1050,20 @@ static bool _dynamicCastToExistential(OpaqueValue *dest,
10401050 targetType->Protocols ,
10411051 &errorWitness))
10421052 return _fail (src, srcType, targetType, flags, srcDynamicType);
1043-
1053+
1054+ #if SWIFT_OBJC_INTEROP
1055+ // Check whether there is an embedded NSError. If so, use that for our Error
1056+ // representation.
1057+ if (auto embedded =
1058+ swift_stdlib_getErrorEmbeddedNSErrorIndirect (srcDynamicValue,
1059+ srcDynamicType,
1060+ errorWitness)) {
1061+ *destBoxAddr = reinterpret_cast <SwiftError*>(embedded);
1062+ maybeDeallocateSourceAfterSuccess ();
1063+ return true ;
1064+ }
1065+ #endif
1066+
10441067 BoxPair destBox = swift_allocError (srcDynamicType, errorWitness,
10451068 srcDynamicValue,
10461069 /* isTake*/ canTake && (flags & DynamicCastFlags::TakeOnSuccess));
@@ -2006,20 +2029,11 @@ static bool _dynamicCastToFunction(OpaqueValue *dest,
20062029}
20072030
20082031#if SWIFT_OBJC_INTEROP
2009- // @_silgen_name("swift_stdlib_getErrorEmbeddedNSErrorIndirect")
2010- // public func _stdlib_getErrorEmbeddedNSErrorIndirect<T : Error>(
2011- // / _ x: UnsafePointer<T>) -> AnyObject?
2012- SWIFT_CC (swift)
2013- extern "C" id swift_stdlib_getErrorEmbeddedNSErrorIndirect(
2014- const OpaqueValue *error,
2015- const Metadata *T,
2016- const WitnessTable *Error);
2017-
20182032static id dynamicCastValueToNSError (OpaqueValue *src,
20192033 const Metadata *srcType,
20202034 const WitnessTable *srcErrorWitness,
20212035 DynamicCastFlags flags) {
2022- // Check whether there is an embedded error .
2036+ // Check whether there is an embedded NSError .
20232037 if (auto embedded =
20242038 swift_stdlib_getErrorEmbeddedNSErrorIndirect (src, srcType,
20252039 srcErrorWitness)) {
0 commit comments