Skip to content

Commit 6252994

Browse files
committed
Change GetNumChildren()/CalculateNumChildren() methods return llvm::Expected (llvm#84219)
Change GetNumChildren()/CalculateNumChildren() methods return llvm::Expected This is an NFC change that does not yet add any error handling or change any code to return any errors. This is the second big change in the patch series started with llvm#83501 A follow-up PR will wire up error handling. (cherry picked from commit 624ea68)
1 parent b97c5d5 commit 6252994

File tree

73 files changed

+399
-248
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

73 files changed

+399
-248
lines changed

lldb/include/lldb/Core/ValueObject.h

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -485,7 +485,13 @@ class ValueObject {
485485

486486
virtual size_t GetIndexOfChildWithName(llvm::StringRef name);
487487

488-
uint32_t GetNumChildren(uint32_t max = UINT32_MAX);
488+
llvm::Expected<uint32_t> GetNumChildren(uint32_t max = UINT32_MAX);
489+
/// Like \c GetNumChildren but returns 0 on error. You probably
490+
/// shouldn't be using this function. It exists primarily to ease the
491+
/// transition to more pervasive error handling while not all APIs
492+
/// have been updated.
493+
uint32_t GetNumChildrenIgnoringErrors(uint32_t max = UINT32_MAX);
494+
bool HasChildren() { return GetNumChildrenIgnoringErrors() > 0; }
489495

490496
const Value &GetValue() const { return m_value; }
491497

@@ -972,7 +978,8 @@ class ValueObject {
972978
int32_t synthetic_index);
973979

974980
/// Should only be called by ValueObject::GetNumChildren().
975-
virtual uint32_t CalculateNumChildren(uint32_t max = UINT32_MAX) = 0;
981+
virtual llvm::Expected<uint32_t>
982+
CalculateNumChildren(uint32_t max = UINT32_MAX) = 0;
976983

977984
void SetNumChildren(uint32_t num_children);
978985

lldb/include/lldb/Core/ValueObjectCast.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ class ValueObjectCast : public ValueObject {
3333

3434
std::optional<uint64_t> GetByteSize() override;
3535

36-
uint32_t CalculateNumChildren(uint32_t max) override;
36+
llvm::Expected<uint32_t> CalculateNumChildren(uint32_t max) override;
3737

3838
lldb::ValueType GetValueType() const override;
3939

lldb/include/lldb/Core/ValueObjectChild.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ class ValueObjectChild : public ValueObject {
3939

4040
lldb::ValueType GetValueType() const override;
4141

42-
uint32_t CalculateNumChildren(uint32_t max) override;
42+
llvm::Expected<uint32_t> CalculateNumChildren(uint32_t max) override;
4343

4444
ConstString GetTypeName() override;
4545

lldb/include/lldb/Core/ValueObjectConstResult.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ class ValueObjectConstResult : public ValueObject {
6767

6868
lldb::ValueType GetValueType() const override;
6969

70-
uint32_t CalculateNumChildren(uint32_t max) override;
70+
llvm::Expected<uint32_t> CalculateNumChildren(uint32_t max) override;
7171

7272
ConstString GetTypeName() override;
7373

lldb/include/lldb/Core/ValueObjectDynamicValue.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ class ValueObjectDynamicValue : public ValueObject {
4343

4444
ConstString GetDisplayTypeName() override;
4545

46-
uint32_t CalculateNumChildren(uint32_t max) override;
46+
llvm::Expected<uint32_t> CalculateNumChildren(uint32_t max) override;
4747

4848
lldb::ValueType GetValueType() const override;
4949

lldb/include/lldb/Core/ValueObjectMemory.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ class ValueObjectMemory : public ValueObject {
4747

4848
ConstString GetDisplayTypeName() override;
4949

50-
uint32_t CalculateNumChildren(uint32_t max) override;
50+
llvm::Expected<uint32_t> CalculateNumChildren(uint32_t max) override;
5151

5252
lldb::ValueType GetValueType() const override;
5353

lldb/include/lldb/Core/ValueObjectRegister.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ class ValueObjectRegisterSet : public ValueObject {
4747

4848
ConstString GetQualifiedTypeName() override;
4949

50-
uint32_t CalculateNumChildren(uint32_t max) override;
50+
llvm::Expected<uint32_t> CalculateNumChildren(uint32_t max) override;
5151

5252
ValueObject *CreateChildAtIndex(size_t idx, bool synthetic_array_member,
5353
int32_t synthetic_index) override;
@@ -95,7 +95,7 @@ class ValueObjectRegister : public ValueObject {
9595

9696
ConstString GetTypeName() override;
9797

98-
uint32_t CalculateNumChildren(uint32_t max) override;
98+
llvm::Expected<uint32_t> CalculateNumChildren(uint32_t max) override;
9999

100100
bool SetValueFromCString(const char *value_str, Status &error) override;
101101

lldb/include/lldb/Core/ValueObjectSyntheticFilter.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ class ValueObjectSynthetic : public ValueObject {
4747

4848
bool MightHaveChildren() override;
4949

50-
uint32_t CalculateNumChildren(uint32_t max) override;
50+
llvm::Expected<uint32_t> CalculateNumChildren(uint32_t max) override;
5151

5252
lldb::ValueType GetValueType() const override;
5353

lldb/include/lldb/Core/ValueObjectVTable.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ class ValueObjectVTable : public ValueObject {
6464

6565
std::optional<uint64_t> GetByteSize() override;
6666

67-
uint32_t CalculateNumChildren(uint32_t max) override;
67+
llvm::Expected<uint32_t> CalculateNumChildren(uint32_t max) override;
6868

6969
ValueObject *CreateChildAtIndex(size_t idx, bool synthetic_array_member,
7070
int32_t synthetic_index) override;

lldb/include/lldb/Core/ValueObjectVariable.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ class ValueObjectVariable : public ValueObject {
4646

4747
ConstString GetDisplayTypeName() override;
4848

49-
uint32_t CalculateNumChildren(uint32_t max) override;
49+
llvm::Expected<uint32_t> CalculateNumChildren(uint32_t max) override;
5050

5151
lldb::ValueType GetValueType() const override;
5252

lldb/include/lldb/DataFormatters/TypeSynthetic.h

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,17 @@ class SyntheticChildrenFrontEnd {
3838

3939
virtual ~SyntheticChildrenFrontEnd() = default;
4040

41-
virtual uint32_t CalculateNumChildren() = 0;
41+
virtual llvm::Expected<uint32_t> CalculateNumChildren() = 0;
4242

43-
virtual uint32_t CalculateNumChildren(uint32_t max) {
43+
virtual llvm::Expected<uint32_t> CalculateNumChildren(uint32_t max) {
4444
auto count = CalculateNumChildren();
45-
return count <= max ? count : max;
45+
if (!count)
46+
return count;
47+
return *count <= max ? *count : max;
4648
}
4749

50+
uint32_t CalculateNumChildrenIgnoringErrors(uint32_t max = UINT32_MAX);
51+
4852
virtual lldb::ValueObjectSP GetChildAtIndex(uint32_t idx) = 0;
4953

5054
virtual size_t GetIndexOfChildWithName(ConstString name) = 0;
@@ -109,7 +113,7 @@ class SyntheticValueProviderFrontEnd : public SyntheticChildrenFrontEnd {
109113

110114
~SyntheticValueProviderFrontEnd() override = default;
111115

112-
uint32_t CalculateNumChildren() override { return 0; }
116+
llvm::Expected<uint32_t> CalculateNumChildren() override { return 0; }
113117

114118
lldb::ValueObjectSP GetChildAtIndex(uint32_t idx) override { return nullptr; }
115119

@@ -322,7 +326,9 @@ class TypeFilterImpl : public SyntheticChildren {
322326

323327
~FrontEnd() override = default;
324328

325-
uint32_t CalculateNumChildren() override { return filter->GetCount(); }
329+
llvm::Expected<uint32_t> CalculateNumChildren() override {
330+
return filter->GetCount();
331+
}
326332

327333
lldb::ValueObjectSP GetChildAtIndex(uint32_t idx) override {
328334
if (idx >= filter->GetCount())
@@ -426,9 +432,9 @@ class ScriptedSyntheticChildren : public SyntheticChildren {
426432

427433
bool IsValid();
428434

429-
uint32_t CalculateNumChildren() override;
435+
llvm::Expected<uint32_t> CalculateNumChildren() override;
430436

431-
uint32_t CalculateNumChildren(uint32_t max) override;
437+
llvm::Expected<uint32_t> CalculateNumChildren(uint32_t max) override;
432438

433439
lldb::ValueObjectSP GetChildAtIndex(uint32_t idx) override;
434440

lldb/include/lldb/DataFormatters/VectorIterator.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ class VectorIteratorSyntheticFrontEnd : public SyntheticChildrenFrontEnd {
2424
VectorIteratorSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp,
2525
llvm::ArrayRef<ConstString> item_names);
2626

27-
uint32_t CalculateNumChildren() override;
27+
llvm::Expected<uint32_t> CalculateNumChildren() override;
2828

2929
lldb::ValueObjectSP GetChildAtIndex(uint32_t idx) override;
3030

lldb/include/lldb/Symbol/CompilerType.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -345,8 +345,9 @@ class CompilerType {
345345

346346
std::optional<size_t> GetTypeBitAlign(ExecutionContextScope *exe_scope) const;
347347

348-
uint32_t GetNumChildren(bool omit_empty_base_classes,
349-
const ExecutionContext *exe_ctx) const;
348+
llvm::Expected<uint32_t>
349+
GetNumChildren(bool omit_empty_base_classes,
350+
const ExecutionContext *exe_ctx) const;
350351

351352
lldb::BasicType GetBasicTypeEnumeration() const;
352353

lldb/include/lldb/Symbol/Type.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -440,7 +440,7 @@ class Type : public std::enable_shared_from_this<Type>, public UserID {
440440

441441
std::optional<uint64_t> GetByteSize(ExecutionContextScope *exe_scope);
442442

443-
uint32_t GetNumChildren(bool omit_empty_base_classes);
443+
llvm::Expected<uint32_t> GetNumChildren(bool omit_empty_base_classes);
444444

445445
bool IsAggregateType();
446446

lldb/include/lldb/Symbol/TypeSystem.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -323,9 +323,10 @@ class TypeSystem : public PluginInterface,
323323

324324
virtual lldb::Format GetFormat(lldb::opaque_compiler_type_t type) = 0;
325325

326-
virtual uint32_t GetNumChildren(lldb::opaque_compiler_type_t type,
327-
bool omit_empty_base_classes,
328-
const ExecutionContext *exe_ctx) = 0;
326+
virtual llvm::Expected<uint32_t>
327+
GetNumChildren(lldb::opaque_compiler_type_t type,
328+
bool omit_empty_base_classes,
329+
const ExecutionContext *exe_ctx) = 0;
329330

330331
virtual CompilerType GetBuiltinTypeByName(ConstString name);
331332

lldb/include/lldb/Target/StackFrameRecognizer.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,8 @@ class ValueObjectRecognizerSynthesizedValue : public ValueObject {
164164
m_value = m_parent->GetValue();
165165
return true;
166166
}
167-
uint32_t CalculateNumChildren(uint32_t max = UINT32_MAX) override {
167+
llvm::Expected<uint32_t>
168+
CalculateNumChildren(uint32_t max = UINT32_MAX) override {
168169
return m_parent->GetNumChildren(max);
169170
}
170171
CompilerType GetCompilerTypeImpl() override {

lldb/include/lldb/Utility/Log.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -373,4 +373,18 @@ template <typename Cat> Log *GetLog(Cat mask) {
373373
::llvm::consumeError(::std::move(error_private)); \
374374
} while (0)
375375

376+
// Write message to the verbose log, if error is set. In the log
377+
// message refer to the error with {0}. Error is cleared regardless of
378+
// whether logging is enabled.
379+
#define LLDB_LOG_ERRORV(log, error, ...) \
380+
do { \
381+
::lldb_private::Log *log_private = (log); \
382+
::llvm::Error error_private = (error); \
383+
if (log_private && log_private->GetVerbose() && error_private) { \
384+
log_private->FormatError(::std::move(error_private), __FILE__, __func__, \
385+
__VA_ARGS__); \
386+
} else \
387+
::llvm::consumeError(::std::move(error_private)); \
388+
} while (0)
389+
376390
#endif // LLDB_UTILITY_LOG_H

lldb/source/API/SBValue.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -947,7 +947,7 @@ uint32_t SBValue::GetNumChildren(uint32_t max) {
947947
ValueLocker locker;
948948
lldb::ValueObjectSP value_sp(GetSP(locker));
949949
if (value_sp)
950-
num_children = value_sp->GetNumChildren(max);
950+
num_children = value_sp->GetNumChildrenIgnoringErrors(max);
951951

952952
return num_children;
953953
}

lldb/source/Core/FormatEntity.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -926,7 +926,7 @@ static bool DumpValue(Stream &s, const SymbolContext *sc,
926926
s.PutChar('[');
927927

928928
if (index_higher < 0)
929-
index_higher = valobj->GetNumChildren() - 1;
929+
index_higher = valobj->GetNumChildrenIgnoringErrors() - 1;
930930

931931
uint32_t max_num_children =
932932
target->GetTargetSP()->GetMaximumNumberOfChildrenToDisplay();

lldb/source/Core/IOHandlerCursesGUI.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4520,7 +4520,7 @@ struct Row {
45204520
calculated_children = true;
45214521
ValueObjectSP valobj = value.GetSP();
45224522
if (valobj) {
4523-
const size_t num_children = valobj->GetNumChildren();
4523+
const uint32_t num_children = valobj->GetNumChildrenIgnoringErrors();
45244524
for (size_t i = 0; i < num_children; ++i) {
45254525
children.push_back(Row(valobj->GetChildAtIndex(i), this));
45264526
}

lldb/source/Core/ValueObject.cpp

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -464,7 +464,7 @@ ValueObjectSP ValueObject::GetChildAtIndex(uint32_t idx, bool can_create) {
464464
// We may need to update our value if we are dynamic
465465
if (IsPossibleDynamicType())
466466
UpdateValueIfNeeded(false);
467-
if (idx < GetNumChildren()) {
467+
if (idx < GetNumChildrenIgnoringErrors()) {
468468
// Check if we have already made the child value object?
469469
if (can_create && !m_children.HasChildAtIndex(idx)) {
470470
// No we haven't created the child at this index, so lets have our
@@ -546,7 +546,7 @@ ValueObjectSP ValueObject::GetChildMemberWithName(llvm::StringRef name,
546546
return child_sp;
547547
}
548548

549-
uint32_t ValueObject::GetNumChildren(uint32_t max) {
549+
llvm::Expected<uint32_t> ValueObject::GetNumChildren(uint32_t max) {
550550
UpdateValueIfNeeded();
551551

552552
if (max < UINT32_MAX) {
@@ -558,19 +558,32 @@ uint32_t ValueObject::GetNumChildren(uint32_t max) {
558558
}
559559

560560
if (!m_flags.m_children_count_valid) {
561-
SetNumChildren(CalculateNumChildren());
561+
auto num_children_or_err = CalculateNumChildren();
562+
if (num_children_or_err)
563+
SetNumChildren(*num_children_or_err);
564+
else
565+
return num_children_or_err;
562566
}
563567
return m_children.GetChildrenCount();
564568
}
565569

570+
uint32_t ValueObject::GetNumChildrenIgnoringErrors(uint32_t max) {
571+
auto value_or_err = GetNumChildren(max);
572+
if (value_or_err)
573+
return *value_or_err;
574+
LLDB_LOG_ERRORV(GetLog(LLDBLog::DataFormatters), value_or_err.takeError(),
575+
"{0}");
576+
return 0;
577+
}
578+
566579
bool ValueObject::MightHaveChildren() {
567580
bool has_children = false;
568581
const uint32_t type_info = GetTypeInfo();
569582
if (type_info) {
570583
if (type_info & (eTypeHasChildren | eTypeIsPointer | eTypeIsReference))
571584
has_children = true;
572585
} else {
573-
has_children = GetNumChildren() > 0;
586+
has_children = GetNumChildrenIgnoringErrors() > 0;
574587
}
575588
return has_children;
576589
}
@@ -1283,7 +1296,7 @@ bool ValueObject::DumpPrintableRepresentation(
12831296
if (flags.Test(eTypeIsArray)) {
12841297
if ((custom_format == eFormatBytes) ||
12851298
(custom_format == eFormatBytesWithASCII)) {
1286-
const size_t count = GetNumChildren();
1299+
const size_t count = GetNumChildrenIgnoringErrors();
12871300

12881301
s << '[';
12891302
for (size_t low = 0; low < count; low++) {
@@ -1322,7 +1335,7 @@ bool ValueObject::DumpPrintableRepresentation(
13221335
// format should be printed
13231336
// directly
13241337
{
1325-
const size_t count = GetNumChildren();
1338+
const size_t count = GetNumChildrenIgnoringErrors();
13261339

13271340
Format format = FormatManager::GetSingleItemFormat(custom_format);
13281341

@@ -1401,7 +1414,7 @@ bool ValueObject::DumpPrintableRepresentation(
14011414
break;
14021415

14031416
case eValueObjectRepresentationStyleChildrenCount:
1404-
strm.Printf("%" PRIu64 "", (uint64_t)GetNumChildren());
1417+
strm.Printf("%" PRIu64 "", (uint64_t)GetNumChildrenIgnoringErrors());
14051418
str = strm.GetString();
14061419
break;
14071420

@@ -2439,7 +2452,9 @@ ValueObjectSP ValueObject::GetValueForExpressionPath_Impl(
24392452
child_valobj_sp = root->GetSyntheticArrayMember(index, true);
24402453
if (!child_valobj_sp)
24412454
if (root->HasSyntheticValue() &&
2442-
root->GetSyntheticValue()->GetNumChildren() > index)
2455+
llvm::expectedToStdOptional(
2456+
root->GetSyntheticValue()->GetNumChildren())
2457+
.value_or(0) > index)
24432458
child_valobj_sp =
24442459
root->GetSyntheticValue()->GetChildAtIndex(index);
24452460
if (child_valobj_sp) {

lldb/source/Core/ValueObjectCast.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,13 @@ ValueObjectCast::~ValueObjectCast() = default;
4141

4242
CompilerType ValueObjectCast::GetCompilerTypeImpl() { return m_cast_type; }
4343

44-
uint32_t ValueObjectCast::CalculateNumChildren(uint32_t max) {
44+
llvm::Expected<uint32_t> ValueObjectCast::CalculateNumChildren(uint32_t max) {
4545
ExecutionContext exe_ctx(GetExecutionContextRef());
4646
auto children_count = GetCompilerType().GetNumChildren(
4747
true, &exe_ctx);
48-
return children_count <= max ? children_count : max;
48+
if (!children_count)
49+
return children_count;
50+
return *children_count <= max ? *children_count : max;
4951
}
5052

5153
std::optional<uint64_t> ValueObjectCast::GetByteSize() {

lldb/source/Core/ValueObjectChild.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,12 @@ lldb::ValueType ValueObjectChild::GetValueType() const {
5050
return m_parent->GetValueType();
5151
}
5252

53-
uint32_t ValueObjectChild::CalculateNumChildren(uint32_t max) {
53+
llvm::Expected<uint32_t> ValueObjectChild::CalculateNumChildren(uint32_t max) {
5454
ExecutionContext exe_ctx(GetExecutionContextRef());
5555
auto children_count = GetCompilerType().GetNumChildren(true, &exe_ctx);
56-
return children_count <= max ? children_count : max;
56+
if (!children_count)
57+
return children_count;
58+
return *children_count <= max ? *children_count : max;
5759
}
5860

5961
static void AdjustForBitfieldness(ConstString &name,

0 commit comments

Comments
 (0)