@@ -872,6 +872,16 @@ swift_dynamicCastMetatypeToObjectUnconditional(const Metadata *metatype) {
872
872
}
873
873
}
874
874
}
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
+
875
885
#endif
876
886
877
887
// / Perform a dynamic cast to an existential type.
@@ -1040,7 +1050,20 @@ static bool _dynamicCastToExistential(OpaqueValue *dest,
1040
1050
targetType->Protocols ,
1041
1051
&errorWitness))
1042
1052
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
+
1044
1067
BoxPair destBox = swift_allocError (srcDynamicType, errorWitness,
1045
1068
srcDynamicValue,
1046
1069
/* isTake*/ canTake && (flags & DynamicCastFlags::TakeOnSuccess));
@@ -2006,20 +2029,11 @@ static bool _dynamicCastToFunction(OpaqueValue *dest,
2006
2029
}
2007
2030
2008
2031
#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
-
2018
2032
static id dynamicCastValueToNSError (OpaqueValue *src,
2019
2033
const Metadata *srcType,
2020
2034
const WitnessTable *srcErrorWitness,
2021
2035
DynamicCastFlags flags) {
2022
- // Check whether there is an embedded error .
2036
+ // Check whether there is an embedded NSError .
2023
2037
if (auto embedded =
2024
2038
swift_stdlib_getErrorEmbeddedNSErrorIndirect (src, srcType,
2025
2039
srcErrorWitness)) {
0 commit comments