If a ValueObject has a child that vends synthetic children, but only does so to generate a value for itself, that's not a disqualifier from one-line printing. Also, fetch synthetic values if available and requested for children as well while printing them

llvm-svn: 219427
This commit is contained in:
Enrico Granata 2014-10-09 18:47:36 +00:00
parent 55f66f77fe
commit ddac7611ee
4 changed files with 19 additions and 6 deletions

View File

@ -541,6 +541,7 @@ FormatManager::ShouldPrintAsOneLiner (ValueObject& valobj)
idx < valobj.GetNumChildren(); idx < valobj.GetNumChildren();
idx++) idx++)
{ {
bool is_synth_val = false;
ValueObjectSP child_sp(valobj.GetChildAtIndex(idx, true)); ValueObjectSP child_sp(valobj.GetChildAtIndex(idx, true));
// something is wrong here - bail out // something is wrong here - bail out
if (!child_sp) if (!child_sp)
@ -548,7 +549,17 @@ FormatManager::ShouldPrintAsOneLiner (ValueObject& valobj)
// if we decided to define synthetic children for a type, we probably care enough // if we decided to define synthetic children for a type, we probably care enough
// to show them, but avoid nesting children in children // to show them, but avoid nesting children in children
if (child_sp->GetSyntheticChildren().get() != nullptr) if (child_sp->GetSyntheticChildren().get() != nullptr)
{
ValueObjectSP synth_sp(child_sp->GetSyntheticValue());
// wait.. wat? just get out of here..
if (!synth_sp)
return false; return false;
// but if we only have them to provide a value, keep going
if (synth_sp->MightHaveChildren() == false && synth_sp->DoesProvideSyntheticValue())
is_synth_val = true;
else
return false;
}
total_children_name_len += child_sp->GetName().GetLength(); total_children_name_len += child_sp->GetName().GetLength();
@ -572,7 +583,7 @@ FormatManager::ShouldPrintAsOneLiner (ValueObject& valobj)
// ...and no summary... // ...and no summary...
// (if it had a summary and the summary wanted children, we would have bailed out anyway // (if it had a summary and the summary wanted children, we would have bailed out anyway
// so this only makes us bail out if this has no summary and we would then print children) // so this only makes us bail out if this has no summary and we would then print children)
if (!child_sp->GetSummaryFormat()) if (!child_sp->GetSummaryFormat() && !is_synth_val) // but again only do that if not a synthetic valued child
return false; // then bail out return false; // then bail out
} }
} }

View File

@ -591,9 +591,8 @@ ValueObjectPrinter::PrintChildrenOneLiner (bool hide_names)
for (uint32_t idx=0; idx<num_children; ++idx) for (uint32_t idx=0; idx<num_children; ++idx)
{ {
lldb::ValueObjectSP child_sp(synth_m_valobj->GetChildAtIndex(idx, true)); lldb::ValueObjectSP child_sp(synth_m_valobj->GetChildAtIndex(idx, true));
lldb::ValueObjectSP child_dyn_sp = child_sp.get() ? child_sp->GetDynamicValue(options.m_use_dynamic) : child_sp; if (child_sp)
if (child_dyn_sp) child_sp = child_sp->GetQualifiedRepresentationIfAvailable(options.m_use_dynamic, options.m_use_synthetic);
child_sp = child_dyn_sp;
if (child_sp) if (child_sp)
{ {
if (idx) if (idx)

View File

@ -88,6 +88,9 @@ class DataFormatterSynthValueTestCase(TestBase):
self.expect("frame variable x", substrs=['3']) self.expect("frame variable x", substrs=['3'])
self.expect("frame variable x", substrs=['theValue = 3'], matching=False) self.expect("frame variable x", substrs=['theValue = 3'], matching=False)
# check that an aptly defined synthetic provider does not affect one-lining
self.expect("expression struct S { myInt theInt{12}; }; S()", substrs = ['(theInt = 12)'])
if __name__ == '__main__': if __name__ == '__main__':
import atexit import atexit
lldb.SBDebugger.Initialize() lldb.SBDebugger.Initialize()

View File

@ -10,7 +10,7 @@ class myIntSynthProvider(object):
return None return None
def update(self): def update(self):
return False return False
def might_have_children(self): def has_children(self):
return False return False
def get_value(self): def get_value(self):
return self.val return self.val