https://github.com/illusory0x0 created https://github.com/llvm/llvm-project/pull/139093
None From f3a692b7b0e4800277bf7df10e800ccacce98b37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8C=97=E9=9C=B2?= <69190413+illusory...@users.noreply.github.com> Date: Thu, 8 May 2025 23:00:54 +0800 Subject: [PATCH] refactor(libclang): add CXS_StringRef --- clang/tools/libclang/CXString.cpp | 53 ++++++++++++++++++++++++------- clang/tools/libclang/CXString.h | 13 ++++++++ 2 files changed, 54 insertions(+), 12 deletions(-) diff --git a/clang/tools/libclang/CXString.cpp b/clang/tools/libclang/CXString.cpp index aaa8f8eeb67a1..4986ddba5ff6e 100644 --- a/clang/tools/libclang/CXString.cpp +++ b/clang/tools/libclang/CXString.cpp @@ -30,7 +30,10 @@ enum CXStringFlag { /// CXString contains a CXStringBuf that needs to be returned to the /// CXStringPool. - CXS_StringBuf + CXS_StringBuf, + + /// CXString contains a 'StringRef' that it doesn't own. + CXS_StringRef }; namespace clang { @@ -87,7 +90,10 @@ CXString createRef(StringRef String) { if (String.empty()) return createEmpty(); - return createDup(String); + CXString Str; + Str.data = new CXStringRef{String}; + Str.private_flags = CXS_StringRef; + return Str; } CXString createDup(StringRef String) { @@ -161,21 +167,44 @@ const char *clang_getCString(CXString string) { if (string.private_flags == (unsigned) CXS_StringBuf) { return static_cast<const cxstring::CXStringBuf *>(string.data)->Data.data(); } + if (string.private_flags == (unsigned)CXS_StringRef) { + auto *sr = + static_cast<cxstring::CXStringRef *>(const_cast<void *>(string.data)); + auto len = sr->string_ref.size(); + auto *src = sr->string_ref.data(); + + if (sr->null_terminated_string == nullptr) { + char *nts = (char *)llvm::safe_malloc(len + 1); + memcpy(nts, src, len); + nts[len] = '\0'; + sr->null_terminated_string = nts; + + } else { + return sr->null_terminated_string; + } + } return static_cast<const char *>(string.data); } void clang_disposeString(CXString string) { switch ((CXStringFlag) string.private_flags) { - case CXS_Unmanaged: - break; - case CXS_Malloc: - if (string.data) - free(const_cast<void *>(string.data)); - break; - case CXS_StringBuf: - static_cast<cxstring::CXStringBuf *>( - const_cast<void *>(string.data))->dispose(); - break; + case CXS_Unmanaged: + break; + case CXS_Malloc: + if (string.data) + free(const_cast<void *>(string.data)); + break; + case CXS_StringBuf: + static_cast<cxstring::CXStringBuf *>(const_cast<void *>(string.data)) + ->dispose(); + break; + case CXS_StringRef: { + auto *sr = + static_cast<cxstring::CXStringRef *>(const_cast<void *>(string.data)); + delete sr; + } + + break; } } diff --git a/clang/tools/libclang/CXString.h b/clang/tools/libclang/CXString.h index 809bdec3d677f..981ea3c8bf117 100644 --- a/clang/tools/libclang/CXString.h +++ b/clang/tools/libclang/CXString.h @@ -82,6 +82,16 @@ class CXStringPool { friend struct CXStringBuf; }; +struct CXStringRef { + public: + const char* null_terminated_string{nullptr}; + StringRef string_ref; + explicit CXStringRef(StringRef sr) noexcept : string_ref{sr} { } + ~CXStringRef() noexcept { + free(const_cast<char*>(null_terminated_string)); + } +}; + struct CXStringBuf { SmallString<128> Data; CXTranslationUnit TU; @@ -104,5 +114,8 @@ static inline StringRef getContents(const CXUnsavedFile &UF) { } } + + + #endif _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits