diff --git a/CoreFoundation/Base.subproj/CFBase.h b/CoreFoundation/Base.subproj/CFBase.h index 8a0cbde819..7858315f82 100644 --- a/CoreFoundation/Base.subproj/CFBase.h +++ b/CoreFoundation/Base.subproj/CFBase.h @@ -686,7 +686,11 @@ CFTypeRef CFMakeCollectable(CFTypeRef cf) CF_AUTOMATED_REFCOUNT_UNAVAILABLE; #if DEPLOYMENT_RUNTIME_SWIFT -#define _CF_SWIFT_RC_PINNED_FLAG (0x1) +#if TARGET_RT_64_BIT +#define _CF_SWIFT_RC_PINNED_FLAG (0x80000004ffffffff) +#else +#define _CF_SWIFT_RC_PINNED_FLAG (0x800004FF) +#endif #define _CF_CONSTANT_OBJECT_STRONG_RC ((uintptr_t)_CF_SWIFT_RC_PINNED_FLAG) #endif diff --git a/Tests/Foundation/Tests/TestBridging.swift b/Tests/Foundation/Tests/TestBridging.swift index 2700509149..63ad1c09aa 100644 --- a/Tests/Foundation/Tests/TestBridging.swift +++ b/Tests/Foundation/Tests/TestBridging.swift @@ -27,6 +27,7 @@ class TestBridging : XCTestCase { return [ ("testBridgedDescription", testBridgedDescription), ("testDynamicCast", testDynamicCast), + ("testConstantsImmortal", testConstantsImmortal), ] } @@ -70,4 +71,32 @@ class TestBridging : XCTestCase { let anyArray: Any = [TestClass()] XCTAssertNotNil(anyArray as? NSObject) } + + func testConstantsImmortal() throws { + func release(_ ptr: UnsafeRawPointer, count: Int) { + let object: Unmanaged = Unmanaged.fromOpaque(ptr) + for _ in 0...self) + let falsePtr = unsafeBitCast(falseConstant, to: UnsafePointer.self) + + let trueRefCount = truePtr.advanced(by: 1).pointee + let falseRefCount = falsePtr.advanced(by: 1).pointee + + XCTAssertEqual(trueRefCount, falseRefCount) + + release(truePtr, count: 5) + release(falsePtr, count: 5) + + XCTAssertEqual(trueRefCount, truePtr.advanced(by: 1).pointee) + XCTAssertEqual(falseRefCount, falsePtr.advanced(by: 1).pointee) + } }