diff options
Diffstat (limited to 'clang/tools/libclang/CIndexUSRs.cpp')
| -rw-r--r-- | clang/tools/libclang/CIndexUSRs.cpp | 62 |
1 files changed, 42 insertions, 20 deletions
diff --git a/clang/tools/libclang/CIndexUSRs.cpp b/clang/tools/libclang/CIndexUSRs.cpp index adc77d16b62..8a1d4233c1a 100644 --- a/clang/tools/libclang/CIndexUSRs.cpp +++ b/clang/tools/libclang/CIndexUSRs.cpp @@ -30,7 +30,8 @@ using namespace clang::cxstring; namespace { class USRGenerator : public DeclVisitor<USRGenerator> { - llvm::SmallString<1024> Buf; + llvm::OwningPtr<llvm::SmallString<128> > OwnedBuf; + llvm::SmallVectorImpl<char> &Buf; llvm::raw_svector_ostream Out; bool IgnoreResults; ASTUnit *AU; @@ -39,11 +40,13 @@ class USRGenerator : public DeclVisitor<USRGenerator> { llvm::DenseMap<const Type *, unsigned> 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<char> *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(""); |

