@@ -60,19 +60,25 @@ namespace Cpp {
60
60
using namespace llvm ;
61
61
using namespace std ;
62
62
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 ;
64
66
// Valgrind complains about __cxa_pure_virtual called when deleting
65
67
// llvm::SectionMemoryManager::~SectionMemoryManager as part of the dtor chain
66
68
// of the Interpreter.
67
69
// This might fix the issue https://reviews.llvm.org/D107087
68
70
// FIXME: For now we just leak the Interpreter.
69
71
struct InterpDeleter {
70
- ~InterpDeleter () { sInterpreter .release (); }
72
+ ~InterpDeleter () {
73
+ if (sInterpreter && OwningSInterpreter)
74
+ delete sInterpreter ;
75
+ }
71
76
} Deleter;
72
77
73
78
static compat::Interpreter& getInterp () {
74
- assert (sInterpreter .get () && " Must be set before calling this!" );
75
- return *sInterpreter .get ();
79
+ assert (sInterpreter &&
80
+ " Interpreter instance must be set before calling this!" );
81
+ return *sInterpreter ;
76
82
}
77
83
static clang::Sema& getSema () { return getInterp ().getCI ()->getSema (); }
78
84
static clang::ASTContext& getASTContext () { return getSema ().getASTContext (); }
@@ -2691,12 +2697,16 @@ namespace Cpp {
2691
2697
// FIXME: Enable this assert once we figure out how to fix the multiple
2692
2698
// calls to CreateInterpreter.
2693
2699
// assert(!sInterpreter && "Interpreter already set.");
2694
- sInterpreter . reset (I) ;
2700
+ sInterpreter = I ;
2695
2701
return I;
2696
2702
}
2697
2703
2698
- TInterp_t GetInterpreter () {
2699
- return sInterpreter .get ();
2704
+ TInterp_t GetInterpreter () { return sInterpreter ; }
2705
+
2706
+ void UseExternalInterpreter (TInterp_t I) {
2707
+ assert (sInterpreter && " sInterpreter already in use!" );
2708
+ sInterpreter = static_cast <compat::Interpreter*>(I);
2709
+ OwningSInterpreter = false ;
2700
2710
}
2701
2711
2702
2712
void AddSearchPath (const char *dir, bool isUser,
0 commit comments