@@ -547,6 +547,16 @@ HeapObject *swift::swift_unownedRetain(HeapObject *object) {
547
547
#endif
548
548
}
549
549
550
+ // Assert that the metadata is a class or ErrorObject, for unowned operations.
551
+ // Other types of metadata are not supposed to be used with unowned.
552
+ static void checkMetadataForUnownedRR (HeapObject *object) {
553
+ assert (object->metadata ->isClassObject () ||
554
+ object->metadata ->getKind () == MetadataKind::ErrorObject);
555
+ if (object->metadata ->isClassObject ())
556
+ assert (
557
+ static_cast <const ClassMetadata *>(object->metadata )->isTypeMetadata ());
558
+ }
559
+
550
560
void swift::swift_unownedRelease (HeapObject *object) {
551
561
#ifdef SWIFT_THREADING_NONE
552
562
swift_nonatomic_unownedRelease (object);
@@ -555,9 +565,7 @@ void swift::swift_unownedRelease(HeapObject *object) {
555
565
if (!isValidPointerForNativeRetain (object))
556
566
return ;
557
567
558
- // Only class objects can be unowned-retained and unowned-released.
559
- assert (object->metadata ->isClassObject ());
560
- assert (static_cast <const ClassMetadata*>(object->metadata )->isTypeMetadata ());
568
+ checkMetadataForUnownedRR (object);
561
569
562
570
if (object->refCounts .decrementUnownedShouldFree (1 )) {
563
571
auto classMetadata = static_cast <const ClassMetadata*>(object->metadata );
@@ -582,9 +590,7 @@ void swift::swift_nonatomic_unownedRelease(HeapObject *object) {
582
590
if (!isValidPointerForNativeRetain (object))
583
591
return ;
584
592
585
- // Only class objects can be unowned-retained and unowned-released.
586
- assert (object->metadata ->isClassObject ());
587
- assert (static_cast <const ClassMetadata*>(object->metadata )->isTypeMetadata ());
593
+ checkMetadataForUnownedRR (object);
588
594
589
595
if (object->refCounts .decrementUnownedShouldFreeNonAtomic (1 )) {
590
596
auto classMetadata = static_cast <const ClassMetadata*>(object->metadata );
@@ -615,9 +621,7 @@ void swift::swift_unownedRelease_n(HeapObject *object, int n) {
615
621
if (!isValidPointerForNativeRetain (object))
616
622
return ;
617
623
618
- // Only class objects can be unowned-retained and unowned-released.
619
- assert (object->metadata ->isClassObject ());
620
- assert (static_cast <const ClassMetadata*>(object->metadata )->isTypeMetadata ());
624
+ checkMetadataForUnownedRR (object);
621
625
622
626
if (object->refCounts .decrementUnownedShouldFree (n)) {
623
627
auto classMetadata = static_cast <const ClassMetadata*>(object->metadata );
@@ -641,9 +645,7 @@ void swift::swift_nonatomic_unownedRelease_n(HeapObject *object, int n) {
641
645
if (!isValidPointerForNativeRetain (object))
642
646
return ;
643
647
644
- // Only class objects can be unowned-retained and unowned-released.
645
- assert (object->metadata ->isClassObject ());
646
- assert (static_cast <const ClassMetadata*>(object->metadata )->isTypeMetadata ());
648
+ checkMetadataForUnownedRR (object);
647
649
648
650
if (object->refCounts .decrementUnownedShouldFreeNonAtomic (n)) {
649
651
auto classMetadata = static_cast <const ClassMetadata*>(object->metadata );
0 commit comments