mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
This replaces a number of `#include`-s like this:
```
#include "../../../stdlib/public/SwiftShims/Visibility.h"
```
with this:
```
#include "swift/shims/Visibility.h"
```
This is needed to allow SwiftCompilerSources to use C++ headers which include SwiftShims headers. Currently trying to do that results in errors:
```
swift/swift/include/swift/Demangling/../../../stdlib/public/SwiftShims/module.modulemap:1:8: error: redefinition of module 'SwiftShims'
module SwiftShims {
^
Builds.noindex/swift/swift/bootstrapping0/lib/swift/shims/module.modulemap:1:8: note: previously defined here
module SwiftShims {
^
```
This happens because the headers in both the source dir and the build dir refer to SwiftShims headers by relative path, and both the source root and the build root contain SwiftShims headers (which are equivalent, but since they are located in different dirs, Clang treats them as different modules).
117 lines
4.3 KiB
Plaintext
117 lines
4.3 KiB
Plaintext
//===--- FoundationHelpers.mm - Cocoa framework helper shims --------------===//
|
|
//
|
|
// This source file is part of the Swift.org open source project
|
|
//
|
|
// Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
|
|
// Licensed under Apache License v2.0 with Runtime Library Exception
|
|
//
|
|
// See https://swift.org/LICENSE.txt for license information
|
|
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file contains shims to refer to framework functions required by the
|
|
// standard library. The stdlib cannot directly import these modules without
|
|
// introducing circular dependencies.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "swift/Runtime/Config.h"
|
|
|
|
#if SWIFT_OBJC_INTEROP
|
|
#import <CoreFoundation/CoreFoundation.h>
|
|
#include "swift/shims/CoreFoundationShims.h"
|
|
#import <objc/runtime.h>
|
|
#include "swift/Runtime/Once.h"
|
|
#include <dlfcn.h>
|
|
|
|
typedef enum {
|
|
dyld_objc_string_kind
|
|
} DyldObjCConstantKind;
|
|
|
|
using namespace swift;
|
|
|
|
static CFHashCode(*_CFStringHashCString)(const uint8_t *bytes, CFIndex len);
|
|
static CFHashCode(*_CFStringHashNSString)(id str);
|
|
static CFTypeID(*_CFGetTypeID)(CFTypeRef obj);
|
|
static CFTypeID _CFStringTypeID = 0;
|
|
static swift_once_t initializeBridgingFuncsOnce;
|
|
|
|
extern "C" bool _dyld_is_objc_constant(DyldObjCConstantKind kind,
|
|
const void *addr) SWIFT_RUNTIME_WEAK_IMPORT;
|
|
|
|
static void _initializeBridgingFunctionsImpl(void *ctxt) {
|
|
auto getStringTypeID =
|
|
(CFTypeID(*)(void))
|
|
dlsym(RTLD_DEFAULT, "CFStringGetTypeID");
|
|
assert(getStringTypeID);
|
|
_CFStringTypeID = getStringTypeID();
|
|
|
|
_CFGetTypeID = (CFTypeID(*)(CFTypeRef obj))dlsym(RTLD_DEFAULT, "CFGetTypeID");
|
|
_CFStringHashNSString = (CFHashCode(*)(id))dlsym(RTLD_DEFAULT,
|
|
"CFStringHashNSString");
|
|
_CFStringHashCString = (CFHashCode(*)(const uint8_t *, CFIndex))dlsym(
|
|
RTLD_DEFAULT,
|
|
"CFStringHashCString");
|
|
}
|
|
|
|
static inline void initializeBridgingFunctions() {
|
|
swift_once(&initializeBridgingFuncsOnce,
|
|
_initializeBridgingFunctionsImpl,
|
|
nullptr);
|
|
}
|
|
|
|
__swift_uint8_t
|
|
_swift_stdlib_isNSString(id obj) {
|
|
initializeBridgingFunctions();
|
|
return _CFGetTypeID((CFTypeRef)obj) == _CFStringTypeID ? 1 : 0;
|
|
}
|
|
|
|
_swift_shims_CFHashCode
|
|
_swift_stdlib_CFStringHashNSString(id _Nonnull obj) {
|
|
initializeBridgingFunctions();
|
|
return _CFStringHashNSString(obj);
|
|
}
|
|
|
|
_swift_shims_CFHashCode
|
|
_swift_stdlib_CFStringHashCString(const _swift_shims_UInt8 * _Nonnull bytes,
|
|
_swift_shims_CFIndex length) {
|
|
initializeBridgingFunctions();
|
|
return _CFStringHashCString(bytes, length);
|
|
}
|
|
|
|
const __swift_uint8_t *
|
|
_swift_stdlib_NSStringCStringUsingEncodingTrampoline(id _Nonnull obj,
|
|
unsigned long encoding) {
|
|
typedef __swift_uint8_t * _Nullable (*cStrImplPtr)(id, SEL, unsigned long);
|
|
cStrImplPtr imp = (cStrImplPtr)class_getMethodImplementation([obj superclass],
|
|
@selector(cStringUsingEncoding:));
|
|
return imp(obj, @selector(cStringUsingEncoding:), encoding);
|
|
}
|
|
|
|
__swift_uint8_t
|
|
_swift_stdlib_NSStringGetCStringTrampoline(id _Nonnull obj,
|
|
_swift_shims_UInt8 *buffer,
|
|
_swift_shims_CFIndex maxLength,
|
|
unsigned long encoding) {
|
|
typedef __swift_uint8_t (*getCStringImplPtr)(id,
|
|
SEL,
|
|
_swift_shims_UInt8 *,
|
|
_swift_shims_CFIndex,
|
|
unsigned long);
|
|
SEL sel = @selector(getCString:maxLength:encoding:);
|
|
getCStringImplPtr imp = (getCStringImplPtr)class_getMethodImplementation([obj superclass], sel);
|
|
|
|
return imp(obj, sel, buffer, maxLength, encoding);
|
|
|
|
}
|
|
|
|
__swift_uint8_t
|
|
_swift_stdlib_dyld_is_objc_constant_string(const void *addr) {
|
|
return (SWIFT_RUNTIME_WEAK_CHECK(_dyld_is_objc_constant)
|
|
&& SWIFT_RUNTIME_WEAK_USE(_dyld_is_objc_constant(dyld_objc_string_kind, addr))) ? 1 : 0;
|
|
}
|
|
|
|
#endif
|
|
|