Skip to content

Commit 88afd1e

Browse files
[lldb][DataFormatters] Change ExtractIndexFromString to return std::optional (llvm#138297)
This PR is in continuation of llvm#136693.
1 parent 24ef40f commit 88afd1e

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
@@ -62,7 +62,7 @@ void AddFilter(TypeCategoryImpl::SharedPointer category_sp,
6262
llvm::StringRef type_name,
6363
ScriptedSyntheticChildren::Flags flags, bool regex = false);
6464

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

6767
Address GetArrayAddressOrPointerValue(ValueObject &valobj);
6868

lldb/source/DataFormatters/FormattersHelpers.cpp

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

404-
size_t lldb_private::formatters::ExtractIndexFromString(const char *item_name) {
404+
std::optional<size_t>
405+
lldb_private::formatters::ExtractIndexFromString(const char *item_name) {
405406
if (!item_name || !*item_name)
406-
return UINT32_MAX;
407+
return std::nullopt;
407408
if (*item_name != '[')
408-
return UINT32_MAX;
409+
return std::nullopt;
409410
item_name++;
410411
char *endptr = nullptr;
411412
unsigned long int idx = ::strtoul(item_name, &endptr, 0);
412-
if (idx == 0 && endptr == item_name)
413-
return UINT32_MAX;
414-
if (idx == ULONG_MAX)
415-
return UINT32_MAX;
413+
if ((idx == 0 && endptr == item_name) || idx == ULONG_MAX)
414+
return std::nullopt;
416415
return idx;
417416
}
418417

lldb/source/DataFormatters/VectorType.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -272,10 +272,13 @@ class VectorTypeSyntheticFrontEnd : public SyntheticChildrenFrontEnd {
272272
bool MightHaveChildren() override { return true; }
273273

274274
llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override {
275-
const char *item_name = name.GetCString();
276-
uint32_t idx = ExtractIndexFromString(item_name);
277-
if (idx == UINT32_MAX ||
278-
(idx < UINT32_MAX && idx >= CalculateNumChildrenIgnoringErrors()))
275+
auto optional_idx = ExtractIndexFromString(name.AsCString());
276+
if (!optional_idx) {
277+
return llvm::createStringError("Type has no child named '%s'",
278+
name.AsCString());
279+
}
280+
uint32_t idx = *optional_idx;
281+
if (idx >= CalculateNumChildrenIgnoringErrors())
279282
return llvm::createStringError("Type has no child named '%s'",
280283
name.AsCString());
281284
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
bool MightHaveChildren() override { return true; }

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,12 @@ class GenericOptionalFrontend : public SyntheticChildrenFrontEnd {
3737
GenericOptionalFrontend(ValueObject &valobj, StdLib stdlib);
3838

3939
llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override {
40-
size_t idx = formatters::ExtractIndexFromString(name.GetCString());
41-
if (idx == UINT32_MAX)
40+
auto optional_idx = formatters::ExtractIndexFromString(name.GetCString());
41+
if (!optional_idx) {
4242
return llvm::createStringError("Type has no child named '%s'",
4343
name.AsCString());
44-
return idx;
44+
}
45+
return *optional_idx;
4546
}
4647

4748
bool MightHaveChildren() override { return true; }

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -114,12 +114,12 @@ lldb_private::formatters::LibcxxInitializerListSyntheticFrontEnd::
114114
return llvm::createStringError("Type has no child named '%s'",
115115
name.AsCString());
116116
}
117-
size_t idx = ExtractIndexFromString(name.GetCString());
118-
if (idx == UINT32_MAX) {
117+
auto optional_idx = formatters::ExtractIndexFromString(name.GetCString());
118+
if (!optional_idx) {
119119
return llvm::createStringError("Type has no child named '%s'",
120120
name.AsCString());
121121
}
122-
return idx;
122+
return *optional_idx;
123123
}
124124

125125
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
bool MightHaveChildren() override { return true; }
117118
lldb::ChildCacheState Update() override;

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -404,12 +404,12 @@ bool lldb_private::formatters::LibcxxStdMapSyntheticFrontEnd::
404404

405405
llvm::Expected<size_t> lldb_private::formatters::LibcxxStdMapSyntheticFrontEnd::
406406
GetIndexOfChildWithName(ConstString name) {
407-
size_t idx = ExtractIndexFromString(name.GetCString());
408-
if (idx == UINT32_MAX) {
407+
auto optional_idx = formatters::ExtractIndexFromString(name.GetCString());
408+
if (!optional_idx) {
409409
return llvm::createStringError("Type has no child named '%s'",
410410
name.AsCString());
411411
}
412-
return idx;
412+
return *optional_idx;
413413
}
414414

415415
SyntheticChildrenFrontEnd *

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -186,12 +186,12 @@ lldb_private::formatters::LibcxxStdProxyArraySyntheticFrontEnd::
186186
if (!m_base)
187187
return llvm::createStringError("Type has no child named '%s'",
188188
name.AsCString());
189-
size_t idx = ExtractIndexFromString(name.GetCString());
190-
if (idx == UINT32_MAX) {
189+
auto optional_idx = formatters::ExtractIndexFromString(name.GetCString());
190+
if (!optional_idx) {
191191
return llvm::createStringError("Type has no child named '%s'",
192192
name.AsCString());
193193
}
194-
return idx;
194+
return *optional_idx;
195195
}
196196

197197
lldb_private::SyntheticChildrenFrontEnd *

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -157,11 +157,12 @@ lldb_private::formatters::LibcxxStdSliceArraySyntheticFrontEnd::
157157
if (!m_start)
158158
return llvm::createStringError("Type has no child named '%s'",
159159
name.AsCString());
160-
size_t idx = ExtractIndexFromString(name.GetCString());
161-
if (idx == UINT32_MAX)
160+
auto optional_idx = formatters::ExtractIndexFromString(name.GetCString());
161+
if (!optional_idx) {
162162
return llvm::createStringError("Type has no child named '%s'",
163163
name.AsCString());
164-
return idx;
164+
}
165+
return *optional_idx;
165166
}
166167

167168
lldb_private::SyntheticChildrenFrontEnd *

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -139,12 +139,12 @@ llvm::Expected<size_t> lldb_private::formatters::
139139
if (!m_start)
140140
return llvm::createStringError("Type has no child named '%s'",
141141
name.AsCString());
142-
size_t idx = ExtractIndexFromString(name.GetCString());
143-
if (idx == UINT32_MAX) {
142+
auto optional_idx = formatters::ExtractIndexFromString(name.GetCString());
143+
if (!optional_idx) {
144144
return llvm::createStringError("Type has no child named '%s'",
145145
name.AsCString());
146146
}
147-
return idx;
147+
return *optional_idx;
148148
}
149149

150150
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
bool MightHaveChildren() override { return true; }

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -302,12 +302,12 @@ bool lldb_private::formatters::LibcxxStdUnorderedMapSyntheticFrontEnd::
302302
llvm::Expected<size_t>
303303
lldb_private::formatters::LibcxxStdUnorderedMapSyntheticFrontEnd::
304304
GetIndexOfChildWithName(ConstString name) {
305-
size_t idx = ExtractIndexFromString(name.GetCString());
306-
if (idx == UINT32_MAX) {
305+
auto optional_idx = formatters::ExtractIndexFromString(name.GetCString());
306+
if (!optional_idx) {
307307
return llvm::createStringError("Type has no child named '%s'",
308308
name.AsCString());
309309
}
310-
return idx;
310+
return *optional_idx;
311311
}
312312

313313
SyntheticChildrenFrontEnd *

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -136,12 +136,12 @@ lldb_private::formatters::LibcxxStdValarraySyntheticFrontEnd::
136136
if (!m_start || !m_finish)
137137
return llvm::createStringError("Type has no child named '%s'",
138138
name.AsCString());
139-
size_t idx = ExtractIndexFromString(name.GetCString());
140-
if (idx == UINT32_MAX) {
139+
auto optional_idx = formatters::ExtractIndexFromString(name.GetCString());
140+
if (!optional_idx) {
141141
return llvm::createStringError("Type has no child named '%s'",
142142
name.AsCString());
143143
}
144-
return idx;
144+
return *optional_idx;
145145
}
146146

147147
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
bool MightHaveChildren() override { return true; }

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

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -179,12 +179,12 @@ lldb_private::formatters::LibcxxStdVectorSyntheticFrontEnd::
179179
if (!m_start || !m_finish)
180180
return llvm::createStringError("Type has no child named '%s'",
181181
name.AsCString());
182-
size_t index = formatters::ExtractIndexFromString(name.GetCString());
183-
if (index == 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 index;
187+
return *optional_idx;
188188
}
189189

190190
lldb_private::formatters::LibcxxVectorBoolSyntheticFrontEnd::
@@ -282,10 +282,13 @@ lldb_private::formatters::LibcxxVectorBoolSyntheticFrontEnd::
282282
if (!m_count || !m_base_data_address)
283283
return llvm::createStringError("Type has no child named '%s'",
284284
name.AsCString());
285-
const char *item_name = name.GetCString();
286-
uint32_t idx = ExtractIndexFromString(item_name);
287-
if (idx == UINT32_MAX ||
288-
(idx < UINT32_MAX && idx >= CalculateNumChildrenIgnoringErrors()))
285+
auto optional_idx = ExtractIndexFromString(name.AsCString());
286+
if (!optional_idx) {
287+
return llvm::createStringError("Type has no child named '%s'",
288+
name.AsCString());
289+
}
290+
uint32_t idx = *optional_idx;
291+
if (idx >= CalculateNumChildrenIgnoringErrors())
289292
return llvm::createStringError("Type has no child named '%s'",
290293
name.AsCString());
291294
return idx;

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

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

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

113113
SyntheticChildrenFrontEnd *

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

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -539,10 +539,13 @@ lldb_private::formatters::NSArrayMSyntheticFrontEndBase::MightHaveChildren() {
539539

540540
llvm::Expected<size_t> lldb_private::formatters::NSArrayMSyntheticFrontEndBase::
541541
GetIndexOfChildWithName(ConstString name) {
542-
const char *item_name = name.GetCString();
543-
size_t idx = ExtractIndexFromString(item_name);
544-
if (idx == UINT32_MAX ||
545-
(idx < UINT32_MAX && idx >= CalculateNumChildrenIgnoringErrors()))
542+
auto optional_idx = ExtractIndexFromString(name.AsCString());
543+
if (!optional_idx) {
544+
return llvm::createStringError("Type has no child named '%s'",
545+
name.AsCString());
546+
}
547+
uint32_t idx = *optional_idx;
548+
if (idx >= CalculateNumChildrenIgnoringErrors())
546549
return llvm::createStringError("Type has no child named '%s'",
547550
name.AsCString());
548551
return idx;
@@ -627,10 +630,13 @@ template <typename D32, typename D64, bool Inline>
627630
llvm::Expected<size_t>
628631
lldb_private::formatters::GenericNSArrayISyntheticFrontEnd<
629632
D32, D64, Inline>::GetIndexOfChildWithName(ConstString name) {
630-
const char *item_name = name.GetCString();
631-
uint32_t idx = ExtractIndexFromString(item_name);
632-
if (idx == UINT32_MAX ||
633-
(idx < UINT32_MAX && idx >= CalculateNumChildrenIgnoringErrors()))
633+
auto optional_idx = ExtractIndexFromString(name.AsCString());
634+
if (!optional_idx) {
635+
return llvm::createStringError("Type has no child named '%s'",
636+
name.AsCString());
637+
}
638+
uint32_t idx = *optional_idx;
639+
if (idx >= CalculateNumChildrenIgnoringErrors())
634640
return llvm::createStringError("Type has no child named '%s'",
635641
name.AsCString());
636642
return idx;

0 commit comments

Comments
 (0)