Allow individual ValueObjects to pick their preferred display language

Most of the time, we can use context information just fine to choose a language (i.e. the language of the frame that the root object was defined in, if any); but in some cases, synthetic children may be fabricated as root frame-less entities, and then we wouldn't know any better

This patch allows (internal) synthetic child providers to set a display language on the children they generate, should they so choose

llvm-svn: 226634
This commit is contained in:
Enrico Granata 2015-01-21 01:47:13 +00:00
parent 290d347471
commit ed3228aa5f
2 changed files with 28 additions and 12 deletions

View File

@ -875,6 +875,9 @@ public:
virtual lldb::LanguageType
GetPreferredDisplayLanguage ();
void
SetPreferredDisplayLanguage (lldb::LanguageType);
lldb::TypeSummaryImplSP
GetSummaryFormat()
{
@ -1106,6 +1109,8 @@ protected:
llvm::SmallVector<uint8_t, 16> m_value_checksum;
lldb::LanguageType m_preferred_display_language;
bool m_value_is_valid:1,
m_value_did_change:1,
m_children_count_valid:1,

View File

@ -99,6 +99,7 @@ ValueObject::ValueObject (ValueObject &parent) :
m_user_id_of_forced_summary(),
m_address_type_of_ptr_or_ref_children(eAddressTypeInvalid),
m_value_checksum(),
m_preferred_display_language(lldb::eLanguageTypeUnknown),
m_value_is_valid (false),
m_value_did_change (false),
m_children_count_valid (false),
@ -149,6 +150,7 @@ ValueObject::ValueObject (ExecutionContextScope *exe_scope,
m_user_id_of_forced_summary(),
m_address_type_of_ptr_or_ref_children(child_ptr_or_ref_addr_type),
m_value_checksum(),
m_preferred_display_language(lldb::eLanguageTypeUnknown),
m_value_is_valid (false),
m_value_did_change (false),
m_children_count_valid (false),
@ -4181,24 +4183,33 @@ ValueObject::GetFormat () const
lldb::LanguageType
ValueObject::GetPreferredDisplayLanguage ()
{
lldb::LanguageType type = lldb::eLanguageTypeUnknown;
if (GetRoot())
lldb::LanguageType type = m_preferred_display_language;
if (m_preferred_display_language == lldb::eLanguageTypeUnknown)
{
if (GetRoot() == this)
if (GetRoot())
{
if (StackFrameSP frame_sp = GetFrameSP())
if (GetRoot() == this)
{
const SymbolContext& sc(frame_sp->GetSymbolContext(eSymbolContextCompUnit));
if (CompileUnit* cu = sc.comp_unit)
type = cu->GetLanguage();
if (StackFrameSP frame_sp = GetFrameSP())
{
const SymbolContext& sc(frame_sp->GetSymbolContext(eSymbolContextCompUnit));
if (CompileUnit* cu = sc.comp_unit)
type = cu->GetLanguage();
}
}
else
{
type = GetRoot()->GetPreferredDisplayLanguage();
}
}
else
{
type = GetRoot()->GetPreferredDisplayLanguage();
}
}
return type;
return (m_preferred_display_language = type); // only compute it once
}
void
ValueObject::SetPreferredDisplayLanguage (lldb::LanguageType lt)
{
m_preferred_display_language = lt;
}
bool