|
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