|
29 | 29 |
|
30 | 30 | using namespace clang;
|
31 | 31 |
|
| 32 | +void clang::mangleObjCMethodName(raw_ostream &OS, bool includePrefixByte, |
| 33 | + bool isInstanceMethod, StringRef ClassName, |
| 34 | + std::optional<StringRef> CategoryName, |
| 35 | + StringRef MethodName) { |
| 36 | + // \01+[ContainerName(CategoryName) SelectorName] |
| 37 | + if (includePrefixByte) |
| 38 | + OS << "\01"; |
| 39 | + OS << (isInstanceMethod ? '-' : '+'); |
| 40 | + OS << '['; |
| 41 | + OS << ClassName; |
| 42 | + if (CategoryName) |
| 43 | + OS << "(" << *CategoryName << ")"; |
| 44 | + OS << " "; |
| 45 | + OS << MethodName; |
| 46 | + OS << ']'; |
| 47 | +} |
| 48 | + |
32 | 49 | // FIXME: For blocks we currently mimic GCC's mangling scheme, which leaves
|
33 | 50 | // much to be desired. Come up with a better mangling scheme.
|
34 | 51 |
|
@@ -362,26 +379,26 @@ void MangleContext::mangleObjCMethodName(const ObjCMethodDecl *MD,
|
362 | 379 | }
|
363 | 380 |
|
364 | 381 | // \01+[ContainerName(CategoryName) SelectorName]
|
365 |
| - if (includePrefixByte) { |
366 |
| - OS << '\01'; |
367 |
| - } |
368 |
| - OS << (MD->isInstanceMethod() ? '-' : '+') << '['; |
| 382 | + auto CategoryName = std::optional<StringRef>(); |
| 383 | + StringRef ClassName = ""; |
369 | 384 | if (const auto *CID = MD->getCategory()) {
|
370 | 385 | if (const auto *CI = CID->getClassInterface()) {
|
371 |
| - OS << CI->getName(); |
| 386 | + ClassName = CI->getName(); |
372 | 387 | if (includeCategoryNamespace) {
|
373 |
| - OS << '(' << *CID << ')'; |
| 388 | + CategoryName = CID->getName(); |
374 | 389 | }
|
375 | 390 | }
|
376 | 391 | } else if (const auto *CD =
|
377 | 392 | dyn_cast<ObjCContainerDecl>(MD->getDeclContext())) {
|
378 |
| - OS << CD->getName(); |
| 393 | + ClassName = CD->getName(); |
379 | 394 | } else {
|
380 | 395 | llvm_unreachable("Unexpected ObjC method decl context");
|
381 | 396 | }
|
382 |
| - OS << ' '; |
383 |
| - MD->getSelector().print(OS); |
384 |
| - OS << ']'; |
| 397 | + std::string MethodName; |
| 398 | + llvm::raw_string_ostream MethodNameOS(MethodName); |
| 399 | + MD->getSelector().print(MethodNameOS); |
| 400 | + clang::mangleObjCMethodName(OS, includePrefixByte, MD->isInstanceMethod(), |
| 401 | + ClassName, CategoryName, MethodName); |
385 | 402 | }
|
386 | 403 |
|
387 | 404 | void MangleContext::mangleObjCMethodNameAsSourceName(const ObjCMethodDecl *MD,
|
|
0 commit comments