summaryrefslogtreecommitdiffstats
path: root/lldb/source
diff options
context:
space:
mode:
authorSean Callanan <scallanan@apple.com>2015-10-21 19:14:33 +0000
committerSean Callanan <scallanan@apple.com>2015-10-21 19:14:33 +0000
commit93c0b003805f40081edba82fbd9e9375c880a1e2 (patch)
tree7255d528c8b17ffb4a39a08d029c48c075683be6 /lldb/source
parent654aaf12dc319ea4b6fc82123d903e6d0c49984b (diff)
downloadbcm5719-llvm-93c0b003805f40081edba82fbd9e9375c880a1e2.tar.gz
bcm5719-llvm-93c0b003805f40081edba82fbd9e9375c880a1e2.zip
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
Diffstat (limited to 'lldb/source')
-rw-r--r--lldb/source/Core/Debugger.cpp5
-rw-r--r--lldb/source/Core/PluginManager.cpp34
-rw-r--r--lldb/source/Target/Language.cpp11
-rw-r--r--lldb/source/Target/Target.cpp14
4 files changed, 57 insertions, 7 deletions
diff --git a/lldb/source/Core/Debugger.cpp b/lldb/source/Core/Debugger.cpp
index 8619b50b2a3..494b762e872 100644
--- a/lldb/source/Core/Debugger.cpp
+++ b/lldb/source/Core/Debugger.cpp
@@ -1805,11 +1805,6 @@ Debugger::RunREPL (LanguageType language, const char *repl_options)
{
Error err;
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
diff --git a/lldb/source/Core/PluginManager.cpp b/lldb/source/Core/PluginManager.cpp
index 97116dd4ad8..a90b57678b7 100644
--- a/lldb/source/Core/PluginManager.cpp
+++ b/lldb/source/Core/PluginManager.cpp
@@ -2662,6 +2662,7 @@ struct REPLInstance
ConstString name;
std::string description;
REPLCreateInstance create_callback;
+ REPLEnumerateSupportedLanguages enumerate_languages_callback;
};
typedef std::vector<REPLInstance> REPLInstances;
@@ -2683,7 +2684,8 @@ GetREPLInstances ()
bool
PluginManager::RegisterPlugin (const ConstString &name,
const char *description,
- REPLCreateInstance create_callback)
+ REPLCreateInstance create_callback,
+ REPLEnumerateSupportedLanguages enumerate_languages_callback)
{
if (create_callback)
{
@@ -2693,6 +2695,7 @@ PluginManager::RegisterPlugin (const ConstString &name,
if (description && description[0])
instance.description = description;
instance.create_callback = create_callback;
+ instance.enumerate_languages_callback = enumerate_languages_callback;
Mutex::Locker locker (GetREPLMutex ());
GetREPLInstances ().push_back (instance);
}
@@ -2748,6 +2751,35 @@ PluginManager::GetREPLCreateCallbackForPluginName (const ConstString &name)
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
void
diff --git a/lldb/source/Target/Language.cpp b/lldb/source/Target/Language.cpp
index 3ca6ae7f270..a2855b76e7e 100644
--- a/lldb/source/Target/Language.cpp
+++ b/lldb/source/Target/Language.cpp
@@ -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>
Language::GetTypeScavenger ()
{
diff --git a/lldb/source/Target/Target.cpp b/lldb/source/Target/Target.cpp
index 385ac74bb1d..23b82e5c36e 100644
--- a/lldb/source/Target/Target.cpp
+++ b/lldb/source/Target/Target.cpp
@@ -218,7 +218,19 @@ Target::GetREPL (Error &err, lldb::LanguageType language, const char *repl_optio
{
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);
OpenPOWER on IntegriCloud