@@ -117,6 +117,9 @@ inline static bool handleNextRefCount(const Metadata *metadata,
117117 RefCountingKind::SinglePayloadEnumFNResolved)) {
118118 Handler::handleSinglePayloadEnumFN (typeLayout, offset, true , addrOffset,
119119 std::forward<Params>(params)...);
120+ } else if (SWIFT_UNLIKELY (tag == RefCountingKind::SinglePayloadEnumGeneric)) {
121+ Handler::handleSinglePayloadEnumGeneric (typeLayout, offset, addrOffset,
122+ std::forward<Params>(params)...);
120123 } else if (SWIFT_UNLIKELY (tag == RefCountingKind::MultiPayloadEnumFN)) {
121124 Handler::handleMultiPayloadEnumFN (metadata, typeLayout, offset, false ,
122125 addrOffset,
@@ -126,8 +129,7 @@ inline static bool handleNextRefCount(const Metadata *metadata,
126129 Handler::handleMultiPayloadEnumFN (metadata, typeLayout, offset, true ,
127130 addrOffset,
128131 std::forward<Params>(params)...);
129- } else if (SWIFT_UNLIKELY (tag ==
130- RefCountingKind::MultiPayloadEnumGeneric)) {
132+ } else if (SWIFT_UNLIKELY (tag == RefCountingKind::MultiPayloadEnumGeneric)) {
131133 Handler::handleMultiPayloadEnumGeneric (metadata, typeLayout, offset,
132134 addrOffset,
133135 std::forward<Params>(params)...);
@@ -256,6 +258,51 @@ static void handleSinglePayloadEnumFN(const uint8_t *typeLayout, size_t &offset,
256258 }
257259}
258260
261+ static void handleSinglePayloadEnumGeneric (const uint8_t *typeLayout,
262+ size_t &offset, uint8_t *addr,
263+ uintptr_t &addrOffset) {
264+ auto tagBytesAndOffset = readBytes<uint64_t >(typeLayout, offset);
265+ auto extraTagBytesPattern = (uint8_t )(tagBytesAndOffset >> 62 );
266+ auto xiTagBytesOffset =
267+ tagBytesAndOffset & std::numeric_limits<uint32_t >::max ();
268+ const Metadata *xiType = nullptr ;
269+
270+ if (extraTagBytesPattern) {
271+ auto extraTagBytes = 1 << (extraTagBytesPattern - 1 );
272+ auto payloadSize = readBytes<size_t >(typeLayout, offset);
273+ auto tagBytes =
274+ readTagBytes (addr + addrOffset + payloadSize, extraTagBytes);
275+ if (tagBytes) {
276+ offset += sizeof (uint64_t ) + sizeof (size_t );
277+ goto noPayload;
278+ }
279+ } else {
280+ offset += sizeof (size_t );
281+ }
282+
283+ xiType = readBytes<const Metadata *>(typeLayout, offset);
284+
285+ if (xiType) {
286+ auto numEmptyCases = readBytes<unsigned >(typeLayout, offset);
287+
288+ auto tag = xiType->vw_getEnumTagSinglePayload (
289+ (const OpaqueValue *)(addr + addrOffset + xiTagBytesOffset),
290+ numEmptyCases);
291+ if (tag == 0 ) {
292+ offset += sizeof (size_t ) * 2 ;
293+ return ;
294+ }
295+ } else {
296+ offset += sizeof (uint64_t ) + sizeof (size_t );
297+ }
298+
299+ noPayload:
300+ auto refCountBytes = readBytes<size_t >(typeLayout, offset);
301+ auto skip = readBytes<size_t >(typeLayout, offset);
302+ offset += refCountBytes;
303+ addrOffset += skip;
304+ }
305+
259306template <typename Handler, typename ... Params>
260307static void handleMultiPayloadEnumFN (const Metadata *metadata,
261308 const uint8_t *typeLayout, size_t &offset,
@@ -363,6 +410,13 @@ struct DestroyHandler {
363410 ::handleSinglePayloadEnumFN (typeLayout, offset, resolved, addr, addrOffset);
364411 }
365412
413+ static inline void handleSinglePayloadEnumGeneric (const uint8_t *typeLayout,
414+ size_t &offset,
415+ uintptr_t &addrOffset,
416+ uint8_t *addr) {
417+ ::handleSinglePayloadEnumGeneric (typeLayout, offset, addr, addrOffset);
418+ }
419+
366420 static inline void handleMultiPayloadEnumFN (const Metadata *metadata,
367421 const uint8_t *typeLayout,
368422 size_t &offset, bool resolved,
@@ -466,6 +520,14 @@ struct CopyHandler {
466520 ::handleSinglePayloadEnumFN (typeLayout, offset, resolved, src, addrOffset);
467521 }
468522
523+ static inline void handleSinglePayloadEnumGeneric (const uint8_t *typeLayout,
524+ size_t &offset,
525+ uintptr_t &addrOffset,
526+ uint8_t *dest,
527+ uint8_t *src) {
528+ ::handleSinglePayloadEnumGeneric (typeLayout, offset, src, addrOffset);
529+ }
530+
469531 static inline void handleMultiPayloadEnumFN (const Metadata *metadata,
470532 const uint8_t *typeLayout,
471533 size_t &offset, bool resolved,
@@ -533,6 +595,14 @@ struct TakeHandler {
533595 ::handleSinglePayloadEnumFN (typeLayout, offset, resolved, src, addrOffset);
534596 }
535597
598+ static inline void handleSinglePayloadEnumGeneric (const uint8_t *typeLayout,
599+ size_t &offset,
600+ uintptr_t &addrOffset,
601+ uint8_t *dest,
602+ uint8_t *src) {
603+ ::handleSinglePayloadEnumGeneric (typeLayout, offset, src, addrOffset);
604+ }
605+
536606 static inline void handleMultiPayloadEnumFN (const Metadata *metadata,
537607 const uint8_t *typeLayout,
538608 size_t &offset, bool resolved,
0 commit comments