@@ -1229,9 +1229,9 @@ namespace {
1229
1229
// const class_t *theClass;
1230
1230
fields.add (getClassMetadataRef ());
1231
1231
// const method_list_t *instanceMethods;
1232
- fields. add ( buildInstanceMethodList () );
1232
+ emitAndAddMethodList (fields, MethodListKind::InstanceMethods );
1233
1233
// const method_list_t *classMethods;
1234
- fields. add ( buildClassMethodList () );
1234
+ emitAndAddMethodList (fields, MethodListKind::ClassMethods );
1235
1235
// const protocol_list_t *baseProtocols;
1236
1236
fields.add (buildProtocolList ());
1237
1237
// const property_list_t *properties;
@@ -1264,13 +1264,13 @@ namespace {
1264
1264
// const protocol_list_t *baseProtocols;
1265
1265
fields.add (buildProtocolList ());
1266
1266
// const method_list_t *requiredInstanceMethods;
1267
- fields. add ( buildInstanceMethodList () );
1267
+ emitAndAddMethodList (fields, MethodListKind::InstanceMethods );
1268
1268
// const method_list_t *requiredClassMethods;
1269
- fields. add ( buildClassMethodList () );
1269
+ emitAndAddMethodList (fields, MethodListKind::ClassMethods );
1270
1270
// const method_list_t *optionalInstanceMethods;
1271
- fields. add ( buildOptInstanceMethodList () );
1271
+ emitAndAddMethodList (fields, MethodListKind::OptionalInstanceMethods );
1272
1272
// const method_list_t *optionalClassMethods;
1273
- fields. add ( buildOptClassMethodList () );
1273
+ emitAndAddMethodList (fields, MethodListKind::OptionalClassMethods );
1274
1274
// const property_list_t *properties;
1275
1275
fields.add (buildPropertyList (ForClass));
1276
1276
@@ -1348,7 +1348,8 @@ namespace {
1348
1348
b.add (buildName ());
1349
1349
1350
1350
// const method_list_t *baseMethods;
1351
- b.add (forMeta ? buildClassMethodList () : buildInstanceMethodList ());
1351
+ emitAndAddMethodList (b, forMeta ? MethodListKind::ClassMethods
1352
+ : MethodListKind::InstanceMethods);
1352
1353
1353
1354
// const protocol_list_t *baseProtocols;
1354
1355
// Apparently, this list is the same in the class and the metaclass.
@@ -1566,28 +1567,43 @@ namespace {
1566
1567
llvm_unreachable (" not a class, category, or protocol?!" );
1567
1568
}
1568
1569
1569
- llvm::Constant *buildClassMethodList () {
1570
- return buildMethodList (ClassMethods,
1571
- chooseNamePrefix (" _CLASS_METHODS_" ,
1572
- " _CATEGORY_CLASS_METHODS_" ,
1573
- " _PROTOCOL_CLASS_METHODS_" ));
1574
- }
1575
-
1576
- llvm::Constant *buildInstanceMethodList () {
1577
- return buildMethodList (InstanceMethods,
1578
- chooseNamePrefix (" _INSTANCE_METHODS_" ,
1579
- " _CATEGORY_INSTANCE_METHODS_" ,
1580
- " _PROTOCOL_INSTANCE_METHODS_" ));
1581
- }
1582
1570
1583
- llvm::Constant *buildOptClassMethodList () {
1584
- return buildMethodList (OptClassMethods,
1585
- " _PROTOCOL_CLASS_METHODS_OPT_" );
1586
- }
1571
+ enum class MethodListKind : uint8_t {
1572
+ ClassMethods,
1573
+ InstanceMethods,
1574
+ OptionalClassMethods,
1575
+ OptionalInstanceMethods
1576
+ };
1587
1577
1588
- llvm::Constant *buildOptInstanceMethodList () {
1589
- return buildMethodList (OptInstanceMethods,
1590
- " _PROTOCOL_INSTANCE_METHODS_OPT_" );
1578
+ // / Emit the method list and add the pointer to the `builder`.
1579
+ void emitAndAddMethodList (ConstantInitBuilder::StructBuilder &builder,
1580
+ MethodListKind kind) {
1581
+ ArrayRef<MethodDescriptor> methods;
1582
+ StringRef namePrefix;
1583
+ switch (kind) {
1584
+ case MethodListKind::ClassMethods:
1585
+ methods = ClassMethods;
1586
+ namePrefix = chooseNamePrefix (" _CLASS_METHODS_" ,
1587
+ " _CATEGORY_CLASS_METHODS_" ,
1588
+ " _PROTOCOL_CLASS_METHODS_" );
1589
+ break ;
1590
+ case MethodListKind::InstanceMethods:
1591
+ methods = InstanceMethods;
1592
+ namePrefix = chooseNamePrefix (" _INSTANCE_METHODS_" ,
1593
+ " _CATEGORY_INSTANCE_METHODS_" ,
1594
+ " _PROTOCOL_INSTANCE_METHODS_" );
1595
+ break ;
1596
+ case MethodListKind::OptionalClassMethods:
1597
+ methods = OptClassMethods;
1598
+ namePrefix = " _PROTOCOL_CLASS_METHODS_OPT_" ;
1599
+ break ;
1600
+ case MethodListKind::OptionalInstanceMethods:
1601
+ methods = OptInstanceMethods;
1602
+ namePrefix = " _PROTOCOL_INSTANCE_METHODS_OPT_" ;
1603
+ break ;
1604
+ }
1605
+ llvm::Constant *methodListPtr = buildMethodList (methods, namePrefix);
1606
+ builder.add (methodListPtr);
1591
1607
}
1592
1608
1593
1609
llvm::Constant *buildOptExtendedMethodTypes () {
0 commit comments