[libclang] Replace createRef with createDup#126683
Conversation
Created using spr 1.3.4 [skip ci]
Created using spr 1.3.4
|
@llvm/pr-subscribers-clang Author: Vitaly Buka (vitalybuka) ChangesImplementation of Full diff: https://github.com/llvm/llvm-project/pull/126683.diff 7 Files Affected:
diff --git a/clang/tools/libclang/CIndex.cpp b/clang/tools/libclang/CIndex.cpp
index 285ac314200077d..b644e5699646cc7 100644
--- a/clang/tools/libclang/CIndex.cpp
+++ b/clang/tools/libclang/CIndex.cpp
@@ -5066,7 +5066,7 @@ CXString clang_getFileName(CXFile SFile) {
return cxstring::createNull();
FileEntryRef FEnt = *cxfile::getFileEntryRef(SFile);
- return cxstring::createRef(FEnt.getName());
+ return cxstring::createDup(FEnt.getName());
}
time_t clang_getFileTime(CXFile SFile) {
@@ -5154,7 +5154,7 @@ CXString clang_File_tryGetRealPathName(CXFile SFile) {
return cxstring::createNull();
FileEntryRef FEnt = *cxfile::getFileEntryRef(SFile);
- return cxstring::createRef(FEnt.getFileEntry().tryGetRealPathName());
+ return cxstring::createDup(FEnt.getFileEntry().tryGetRealPathName());
}
//===----------------------------------------------------------------------===//
@@ -9234,7 +9234,7 @@ CXString clang_Cursor_getRawCommentText(CXCursor C) {
// Don't duplicate the string because RawText points directly into source
// code.
- return cxstring::createRef(RawText);
+ return cxstring::createDup(RawText);
}
CXString clang_Cursor_getBriefCommentText(CXCursor C) {
@@ -9250,7 +9250,7 @@ CXString clang_Cursor_getBriefCommentText(CXCursor C) {
// Don't duplicate the string because RawComment ensures that this memory
// will not go away.
- return cxstring::createRef(BriefText);
+ return cxstring::createDup(BriefText);
}
return cxstring::createNull();
@@ -10081,7 +10081,7 @@ cxindex::Logger::~Logger() {
}
CXString clang_getBinaryOperatorKindSpelling(enum CXBinaryOperatorKind kind) {
- return cxstring::createRef(
+ return cxstring::createDup(
BinaryOperator::getOpcodeStr(static_cast<BinaryOperatorKind>(kind - 1)));
}
@@ -10100,7 +10100,7 @@ enum CXBinaryOperatorKind clang_getCursorBinaryOperatorKind(CXCursor cursor) {
}
CXString clang_getUnaryOperatorKindSpelling(enum CXUnaryOperatorKind kind) {
- return cxstring::createRef(
+ return cxstring::createDup(
UnaryOperator::getOpcodeStr(static_cast<UnaryOperatorKind>(kind - 1)));
}
diff --git a/clang/tools/libclang/CIndexCodeCompletion.cpp b/clang/tools/libclang/CIndexCodeCompletion.cpp
index 850c004680fd968..188255debbc4593 100644
--- a/clang/tools/libclang/CIndexCodeCompletion.cpp
+++ b/clang/tools/libclang/CIndexCodeCompletion.cpp
@@ -223,8 +223,8 @@ clang_getCompletionParent(CXCompletionString completion_string,
CodeCompletionString *CCStr = (CodeCompletionString *)completion_string;
if (!CCStr)
return cxstring::createNull();
-
- return cxstring::createRef(CCStr->getParentContextName());
+
+ return cxstring::createDup(CCStr->getParentContextName());
}
CXString
diff --git a/clang/tools/libclang/CIndexDiagnostic.cpp b/clang/tools/libclang/CIndexDiagnostic.cpp
index 92271d9c37f862d..e4f2d63052f1ae5 100644
--- a/clang/tools/libclang/CIndexDiagnostic.cpp
+++ b/clang/tools/libclang/CIndexDiagnostic.cpp
@@ -400,7 +400,7 @@ unsigned clang_getDiagnosticCategory(CXDiagnostic Diag) {
CXString clang_getDiagnosticCategoryName(unsigned Category) {
// Kept for backward compatibility.
- return cxstring::createRef(DiagnosticIDs::getCategoryNameFromID(Category));
+ return cxstring::createDup(DiagnosticIDs::getCategoryNameFromID(Category));
}
CXString clang_getDiagnosticCategoryText(CXDiagnostic Diag) {
diff --git a/clang/tools/libclang/CXComment.cpp b/clang/tools/libclang/CXComment.cpp
index e87efd23578f022..668bd0a1f2fd274 100644
--- a/clang/tools/libclang/CXComment.cpp
+++ b/clang/tools/libclang/CXComment.cpp
@@ -129,7 +129,7 @@ CXString clang_TextComment_getText(CXComment CXC) {
if (!TC)
return cxstring::createNull();
- return cxstring::createRef(TC->getText());
+ return cxstring::createDup(TC->getText());
}
CXString clang_InlineCommandComment_getCommandName(CXComment CXC) {
@@ -138,7 +138,7 @@ CXString clang_InlineCommandComment_getCommandName(CXComment CXC) {
return cxstring::createNull();
const CommandTraits &Traits = getCommandTraits(CXC);
- return cxstring::createRef(ICC->getCommandName(Traits));
+ return cxstring::createDup(ICC->getCommandName(Traits));
}
enum CXCommentInlineCommandRenderKind
@@ -180,7 +180,7 @@ CXString clang_InlineCommandComment_getArgText(CXComment CXC,
if (!ICC || ArgIdx >= ICC->getNumArgs())
return cxstring::createNull();
- return cxstring::createRef(ICC->getArgText(ArgIdx));
+ return cxstring::createDup(ICC->getArgText(ArgIdx));
}
CXString clang_HTMLTagComment_getTagName(CXComment CXC) {
@@ -188,7 +188,7 @@ CXString clang_HTMLTagComment_getTagName(CXComment CXC) {
if (!HTC)
return cxstring::createNull();
- return cxstring::createRef(HTC->getTagName());
+ return cxstring::createDup(HTC->getTagName());
}
unsigned clang_HTMLStartTagComment_isSelfClosing(CXComment CXC) {
@@ -212,7 +212,7 @@ CXString clang_HTMLStartTag_getAttrName(CXComment CXC, unsigned AttrIdx) {
if (!HST || AttrIdx >= HST->getNumAttrs())
return cxstring::createNull();
- return cxstring::createRef(HST->getAttr(AttrIdx).Name);
+ return cxstring::createDup(HST->getAttr(AttrIdx).Name);
}
CXString clang_HTMLStartTag_getAttrValue(CXComment CXC, unsigned AttrIdx) {
@@ -220,7 +220,7 @@ CXString clang_HTMLStartTag_getAttrValue(CXComment CXC, unsigned AttrIdx) {
if (!HST || AttrIdx >= HST->getNumAttrs())
return cxstring::createNull();
- return cxstring::createRef(HST->getAttr(AttrIdx).Value);
+ return cxstring::createDup(HST->getAttr(AttrIdx).Value);
}
CXString clang_BlockCommandComment_getCommandName(CXComment CXC) {
@@ -229,7 +229,7 @@ CXString clang_BlockCommandComment_getCommandName(CXComment CXC) {
return cxstring::createNull();
const CommandTraits &Traits = getCommandTraits(CXC);
- return cxstring::createRef(BCC->getCommandName(Traits));
+ return cxstring::createDup(BCC->getCommandName(Traits));
}
unsigned clang_BlockCommandComment_getNumArgs(CXComment CXC) {
@@ -246,7 +246,7 @@ CXString clang_BlockCommandComment_getArgText(CXComment CXC,
if (!BCC || ArgIdx >= BCC->getNumArgs())
return cxstring::createNull();
- return cxstring::createRef(BCC->getArgText(ArgIdx));
+ return cxstring::createDup(BCC->getArgText(ArgIdx));
}
CXComment clang_BlockCommandComment_getParagraph(CXComment CXC) {
@@ -262,7 +262,7 @@ CXString clang_ParamCommandComment_getParamName(CXComment CXC) {
if (!PCC || !PCC->hasParamName())
return cxstring::createNull();
- return cxstring::createRef(PCC->getParamNameAsWritten());
+ return cxstring::createDup(PCC->getParamNameAsWritten());
}
unsigned clang_ParamCommandComment_isParamIndexValid(CXComment CXC) {
@@ -313,7 +313,7 @@ CXString clang_TParamCommandComment_getParamName(CXComment CXC) {
if (!TPCC || !TPCC->hasParamName())
return cxstring::createNull();
- return cxstring::createRef(TPCC->getParamNameAsWritten());
+ return cxstring::createDup(TPCC->getParamNameAsWritten());
}
unsigned clang_TParamCommandComment_isParamPositionValid(CXComment CXC) {
@@ -346,7 +346,7 @@ CXString clang_VerbatimBlockLineComment_getText(CXComment CXC) {
if (!VBL)
return cxstring::createNull();
- return cxstring::createRef(VBL->getText());
+ return cxstring::createDup(VBL->getText());
}
CXString clang_VerbatimLineComment_getText(CXComment CXC) {
@@ -354,7 +354,7 @@ CXString clang_VerbatimLineComment_getText(CXComment CXC) {
if (!VLC)
return cxstring::createNull();
- return cxstring::createRef(VLC->getText());
+ return cxstring::createDup(VLC->getText());
}
//===----------------------------------------------------------------------===//
diff --git a/clang/tools/libclang/CXStoredDiagnostic.cpp b/clang/tools/libclang/CXStoredDiagnostic.cpp
index 6fb3050f5f8445e..243e55f98a7dc5a 100644
--- a/clang/tools/libclang/CXStoredDiagnostic.cpp
+++ b/clang/tools/libclang/CXStoredDiagnostic.cpp
@@ -46,7 +46,7 @@ CXSourceLocation CXStoredDiagnostic::getLocation() const {
}
CXString CXStoredDiagnostic::getSpelling() const {
- return cxstring::createRef(Diag.getMessage());
+ return cxstring::createDup(Diag.getMessage());
}
CXString CXStoredDiagnostic::getDiagnosticOption(CXString *Disable) const {
@@ -75,7 +75,7 @@ unsigned CXStoredDiagnostic::getCategory() const {
CXString CXStoredDiagnostic::getCategoryText() const {
unsigned catID = DiagnosticIDs::getCategoryNumberForDiag(Diag.getID());
- return cxstring::createRef(DiagnosticIDs::getCategoryNameFromID(catID));
+ return cxstring::createDup(DiagnosticIDs::getCategoryNameFromID(catID));
}
unsigned CXStoredDiagnostic::getNumRanges() const {
diff --git a/clang/tools/libclang/CXString.cpp b/clang/tools/libclang/CXString.cpp
index aaa8f8eeb67a12c..76e68fcf7a8e19b 100644
--- a/clang/tools/libclang/CXString.cpp
+++ b/clang/tools/libclang/CXString.cpp
@@ -77,19 +77,6 @@ CXString createDup(const char *String) {
return Str;
}
-CXString createRef(StringRef String) {
- if (!String.data())
- return createNull();
-
- // If the string is empty, it might point to a position in another string
- // while having zero length. Make sure we don't create a reference to the
- // larger string.
- if (String.empty())
- return createEmpty();
-
- return createDup(String);
-}
-
CXString createDup(StringRef String) {
CXString Result;
char *Spelling = static_cast<char *>(llvm::safe_malloc(String.size() + 1));
diff --git a/clang/tools/libclang/CXString.h b/clang/tools/libclang/CXString.h
index 809bdec3d677ffc..54c9293e0483e89 100644
--- a/clang/tools/libclang/CXString.h
+++ b/clang/tools/libclang/CXString.h
@@ -46,12 +46,6 @@ CXString createRef(const char *String);
/// \p String can be changed or freed by the caller.
CXString createDup(const char *String);
-/// Create a CXString object from a StringRef. New CXString may
-/// contain a pointer to the undrelying data of \p String.
-///
-/// \p String should not be changed by the caller afterwards.
-CXString createRef(StringRef String);
-
/// Create a CXString object from a StringRef. New CXString will
/// contain a copy of \p String.
///
|
efriedma-quic
left a comment
There was a problem hiding this comment.
LGTM. Looking at the code, none of these codepaths should be hot, so I don't expect any significant performance difference.
Created using spr 1.3.4 [skip ci]
Created using spr 1.3.4 [skip ci]
Created using spr 1.3.4 [skip ci]
Created using spr 1.3.4 [skip ci]
egorzhdan
left a comment
There was a problem hiding this comment.
I'm not an expert in the area, but this change LGTM.
| // If the string is empty, it might point to a position in another string | ||
| // while having zero length. Make sure we don't create a reference to the | ||
| // larger string. | ||
| if (String.empty()) |
There was a problem hiding this comment.
Why is losing the above two checks not problematic? It isn't clear to me actually what this is even for, @AaronBallman I think knows more about libclang than I do though, so perhaps he should review this.
There was a problem hiding this comment.
We're not losing those checks -- createDup() has them:
There was a problem hiding this comment.
Thats only for the const char* version. Isn't the version on line 93/80 the one that will be called instead?
There was a problem hiding this comment.
Oh, I see what you mean, that is a difference in behavior for the null case because clang_getCString() (part of the stable API) would start returning a non-null pointer where it previously returned a null pointer. I'm not certain if any of the changed calls to createDup() will get a null StringRef though, that's a pretty odd beast.
| // If the string is empty, it might point to a position in another string | ||
| // while having zero length. Make sure we don't create a reference to the | ||
| // larger string. | ||
| if (String.empty()) |
There was a problem hiding this comment.
We're not losing those checks -- createDup() has them:
AaronBallman
left a comment
There was a problem hiding this comment.
Requesting changes just to be sure none of the changes from createRef() to createDup() would have generated a StringRef holding a null pointer. I'd be surprised if they did, but a second set of eyes would be helpful.
I am not sure how to proceed here. I see 3 options:
WDYT? |
Aaron is away this week, but: I believe he was asking for an analysis of all of the uses to make sure they don't use a null-StringRef anywhere. IMO, an assert of some sort in the createDup interface would be sufficient to long-term prevent the problem. |
Implementation of
createRefis almost exactcreateDup.