summaryrefslogtreecommitdiff
path: root/lldb/source/DataFormatters/ValueObjectPrinter.cpp
diff options
context:
space:
mode:
authorAdrian Prantl <adrian-prantl@users.noreply.github.com>2024-03-11 13:04:56 -0700
committerGitHub <noreply@github.com>2024-03-11 13:04:56 -0700
commit6462eadbd316aed1b1074ed73bcaf1698886bba1 (patch)
treec40881a3f0408c4e7c4c02ea97a60dbe61a5c43c /lldb/source/DataFormatters/ValueObjectPrinter.cpp
parent94c988bcfdea596e5c9078be8ec28688eb0d96a3 (diff)
Report back errors in GetNumChildren() (#84265)
This is a proof-of-concept patch that illustrates how to use the Expected return values to surface rich error messages all the way up to the ValueObjectPrinter. This is the final patch in the series that includes https://github.com/llvm/llvm-project/pull/83501 and https://github.com/llvm/llvm-project/pull/84219
Diffstat (limited to 'lldb/source/DataFormatters/ValueObjectPrinter.cpp')
-rw-r--r--lldb/source/DataFormatters/ValueObjectPrinter.cpp22
1 files changed, 18 insertions, 4 deletions
diff --git a/lldb/source/DataFormatters/ValueObjectPrinter.cpp b/lldb/source/DataFormatters/ValueObjectPrinter.cpp
index b853199e878c..bbdc2a998157 100644
--- a/lldb/source/DataFormatters/ValueObjectPrinter.cpp
+++ b/lldb/source/DataFormatters/ValueObjectPrinter.cpp
@@ -621,13 +621,17 @@ void ValueObjectPrinter::PrintChild(
}
}
-uint32_t ValueObjectPrinter::GetMaxNumChildrenToPrint(bool &print_dotdotdot) {
+llvm::Expected<uint32_t>
+ValueObjectPrinter::GetMaxNumChildrenToPrint(bool &print_dotdotdot) {
ValueObject &synth_valobj = GetValueObjectForChildrenGeneration();
if (m_options.m_pointer_as_array)
return m_options.m_pointer_as_array.m_element_count;
- uint32_t num_children = synth_valobj.GetNumChildrenIgnoringErrors();
+ auto num_children_or_err = synth_valobj.GetNumChildren();
+ if (!num_children_or_err)
+ return num_children_or_err;
+ uint32_t num_children = *num_children_or_err;
print_dotdotdot = false;
if (num_children) {
const size_t max_num_children = GetMostSpecializedValue()
@@ -704,7 +708,12 @@ void ValueObjectPrinter::PrintChildren(
ValueObject &synth_valobj = GetValueObjectForChildrenGeneration();
bool print_dotdotdot = false;
- size_t num_children = GetMaxNumChildrenToPrint(print_dotdotdot);
+ auto num_children_or_err = GetMaxNumChildrenToPrint(print_dotdotdot);
+ if (!num_children_or_err) {
+ *m_stream << " <" << llvm::toString(num_children_or_err.takeError()) << '>';
+ return;
+ }
+ uint32_t num_children = *num_children_or_err;
if (num_children) {
bool any_children_printed = false;
@@ -753,7 +762,12 @@ bool ValueObjectPrinter::PrintChildrenOneLiner(bool hide_names) {
ValueObject &synth_valobj = GetValueObjectForChildrenGeneration();
bool print_dotdotdot = false;
- size_t num_children = GetMaxNumChildrenToPrint(print_dotdotdot);
+ auto num_children_or_err = GetMaxNumChildrenToPrint(print_dotdotdot);
+ if (!num_children_or_err) {
+ *m_stream << '<' << llvm::toString(num_children_or_err.takeError()) << '>';
+ return true;
+ }
+ uint32_t num_children = *num_children_or_err;
if (num_children) {
m_stream->PutChar('(');