https://github.com/charles-zablit created https://github.com/llvm/llvm-project/pull/136693
This patch replaces the use of `UINT32_MAX` as the error return value of `GetIndexOfChildWithName` with `llvm::Expected`. >From 143140ca46927e87019dcc818702785ebdb15540 Mon Sep 17 00:00:00 2001 From: Charles Zablit <c_zab...@apple.com> Date: Tue, 22 Apr 2025 12:09:02 +0100 Subject: [PATCH] [lldb] Upgrade GetIndexOfChildWithName to use llvm::Expected --- lldb/include/lldb/API/SBValue.h | 2 + .../lldb/DataFormatters/TypeSynthetic.h | 11 ++-- .../lldb/DataFormatters/VectorIterator.h | 2 +- .../lldb/Interpreter/ScriptInterpreter.h | 5 +- lldb/include/lldb/Symbol/CompilerType.h | 5 +- lldb/include/lldb/Symbol/TypeSystem.h | 7 ++- lldb/include/lldb/ValueObject/ValueObject.h | 2 +- .../lldb/ValueObject/ValueObjectRegister.h | 2 +- .../ValueObject/ValueObjectSyntheticFilter.h | 2 +- lldb/source/API/SBValue.cpp | 10 +++- .../DataFormatters/FormatterBytecode.cpp | 9 ++- lldb/source/DataFormatters/TypeSynthetic.cpp | 9 +-- lldb/source/DataFormatters/VectorType.cpp | 5 +- .../Language/CPlusPlus/BlockPointer.cpp | 16 ++++-- .../Plugins/Language/CPlusPlus/Coroutines.cpp | 9 ++- .../Plugins/Language/CPlusPlus/Coroutines.h | 2 +- .../Language/CPlusPlus/GenericBitset.cpp | 2 +- .../Language/CPlusPlus/GenericOptional.cpp | 2 +- .../Plugins/Language/CPlusPlus/LibCxx.cpp | 14 +++-- .../Plugins/Language/CPlusPlus/LibCxx.h | 4 +- .../Language/CPlusPlus/LibCxxAtomic.cpp | 11 +++- .../CPlusPlus/LibCxxInitializerList.cpp | 5 +- .../Plugins/Language/CPlusPlus/LibCxxList.cpp | 2 +- .../Plugins/Language/CPlusPlus/LibCxxMap.cpp | 12 ++-- .../Language/CPlusPlus/LibCxxProxyArray.cpp | 5 +- .../Language/CPlusPlus/LibCxxQueue.cpp | 9 ++- .../CPlusPlus/LibCxxRangesRefView.cpp | 2 +- .../Language/CPlusPlus/LibCxxSliceArray.cpp | 8 ++- .../Plugins/Language/CPlusPlus/LibCxxSpan.cpp | 9 +-- .../Language/CPlusPlus/LibCxxTuple.cpp | 2 +- .../Language/CPlusPlus/LibCxxUnorderedMap.cpp | 13 +++-- .../Language/CPlusPlus/LibCxxValarray.cpp | 8 ++- .../Language/CPlusPlus/LibCxxVariant.cpp | 9 ++- .../Language/CPlusPlus/LibCxxVector.cpp | 16 ++++-- .../Plugins/Language/CPlusPlus/LibStdcpp.cpp | 25 ++++---- .../Language/CPlusPlus/LibStdcppTuple.cpp | 6 +- .../CPlusPlus/LibStdcppUniquePointer.cpp | 9 +-- lldb/source/Plugins/Language/ObjC/Cocoa.cpp | 5 +- lldb/source/Plugins/Language/ObjC/NSArray.cpp | 23 ++++---- .../Plugins/Language/ObjC/NSDictionary.cpp | 57 +++++++++++-------- lldb/source/Plugins/Language/ObjC/NSError.cpp | 5 +- .../Plugins/Language/ObjC/NSException.cpp | 5 +- .../Plugins/Language/ObjC/NSIndexPath.cpp | 5 +- lldb/source/Plugins/Language/ObjC/NSSet.cpp | 25 ++++---- .../Python/ScriptInterpreterPython.cpp | 16 ++++-- .../Python/ScriptInterpreterPythonImpl.h | 5 +- .../TypeSystem/Clang/TypeSystemClang.cpp | 2 +- .../TypeSystem/Clang/TypeSystemClang.h | 7 ++- lldb/source/Symbol/CompilerType.cpp | 5 +- lldb/source/ValueObject/ValueObject.cpp | 3 +- .../ValueObject/ValueObjectRegister.cpp | 6 +- .../ValueObjectSyntheticFilter.cpp | 37 ++++++------ 52 files changed, 286 insertions(+), 191 deletions(-) diff --git a/lldb/include/lldb/API/SBValue.h b/lldb/include/lldb/API/SBValue.h index 75d20a4378f09..69c50ab038e5b 100644 --- a/lldb/include/lldb/API/SBValue.h +++ b/lldb/include/lldb/API/SBValue.h @@ -13,6 +13,8 @@ #include "lldb/API/SBDefines.h" #include "lldb/API/SBType.h" +#include "lldb/Core/Value.h" + class ValueImpl; class ValueLocker; diff --git a/lldb/include/lldb/DataFormatters/TypeSynthetic.h b/lldb/include/lldb/DataFormatters/TypeSynthetic.h index 14e516964f250..a132c63a93b08 100644 --- a/lldb/include/lldb/DataFormatters/TypeSynthetic.h +++ b/lldb/include/lldb/DataFormatters/TypeSynthetic.h @@ -51,7 +51,7 @@ class SyntheticChildrenFrontEnd { virtual lldb::ValueObjectSP GetChildAtIndex(uint32_t idx) = 0; - virtual size_t GetIndexOfChildWithName(ConstString name) = 0; + virtual llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) = 0; /// This function is assumed to always succeed and if it fails, the front-end /// should know to deal with it in the correct way (most probably, by refusing @@ -117,8 +117,9 @@ class SyntheticValueProviderFrontEnd : public SyntheticChildrenFrontEnd { lldb::ValueObjectSP GetChildAtIndex(uint32_t idx) override { return nullptr; } - size_t GetIndexOfChildWithName(ConstString name) override { - return UINT32_MAX; + llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override { + return llvm::createStringError("Cannot find index of child '%s'", + name.AsCString()); } lldb::ChildCacheState Update() override { @@ -343,7 +344,7 @@ class TypeFilterImpl : public SyntheticChildren { bool MightHaveChildren() override { return filter->GetCount() > 0; } - size_t GetIndexOfChildWithName(ConstString name) override; + llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override; typedef std::shared_ptr<SyntheticChildrenFrontEnd> SharedPointer; @@ -442,7 +443,7 @@ class ScriptedSyntheticChildren : public SyntheticChildren { bool MightHaveChildren() override; - size_t GetIndexOfChildWithName(ConstString name) override; + llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override; lldb::ValueObjectSP GetSyntheticValue() override; diff --git a/lldb/include/lldb/DataFormatters/VectorIterator.h b/lldb/include/lldb/DataFormatters/VectorIterator.h index d095f085cabab..bdfaca7349c6a 100644 --- a/lldb/include/lldb/DataFormatters/VectorIterator.h +++ b/lldb/include/lldb/DataFormatters/VectorIterator.h @@ -30,7 +30,7 @@ class VectorIteratorSyntheticFrontEnd : public SyntheticChildrenFrontEnd { lldb::ChildCacheState Update() override; - size_t GetIndexOfChildWithName(ConstString name) override; + llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override; private: ExecutionContextRef m_exe_ctx_ref; diff --git a/lldb/include/lldb/Interpreter/ScriptInterpreter.h b/lldb/include/lldb/Interpreter/ScriptInterpreter.h index 25e82779f05c6..5425e58f0d594 100644 --- a/lldb/include/lldb/Interpreter/ScriptInterpreter.h +++ b/lldb/include/lldb/Interpreter/ScriptInterpreter.h @@ -368,10 +368,11 @@ class ScriptInterpreter : public PluginInterface { return lldb::ValueObjectSP(); } - virtual int + virtual llvm::Expected<int> GetIndexOfChildWithName(const StructuredData::ObjectSP &implementor, const char *child_name) { - return UINT32_MAX; + return llvm::createStringError("Cannot find index of child '%s'", + child_name); } virtual bool diff --git a/lldb/include/lldb/Symbol/CompilerType.h b/lldb/include/lldb/Symbol/CompilerType.h index 41a1676dabd76..539a4cae04e1c 100644 --- a/lldb/include/lldb/Symbol/CompilerType.h +++ b/lldb/include/lldb/Symbol/CompilerType.h @@ -450,8 +450,9 @@ class CompilerType { /// Lookup a child given a name. This function will match base class names and /// member member names in "clang_type" only, not descendants. - uint32_t GetIndexOfChildWithName(llvm::StringRef name, - bool omit_empty_base_classes) const; + llvm::Expected<uint32_t> + GetIndexOfChildWithName(llvm::StringRef name, + bool omit_empty_base_classes) const; /// Lookup a child member given a name. This function will match member names /// only and will descend into "clang_type" children in search for the first diff --git a/lldb/include/lldb/Symbol/TypeSystem.h b/lldb/include/lldb/Symbol/TypeSystem.h index 59fb066e087d3..0881c47cbaa1a 100644 --- a/lldb/include/lldb/Symbol/TypeSystem.h +++ b/lldb/include/lldb/Symbol/TypeSystem.h @@ -375,9 +375,10 @@ class TypeSystem : public PluginInterface, // Lookup a child given a name. This function will match base class names and // member member names in "clang_type" only, not descendants. - virtual uint32_t GetIndexOfChildWithName(lldb::opaque_compiler_type_t type, - llvm::StringRef name, - bool omit_empty_base_classes) = 0; + virtual llvm::Expected<uint32_t> + GetIndexOfChildWithName(lldb::opaque_compiler_type_t type, + llvm::StringRef name, + bool omit_empty_base_classes) = 0; // Lookup a child member given a name. This function will match member names // only and will descend into "clang_type" children in search for the first diff --git a/lldb/include/lldb/ValueObject/ValueObject.h b/lldb/include/lldb/ValueObject/ValueObject.h index 06d2589002ed0..0add8ebeccdc8 100644 --- a/lldb/include/lldb/ValueObject/ValueObject.h +++ b/lldb/include/lldb/ValueObject/ValueObject.h @@ -498,7 +498,7 @@ class ValueObject { virtual lldb::ValueObjectSP GetChildMemberWithName(llvm::StringRef name, bool can_create = true); - virtual size_t GetIndexOfChildWithName(llvm::StringRef name); + virtual llvm::Expected<size_t> GetIndexOfChildWithName(llvm::StringRef name); llvm::Expected<uint32_t> GetNumChildren(uint32_t max = UINT32_MAX); /// Like \c GetNumChildren but returns 0 on error. You probably diff --git a/lldb/include/lldb/ValueObject/ValueObjectRegister.h b/lldb/include/lldb/ValueObject/ValueObjectRegister.h index 0812dc575aaa1..3db4b00bd1b15 100644 --- a/lldb/include/lldb/ValueObject/ValueObjectRegister.h +++ b/lldb/include/lldb/ValueObject/ValueObjectRegister.h @@ -52,7 +52,7 @@ class ValueObjectRegisterSet : public ValueObject { lldb::ValueObjectSP GetChildMemberWithName(llvm::StringRef name, bool can_create = true) override; - size_t GetIndexOfChildWithName(llvm::StringRef name) override; + llvm::Expected<size_t> GetIndexOfChildWithName(llvm::StringRef name) override; protected: bool UpdateValue() override; diff --git a/lldb/include/lldb/ValueObject/ValueObjectSyntheticFilter.h b/lldb/include/lldb/ValueObject/ValueObjectSyntheticFilter.h index df205a258a997..cdb2b1ddc3646 100644 --- a/lldb/include/lldb/ValueObject/ValueObjectSyntheticFilter.h +++ b/lldb/include/lldb/ValueObject/ValueObjectSyntheticFilter.h @@ -57,7 +57,7 @@ class ValueObjectSynthetic : public ValueObject { lldb::ValueObjectSP GetChildMemberWithName(llvm::StringRef name, bool can_create = true) override; - size_t GetIndexOfChildWithName(llvm::StringRef name) override; + llvm::Expected<size_t> GetIndexOfChildWithName(llvm::StringRef name) override; lldb::ValueObjectSP GetDynamicValue(lldb::DynamicValueType valueType) override; diff --git a/lldb/source/API/SBValue.cpp b/lldb/source/API/SBValue.cpp index 6b91120f6427a..7b23484023ab3 100644 --- a/lldb/source/API/SBValue.cpp +++ b/lldb/source/API/SBValue.cpp @@ -704,13 +704,17 @@ SBValue SBValue::GetChildAtIndex(uint32_t idx, uint32_t SBValue::GetIndexOfChildWithName(const char *name) { LLDB_INSTRUMENT_VA(this, name); - uint32_t idx = UINT32_MAX; ValueLocker locker; lldb::ValueObjectSP value_sp(GetSP(locker)); if (value_sp) { - idx = value_sp->GetIndexOfChildWithName(name); + auto idx_or_err = value_sp->GetIndexOfChildWithName(name); + if (!idx_or_err) { + llvm::consumeError(idx_or_err.takeError()); + return UINT32_MAX; + } + return *idx_or_err; } - return idx; + return UINT32_MAX; } SBValue SBValue::GetChildMemberWithName(const char *name) { diff --git a/lldb/source/DataFormatters/FormatterBytecode.cpp b/lldb/source/DataFormatters/FormatterBytecode.cpp index 7f3dbe0dba37d..5d65c3043427f 100644 --- a/lldb/source/DataFormatters/FormatterBytecode.cpp +++ b/lldb/source/DataFormatters/FormatterBytecode.cpp @@ -14,6 +14,7 @@ #include "llvm/Support/Format.h" #include "llvm/Support/FormatProviders.h" #include "llvm/Support/FormatVariadicDetails.h" +#include <lldb/ValueObject/ValueObjectConstResult.h> using namespace lldb; namespace lldb_private { @@ -489,7 +490,13 @@ llvm::Error Interpret(std::vector<ControlStackElement> &control, TYPE_CHECK(Object, String); auto name = data.Pop<std::string>(); POP_VALOBJ(valobj); - data.Push((uint64_t)valobj->GetIndexOfChildWithName(name)); + auto index_or_err = valobj->GetIndexOfChildWithName(name); + if (!index_or_err) { + data.Push(ValueObjectConstResult::Create( + nullptr, Status::FromError(index_or_err.takeError()))); + break; + } + data.Push((uint64_t)*index_or_err); break; } case sel_get_type: { diff --git a/lldb/source/DataFormatters/TypeSynthetic.cpp b/lldb/source/DataFormatters/TypeSynthetic.cpp index 7aa0670190b25..fb23efedbde3d 100644 --- a/lldb/source/DataFormatters/TypeSynthetic.cpp +++ b/lldb/source/DataFormatters/TypeSynthetic.cpp @@ -49,7 +49,7 @@ bool TypeFilterImpl::SetExpressionPathAtIndex(size_t i, return true; } -size_t +llvm::Expected<size_t> TypeFilterImpl::FrontEnd::GetIndexOfChildWithName(ConstString name) { const char *name_cstr = name.GetCString(); if (name_cstr) { @@ -218,10 +218,11 @@ bool ScriptedSyntheticChildren::FrontEnd::MightHaveChildren() { return m_interpreter->MightHaveChildrenSynthProviderInstance(m_wrapper_sp); } -size_t ScriptedSyntheticChildren::FrontEnd::GetIndexOfChildWithName( - ConstString name) { +llvm::Expected<size_t> +ScriptedSyntheticChildren::FrontEnd::GetIndexOfChildWithName(ConstString name) { if (!m_wrapper_sp || m_interpreter == nullptr) - return UINT32_MAX; + return llvm::createStringError("Cannot find index of child '%s'", + name.AsCString()); return m_interpreter->GetIndexOfChildWithName(m_wrapper_sp, name.GetCString()); } diff --git a/lldb/source/DataFormatters/VectorType.cpp b/lldb/source/DataFormatters/VectorType.cpp index 162b075ec87d2..2ddd6e9b006fb 100644 --- a/lldb/source/DataFormatters/VectorType.cpp +++ b/lldb/source/DataFormatters/VectorType.cpp @@ -269,11 +269,12 @@ class VectorTypeSyntheticFrontEnd : public SyntheticChildrenFrontEnd { return lldb::ChildCacheState::eRefetch; } - size_t GetIndexOfChildWithName(ConstString name) override { + llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override { const char *item_name = name.GetCString(); uint32_t idx = ExtractIndexFromString(item_name); if (idx < UINT32_MAX && idx >= CalculateNumChildrenIgnoringErrors()) - return UINT32_MAX; + return llvm::createStringError("Cannot find index of child '%s'", + name.AsCString()); return idx; } diff --git a/lldb/source/Plugins/Language/CPlusPlus/BlockPointer.cpp b/lldb/source/Plugins/Language/CPlusPlus/BlockPointer.cpp index 6a22501c98aab..6731c96341ac8 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/BlockPointer.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/BlockPointer.cpp @@ -144,9 +144,10 @@ class BlockPointerSyntheticFrontEnd : public SyntheticChildrenFrontEnd { return lldb::ChildCacheState::eRefetch; } - size_t GetIndexOfChildWithName(ConstString name) override { + llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override { if (!m_block_struct_type.IsValid()) - return UINT32_MAX; + return llvm::createStringError("Cannot find index of child '%s'", + name.AsCString()); const bool omit_empty_base_classes = false; return m_block_struct_type.GetIndexOfChildWithName(name.AsCString(), @@ -172,8 +173,15 @@ bool lldb_private::formatters::BlockPointerSummaryProvider( static const ConstString s_FuncPtr_name("__FuncPtr"); - lldb::ValueObjectSP child_sp = synthetic_children->GetChildAtIndex( - synthetic_children->GetIndexOfChildWithName(s_FuncPtr_name)); + auto index_or_err = + synthetic_children->GetIndexOfChildWithName(s_FuncPtr_name); + + if (!index_or_err) { + return false; + } + + lldb::ValueObjectSP child_sp = + synthetic_children->GetChildAtIndex(*index_or_err); if (!child_sp) { return false; diff --git a/lldb/source/Plugins/Language/CPlusPlus/Coroutines.cpp b/lldb/source/Plugins/Language/CPlusPlus/Coroutines.cpp index 76a10d2393782..0d68b1f4eda1b 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/Coroutines.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/Coroutines.cpp @@ -199,10 +199,12 @@ lldb_private::formatters::StdlibCoroutineHandleSyntheticFrontEnd::Update() { return lldb::ChildCacheState::eRefetch; } -size_t StdlibCoroutineHandleSyntheticFrontEnd::GetIndexOfChildWithName( +llvm::Expected<size_t> +StdlibCoroutineHandleSyntheticFrontEnd::GetIndexOfChildWithName( ConstString name) { if (!m_resume_ptr_sp || !m_destroy_ptr_sp) - return UINT32_MAX; + return llvm::createStringError("Cannot find index of child '%s'", + name.AsCString()); if (name == ConstString("resume")) return 0; @@ -211,7 +213,8 @@ size_t StdlibCoroutineHandleSyntheticFrontEnd::GetIndexOfChildWithName( if (name == ConstString("promise_ptr") && m_promise_ptr_sp) return 2; - return UINT32_MAX; + return llvm::createStringError("Cannot find index of child '%s'", + name.AsCString()); } SyntheticChildrenFrontEnd * diff --git a/lldb/source/Plugins/Language/CPlusPlus/Coroutines.h b/lldb/source/Plugins/Language/CPlusPlus/Coroutines.h index c33c82bd2fc45..fd9445d46e6a0 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/Coroutines.h +++ b/lldb/source/Plugins/Language/CPlusPlus/Coroutines.h @@ -40,7 +40,7 @@ class StdlibCoroutineHandleSyntheticFrontEnd lldb::ChildCacheState Update() override; - size_t GetIndexOfChildWithName(ConstString name) override; + llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override; private: lldb::ValueObjectSP m_resume_ptr_sp; diff --git a/lldb/source/Plugins/Language/CPlusPlus/GenericBitset.cpp b/lldb/source/Plugins/Language/CPlusPlus/GenericBitset.cpp index 03671c3efed6f..49c51835d1ed6 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/GenericBitset.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/GenericBitset.cpp @@ -28,7 +28,7 @@ class GenericBitsetFrontEnd : public SyntheticChildrenFrontEnd { GenericBitsetFrontEnd(ValueObject &valobj, StdLib stdlib); - size_t GetIndexOfChildWithName(ConstString name) override { + llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override { return formatters::ExtractIndexFromString(name.GetCString()); } diff --git a/lldb/source/Plugins/Language/CPlusPlus/GenericOptional.cpp b/lldb/source/Plugins/Language/CPlusPlus/GenericOptional.cpp index b224d3e859c84..c6b3c3344ef3a 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/GenericOptional.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/GenericOptional.cpp @@ -36,7 +36,7 @@ class GenericOptionalFrontend : public SyntheticChildrenFrontEnd { GenericOptionalFrontend(ValueObject &valobj, StdLib stdlib); - size_t GetIndexOfChildWithName(ConstString name) override { + llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override { if (name == "$$dereference$$") return 0; return formatters::ExtractIndexFromString(name.GetCString()); diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibCxx.cpp b/lldb/source/Plugins/Language/CPlusPlus/LibCxx.cpp index 63620c6bf0ddd..04487f86719ba 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibCxx.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/LibCxx.cpp @@ -309,13 +309,15 @@ lldb_private::formatters::LibcxxSharedPtrSyntheticFrontEnd::Update() { return lldb::ChildCacheState::eRefetch; } -size_t lldb_private::formatters::LibcxxSharedPtrSyntheticFrontEnd:: +llvm::Expected<size_t> +lldb_private::formatters::LibcxxSharedPtrSyntheticFrontEnd:: GetIndexOfChildWithName(ConstString name) { if (name == "__ptr_") return 0; if (name == "$$dereference$$") return 1; - return UINT32_MAX; + return llvm::createStringError("Cannot find index of child '%s'", + name.AsCString()); } lldb_private::formatters::LibcxxSharedPtrSyntheticFrontEnd:: @@ -407,7 +409,8 @@ lldb_private::formatters::LibcxxUniquePtrSyntheticFrontEnd::Update() { return lldb::ChildCacheState::eRefetch; } -size_t lldb_private::formatters::LibcxxUniquePtrSyntheticFrontEnd:: +llvm::Expected<size_t> +lldb_private::formatters::LibcxxUniquePtrSyntheticFrontEnd:: GetIndexOfChildWithName(ConstString name) { if (name == "pointer") return 0; @@ -415,7 +418,8 @@ size_t lldb_private::formatters::LibcxxUniquePtrSyntheticFrontEnd:: return 1; if (name == "$$dereference$$") return 2; - return UINT32_MAX; + return llvm::createStringError("Cannot find index of child '%s'", + name.AsCString()); } bool lldb_private::formatters::LibcxxContainerSummaryProvider( @@ -456,7 +460,7 @@ ExtractLibcxxStringInfo(ValueObject &valobj) { if (!l) return {}; - StringLayout layout = l->GetIndexOfChildWithName("__data_") == 0 + StringLayout layout = l->GetIndexOfChildWithName("__data_").get() == 0 ? StringLayout::DSC : StringLayout::CSD; diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibCxx.h b/lldb/source/Plugins/Language/CPlusPlus/LibCxx.h index 21fbb361eb934..56501302d116f 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibCxx.h +++ b/lldb/source/Plugins/Language/CPlusPlus/LibCxx.h @@ -102,7 +102,7 @@ class LibcxxSharedPtrSyntheticFrontEnd : public SyntheticChildrenFrontEnd { lldb::ChildCacheState Update() override; - size_t GetIndexOfChildWithName(ConstString name) override; + llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override; ~LibcxxSharedPtrSyntheticFrontEnd() override; @@ -120,7 +120,7 @@ class LibcxxUniquePtrSyntheticFrontEnd : public SyntheticChildrenFrontEnd { lldb::ChildCacheState Update() override; - size_t GetIndexOfChildWithName(ConstString name) override; + llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override; ~LibcxxUniquePtrSyntheticFrontEnd() override; diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibCxxAtomic.cpp b/lldb/source/Plugins/Language/CPlusPlus/LibCxxAtomic.cpp index 3104f33ee80b3..87962d4f33cbd 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibCxxAtomic.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/LibCxxAtomic.cpp @@ -96,7 +96,7 @@ class LibcxxStdAtomicSyntheticFrontEnd : public SyntheticChildrenFrontEnd { lldb::ChildCacheState Update() override; - size_t GetIndexOfChildWithName(ConstString name) override; + llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override; private: ValueObject *m_real_child = nullptr; @@ -130,9 +130,14 @@ lldb_private::formatters::LibcxxStdAtomicSyntheticFrontEnd::GetChildAtIndex( return nullptr; } -size_t lldb_private::formatters::LibcxxStdAtomicSyntheticFrontEnd:: +llvm::Expected<size_t> +lldb_private::formatters::LibcxxStdAtomicSyntheticFrontEnd:: GetIndexOfChildWithName(ConstString name) { - return name == "Value" ? 0 : UINT32_MAX; + if (name == "Value") { + return 0; + } + return llvm::createStringError("Cannot find index of child '%s'", + name.AsCString()); } SyntheticChildrenFrontEnd * diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibCxxInitializerList.cpp b/lldb/source/Plugins/Language/CPlusPlus/LibCxxInitializerList.cpp index ffc894256626c..83a7d23f0de9a 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibCxxInitializerList.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/LibCxxInitializerList.cpp @@ -32,7 +32,7 @@ class LibcxxInitializerListSyntheticFrontEnd lldb::ChildCacheState Update() override; - size_t GetIndexOfChildWithName(ConstString name) override; + llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override; private: ValueObject *m_start = nullptr; @@ -100,7 +100,8 @@ lldb_private::formatters::LibcxxInitializerListSyntheticFrontEnd::Update() { return lldb::ChildCacheState::eRefetch; } -size_t lldb_private::formatters::LibcxxInitializerListSyntheticFrontEnd:: +llvm::Expected<size_t> +lldb_private::formatters::LibcxxInitializerListSyntheticFrontEnd:: GetIndexOfChildWithName(ConstString name) { if (!m_start) return UINT32_MAX; diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibCxxList.cpp b/lldb/source/Plugins/Language/CPlusPlus/LibCxxList.cpp index ae1ad2bfe7200..a85ea9c829051 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibCxxList.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/LibCxxList.cpp @@ -106,7 +106,7 @@ class ListIterator { class AbstractListFrontEnd : public SyntheticChildrenFrontEnd { public: - size_t GetIndexOfChildWithName(ConstString name) override { + llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override { return ExtractIndexFromString(name.GetCString()); } lldb::ChildCacheState Update() override; diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibCxxMap.cpp b/lldb/source/Plugins/Language/CPlusPlus/LibCxxMap.cpp index d75f25f49fdb4..7fee02babe52e 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibCxxMap.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/LibCxxMap.cpp @@ -197,7 +197,7 @@ class LibcxxStdMapSyntheticFrontEnd : public SyntheticChildrenFrontEnd { lldb::ChildCacheState Update() override; - size_t GetIndexOfChildWithName(ConstString name) override; + llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override; private: llvm::Expected<uint32_t> CalculateNumChildrenForOldCompressedPairLayout(); @@ -235,7 +235,7 @@ class LibCxxMapIteratorSyntheticFrontEnd : public SyntheticChildrenFrontEnd { lldb::ChildCacheState Update() override; - size_t GetIndexOfChildWithName(ConstString name) override; + llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override; ~LibCxxMapIteratorSyntheticFrontEnd() override = default; @@ -393,7 +393,7 @@ lldb_private::formatters::LibcxxStdMapSyntheticFrontEnd::Update() { return lldb::ChildCacheState::eRefetch; } -size_t lldb_private::formatters::LibcxxStdMapSyntheticFrontEnd:: +llvm::Expected<size_t> lldb_private::formatters::LibcxxStdMapSyntheticFrontEnd:: GetIndexOfChildWithName(ConstString name) { return ExtractIndexFromString(name.GetCString()); } @@ -488,10 +488,12 @@ lldb_private::formatters::LibCxxMapIteratorSyntheticFrontEnd::GetChildAtIndex( return m_pair_sp->GetChildAtIndex(idx); } -size_t lldb_private::formatters::LibCxxMapIteratorSyntheticFrontEnd:: +llvm::Expected<size_t> +lldb_private::formatters::LibCxxMapIteratorSyntheticFrontEnd:: GetIndexOfChildWithName(ConstString name) { if (!m_pair_sp) - return UINT32_MAX; + return llvm::createStringError("Cannot find index of child '%s'", + name.AsCString()); return m_pair_sp->GetIndexOfChildWithName(name); } diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibCxxProxyArray.cpp b/lldb/source/Plugins/Language/CPlusPlus/LibCxxProxyArray.cpp index 23fcff5e88bb2..4a9396c312b45 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibCxxProxyArray.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/LibCxxProxyArray.cpp @@ -41,7 +41,7 @@ class LibcxxStdProxyArraySyntheticFrontEnd : public SyntheticChildrenFrontEnd { lldb::ChildCacheState Update() override; - size_t GetIndexOfChildWithName(ConstString name) override; + llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override; private: /// A non-owning pointer to the array's __vp_. @@ -173,7 +173,8 @@ lldb_private::formatters::LibcxxStdProxyArraySyntheticFrontEnd::Update() { return ChildCacheState::eRefetch; } -size_t lldb_private::formatters::LibcxxStdProxyArraySyntheticFrontEnd:: +llvm::Expected<size_t> +lldb_private::formatters::LibcxxStdProxyArraySyntheticFrontEnd:: GetIndexOfChildWithName(ConstString name) { if (!m_base) return std::numeric_limits<size_t>::max(); diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibCxxQueue.cpp b/lldb/source/Plugins/Language/CPlusPlus/LibCxxQueue.cpp index 8f1e35b3bede9..64292cb197db2 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibCxxQueue.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/LibCxxQueue.cpp @@ -20,9 +20,12 @@ class QueueFrontEnd : public SyntheticChildrenFrontEnd { Update(); } - size_t GetIndexOfChildWithName(ConstString name) override { - return m_container_sp ? m_container_sp->GetIndexOfChildWithName(name) - : UINT32_MAX; + llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override { + if (m_container_sp) { + return m_container_sp->GetIndexOfChildWithName(name); + } + return llvm::createStringError("Cannot find index of child '%s'", + name.AsCString()); } lldb::ChildCacheState Update() override; diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibCxxRangesRefView.cpp b/lldb/source/Plugins/Language/CPlusPlus/LibCxxRangesRefView.cpp index e8ab37a022fbc..72ccc84fabbe7 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibCxxRangesRefView.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/LibCxxRangesRefView.cpp @@ -40,7 +40,7 @@ class LibcxxStdRangesRefViewSyntheticFrontEnd lldb::ChildCacheState Update() override; - size_t GetIndexOfChildWithName(ConstString name) override { + llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override { // We only have a single child return 0; } diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibCxxSliceArray.cpp b/lldb/source/Plugins/Language/CPlusPlus/LibCxxSliceArray.cpp index dba80db3906f9..1e7d9fce4f2b0 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibCxxSliceArray.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/LibCxxSliceArray.cpp @@ -62,7 +62,7 @@ class LibcxxStdSliceArraySyntheticFrontEnd : public SyntheticChildrenFrontEnd { lldb::ChildCacheState Update() override; - size_t GetIndexOfChildWithName(ConstString name) override; + llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override; private: /// A non-owning pointer to slice_array.__vp_. @@ -144,10 +144,12 @@ lldb_private::formatters::LibcxxStdSliceArraySyntheticFrontEnd::Update() { return ChildCacheState::eRefetch; } -size_t lldb_private::formatters::LibcxxStdSliceArraySyntheticFrontEnd:: +llvm::Expected<size_t> +lldb_private::formatters::LibcxxStdSliceArraySyntheticFrontEnd:: GetIndexOfChildWithName(ConstString name) { if (!m_start) - return std::numeric_limits<size_t>::max(); + return llvm::createStringError("Cannot find index of child '%s'", + name.AsCString()); return ExtractIndexFromString(name.GetCString()); } diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibCxxSpan.cpp b/lldb/source/Plugins/Language/CPlusPlus/LibCxxSpan.cpp index acda41024cf03..9360689475e64 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibCxxSpan.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/LibCxxSpan.cpp @@ -55,7 +55,7 @@ class LibcxxStdSpanSyntheticFrontEnd : public SyntheticChildrenFrontEnd { // from the only other place it can be: the template argument. lldb::ChildCacheState Update() override; - size_t GetIndexOfChildWithName(ConstString name) override; + llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override; private: ValueObject *m_start = nullptr; ///< First element of span. Held, not owned. @@ -127,10 +127,11 @@ lldb_private::formatters::LibcxxStdSpanSyntheticFrontEnd::Update() { return lldb::ChildCacheState::eReuse; } -size_t lldb_private::formatters::LibcxxStdSpanSyntheticFrontEnd:: - GetIndexOfChildWithName(ConstString name) { +llvm::Expected<size_t> lldb_private::formatters:: + LibcxxStdSpanSyntheticFrontEnd::GetIndexOfChildWithName(ConstString name) { if (!m_start) - return UINT32_MAX; + return llvm::createStringError("Cannot find index of child '%s'", + name.AsCString()); return ExtractIndexFromString(name.GetCString()); } diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibCxxTuple.cpp b/lldb/source/Plugins/Language/CPlusPlus/LibCxxTuple.cpp index 263ca8349b891..c94d05a739c79 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibCxxTuple.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/LibCxxTuple.cpp @@ -20,7 +20,7 @@ class TupleFrontEnd: public SyntheticChildrenFrontEnd { Update(); } - size_t GetIndexOfChildWithName(ConstString name) override { + llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override { return formatters::ExtractIndexFromString(name.GetCString()); } diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibCxxUnorderedMap.cpp b/lldb/source/Plugins/Language/CPlusPlus/LibCxxUnorderedMap.cpp index 395ecc489a17e..983c743e37eb0 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibCxxUnorderedMap.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/LibCxxUnorderedMap.cpp @@ -40,7 +40,7 @@ class LibcxxStdUnorderedMapSyntheticFrontEnd lldb::ChildCacheState Update() override; - size_t GetIndexOfChildWithName(ConstString name) override; + llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override; private: CompilerType GetNodeType(); @@ -68,7 +68,7 @@ class LibCxxUnorderedMapIteratorSyntheticFrontEnd lldb::ChildCacheState Update() override; - size_t GetIndexOfChildWithName(ConstString name) override; + llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override; private: lldb::ValueObjectSP m_pair_sp; ///< ValueObject for the key/value pair @@ -291,7 +291,8 @@ lldb_private::formatters::LibcxxStdUnorderedMapSyntheticFrontEnd::Update() { return lldb::ChildCacheState::eRefetch; } -size_t lldb_private::formatters::LibcxxStdUnorderedMapSyntheticFrontEnd:: +llvm::Expected<size_t> +lldb_private::formatters::LibcxxStdUnorderedMapSyntheticFrontEnd:: GetIndexOfChildWithName(ConstString name) { return ExtractIndexFromString(name.GetCString()); } @@ -398,13 +399,15 @@ lldb::ValueObjectSP lldb_private::formatters:: return lldb::ValueObjectSP(); } -size_t lldb_private::formatters::LibCxxUnorderedMapIteratorSyntheticFrontEnd:: +llvm::Expected<size_t> +lldb_private::formatters::LibCxxUnorderedMapIteratorSyntheticFrontEnd:: GetIndexOfChildWithName(ConstString name) { if (name == "first") return 0; if (name == "second") return 1; - return UINT32_MAX; + return llvm::createStringError("Cannot find index of child '%s'", + name.AsCString()); } SyntheticChildrenFrontEnd * diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibCxxValarray.cpp b/lldb/source/Plugins/Language/CPlusPlus/LibCxxValarray.cpp index 53ad3d91a62a4..e6fbf56e1c46e 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibCxxValarray.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/LibCxxValarray.cpp @@ -30,7 +30,7 @@ class LibcxxStdValarraySyntheticFrontEnd : public SyntheticChildrenFrontEnd { lldb::ChildCacheState Update() override; - size_t GetIndexOfChildWithName(ConstString name) override; + llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override; private: /// A non-owning pointer to valarray's __begin_ member. @@ -123,10 +123,12 @@ lldb_private::formatters::LibcxxStdValarraySyntheticFrontEnd::Update() { return ChildCacheState::eRefetch; } -size_t lldb_private::formatters::LibcxxStdValarraySyntheticFrontEnd:: +llvm::Expected<size_t> +lldb_private::formatters::LibcxxStdValarraySyntheticFrontEnd:: GetIndexOfChildWithName(ConstString name) { if (!m_start || !m_finish) - return std::numeric_limits<size_t>::max(); + return llvm::createStringError("Cannot find index of child '%s'", + name.AsCString()); return ExtractIndexFromString(name.GetCString()); } diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibCxxVariant.cpp b/lldb/source/Plugins/Language/CPlusPlus/LibCxxVariant.cpp index 701946d44cb40..0bd9b905e21bb 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibCxxVariant.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/LibCxxVariant.cpp @@ -202,8 +202,13 @@ class VariantFrontEnd : public SyntheticChildrenFrontEnd { Update(); } - size_t GetIndexOfChildWithName(ConstString name) override { - return formatters::ExtractIndexFromString(name.GetCString()); + llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override { + size_t index = formatters::ExtractIndexFromString(name.GetCString()); + if (index == UINT32_MAX) { + return llvm::createStringError("Cannot find index of child '%s'", + name.AsCString()); + } + return index; } lldb::ChildCacheState Update() override; diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibCxxVector.cpp b/lldb/source/Plugins/Language/CPlusPlus/LibCxxVector.cpp index d538cac9f9134..614ee68c12cd7 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibCxxVector.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/LibCxxVector.cpp @@ -33,7 +33,7 @@ class LibcxxStdVectorSyntheticFrontEnd : public SyntheticChildrenFrontEnd { lldb::ChildCacheState Update() override; - size_t GetIndexOfChildWithName(ConstString name) override; + llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override; private: ValueObject *m_start = nullptr; @@ -52,7 +52,7 @@ class LibcxxVectorBoolSyntheticFrontEnd : public SyntheticChildrenFrontEnd { lldb::ChildCacheState Update() override; - size_t GetIndexOfChildWithName(ConstString name) override; + llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override; private: CompilerType m_bool_type; @@ -152,7 +152,8 @@ lldb_private::formatters::LibcxxStdVectorSyntheticFrontEnd::Update() { return lldb::ChildCacheState::eRefetch; } -size_t lldb_private::formatters::LibcxxStdVectorSyntheticFrontEnd:: +llvm::Expected<size_t> +lldb_private::formatters::LibcxxStdVectorSyntheticFrontEnd:: GetIndexOfChildWithName(ConstString name) { if (!m_start || !m_finish) return UINT32_MAX; @@ -248,14 +249,17 @@ lldb_private::formatters::LibcxxVectorBoolSyntheticFrontEnd::Update() { return lldb::ChildCacheState::eRefetch; } -size_t lldb_private::formatters::LibcxxVectorBoolSyntheticFrontEnd:: +llvm::Expected<size_t> +lldb_private::formatters::LibcxxVectorBoolSyntheticFrontEnd:: GetIndexOfChildWithName(ConstString name) { if (!m_count || !m_base_data_address) - return UINT32_MAX; + return llvm::createStringError("Cannot find index of child '%s'", + name.AsCString()); const char *item_name = name.GetCString(); uint32_t idx = ExtractIndexFromString(item_name); if (idx < UINT32_MAX && idx >= CalculateNumChildrenIgnoringErrors()) - return UINT32_MAX; + return llvm::createStringError("Cannot find index of child '%s'", + name.AsCString()); return idx; } diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.cpp b/lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.cpp index a97264f007076..e4c0ad2db0fdd 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.cpp @@ -49,7 +49,7 @@ class LibstdcppMapIteratorSyntheticFrontEnd : public SyntheticChildrenFrontEnd { lldb::ChildCacheState Update() override; - size_t GetIndexOfChildWithName(ConstString name) override; + llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override; private: ExecutionContextRef m_exe_ctx_ref; @@ -68,7 +68,8 @@ class LibStdcppSharedPtrSyntheticFrontEnd : public SyntheticChildrenFrontEnd { lldb::ChildCacheState Update() override; - size_t GetIndexOfChildWithName(ConstString name) override; + llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override; + private: // The lifetime of a ValueObject and all its derivative ValueObjects @@ -145,13 +146,15 @@ LibstdcppMapIteratorSyntheticFrontEnd::GetChildAtIndex(uint32_t idx) { return lldb::ValueObjectSP(); } -size_t LibstdcppMapIteratorSyntheticFrontEnd::GetIndexOfChildWithName( +llvm::Expected<size_t> +LibstdcppMapIteratorSyntheticFrontEnd::GetIndexOfChildWithName( ConstString name) { if (name == "first") return 0; if (name == "second") return 1; - return UINT32_MAX; + return llvm::createStringError("Cannot find index of child '%s'", + name.AsCString()); } SyntheticChildrenFrontEnd * @@ -226,11 +229,12 @@ VectorIteratorSyntheticFrontEnd::GetChildAtIndex(uint32_t idx) { return lldb::ValueObjectSP(); } -size_t VectorIteratorSyntheticFrontEnd::GetIndexOfChildWithName( - ConstString name) { +llvm::Expected<size_t> +VectorIteratorSyntheticFrontEnd::GetIndexOfChildWithName(ConstString name) { if (name == "item") return 0; - return UINT32_MAX; + return llvm::createStringError("Cannot find index of child '%s'", + name.AsCString()); } bool lldb_private::formatters::LibStdcppStringSummaryProvider( @@ -409,13 +413,14 @@ lldb::ChildCacheState LibStdcppSharedPtrSyntheticFrontEnd::Update() { return lldb::ChildCacheState::eRefetch; } -size_t LibStdcppSharedPtrSyntheticFrontEnd::GetIndexOfChildWithName( - ConstString name) { +llvm::Expected<size_t> +LibStdcppSharedPtrSyntheticFrontEnd::GetIndexOfChildWithName(ConstString name) { if (name == "pointer") return 0; if (name == "object" || name == "$$dereference$$") return 1; - return UINT32_MAX; + return llvm::createStringError("Cannot find index of child '%s'", + name.AsCString()); } SyntheticChildrenFrontEnd * diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibStdcppTuple.cpp b/lldb/source/Plugins/Language/CPlusPlus/LibStdcppTuple.cpp index 68133b202a0c8..2077256a0d4c0 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibStdcppTuple.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/LibStdcppTuple.cpp @@ -32,7 +32,7 @@ class LibStdcppTupleSyntheticFrontEnd : public SyntheticChildrenFrontEnd { lldb::ChildCacheState Update() override; - size_t GetIndexOfChildWithName(ConstString name) override; + llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override; private: // The lifetime of a ValueObject and all its derivative ValueObjects @@ -96,8 +96,8 @@ LibStdcppTupleSyntheticFrontEnd::CalculateNumChildren() { return m_members.size(); } -size_t LibStdcppTupleSyntheticFrontEnd::GetIndexOfChildWithName( - ConstString name) { +llvm::Expected<size_t> +LibStdcppTupleSyntheticFrontEnd::GetIndexOfChildWithName(ConstString name) { return ExtractIndexFromString(name.GetCString()); } diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibStdcppUniquePointer.cpp b/lldb/source/Plugins/Language/CPlusPlus/LibStdcppUniquePointer.cpp index 722203f17e382..21af394417715 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibStdcppUniquePointer.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/LibStdcppUniquePointer.cpp @@ -32,7 +32,7 @@ class LibStdcppUniquePtrSyntheticFrontEnd : public SyntheticChildrenFrontEnd { lldb::ChildCacheState Update() override; - size_t GetIndexOfChildWithName(ConstString name) override; + llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override; bool GetSummary(Stream &stream, const TypeSummaryOptions &options); @@ -139,15 +139,16 @@ LibStdcppUniquePtrSyntheticFrontEnd::CalculateNumChildren() { return 1; } -size_t LibStdcppUniquePtrSyntheticFrontEnd::GetIndexOfChildWithName( - ConstString name) { +llvm::Expected<size_t> +LibStdcppUniquePtrSyntheticFrontEnd::GetIndexOfChildWithName(ConstString name) { if (name == "ptr" || name == "pointer") return 0; if (name == "del" || name == "deleter") return 1; if (name == "obj" || name == "object" || name == "$$dereference$$") return 2; - return UINT32_MAX; + return llvm::createStringError("Cannot find index of child '%s'", + name.AsCString()); } bool LibStdcppUniquePtrSyntheticFrontEnd::GetSummary( diff --git a/lldb/source/Plugins/Language/ObjC/Cocoa.cpp b/lldb/source/Plugins/Language/ObjC/Cocoa.cpp index 1d79edbede5d6..1898b30a93326 100644 --- a/lldb/source/Plugins/Language/ObjC/Cocoa.cpp +++ b/lldb/source/Plugins/Language/ObjC/Cocoa.cpp @@ -1049,8 +1049,9 @@ class ObjCClassSyntheticChildrenFrontEnd : public SyntheticChildrenFrontEnd { bool MightHaveChildren() override { return false; } - size_t GetIndexOfChildWithName(ConstString name) override { - return UINT32_MAX; + llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override { + return llvm::createStringError("Cannot find index of child '%s'", + name.AsCString()); } }; diff --git a/lldb/source/Plugins/Language/ObjC/NSArray.cpp b/lldb/source/Plugins/Language/ObjC/NSArray.cpp index 7054dd8ffa952..958bcb96c48bd 100644 --- a/lldb/source/Plugins/Language/ObjC/NSArray.cpp +++ b/lldb/source/Plugins/Language/ObjC/NSArray.cpp @@ -56,7 +56,7 @@ class NSArrayMSyntheticFrontEndBase : public SyntheticChildrenFrontEnd { lldb::ChildCacheState Update() override = 0; - size_t GetIndexOfChildWithName(ConstString name) override; + llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override; protected: virtual lldb::addr_t GetDataAddress() = 0; @@ -218,7 +218,7 @@ class GenericNSArrayISyntheticFrontEnd : public SyntheticChildrenFrontEnd { lldb::ChildCacheState Update() override; - size_t GetIndexOfChildWithName(ConstString name) override; + llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override; private: ExecutionContextRef m_exe_ctx_ref; @@ -306,7 +306,7 @@ class NSArray0SyntheticFrontEnd : public SyntheticChildrenFrontEnd { bool MightHaveChildren() override; - size_t GetIndexOfChildWithName(ConstString name) override; + llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override; }; class NSArray1SyntheticFrontEnd : public SyntheticChildrenFrontEnd { @@ -321,7 +321,7 @@ class NSArray1SyntheticFrontEnd : public SyntheticChildrenFrontEnd { lldb::ChildCacheState Update() override; - size_t GetIndexOfChildWithName(ConstString name) override; + llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override; }; } // namespace formatters } // namespace lldb_private @@ -526,9 +526,8 @@ lldb_private::formatters::GenericNSArrayMSyntheticFrontEnd<D32, D64>::Update() { : lldb::ChildCacheState::eRefetch; } -size_t -lldb_private::formatters::NSArrayMSyntheticFrontEndBase::GetIndexOfChildWithName( - ConstString name) { +llvm::Expected<size_t> lldb_private::formatters::NSArrayMSyntheticFrontEndBase:: + GetIndexOfChildWithName(ConstString name) { const char *item_name = name.GetCString(); uint32_t idx = ExtractIndexFromString(item_name); if (idx < UINT32_MAX && idx >= CalculateNumChildrenIgnoringErrors()) @@ -612,9 +611,9 @@ lldb_private::formatters::GenericNSArrayISyntheticFrontEnd<D32, D64, Inline>:: } template <typename D32, typename D64, bool Inline> -size_t -lldb_private::formatters::GenericNSArrayISyntheticFrontEnd<D32, D64, Inline>:: - GetIndexOfChildWithName(ConstString name) { +llvm::Expected<size_t> +lldb_private::formatters::GenericNSArrayISyntheticFrontEnd< + D32, D64, Inline>::GetIndexOfChildWithName(ConstString name) { const char *item_name = name.GetCString(); uint32_t idx = ExtractIndexFromString(item_name); if (idx < UINT32_MAX && idx >= CalculateNumChildrenIgnoringErrors()) @@ -695,7 +694,7 @@ lldb_private::formatters::NSArray0SyntheticFrontEnd::NSArray0SyntheticFrontEnd( lldb::ValueObjectSP valobj_sp) : SyntheticChildrenFrontEnd(*valobj_sp) {} -size_t +llvm::Expected<size_t> lldb_private::formatters::NSArray0SyntheticFrontEnd::GetIndexOfChildWithName( ConstString name) { return UINT32_MAX; @@ -725,7 +724,7 @@ lldb_private::formatters::NSArray1SyntheticFrontEnd::NSArray1SyntheticFrontEnd( lldb::ValueObjectSP valobj_sp) : SyntheticChildrenFrontEnd(*valobj_sp.get()) {} -size_t +llvm::Expected<size_t> lldb_private::formatters::NSArray1SyntheticFrontEnd::GetIndexOfChildWithName( ConstString name) { static const ConstString g_zero("[0]"); diff --git a/lldb/source/Plugins/Language/ObjC/NSDictionary.cpp b/lldb/source/Plugins/Language/ObjC/NSDictionary.cpp index 008e8eb569f01..7bf7c168a94c0 100644 --- a/lldb/source/Plugins/Language/ObjC/NSDictionary.cpp +++ b/lldb/source/Plugins/Language/ObjC/NSDictionary.cpp @@ -109,7 +109,7 @@ class NSDictionaryISyntheticFrontEnd : public SyntheticChildrenFrontEnd { lldb::ChildCacheState Update() override; - size_t GetIndexOfChildWithName(ConstString name) override; + llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override; private: struct DataDescriptor_32 { @@ -148,7 +148,7 @@ class NSConstantDictionarySyntheticFrontEnd : public SyntheticChildrenFrontEnd { lldb::ChildCacheState Update() override; - size_t GetIndexOfChildWithName(ConstString name) override; + llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override; private: ExecutionContextRef m_exe_ctx_ref; @@ -178,7 +178,7 @@ class NSCFDictionarySyntheticFrontEnd : public SyntheticChildrenFrontEnd { lldb::ChildCacheState Update() override; - size_t GetIndexOfChildWithName(ConstString name) override; + llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override; private: struct DictionaryItemDescriptor { @@ -209,7 +209,7 @@ class NSDictionary1SyntheticFrontEnd : public SyntheticChildrenFrontEnd { lldb::ChildCacheState Update() override; - size_t GetIndexOfChildWithName(ConstString name) override; + llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override; private: ValueObjectSP m_pair; @@ -228,7 +228,7 @@ class GenericNSDictionaryMSyntheticFrontEnd : public SyntheticChildrenFrontEnd { lldb::ChildCacheState Update() override; - size_t GetIndexOfChildWithName(ConstString name) override; + llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override; private: struct DictionaryItemDescriptor { @@ -259,8 +259,8 @@ namespace Foundation1100 { lldb::ChildCacheState Update() override; - size_t GetIndexOfChildWithName(ConstString name) override; - + llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override; + private: struct DataDescriptor_32 { uint32_t _used : 26; @@ -585,12 +585,13 @@ lldb_private::formatters::NSDictionaryISyntheticFrontEnd:: m_data_64 = nullptr; } -size_t lldb_private::formatters::NSDictionaryISyntheticFrontEnd:: - GetIndexOfChildWithName(ConstString name) { +llvm::Expected<size_t> lldb_private::formatters:: + NSDictionaryISyntheticFrontEnd::GetIndexOfChildWithName(ConstString name) { const char *item_name = name.GetCString(); uint32_t idx = ExtractIndexFromString(item_name); if (idx < UINT32_MAX && idx >= CalculateNumChildrenIgnoringErrors()) - return UINT32_MAX; + return llvm::createStringError("Cannot find index of child '%s'", + name.AsCString()); return idx; } @@ -718,12 +719,13 @@ lldb_private::formatters::NSCFDictionarySyntheticFrontEnd:: : SyntheticChildrenFrontEnd(*valobj_sp), m_exe_ctx_ref(), m_hashtable(), m_pair_type() {} -size_t lldb_private::formatters::NSCFDictionarySyntheticFrontEnd:: - GetIndexOfChildWithName(ConstString name) { +llvm::Expected<size_t> lldb_private::formatters:: + NSCFDictionarySyntheticFrontEnd::GetIndexOfChildWithName(ConstString name) { const char *item_name = name.GetCString(); const uint32_t idx = ExtractIndexFromString(item_name); if (idx < UINT32_MAX && idx >= CalculateNumChildrenIgnoringErrors()) - return UINT32_MAX; + return llvm::createStringError("Cannot find index of child '%s'", + name.AsCString()); return idx; } @@ -849,12 +851,14 @@ lldb_private::formatters::NSConstantDictionarySyntheticFrontEnd:: NSConstantDictionarySyntheticFrontEnd(lldb::ValueObjectSP valobj_sp) : SyntheticChildrenFrontEnd(*valobj_sp) {} -size_t lldb_private::formatters::NSConstantDictionarySyntheticFrontEnd:: +llvm::Expected<size_t> +lldb_private::formatters::NSConstantDictionarySyntheticFrontEnd:: GetIndexOfChildWithName(ConstString name) { const char *item_name = name.GetCString(); uint32_t idx = ExtractIndexFromString(item_name); if (idx < UINT32_MAX && idx >= CalculateNumChildrenIgnoringErrors()) - return UINT32_MAX; + return llvm::createStringError("Cannot find index of child '%s'", + name.AsCString()); return idx; } @@ -961,10 +965,13 @@ lldb_private::formatters::NSDictionary1SyntheticFrontEnd:: NSDictionary1SyntheticFrontEnd(lldb::ValueObjectSP valobj_sp) : SyntheticChildrenFrontEnd(*valobj_sp.get()), m_pair(nullptr) {} -size_t lldb_private::formatters::NSDictionary1SyntheticFrontEnd:: - GetIndexOfChildWithName(ConstString name) { +llvm::Expected<size_t> lldb_private::formatters:: + NSDictionary1SyntheticFrontEnd::GetIndexOfChildWithName(ConstString name) { static const ConstString g_zero("[0]"); - return name == g_zero ? 0 : UINT32_MAX; + if (name == g_zero) + return 0; + return llvm::createStringError("Cannot find index of child '%s'", + name.AsCString()); } llvm::Expected<uint32_t> lldb_private::formatters:: @@ -1045,12 +1052,14 @@ lldb_private::formatters::GenericNSDictionaryMSyntheticFrontEnd< } template <typename D32, typename D64> -size_t lldb_private::formatters::GenericNSDictionaryMSyntheticFrontEnd< +llvm::Expected<size_t> +lldb_private::formatters::GenericNSDictionaryMSyntheticFrontEnd< D32, D64>::GetIndexOfChildWithName(ConstString name) { const char *item_name = name.GetCString(); uint32_t idx = ExtractIndexFromString(item_name); if (idx < UINT32_MAX && idx >= CalculateNumChildrenIgnoringErrors()) - return UINT32_MAX; + return llvm::createStringError("Cannot find index of child '%s'", + name.AsCString()); return idx; } @@ -1202,13 +1211,13 @@ lldb_private::formatters::Foundation1100:: m_data_64 = nullptr; } -size_t -lldb_private::formatters::Foundation1100:: - NSDictionaryMSyntheticFrontEnd::GetIndexOfChildWithName(ConstString name) { +llvm::Expected<size_t> lldb_private::formatters::Foundation1100:: + NSDictionaryMSyntheticFrontEnd::GetIndexOfChildWithName(ConstString name) { const char *item_name = name.GetCString(); uint32_t idx = ExtractIndexFromString(item_name); if (idx < UINT32_MAX && idx >= CalculateNumChildrenIgnoringErrors()) - return UINT32_MAX; + return llvm::createStringError("Cannot find index of child '%s'", + name.AsCString()); return idx; } diff --git a/lldb/source/Plugins/Language/ObjC/NSError.cpp b/lldb/source/Plugins/Language/ObjC/NSError.cpp index 5557daa2bf1b2..976a92aca0dd7 100644 --- a/lldb/source/Plugins/Language/ObjC/NSError.cpp +++ b/lldb/source/Plugins/Language/ObjC/NSError.cpp @@ -165,11 +165,12 @@ class NSErrorSyntheticFrontEnd : public SyntheticChildrenFrontEnd { return lldb::ChildCacheState::eRefetch; } - size_t GetIndexOfChildWithName(ConstString name) override { + llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override { static ConstString g_userInfo("_userInfo"); if (name == g_userInfo) return 0; - return UINT32_MAX; + return llvm::createStringError("Cannot find index of child '%s'", + name.AsCString()); } private: diff --git a/lldb/source/Plugins/Language/ObjC/NSException.cpp b/lldb/source/Plugins/Language/ObjC/NSException.cpp index 67f3f1779e147..372812c1e0486 100644 --- a/lldb/source/Plugins/Language/ObjC/NSException.cpp +++ b/lldb/source/Plugins/Language/ObjC/NSException.cpp @@ -148,7 +148,7 @@ class NSExceptionSyntheticFrontEnd : public SyntheticChildrenFrontEnd { : lldb::ChildCacheState::eRefetch; } - size_t GetIndexOfChildWithName(ConstString name) override { + llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override { // NSException has 4 members: // NSString *name; // NSString *reason; @@ -162,7 +162,8 @@ class NSExceptionSyntheticFrontEnd : public SyntheticChildrenFrontEnd { if (name == g_reason) return 1; if (name == g_userInfo) return 2; if (name == g_reserved) return 3; - return UINT32_MAX; + return llvm::createStringError("Cannot find index of child '%s'", + name.AsCString()); } private: diff --git a/lldb/source/Plugins/Language/ObjC/NSIndexPath.cpp b/lldb/source/Plugins/Language/ObjC/NSIndexPath.cpp index e29f625b405b0..af898aeaab31f 100644 --- a/lldb/source/Plugins/Language/ObjC/NSIndexPath.cpp +++ b/lldb/source/Plugins/Language/ObjC/NSIndexPath.cpp @@ -126,11 +126,12 @@ class NSIndexPathSyntheticFrontEnd : public SyntheticChildrenFrontEnd { bool MightHaveChildren() override { return m_impl.m_mode != Mode::Invalid; } - size_t GetIndexOfChildWithName(ConstString name) override { + llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override { const char *item_name = name.GetCString(); uint32_t idx = ExtractIndexFromString(item_name); if (idx < UINT32_MAX && idx >= CalculateNumChildrenIgnoringErrors()) - return UINT32_MAX; + return llvm::createStringError("Cannot find index of child '%s'", + name.AsCString()); return idx; } diff --git a/lldb/source/Plugins/Language/ObjC/NSSet.cpp b/lldb/source/Plugins/Language/ObjC/NSSet.cpp index 55069495676e5..fe45bb7314a7d 100644 --- a/lldb/source/Plugins/Language/ObjC/NSSet.cpp +++ b/lldb/source/Plugins/Language/ObjC/NSSet.cpp @@ -52,7 +52,7 @@ class NSSetISyntheticFrontEnd : public SyntheticChildrenFrontEnd { lldb::ChildCacheState Update() override; - size_t GetIndexOfChildWithName(ConstString name) override; + llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override; private: struct DataDescriptor_32 { @@ -88,7 +88,7 @@ class NSCFSetSyntheticFrontEnd : public SyntheticChildrenFrontEnd { lldb::ChildCacheState Update() override; - size_t GetIndexOfChildWithName(ConstString name) override; + llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override; private: struct SetItemDescriptor { @@ -119,7 +119,7 @@ class GenericNSSetMSyntheticFrontEnd : public SyntheticChildrenFrontEnd { lldb::ChildCacheState Update() override; - size_t GetIndexOfChildWithName(ConstString name) override; + llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override; private: @@ -386,13 +386,14 @@ lldb_private::formatters::NSSetISyntheticFrontEnd::~NSSetISyntheticFrontEnd() { m_data_64 = nullptr; } -size_t +llvm::Expected<size_t> lldb_private::formatters::NSSetISyntheticFrontEnd::GetIndexOfChildWithName( ConstString name) { const char *item_name = name.GetCString(); uint32_t idx = ExtractIndexFromString(item_name); if (idx < UINT32_MAX && idx >= CalculateNumChildrenIgnoringErrors()) - return UINT32_MAX; + return llvm::createStringError("Cannot find index of child '%s'", + name.AsCString()); return idx; } @@ -519,13 +520,14 @@ lldb_private::formatters::NSCFSetSyntheticFrontEnd::NSCFSetSyntheticFrontEnd( : SyntheticChildrenFrontEnd(*valobj_sp), m_exe_ctx_ref(), m_hashtable(), m_pair_type() {} -size_t +llvm::Expected<size_t> lldb_private::formatters::NSCFSetSyntheticFrontEnd::GetIndexOfChildWithName( ConstString name) { const char *item_name = name.GetCString(); const uint32_t idx = ExtractIndexFromString(item_name); if (idx < UINT32_MAX && idx >= CalculateNumChildrenIgnoringErrors()) - return UINT32_MAX; + return llvm::createStringError("Cannot find index of child '%s'", + name.AsCString()); return idx; } @@ -654,14 +656,13 @@ lldb_private::formatters::GenericNSSetMSyntheticFrontEnd<D32, D64>:: } template <typename D32, typename D64> -size_t -lldb_private::formatters:: - GenericNSSetMSyntheticFrontEnd<D32, D64>::GetIndexOfChildWithName( - ConstString name) { +llvm::Expected<size_t> lldb_private::formatters::GenericNSSetMSyntheticFrontEnd< + D32, D64>::GetIndexOfChildWithName(ConstString name) { const char *item_name = name.GetCString(); uint32_t idx = ExtractIndexFromString(item_name); if (idx < UINT32_MAX && idx >= CalculateNumChildrenIgnoringErrors()) - return UINT32_MAX; + return llvm::createStringError("Cannot find index of child '%s'", + name.AsCString()); return idx; } diff --git a/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp b/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp index a9c81273c1302..79db20ca14f71 100644 --- a/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp +++ b/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp @@ -2037,19 +2037,22 @@ lldb::ValueObjectSP ScriptInterpreterPythonImpl::GetChildAtIndex( return ret_val; } -int ScriptInterpreterPythonImpl::GetIndexOfChildWithName( +llvm::Expected<int> ScriptInterpreterPythonImpl::GetIndexOfChildWithName( const StructuredData::ObjectSP &implementor_sp, const char *child_name) { if (!implementor_sp) - return UINT32_MAX; + return llvm::createStringError("Cannot find index of child '%s'", + child_name); StructuredData::Generic *generic = implementor_sp->GetAsGeneric(); if (!generic) - return UINT32_MAX; + return llvm::createStringError("Cannot find index of child '%s'", + child_name); auto *implementor = static_cast<PyObject *>(generic->GetValue()); if (!implementor) - return UINT32_MAX; + return llvm::createStringError("Cannot find index of child '%s'", + child_name); - int ret_val = UINT32_MAX; + int ret_val = INT32_MAX; { Locker py_lock(this, @@ -2058,6 +2061,9 @@ int ScriptInterpreterPythonImpl::GetIndexOfChildWithName( child_name); } + if (ret_val == INT32_MAX) + return llvm::createStringError("Cannot find index of child '%s'", + child_name); return ret_val; } diff --git a/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPythonImpl.h b/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPythonImpl.h index 0f2902813397a..5d776080be8f4 100644 --- a/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPythonImpl.h +++ b/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPythonImpl.h @@ -128,8 +128,9 @@ class ScriptInterpreterPythonImpl : public ScriptInterpreterPython { GetChildAtIndex(const StructuredData::ObjectSP &implementor, uint32_t idx) override; - int GetIndexOfChildWithName(const StructuredData::ObjectSP &implementor, - const char *child_name) override; + llvm::Expected<int> + GetIndexOfChildWithName(const StructuredData::ObjectSP &implementor, + const char *child_name) override; bool UpdateSynthProviderInstance( const StructuredData::ObjectSP &implementor) override; diff --git a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp index ed6297cc6f3e0..19f4dfbfcc3f7 100644 --- a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp +++ b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp @@ -6969,7 +6969,7 @@ size_t TypeSystemClang::GetIndexOfChildMemberWithName( // doesn't descend into the children, but only looks one level deep and name // matches can include base class names. -uint32_t +llvm::Expected<uint32_t> TypeSystemClang::GetIndexOfChildWithName(lldb::opaque_compiler_type_t type, llvm::StringRef name, bool omit_empty_base_classes) { diff --git a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h index 442f88a5b79ae..93933846d114d 100644 --- a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h +++ b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h @@ -900,9 +900,10 @@ class TypeSystemClang : public TypeSystem { // Lookup a child given a name. This function will match base class names and // member member names in "clang_type" only, not descendants. - uint32_t GetIndexOfChildWithName(lldb::opaque_compiler_type_t type, - llvm::StringRef name, - bool omit_empty_base_classes) override; + llvm::Expected<uint32_t> + GetIndexOfChildWithName(lldb::opaque_compiler_type_t type, + llvm::StringRef name, + bool omit_empty_base_classes) override; // Lookup a child member given a name. This function will match member names // only and will descend into "clang_type" children in search for the first diff --git a/lldb/source/Symbol/CompilerType.cpp b/lldb/source/Symbol/CompilerType.cpp index 22fdd24fc7cd5..59d932fe4237e 100644 --- a/lldb/source/Symbol/CompilerType.cpp +++ b/lldb/source/Symbol/CompilerType.cpp @@ -1042,7 +1042,7 @@ bool CompilerType::IsMeaninglessWithoutDynamicResolution() const { // doesn't descend into the children, but only looks one level deep and name // matches can include base class names. -uint32_t +llvm::Expected<uint32_t> CompilerType::GetIndexOfChildWithName(llvm::StringRef name, bool omit_empty_base_classes) const { if (IsValid() && !name.empty()) { @@ -1050,7 +1050,8 @@ CompilerType::GetIndexOfChildWithName(llvm::StringRef name, return type_system_sp->GetIndexOfChildWithName(m_type, name, omit_empty_base_classes); } - return UINT32_MAX; + return llvm::createStringError("Cannot find index of child '%s'", + name.str().c_str()); } // Dumping types diff --git a/lldb/source/ValueObject/ValueObject.cpp b/lldb/source/ValueObject/ValueObject.cpp index eac24353de90b..562bde53402c3 100644 --- a/lldb/source/ValueObject/ValueObject.cpp +++ b/lldb/source/ValueObject/ValueObject.cpp @@ -403,7 +403,8 @@ ValueObject::GetChildAtNamePath(llvm::ArrayRef<llvm::StringRef> names) { return root; } -size_t ValueObject::GetIndexOfChildWithName(llvm::StringRef name) { +llvm::Expected<size_t> +ValueObject::GetIndexOfChildWithName(llvm::StringRef name) { bool omit_empty_base_classes = true; return GetCompilerType().GetIndexOfChildWithName(name, omit_empty_base_classes); diff --git a/lldb/source/ValueObject/ValueObjectRegister.cpp b/lldb/source/ValueObject/ValueObjectRegister.cpp index a56d3160d9ae2..feeb5595005cd 100644 --- a/lldb/source/ValueObject/ValueObjectRegister.cpp +++ b/lldb/source/ValueObject/ValueObjectRegister.cpp @@ -139,13 +139,15 @@ ValueObjectRegisterSet::GetChildMemberWithName(llvm::StringRef name, return ValueObjectSP(); } -size_t ValueObjectRegisterSet::GetIndexOfChildWithName(llvm::StringRef name) { +llvm::Expected<size_t> +ValueObjectRegisterSet::GetIndexOfChildWithName(llvm::StringRef name) { if (m_reg_ctx_sp && m_reg_set) { const RegisterInfo *reg_info = m_reg_ctx_sp->GetRegisterInfoByName(name); if (reg_info != nullptr) return reg_info->kinds[eRegisterKindLLDB]; } - return UINT32_MAX; + return llvm::createStringError("Cannot find index of child '%s'", + name.str().c_str()); } #pragma mark - diff --git a/lldb/source/ValueObject/ValueObjectSyntheticFilter.cpp b/lldb/source/ValueObject/ValueObjectSyntheticFilter.cpp index ae2b9bebbb12d..6f3621c8778cf 100644 --- a/lldb/source/ValueObject/ValueObjectSyntheticFilter.cpp +++ b/lldb/source/ValueObject/ValueObjectSyntheticFilter.cpp @@ -39,7 +39,7 @@ class DummySyntheticFrontEnd : public SyntheticChildrenFrontEnd { return m_backend.GetChildAtIndex(idx); } - size_t GetIndexOfChildWithName(ConstString name) override { + llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override { return m_backend.GetIndexOfChildWithName(name); } @@ -319,40 +319,41 @@ ValueObjectSynthetic::GetChildMemberWithName(llvm::StringRef name, bool can_create) { UpdateValueIfNeeded(); - uint32_t index = GetIndexOfChildWithName(name); + auto index_or_err = GetIndexOfChildWithName(name); - if (index == UINT32_MAX) + if (!index_or_err) return lldb::ValueObjectSP(); - return GetChildAtIndex(index, can_create); + return GetChildAtIndex(*index_or_err, can_create); } -size_t ValueObjectSynthetic::GetIndexOfChildWithName(llvm::StringRef name_ref) { +llvm::Expected<size_t> +ValueObjectSynthetic::GetIndexOfChildWithName(llvm::StringRef name_ref) { UpdateValueIfNeeded(); ConstString name(name_ref); - uint32_t found_index = UINT32_MAX; - bool did_find; + std::optional<uint32_t> found_index = std::nullopt; { std::lock_guard<std::mutex> guard(m_child_mutex); auto name_to_index = m_name_toindex.find(name.GetCString()); - did_find = name_to_index != m_name_toindex.end(); - if (did_find) + if (name_to_index != m_name_toindex.end()) found_index = name_to_index->second; } - if (!did_find && m_synth_filter_up != nullptr) { - uint32_t index = m_synth_filter_up->GetIndexOfChildWithName(name); - if (index == UINT32_MAX) - return index; + if (!found_index.has_value() && m_synth_filter_up != nullptr) { + auto index_or_err = m_synth_filter_up->GetIndexOfChildWithName(name); + if (!index_or_err) + return llvm::createStringError("Cannot find index of child '%s'", + name.AsCString()); std::lock_guard<std::mutex> guard(m_child_mutex); - m_name_toindex[name.GetCString()] = index; - return index; - } else if (!did_find && m_synth_filter_up == nullptr) - return UINT32_MAX; + m_name_toindex[name.GetCString()] = *index_or_err; + return *index_or_err; + } else if (!found_index.has_value() && m_synth_filter_up == nullptr) + return llvm::createStringError("Cannot find index of child '%s'", + name.AsCString()); else /*if (iter != m_name_toindex.end())*/ - return found_index; + return found_index.value(); } bool ValueObjectSynthetic::IsInScope() { return m_parent->IsInScope(); } _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits