@@ -127,15 +127,15 @@ static uint64_t readTagBytes(const uint8_t *addr, uint8_t byteCount) {
127
127
uint64_t TAG = 0 ; \
128
128
uintptr_t OFFSET = 0 ; \
129
129
\
130
- _Pragma (" clang diagnostic push" ) \
131
- _Pragma ( " clang diagnostic ignored \" -Wgnu-label-as-value\" " ) \
132
- const void *dispatchTable[] = { \
133
- &&done, &&Error, &&NativeStrong, &&NativeUnowned, \
134
- &&NativeWeak, &&Unknown, &&UnknownUnowned, &&UnknownWeak, \
135
- &&Bridge, &&Block, &&ObjC, &&Custom, \
136
- &&Metatype, &&Generic, &&Existential, &&Resilient, \
137
- &&Default, &&Default, &&Default, &&Default, \
138
- &&Default, &&Default, &&Default, \
130
+ _Pragma (" clang diagnostic push" ) _Pragma ( \
131
+ " clang diagnostic ignored \" -Wgnu-label-as-value\" " ) \
132
+ const void *dispatchTable[] = { \
133
+ &&done, &&Error, &&NativeStrong, &&NativeUnowned, \
134
+ &&NativeWeak, &&Unknown, &&UnknownUnowned, &&UnknownWeak, \
135
+ &&Bridge, &&Block, &&ObjC, &&NativeSwiftObjC, \
136
+ &&Metatype, &&Generic, &&Existential, &&Resilient, \
137
+ &&Default, &&Default, &&Default, &&Default, \
138
+ &&Default, &&Default, &&Default, \
139
139
}; \
140
140
\
141
141
[[clang::nomerge]] { \
@@ -194,8 +194,9 @@ static uint64_t readTagBytes(const uint8_t *addr, uint8_t byteCount) {
194
194
CONTINUE (METADATA, READER, ADDR_OFFSET, __VA_ARGS__); \
195
195
} \
196
196
[[clang::nomerge]] { \
197
- Custom: \
198
- swift_unreachable (" " ); \
197
+ NativeSwiftObjC: \
198
+ FN_TABLE[11 ](METADATA, READER, ADDR_OFFSET, __VA_ARGS__); \
199
+ CONTINUE (METADATA, READER, ADDR_OFFSET, __VA_ARGS__); \
199
200
} \
200
201
[[clang::nomerge]] { \
201
202
Metatype: \
@@ -782,9 +783,18 @@ static void objcStrongDestroy(const Metadata *metadata,
782
783
#if SWIFT_OBJC_INTEROP
783
784
uintptr_t object = *(uintptr_t *)(addr + addrOffset);
784
785
addrOffset += sizeof (objc_object*);
785
- if (object & _swift_abi_ObjCReservedBitsMask)
786
- return ;
786
+ objc_release ((objc_object *)object);
787
+ #else
788
+ swift_unreachable (" ObjC interop is not available on this platform" );
789
+ #endif
790
+ }
787
791
792
+ static void nativeSwiftObjcStrongDestroy (const Metadata *metadata,
793
+ LayoutStringReader1 &reader,
794
+ uintptr_t &addrOffset, uint8_t *addr) {
795
+ #if SWIFT_OBJC_INTEROP
796
+ uintptr_t object = *(uintptr_t *)(addr + addrOffset);
797
+ addrOffset += sizeof (objc_object *);
788
798
object &= ~_swift_abi_SwiftSpareBitsMask;
789
799
objc_release ((objc_object *)object);
790
800
#else
@@ -838,7 +848,7 @@ constexpr DestrFn destroyTable[] = {
838
848
&bridgeDestroy,
839
849
&blockDestroy,
840
850
&objcStrongDestroy,
841
- nullptr , // Custom
851
+ &nativeSwiftObjcStrongDestroy,
842
852
&metatypeDestroy,
843
853
nullptr , // Generic
844
854
&existentialDestroy,
@@ -1006,8 +1016,21 @@ static void objcStrongRetain(const Metadata *metadata,
1006
1016
uintptr_t object = *(uintptr_t *)(src + _addrOffset);
1007
1017
memcpy (dest + _addrOffset, &object, sizeof (objc_object *));
1008
1018
addrOffset = _addrOffset + sizeof (objc_object *);
1009
- if (object & _swift_abi_ObjCReservedBitsMask)
1010
- return ;
1019
+ objc_retain ((objc_object *)object);
1020
+ #else
1021
+ swift_unreachable (" ObjC interop is not available on this platform" );
1022
+ #endif
1023
+ }
1024
+
1025
+ static void nativeSwiftObjcStrongRetain (const Metadata *metadata,
1026
+ LayoutStringReader1 &reader,
1027
+ uintptr_t &addrOffset, uint8_t *dest,
1028
+ uint8_t *src) {
1029
+ #if SWIFT_OBJC_INTEROP
1030
+ uintptr_t _addrOffset = addrOffset;
1031
+ uintptr_t object = *(uintptr_t *)(src + _addrOffset);
1032
+ memcpy (dest + _addrOffset, &object, sizeof (objc_object *));
1033
+ addrOffset = _addrOffset + sizeof (objc_object *);
1011
1034
object &= ~_swift_abi_SwiftSpareBitsMask;
1012
1035
objc_retain ((objc_object *)object);
1013
1036
#else
@@ -1069,7 +1092,7 @@ constexpr InitFn initWithCopyTable[] = {
1069
1092
&bridgeRetain,
1070
1093
&blockCopy,
1071
1094
&objcStrongRetain,
1072
- nullptr , // Custom
1095
+ &nativeSwiftObjcStrongRetain,
1073
1096
&metatypeInitWithCopy,
1074
1097
nullptr , // Generic
1075
1098
&existentialInitWithCopy,
@@ -1429,15 +1452,29 @@ static void objcStrongAssignWithCopy(const Metadata *metadata,
1429
1452
memcpy (dest + _addrOffset, &srcObject, sizeof (objc_object*));
1430
1453
addrOffset = _addrOffset + sizeof (objc_object*);
1431
1454
1432
- if (!(destObject & _swift_abi_ObjCReservedBitsMask)) {
1433
- destObject &= ~_swift_abi_SwiftSpareBitsMask;
1434
- objc_release ((objc_object *)destObject);
1435
- }
1455
+ objc_release ((objc_object *)destObject);
1456
+ objc_retain ((objc_object *)srcObject);
1457
+ #else
1458
+ swift_unreachable (" ObjC interop is not available on this platform" );
1459
+ #endif
1460
+ }
1436
1461
1437
- if (!(srcObject & _swift_abi_ObjCReservedBitsMask)) {
1438
- srcObject &= ~_swift_abi_SwiftSpareBitsMask;
1439
- objc_retain ((objc_object *)srcObject);
1440
- }
1462
+ static void nativeSwiftObjcStrongAssignWithCopy (const Metadata *metadata,
1463
+ LayoutStringReader1 &reader,
1464
+ uintptr_t &addrOffset,
1465
+ uint8_t *dest, uint8_t *src) {
1466
+ #if SWIFT_OBJC_INTEROP
1467
+ uintptr_t _addrOffset = addrOffset;
1468
+ uintptr_t destObject = *(uintptr_t *)(dest + _addrOffset);
1469
+ uintptr_t srcObject = *(uintptr_t *)(src + _addrOffset);
1470
+ memcpy (dest + _addrOffset, &srcObject, sizeof (objc_object *));
1471
+ addrOffset = _addrOffset + sizeof (objc_object *);
1472
+
1473
+ destObject &= ~_swift_abi_SwiftSpareBitsMask;
1474
+ objc_release ((objc_object *)destObject);
1475
+
1476
+ srcObject &= ~_swift_abi_SwiftSpareBitsMask;
1477
+ objc_retain ((objc_object *)srcObject);
1441
1478
#else
1442
1479
swift_unreachable (" ObjC interop is not available on this platform" );
1443
1480
#endif
@@ -1873,7 +1910,7 @@ constexpr InitFn assignWithCopyTable[] = {
1873
1910
&bridgeAssignWithCopy,
1874
1911
&blockAssignWithCopy,
1875
1912
&objcStrongAssignWithCopy,
1876
- nullptr , // Custom
1913
+ &nativeSwiftObjcStrongAssignWithCopy,
1877
1914
&metatypeAssignWithCopy,
1878
1915
nullptr , // Generic
1879
1916
&existentialAssignWithCopy,
0 commit comments