diff options
Diffstat (limited to 'lldb/source/Target/CPPLanguageRuntime.cpp')
| -rw-r--r-- | lldb/source/Target/CPPLanguageRuntime.cpp | 269 |
1 files changed, 0 insertions, 269 deletions
diff --git a/lldb/source/Target/CPPLanguageRuntime.cpp b/lldb/source/Target/CPPLanguageRuntime.cpp deleted file mode 100644 index 6b36d14a1141..000000000000 --- a/lldb/source/Target/CPPLanguageRuntime.cpp +++ /dev/null @@ -1,269 +0,0 @@ -//===-- CPPLanguageRuntime.cpp -------------------------------------------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#include "lldb/Target/CPPLanguageRuntime.h" - -#include "lldb/Core/PluginManager.h" -#include "lldb/Core/UniqueCStringMap.h" -#include "lldb/Target/ExecutionContext.h" - -using namespace lldb; -using namespace lldb_private; - -class CPPRuntimeEquivalents -{ -public: - CPPRuntimeEquivalents () - { - - m_impl.Append(ConstString("std::basic_string<char, std::char_traits<char>, std::allocator<char> >").AsCString(), ConstString("basic_string<char>")); - - // these two (with a prefixed std::) occur when c++stdlib string class occurs as a template argument in some STL container - m_impl.Append(ConstString("std::basic_string<char, std::char_traits<char>, std::allocator<char> >").AsCString(), ConstString("std::basic_string<char>")); - - m_impl.Sort(); - } - - void - Add (ConstString& type_name, - ConstString& type_equivalent) - { - m_impl.Insert(type_name.AsCString(), type_equivalent); - } - - uint32_t - FindExactMatches (ConstString& type_name, - std::vector<ConstString>& equivalents) - { - - uint32_t count = 0; - - for (ImplData match = m_impl.FindFirstValueForName(type_name.AsCString()); - match != NULL; - match = m_impl.FindNextValueForName(match)) - { - equivalents.push_back(match->value); - count++; - } - - return count; - } - - // partial matches can occur when a name with equivalents is a template argument. - // e.g. we may have "class Foo" be a match for "struct Bar". if we have a typename - // such as "class Templatized<class Foo, Anything>" we want this to be replaced with - // "class Templatized<struct Bar, Anything>". Since partial matching is time consuming - // once we get a partial match, we add it to the exact matches list for faster retrieval - uint32_t - FindPartialMatches (ConstString& type_name, - std::vector<ConstString>& equivalents) - { - - uint32_t count = 0; - - const char* type_name_cstr = type_name.AsCString(); - - size_t items_count = m_impl.GetSize(); - - for (size_t item = 0; item < items_count; item++) - { - const char* key_cstr = m_impl.GetCStringAtIndex(item); - if ( strstr(type_name_cstr,key_cstr) ) - { - count += AppendReplacements(type_name_cstr, - key_cstr, - equivalents); - } - } - - return count; - - } - -private: - - std::string& replace (std::string& target, - std::string& pattern, - std::string& with) - { - size_t pos; - size_t pattern_len = pattern.size(); - - while ( (pos = target.find(pattern)) != std::string::npos ) - target.replace(pos, pattern_len, with); - - return target; - } - - uint32_t - AppendReplacements (const char* original, - const char *matching_key, - std::vector<ConstString>& equivalents) - { - - std::string matching_key_str(matching_key); - ConstString original_const(original); - - uint32_t count = 0; - - for (ImplData match = m_impl.FindFirstValueForName(matching_key); - match != NULL; - match = m_impl.FindNextValueForName(match)) - { - std::string target(original); - std::string equiv_class(match->value.AsCString()); - - replace (target, matching_key_str, equiv_class); - - ConstString target_const(target.c_str()); - -// you will most probably want to leave this off since it might make this map grow indefinitely -#ifdef ENABLE_CPP_EQUIVALENTS_MAP_TO_GROW - Add(original_const, target_const); -#endif - equivalents.push_back(target_const); - - count++; - } - - return count; - } - - typedef UniqueCStringMap<ConstString> Impl; - typedef const Impl::Entry* ImplData; - Impl m_impl; -}; - -static CPPRuntimeEquivalents& -GetEquivalentsMap () -{ - static CPPRuntimeEquivalents g_equivalents_map; - return g_equivalents_map; -} - -//---------------------------------------------------------------------- -// Destructor -//---------------------------------------------------------------------- -CPPLanguageRuntime::~CPPLanguageRuntime() -{ -} - -CPPLanguageRuntime::CPPLanguageRuntime (Process *process) : - LanguageRuntime (process) -{ - -} - -bool -CPPLanguageRuntime::GetObjectDescription (Stream &str, ValueObject &object) -{ - // C++ has no generic way to do this. - return false; -} - -bool -CPPLanguageRuntime::GetObjectDescription (Stream &str, Value &value, ExecutionContextScope *exe_scope) -{ - // C++ has no generic way to do this. - return false; -} - -bool -CPPLanguageRuntime::IsCPPMangledName (const char *name) -{ - // FIXME, we should really run through all the known C++ Language plugins and ask each one if - // this is a C++ mangled name, but we can put that off till there is actually more than one - // we care about. - - if (name && name[0] == '_' && name[1] == 'Z') - return true; - else - return false; -} - -bool -CPPLanguageRuntime::StripNamespacesFromVariableName (const char *name, const char *&base_name_start, const char *&base_name_end) -{ - if (base_name_end == NULL) - base_name_end = name + strlen (name); - - const char *last_colon = NULL; - for (const char *ptr = base_name_end; ptr != name; ptr--) - { - if (*ptr == ':') - { - last_colon = ptr; - break; - } - } - - if (last_colon == NULL) - { - base_name_start = name; - return true; - } - - // Can't have a C++ name that begins with a single ':', nor contains an internal single ':' - if (last_colon == name) - return false; - else if (last_colon[-1] != ':') - return false; - else - { - // FIXME: should check if there is - base_name_start = last_colon + 1; - return true; - } -} -bool -CPPLanguageRuntime::IsPossibleCPPCall (const char *name, const char *&base_name_start, const char *&base_name_end) -{ - if (!name) - return false; - // For now, I really can't handle taking template names apart, so if you - // have < or > I'll say "could be CPP but leave the base_name empty which - // means I couldn't figure out what to use for that. - // FIXME: Do I need to do more sanity checking here? - - if (strchr(name, '>') != NULL || strchr (name, '>') != NULL) - return true; - - size_t name_len = strlen (name); - - if (name[name_len - 1] == ')') - { - // We've got arguments. - base_name_end = strchr (name, '('); - if (base_name_end == NULL) - return false; - - // FIXME: should check that this parenthesis isn't a template specialized - // on a function type or something gross like that... - } - else - base_name_end = name + strlen (name); - - return StripNamespacesFromVariableName (name, base_name_start, base_name_end); -} - -uint32_t -CPPLanguageRuntime::FindEquivalentNames(ConstString type_name, std::vector<ConstString>& equivalents) -{ - uint32_t count = GetEquivalentsMap().FindExactMatches(type_name, equivalents); - - bool might_have_partials= - ( count == 0 ) // if we have a full name match just use it - && (strchr(type_name.AsCString(), '<') != NULL // we should only have partial matches when templates are involved, check that we have - && strchr(type_name.AsCString(), '>') != NULL); // angle brackets in the type_name before trying to scan for partial matches - - if ( might_have_partials ) - count = GetEquivalentsMap().FindPartialMatches(type_name, equivalents); - - return count; -} |
