Skip to content

Commit 6e3d1ae

Browse files
committed
[Runtime] Check if objc pointers are tagged before masking
In layout string value witnesses runtime functions, if an objc pointer is tagged, there is no ref counting necessary.
1 parent 8fe4c77 commit 6e3d1ae

File tree

1 file changed

+19
-8
lines changed

1 file changed

+19
-8
lines changed

stdlib/public/runtime/BytecodeLayouts.cpp

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -662,10 +662,13 @@ static void objcStrongDestroyBranchless(const Metadata *metadata,
662662
LayoutStringReader1 &reader,
663663
uintptr_t &addrOffset,
664664
uint8_t *addr) {
665-
objc_object *object = (objc_object *)((*(uintptr_t *)(addr + addrOffset)) &
666-
~_swift_abi_SwiftSpareBitsMask);
665+
uintptr_t object = *(uintptr_t *)(addr + addrOffset);
667666
addrOffset += sizeof(objc_object*);
668-
objc_release(object);
667+
if (object & _swift_abi_ObjCReservedBitsMask)
668+
return;
669+
670+
object &= ~_swift_abi_SwiftSpareBitsMask;
671+
objc_release((objc_object *)object);
669672
}
670673
#endif
671674

@@ -896,8 +899,10 @@ static void objcStrongRetainBranchless(const Metadata *metadata,
896899
uintptr_t _addrOffset = addrOffset;
897900
uintptr_t object = *(uintptr_t *)(src + _addrOffset);
898901
memcpy(dest + _addrOffset, &object, sizeof(objc_object *));
899-
object &= ~_swift_abi_SwiftSpareBitsMask;
900902
addrOffset = _addrOffset + sizeof(objc_object *);
903+
if (object & _swift_abi_ObjCReservedBitsMask)
904+
return;
905+
object &= ~_swift_abi_SwiftSpareBitsMask;
901906
objc_retain((objc_object *)object);
902907
}
903908
#endif
@@ -1295,11 +1300,17 @@ static void objcStrongAssignWithCopy(const Metadata *metadata,
12951300
uintptr_t destObject = *(uintptr_t *)(dest + _addrOffset);
12961301
uintptr_t srcObject = *(uintptr_t *)(src + _addrOffset);
12971302
memcpy(dest + _addrOffset, &srcObject, sizeof(objc_object*));
1298-
destObject &= ~_swift_abi_SwiftSpareBitsMask;
1299-
srcObject &= ~_swift_abi_SwiftSpareBitsMask;
13001303
addrOffset = _addrOffset + sizeof(objc_object*);
1301-
objc_release((objc_object *)destObject);
1302-
objc_retain((objc_object *)srcObject);
1304+
1305+
if (!(destObject & _swift_abi_ObjCReservedBitsMask)) {
1306+
destObject &= ~_swift_abi_SwiftSpareBitsMask;
1307+
objc_release((objc_object *)destObject);
1308+
}
1309+
1310+
if (!(srcObject & _swift_abi_ObjCReservedBitsMask)) {
1311+
srcObject &= ~_swift_abi_SwiftSpareBitsMask;
1312+
objc_retain((objc_object *)srcObject);
1313+
}
13031314
}
13041315
#endif
13051316

0 commit comments

Comments
 (0)