diff --git a/lldb/include/lldb/DataFormatters/FormattersHelpers.h b/lldb/include/lldb/DataFormatters/FormattersHelpers.h index 6ec368484e150..e596720157f2c 100644 --- a/lldb/include/lldb/DataFormatters/FormattersHelpers.h +++ b/lldb/include/lldb/DataFormatters/FormattersHelpers.h @@ -62,7 +62,7 @@ void AddFilter(TypeCategoryImpl::SharedPointer category_sp, llvm::StringRef type_name, ScriptedSyntheticChildren::Flags flags, bool regex = false); -size_t ExtractIndexFromString(const char *item_name); +std::optional ExtractIndexFromString(const char *item_name); Address GetArrayAddressOrPointerValue(ValueObject &valobj); diff --git a/lldb/include/lldb/DataFormatters/TypeSynthetic.h b/lldb/include/lldb/DataFormatters/TypeSynthetic.h index bf6dc6a0c3c6b..45f4e290bfe9c 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 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 GetIndexOfChildWithName(ConstString name) override { + return llvm::createStringError("Type has no child named '%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 GetIndexOfChildWithName(ConstString name) override; typedef std::shared_ptr SharedPointer; @@ -442,7 +443,7 @@ class ScriptedSyntheticChildren : public SyntheticChildren { bool MightHaveChildren() override; - size_t GetIndexOfChildWithName(ConstString name) override; + llvm::Expected 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 70bcf50ca1b1d..45a3b9630e8fe 100644 --- a/lldb/include/lldb/DataFormatters/VectorIterator.h +++ b/lldb/include/lldb/DataFormatters/VectorIterator.h @@ -32,7 +32,7 @@ class VectorIteratorSyntheticFrontEnd : public SyntheticChildrenFrontEnd { bool MightHaveChildren() override; - size_t GetIndexOfChildWithName(ConstString name) override; + llvm::Expected 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 e67b179da1dec..0cb923c813206 100644 --- a/lldb/include/lldb/Interpreter/ScriptInterpreter.h +++ b/lldb/include/lldb/Interpreter/ScriptInterpreter.h @@ -385,10 +385,10 @@ class ScriptInterpreter : public PluginInterface { return lldb::ValueObjectSP(); } - virtual int + virtual llvm::Expected GetIndexOfChildWithName(const StructuredData::ObjectSP &implementor, const char *child_name) { - return UINT32_MAX; + return llvm::createStringError("Type has no child named '%s'", child_name); } virtual bool diff --git a/lldb/include/lldb/Symbol/CompilerType.h b/lldb/include/lldb/Symbol/CompilerType.h index 1185ef3aef479..580cbcc9e6eb8 100644 --- a/lldb/include/lldb/Symbol/CompilerType.h +++ b/lldb/include/lldb/Symbol/CompilerType.h @@ -481,9 +481,10 @@ 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, - ExecutionContext *exe_ctx, - bool omit_empty_base_classes) const; + + llvm::Expected + GetIndexOfChildWithName(llvm::StringRef name, ExecutionContext *exe_ctx, + 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 5d8564ecfb182..2bcb9f3b4170d 100644 --- a/lldb/include/lldb/Symbol/TypeSystem.h +++ b/lldb/include/lldb/Symbol/TypeSystem.h @@ -409,10 +409,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, - ExecutionContext *exe_ctx, - bool omit_empty_base_classes) = 0; + virtual llvm::Expected + GetIndexOfChildWithName(lldb::opaque_compiler_type_t type, + llvm::StringRef name, ExecutionContext *exe_ctx, + 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 b41e20faf7c38..61f0c8dce5dd2 100644 --- a/lldb/include/lldb/ValueObject/ValueObject.h +++ b/lldb/include/lldb/ValueObject/ValueObject.h @@ -502,7 +502,7 @@ class ValueObject { virtual lldb::ValueObjectSP GetChildMemberWithName(llvm::StringRef name, bool can_create = true); - virtual size_t GetIndexOfChildWithName(llvm::StringRef name); + virtual llvm::Expected GetIndexOfChildWithName(llvm::StringRef name); llvm::Expected 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 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 da6550b96e032..cf6f11426e5e2 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 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 944125f2d2eb4..6e0ee30f0c499 100644 --- a/lldb/source/API/SBValue.cpp +++ b/lldb/source/API/SBValue.cpp @@ -688,13 +688,15 @@ 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); + if (auto idx_or_err = value_sp->GetIndexOfChildWithName(name)) + return *idx_or_err; + else + llvm::consumeError(idx_or_err.takeError()); } - 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 ace7accc016eb..da5b924cf58e6 100644 --- a/lldb/source/DataFormatters/FormatterBytecode.cpp +++ b/lldb/source/DataFormatters/FormatterBytecode.cpp @@ -9,6 +9,7 @@ #include "FormatterBytecode.h" #include "lldb/Utility/LLDBLog.h" #include "lldb/ValueObject/ValueObject.h" +#include "lldb/ValueObject/ValueObjectConstResult.h" #include "llvm/ADT/StringExtras.h" #include "llvm/Support/DataExtractor.h" #include "llvm/Support/Format.h" @@ -486,7 +487,10 @@ llvm::Error Interpret(std::vector &control, TYPE_CHECK(Object, String); auto name = data.Pop(); POP_VALOBJ(valobj); - data.Push((uint64_t)valobj->GetIndexOfChildWithName(name)); + if (auto index_or_err = valobj->GetIndexOfChildWithName(name)) + data.Push((uint64_t)*index_or_err); + else + return index_or_err.takeError(); break; } case sel_get_type: { diff --git a/lldb/source/DataFormatters/FormattersHelpers.cpp b/lldb/source/DataFormatters/FormattersHelpers.cpp index 3b0f7990cbd1b..f080c8914c364 100644 --- a/lldb/source/DataFormatters/FormattersHelpers.cpp +++ b/lldb/source/DataFormatters/FormattersHelpers.cpp @@ -401,18 +401,17 @@ void lldb_private::formatters::AddFilter( category_sp->AddTypeFilter(type_name, match_type, filter_sp); } -size_t lldb_private::formatters::ExtractIndexFromString(const char *item_name) { +std::optional +lldb_private::formatters::ExtractIndexFromString(const char *item_name) { if (!item_name || !*item_name) - return UINT32_MAX; + return std::nullopt; if (*item_name != '[') - return UINT32_MAX; + return std::nullopt; item_name++; char *endptr = nullptr; unsigned long int idx = ::strtoul(item_name, &endptr, 0); - if (idx == 0 && endptr == item_name) - return UINT32_MAX; - if (idx == ULONG_MAX) - return UINT32_MAX; + if ((idx == 0 && endptr == item_name) || idx == ULONG_MAX) + return std::nullopt; return idx; } diff --git a/lldb/source/DataFormatters/TypeSynthetic.cpp b/lldb/source/DataFormatters/TypeSynthetic.cpp index 7aa0670190b25..57009b07dc553 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 TypeFilterImpl::FrontEnd::GetIndexOfChildWithName(ConstString name) { const char *name_cstr = name.GetCString(); if (name_cstr) { @@ -67,7 +67,8 @@ TypeFilterImpl::FrontEnd::GetIndexOfChildWithName(ConstString name) { } } } - return UINT32_MAX; + return llvm::createStringError("Type has no child named '%s'", + name.AsCString()); } std::string TypeFilterImpl::GetDescription() { @@ -218,10 +219,11 @@ bool ScriptedSyntheticChildren::FrontEnd::MightHaveChildren() { return m_interpreter->MightHaveChildrenSynthProviderInstance(m_wrapper_sp); } -size_t ScriptedSyntheticChildren::FrontEnd::GetIndexOfChildWithName( - ConstString name) { +llvm::Expected +ScriptedSyntheticChildren::FrontEnd::GetIndexOfChildWithName(ConstString name) { if (!m_wrapper_sp || m_interpreter == nullptr) - return UINT32_MAX; + return llvm::createStringError("Type has no child named '%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 c7f59548ec235..e45747d918943 100644 --- a/lldb/source/DataFormatters/VectorType.cpp +++ b/lldb/source/DataFormatters/VectorType.cpp @@ -271,11 +271,16 @@ class VectorTypeSyntheticFrontEnd : public SyntheticChildrenFrontEnd { bool MightHaveChildren() override { return true; } - 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; + llvm::Expected GetIndexOfChildWithName(ConstString name) override { + auto optional_idx = ExtractIndexFromString(name.AsCString()); + if (!optional_idx) { + return llvm::createStringError("Type has no child named '%s'", + name.AsCString()); + } + uint32_t idx = *optional_idx; + if (idx >= CalculateNumChildrenIgnoringErrors()) + return llvm::createStringError("Type has no child named '%s'", + name.AsCString()); return idx; } diff --git a/lldb/source/Plugins/Language/CPlusPlus/BlockPointer.cpp b/lldb/source/Plugins/Language/CPlusPlus/BlockPointer.cpp index 95516d1aa62c6..a4815e4c9c092 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/BlockPointer.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/BlockPointer.cpp @@ -147,9 +147,10 @@ class BlockPointerSyntheticFrontEnd : public SyntheticChildrenFrontEnd { // maybe return false if the block pointer is, say, null bool MightHaveChildren() override { return true; } - size_t GetIndexOfChildWithName(ConstString name) override { + llvm::Expected GetIndexOfChildWithName(ConstString name) override { if (!m_block_struct_type.IsValid()) - return UINT32_MAX; + return llvm::createStringError("Type has no child named '%s'", + name.AsCString()); const bool omit_empty_base_classes = false; return m_block_struct_type.GetIndexOfChildWithName( @@ -175,8 +176,17 @@ 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) { + LLDB_LOG_ERROR(GetLog(LLDBLog::DataFormatters), index_or_err.takeError(), + "{0}"); + 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 5e63d1d7b2145..bec7920667400 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/Coroutines.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/Coroutines.cpp @@ -204,10 +204,12 @@ bool lldb_private::formatters::StdlibCoroutineHandleSyntheticFrontEnd:: return true; } -size_t StdlibCoroutineHandleSyntheticFrontEnd::GetIndexOfChildWithName( +llvm::Expected +StdlibCoroutineHandleSyntheticFrontEnd::GetIndexOfChildWithName( ConstString name) { if (!m_resume_ptr_sp || !m_destroy_ptr_sp) - return UINT32_MAX; + return llvm::createStringError("Type has no child named '%s'", + name.AsCString()); if (name == ConstString("resume")) return 0; @@ -216,7 +218,8 @@ size_t StdlibCoroutineHandleSyntheticFrontEnd::GetIndexOfChildWithName( if (name == ConstString("promise_ptr") && m_promise_ptr_sp) return 2; - return UINT32_MAX; + return llvm::createStringError("Type has no child named '%s'", + name.AsCString()); } SyntheticChildrenFrontEnd * diff --git a/lldb/source/Plugins/Language/CPlusPlus/Coroutines.h b/lldb/source/Plugins/Language/CPlusPlus/Coroutines.h index f9765f3255d2b..47b52b387d355 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/Coroutines.h +++ b/lldb/source/Plugins/Language/CPlusPlus/Coroutines.h @@ -42,7 +42,7 @@ class StdlibCoroutineHandleSyntheticFrontEnd bool MightHaveChildren() override; - size_t GetIndexOfChildWithName(ConstString name) override; + llvm::Expected 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 8f2a3fe9b6e01..86e4f51234c79 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/GenericBitset.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/GenericBitset.cpp @@ -28,8 +28,13 @@ class GenericBitsetFrontEnd : public SyntheticChildrenFrontEnd { GenericBitsetFrontEnd(ValueObject &valobj, StdLib stdlib); - size_t GetIndexOfChildWithName(ConstString name) override { - return formatters::ExtractIndexFromString(name.GetCString()); + llvm::Expected GetIndexOfChildWithName(ConstString name) override { + auto optional_idx = formatters::ExtractIndexFromString(name.GetCString()); + if (!optional_idx) { + return llvm::createStringError("Type has no child named '%s'", + name.AsCString()); + } + return *optional_idx; } bool MightHaveChildren() override { return true; } diff --git a/lldb/source/Plugins/Language/CPlusPlus/GenericOptional.cpp b/lldb/source/Plugins/Language/CPlusPlus/GenericOptional.cpp index 23756de7f1e66..abfed522807b7 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/GenericOptional.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/GenericOptional.cpp @@ -36,8 +36,13 @@ class GenericOptionalFrontend : public SyntheticChildrenFrontEnd { GenericOptionalFrontend(ValueObject &valobj, StdLib stdlib); - size_t GetIndexOfChildWithName(ConstString name) override { - return formatters::ExtractIndexFromString(name.GetCString()); + llvm::Expected GetIndexOfChildWithName(ConstString name) override { + auto optional_idx = formatters::ExtractIndexFromString(name.GetCString()); + if (!optional_idx) { + return llvm::createStringError("Type has no child named '%s'", + name.AsCString()); + } + return *optional_idx; } bool MightHaveChildren() override { return true; } diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibCxx.cpp b/lldb/source/Plugins/Language/CPlusPlus/LibCxx.cpp index f42297b5b628d..1ff32d03e4c14 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibCxx.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/LibCxx.cpp @@ -314,13 +314,15 @@ bool lldb_private::formatters::LibcxxSharedPtrSyntheticFrontEnd:: return true; } -size_t lldb_private::formatters::LibcxxSharedPtrSyntheticFrontEnd:: +llvm::Expected +lldb_private::formatters::LibcxxSharedPtrSyntheticFrontEnd:: GetIndexOfChildWithName(ConstString name) { if (name == "__ptr_") return 0; if (name == "$$dereference$$") return 1; - return UINT32_MAX; + return llvm::createStringError("Type has no child named '%s'", + name.AsCString()); } lldb_private::formatters::LibcxxSharedPtrSyntheticFrontEnd:: @@ -417,7 +419,8 @@ bool lldb_private::formatters::LibcxxUniquePtrSyntheticFrontEnd:: return true; } -size_t lldb_private::formatters::LibcxxUniquePtrSyntheticFrontEnd:: +llvm::Expected +lldb_private::formatters::LibcxxUniquePtrSyntheticFrontEnd:: GetIndexOfChildWithName(ConstString name) { if (name == "pointer") return 0; @@ -425,7 +428,8 @@ size_t lldb_private::formatters::LibcxxUniquePtrSyntheticFrontEnd:: return 1; if (name == "$$dereference$$") return 2; - return UINT32_MAX; + return llvm::createStringError("Type has no child named '%s'", + name.AsCString()); } bool lldb_private::formatters::LibcxxContainerSummaryProvider( @@ -472,9 +476,15 @@ ExtractLibcxxStringInfo(ValueObject &valobj) { if (!l) return {}; - StringLayout layout = l->GetIndexOfChildWithName("__data_") == 0 - ? StringLayout::DSC - : StringLayout::CSD; + auto index_or_err = l->GetIndexOfChildWithName("__data_"); + if (!index_or_err) { + LLDB_LOG_ERROR(GetLog(LLDBLog::DataFormatters), index_or_err.takeError(), + "{0}"); + return {}; + } + + StringLayout layout = + *index_or_err == 0 ? StringLayout::DSC : StringLayout::CSD; bool short_mode = false; // this means the string is in short-mode and the // data is stored inline diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibCxx.h b/lldb/source/Plugins/Language/CPlusPlus/LibCxx.h index cb9ceaf093300..95797926e961d 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibCxx.h +++ b/lldb/source/Plugins/Language/CPlusPlus/LibCxx.h @@ -104,7 +104,7 @@ class LibcxxSharedPtrSyntheticFrontEnd : public SyntheticChildrenFrontEnd { bool MightHaveChildren() override; - size_t GetIndexOfChildWithName(ConstString name) override; + llvm::Expected GetIndexOfChildWithName(ConstString name) override; ~LibcxxSharedPtrSyntheticFrontEnd() override; @@ -124,7 +124,7 @@ class LibcxxUniquePtrSyntheticFrontEnd : public SyntheticChildrenFrontEnd { bool MightHaveChildren() override; - size_t GetIndexOfChildWithName(ConstString name) override; + llvm::Expected 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 7f30dc186291e..bbe754db1598f 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibCxxAtomic.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/LibCxxAtomic.cpp @@ -98,7 +98,7 @@ class LibcxxStdAtomicSyntheticFrontEnd : public SyntheticChildrenFrontEnd { bool MightHaveChildren() override; - size_t GetIndexOfChildWithName(ConstString name) override; + llvm::Expected GetIndexOfChildWithName(ConstString name) override; private: ValueObject *m_real_child = nullptr; @@ -137,9 +137,13 @@ lldb_private::formatters::LibcxxStdAtomicSyntheticFrontEnd::GetChildAtIndex( return nullptr; } -size_t lldb_private::formatters::LibcxxStdAtomicSyntheticFrontEnd:: +llvm::Expected +lldb_private::formatters::LibcxxStdAtomicSyntheticFrontEnd:: GetIndexOfChildWithName(ConstString name) { - return name == "Value" ? 0 : UINT32_MAX; + if (name == "Value") + return 0; + return llvm::createStringError("Type has no child named '%s'", + name.AsCString()); } SyntheticChildrenFrontEnd * diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibCxxInitializerList.cpp b/lldb/source/Plugins/Language/CPlusPlus/LibCxxInitializerList.cpp index bbbdb44460329..fe150a768e74a 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibCxxInitializerList.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/LibCxxInitializerList.cpp @@ -34,7 +34,7 @@ class LibcxxInitializerListSyntheticFrontEnd bool MightHaveChildren() override; - size_t GetIndexOfChildWithName(ConstString name) override; + llvm::Expected GetIndexOfChildWithName(ConstString name) override; private: ValueObject *m_start = nullptr; @@ -107,11 +107,19 @@ bool lldb_private::formatters::LibcxxInitializerListSyntheticFrontEnd:: return true; } -size_t lldb_private::formatters::LibcxxInitializerListSyntheticFrontEnd:: +llvm::Expected +lldb_private::formatters::LibcxxInitializerListSyntheticFrontEnd:: GetIndexOfChildWithName(ConstString name) { - if (!m_start) - return UINT32_MAX; - return ExtractIndexFromString(name.GetCString()); + if (!m_start) { + return llvm::createStringError("Type has no child named '%s'", + name.AsCString()); + } + auto optional_idx = formatters::ExtractIndexFromString(name.GetCString()); + if (!optional_idx) { + return llvm::createStringError("Type has no child named '%s'", + name.AsCString()); + } + return *optional_idx; } lldb_private::SyntheticChildrenFrontEnd * diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibCxxList.cpp b/lldb/source/Plugins/Language/CPlusPlus/LibCxxList.cpp index f33b148249ab9..eb71f5006ecfe 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibCxxList.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/LibCxxList.cpp @@ -106,8 +106,13 @@ class ListIterator { class AbstractListFrontEnd : public SyntheticChildrenFrontEnd { public: - size_t GetIndexOfChildWithName(ConstString name) override { - return ExtractIndexFromString(name.GetCString()); + llvm::Expected GetIndexOfChildWithName(ConstString name) override { + auto optional_idx = formatters::ExtractIndexFromString(name.GetCString()); + if (!optional_idx) { + return llvm::createStringError("Type has no child named '%s'", + name.AsCString()); + } + return *optional_idx; } bool MightHaveChildren() override { return true; } lldb::ChildCacheState Update() override; diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibCxxMap.cpp b/lldb/source/Plugins/Language/CPlusPlus/LibCxxMap.cpp index ebaf60a16b069..810e589999d21 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibCxxMap.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/LibCxxMap.cpp @@ -199,7 +199,7 @@ class LibcxxStdMapSyntheticFrontEnd : public SyntheticChildrenFrontEnd { bool MightHaveChildren() override; - size_t GetIndexOfChildWithName(ConstString name) override; + llvm::Expected GetIndexOfChildWithName(ConstString name) override; private: llvm::Expected CalculateNumChildrenForOldCompressedPairLayout(); @@ -239,7 +239,7 @@ class LibCxxMapIteratorSyntheticFrontEnd : public SyntheticChildrenFrontEnd { bool MightHaveChildren() override; - size_t GetIndexOfChildWithName(ConstString name) override; + llvm::Expected GetIndexOfChildWithName(ConstString name) override; ~LibCxxMapIteratorSyntheticFrontEnd() override = default; @@ -402,9 +402,14 @@ bool lldb_private::formatters::LibcxxStdMapSyntheticFrontEnd:: return true; } -size_t lldb_private::formatters::LibcxxStdMapSyntheticFrontEnd:: +llvm::Expected lldb_private::formatters::LibcxxStdMapSyntheticFrontEnd:: GetIndexOfChildWithName(ConstString name) { - return ExtractIndexFromString(name.GetCString()); + auto optional_idx = formatters::ExtractIndexFromString(name.GetCString()); + if (!optional_idx) { + return llvm::createStringError("Type has no child named '%s'", + name.AsCString()); + } + return *optional_idx; } SyntheticChildrenFrontEnd * @@ -502,10 +507,12 @@ bool lldb_private::formatters::LibCxxMapIteratorSyntheticFrontEnd:: return true; } -size_t lldb_private::formatters::LibCxxMapIteratorSyntheticFrontEnd:: +llvm::Expected +lldb_private::formatters::LibCxxMapIteratorSyntheticFrontEnd:: GetIndexOfChildWithName(ConstString name) { if (!m_pair_sp) - return UINT32_MAX; + return llvm::createStringError("Type has no child named '%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 72af329eb9649..1add8a8dede44 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibCxxProxyArray.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/LibCxxProxyArray.cpp @@ -43,7 +43,7 @@ class LibcxxStdProxyArraySyntheticFrontEnd : public SyntheticChildrenFrontEnd { bool MightHaveChildren() override; - size_t GetIndexOfChildWithName(ConstString name) override; + llvm::Expected GetIndexOfChildWithName(ConstString name) override; private: /// A non-owning pointer to the array's __vp_. @@ -180,11 +180,18 @@ bool lldb_private::formatters::LibcxxStdProxyArraySyntheticFrontEnd:: return true; } -size_t lldb_private::formatters::LibcxxStdProxyArraySyntheticFrontEnd:: +llvm::Expected +lldb_private::formatters::LibcxxStdProxyArraySyntheticFrontEnd:: GetIndexOfChildWithName(ConstString name) { if (!m_base) - return std::numeric_limits::max(); - return ExtractIndexFromString(name.GetCString()); + return llvm::createStringError("Type has no child named '%s'", + name.AsCString()); + auto optional_idx = formatters::ExtractIndexFromString(name.GetCString()); + if (!optional_idx) { + return llvm::createStringError("Type has no child named '%s'", + name.AsCString()); + } + return *optional_idx; } lldb_private::SyntheticChildrenFrontEnd * diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibCxxQueue.cpp b/lldb/source/Plugins/Language/CPlusPlus/LibCxxQueue.cpp index 5b459a17fe29b..4fac4cb075f2d 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibCxxQueue.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/LibCxxQueue.cpp @@ -20,9 +20,11 @@ class QueueFrontEnd : public SyntheticChildrenFrontEnd { Update(); } - size_t GetIndexOfChildWithName(ConstString name) override { - return m_container_sp ? m_container_sp->GetIndexOfChildWithName(name) - : UINT32_MAX; + llvm::Expected GetIndexOfChildWithName(ConstString name) override { + if (m_container_sp) + return m_container_sp->GetIndexOfChildWithName(name); + return llvm::createStringError("Type has no child named '%s'", + name.AsCString()); } bool MightHaveChildren() override { return true; } diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibCxxRangesRefView.cpp b/lldb/source/Plugins/Language/CPlusPlus/LibCxxRangesRefView.cpp index f3fe56525789a..708559ab57316 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibCxxRangesRefView.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/LibCxxRangesRefView.cpp @@ -42,7 +42,7 @@ class LibcxxStdRangesRefViewSyntheticFrontEnd bool MightHaveChildren() override { return true; } - size_t GetIndexOfChildWithName(ConstString name) override { + llvm::Expected 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 48a7e885bd7a7..1b9ca1a0921df 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibCxxSliceArray.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/LibCxxSliceArray.cpp @@ -64,7 +64,7 @@ class LibcxxStdSliceArraySyntheticFrontEnd : public SyntheticChildrenFrontEnd { bool MightHaveChildren() override; - size_t GetIndexOfChildWithName(ConstString name) override; + llvm::Expected GetIndexOfChildWithName(ConstString name) override; private: /// A non-owning pointer to slice_array.__vp_. @@ -151,11 +151,18 @@ bool lldb_private::formatters::LibcxxStdSliceArraySyntheticFrontEnd:: return true; } -size_t lldb_private::formatters::LibcxxStdSliceArraySyntheticFrontEnd:: +llvm::Expected +lldb_private::formatters::LibcxxStdSliceArraySyntheticFrontEnd:: GetIndexOfChildWithName(ConstString name) { if (!m_start) - return std::numeric_limits::max(); - return ExtractIndexFromString(name.GetCString()); + return llvm::createStringError("Type has no child named '%s'", + name.AsCString()); + auto optional_idx = formatters::ExtractIndexFromString(name.GetCString()); + if (!optional_idx) { + return llvm::createStringError("Type has no child named '%s'", + name.AsCString()); + } + return *optional_idx; } lldb_private::SyntheticChildrenFrontEnd * diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibCxxSpan.cpp b/lldb/source/Plugins/Language/CPlusPlus/LibCxxSpan.cpp index 6b4ddbfb7478f..9a869f643f186 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibCxxSpan.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/LibCxxSpan.cpp @@ -57,7 +57,7 @@ class LibcxxStdSpanSyntheticFrontEnd : public SyntheticChildrenFrontEnd { bool MightHaveChildren() override; - size_t GetIndexOfChildWithName(ConstString name) override; + llvm::Expected GetIndexOfChildWithName(ConstString name) override; private: ValueObject *m_start = nullptr; ///< First element of span. Held, not owned. @@ -134,11 +134,17 @@ bool lldb_private::formatters::LibcxxStdSpanSyntheticFrontEnd:: return true; } -size_t lldb_private::formatters::LibcxxStdSpanSyntheticFrontEnd:: - GetIndexOfChildWithName(ConstString name) { +llvm::Expected lldb_private::formatters:: + LibcxxStdSpanSyntheticFrontEnd::GetIndexOfChildWithName(ConstString name) { if (!m_start) - return UINT32_MAX; - return ExtractIndexFromString(name.GetCString()); + return llvm::createStringError("Type has no child named '%s'", + name.AsCString()); + auto optional_idx = formatters::ExtractIndexFromString(name.GetCString()); + if (!optional_idx) { + return llvm::createStringError("Type has no child named '%s'", + name.AsCString()); + } + return *optional_idx; } lldb_private::SyntheticChildrenFrontEnd * diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibCxxTuple.cpp b/lldb/source/Plugins/Language/CPlusPlus/LibCxxTuple.cpp index 3e3259ab428df..86ae1b818854c 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibCxxTuple.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/LibCxxTuple.cpp @@ -20,8 +20,13 @@ class TupleFrontEnd: public SyntheticChildrenFrontEnd { Update(); } - size_t GetIndexOfChildWithName(ConstString name) override { - return formatters::ExtractIndexFromString(name.GetCString()); + llvm::Expected GetIndexOfChildWithName(ConstString name) override { + auto optional_idx = formatters::ExtractIndexFromString(name.GetCString()); + if (!optional_idx) { + return llvm::createStringError("Type has no child named '%s'", + name.AsCString()); + } + return *optional_idx; } bool MightHaveChildren() override { return true; } diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibCxxUnorderedMap.cpp b/lldb/source/Plugins/Language/CPlusPlus/LibCxxUnorderedMap.cpp index bf91fc42482f3..a14c408138e39 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibCxxUnorderedMap.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/LibCxxUnorderedMap.cpp @@ -42,7 +42,7 @@ class LibcxxStdUnorderedMapSyntheticFrontEnd bool MightHaveChildren() override; - size_t GetIndexOfChildWithName(ConstString name) override; + llvm::Expected GetIndexOfChildWithName(ConstString name) override; private: CompilerType GetNodeType(); @@ -72,7 +72,7 @@ class LibCxxUnorderedMapIteratorSyntheticFrontEnd bool MightHaveChildren() override; - size_t GetIndexOfChildWithName(ConstString name) override; + llvm::Expected GetIndexOfChildWithName(ConstString name) override; private: lldb::ValueObjectSP m_pair_sp; ///< ValueObject for the key/value pair @@ -299,9 +299,15 @@ bool lldb_private::formatters::LibcxxStdUnorderedMapSyntheticFrontEnd:: return true; } -size_t lldb_private::formatters::LibcxxStdUnorderedMapSyntheticFrontEnd:: +llvm::Expected +lldb_private::formatters::LibcxxStdUnorderedMapSyntheticFrontEnd:: GetIndexOfChildWithName(ConstString name) { - return ExtractIndexFromString(name.GetCString()); + auto optional_idx = formatters::ExtractIndexFromString(name.GetCString()); + if (!optional_idx) { + return llvm::createStringError("Type has no child named '%s'", + name.AsCString()); + } + return *optional_idx; } SyntheticChildrenFrontEnd * @@ -411,13 +417,15 @@ bool lldb_private::formatters::LibCxxUnorderedMapIteratorSyntheticFrontEnd:: return true; } -size_t lldb_private::formatters::LibCxxUnorderedMapIteratorSyntheticFrontEnd:: +llvm::Expected +lldb_private::formatters::LibCxxUnorderedMapIteratorSyntheticFrontEnd:: GetIndexOfChildWithName(ConstString name) { if (name == "first") return 0; if (name == "second") return 1; - return UINT32_MAX; + return llvm::createStringError("Type has no child named '%s'", + name.AsCString()); } SyntheticChildrenFrontEnd * diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibCxxValarray.cpp b/lldb/source/Plugins/Language/CPlusPlus/LibCxxValarray.cpp index 24a3a2ae8992d..b2737f26fd339 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibCxxValarray.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/LibCxxValarray.cpp @@ -32,7 +32,7 @@ class LibcxxStdValarraySyntheticFrontEnd : public SyntheticChildrenFrontEnd { bool MightHaveChildren() override; - size_t GetIndexOfChildWithName(ConstString name) override; + llvm::Expected GetIndexOfChildWithName(ConstString name) override; private: /// A non-owning pointer to valarray's __begin_ member. @@ -130,11 +130,18 @@ bool lldb_private::formatters::LibcxxStdValarraySyntheticFrontEnd:: return true; } -size_t lldb_private::formatters::LibcxxStdValarraySyntheticFrontEnd:: +llvm::Expected +lldb_private::formatters::LibcxxStdValarraySyntheticFrontEnd:: GetIndexOfChildWithName(ConstString name) { if (!m_start || !m_finish) - return std::numeric_limits::max(); - return ExtractIndexFromString(name.GetCString()); + return llvm::createStringError("Type has no child named '%s'", + name.AsCString()); + auto optional_idx = formatters::ExtractIndexFromString(name.GetCString()); + if (!optional_idx) { + return llvm::createStringError("Type has no child named '%s'", + name.AsCString()); + } + return *optional_idx; } lldb_private::SyntheticChildrenFrontEnd * diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibCxxVariant.cpp b/lldb/source/Plugins/Language/CPlusPlus/LibCxxVariant.cpp index 910837f7c281b..28120492ed568 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 GetIndexOfChildWithName(ConstString name) override { + auto optional_idx = formatters::ExtractIndexFromString(name.GetCString()); + if (!optional_idx) { + return llvm::createStringError("Type has no child named '%s'", + name.AsCString()); + } + return *optional_idx; } bool MightHaveChildren() override { return true; } diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibCxxVector.cpp b/lldb/source/Plugins/Language/CPlusPlus/LibCxxVector.cpp index e484c595ca5aa..2ebd949a4809a 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibCxxVector.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/LibCxxVector.cpp @@ -35,7 +35,7 @@ class LibcxxStdVectorSyntheticFrontEnd : public SyntheticChildrenFrontEnd { bool MightHaveChildren() override; - size_t GetIndexOfChildWithName(ConstString name) override; + llvm::Expected GetIndexOfChildWithName(ConstString name) override; private: ValueObject *m_start = nullptr; @@ -56,7 +56,7 @@ class LibcxxVectorBoolSyntheticFrontEnd : public SyntheticChildrenFrontEnd { bool MightHaveChildren() override { return true; } - size_t GetIndexOfChildWithName(ConstString name) override; + llvm::Expected GetIndexOfChildWithName(ConstString name) override; private: CompilerType m_bool_type; @@ -173,11 +173,18 @@ bool lldb_private::formatters::LibcxxStdVectorSyntheticFrontEnd:: return true; } -size_t lldb_private::formatters::LibcxxStdVectorSyntheticFrontEnd:: +llvm::Expected +lldb_private::formatters::LibcxxStdVectorSyntheticFrontEnd:: GetIndexOfChildWithName(ConstString name) { if (!m_start || !m_finish) - return UINT32_MAX; - return ExtractIndexFromString(name.GetCString()); + return llvm::createStringError("Type has no child named '%s'", + name.AsCString()); + auto optional_idx = formatters::ExtractIndexFromString(name.GetCString()); + if (!optional_idx) { + return llvm::createStringError("Type has no child named '%s'", + name.AsCString()); + } + return *optional_idx; } lldb_private::formatters::LibcxxVectorBoolSyntheticFrontEnd:: @@ -269,14 +276,21 @@ lldb_private::formatters::LibcxxVectorBoolSyntheticFrontEnd::Update() { return lldb::ChildCacheState::eRefetch; } -size_t lldb_private::formatters::LibcxxVectorBoolSyntheticFrontEnd:: +llvm::Expected +lldb_private::formatters::LibcxxVectorBoolSyntheticFrontEnd:: GetIndexOfChildWithName(ConstString name) { if (!m_count || !m_base_data_address) - return UINT32_MAX; - const char *item_name = name.GetCString(); - uint32_t idx = ExtractIndexFromString(item_name); - if (idx < UINT32_MAX && idx >= CalculateNumChildrenIgnoringErrors()) - return UINT32_MAX; + return llvm::createStringError("Type has no child named '%s'", + name.AsCString()); + auto optional_idx = ExtractIndexFromString(name.AsCString()); + if (!optional_idx) { + return llvm::createStringError("Type has no child named '%s'", + name.AsCString()); + } + uint32_t idx = *optional_idx; + if (idx >= CalculateNumChildrenIgnoringErrors()) + return llvm::createStringError("Type has no child named '%s'", + name.AsCString()); return idx; } diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.cpp b/lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.cpp index 11f728cc5f7df..e8ba7c94fdde3 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.cpp @@ -51,7 +51,7 @@ class LibstdcppMapIteratorSyntheticFrontEnd : public SyntheticChildrenFrontEnd { bool MightHaveChildren() override; - size_t GetIndexOfChildWithName(ConstString name) override; + llvm::Expected GetIndexOfChildWithName(ConstString name) override; private: ExecutionContextRef m_exe_ctx_ref; @@ -72,7 +72,8 @@ class LibStdcppSharedPtrSyntheticFrontEnd : public SyntheticChildrenFrontEnd { bool MightHaveChildren() override; - size_t GetIndexOfChildWithName(ConstString name) override; + llvm::Expected GetIndexOfChildWithName(ConstString name) override; + private: // The lifetime of a ValueObject and all its derivative ValueObjects @@ -151,13 +152,15 @@ LibstdcppMapIteratorSyntheticFrontEnd::GetChildAtIndex(uint32_t idx) { bool LibstdcppMapIteratorSyntheticFrontEnd::MightHaveChildren() { return true; } -size_t LibstdcppMapIteratorSyntheticFrontEnd::GetIndexOfChildWithName( +llvm::Expected +LibstdcppMapIteratorSyntheticFrontEnd::GetIndexOfChildWithName( ConstString name) { if (name == "first") return 0; if (name == "second") return 1; - return UINT32_MAX; + return llvm::createStringError("Type has no child named '%s'", + name.AsCString()); } SyntheticChildrenFrontEnd * @@ -234,11 +237,12 @@ VectorIteratorSyntheticFrontEnd::GetChildAtIndex(uint32_t idx) { bool VectorIteratorSyntheticFrontEnd::MightHaveChildren() { return true; } -size_t VectorIteratorSyntheticFrontEnd::GetIndexOfChildWithName( - ConstString name) { +llvm::Expected +VectorIteratorSyntheticFrontEnd::GetIndexOfChildWithName(ConstString name) { if (name == "item") return 0; - return UINT32_MAX; + return llvm::createStringError("Type has no child named '%s'", + name.AsCString()); } bool lldb_private::formatters::LibStdcppStringSummaryProvider( @@ -419,13 +423,14 @@ lldb::ChildCacheState LibStdcppSharedPtrSyntheticFrontEnd::Update() { bool LibStdcppSharedPtrSyntheticFrontEnd::MightHaveChildren() { return true; } -size_t LibStdcppSharedPtrSyntheticFrontEnd::GetIndexOfChildWithName( - ConstString name) { +llvm::Expected +LibStdcppSharedPtrSyntheticFrontEnd::GetIndexOfChildWithName(ConstString name) { if (name == "pointer") return 0; if (name == "object" || name == "$$dereference$$") return 1; - return UINT32_MAX; + return llvm::createStringError("Type has no child named '%s'", + name.AsCString()); } SyntheticChildrenFrontEnd * diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibStdcppTuple.cpp b/lldb/source/Plugins/Language/CPlusPlus/LibStdcppTuple.cpp index f59969d4cd7a1..6b8a5cf136723 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibStdcppTuple.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/LibStdcppTuple.cpp @@ -34,7 +34,7 @@ class LibStdcppTupleSyntheticFrontEnd : public SyntheticChildrenFrontEnd { bool MightHaveChildren() override; - size_t GetIndexOfChildWithName(ConstString name) override; + llvm::Expected GetIndexOfChildWithName(ConstString name) override; private: // The lifetime of a ValueObject and all its derivative ValueObjects @@ -100,9 +100,14 @@ LibStdcppTupleSyntheticFrontEnd::CalculateNumChildren() { return m_members.size(); } -size_t LibStdcppTupleSyntheticFrontEnd::GetIndexOfChildWithName( - ConstString name) { - return ExtractIndexFromString(name.GetCString()); +llvm::Expected +LibStdcppTupleSyntheticFrontEnd::GetIndexOfChildWithName(ConstString name) { + auto optional_idx = formatters::ExtractIndexFromString(name.GetCString()); + if (!optional_idx) { + return llvm::createStringError("Type has no child named '%s'", + name.AsCString()); + } + return *optional_idx; } SyntheticChildrenFrontEnd * diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibStdcppUniquePointer.cpp b/lldb/source/Plugins/Language/CPlusPlus/LibStdcppUniquePointer.cpp index 593716cdd7c33..80fb9b3041a9c 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibStdcppUniquePointer.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/LibStdcppUniquePointer.cpp @@ -34,7 +34,7 @@ class LibStdcppUniquePtrSyntheticFrontEnd : public SyntheticChildrenFrontEnd { bool MightHaveChildren() override; - size_t GetIndexOfChildWithName(ConstString name) override; + llvm::Expected GetIndexOfChildWithName(ConstString name) override; bool GetSummary(Stream &stream, const TypeSummaryOptions &options); @@ -143,15 +143,16 @@ LibStdcppUniquePtrSyntheticFrontEnd::CalculateNumChildren() { return 1; } -size_t LibStdcppUniquePtrSyntheticFrontEnd::GetIndexOfChildWithName( - ConstString name) { +llvm::Expected +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("Type has no child named '%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 b17d263d76d3b..e79fb35ed971b 100644 --- a/lldb/source/Plugins/Language/ObjC/Cocoa.cpp +++ b/lldb/source/Plugins/Language/ObjC/Cocoa.cpp @@ -1080,8 +1080,9 @@ class ObjCClassSyntheticChildrenFrontEnd : public SyntheticChildrenFrontEnd { bool MightHaveChildren() override { return false; } - size_t GetIndexOfChildWithName(ConstString name) override { - return UINT32_MAX; + llvm::Expected GetIndexOfChildWithName(ConstString name) override { + return llvm::createStringError("Type has no child named '%s'", + name.AsCString()); } }; diff --git a/lldb/source/Plugins/Language/ObjC/NSArray.cpp b/lldb/source/Plugins/Language/ObjC/NSArray.cpp index 5d6b7354c5f05..2a5397e5ea942 100644 --- a/lldb/source/Plugins/Language/ObjC/NSArray.cpp +++ b/lldb/source/Plugins/Language/ObjC/NSArray.cpp @@ -58,7 +58,7 @@ class NSArrayMSyntheticFrontEndBase : public SyntheticChildrenFrontEnd { bool MightHaveChildren() override; - size_t GetIndexOfChildWithName(ConstString name) override; + llvm::Expected GetIndexOfChildWithName(ConstString name) override; protected: virtual lldb::addr_t GetDataAddress() = 0; @@ -222,7 +222,7 @@ class GenericNSArrayISyntheticFrontEnd : public SyntheticChildrenFrontEnd { bool MightHaveChildren() override; - size_t GetIndexOfChildWithName(ConstString name) override; + llvm::Expected GetIndexOfChildWithName(ConstString name) override; private: ExecutionContextRef m_exe_ctx_ref; @@ -310,7 +310,7 @@ class NSArray0SyntheticFrontEnd : public SyntheticChildrenFrontEnd { bool MightHaveChildren() override; - size_t GetIndexOfChildWithName(ConstString name) override; + llvm::Expected GetIndexOfChildWithName(ConstString name) override; }; class NSArray1SyntheticFrontEnd : public SyntheticChildrenFrontEnd { @@ -327,7 +327,7 @@ class NSArray1SyntheticFrontEnd : public SyntheticChildrenFrontEnd { bool MightHaveChildren() override; - size_t GetIndexOfChildWithName(ConstString name) override; + llvm::Expected GetIndexOfChildWithName(ConstString name) override; }; } // namespace formatters } // namespace lldb_private @@ -537,13 +537,17 @@ lldb_private::formatters::NSArrayMSyntheticFrontEndBase::MightHaveChildren() { return true; } -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()) - return UINT32_MAX; +llvm::Expected lldb_private::formatters::NSArrayMSyntheticFrontEndBase:: + GetIndexOfChildWithName(ConstString name) { + auto optional_idx = ExtractIndexFromString(name.AsCString()); + if (!optional_idx) { + return llvm::createStringError("Type has no child named '%s'", + name.AsCString()); + } + uint32_t idx = *optional_idx; + if (idx >= CalculateNumChildrenIgnoringErrors()) + return llvm::createStringError("Type has no child named '%s'", + name.AsCString()); return idx; } @@ -623,13 +627,18 @@ lldb_private::formatters::GenericNSArrayISyntheticFrontEnd:: } template -size_t -lldb_private::formatters::GenericNSArrayISyntheticFrontEnd:: - GetIndexOfChildWithName(ConstString name) { - const char *item_name = name.GetCString(); - uint32_t idx = ExtractIndexFromString(item_name); - if (idx < UINT32_MAX && idx >= CalculateNumChildrenIgnoringErrors()) - return UINT32_MAX; +llvm::Expected +lldb_private::formatters::GenericNSArrayISyntheticFrontEnd< + D32, D64, Inline>::GetIndexOfChildWithName(ConstString name) { + auto optional_idx = ExtractIndexFromString(name.AsCString()); + if (!optional_idx) { + return llvm::createStringError("Type has no child named '%s'", + name.AsCString()); + } + uint32_t idx = *optional_idx; + if (idx >= CalculateNumChildrenIgnoringErrors()) + return llvm::createStringError("Type has no child named '%s'", + name.AsCString()); return idx; } @@ -713,7 +722,7 @@ lldb_private::formatters::NSArray0SyntheticFrontEnd::NSArray0SyntheticFrontEnd( lldb::ValueObjectSP valobj_sp) : SyntheticChildrenFrontEnd(*valobj_sp) {} -size_t +llvm::Expected lldb_private::formatters::NSArray0SyntheticFrontEnd::GetIndexOfChildWithName( ConstString name) { return UINT32_MAX; @@ -743,7 +752,7 @@ lldb_private::formatters::NSArray1SyntheticFrontEnd::NSArray1SyntheticFrontEnd( lldb::ValueObjectSP valobj_sp) : SyntheticChildrenFrontEnd(*valobj_sp.get()) {} -size_t +llvm::Expected 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 a06e33ee556cf..8a85157bda829 100644 --- a/lldb/source/Plugins/Language/ObjC/NSDictionary.cpp +++ b/lldb/source/Plugins/Language/ObjC/NSDictionary.cpp @@ -111,7 +111,7 @@ class NSDictionaryISyntheticFrontEnd : public SyntheticChildrenFrontEnd { bool MightHaveChildren() override; - size_t GetIndexOfChildWithName(ConstString name) override; + llvm::Expected GetIndexOfChildWithName(ConstString name) override; private: struct DataDescriptor_32 { @@ -152,7 +152,7 @@ class NSConstantDictionarySyntheticFrontEnd : public SyntheticChildrenFrontEnd { bool MightHaveChildren() override; - size_t GetIndexOfChildWithName(ConstString name) override; + llvm::Expected GetIndexOfChildWithName(ConstString name) override; private: ExecutionContextRef m_exe_ctx_ref; @@ -184,7 +184,7 @@ class NSCFDictionarySyntheticFrontEnd : public SyntheticChildrenFrontEnd { bool MightHaveChildren() override; - size_t GetIndexOfChildWithName(ConstString name) override; + llvm::Expected GetIndexOfChildWithName(ConstString name) override; private: struct DictionaryItemDescriptor { @@ -217,7 +217,7 @@ class NSDictionary1SyntheticFrontEnd : public SyntheticChildrenFrontEnd { bool MightHaveChildren() override; - size_t GetIndexOfChildWithName(ConstString name) override; + llvm::Expected GetIndexOfChildWithName(ConstString name) override; private: ValueObjectSP m_pair; @@ -238,7 +238,7 @@ class GenericNSDictionaryMSyntheticFrontEnd : public SyntheticChildrenFrontEnd { bool MightHaveChildren() override; - size_t GetIndexOfChildWithName(ConstString name) override; + llvm::Expected GetIndexOfChildWithName(ConstString name) override; private: struct DictionaryItemDescriptor { @@ -270,9 +270,9 @@ namespace Foundation1100 { lldb::ChildCacheState Update() override; bool MightHaveChildren() override; - - size_t GetIndexOfChildWithName(ConstString name) override; - + + llvm::Expected GetIndexOfChildWithName(ConstString name) override; + private: struct DataDescriptor_32 { uint32_t _used : 26; @@ -597,12 +597,17 @@ lldb_private::formatters::NSDictionaryISyntheticFrontEnd:: m_data_64 = nullptr; } -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; +llvm::Expected lldb_private::formatters:: + NSDictionaryISyntheticFrontEnd::GetIndexOfChildWithName(ConstString name) { + auto optional_idx = ExtractIndexFromString(name.AsCString()); + if (!optional_idx) { + return llvm::createStringError("Type has no child named '%s'", + name.AsCString()); + } + uint32_t idx = *optional_idx; + if (idx >= CalculateNumChildrenIgnoringErrors()) + return llvm::createStringError("Type has no child named '%s'", + name.AsCString()); return idx; } @@ -735,12 +740,17 @@ 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) { - const char *item_name = name.GetCString(); - const uint32_t idx = ExtractIndexFromString(item_name); - if (idx < UINT32_MAX && idx >= CalculateNumChildrenIgnoringErrors()) - return UINT32_MAX; +llvm::Expected lldb_private::formatters:: + NSCFDictionarySyntheticFrontEnd::GetIndexOfChildWithName(ConstString name) { + auto optional_idx = ExtractIndexFromString(name.AsCString()); + if (!optional_idx) { + return llvm::createStringError("Type has no child named '%s'", + name.AsCString()); + } + uint32_t idx = *optional_idx; + if (idx >= CalculateNumChildrenIgnoringErrors()) + return llvm::createStringError("Type has no child named '%s'", + name.AsCString()); return idx; } @@ -871,12 +881,18 @@ lldb_private::formatters::NSConstantDictionarySyntheticFrontEnd:: NSConstantDictionarySyntheticFrontEnd(lldb::ValueObjectSP valobj_sp) : SyntheticChildrenFrontEnd(*valobj_sp) {} -size_t lldb_private::formatters::NSConstantDictionarySyntheticFrontEnd:: +llvm::Expected +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; + auto optional_idx = ExtractIndexFromString(name.AsCString()); + if (!optional_idx) { + return llvm::createStringError("Type has no child named '%s'", + name.AsCString()); + } + uint32_t idx = *optional_idx; + if (idx >= CalculateNumChildrenIgnoringErrors()) + return llvm::createStringError("Type has no child named '%s'", + name.AsCString()); return idx; } @@ -988,10 +1004,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 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("Type has no child named '%s'", + name.AsCString()); } llvm::Expected lldb_private::formatters:: @@ -1077,12 +1096,18 @@ lldb_private::formatters::GenericNSDictionaryMSyntheticFrontEnd< } template -size_t lldb_private::formatters::GenericNSDictionaryMSyntheticFrontEnd< +llvm::Expected +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; + auto optional_idx = ExtractIndexFromString(name.AsCString()); + if (!optional_idx) { + return llvm::createStringError("Type has no child named '%s'", + name.AsCString()); + } + uint32_t idx = *optional_idx; + if (idx >= CalculateNumChildrenIgnoringErrors()) + return llvm::createStringError("Type has no child named '%s'", + name.AsCString()); return idx; } @@ -1241,13 +1266,17 @@ lldb_private::formatters::Foundation1100:: m_data_64 = nullptr; } -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; +llvm::Expected lldb_private::formatters::Foundation1100:: + NSDictionaryMSyntheticFrontEnd::GetIndexOfChildWithName(ConstString name) { + auto optional_idx = ExtractIndexFromString(name.AsCString()); + if (!optional_idx) { + return llvm::createStringError("Type has no child named '%s'", + name.AsCString()); + } + uint32_t idx = *optional_idx; + if (idx >= CalculateNumChildrenIgnoringErrors()) + return llvm::createStringError("Type has no child named '%s'", + name.AsCString()); return idx; } diff --git a/lldb/source/Plugins/Language/ObjC/NSError.cpp b/lldb/source/Plugins/Language/ObjC/NSError.cpp index bb54044ae1d61..a1044e7a474c8 100644 --- a/lldb/source/Plugins/Language/ObjC/NSError.cpp +++ b/lldb/source/Plugins/Language/ObjC/NSError.cpp @@ -167,11 +167,12 @@ class NSErrorSyntheticFrontEnd : public SyntheticChildrenFrontEnd { bool MightHaveChildren() override { return true; } - size_t GetIndexOfChildWithName(ConstString name) override { + llvm::Expected GetIndexOfChildWithName(ConstString name) override { static ConstString g_userInfo("_userInfo"); if (name == g_userInfo) return 0; - return UINT32_MAX; + return llvm::createStringError("Type has no child named '%s'", + name.AsCString()); } private: diff --git a/lldb/source/Plugins/Language/ObjC/NSException.cpp b/lldb/source/Plugins/Language/ObjC/NSException.cpp index b7d42bc5745e3..30660c1b5a322 100644 --- a/lldb/source/Plugins/Language/ObjC/NSException.cpp +++ b/lldb/source/Plugins/Language/ObjC/NSException.cpp @@ -150,7 +150,7 @@ class NSExceptionSyntheticFrontEnd : public SyntheticChildrenFrontEnd { bool MightHaveChildren() override { return true; } - size_t GetIndexOfChildWithName(ConstString name) override { + llvm::Expected GetIndexOfChildWithName(ConstString name) override { // NSException has 4 members: // NSString *name; // NSString *reason; @@ -164,7 +164,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("Type has no child named '%s'", + name.AsCString()); } private: diff --git a/lldb/source/Plugins/Language/ObjC/NSIndexPath.cpp b/lldb/source/Plugins/Language/ObjC/NSIndexPath.cpp index e29f625b405b0..b5360195e91d2 100644 --- a/lldb/source/Plugins/Language/ObjC/NSIndexPath.cpp +++ b/lldb/source/Plugins/Language/ObjC/NSIndexPath.cpp @@ -126,11 +126,16 @@ class NSIndexPathSyntheticFrontEnd : public SyntheticChildrenFrontEnd { bool MightHaveChildren() override { return m_impl.m_mode != Mode::Invalid; } - 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; + llvm::Expected GetIndexOfChildWithName(ConstString name) override { + auto optional_idx = ExtractIndexFromString(name.AsCString()); + if (!optional_idx) { + return llvm::createStringError("Type has no child named '%s'", + name.AsCString()); + } + uint32_t idx = *optional_idx; + if (idx >= CalculateNumChildrenIgnoringErrors()) + return llvm::createStringError("Type has no child named '%s'", + name.AsCString()); return idx; } diff --git a/lldb/source/Plugins/Language/ObjC/NSSet.cpp b/lldb/source/Plugins/Language/ObjC/NSSet.cpp index 6bceab78b50a3..23cb066d540c1 100644 --- a/lldb/source/Plugins/Language/ObjC/NSSet.cpp +++ b/lldb/source/Plugins/Language/ObjC/NSSet.cpp @@ -54,7 +54,7 @@ class NSSetISyntheticFrontEnd : public SyntheticChildrenFrontEnd { bool MightHaveChildren() override; - size_t GetIndexOfChildWithName(ConstString name) override; + llvm::Expected GetIndexOfChildWithName(ConstString name) override; private: struct DataDescriptor_32 { @@ -92,7 +92,7 @@ class NSCFSetSyntheticFrontEnd : public SyntheticChildrenFrontEnd { bool MightHaveChildren() override; - size_t GetIndexOfChildWithName(ConstString name) override; + llvm::Expected GetIndexOfChildWithName(ConstString name) override; private: struct SetItemDescriptor { @@ -125,7 +125,7 @@ class GenericNSSetMSyntheticFrontEnd : public SyntheticChildrenFrontEnd { bool MightHaveChildren() override; - size_t GetIndexOfChildWithName(ConstString name) override; + llvm::Expected GetIndexOfChildWithName(ConstString name) override; private: @@ -409,13 +409,18 @@ lldb_private::formatters::NSSetISyntheticFrontEnd::~NSSetISyntheticFrontEnd() { m_data_64 = nullptr; } -size_t +llvm::Expected 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; + auto optional_idx = ExtractIndexFromString(name.AsCString()); + if (!optional_idx) { + return llvm::createStringError("Type has no child named '%s'", + name.AsCString()); + } + uint32_t idx = *optional_idx; + if (idx >= CalculateNumChildrenIgnoringErrors()) + return llvm::createStringError("Type has no child named '%s'", + name.AsCString()); return idx; } @@ -546,13 +551,18 @@ lldb_private::formatters::NSCFSetSyntheticFrontEnd::NSCFSetSyntheticFrontEnd( : SyntheticChildrenFrontEnd(*valobj_sp), m_exe_ctx_ref(), m_hashtable(), m_pair_type() {} -size_t +llvm::Expected 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; + auto optional_idx = ExtractIndexFromString(name.AsCString()); + if (!optional_idx) { + return llvm::createStringError("Type has no child named '%s'", + name.AsCString()); + } + uint32_t idx = *optional_idx; + if (idx >= CalculateNumChildrenIgnoringErrors()) + return llvm::createStringError("Type has no child named '%s'", + name.AsCString()); return idx; } @@ -685,14 +695,17 @@ lldb_private::formatters::GenericNSSetMSyntheticFrontEnd:: } template -size_t -lldb_private::formatters:: - GenericNSSetMSyntheticFrontEnd::GetIndexOfChildWithName( - ConstString name) { - const char *item_name = name.GetCString(); - uint32_t idx = ExtractIndexFromString(item_name); - if (idx < UINT32_MAX && idx >= CalculateNumChildrenIgnoringErrors()) - return UINT32_MAX; +llvm::Expected lldb_private::formatters::GenericNSSetMSyntheticFrontEnd< + D32, D64>::GetIndexOfChildWithName(ConstString name) { + auto optional_idx = ExtractIndexFromString(name.AsCString()); + if (!optional_idx) { + return llvm::createStringError("Type has no child named '%s'", + name.AsCString()); + } + uint32_t idx = *optional_idx; + if (idx >= CalculateNumChildrenIgnoringErrors()) + return llvm::createStringError("Type has no child named '%s'", + name.AsCString()); return idx; } diff --git a/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp b/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp index 3737cd8549257..62e2adf956e42 100644 --- a/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp +++ b/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp @@ -2103,19 +2103,19 @@ lldb::ValueObjectSP ScriptInterpreterPythonImpl::GetChildAtIndex( return ret_val; } -int ScriptInterpreterPythonImpl::GetIndexOfChildWithName( +llvm::Expected ScriptInterpreterPythonImpl::GetIndexOfChildWithName( const StructuredData::ObjectSP &implementor_sp, const char *child_name) { if (!implementor_sp) - return UINT32_MAX; + return llvm::createStringError("Type has no child named '%s'", child_name); StructuredData::Generic *generic = implementor_sp->GetAsGeneric(); if (!generic) - return UINT32_MAX; + return llvm::createStringError("Type has no child named '%s'", child_name); auto *implementor = static_cast(generic->GetValue()); if (!implementor) - return UINT32_MAX; + return llvm::createStringError("Type has no child named '%s'", child_name); - int ret_val = UINT32_MAX; + int ret_val = INT32_MAX; { Locker py_lock(this, @@ -2123,6 +2123,8 @@ int ScriptInterpreterPythonImpl::GetIndexOfChildWithName( ret_val = SWIGBridge::LLDBSwigPython_GetIndexOfChildWithName(implementor, child_name); } + if (ret_val == INT32_MAX) + return llvm::createStringError("Type has no child named '%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 812b44cb66b61..fba2c7a8fbe64 100644 --- a/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPythonImpl.h +++ b/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPythonImpl.h @@ -135,8 +135,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 + 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 3dc6e391e5d83..8eb71d56f35c6 100644 --- a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp +++ b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp @@ -7167,7 +7167,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 TypeSystemClang::GetIndexOfChildWithName( +llvm::Expected TypeSystemClang::GetIndexOfChildWithName( lldb::opaque_compiler_type_t type, llvm::StringRef name, ExecutionContext *exe_ctx, bool omit_empty_base_classes) { if (type && !name.empty()) { @@ -7356,7 +7356,8 @@ uint32_t TypeSystemClang::GetIndexOfChildWithName( break; } } - return UINT32_MAX; + return llvm::createStringError("Type has no child named '%s'", + name.str().c_str()); } CompilerType diff --git a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h index 778f444b9e1bc..f4417d3b56dd9 100644 --- a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h +++ b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h @@ -978,10 +978,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, - ExecutionContext *exe_ctx, - bool omit_empty_base_classes) override; + llvm::Expected + GetIndexOfChildWithName(lldb::opaque_compiler_type_t type, + llvm::StringRef name, ExecutionContext *exe_ctx, + 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 4eed615ad7bb3..91af4c41c3639 100644 --- a/lldb/source/Symbol/CompilerType.cpp +++ b/lldb/source/Symbol/CompilerType.cpp @@ -1091,7 +1091,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 CompilerType::GetIndexOfChildWithName(llvm::StringRef name, ExecutionContext *exe_ctx, bool omit_empty_base_classes) const { @@ -1100,7 +1100,8 @@ CompilerType::GetIndexOfChildWithName(llvm::StringRef name, return type_system_sp->GetIndexOfChildWithName(m_type, name, exe_ctx, omit_empty_base_classes); } - return UINT32_MAX; + return llvm::createStringError("Type has no child named '%s'", + name.str().c_str()); } // Dumping types diff --git a/lldb/source/ValueObject/ValueObject.cpp b/lldb/source/ValueObject/ValueObject.cpp index 800ed460f4017..b3210822d5173 100644 --- a/lldb/source/ValueObject/ValueObject.cpp +++ b/lldb/source/ValueObject/ValueObject.cpp @@ -469,7 +469,8 @@ ValueObject::GetChildAtNamePath(llvm::ArrayRef names) { return root; } -size_t ValueObject::GetIndexOfChildWithName(llvm::StringRef name) { +llvm::Expected +ValueObject::GetIndexOfChildWithName(llvm::StringRef name) { bool omit_empty_base_classes = true; ExecutionContext exe_ctx(GetExecutionContextRef()); return GetCompilerType().GetIndexOfChildWithName(name, &exe_ctx, diff --git a/lldb/source/ValueObject/ValueObjectRegister.cpp b/lldb/source/ValueObject/ValueObjectRegister.cpp index a56d3160d9ae2..97aeaa8bebe63 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 +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("Type has no child named '%s'", + name.str().c_str()); } #pragma mark - diff --git a/lldb/source/ValueObject/ValueObjectSyntheticFilter.cpp b/lldb/source/ValueObject/ValueObjectSyntheticFilter.cpp index d49c27f0006bc..3f7c820fb3125 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 GetIndexOfChildWithName(ConstString name) override { return m_backend.GetIndexOfChildWithName(name); } @@ -319,40 +319,45 @@ 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) { + llvm::consumeError(index_or_err.takeError()); 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 +ValueObjectSynthetic::GetIndexOfChildWithName(llvm::StringRef name_ref) { UpdateValueIfNeeded(); ConstString name(name_ref); - uint32_t found_index = UINT32_MAX; - bool did_find; + std::optional found_index = std::nullopt; { std::lock_guard 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 && m_synth_filter_up != nullptr) { + auto index_or_err = m_synth_filter_up->GetIndexOfChildWithName(name); + if (!index_or_err) + return index_or_err.takeError(); std::lock_guard guard(m_child_mutex); - m_name_toindex[name.GetCString()] = index; - return index; - } else if (!did_find && m_synth_filter_up == nullptr) - return UINT32_MAX; - else /*if (iter != m_name_toindex.end())*/ - return found_index; + m_name_toindex[name.GetCString()] = *index_or_err; + return *index_or_err; + } else if (!found_index && m_synth_filter_up == nullptr) { + return llvm::createStringError("Type has no child named '%s'", + name.AsCString()); + } else if (found_index) + return *found_index; + + return llvm::createStringError("Type has no child named '%s'", + name.AsCString()); } bool ValueObjectSynthetic::IsInScope() { return m_parent->IsInScope(); } diff --git a/lldb/unittests/Platform/PlatformSiginfoTest.cpp b/lldb/unittests/Platform/PlatformSiginfoTest.cpp index 2726357e65e57..cff5d07ed2d7f 100644 --- a/lldb/unittests/Platform/PlatformSiginfoTest.cpp +++ b/lldb/unittests/Platform/PlatformSiginfoTest.cpp @@ -61,9 +61,12 @@ class PlatformSiginfoTest : public ::testing::Test { uint64_t total_offset = 0; for (auto field_name : llvm::split(path, '.')) { uint64_t bit_offset; - ASSERT_NE(field_type.GetIndexOfFieldWithName(field_name.str().c_str(), - &field_type, &bit_offset), - UINT32_MAX); + std::string name; + auto index_or_err = field_type.GetIndexOfChildWithName(field_name, false); + ASSERT_FALSE(!index_or_err); + field_type = field_type.GetFieldAtIndex(*index_or_err, name, &bit_offset, + nullptr, nullptr); + ASSERT_TRUE(field_type); total_offset += bit_offset; }