Skip to content

Commit 13b0fa9

Browse files
[NFC] Reduce some duplication in IRGen code for method descriptors. (#28475)
1 parent 66afe77 commit 13b0fa9

File tree

3 files changed

+171
-199
lines changed

3 files changed

+171
-199
lines changed

lib/IRGen/GenDecl.cpp

Lines changed: 39 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -148,20 +148,19 @@ class CategoryInitializerVisitor
148148
if (method->getAttrs().hasAttribute<NSManagedAttr>())
149149
return;
150150

151-
llvm::Constant *name, *imp, *types;
152-
emitObjCMethodDescriptorParts(IGM, method, /*concrete*/true,
153-
name, types, imp);
151+
auto descriptor = emitObjCMethodDescriptorParts(IGM, method,
152+
/*concrete*/true);
154153

155154
// When generating JIT'd code, we need to call sel_registerName() to force
156155
// the runtime to unique the selector.
157156
llvm::Value *sel = Builder.CreateCall(IGM.getObjCSelRegisterNameFn(),
158-
name);
157+
descriptor.selectorRef);
159158

160159
llvm::Value *args[] = {
161160
method->isStatic() ? metaclassMetadata : classMetadata,
162161
sel,
163-
imp,
164-
types
162+
descriptor.impl,
163+
descriptor.typeEncoding
165164
};
166165

167166
Builder.CreateCall(class_replaceMethod, args);
@@ -172,20 +171,19 @@ class CategoryInitializerVisitor
172171

173172
void visitConstructorDecl(ConstructorDecl *constructor) {
174173
if (!requiresObjCMethodDescriptor(constructor)) return;
175-
llvm::Constant *name, *imp, *types;
176-
emitObjCMethodDescriptorParts(IGM, constructor, /*concrete*/true,
177-
name, types, imp);
174+
auto descriptor = emitObjCMethodDescriptorParts(IGM, constructor,
175+
/*concrete*/true);
178176

179177
// When generating JIT'd code, we need to call sel_registerName() to force
180178
// the runtime to unique the selector.
181179
llvm::Value *sel = Builder.CreateCall(IGM.getObjCSelRegisterNameFn(),
182-
name);
180+
descriptor.selectorRef);
183181

184182
llvm::Value *args[] = {
185183
classMetadata,
186184
sel,
187-
imp,
188-
types
185+
descriptor.impl,
186+
descriptor.typeEncoding
189187
};
190188

191189
Builder.CreateCall(class_replaceMethod, args);
@@ -206,23 +204,22 @@ class CategoryInitializerVisitor
206204
if (prop->getAttrs().hasAttribute<NSManagedAttr>())
207205
return;
208206

209-
llvm::Constant *name, *imp, *types;
210-
emitObjCGetterDescriptorParts(IGM, prop,
211-
name, types, imp);
207+
auto descriptor = emitObjCGetterDescriptorParts(IGM, prop);
212208
// When generating JIT'd code, we need to call sel_registerName() to force
213209
// the runtime to unique the selector.
214210
llvm::Value *sel = Builder.CreateCall(IGM.getObjCSelRegisterNameFn(),
215-
name);
211+
descriptor.selectorRef);
216212
auto theClass = prop->isStatic() ? metaclassMetadata : classMetadata;
217-
llvm::Value *getterArgs[] = {theClass, sel, imp, types};
213+
llvm::Value *getterArgs[] =
214+
{theClass, sel, descriptor.impl, descriptor.typeEncoding};
218215
Builder.CreateCall(class_replaceMethod, getterArgs);
219216

220217
if (prop->isSettable(prop->getDeclContext())) {
221-
emitObjCSetterDescriptorParts(IGM, prop,
222-
name, types, imp);
218+
auto descriptor = emitObjCSetterDescriptorParts(IGM, prop);
223219
sel = Builder.CreateCall(IGM.getObjCSelRegisterNameFn(),
224-
name);
225-
llvm::Value *setterArgs[] = {theClass, sel, imp, types};
220+
descriptor.selectorRef);
221+
llvm::Value *setterArgs[] =
222+
{theClass, sel, descriptor.impl, descriptor.typeEncoding};
226223

227224
Builder.CreateCall(class_replaceMethod, setterArgs);
228225
}
@@ -232,22 +229,21 @@ class CategoryInitializerVisitor
232229
assert(!subscript->isStatic() && "objc doesn't support class subscripts");
233230
if (!requiresObjCSubscriptDescriptor(IGM, subscript)) return;
234231

