Skip to content

Commit fd967fd

Browse files
committed
[Runtime] Properly handle boxed references in layout string instantiation
1 parent 734e9b8 commit fd967fd

File tree

1 file changed

+29
-22
lines changed

1 file changed

+29
-22
lines changed

stdlib/public/runtime/Metadata.cpp

Lines changed: 29 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2781,22 +2781,22 @@ void swift::swift_initStructMetadataWithLayoutString(
27812781
}
27822782

27832783
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()) {
27852786
return 0;
27862787
} else if (auto *tuple = dyn_cast<TupleTypeMetadata>(type)) {
27872788
size_t res = 0;
27882789
for (InProcess::StoredSize i = 0; i < tuple->NumElements; i++) {
27892790
res += _swift_refCountBytesForMetatype(tuple->getElement(i).Type);
27902791
}
27912792
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);
27922797
} else if (auto *cls = type->getClassObject()) {
27932798
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;
28002800
}
28012801
return sizeof(uint64_t);
28022802
} else if (type->hasLayoutString()) {
@@ -2819,9 +2819,10 @@ void swift::_swift_addRefCountStringForMetatype(LayoutStringWriter &writer,
28192819
size_t unalignedOffset = fullOffset;
28202820
fullOffset = roundUpToAlignMask(fullOffset, fieldType->vw_alignment() - 1);
28212821
size_t offset = fullOffset - unalignedOffset + previousFieldOffset;
2822+
auto *vwt = fieldType->getValueWitnesses();
28222823
if (fieldType->vw_size() == 0) {
28232824
return;
2824-
} else if (fieldType->getValueWitnesses()->isPOD()) {
2825+
} else if (vwt->isPOD()) {
28252826
// No need to handle PODs
28262827
previousFieldOffset = offset + fieldType->vw_size();
28272828
fullOffset += fieldType->vw_size();
@@ -2831,6 +2832,25 @@ void swift::_swift_addRefCountStringForMetatype(LayoutStringWriter &writer,
28312832
tuple->getElement(i).Type, fullOffset,
28322833
previousFieldOffset);
28332834
}
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();
28342854
} else if (auto *cls = fieldType->getClassObject()) {
28352855
RefCountingKind tag;
28362856
if (!cls->isTypeMetadata()) {
@@ -2840,20 +2860,7 @@ void swift::_swift_addRefCountStringForMetatype(LayoutStringWriter &writer,
28402860
tag = RefCountingKind::Unknown;
28412861
#endif
28422862
} 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;
28572864
}
28582865

28592866
writer.writeBytes(((uint64_t)tag << 56) | offset);

0 commit comments

Comments
 (0)