diff options
Diffstat (limited to 'lldb')
4 files changed, 19 insertions, 6 deletions
diff --git a/lldb/source/DataFormatters/FormatManager.cpp b/lldb/source/DataFormatters/FormatManager.cpp index 723e6c70cf3..bd4e58c7567 100644 --- a/lldb/source/DataFormatters/FormatManager.cpp +++ b/lldb/source/DataFormatters/FormatManager.cpp @@ -541,6 +541,7 @@ FormatManager::ShouldPrintAsOneLiner (ValueObject& valobj) idx < valobj.GetNumChildren(); idx++) { + bool is_synth_val = false; ValueObjectSP child_sp(valobj.GetChildAtIndex(idx, true)); // something is wrong here - bail out 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 // to show them, but avoid nesting children in children if (child_sp->GetSyntheticChildren().get() != nullptr) - return false; + { + ValueObjectSP synth_sp(child_sp->GetSyntheticValue()); + // wait.. wat? just get out of here.. + if (!synth_sp) + 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(); @@ -572,7 +583,7 @@ FormatManager::ShouldPrintAsOneLiner (ValueObject& valobj) // ...and no summary... // (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) - 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 } } diff --git a/lldb/source/DataFormatters/ValueObjectPrinter.cpp b/lldb/source/DataFormatters/ValueObjectPrinter.cpp index 126ff78c389..e7bebcbeb4f 100644 --- a/lldb/source/DataFormatters/ValueObjectPrinter.cpp +++ b/lldb/source/DataFormatters/ValueObjectPrinter.cpp @@ -591,9 +591,8 @@ ValueObjectPrinter::PrintChildrenOneLiner (bool hide_names) for (uint32_t idx=0; idx<num_children; ++idx) { 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_dyn_sp) - child_sp = child_dyn_sp; + if (child_sp) + child_sp = child_sp->GetQualifiedRepresentationIfAvailable(options.m_use_dynamic, options.m_use_synthetic); if (child_sp) { if (idx) diff --git a/lldb/test/functionalities/data-formatter/data-formatter-synthval/TestDataFormatterSynthVal.py b/lldb/test/functionalities/data-formatter/data-formatter-synthval/TestDataFormatterSynthVal.py index c5ff06b04b4..1fd0d8be8cf 100644 --- a/lldb/test/functionalities/data-formatter/data-formatter-synthval/TestDataFormatterSynthVal.py +++ b/lldb/test/functionalities/data-formatter/data-formatter-synthval/TestDataFormatterSynthVal.py @@ -87,6 +87,9 @@ class DataFormatterSynthValueTestCase(TestBase): self.expect("frame variable x", substrs=['3']) 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__': import atexit diff --git a/lldb/test/functionalities/data-formatter/data-formatter-synthval/myIntSynthProvider.py b/lldb/test/functionalities/data-formatter/data-formatter-synthval/myIntSynthProvider.py index d37cb0ecc5f..c716836a673 100644 --- a/lldb/test/functionalities/data-formatter/data-formatter-synthval/myIntSynthProvider.py +++ b/lldb/test/functionalities/data-formatter/data-formatter-synthval/myIntSynthProvider.py @@ -10,7 +10,7 @@ class myIntSynthProvider(object): return None def update(self): return False - def might_have_children(self): + def has_children(self): return False def get_value(self): return self.val |