@@ -60,19 +60,22 @@ namespace Cpp {
6060  using  namespace  llvm ; 
6161  using  namespace  std ; 
6262
63-   static  std::unique_ptr<compat::Interpreter> sInterpreter ;
63+   //  Flag to indicate ownership when an external interpreter instance is used.
64+   static  bool  OwningSInterpreter = true ;
65+   static  compat::Interpreter* sInterpreter  = nullptr ;
6466  //  Valgrind complains about __cxa_pure_virtual called when deleting
6567  //  llvm::SectionMemoryManager::~SectionMemoryManager as part of the dtor chain
6668  //  of the Interpreter.
6769  //  This might fix the issue https://reviews.llvm.org/D107087
6870  //  FIXME: For now we just leak the Interpreter.
6971  struct  InterpDeleter  {
70-     ~InterpDeleter () {  sInterpreter . release ();  }
72+     ~InterpDeleter () {}
7173  } Deleter;
7274
7375  static  compat::Interpreter& getInterp () {
74-     assert (sInterpreter .get () && " Must be set before calling this!" 
75-     return  *sInterpreter .get ();
76+     assert (sInterpreter  &&
77+            " Interpreter instance must be set before calling this!" 
78+     return  *sInterpreter ;
7679  }
7780  static  clang::Sema& getSema () { return  getInterp ().getCI ()->getSema (); }
7881  static  clang::ASTContext& getASTContext () { return  getSema ().getASTContext (); }
@@ -2691,14 +2694,20 @@ namespace Cpp {
26912694    //  FIXME: Enable this assert once we figure out how to fix the multiple
26922695    //  calls to CreateInterpreter.
26932696    // assert(!sInterpreter && "Interpreter already set.");
2694-     sInterpreter . reset (I) ;
2697+     sInterpreter  = I ;
26952698    return  I;
26962699  }
26972700
2698-   TInterp_t GetInterpreter () {
2699-     return  sInterpreter .get ();
2701+   TInterp_t GetInterpreter () { return  sInterpreter ; }
2702+ 
2703+   void  UseExternalInterpreter (TInterp_t I) {
2704+     assert (sInterpreter  && " sInterpreter already in use!" 
2705+     sInterpreter  = static_cast <compat::Interpreter*>(I);
2706+     OwningSInterpreter = false ;
27002707  }
27012708
2709+   bool  OwnsInterpreter () { return  OwningSInterpreter; }
2710+ 
27022711  void  AddSearchPath (const  char  *dir, bool  isUser,
27032712                     bool  prepend) {
27042713    getInterp ().getDynamicLibraryManager ()->addSearchPath (dir, isUser, prepend);
0 commit comments