From: Ted Kremenek Date: Tue, 16 Nov 2010 08:15:38 +0000 (+0000) Subject: Rework USR generation from CXCursors to use CXStringBufs X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f019943eda4896c1bbe584b4b0439bf6cbff62a9;p=clang Rework USR generation from CXCursors to use CXStringBufs for the backing of generated USRs. This optmizes for the case when a client generates a sequence of USRs in sequence, disposing of them soon after generating them. By using a string buffer, we recycle malloc'ed memory instead of constantly malloc'ing and copying strings. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@119338 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/tools/libclang/CIndexUSRs.cpp b/tools/libclang/CIndexUSRs.cpp index adc77d16b6..8a1d4233c1 100644 --- a/tools/libclang/CIndexUSRs.cpp +++ b/tools/libclang/CIndexUSRs.cpp @@ -30,7 +30,8 @@ using namespace clang::cxstring; namespace { class USRGenerator : public DeclVisitor { - llvm::SmallString<1024> Buf; + llvm::OwningPtr > OwnedBuf; + llvm::SmallVectorImpl &Buf; llvm::raw_svector_ostream Out; bool IgnoreResults; ASTUnit *AU; @@ -39,11 +40,13 @@ class USRGenerator : public DeclVisitor { llvm::DenseMap TypeSubstitutions; public: - USRGenerator(const CXCursor *C = 0) - : Out(Buf), - IgnoreResults(false), - AU(C ? cxcursor::getCursorASTUnit(*C) : 0), - generatedLoc(false) + USRGenerator(const CXCursor *C = 0, llvm::SmallVectorImpl *extBuf = 0) + : OwnedBuf(extBuf ? 0 : new llvm::SmallString<128>()), + Buf(extBuf ? *extBuf : *OwnedBuf.get()), + Out(Buf), + IgnoreResults(false), + AU(C ? cxcursor::getCursorASTUnit(*C) : 0), + generatedLoc(false) { // Add the USR space prefix. Out << "c:"; @@ -794,19 +797,27 @@ static CXString getDeclCursorUSR(const CXCursor &C) { break; } - USRGenerator UG(&C); - UG->Visit(D); - - if (UG->ignoreResults()) + CXTranslationUnit TU = cxcursor::getCursorTU(C); + if (!TU) return createCXString(""); -#if 0 - // For development testing. - assert(UG.str().size() > 2); -#endif + CXStringBuf *buf = cxstring::getCXStringBuf(TU); + if (!buf) + return createCXString(""); + + { + USRGenerator UG(&C, &buf->Data); + UG->Visit(D); - // Return a copy of the string that must be disposed by the caller. - return createCXString(UG.str(), true); + if (UG->ignoreResults()) { + disposeCXStringBuf(buf); + return createCXString(""); + } + } + // Return the C-string, but don't make a copy since it is already in + // the string buffer. + buf->Data.push_back('\0'); + return createCXString(buf); } extern "C" { @@ -818,10 +829,21 @@ CXString clang_getCursorUSR(CXCursor C) { return getDeclCursorUSR(C); if (K == CXCursor_MacroDefinition) { - USRGenerator UG(&C); - UG << "macro@" - << cxcursor::getCursorMacroDefinition(C)->getName()->getNameStart(); - return createCXString(UG.str(), true); + CXTranslationUnit TU = cxcursor::getCursorTU(C); + if (!TU) + return createCXString(""); + + CXStringBuf *buf = cxstring::getCXStringBuf(TU); + if (!buf) + return createCXString(""); + + { + USRGenerator UG(&C, &buf->Data); + UG << "macro@" + << cxcursor::getCursorMacroDefinition(C)->getName()->getNameStart(); + } + buf->Data.push_back('\0'); + return createCXString(buf); } return createCXString("");