forked from OSchip/llvm-project
Let the Module FindType do the stripping of namespace components, that's not expensive
and doing it both at the ModuleList and Module levels means we look 4 times for a negative search. Also, don't do the search for the stripped name if that is the same as the original one. llvm-svn: 148054
This commit is contained in:
parent
0037e08811
commit
50b3d507bd
|
@ -434,13 +434,6 @@ protected:
|
||||||
collection m_modules; ///< The collection of modules.
|
collection m_modules; ///< The collection of modules.
|
||||||
mutable Mutex m_modules_mutex;
|
mutable Mutex m_modules_mutex;
|
||||||
|
|
||||||
private:
|
|
||||||
uint32_t
|
|
||||||
FindTypes_Impl (const SymbolContext& sc,
|
|
||||||
const ConstString &name,
|
|
||||||
bool append,
|
|
||||||
uint32_t max_matches,
|
|
||||||
TypeList& types);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace lldb_private
|
} // namespace lldb_private
|
||||||
|
|
|
@ -531,8 +531,13 @@ Module::FindTypes (const SymbolContext& sc, const ConstString &name, const Clan
|
||||||
|
|
||||||
if (retval == 0)
|
if (retval == 0)
|
||||||
{
|
{
|
||||||
const char *stripped = StripTypeName(name.GetCString());
|
const char *orig_name = name.GetCString();
|
||||||
return FindTypes_Impl(sc, ConstString(stripped), namespace_decl, append, max_matches, types);
|
const char *stripped = StripTypeName(orig_name);
|
||||||
|
// Only do this lookup if StripTypeName has stripped the name:
|
||||||
|
if (stripped != orig_name)
|
||||||
|
return FindTypes_Impl(sc, ConstString(stripped), namespace_decl, append, max_matches, types);
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
return retval;
|
return retval;
|
||||||
|
|
|
@ -434,7 +434,7 @@ ModuleList::FindModule (const UUID &uuid)
|
||||||
|
|
||||||
|
|
||||||
uint32_t
|
uint32_t
|
||||||
ModuleList::FindTypes_Impl (const SymbolContext& sc, const ConstString &name, bool append, uint32_t max_matches, TypeList& types)
|
ModuleList::FindTypes (const SymbolContext& sc, const ConstString &name, bool append, uint32_t max_matches, TypeList& types)
|
||||||
{
|
{
|
||||||
Mutex::Locker locker(m_modules_mutex);
|
Mutex::Locker locker(m_modules_mutex);
|
||||||
|
|
||||||
|
@ -454,41 +454,6 @@ ModuleList::FindTypes_Impl (const SymbolContext& sc, const ConstString &name, bo
|
||||||
return total_matches;
|
return total_matches;
|
||||||
}
|
}
|
||||||
|
|
||||||
// depending on implementation details, type lookup might fail because of
|
|
||||||
// embedded spurious namespace:: prefixes. this call strips them, paying
|
|
||||||
// attention to the fact that a type might have namespace'd type names as
|
|
||||||
// arguments to templates, and those must not be stripped off
|
|
||||||
static const char*
|
|
||||||
StripTypeName(const char* name_cstr)
|
|
||||||
{
|
|
||||||
const char* skip_namespace = strstr(name_cstr, "::");
|
|
||||||
const char* template_arg_char = strchr(name_cstr, '<');
|
|
||||||
while (skip_namespace != NULL)
|
|
||||||
{
|
|
||||||
if (template_arg_char != NULL &&
|
|
||||||
skip_namespace > template_arg_char) // but namespace'd template arguments are still good to go
|
|
||||||
break;
|
|
||||||
name_cstr = skip_namespace+2;
|
|
||||||
skip_namespace = strstr(name_cstr, "::");
|
|
||||||
}
|
|
||||||
return name_cstr;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t
|
|
||||||
ModuleList::FindTypes (const SymbolContext& sc, const ConstString &name, bool append, uint32_t max_matches, TypeList& types)
|
|
||||||
{
|
|
||||||
uint32_t retval = FindTypes_Impl(sc, name, append, max_matches, types);
|
|
||||||
|
|
||||||
if (retval == 0)
|
|
||||||
{
|
|
||||||
const char *stripped = StripTypeName(name.GetCString());
|
|
||||||
return FindTypes_Impl(sc, ConstString(stripped), append, max_matches, types);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
return retval;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
ModuleSP
|
ModuleSP
|
||||||
ModuleList::FindFirstModuleForFileSpec (const FileSpec &file_spec,
|
ModuleList::FindFirstModuleForFileSpec (const FileSpec &file_spec,
|
||||||
const ArchSpec *arch_ptr,
|
const ArchSpec *arch_ptr,
|
||||||
|
|
Loading…
Reference in New Issue