@@ -59,9 +59,10 @@ class LocalTypeDataKind {
59
59
ValueWitnessDiscriminatorBase = ValueWitnessBase + MaxNumValueWitnesses,
60
60
61
61
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 ,
65
66
};
66
67
67
68
public:
@@ -119,10 +120,17 @@ class LocalTypeDataKind {
119
120
return LocalTypeDataKind (uintptr_t (conformance) | Kind_Conformance);
120
121
}
121
122
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
+
122
128
static LocalTypeDataKind
123
129
forProtocolWitnessTable (ProtocolConformanceRef conformance) {
124
130
if (conformance.isConcrete ()) {
125
131
return forConcreteProtocolWitnessTable (conformance.getConcrete ());
132
+ } else if (conformance.isPack ()) {
133
+ return forProtocolWitnessTablePack (conformance.getPack ());
126
134
} else {
127
135
return forAbstractProtocolWitnessTable (conformance.getAbstract ());
128
136
}
@@ -159,11 +167,24 @@ class LocalTypeDataKind {
159
167
return reinterpret_cast <ProtocolDecl*>(Value - Kind_Decl);
160
168
}
161
169
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
+
162
180
ProtocolConformanceRef getProtocolConformance () const {
163
181
assert (!isSingletonKind ());
164
182
if ((Value & KindMask) == Kind_Decl) {
165
183
return ProtocolConformanceRef (getAbstractProtocolConformance ());
184
+ } else if ((Value & KindMask) == Kind_PackConformance) {
185
+ return ProtocolConformanceRef (getPackProtocolConformance ());
166
186
} else {
187
+ assert ((Value & KindMask) == Kind_Conformance);
167
188
return ProtocolConformanceRef (getConcreteProtocolConformance ());
168
189
}
169
190
}
0 commit comments