Skip to content

Commit fe9a4db

Browse files
[NFC] Add emitAndAddMethodList to replace several similar methods. (swiftlang#29207)
1 parent a1fe532 commit fe9a4db

File tree

1 file changed

+43
-27
lines changed

1 file changed

+43
-27
lines changed

lib/IRGen/GenClass.cpp

Lines changed: 43 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1229,9 +1229,9 @@ namespace {
12291229
// const class_t *theClass;
12301230
fields.add(getClassMetadataRef());
12311231
// const method_list_t *instanceMethods;
1232-
fields.add(buildInstanceMethodList());
1232+
emitAndAddMethodList(fields, MethodListKind::InstanceMethods);
12331233
// const method_list_t *classMethods;
1234-
fields.add(buildClassMethodList());
1234+
emitAndAddMethodList(fields, MethodListKind::ClassMethods);
12351235
// const protocol_list_t *baseProtocols;
12361236
fields.add(buildProtocolList());
12371237
// const property_list_t *properties;
@@ -1264,13 +1264,13 @@ namespace {
12641264
// const protocol_list_t *baseProtocols;
12651265
fields.add(buildProtocolList());
12661266
// const method_list_t *requiredInstanceMethods;
1267-
fields.add(buildInstanceMethodList());
1267+
emitAndAddMethodList(fields, MethodListKind::InstanceMethods);
12681268
// const method_list_t *requiredClassMethods;
1269-
fields.add(buildClassMethodList());
1269+
emitAndAddMethodList(fields, MethodListKind::ClassMethods);
12701270
// const method_list_t *optionalInstanceMethods;
1271-
fields.add(buildOptInstanceMethodList());
1271+
emitAndAddMethodList(fields, MethodListKind::OptionalInstanceMethods);
12721272
// const method_list_t *optionalClassMethods;
1273-
fields.add(buildOptClassMethodList());
1273+
emitAndAddMethodList(fields, MethodListKind::OptionalClassMethods);
12741274
// const property_list_t *properties;
12751275
fields.add(buildPropertyList(ForClass));
12761276

@@ -1348,7 +1348,8 @@ namespace {
13481348
b.add(buildName());
13491349

13501350
// const method_list_t *baseMethods;
1351-
b.add(forMeta ? buildClassMethodList() : buildInstanceMethodList());
1351+
emitAndAddMethodList(b, forMeta ? MethodListKind::ClassMethods
1352+
: MethodListKind::InstanceMethods);
13521353

13531354
// const protocol_list_t *baseProtocols;
13541355
// Apparently, this list is the same in the class and the metaclass.
@@ -1566,28 +1567,43 @@ namespace {
15661567
llvm_unreachable("not a class, category, or protocol?!");
15671568
}
15681569

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-
}
15821570

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+
};
15871577

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);
15911607
}
15921608

15931609
llvm::Constant *buildOptExtendedMethodTypes() {

0 commit comments

Comments
 (0)