]> granicus.if.org Git - clang/commitdiff
CIndex: avoid a dangling pointer issue.
authorBenjamin Kramer <benny.kra@googlemail.com>
Sun, 18 Oct 2009 11:10:55 +0000 (11:10 +0000)
committerBenjamin Kramer <benny.kra@googlemail.com>
Sun, 18 Oct 2009 11:10:55 +0000 (11:10 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@84413 91177308-0d34-0410-b5e6-96231b3b80d8

tools/CIndex/CIndex.cpp

index 6015ffdd4ca73b7f49bf976caf61c679777de655..c262f672870d4ee52d0ee71fe169534196a0cb59 100644 (file)
@@ -268,7 +268,8 @@ public:
 
 class CIndexer : public Indexer {
 public:  
-  explicit CIndexer(Program *prog) : Indexer(*prog), OnlyLocalDecls(false) {}
+  explicit CIndexer(Program *prog, std::string &path)
+    : Indexer(*prog), OnlyLocalDecls(false), ClangPath(path) {}
 
   virtual ~CIndexer() { delete &getProgram(); }
 
@@ -277,17 +278,17 @@ public:
   /// declarations.
   bool getOnlyLocalDecls() const { return OnlyLocalDecls; }
   void setOnlyLocalDecls(bool Local = true) { OnlyLocalDecls = Local; }
-  
+
+  const std::string& getClangPath() { return ClangPath; }
 private:
   bool OnlyLocalDecls;
+  std::string ClangPath;
 };
   
 }
 
 extern "C" {
 
-static const char *clangPath;
-
 CXIndex clang_createIndex() 
 {
   // FIXME: This is a hack to unbreak the MSVC build.
@@ -308,9 +309,7 @@ CXIndex clang_createIndex()
   // We now have the CIndex directory, locate clang relative to it.
   std::string ClangPath = CIndexDir + "/../bin/clang";
   
-  clangPath = ClangPath.c_str();
-  
-  return new CIndexer(new Program());
+  return new CIndexer(new Program(), ClangPath);
 }
 
 void clang_disposeIndex(CXIndex CIdx)
@@ -345,7 +344,7 @@ CXTranslationUnit clang_createTranslationUnitFromSourceFile(
 #else
   // Build up the arguments for involing clang.
   std::vector<const char *> argv;
-  argv.push_back(clangPath);
+  argv.push_back(static_cast<CIndexer *>(CIdx)->getClangPath().c_str());
   argv.push_back("-emit-ast");
   argv.push_back(source_filename);
   argv.push_back("-o");