Skip to content

Commit 794ff31

Browse files
authored
Merge pull request swiftlang#19794 from mikeash/fix-instruments-and-retain-counts
[Runtime] Fix swift_retainCount for deiniting objects and BridgeObject tagged values. Make swift_bridgeObjectRetain/Release bail out early for tagged values.
2 parents e9b0f12 + 1afd079 commit 794ff31

File tree

3 files changed

+18
-11
lines changed

3 files changed

+18
-11
lines changed

stdlib/public/SwiftShims/RefCount.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -788,7 +788,6 @@ class RefCounts {
788788
if (bits.hasSideTable())
789789
return bits.getSideTable()->getCount();
790790

791-
assert(!bits.getIsDeiniting()); // FIXME: can we assert this?
792791
return bits.getStrongExtraRefCount() + 1;
793792
}
794793

stdlib/public/runtime/HeapObject.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -365,7 +365,9 @@ void swift::swift_nonatomic_release_n(HeapObject *object, uint32_t n) {
365365
}
366366

367367
size_t swift::swift_retainCount(HeapObject *object) {
368-
return object->refCounts.getCount();
368+
if (isValidPointerForNativeRetain(object))
369+
return object->refCounts.getCount();
370+
return 0;
369371
}
370372

371373
size_t swift::swift_unownedRetainCount(HeapObject *object) {

stdlib/public/runtime/SwiftObject.mm

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -580,10 +580,16 @@ static bool isNonNative_unTagged_bridgeObject(void *object) {
580580
static_assert((heap_object_abi::SwiftSpareBitsMask & objectPointerIsObjCBit) ==
581581
objectPointerIsObjCBit,
582582
"isObjC bit not within spare bits");
583-
return (uintptr_t(object) & objectPointerIsObjCBit) != 0 && (uintptr_t(object) & heap_object_abi::BridgeObjectTagBitsMask) == 0;
583+
return (uintptr_t(object) & objectPointerIsObjCBit) != 0
584+
&& (uintptr_t(object) & heap_object_abi::BridgeObjectTagBitsMask) == 0;
584585
}
585586
#endif
586587

588+
/// Return true iff the given BridgeObject is a tagged value.
589+
static bool isBridgeObjectTaggedPointer(void *object) {
590+
return (uintptr_t(object) & heap_object_abi::BridgeObjectTagBitsMask) != 0;
591+
}
592+
587593
// Mask out the spare bits in a bridgeObject, returning the object it
588594
// encodes.
589595
///
@@ -594,7 +600,7 @@ static bool isNonNative_unTagged_bridgeObject(void *object) {
594600

595601
void *swift::swift_bridgeObjectRetain(void *object) {
596602
#if SWIFT_OBJC_INTEROP
597-
if (isObjCTaggedPointer(object))
603+
if (isObjCTaggedPointer(object) || isBridgeObjectTaggedPointer(object))
598604
return object;
599605
#endif
600606

@@ -616,7 +622,7 @@ static bool isNonNative_unTagged_bridgeObject(void *object) {
616622
SWIFT_RUNTIME_EXPORT
617623
void *swift::swift_nonatomic_bridgeObjectRetain(void *object) {
618624
#if SWIFT_OBJC_INTEROP
619-
if (isObjCTaggedPointer(object))
625+
if (isObjCTaggedPointer(object) || isBridgeObjectTaggedPointer(object))
620626
return object;
621627
#endif
622628

@@ -638,7 +644,7 @@ static bool isNonNative_unTagged_bridgeObject(void *object) {
638644
SWIFT_RUNTIME_EXPORT
639645
void swift::swift_bridgeObjectRelease(void *object) {
640646
#if SWIFT_OBJC_INTEROP
641-
if (isObjCTaggedPointer(object))
647+
if (isObjCTaggedPointer(object) || isBridgeObjectTaggedPointer(object))
642648
return;
643649
#endif
644650

@@ -655,7 +661,7 @@ static bool isNonNative_unTagged_bridgeObject(void *object) {
655661

656662
void swift::swift_nonatomic_bridgeObjectRelease(void *object) {
657663
#if SWIFT_OBJC_INTEROP
658-
if (isObjCTaggedPointer(object))
664+
if (isObjCTaggedPointer(object) || isBridgeObjectTaggedPointer(object))
659665
return;
660666
#endif
661667

@@ -672,7 +678,7 @@ static bool isNonNative_unTagged_bridgeObject(void *object) {
672678

673679
void *swift::swift_bridgeObjectRetain_n(void *object, int n) {
674680
#if SWIFT_OBJC_INTEROP
675-
if (isObjCTaggedPointer(object))
681+
if (isObjCTaggedPointer(object) || isBridgeObjectTaggedPointer(object))
676682
return object;
677683
#endif
678684

@@ -695,7 +701,7 @@ static bool isNonNative_unTagged_bridgeObject(void *object) {
695701

696702
void swift::swift_bridgeObjectRelease_n(void *object, int n) {
697703
#if SWIFT_OBJC_INTEROP
698-
if (isObjCTaggedPointer(object))
704+
if (isObjCTaggedPointer(object) || isBridgeObjectTaggedPointer(object))
699705
return;
700706
#endif
701707

@@ -713,7 +719,7 @@ static bool isNonNative_unTagged_bridgeObject(void *object) {
713719

714720
void *swift::swift_nonatomic_bridgeObjectRetain_n(void *object, int n) {
715721
#if SWIFT_OBJC_INTEROP
716-
if (isObjCTaggedPointer(object))
722+
if (isObjCTaggedPointer(object) || isBridgeObjectTaggedPointer(object))
717723
return object;
718724
#endif
719725

@@ -736,7 +742,7 @@ static bool isNonNative_unTagged_bridgeObject(void *object) {
736742

737743
void swift::swift_nonatomic_bridgeObjectRelease_n(void *object, int n) {
738744
#if SWIFT_OBJC_INTEROP
739-
if (isObjCTaggedPointer(object))
745+
if (isObjCTaggedPointer(object) || isBridgeObjectTaggedPointer(object))
740746
return;
741747
#endif
742748

0 commit comments

Comments
 (0)