@@ -117,6 +117,9 @@ inline static bool handleNextRefCount(const Metadata *metadata,
117
117
RefCountingKind::SinglePayloadEnumFNResolved)) {
118
118
Handler::handleSinglePayloadEnumFN (typeLayout, offset, true , addrOffset,
119
119
std::forward<Params>(params)...);
120
+ } else if (SWIFT_UNLIKELY (tag == RefCountingKind::SinglePayloadEnumGeneric)) {
121
+ Handler::handleSinglePayloadEnumGeneric (typeLayout, offset, addrOffset,
122
+ std::forward<Params>(params)...);
120
123
} else if (SWIFT_UNLIKELY (tag == RefCountingKind::MultiPayloadEnumFN)) {
121
124
Handler::handleMultiPayloadEnumFN (metadata, typeLayout, offset, false ,
122
125
addrOffset,
@@ -126,8 +129,7 @@ inline static bool handleNextRefCount(const Metadata *metadata,
126
129
Handler::handleMultiPayloadEnumFN (metadata, typeLayout, offset, true ,
127
130
addrOffset,
128
131
std::forward<Params>(params)...);
129
- } else if (SWIFT_UNLIKELY (tag ==
130
- RefCountingKind::MultiPayloadEnumGeneric)) {
132
+ } else if (SWIFT_UNLIKELY (tag == RefCountingKind::MultiPayloadEnumGeneric)) {
131
133
Handler::handleMultiPayloadEnumGeneric (metadata, typeLayout, offset,
132
134
addrOffset,
133
135
std::forward<Params>(params)...);
@@ -256,6 +258,51 @@ static void handleSinglePayloadEnumFN(const uint8_t *typeLayout, size_t &offset,
256
258
}
257
259
}
258
260
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
+
259
306
template <typename Handler, typename ... Params>
260
307
static void handleMultiPayloadEnumFN (const Metadata *metadata,
261
308
const uint8_t *typeLayout, size_t &offset,
@@ -363,6 +410,13 @@ struct DestroyHandler {
363
410
::handleSinglePayloadEnumFN (typeLayout, offset, resolved, addr, addrOffset);
364
411
}
365
412
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
+
366
420
static inline void handleMultiPayloadEnumFN (const Metadata *metadata,
367
421
const uint8_t *typeLayout,
368
422
size_t &offset, bool resolved,
@@ -466,6 +520,14 @@ struct CopyHandler {
466
520
::handleSinglePayloadEnumFN (typeLayout, offset, resolved, src, addrOffset);
467
521
}
468
522
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
+
469
531
static inline void handleMultiPayloadEnumFN (const Metadata *metadata,
470
532
const uint8_t *typeLayout,
471
533
size_t &offset, bool resolved,
@@ -533,6 +595,14 @@ struct TakeHandler {
533
595
::handleSinglePayloadEnumFN (typeLayout, offset, resolved, src, addrOffset);
534
596
}
535
597
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
+
536
606
static inline void handleMultiPayloadEnumFN (const Metadata *metadata,
537
607
const uint8_t *typeLayout,
538
608
size_t &offset, bool resolved,
0 commit comments