forked from OSchip/llvm-project
Fixed version of r250913, which actually implements all the static functions.
Thanks to Siva Chandra and Oleksiy Vyalov for pouncing on this. llvm-svn: 250928
This commit is contained in:
parent
654aaf12dc
commit
93c0b00380
|
@ -449,7 +449,8 @@ public:
|
||||||
static bool
|
static bool
|
||||||
RegisterPlugin (const ConstString &name,
|
RegisterPlugin (const ConstString &name,
|
||||||
const char *description,
|
const char *description,
|
||||||
REPLCreateInstance create_callback);
|
REPLCreateInstance create_callback,
|
||||||
|
REPLEnumerateSupportedLanguages enumerate_languages_callback);
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
UnregisterPlugin (REPLCreateInstance create_callback);
|
UnregisterPlugin (REPLCreateInstance create_callback);
|
||||||
|
@ -460,6 +461,12 @@ public:
|
||||||
static REPLCreateInstance
|
static REPLCreateInstance
|
||||||
GetREPLCreateCallbackForPluginName (const ConstString &name);
|
GetREPLCreateCallbackForPluginName (const ConstString &name);
|
||||||
|
|
||||||
|
static REPLEnumerateSupportedLanguages
|
||||||
|
GetREPLEnumerateSupportedLanguagesCallbackAtIndex (uint32_t idx);
|
||||||
|
|
||||||
|
static REPLEnumerateSupportedLanguages
|
||||||
|
GetREPLSystemEnumerateSupportedLanguagesCallbackForPluginName (const ConstString &name);
|
||||||
|
|
||||||
//------------------------------------------------------------------
|
//------------------------------------------------------------------
|
||||||
// Some plug-ins might register a DebuggerInitializeCallback
|
// Some plug-ins might register a DebuggerInitializeCallback
|
||||||
// callback when registering the plug-in. After a new Debugger
|
// callback when registering the plug-in. After a new Debugger
|
||||||
|
|
|
@ -149,6 +149,9 @@ public:
|
||||||
static void
|
static void
|
||||||
GetLanguagesSupportingTypeSystems (std::set<lldb::LanguageType> &languages,
|
GetLanguagesSupportingTypeSystems (std::set<lldb::LanguageType> &languages,
|
||||||
std::set<lldb::LanguageType> &languages_for_expressions);
|
std::set<lldb::LanguageType> &languages_for_expressions);
|
||||||
|
|
||||||
|
static void
|
||||||
|
GetLanguagesSupportingREPLs (std::set<lldb::LanguageType> &languages);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
//------------------------------------------------------------------
|
//------------------------------------------------------------------
|
||||||
|
|
|
@ -51,6 +51,7 @@ namespace lldb_private
|
||||||
typedef lldb::TypeSystemSP (*TypeSystemCreateInstance) (lldb::LanguageType language, Module *module, Target *target);
|
typedef lldb::TypeSystemSP (*TypeSystemCreateInstance) (lldb::LanguageType language, Module *module, Target *target);
|
||||||
typedef lldb::REPLSP (*REPLCreateInstance) (Error &error, lldb::LanguageType language, Debugger *debugger, Target *target, const char *repl_options);
|
typedef lldb::REPLSP (*REPLCreateInstance) (Error &error, lldb::LanguageType language, Debugger *debugger, Target *target, const char *repl_options);
|
||||||
typedef void (*TypeSystemEnumerateSupportedLanguages) (std::set<lldb::LanguageType> &languages_for_types, std::set<lldb::LanguageType> &languages_for_expressions);
|
typedef void (*TypeSystemEnumerateSupportedLanguages) (std::set<lldb::LanguageType> &languages_for_types, std::set<lldb::LanguageType> &languages_for_expressions);
|
||||||
|
typedef void (*REPLEnumerateSupportedLanguages) (std::set<lldb::LanguageType> &languages);
|
||||||
typedef int (*ComparisonFunction)(const void *, const void *);
|
typedef int (*ComparisonFunction)(const void *, const void *);
|
||||||
typedef void (*DebuggerInitializeCallback)(Debugger &debugger);
|
typedef void (*DebuggerInitializeCallback)(Debugger &debugger);
|
||||||
|
|
||||||
|
|
|
@ -1805,11 +1805,6 @@ Debugger::RunREPL (LanguageType language, const char *repl_options)
|
||||||
{
|
{
|
||||||
Error err;
|
Error err;
|
||||||
FileSpec repl_executable;
|
FileSpec repl_executable;
|
||||||
if (language == eLanguageTypeUnknown)
|
|
||||||
{
|
|
||||||
err.SetErrorString ("must specify a language for a REPL"); // TODO make it possible to specify a default language
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
Target *const target = nullptr; // passing in an empty target means the REPL must create one
|
Target *const target = nullptr; // passing in an empty target means the REPL must create one
|
||||||
|
|
||||||
|
|
|
@ -2662,6 +2662,7 @@ struct REPLInstance
|
||||||
ConstString name;
|
ConstString name;
|
||||||
std::string description;
|
std::string description;
|
||||||
REPLCreateInstance create_callback;
|
REPLCreateInstance create_callback;
|
||||||
|
REPLEnumerateSupportedLanguages enumerate_languages_callback;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef std::vector<REPLInstance> REPLInstances;
|
typedef std::vector<REPLInstance> REPLInstances;
|
||||||
|
@ -2683,7 +2684,8 @@ GetREPLInstances ()
|
||||||
bool
|
bool
|
||||||
PluginManager::RegisterPlugin (const ConstString &name,
|
PluginManager::RegisterPlugin (const ConstString &name,
|
||||||
const char *description,
|
const char *description,
|
||||||
REPLCreateInstance create_callback)
|
REPLCreateInstance create_callback,
|
||||||
|
REPLEnumerateSupportedLanguages enumerate_languages_callback)
|
||||||
{
|
{
|
||||||
if (create_callback)
|
if (create_callback)
|
||||||
{
|
{
|
||||||
|
@ -2693,6 +2695,7 @@ PluginManager::RegisterPlugin (const ConstString &name,
|
||||||
if (description && description[0])
|
if (description && description[0])
|
||||||
instance.description = description;
|
instance.description = description;
|
||||||
instance.create_callback = create_callback;
|
instance.create_callback = create_callback;
|
||||||
|
instance.enumerate_languages_callback = enumerate_languages_callback;
|
||||||
Mutex::Locker locker (GetREPLMutex ());
|
Mutex::Locker locker (GetREPLMutex ());
|
||||||
GetREPLInstances ().push_back (instance);
|
GetREPLInstances ().push_back (instance);
|
||||||
}
|
}
|
||||||
|
@ -2748,6 +2751,35 @@ PluginManager::GetREPLCreateCallbackForPluginName (const ConstString &name)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
REPLEnumerateSupportedLanguages
|
||||||
|
PluginManager::GetREPLEnumerateSupportedLanguagesCallbackAtIndex (uint32_t idx)
|
||||||
|
{
|
||||||
|
Mutex::Locker locker (GetREPLMutex ());
|
||||||
|
REPLInstances &instances = GetREPLInstances ();
|
||||||
|
if (idx < instances.size())
|
||||||
|
return instances[idx].enumerate_languages_callback;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
REPLEnumerateSupportedLanguages
|
||||||
|
PluginManager::GetREPLSystemEnumerateSupportedLanguagesCallbackForPluginName (const ConstString &name)
|
||||||
|
{
|
||||||
|
if (name)
|
||||||
|
{
|
||||||
|
Mutex::Locker locker (GetREPLMutex ());
|
||||||
|
REPLInstances &instances = GetREPLInstances ();
|
||||||
|
|
||||||
|
REPLInstances::iterator pos, end = instances.end();
|
||||||
|
for (pos = instances.begin(); pos != end; ++ pos)
|
||||||
|
{
|
||||||
|
if (name == pos->name)
|
||||||
|
return pos->enumerate_languages_callback;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
#pragma mark PluginManager
|
#pragma mark PluginManager
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -299,6 +299,17 @@ Language::GetLanguagesSupportingTypeSystems (std::set<lldb::LanguageType> &langu
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Language::GetLanguagesSupportingREPLs (std::set<lldb::LanguageType> &languages)
|
||||||
|
{
|
||||||
|
uint32_t idx = 0;
|
||||||
|
|
||||||
|
while (REPLEnumerateSupportedLanguages enumerate = PluginManager::GetREPLEnumerateSupportedLanguagesCallbackAtIndex(idx++))
|
||||||
|
{
|
||||||
|
(*enumerate)(languages);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
std::unique_ptr<Language::TypeScavenger>
|
std::unique_ptr<Language::TypeScavenger>
|
||||||
Language::GetTypeScavenger ()
|
Language::GetTypeScavenger ()
|
||||||
{
|
{
|
||||||
|
|
|
@ -218,7 +218,19 @@ Target::GetREPL (Error &err, lldb::LanguageType language, const char *repl_optio
|
||||||
{
|
{
|
||||||
if (language == eLanguageTypeUnknown)
|
if (language == eLanguageTypeUnknown)
|
||||||
{
|
{
|
||||||
return REPLSP(); // must provide a language
|
std::set<LanguageType> repl_languages;
|
||||||
|
|
||||||
|
Language::GetLanguagesSupportingREPLs(repl_languages);
|
||||||
|
|
||||||
|
if (repl_languages.size() == 1)
|
||||||
|
{
|
||||||
|
language = *repl_languages.begin();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
err.SetErrorStringWithFormat("Multiple possible REPL languages. Please specify a language.");
|
||||||
|
return REPLSP(); // must provide a language
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
REPLMap::iterator pos = m_repl_map.find(language);
|
REPLMap::iterator pos = m_repl_map.find(language);
|
||||||
|
|
Loading…
Reference in New Issue