Skip to content

Commit 493a7b8

Browse files
committed
[LocalTypeData] Add kind for witness table pack.
1 parent 01ff3c9 commit 493a7b8

File tree

2 files changed

+31
-3
lines changed

2 files changed

+31
-3
lines changed

lib/IRGen/LocalTypeData.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
#include "IRGenModule.h"
2626
#include "MetadataRequest.h"
2727
#include "swift/AST/IRGenOptions.h"
28+
#include "swift/AST/PackConformance.h"
2829
#include "swift/AST/ProtocolConformance.h"
2930
#include "swift/SIL/SILModule.h"
3031

@@ -705,6 +706,12 @@ void LocalTypeDataKind::print(llvm::raw_ostream &out) const {
705706
out << "AbstractConformance("
706707
<< getAbstractProtocolConformance()->getName()
707708
<< ")";
709+
} else if (isPackProtocolConformance()) {
710+
out << "PackConformance("
711+
<< getPackProtocolConformance()->getType()
712+
<< ":"
713+
<< getPackProtocolConformance()->getProtocol()->getName()
714+
<< ")";
708715
} else if (Value == FormalTypeMetadata) {
709716
out << "FormalTypeMetadata";
710717
} else if (Value == RepresentationTypeMetadata) {

lib/IRGen/LocalTypeDataKind.h

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,10 @@ class LocalTypeDataKind {
5959
ValueWitnessDiscriminatorBase = ValueWitnessBase + MaxNumValueWitnesses,
6060

6161
FirstPayloadValue = 2048,
62-
Kind_Decl = 0,
63-
Kind_Conformance = 1,
64-
KindMask = 0x1,
62+
Kind_Decl = 0b0,
63+
Kind_Conformance = 0b1,
64+
Kind_PackConformance = 0b10,
65+
KindMask = 0b11,
6566
};
6667

6768
public:
@@ -119,10 +120,17 @@ class LocalTypeDataKind {
119120
return LocalTypeDataKind(uintptr_t(conformance) | Kind_Conformance);
120121
}
121122

123+
static LocalTypeDataKind forProtocolWitnessTablePack(PackConformance *pack) {
124+
assert(pack && "pack conformance reference may not be null");
125+
return LocalTypeDataKind(uintptr_t(pack) | Kind_PackConformance);
126+
}
127+
122128
static LocalTypeDataKind
123129
forProtocolWitnessTable(ProtocolConformanceRef conformance) {
124130
if (conformance.isConcrete()) {
125131
return forConcreteProtocolWitnessTable(conformance.getConcrete());
132+
} else if (conformance.isPack()) {
133+
return forProtocolWitnessTablePack(conformance.getPack());
126134
} else {
127135
return forAbstractProtocolWitnessTable(conformance.getAbstract());
128136
}
@@ -159,11 +167,24 @@ class LocalTypeDataKind {
159167
return reinterpret_cast<ProtocolDecl*>(Value - Kind_Decl);
160168
}
161169

170+
bool isPackProtocolConformance() const {
171+
return (!isSingletonKind() &&
172+
((Value & KindMask) == Kind_PackConformance));
173+
}
174+
175+
PackConformance *getPackProtocolConformance() const {
176+
assert(isPackProtocolConformance());
177+
return reinterpret_cast<PackConformance*>(Value - Kind_PackConformance);
178+
}
179+
162180
ProtocolConformanceRef getProtocolConformance() const {
163181
assert(!isSingletonKind());
164182
if ((Value & KindMask) == Kind_Decl) {
165183
return ProtocolConformanceRef(getAbstractProtocolConformance());
184+
} else if ((Value & KindMask) == Kind_PackConformance) {
185+
return ProtocolConformanceRef(getPackProtocolConformance());
166186
} else {
187+
assert((Value & KindMask) == Kind_Conformance);
167188
return ProtocolConformanceRef(getConcreteProtocolConformance());
168189
}
169190
}

0 commit comments

Comments
 (0)