diff options
-rw-r--r-- | lldb/source/Core/Module.cpp | 2 | ||||
-rw-r--r-- | lldb/source/Target/CPPLanguageRuntime.cpp | 31 |
2 files changed, 13 insertions, 20 deletions
diff --git a/lldb/source/Core/Module.cpp b/lldb/source/Core/Module.cpp index 4e985c0e115..f2755282c61 100644 --- a/lldb/source/Core/Module.cpp +++ b/lldb/source/Core/Module.cpp @@ -1730,6 +1730,8 @@ Module::PrepareForFunctionNameLookup (const ConstString &name, { if (CPPLanguageRuntime::StripNamespacesFromVariableName (name_cstr, base_name_start, base_name_end)) lookup_name_type_mask |= (eFunctionNameTypeMethod | eFunctionNameTypeBase); + else + lookup_name_type_mask = eFunctionNameTypeFull; } else { diff --git a/lldb/source/Target/CPPLanguageRuntime.cpp b/lldb/source/Target/CPPLanguageRuntime.cpp index f5b7f7fc41a..c928912ca76 100644 --- a/lldb/source/Target/CPPLanguageRuntime.cpp +++ b/lldb/source/Target/CPPLanguageRuntime.cpp @@ -192,28 +192,19 @@ CPPLanguageRuntime::IsCPPMangledName (const char *name) 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 = strrchr (name, ':'); - - if (last_colon == NULL) + static RegularExpression g_basename_regex("([A-Za-z_][A-Za-z_0-9]*::)+([A-Za-z_][A-Za-z_0-9]*)$"); + RegularExpression::Match match(2); + if (g_basename_regex.Execute (name, &match)) { - 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; + llvm::StringRef basename; + if (match.GetMatchAtIndex(name, 2, basename)) + { + base_name_start = basename.data(); + base_name_end = base_name_start + basename.size(); + return true; + } } + return false; } uint32_t |