@@ -220,6 +220,21 @@ static Class getSwiftNativeNSErrorClass() {
220
220
object_dispose ((id )error);
221
221
}
222
222
223
+ // / Look up a symbol that points to something else. Treats the symbol as
224
+ // / a void** and dereferences it if it's non-NULL. Returns NULL if the
225
+ // / symbol can't be found or if the value is NULL.
226
+ static void *dynamicLookupSymbol (const char *name) {
227
+ void **ptr = reinterpret_cast <void **>(dlsym (RTLD_DEFAULT, name));
228
+ if (!ptr) return nullptr ;
229
+ return *ptr;
230
+ }
231
+
232
+ // / Look up an indirect pointer to a mangled Swift symbol, automatically
233
+ // / prepending the ErrorObjectLookup_ prefix. Used to find the various
234
+ // / Foundation overlay symbols for Error bridging.
235
+ #define DYNAMIC_LOOKUP_SYMBOL (symbol ) \
236
+ dynamicLookupSymbol (" ErrorObjectLookup_" MANGLE_AS_STRING(MANGLE_SYM(symbol)))
237
+
223
238
static const WitnessTable *getNSErrorConformanceToError() {
224
239
// CFError and NSError are toll-free-bridged, so we can use either type's
225
240
// witness table interchangeably. CFError's is potentially slightly more
@@ -228,8 +243,7 @@ static Class getSwiftNativeNSErrorClass() {
228
243
// to assume that that's been linked in if a user is using NSError in their
229
244
// Swift source.
230
245
231
- auto TheWitnessTable = SWIFT_LAZY_CONSTANT (dlsym (RTLD_DEFAULT,
232
- MANGLE_AS_STRING (MANGLE_SYM (So10CFErrorRefas5Error10FoundationWa))));
246
+ auto TheWitnessTable = SWIFT_LAZY_CONSTANT (DYNAMIC_LOOKUP_SYMBOL (So10CFErrorRefas5Error10FoundationWa));
233
247
assert (TheWitnessTable &&
234
248
" Foundation overlay not loaded, or 'CFError : Error' conformance "
235
249
" not available" );
@@ -238,8 +252,7 @@ static Class getSwiftNativeNSErrorClass() {
238
252
}
239
253
240
254
static const HashableWitnessTable *getNSErrorConformanceToHashable () {
241
- auto TheWitnessTable = SWIFT_LAZY_CONSTANT (dlsym (RTLD_DEFAULT,
242
- MANGLE_AS_STRING (MANGLE_SYM (So8NSObjectCs8Hashable10ObjectiveCWa))));
255
+ auto TheWitnessTable = SWIFT_LAZY_CONSTANT (DYNAMIC_LOOKUP_SYMBOL (So8NSObjectCs8Hashable10ObjectiveCWa));
243
256
assert (TheWitnessTable &&
244
257
" ObjectiveC overlay not loaded, or 'NSObject : Hashable' conformance "
245
258
" not available" );
@@ -379,8 +392,7 @@ typedef SWIFT_CC(swift)
379
392
// public func Foundation._getErrorDefaultUserInfo<T: Error>(_ error: T)
380
393
// -> AnyObject?
381
394
auto foundationGetDefaultUserInfo = SWIFT_LAZY_CONSTANT (
382
- reinterpret_cast <GetDefaultFn*> (dlsym (RTLD_DEFAULT,
383
- MANGLE_AS_STRING (MANGLE_SYM (10Foundation24_getErrorDefaultUserInfoyyXlSgxs0C0RzlF)))));
395
+ reinterpret_cast <GetDefaultFn*> (DYNAMIC_LOOKUP_SYMBOL (10Foundation24_getErrorDefaultUserInfoyyXlSgxs0C0RzlF)));
384
396
if (!foundationGetDefaultUserInfo) {
385
397
SWIFT_CC_PLUSONE_GUARD (T->vw_destroy (error));
386
398
return nullptr ;
@@ -520,12 +532,10 @@ typedef SWIFT_CC(swift)
520
532
bool BridgeFn (NSError *, OpaqueValue*, const Metadata *,
521
533
const WitnessTable *);
522
534
auto bridgeNSErrorToError = SWIFT_LAZY_CONSTANT (
523
- reinterpret_cast <BridgeFn*>(dlsym (RTLD_DEFAULT,
524
- MANGLE_AS_STRING (MANGLE_SYM (10Foundation21_bridgeNSErrorToError_3outSbSo0C0C_SpyxGtAA021_ObjectiveCBridgeableE0RzlF)))));
535
+ reinterpret_cast <BridgeFn*>(DYNAMIC_LOOKUP_SYMBOL (10Foundation21_bridgeNSErrorToError_3outSbSo0C0C_SpyxGtAA021_ObjectiveCBridgeableE0RzlF)));
525
536
// protocol _ObjectiveCBridgeableError
526
537
auto TheObjectiveCBridgeableError = SWIFT_LAZY_CONSTANT (
527
- reinterpret_cast <const ProtocolDescriptor *>(dlsym (RTLD_DEFAULT,
528
- MANGLE_AS_STRING (MANGLE_SYM (10Foundation26_ObjectiveCBridgeableErrorMp)))));
538
+ reinterpret_cast <const ProtocolDescriptor *>(DYNAMIC_LOOKUP_SYMBOL (10Foundation26_ObjectiveCBridgeableErrorMp)));
529
539
530
540
// If the Foundation overlay isn't loaded, then arbitrary NSErrors can't be
531
541
// bridged.
0 commit comments