@@ -2781,22 +2781,22 @@ void swift::swift_initStructMetadataWithLayoutString(
2781
2781
}
2782
2782
2783
2783
size_t swift::_swift_refCountBytesForMetatype (const Metadata *type) {
2784
- if (type->vw_size () == 0 || type->getValueWitnesses ()->isPOD ()) {
2784
+ auto *vwt = type->getValueWitnesses ();
2785
+ if (type->vw_size () == 0 || vwt->isPOD ()) {
2785
2786
return 0 ;
2786
2787
} else if (auto *tuple = dyn_cast<TupleTypeMetadata>(type)) {
2787
2788
size_t res = 0 ;
2788
2789
for (InProcess::StoredSize i = 0 ; i < tuple->NumElements ; i++) {
2789
2790
res += _swift_refCountBytesForMetatype (tuple->getElement (i).Type );
2790
2791
}
2791
2792
return res;
2793
+ } else if (vwt == &VALUE_WITNESS_SYM (Bo) ||
2794
+ vwt == &VALUE_WITNESS_SYM (BO) ||
2795
+ vwt == &VALUE_WITNESS_SYM (Bb)) {
2796
+ return sizeof (uint64_t );
2792
2797
} else if (auto *cls = type->getClassObject ()) {
2793
2798
if (cls->isTypeMetadata ()) {
2794
- auto *vwt = cls->getValueWitnesses ();
2795
- if (vwt != &VALUE_WITNESS_SYM (Bo) &&
2796
- vwt != &VALUE_WITNESS_SYM (BO) &&
2797
- vwt != &VALUE_WITNESS_SYM (Bb)) {
2798
- goto metadata;
2799
- }
2799
+ goto metadata;
2800
2800
}
2801
2801
return sizeof (uint64_t );
2802
2802
} else if (type->hasLayoutString ()) {
@@ -2819,9 +2819,10 @@ void swift::_swift_addRefCountStringForMetatype(LayoutStringWriter &writer,
2819
2819
size_t unalignedOffset = fullOffset;
2820
2820
fullOffset = roundUpToAlignMask (fullOffset, fieldType->vw_alignment () - 1 );
2821
2821
size_t offset = fullOffset - unalignedOffset + previousFieldOffset;
2822
+ auto *vwt = fieldType->getValueWitnesses ();
2822
2823
if (fieldType->vw_size () == 0 ) {
2823
2824
return ;
2824
- } else if (fieldType-> getValueWitnesses () ->isPOD ()) {
2825
+ } else if (vwt ->isPOD ()) {
2825
2826
// No need to handle PODs
2826
2827
previousFieldOffset = offset + fieldType->vw_size ();
2827
2828
fullOffset += fieldType->vw_size ();
@@ -2831,6 +2832,25 @@ void swift::_swift_addRefCountStringForMetatype(LayoutStringWriter &writer,
2831
2832
tuple->getElement (i).Type , fullOffset,
2832
2833
previousFieldOffset);
2833
2834
}
2835
+ } else if (vwt == &VALUE_WITNESS_SYM (Bo)) {
2836
+ auto tag = RefCountingKind::NativeStrong;
2837
+ writer.writeBytes (((uint64_t )tag << 56 ) | offset);
2838
+ previousFieldOffset = 0 ;
2839
+ fullOffset += fieldType->vw_size ();
2840
+ } else if (vwt == &VALUE_WITNESS_SYM (BO)) {
2841
+ #if SWIFT_OBJC_INTEROP
2842
+ auto tag = RefCountingKind::ObjC;
2843
+ #else
2844
+ auto tag = RefCountingKind::Unknown;
2845
+ #endif
2846
+ writer.writeBytes (((uint64_t )tag << 56 ) | offset);
2847
+ previousFieldOffset = 0 ;
2848
+ fullOffset += fieldType->vw_size ();
2849
+ } else if (vwt == &VALUE_WITNESS_SYM (Bb)) {
2850
+ auto tag = RefCountingKind::Bridge;
2851
+ writer.writeBytes (((uint64_t )tag << 56 ) | offset);
2852
+ previousFieldOffset = 0 ;
2853
+ fullOffset += fieldType->vw_size ();
2834
2854
} else if (auto *cls = fieldType->getClassObject ()) {
2835
2855
RefCountingKind tag;
2836
2856
if (!cls->isTypeMetadata ()) {
@@ -2840,20 +2860,7 @@ void swift::_swift_addRefCountStringForMetatype(LayoutStringWriter &writer,
2840
2860
tag = RefCountingKind::Unknown;
2841
2861
#endif
2842
2862
} else {
2843
- auto *vwt = cls->getValueWitnesses ();
2844
- if (vwt == &VALUE_WITNESS_SYM (Bo)) {
2845
- tag = RefCountingKind::NativeStrong;
2846
- } else if (vwt == &VALUE_WITNESS_SYM (BO)) {
2847
- #if SWIFT_OBJC_INTEROP
2848
- tag = RefCountingKind::ObjC;
2849
- #else
2850
- tag = RefCountingKind::Unknown;
2851
- #endif
2852
- } else if (vwt == &VALUE_WITNESS_SYM (Bb)) {
2853
- tag = RefCountingKind::Bridge;
2854
- } else {
2855
- goto metadata;
2856
- };
2863
+ goto metadata;
2857
2864
}
2858
2865
2859
2866
writer.writeBytes (((uint64_t )tag << 56 ) | offset);
0 commit comments