diff options
author | Enrico Granata <egranata@apple.com> | 2015-08-27 21:33:50 +0000 |
---|---|---|
committer | Enrico Granata <egranata@apple.com> | 2015-08-27 21:33:50 +0000 |
commit | 5f9d310640209347c6e534a4ed97074d205e1766 (patch) | |
tree | 2e4d195d3acb02842ab819772de93e1a7df3c721 /lldb/source/Core/PluginManager.cpp | |
parent | 7033a9ce3321c87207b795153b43edfbb5426e3c (diff) | |
download | bcm5719-llvm-5f9d310640209347c6e534a4ed97074d205e1766.tar.gz bcm5719-llvm-5f9d310640209347c6e534a4ed97074d205e1766.zip |
Add a new type of plugin: Language plugin
The Language plugin is menat to answer language-specific questions that are not bound to the existence of a process. Those are still the domain of the LanguageRuntime plugin
The Language plugin will, instead, answer questions such as providing language-specific data formatters or expression evaluation
At the moment, the interface is hollowed out, and empty do-nothing plugins have been setup for ObjC, C++ and ObjC++
llvm-svn: 246212
Diffstat (limited to 'lldb/source/Core/PluginManager.cpp')
-rw-r--r-- | lldb/source/Core/PluginManager.cpp | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/lldb/source/Core/PluginManager.cpp b/lldb/source/Core/PluginManager.cpp index ac892d261e4..ca3c5387537 100644 --- a/lldb/source/Core/PluginManager.cpp +++ b/lldb/source/Core/PluginManager.cpp @@ -868,6 +868,111 @@ PluginManager::GetOperatingSystemCreateCallbackForPluginName (const ConstString } +#pragma mark Language + + +struct LanguageInstance +{ + LanguageInstance() : + name(), + description(), + create_callback(NULL) + { + } + + ConstString name; + std::string description; + LanguageCreateInstance create_callback; +}; + +typedef std::vector<LanguageInstance> LanguageInstances; + +static Mutex & +GetLanguageMutex () +{ + static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive); + return g_instances_mutex; +} + +static LanguageInstances & +GetLanguageInstances () +{ + static LanguageInstances g_instances; + return g_instances; +} + +bool +PluginManager::RegisterPlugin +( + const ConstString &name, + const char *description, + LanguageCreateInstance create_callback + ) +{ + if (create_callback) + { + LanguageInstance instance; + assert ((bool)name); + instance.name = name; + if (description && description[0]) + instance.description = description; + instance.create_callback = create_callback; + Mutex::Locker locker (GetLanguageMutex ()); + GetLanguageInstances ().push_back (instance); + } + return false; +} + +bool +PluginManager::UnregisterPlugin (LanguageCreateInstance create_callback) +{ + if (create_callback) + { + Mutex::Locker locker (GetLanguageMutex ()); + LanguageInstances &instances = GetLanguageInstances (); + + LanguageInstances::iterator pos, end = instances.end(); + for (pos = instances.begin(); pos != end; ++ pos) + { + if (pos->create_callback == create_callback) + { + instances.erase(pos); + return true; + } + } + } + return false; +} + +LanguageCreateInstance +PluginManager::GetLanguageCreateCallbackAtIndex (uint32_t idx) +{ + Mutex::Locker locker (GetLanguageMutex ()); + LanguageInstances &instances = GetLanguageInstances (); + if (idx < instances.size()) + return instances[idx].create_callback; + return NULL; +} + +LanguageCreateInstance +PluginManager::GetLanguageCreateCallbackForPluginName (const ConstString &name) +{ + if (name) + { + Mutex::Locker locker (GetLanguageMutex ()); + LanguageInstances &instances = GetLanguageInstances (); + + LanguageInstances::iterator pos, end = instances.end(); + for (pos = instances.begin(); pos != end; ++ pos) + { + if (name == pos->name) + return pos->create_callback; + } + } + return NULL; +} + + #pragma mark LanguageRuntime |