|
33 | 33 | using namespace swift; |
34 | 34 | using namespace irgen; |
35 | 35 |
|
| 36 | +static CanPackArchetypeType |
| 37 | +getForwardedPackArchetypeType(CanPackType packType) { |
| 38 | + if (packType->getNumElements() != 1) |
| 39 | + return CanPackArchetypeType(); |
| 40 | + auto uncastElement = packType.getElementType(0); |
| 41 | + auto element = dyn_cast<PackExpansionType>(uncastElement); |
| 42 | + if (!element) |
| 43 | + return CanPackArchetypeType(); |
| 44 | + auto patternType = element.getPatternType(); |
| 45 | + auto packArchetype = dyn_cast<PackArchetypeType>(patternType); |
| 46 | + return packArchetype; |
| 47 | +} |
| 48 | + |
| 49 | +static MetadataResponse |
| 50 | +tryGetLocalPackTypeMetadata(IRGenFunction &IGF, CanPackType packType, |
| 51 | + DynamicMetadataRequest request) { |
| 52 | + if (auto result = IGF.tryGetLocalTypeMetadata(packType, request)) |
| 53 | + return result; |
| 54 | + |
| 55 | + if (auto packArchetypeType = getForwardedPackArchetypeType(packType)) { |
| 56 | + if (auto result = IGF.tryGetLocalTypeMetadata(packArchetypeType, request)) |
| 57 | + return result; |
| 58 | + } |
| 59 | + |
| 60 | + return MetadataResponse(); |
| 61 | +} |
| 62 | + |
| 63 | +static llvm::Value *tryGetLocalPackTypeData(IRGenFunction &IGF, |
| 64 | + CanPackType packType, |
| 65 | + LocalTypeDataKind localDataKind) { |
| 66 | + if (auto *wtable = IGF.tryGetLocalTypeData(packType, localDataKind)) |
| 67 | + return wtable; |
| 68 | + |
| 69 | + if (auto packArchetypeType = getForwardedPackArchetypeType(packType)) { |
| 70 | + if (auto *wtable = |
| 71 | + IGF.tryGetLocalTypeData(packArchetypeType, localDataKind)) |
| 72 | + return wtable; |
| 73 | + } |
| 74 | + |
| 75 | + return nullptr; |
| 76 | +} |
| 77 | + |
36 | 78 | static void accumulateSum(IRGenFunction &IGF, llvm::Value *&result, |
37 | 79 | llvm::Value *value) { |
38 | 80 | if (result == nullptr) { |
@@ -324,33 +366,6 @@ irgen::emitTypeMetadataPack(IRGenFunction &IGF, |
324 | 366 | return pack; |
325 | 367 | } |
326 | 368 |
|
327 | | -static CanPackArchetypeType |
328 | | -getForwardedPackArchetypeType(CanPackType packType) { |
329 | | - if (packType->getNumElements() != 1) |
330 | | - return CanPackArchetypeType(); |
331 | | - auto uncastElement = packType.getElementType(0); |
332 | | - auto element = dyn_cast<PackExpansionType>(uncastElement); |
333 | | - if (!element) |
334 | | - return CanPackArchetypeType(); |
335 | | - auto patternType = element.getPatternType(); |
336 | | - auto packArchetype = dyn_cast<PackArchetypeType>(patternType); |
337 | | - return packArchetype; |
338 | | -} |
339 | | - |
340 | | -static MetadataResponse |
341 | | -tryGetLocalPackTypeMetadata(IRGenFunction &IGF, CanPackType packType, |
342 | | - DynamicMetadataRequest request) { |
343 | | - if (auto result = IGF.tryGetLocalTypeMetadata(packType, request)) |
344 | | - return result; |
345 | | - |
346 | | - if (auto packArchetypeType = getForwardedPackArchetypeType(packType)) { |
347 | | - if (auto result = IGF.tryGetLocalTypeMetadata(packArchetypeType, request)) |
348 | | - return result; |
349 | | - } |
350 | | - |
351 | | - return MetadataResponse(); |
352 | | -} |
353 | | - |
354 | 369 | MetadataResponse |
355 | 370 | irgen::emitTypeMetadataPackRef(IRGenFunction &IGF, CanPackType packType, |
356 | 371 | DynamicMetadataRequest request) { |
@@ -565,21 +580,6 @@ void irgen::cleanupWitnessTablePack(IRGenFunction &IGF, StackAddress pack, |
565 | 580 | } |
566 | 581 | } |
567 | 582 |
|
568 | | -static llvm::Value *tryGetLocalPackTypeData(IRGenFunction &IGF, |
569 | | - CanPackType packType, |
570 | | - LocalTypeDataKind localDataKind) { |
571 | | - if (auto *wtable = IGF.tryGetLocalTypeData(packType, localDataKind)) |
572 | | - return wtable; |
573 | | - |
574 | | - if (auto packArchetypeType = getForwardedPackArchetypeType(packType)) { |
575 | | - if (auto *wtable = |
576 | | - IGF.tryGetLocalTypeData(packArchetypeType, localDataKind)) |
577 | | - return wtable; |
578 | | - } |
579 | | - |
580 | | - return nullptr; |
581 | | -} |
582 | | - |
583 | 583 | llvm::Value *irgen::emitWitnessTablePackRef(IRGenFunction &IGF, |
584 | 584 | CanPackType packType, |
585 | 585 | PackConformance *conformance) { |
|
0 commit comments