Skip to content

Commit 0d47a45

Browse files
[lldb][DataFormatters] Change ExtractIndexFromString to return std::optional (#138297)
This PR is in continuation of #136693.
1 parent 5f1c556 commit 0d47a45

21 files changed

+147
-103
lines changed

lldb/include/lldb/DataFormatters/FormattersHelpers.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ void AddFilter(TypeCategoryImpl::SharedPointer category_sp,
5353
llvm::StringRef type_name,
5454
ScriptedSyntheticChildren::Flags flags, bool regex = false);
5555

56-
size_t ExtractIndexFromString(const char *item_name);
56+
std::optional<size_t> ExtractIndexFromString(const char *item_name);
5757

5858
Address GetArrayAddressOrPointerValue(ValueObject &valobj);
5959

lldb/source/DataFormatters/FormattersHelpers.cpp

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -97,18 +97,17 @@ void lldb_private::formatters::AddFilter(
9797
category_sp->AddTypeFilter(type_name, match_type, filter_sp);
9898
}
9999

100-
size_t lldb_private::formatters::ExtractIndexFromString(const char *item_name) {
100+
std::optional<size_t>
101+
lldb_private::formatters::ExtractIndexFromString(const char *item_name) {
101102
if (!item_name || !*item_name)
102-
return UINT32_MAX;
103+
return std::nullopt;
103104
if (*item_name != '[')
104-
return UINT32_MAX;
105+
return std::nullopt;
105106
item_name++;
106107
char *endptr = nullptr;
107108
unsigned long int idx = ::strtoul(item_name, &endptr, 0);
108-
if (idx == 0 && endptr == item_name)
109-
return UINT32_MAX;
110-
if (idx == ULONG_MAX)
111-
return UINT32_MAX;
109+
if ((idx == 0 && endptr == item_name) || idx == ULONG_MAX)
110+
return std::nullopt;
112111
return idx;
113112
}
114113

lldb/source/DataFormatters/VectorType.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -270,10 +270,13 @@ class VectorTypeSyntheticFrontEnd : public SyntheticChildrenFrontEnd {
270270
}
271271

272272
llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override {
273-
const char *item_name = name.GetCString();
274-
uint32_t idx = ExtractIndexFromString(item_name);
275-
if (idx == UINT32_MAX ||
276-
(idx < UINT32_MAX && idx >= CalculateNumChildrenIgnoringErrors()))
273+
auto optional_idx = ExtractIndexFromString(name.AsCString());
274+
if (!optional_idx) {
275+
return llvm::createStringError("Type has no child named '%s'",
276+
name.AsCString());
277+
}
278+
uint32_t idx = *optional_idx;
279+
if (idx >= CalculateNumChildrenIgnoringErrors())
277280
return llvm::createStringError("Type has no child named '%s'",
278281
name.AsCString());
279282
return idx;

lldb/source/Plugins/Language/CPlusPlus/GenericBitset.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,12 @@ class GenericBitsetFrontEnd : public SyntheticChildrenFrontEnd {
2929
GenericBitsetFrontEnd(ValueObject &valobj, StdLib stdlib);
3030

3131
llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override {
32-
size_t idx = formatters::ExtractIndexFromString(name.GetCString());
33-
if (idx == UINT32_MAX)
32+
auto optional_idx = formatters::ExtractIndexFromString(name.GetCString());
33+
if (!optional_idx) {
3434
return llvm::createStringError("Type has no child named '%s'",
3535
name.AsCString());
36-
return idx;
36+
}
37+
return *optional_idx;
3738
}
3839

3940
lldb::ChildCacheState Update() override;

lldb/source/Plugins/Language/CPlusPlus/GenericOptional.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,12 @@ class GenericOptionalFrontend : public SyntheticChildrenFrontEnd {
3939
llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override {
4040
if (name == "$$dereference$$")
4141
return 0;
42-
size_t idx = formatters::ExtractIndexFromString(name.GetCString());
43-
if (idx == UINT32_MAX)
42+
auto optional_idx = formatters::ExtractIndexFromString(name.GetCString());
43+
if (!optional_idx) {
4444
return llvm::createStringError("Type has no child named '%s'",
4545
name.AsCString());
46-
return idx;
46+
}
47+
return *optional_idx;
4748
}
4849

4950
llvm::Expected<uint32_t> CalculateNumChildren() override {

lldb/source/Plugins/Language/CPlusPlus/LibCxxInitializerList.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -108,12 +108,12 @@ lldb_private::formatters::LibcxxInitializerListSyntheticFrontEnd::
108108
return llvm::createStringError("Type has no child named '%s'",
109109
name.AsCString());
110110
}
111-
size_t idx = ExtractIndexFromString(name.GetCString());
112-
if (idx == UINT32_MAX) {
111+
auto optional_idx = formatters::ExtractIndexFromString(name.GetCString());
112+
if (!optional_idx) {
113113
return llvm::createStringError("Type has no child named '%s'",
114114
name.AsCString());
115115
}
116-
return idx;
116+
return *optional_idx;
117117
}
118118

119119
lldb_private::SyntheticChildrenFrontEnd *

lldb/source/Plugins/Language/CPlusPlus/LibCxxList.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -107,11 +107,12 @@ class ListIterator {
107107
class AbstractListFrontEnd : public SyntheticChildrenFrontEnd {
108108
public:
109109
llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override {
110-
size_t idx = ExtractIndexFromString(name.GetCString());
111-
if (idx == UINT32_MAX)
110+
auto optional_idx = formatters::ExtractIndexFromString(name.GetCString());
111+
if (!optional_idx) {
112112
return llvm::createStringError("Type has no child named '%s'",
113113
name.AsCString());
114-
return idx;
114+
}
115+
return *optional_idx;
115116
}
116117
lldb::ChildCacheState Update() override;
117118

lldb/source/Plugins/Language/CPlusPlus/LibCxxMap.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -395,12 +395,12 @@ lldb_private::formatters::LibcxxStdMapSyntheticFrontEnd::Update() {
395395

396396
llvm::Expected<size_t> lldb_private::formatters::LibcxxStdMapSyntheticFrontEnd::
397397
GetIndexOfChildWithName(ConstString name) {
398-
size_t idx = ExtractIndexFromString(name.GetCString());
399-
if (idx == UINT32_MAX) {
398+
auto optional_idx = formatters::ExtractIndexFromString(name.GetCString());
399+
if (!optional_idx) {
400400
return llvm::createStringError("Type has no child named '%s'",
401401
name.AsCString());
402402
}
403-
return idx;
403+
return *optional_idx;
404404
}
405405

406406
SyntheticChildrenFrontEnd *

lldb/source/Plugins/Language/CPlusPlus/LibCxxProxyArray.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -179,12 +179,12 @@ lldb_private::formatters::LibcxxStdProxyArraySyntheticFrontEnd::
179179
if (!m_base)
180180
return llvm::createStringError("Type has no child named '%s'",
181181
name.AsCString());
182-
size_t idx = ExtractIndexFromString(name.GetCString());
183-
if (idx == UINT32_MAX) {
182+
auto optional_idx = formatters::ExtractIndexFromString(name.GetCString());
183+
if (!optional_idx) {
184184
return llvm::createStringError("Type has no child named '%s'",
185185
name.AsCString());
186186
}
187-
return idx;
187+
return *optional_idx;
188188
}
189189

190190
lldb_private::SyntheticChildrenFrontEnd *

lldb/source/Plugins/Language/CPlusPlus/LibCxxSliceArray.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -150,11 +150,12 @@ lldb_private::formatters::LibcxxStdSliceArraySyntheticFrontEnd::
150150
if (!m_start)
151151
return llvm::createStringError("Type has no child named '%s'",
152152
name.AsCString());
153-
size_t idx = ExtractIndexFromString(name.GetCString());
154-
if (idx == UINT32_MAX)
153+
auto optional_idx = formatters::ExtractIndexFromString(name.GetCString());
154+
if (!optional_idx) {
155155
return llvm::createStringError("Type has no child named '%s'",
156156
name.AsCString());
157-
return idx;
157+
}
158+
return *optional_idx;
158159
}
159160

160161
lldb_private::SyntheticChildrenFrontEnd *

0 commit comments

Comments
 (0)