235-
llvm::Constant *name, *imp, *types;
236-
emitObjCGetterDescriptorParts(IGM, subscript,
237-
name, types, imp);
232+
auto descriptor = emitObjCGetterDescriptorParts(IGM, subscript);
238233
// When generating JIT'd code, we need to call sel_registerName() to force
239234
// the runtime to unique the selector.
240235
llvm::Value *sel = Builder.CreateCall(IGM.getObjCSelRegisterNameFn(),
241-
name);
242-
llvm::Value *getterArgs[] = {classMetadata, sel, imp, types};
236+
descriptor.selectorRef);
237+
llvm::Value *getterArgs[] =
238+
{classMetadata, sel, descriptor.impl, descriptor.typeEncoding};
243239
Builder.CreateCall(class_replaceMethod, getterArgs);
244240

245241
if (subscript->supportsMutation()) {
246-
emitObjCSetterDescriptorParts(IGM, subscript,
247-
name, types, imp);
242+
auto descriptor = emitObjCSetterDescriptorParts(IGM, subscript);
248243
sel = Builder.CreateCall(IGM.getObjCSelRegisterNameFn(),
249-
name);
250-
llvm::Value *setterArgs[] = {classMetadata, sel, imp, types};
244+
descriptor.selectorRef);
245+
llvm::Value *setterArgs[] =
246+
{classMetadata, sel, descriptor.impl, descriptor.typeEncoding};
251247

252248
Builder.CreateCall(class_replaceMethod, setterArgs);
253249
}
@@ -353,16 +349,16 @@ class ObjCProtocolInitializerVisitor
353349
return;
354350
}
355351

356-
llvm::Constant *name, *imp, *types;
357-
emitObjCMethodDescriptorParts(IGM, method, /*concrete*/false,
358-
name, types, imp);
352+
auto descriptor = emitObjCMethodDescriptorParts(IGM, method,
353+
/*concrete*/false);
359354

360355
// When generating JIT'd code, we need to call sel_registerName() to force
361356
// the runtime to unique the selector.
362-
llvm::Value *sel = Builder.CreateCall(IGM.getObjCSelRegisterNameFn(), name);
357+
llvm::Value *sel = Builder.CreateCall(IGM.getObjCSelRegisterNameFn(),
358+
descriptor.selectorRef);
363359

364360
llvm::Value *args[] = {
365-
NewProto, sel, types,
361+
NewProto, sel, descriptor.typeEncoding,
366362
// required?
367363
llvm::ConstantInt::get(IGM.ObjCBoolTy,
368364
!method->getAttrs().hasAttribute<OptionalAttr>()),
@@ -381,14 +377,13 @@ class ObjCProtocolInitializerVisitor
381377
void visitAbstractStorageDecl(AbstractStorageDecl *prop) {
382378
// TODO: Add properties to protocol.
383379

384-
llvm::Constant *name, *imp, *types;
385-
emitObjCGetterDescriptorParts(IGM, prop,
386-
name, types, imp);
380+
auto descriptor = emitObjCGetterDescriptorParts(IGM, prop);
387381
// When generating JIT'd code, we need to call sel_registerName() to force
388382
// the runtime to unique the selector.
389-
llvm::Value *sel = Builder.CreateCall(IGM.getObjCSelRegisterNameFn(), name);
383+
llvm::Value *sel = Builder.CreateCall(IGM.getObjCSelRegisterNameFn(),
384+
descriptor.selectorRef);
390385
llvm::Value *getterArgs[] = {
391-
NewProto, sel, types,
386+
NewProto, sel, descriptor.typeEncoding,
392387
// required?
393388
llvm::ConstantInt::get(IGM.ObjCBoolTy,
394389
!prop->getAttrs().hasAttribute<OptionalAttr>()),
@@ -399,11 +394,11 @@ class ObjCProtocolInitializerVisitor
399394
Builder.CreateCall(protocol_addMethodDescription, getterArgs);
400395

401396
if (prop->isSettable(nullptr)) {
402-
emitObjCSetterDescriptorParts(IGM, prop,
403-
name, types, imp);
404-
sel = Builder.CreateCall(IGM.getObjCSelRegisterNameFn(), name);
397+
auto descriptor = emitObjCSetterDescriptorParts(IGM, prop);
398+
sel = Builder.CreateCall(IGM.getObjCSelRegisterNameFn(),
399+
descriptor.selectorRef);
405400
llvm::Value *setterArgs[] = {
406-
NewProto, sel, types,
401+
NewProto, sel, descriptor.typeEncoding,
407402
// required?
408403
llvm::ConstantInt::get(IGM.ObjCBoolTy,
409404
!prop->getAttrs().hasAttribute<OptionalAttr>()),

0 commit comments

Comments
 (0)