Skip to content

Commit fd5e39a

Browse files
authored
Merge pull request #40 from p-x9/feature/fix-key-on-release-build
Fixed associated object key issues in release builds
2 parents 18f87a7 + d41fe61 commit fd5e39a

File tree

3 files changed

+144
-40
lines changed

3 files changed

+144
-40
lines changed

Sources/AssociatedObjectPlugin/AssociatedObjectMacro.swift

+4-2
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,8 @@ extension AssociatedObjectMacro: PeerMacro {
5151
}
5252

5353
let keyAccessor = """
54-
_associated_object_key()
54+
let f: @convention(c) () -> Void = {}
55+
return unsafeBitCast(f, to: UnsafeRawPointer.self)
5556
"""
5657

5758
let keyDecl = VariableDeclSyntax(
@@ -95,7 +96,8 @@ extension AssociatedObjectMacro: PeerMacro {
9596
// nested peer macro will not expand
9697
// https://github.com/apple/swift/issues/69073
9798
let keyAccessor = """
98-
_associated_object_key()
99+
let f: @convention(c) () -> Void = {}
100+
return unsafeBitCast(f, to: UnsafeRawPointer.self)
99101
"""
100102
let flagKeyDecl = VariableDeclSyntax(
101103
attributes: [

Tests/AssociatedObjectTests/AssociatedObjectTests.swift

+86-20
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,9 @@ final class AssociatedObjectTests: XCTestCase {
5555
}
5656
5757
@inline(never) static var __associated_stringKey: UnsafeRawPointer {
58-
_associated_object_key()
58+
let f: @convention(c) () -> Void = {
59+
}
60+
return unsafeBitCast(f, to: UnsafeRawPointer.self)
5961
}
6062
"""
6163
}
@@ -98,7 +100,9 @@ final class AssociatedObjectTests: XCTestCase {
98100
}
99101
100102
@inline(never) static var __associated_intKey: UnsafeRawPointer {
101-
_associated_object_key()
103+
let f: @convention(c) () -> Void = {
104+
}
105+
return unsafeBitCast(f, to: UnsafeRawPointer.self)
102106
}
103107
"""
104108
}
@@ -141,7 +145,9 @@ final class AssociatedObjectTests: XCTestCase {
141145
}
142146
143147
@inline(never) static var __associated_floatKey: UnsafeRawPointer {
144-
_associated_object_key()
148+
let f: @convention(c) () -> Void = {
149+
}
150+
return unsafeBitCast(f, to: UnsafeRawPointer.self)
145151
}
146152
"""
147153
}
@@ -184,7 +190,9 @@ final class AssociatedObjectTests: XCTestCase {
184190
}
185191
186192
@inline(never) static var __associated_doubleKey: UnsafeRawPointer {
187-
_associated_object_key()
193+
let f: @convention(c) () -> Void = {
194+
}
195+
return unsafeBitCast(f, to: UnsafeRawPointer.self)
188196
}
189197
"""
190198
}
@@ -227,7 +235,9 @@ final class AssociatedObjectTests: XCTestCase {
227235
}
228236
229237
@inline(never) static var __associated_stringKey: UnsafeRawPointer {
230-
_associated_object_key()
238+
let f: @convention(c) () -> Void = {
239+
}
240+
return unsafeBitCast(f, to: UnsafeRawPointer.self)
231241
}
232242
"""
233243
}
@@ -260,7 +270,9 @@ final class AssociatedObjectTests: XCTestCase {
260270
}
261271
262272
@inline(never) static var __associated_stringKey: UnsafeRawPointer {
263-
_associated_object_key()
273+
let f: @convention(c) () -> Void = {
274+
}
275+
return unsafeBitCast(f, to: UnsafeRawPointer.self)
264276
}
265277
"""
266278
}
@@ -293,7 +305,9 @@ final class AssociatedObjectTests: XCTestCase {
293305
}
294306
295307
@inline(never) static var __associated_stringKey: UnsafeRawPointer {
296-
_associated_object_key()
308+
let f: @convention(c) () -> Void = {
309+
}
310+
return unsafeBitCast(f, to: UnsafeRawPointer.self)
297311
}
298312
"""
299313
}
@@ -326,7 +340,9 @@ final class AssociatedObjectTests: XCTestCase {
326340
}
327341
328342
@inline(never) static var __associated_stringKey: UnsafeRawPointer {
329-
_associated_object_key()
343+
let f: @convention(c) () -> Void = {
344+
}
345+
return unsafeBitCast(f, to: UnsafeRawPointer.self)
330346
}
331347
"""
332348
}
@@ -370,13 +386,17 @@ final class AssociatedObjectTests: XCTestCase {
370386
}
371387
372388
@inline(never) static var __associated_stringKey: UnsafeRawPointer {
373-
_associated_object_key()
389+
let f: @convention(c) () -> Void = {
390+
}
391+
return unsafeBitCast(f, to: UnsafeRawPointer.self)
374392
}
375393
376394
@_AssociatedObject(.retain(.nonatomic)) var __associated_stringIsSet: Bool = false
377395
378396
@inline(never) static var __associated___associated_stringIsSetKey: UnsafeRawPointer {
379-
_associated_object_key()
397+
let f: @convention(c) () -> Void = {
398+
}
399+
return unsafeBitCast(f, to: UnsafeRawPointer.self)
380400
}
381401
"""
382402
}
@@ -419,7 +439,9 @@ final class AssociatedObjectTests: XCTestCase {
419439
}
420440
421441
@inline(never) static var __associated_boolKey: UnsafeRawPointer {
422-
_associated_object_key()
442+
let f: @convention(c) () -> Void = {
443+
}
444+
return unsafeBitCast(f, to: UnsafeRawPointer.self)
423445
}
424446
"""
425447
}
@@ -462,7 +484,9 @@ final class AssociatedObjectTests: XCTestCase {
462484
}
463485
464486
@inline(never) static var __associated_intArrayKey: UnsafeRawPointer {
465-
_associated_object_key()
487+
let f: @convention(c) () -> Void = {
488+
}
489+
return unsafeBitCast(f, to: UnsafeRawPointer.self)
466490
}
467491
"""
468492
}
@@ -495,7 +519,9 @@ final class AssociatedObjectTests: XCTestCase {
495519
}
496520
497521
@inline(never) static var __associated_boolKey: UnsafeRawPointer {
498-
_associated_object_key()
522+
let f: @convention(c) () -> Void = {
523+
}
524+
return unsafeBitCast(f, to: UnsafeRawPointer.self)
499525
}
500526
"""
501527
}
@@ -538,7 +564,9 @@ final class AssociatedObjectTests: XCTestCase {
538564
}
539565
540566
@inline(never) static var __associated_dicKey: UnsafeRawPointer {
541-
_associated_object_key()
567+
let f: @convention(c) () -> Void = {
568+
}
569+
return unsafeBitCast(f, to: UnsafeRawPointer.self)
542570
}
543571
"""
544572
}
@@ -597,7 +625,9 @@ final class AssociatedObjectTests: XCTestCase {
597625
}
598626
599627
@inline(never) static var __associated_stringKey: UnsafeRawPointer {
600-
_associated_object_key()
628+
let f: @convention(c) () -> Void = {
629+
}
630+
return unsafeBitCast(f, to: UnsafeRawPointer.self)
601631
}
602632
"""
603633
}
@@ -654,7 +684,9 @@ final class AssociatedObjectTests: XCTestCase {
654684
}
655685
656686
@inline(never) static var __associated_stringKey: UnsafeRawPointer {
657-
_associated_object_key()
687+
let f: @convention(c) () -> Void = {
688+
}
689+
return unsafeBitCast(f, to: UnsafeRawPointer.self)
658690
}
659691
"""
660692
}
@@ -725,7 +757,9 @@ final class AssociatedObjectTests: XCTestCase {
725757
}
726758
727759
@inline(never) static var __associated_stringKey: UnsafeRawPointer {
728-
_associated_object_key()
760+
let f: @convention(c) () -> Void = {
761+
}
762+
return unsafeBitCast(f, to: UnsafeRawPointer.self)
729763
}
730764
"""
731765
}
@@ -784,7 +818,9 @@ final class AssociatedObjectTests: XCTestCase {
784818
}
785819
786820
@inline(never) static var __associated_stringKey: UnsafeRawPointer {
787-
_associated_object_key()
821+
let f: @convention(c) () -> Void = {
822+
}
823+
return unsafeBitCast(f, to: UnsafeRawPointer.self)
788824
}
789825
"""
790826
}
@@ -841,7 +877,9 @@ final class AssociatedObjectTests: XCTestCase {
841877
}
842878
843879
@inline(never) static var __associated_stringKey: UnsafeRawPointer {
844-
_associated_object_key()
880+
let f: @convention(c) () -> Void = {
881+
}
882+
return unsafeBitCast(f, to: UnsafeRawPointer.self)
845883
}
846884
"""
847885
}
@@ -884,7 +922,9 @@ final class AssociatedObjectTests: XCTestCase {
884922
}
885923
886924
@inline(never) static var __associated_stringKey: UnsafeRawPointer {
887-
_associated_object_key()
925+
let f: @convention(c) () -> Void = {
926+
}
927+
return unsafeBitCast(f, to: UnsafeRawPointer.self)
888928
}
889929
"""
890930
}
@@ -1049,4 +1089,30 @@ extension AssociatedObjectTests {
10491089
XCTAssertEqual(item.definedInProtocol, "modified")
10501090
}
10511091
}
1092+
1093+
extension AssociatedObjectTests {
1094+
func testKeysUnique() {
1095+
let keys = [
1096+
ClassType.__associated_intKey,
1097+
ClassType.__associated_doubleKey,
1098+
ClassType.__associated_stringKey,
1099+
ClassType.__associated_boolKey,
1100+
ClassType.__associated_optionalIntKey,
1101+
ClassType.__associated_optionalDoubleKey,
1102+
ClassType.__associated_optionalStringKey,
1103+
ClassType.__associated_optionalBoolKey,
1104+
ClassType.__associated_implicitlyUnwrappedStringKey,
1105+
ClassType.__associated_intArrayKey,
1106+
ClassType.__associated_doubleArrayKey,
1107+
ClassType.__associated_stringArrayKey,
1108+
ClassType.__associated_boolArrayKey,
1109+
ClassType.__associated_optionalIntArrayKey,
1110+
ClassType.__associated_optionalDoubleArrayKey,
1111+
ClassType.__associated_optionalStringArrayKey,
1112+
ClassType.__associated_optionalBoolArrayKey,
1113+
ClassType.__associated_classTypeKey,
1114+
]
1115+
XCTAssertEqual(Set(keys).count, keys.count)
1116+
}
1117+
}
10521118
#endif

0 commit comments

Comments
 (0)