@@ -203,7 +203,7 @@ Address irgen::emitAddressOfFieldOffsetVector(IRGenFunction &IGF,
203
203
/* ********************************* CLASSES ***********************************/
204
204
205
205
ClassMetadataLayout::ClassMetadataLayout (IRGenModule &IGM, ClassDecl *decl)
206
- : NominalMetadataLayout(Kind::Class) {
206
+ : NominalMetadataLayout(Kind::Class), NumImmediateMembers( 0 ) {
207
207
208
208
struct Scanner : LayoutScanner<Scanner, ClassMetadataScanner> {
209
209
using super = LayoutScanner;
@@ -228,9 +228,26 @@ ClassMetadataLayout::ClassMetadataLayout(IRGenModule &IGM, ClassDecl *decl)
228
228
super::noteStartOfGenericRequirements (forClass);
229
229
}
230
230
231
+ void addGenericWitnessTable (CanType argType, ProtocolConformanceRef conf,
232
+ ClassDecl *forClass) {
233
+ if (forClass == Target) {
234
+ Layout.NumImmediateMembers ++;
235
+ }
236
+ super::addGenericWitnessTable (argType, conf, forClass);
237
+ }
238
+
239
+ void addGenericArgument (CanType argType, ClassDecl *forClass) {
240
+ if (forClass == Target) {
241
+ Layout.NumImmediateMembers ++;
242
+ }
243
+ super::addGenericArgument (argType, forClass);
244
+ }
245
+
231
246
void addMethod (SILDeclRef fn) {
232
- if (fn.getDecl ()->getDeclContext () == Target)
247
+ if (fn.getDecl ()->getDeclContext () == Target) {
248
+ Layout.NumImmediateMembers ++;
233
249
Layout.MethodInfos .try_emplace (fn, getNextOffset ());
250
+ }
234
251
super::addMethod (fn);
235
252
}
236
253
@@ -241,11 +258,21 @@ ClassMetadataLayout::ClassMetadataLayout(IRGenModule &IGM, ClassDecl *decl)
241
258
}
242
259
243
260
void addFieldOffset (VarDecl *field) {
244
- if (field->getDeclContext () == Target)
261
+ if (field->getDeclContext () == Target) {
262
+ Layout.NumImmediateMembers ++;
245
263
Layout.FieldOffsets .try_emplace (field, getNextOffset ());
264
+ }
246
265
super::addFieldOffset (field);
247
266
}
248
267
268
+ void addFieldOffsetPlaceholders (MissingMemberDecl *placeholder) {
269
+ if (placeholder->getDeclContext () == Target) {
270
+ Layout.NumImmediateMembers +=
271
+ placeholder->getNumberOfFieldOffsetVectorEntries ();
272
+ }
273
+ super::addFieldOffsetPlaceholders (placeholder);
274
+ }
275
+
249
276
void addVTableEntries (ClassDecl *forClass) {
250
277
if (forClass == Target)
251
278
Layout.VTableOffset = getNextOffset ();
0 commit comments