Added an extra way to chop up an objective C prototype and use it where necessary.
llvm-svn: 148445
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.cpp
index 185a5cc..f13bba5 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.cpp
@@ -737,12 +737,16 @@
ConstString objc_class_name;
ConstString objc_selector_name;
ConstString objc_fullname_no_category_name;
+ ConstString objc_class_name_no_category;
if (ObjCLanguageRuntime::ParseMethodName (name,
&objc_class_name,
&objc_selector_name,
- &objc_fullname_no_category_name))
+ &objc_fullname_no_category_name,
+ &objc_class_name_no_category))
{
objc_class_selectors.Insert(objc_class_name, die.GetOffset());
+ if (objc_class_name_no_category)
+ objc_class_selectors.Insert(objc_class_name_no_category, die.GetOffset());
func_selectors.Insert (objc_selector_name, die.GetOffset());
func_fullnames.Insert (ConstString(name), die.GetOffset());
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
index 671afdd8..7ebd026 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
@@ -4898,17 +4898,14 @@
if (tag == DW_TAG_subprogram)
{
ConstString class_name;
-
- if (ObjCLanguageRuntime::ParseMethodName (type_name_cstr, &class_name, NULL, NULL))
+ if (ObjCLanguageRuntime::ParseMethodName (type_name_cstr, NULL, NULL, NULL, &class_name))
{
SymbolContext empty_sc;
clang_type_t class_opaque_type = NULL;
if (class_name)
{
TypeList types;
- TypeSP complete_objc_class_type_sp (FindCompleteObjCDefinitionTypeForDIE (NULL, class_name, true));
- if (!complete_objc_class_type_sp)
- complete_objc_class_type_sp = FindCompleteObjCDefinitionTypeForDIE (NULL, class_name, false);
+ TypeSP complete_objc_class_type_sp (FindCompleteObjCDefinitionTypeForDIE (NULL, class_name, false));
if (complete_objc_class_type_sp)
{
diff --git a/lldb/source/Symbol/Symtab.cpp b/lldb/source/Symbol/Symtab.cpp
index 0dd5f31..ea354af 100644
--- a/lldb/source/Symbol/Symtab.cpp
+++ b/lldb/source/Symbol/Symtab.cpp
@@ -313,7 +313,8 @@
if (ObjCLanguageRuntime::ParseMethodName (entry.cstring,
NULL,
NULL,
- &objc_base_name)
+ &objc_base_name,
+ NULL)
&& !objc_base_name.IsEmpty())
{
entry.cstring = objc_base_name.GetCString();
diff --git a/lldb/source/Target/ObjCLanguageRuntime.cpp b/lldb/source/Target/ObjCLanguageRuntime.cpp
index 42e707c..e8fc510 100644
--- a/lldb/source/Target/ObjCLanguageRuntime.cpp
+++ b/lldb/source/Target/ObjCLanguageRuntime.cpp
@@ -103,13 +103,19 @@
bool
ObjCLanguageRuntime::ParseMethodName (const char *name,
- ConstString *class_name,
- ConstString *selector_name,
- ConstString *name_sans_category)
+ ConstString *class_name, // Class name (with category if any)
+ ConstString *selector_name, // selector on its own
+ ConstString *name_sans_category, // Full function prototype with no category
+ ConstString *class_name_sans_category)// Class name with no category (or empty if no category as answer will be in "class_name"
{
- if (class_name) { class_name->Clear(); }
- if (selector_name) { selector_name->Clear(); }
- if (name_sans_category) { name_sans_category->Clear(); }
+ if (class_name)
+ class_name->Clear();
+ if (selector_name)
+ selector_name->Clear();
+ if (name_sans_category)
+ name_sans_category->Clear();
+ if (class_name_sans_category)
+ class_name_sans_category->Clear();
if (IsPossibleObjCMethodName (name))
{
@@ -122,8 +128,7 @@
// "]" suffix
if (name_len >= 6 && name[name_len - 1] == ']')
{
- const char *selector_name_ptr;
- selector_name_ptr = strchr (name, ' ');
+ const char *selector_name_ptr = strchr (name, ' ');
if (selector_name_ptr)
{
if (class_name)
@@ -140,18 +145,21 @@
// Also see if this is a "category" on our class. If so strip off the category name,
// and add the class name without it to the basename table.
- if (name_sans_category)
+ if (name_sans_category || class_name_sans_category)
{
- const char *first_paren = (char *) memchr (name, '(', selector_name_ptr - name);
- if (first_paren)
+ const char *open_paren = strchr (name, '(');
+ const char *close_paren = NULL;
+ if (open_paren)
{
- const char *second_paren = (char *) memchr (first_paren, ')', selector_name_ptr - first_paren);
- if (second_paren)
+ if (class_name_sans_category)
+ class_name_sans_category->SetCStringWithLength (name + 2, open_paren - name - 2);
+ close_paren = strchr (name, ')');
+ if (close_paren)
{
- std::string buffer (name, first_paren - name);
- buffer.append (second_paren + 1);
+ std::string buffer (name, open_paren - name);
+ buffer.append (close_paren + 1);
name_sans_category->SetCString (buffer.c_str());
-
+
}
}
}
@@ -160,6 +168,5 @@
}
return false;
}
- else
- return false;
+ return false;
}