Skip to content

[lldb][DataFormatters] Change ExtractIndexFromString to return std::optional #138297

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion lldb/include/lldb/DataFormatters/FormattersHelpers.h
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,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<size_t> ExtractIndexFromString(const char *item_name);

Address GetArrayAddressOrPointerValue(ValueObject &valobj);

Expand Down
13 changes: 6 additions & 7 deletions lldb/source/DataFormatters/FormattersHelpers.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -97,18 +97,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<size_t>
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;
}

Expand Down
11 changes: 7 additions & 4 deletions lldb/source/DataFormatters/VectorType.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -270,10 +270,13 @@ class VectorTypeSyntheticFrontEnd : public SyntheticChildrenFrontEnd {
}

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 < UINT32_MAX && idx >= CalculateNumChildrenIgnoringErrors()))
auto optional_idx = ExtractIndexFromString(name.AsCString());
if (!optional_idx) {
return llvm::createStringError("Type has no child named '%s'",
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See my comment above. I would probably just return optional from ExtractIndexFromString, since the error message isn't that useful. But if it were useful, I wanted to point out that we also have llvm::joinErrors()

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I ended up switching to std::optional following the different discussions. The error message are not very descriptive, and not finding an index did not mean there was an error, but rather that the name was not found in the string.

name.AsCString());
}
uint32_t idx = *optional_idx;
if (idx >= CalculateNumChildrenIgnoringErrors())
return llvm::createStringError("Type has no child named '%s'",
name.AsCString());
return idx;
Expand Down
7 changes: 4 additions & 3 deletions lldb/source/Plugins/Language/CPlusPlus/GenericBitset.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,11 +29,12 @@ class GenericBitsetFrontEnd : public SyntheticChildrenFrontEnd {
GenericBitsetFrontEnd(ValueObject &valobj, StdLib stdlib);

llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override {
size_t idx = formatters::ExtractIndexFromString(name.GetCString());
if (idx == UINT32_MAX)
auto optional_idx = formatters::ExtractIndexFromString(name.GetCString());
if (!optional_idx) {
return llvm::createStringError("Type has no child named '%s'",
name.AsCString());
return idx;
}
return *optional_idx;
}

lldb::ChildCacheState Update() override;
Expand Down
7 changes: 4 additions & 3 deletions lldb/source/Plugins/Language/CPlusPlus/GenericOptional.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,11 +39,12 @@ class GenericOptionalFrontend : public SyntheticChildrenFrontEnd {
llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override {
if (name == "$$dereference$$")
return 0;
size_t idx = formatters::ExtractIndexFromString(name.GetCString());
if (idx == UINT32_MAX)
auto optional_idx = formatters::ExtractIndexFromString(name.GetCString());
if (!optional_idx) {
return llvm::createStringError("Type has no child named '%s'",
name.AsCString());
return idx;
}
return *optional_idx;
}

llvm::Expected<uint32_t> CalculateNumChildren() override {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -108,12 +108,12 @@ lldb_private::formatters::LibcxxInitializerListSyntheticFrontEnd::
return llvm::createStringError("Type has no child named '%s'",
name.AsCString());
}
size_t idx = ExtractIndexFromString(name.GetCString());
if (idx == UINT32_MAX) {
auto optional_idx = formatters::ExtractIndexFromString(name.GetCString());
if (!optional_idx) {
return llvm::createStringError("Type has no child named '%s'",
name.AsCString());
}
return idx;
return *optional_idx;
}

lldb_private::SyntheticChildrenFrontEnd *
Expand Down
7 changes: 4 additions & 3 deletions lldb/source/Plugins/Language/CPlusPlus/LibCxxList.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -107,11 +107,12 @@ class ListIterator {
class AbstractListFrontEnd : public SyntheticChildrenFrontEnd {
public:
llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override {
size_t idx = ExtractIndexFromString(name.GetCString());
if (idx == UINT32_MAX)
auto optional_idx = formatters::ExtractIndexFromString(name.GetCString());
if (!optional_idx) {
return llvm::createStringError("Type has no child named '%s'",
name.AsCString());
return idx;
}
return *optional_idx;
}
lldb::ChildCacheState Update() override;

Expand Down
6 changes: 3 additions & 3 deletions lldb/source/Plugins/Language/CPlusPlus/LibCxxMap.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -395,12 +395,12 @@ lldb_private::formatters::LibcxxStdMapSyntheticFrontEnd::Update() {

llvm::Expected<size_t> lldb_private::formatters::LibcxxStdMapSyntheticFrontEnd::
GetIndexOfChildWithName(ConstString name) {
size_t idx = ExtractIndexFromString(name.GetCString());
if (idx == UINT32_MAX) {
auto optional_idx = formatters::ExtractIndexFromString(name.GetCString());
if (!optional_idx) {
return llvm::createStringError("Type has no child named '%s'",
name.AsCString());
}
return idx;
return *optional_idx;
}

SyntheticChildrenFrontEnd *
Expand Down
6 changes: 3 additions & 3 deletions lldb/source/Plugins/Language/CPlusPlus/LibCxxProxyArray.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -179,12 +179,12 @@ lldb_private::formatters::LibcxxStdProxyArraySyntheticFrontEnd::
if (!m_base)
return llvm::createStringError("Type has no child named '%s'",
name.AsCString());
size_t idx = ExtractIndexFromString(name.GetCString());
if (idx == UINT32_MAX) {
auto optional_idx = formatters::ExtractIndexFromString(name.GetCString());
if (!optional_idx) {
return llvm::createStringError("Type has no child named '%s'",
name.AsCString());
}
return idx;
return *optional_idx;
}

lldb_private::SyntheticChildrenFrontEnd *
Expand Down
7 changes: 4 additions & 3 deletions lldb/source/Plugins/Language/CPlusPlus/LibCxxSliceArray.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -150,11 +150,12 @@ lldb_private::formatters::LibcxxStdSliceArraySyntheticFrontEnd::
if (!m_start)
return llvm::createStringError("Type has no child named '%s'",
name.AsCString());
size_t idx = ExtractIndexFromString(name.GetCString());
if (idx == UINT32_MAX)
auto optional_idx = formatters::ExtractIndexFromString(name.GetCString());
if (!optional_idx) {
return llvm::createStringError("Type has no child named '%s'",
name.AsCString());
return idx;
}
return *optional_idx;
}

lldb_private::SyntheticChildrenFrontEnd *
Expand Down
6 changes: 3 additions & 3 deletions lldb/source/Plugins/Language/CPlusPlus/LibCxxSpan.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -133,12 +133,12 @@ llvm::Expected<size_t> lldb_private::formatters::
if (!m_start)
return llvm::createStringError("Type has no child named '%s'",
name.AsCString());
size_t idx = ExtractIndexFromString(name.GetCString());
if (idx == UINT32_MAX) {
auto optional_idx = formatters::ExtractIndexFromString(name.GetCString());
if (!optional_idx) {
return llvm::createStringError("Type has no child named '%s'",
name.AsCString());
}
return idx;
return *optional_idx;
}

lldb_private::SyntheticChildrenFrontEnd *
Expand Down
7 changes: 4 additions & 3 deletions lldb/source/Plugins/Language/CPlusPlus/LibCxxTuple.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,12 @@ class TupleFrontEnd: public SyntheticChildrenFrontEnd {
}

llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override {
size_t idx = formatters::ExtractIndexFromString(name.GetCString());
if (idx == UINT32_MAX)
auto optional_idx = formatters::ExtractIndexFromString(name.GetCString());
if (!optional_idx) {
return llvm::createStringError("Type has no child named '%s'",
name.AsCString());
return idx;
}
return *optional_idx;
}

lldb::ChildCacheState Update() override;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -294,12 +294,12 @@ lldb_private::formatters::LibcxxStdUnorderedMapSyntheticFrontEnd::Update() {
llvm::Expected<size_t>
lldb_private::formatters::LibcxxStdUnorderedMapSyntheticFrontEnd::
GetIndexOfChildWithName(ConstString name) {
size_t idx = ExtractIndexFromString(name.GetCString());
if (idx == UINT32_MAX) {
auto optional_idx = formatters::ExtractIndexFromString(name.GetCString());
if (!optional_idx) {
return llvm::createStringError("Type has no child named '%s'",
name.AsCString());
}
return idx;
return *optional_idx;
}

SyntheticChildrenFrontEnd *
Expand Down
6 changes: 3 additions & 3 deletions lldb/source/Plugins/Language/CPlusPlus/LibCxxValarray.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -129,12 +129,12 @@ lldb_private::formatters::LibcxxStdValarraySyntheticFrontEnd::
if (!m_start || !m_finish)
return llvm::createStringError("Type has no child named '%s'",
name.AsCString());
size_t idx = ExtractIndexFromString(name.GetCString());
if (idx == UINT32_MAX) {
auto optional_idx = formatters::ExtractIndexFromString(name.GetCString());
if (!optional_idx) {
return llvm::createStringError("Type has no child named '%s'",
name.AsCString());
}
return idx;
return *optional_idx;
}

lldb_private::SyntheticChildrenFrontEnd *
Expand Down
7 changes: 4 additions & 3 deletions lldb/source/Plugins/Language/CPlusPlus/LibCxxVariant.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -203,11 +203,12 @@ class VariantFrontEnd : public SyntheticChildrenFrontEnd {
}

llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override {
size_t index = formatters::ExtractIndexFromString(name.GetCString());
if (index == UINT32_MAX)
auto optional_idx = formatters::ExtractIndexFromString(name.GetCString());
if (!optional_idx) {
return llvm::createStringError("Type has no child named '%s'",
name.AsCString());
return index;
}
return *optional_idx;
}

lldb::ChildCacheState Update() override;
Expand Down
17 changes: 10 additions & 7 deletions lldb/source/Plugins/Language/CPlusPlus/LibCxxVector.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -170,12 +170,12 @@ lldb_private::formatters::LibcxxStdVectorSyntheticFrontEnd::
if (!m_start || !m_finish)
return llvm::createStringError("Type has no child named '%s'",
name.AsCString());
size_t index = formatters::ExtractIndexFromString(name.GetCString());
if (index == UINT32_MAX) {
auto optional_idx = formatters::ExtractIndexFromString(name.GetCString());
if (!optional_idx) {
return llvm::createStringError("Type has no child named '%s'",
name.AsCString());
}
return index;
return *optional_idx;
}

lldb_private::formatters::LibcxxVectorBoolSyntheticFrontEnd::
Expand Down Expand Up @@ -273,10 +273,13 @@ lldb_private::formatters::LibcxxVectorBoolSyntheticFrontEnd::
if (!m_count || !m_base_data_address)
return llvm::createStringError("Type has no child named '%s'",
name.AsCString());
const char *item_name = name.GetCString();
uint32_t idx = ExtractIndexFromString(item_name);
if (idx == UINT32_MAX ||
(idx < UINT32_MAX && idx >= CalculateNumChildrenIgnoringErrors()))
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;
Expand Down
6 changes: 3 additions & 3 deletions lldb/source/Plugins/Language/CPlusPlus/LibStdcppTuple.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -98,12 +98,12 @@ LibStdcppTupleSyntheticFrontEnd::CalculateNumChildren() {

llvm::Expected<size_t>
LibStdcppTupleSyntheticFrontEnd::GetIndexOfChildWithName(ConstString name) {
size_t index = formatters::ExtractIndexFromString(name.GetCString());
if (index == UINT32_MAX) {
auto optional_idx = formatters::ExtractIndexFromString(name.GetCString());
if (!optional_idx) {
return llvm::createStringError("Type has no child named '%s'",
name.AsCString());
}
return index;
return *optional_idx;
}

SyntheticChildrenFrontEnd *
Expand Down
22 changes: 14 additions & 8 deletions lldb/source/Plugins/Language/ObjC/NSArray.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -528,10 +528,13 @@ lldb_private::formatters::GenericNSArrayMSyntheticFrontEnd<D32, D64>::Update() {

llvm::Expected<size_t> lldb_private::formatters::NSArrayMSyntheticFrontEndBase::
GetIndexOfChildWithName(ConstString name) {
const char *item_name = name.GetCString();
size_t idx = ExtractIndexFromString(item_name);
if (idx == UINT32_MAX ||
(idx < UINT32_MAX && idx >= CalculateNumChildrenIgnoringErrors()))
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;
Expand Down Expand Up @@ -616,10 +619,13 @@ template <typename D32, typename D64, bool Inline>
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 < UINT32_MAX && idx >= CalculateNumChildrenIgnoringErrors()))
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;
Expand Down
Loading
Loading