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 *

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -133,12 +133,12 @@ llvm::Expected<size_t> lldb_private::formatters::
133133
if (!m_start)
134134
return llvm::createStringError("Type has no child named '%s'",
135135
name.AsCString());
136-
size_t idx = ExtractIndexFromString(name.GetCString());
137-
if (idx == UINT32_MAX) {
136+
auto optional_idx = formatters::ExtractIndexFromString(name.GetCString());
137+
if (!optional_idx) {
138138
return llvm::createStringError("Type has no child named '%s'",
139139
name.AsCString());
140140
}
141-
return idx;
141+
return *optional_idx;
142142
}
143143

144144
lldb_private::SyntheticChildrenFrontEnd *

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,12 @@ class TupleFrontEnd: public SyntheticChildrenFrontEnd {
2121
}
2222

2323
llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override {
24-
size_t idx = formatters::ExtractIndexFromString(name.GetCString());
25-
if (idx == UINT32_MAX)
24+
auto optional_idx = formatters::ExtractIndexFromString(name.GetCString());
25+
if (!optional_idx) {
2626
return llvm::createStringError("Type has no child named '%s'",
2727
name.AsCString());
28-
return idx;
28+
}
29+
return *optional_idx;
2930
}
3031

3132
lldb::ChildCacheState Update() override;

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -294,12 +294,12 @@ lldb_private::formatters::LibcxxStdUnorderedMapSyntheticFrontEnd::Update() {
294294
llvm::Expected<size_t>
295295
lldb_private::formatters::LibcxxStdUnorderedMapSyntheticFrontEnd::
296296
GetIndexOfChildWithName(ConstString name) {
297-
size_t idx = ExtractIndexFromString(name.GetCString());
298-
if (idx == UINT32_MAX) {
297+
auto optional_idx = formatters::ExtractIndexFromString(name.GetCString());
298+
if (!optional_idx) {
299299
return llvm::createStringError("Type has no child named '%s'",
300300
name.AsCString());
301301
}
302-
return idx;
302+
return *optional_idx;
303303
}
304304

305305
SyntheticChildrenFrontEnd *

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -129,12 +129,12 @@ lldb_private::formatters::LibcxxStdValarraySyntheticFrontEnd::
129129
if (!m_start || !m_finish)
130130
return llvm::createStringError("Type has no child named '%s'",
131131
name.AsCString());
132-
size_t idx = ExtractIndexFromString(name.GetCString());
133-
if (idx == UINT32_MAX) {
132+
auto optional_idx = formatters::ExtractIndexFromString(name.GetCString());
133+
if (!optional_idx) {
134134
return llvm::createStringError("Type has no child named '%s'",
135135
name.AsCString());
136136
}
137-
return idx;
137+
return *optional_idx;
138138
}
139139

140140
lldb_private::SyntheticChildrenFrontEnd *

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -203,11 +203,12 @@ class VariantFrontEnd : public SyntheticChildrenFrontEnd {
203203
}
204204

205205
llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override {
206-
size_t index = formatters::ExtractIndexFromString(name.GetCString());
207-
if (index == UINT32_MAX)
206+
auto optional_idx = formatters::ExtractIndexFromString(name.GetCString());
207+
if (!optional_idx) {
208208
return llvm::createStringError("Type has no child named '%s'",
209209
name.AsCString());
210-
return index;
210+
}
211+
return *optional_idx;
211212
}
212213

213214
lldb::ChildCacheState Update() override;

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

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -170,12 +170,12 @@ lldb_private::formatters::LibcxxStdVectorSyntheticFrontEnd::
170170
if (!m_start || !m_finish)
171171
return llvm::createStringError("Type has no child named '%s'",
172172
name.AsCString());
173-
size_t index = formatters::ExtractIndexFromString(name.GetCString());
174-
if (index == UINT32_MAX) {
173+
auto optional_idx = formatters::ExtractIndexFromString(name.GetCString());
174+
if (!optional_idx) {
175175
return llvm::createStringError("Type has no child named '%s'",
176176
name.AsCString());
177177
}
178-
return index;
178+
return *optional_idx;
179179
}
180180

181181
lldb_private::formatters::LibcxxVectorBoolSyntheticFrontEnd::
@@ -273,10 +273,13 @@ lldb_private::formatters::LibcxxVectorBoolSyntheticFrontEnd::
273273
if (!m_count || !m_base_data_address)
274274
return llvm::createStringError("Type has no child named '%s'",
275275
name.AsCString());
276-
const char *item_name = name.GetCString();
277-
uint32_t idx = ExtractIndexFromString(item_name);
278-
if (idx == UINT32_MAX ||
279-
(idx < UINT32_MAX && idx >= CalculateNumChildrenIgnoringErrors()))
276+
auto optional_idx = ExtractIndexFromString(name.AsCString());
277+
if (!optional_idx) {
278+
return llvm::createStringError("Type has no child named '%s'",
279+
name.AsCString());
280+
}
281+
uint32_t idx = *optional_idx;
282+
if (idx >= CalculateNumChildrenIgnoringErrors())
280283
return llvm::createStringError("Type has no child named '%s'",
281284
name.AsCString());
282285
return idx;

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -98,12 +98,12 @@ LibStdcppTupleSyntheticFrontEnd::CalculateNumChildren() {
9898

9999
llvm::Expected<size_t>
100100
LibStdcppTupleSyntheticFrontEnd::GetIndexOfChildWithName(ConstString name) {
101-
size_t index = formatters::ExtractIndexFromString(name.GetCString());
102-
if (index == UINT32_MAX) {
101+
auto optional_idx = formatters::ExtractIndexFromString(name.GetCString());
102+
if (!optional_idx) {
103103
return llvm::createStringError("Type has no child named '%s'",
104104
name.AsCString());
105105
}
106-
return index;
106+
return *optional_idx;
107107
}
108108

109109
SyntheticChildrenFrontEnd *

lldb/source/Plugins/Language/ObjC/NSArray.cpp

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -528,10 +528,13 @@ lldb_private::formatters::GenericNSArrayMSyntheticFrontEnd<D32, D64>::Update() {
528528

529529
llvm::Expected<size_t> lldb_private::formatters::NSArrayMSyntheticFrontEndBase::
530530
GetIndexOfChildWithName(ConstString name) {
531-
const char *item_name = name.GetCString();
532-
size_t idx = ExtractIndexFromString(item_name);
533-
if (idx == UINT32_MAX ||
534-
(idx < UINT32_MAX && idx >= CalculateNumChildrenIgnoringErrors()))
531+
auto optional_idx = ExtractIndexFromString(name.AsCString());
532+
if (!optional_idx) {
533+
return llvm::createStringError("Type has no child named '%s'",
534+
name.AsCString());
535+
}
536+
uint32_t idx = *optional_idx;
537+
if (idx >= CalculateNumChildrenIgnoringErrors())
535538
return llvm::createStringError("Type has no child named '%s'",
536539
name.AsCString());
537540
return idx;
@@ -616,10 +619,13 @@ template <typename D32, typename D64, bool Inline>
616619
llvm::Expected<size_t>
617620
lldb_private::formatters::GenericNSArrayISyntheticFrontEnd<
618621
D32, D64, Inline>::GetIndexOfChildWithName(ConstString name) {
619-
const char *item_name = name.GetCString();
620-
uint32_t idx = ExtractIndexFromString(item_name);
621-
if (idx == UINT32_MAX ||
622-
(idx < UINT32_MAX && idx >= CalculateNumChildrenIgnoringErrors()))
622+
auto optional_idx = ExtractIndexFromString(name.AsCString());
623+
if (!optional_idx) {
624+
return llvm::createStringError("Type has no child named '%s'",
625+
name.AsCString());
626+
}
627+
uint32_t idx = *optional_idx;
628+
if (idx >= CalculateNumChildrenIgnoringErrors())
623629
return llvm::createStringError("Type has no child named '%s'",
624630
name.AsCString());
625631
return idx;

0 commit comments

Comments
 (0)