diff --git a/interpreter/cling/include/cling/Interpreter/Interpreter.h b/interpreter/cling/include/cling/Interpreter/Interpreter.h index 549d9e225d6fc1b0230478c5d75df1a88c2eb31f..b724432485a9c39841484ba07a14c5505d3ca262 100644 --- a/interpreter/cling/include/cling/Interpreter/Interpreter.h +++ b/interpreter/cling/include/cling/Interpreter/Interpreter.h @@ -403,7 +403,9 @@ namespace cling { llvm::Module* getModule() const; + //FIXME: This must be in InterpreterCallbacks. void installLazyFunctionCreator(void* (*fp)(const std::string&)); + void enableLazyFunctionCreator(bool enable = true); //FIXME: Terrible hack to let the IncrementalParser run static inits on // transaction completed. diff --git a/interpreter/cling/lib/Interpreter/ExecutionContext.cpp b/interpreter/cling/lib/Interpreter/ExecutionContext.cpp index 75085208c9fa2f597b5f148146b599e58a7632b3..838e4f812d2c8044d1ee9378ea0017e8c8a08dc9 100644 --- a/interpreter/cling/lib/Interpreter/ExecutionContext.cpp +++ b/interpreter/cling/lib/Interpreter/ExecutionContext.cpp @@ -58,6 +58,8 @@ std::set<std::string> ExecutionContext::m_unresolvedSymbols; std::vector<ExecutionContext::LazyFunctionCreatorFunc_t> ExecutionContext::m_lazyFuncCreator; +bool ExecutionContext::m_LazyFuncCreatorEnabled = true; + ExecutionContext::ExecutionContext(): m_engine(0), m_RunningStaticInits(false), @@ -115,6 +117,9 @@ void* ExecutionContext::HandleMissingFunction(const std::string& mangled_name) void* ExecutionContext::NotifyLazyFunctionCreators(const std::string& mangled_name) { + if (!m_LazyFuncCreatorEnabled) + return 0; + for (std::vector<LazyFunctionCreatorFunc_t>::iterator it = m_lazyFuncCreator.begin(), et = m_lazyFuncCreator.end(); it != et; ++it) { diff --git a/interpreter/cling/lib/Interpreter/ExecutionContext.h b/interpreter/cling/lib/Interpreter/ExecutionContext.h index 3356d08d646131d42f9a2feecd24448facdbe56d..d64c3a17e3ec4938f33d8c4b85ad47b21557dc1d 100644 --- a/interpreter/cling/lib/Interpreter/ExecutionContext.h +++ b/interpreter/cling/lib/Interpreter/ExecutionContext.h @@ -35,6 +35,9 @@ namespace cling { ~ExecutionContext(); void installLazyFunctionCreator(LazyFunctionCreatorFunc_t fp); + void enableLazyFunctionCreator(bool enabled = true) { + m_LazyFuncCreatorEnabled = enabled; + } void runStaticInitializersOnce(llvm::Module* m); void runStaticDestructorsOnce(llvm::Module* m); @@ -83,6 +86,9 @@ namespace cling { static std::set<std::string> m_unresolvedSymbols; static std::vector<LazyFunctionCreatorFunc_t> m_lazyFuncCreator; + ///\ Whether or not the function creator to be queried. + static bool m_LazyFuncCreatorEnabled; + llvm::ExecutionEngine* m_engine; // Owned by JIT /// \brief prevent the recursive run of the static inits diff --git a/interpreter/cling/lib/Interpreter/Interpreter.cpp b/interpreter/cling/lib/Interpreter/Interpreter.cpp index f85ddf2afee435b9494ff968a8f75d5e8b3f95f0..9c6ca25b9261e6a3af78eb1f27fb2aa586171471 100644 --- a/interpreter/cling/lib/Interpreter/Interpreter.cpp +++ b/interpreter/cling/lib/Interpreter/Interpreter.cpp @@ -595,6 +595,10 @@ namespace cling { m_ExecutionContext->installLazyFunctionCreator(fp); } + void Interpreter::enableLazyFunctionCreator(bool enabled /*= true*/) { + m_ExecutionContext->enableLazyFunctionCreator(enabled); + } + StoredValueRef Interpreter::Evaluate(const char* expr, DeclContext* DC, bool ValuePrinterReq) { Sema& TheSema = getCI()->getSema();