Skip to content

Commit fc2650a

Browse files
kastiglionegithub-actions[bot]
authored andcommitted
Automerge: Revert "[lldb] Add Pythonic API to SBStructuredData extension (#155061)" (#156728)
Reverts #155061 (and #156721) which caused Crashlog shell tests to break.
2 parents d2d3f09 + 9d9a714 commit fc2650a

File tree

2 files changed

+30
-207
lines changed

2 files changed

+30
-207
lines changed

lldb/bindings/interface/SBStructuredDataExtensions.i

Lines changed: 4 additions & 109 deletions
Original file line numberDiff line numberDiff line change
@@ -3,121 +3,16 @@ STRING_EXTENSION_OUTSIDE(SBStructuredData)
33
%extend lldb::SBStructuredData {
44
#ifdef SWIGPYTHON
55
%pythoncode%{
6+
def __int__(self):
7+
return self.GetSignedInteger()
8+
69
def __len__(self):
710
'''Return the number of element in a lldb.SBStructuredData object.'''
811
return self.GetSize()
912

1013
def __iter__(self):
1114
'''Iterate over all the elements in a lldb.SBStructuredData object.'''
12-
data_type = self.GetType()
13-
if data_type == eStructuredDataTypeArray:
14-
for i in range(self.GetSize()):
15-
yield self.GetItemAtIndex(i).dynamic
16-
return
17-
elif data_type == eStructuredDataTypeDictionary:
18-
keys = SBStringList()
19-
self.GetKeys(keys)
20-
return iter(keys)
21-
else:
22-
raise TypeError(f"cannot iterate {self.type_name(data_type)} type")
23-
24-
def __getitem__(self, key):
25-
data_type = self.GetType()
26-
if data_type == eStructuredDataTypeArray:
27-
if not isinstance(key, int):
28-
raise TypeError("subscript index must be an integer")
29-
count = len(self)
30-
if -count <= key < count:
31-
key %= count
32-
return self.GetItemAtIndex(key).dynamic
33-
raise IndexError("index out of range")
34-
elif data_type == eStructuredDataTypeDictionary:
35-
if not isinstance(key, str):
36-
raise TypeError("subscript key must be a string")
37-
return self.GetValueForKey(key).dynamic
38-
else:
39-
raise TypeError(f"cannot subscript {self.type_name(data_type)} type")
40-
41-
def __bool__(self):
42-
data_type = self.GetType()
43-
if data_type == eStructuredDataTypeInvalid:
44-
return False
45-
elif data_type in (
46-
eStructuredDataTypeArray,
47-
eStructuredDataTypeDictionary,
48-
):
49-
return self.GetSize() != 0
50-
elif data_type != eStructuredDataTypeGeneric:
51-
return bool(self.dynamic)
52-
else:
53-
raise TypeError("cannot convert generic to bool")
54-
55-
def __int__(self):
56-
data_type = self.GetType()
57-
if data_type in (
58-
eStructuredDataTypeInteger,
59-
eStructuredDataTypeSignedInteger,
60-
):
61-
return int(self.dynamic)
62-
else:
63-
raise TypeError(f"cannot convert {self.type_name(data_type)} to int")
64-
65-
def __float__(self):
66-
data_type = self.GetType()
67-
if data_type in (
68-
eStructuredDataTypeFloat,
69-
eStructuredDataTypeInteger,
70-
eStructuredDataTypeSignedInteger,
71-
):
72-
return float(self.dynamic)
73-
else:
74-
raise TypeError(f"cannot convert {self.type_name(data_type)} to float")
75-
76-
@property
77-
def dynamic(self):
78-
data_type = self.GetType()
79-
if data_type == eStructuredDataTypeNull:
80-
return None
81-
elif data_type == eStructuredDataTypeBoolean:
82-
return self.GetBooleanValue()
83-
elif data_type == eStructuredDataTypeInteger:
84-
return self.GetUnsignedIntegerValue()
85-
elif data_type == eStructuredDataTypeSignedInteger:
86-
return self.GetSignedIntegerValue()
87-
elif data_type == eStructuredDataTypeFloat:
88-
return self.GetFloatValue()
89-
elif data_type == eStructuredDataTypeString:
90-
size = len(self) or 1023
91-
return self.GetStringValue(size + 1)
92-
elif data_type == eStructuredDataTypeGeneric:
93-
return self.GetGenericValue()
94-
else:
95-
return self
96-
97-
@staticmethod
98-
def type_name(t):
99-
if t == eStructuredDataTypeNull:
100-
return "null"
101-
elif t == eStructuredDataTypeBoolean:
102-
return "boolean"
103-
elif t == eStructuredDataTypeInteger:
104-
return "integer"
105-
elif t == eStructuredDataTypeSignedInteger:
106-
return "integer"
107-
elif t == eStructuredDataTypeFloat:
108-
return "float"
109-
elif t == eStructuredDataTypeString:
110-
return "string"
111-
elif t == eStructuredDataTypeArray:
112-
return "array"
113-
elif t == eStructuredDataTypeDictionary:
114-
return "dictionary"
115-
elif t == eStructuredDataTypeGeneric:
116-
return "generic"
117-
elif t == eStructuredDataTypeInvalid:
118-
return "invalid"
119-
else:
120-
raise TypeError(f"unknown structured data type: {t}")
15+
return lldb_iter(self, 'GetSize', 'GetItemAtIndex')
12116
%}
12217
#endif
12318
}

lldb/test/API/python_api/sbstructureddata/TestStructuredDataAPI.py

Lines changed: 26 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,10 @@ def structured_data_api_test(self):
4848
s.Clear()
4949
error = example.GetDescription(s)
5050
self.assertSuccess(error, "GetDescription works")
51-
# Ensure str() doesn't raise an exception.
52-
self.assertTrue(str(example))
5351
if not "key_float" in s.GetData():
5452
self.fail("FAILED: could not find key_float in description output")
5553

54+
dict_struct = lldb.SBStructuredData()
5655
dict_struct = example.GetValueForKey("key_dict")
5756

5857
# Tests for dictionary data type
@@ -114,26 +113,21 @@ class MyRandomClass:
114113
self.assertSuccess(example.SetFromJSON("1"))
115114
self.assertEqual(example.GetType(), lldb.eStructuredDataTypeInteger)
116115
self.assertEqual(example.GetIntegerValue(), 1)
117-
self.assertEqual(int(example), 1)
118116

119117
self.assertSuccess(example.SetFromJSON("4.19"))
120118
self.assertEqual(example.GetType(), lldb.eStructuredDataTypeFloat)
121119
self.assertEqual(example.GetFloatValue(), 4.19)
122-
self.assertEqual(float(example), 4.19)
123120

124121
self.assertSuccess(example.SetFromJSON('"Bonjour, 123!"'))
125122
self.assertEqual(example.GetType(), lldb.eStructuredDataTypeString)
126123
self.assertEqual(example.GetStringValue(42), "Bonjour, 123!")
127-
self.assertEqual(str(example), "Bonjour, 123!")
128124

129125
self.assertSuccess(example.SetFromJSON("true"))
130126
self.assertEqual(example.GetType(), lldb.eStructuredDataTypeBoolean)
131127
self.assertTrue(example.GetBooleanValue())
132-
self.assertTrue(example)
133128

134129
self.assertSuccess(example.SetFromJSON("null"))
135130
self.assertEqual(example.GetType(), lldb.eStructuredDataTypeNull)
136-
self.assertFalse(example)
137131

138132
example = lldb.SBStructuredData()
139133
example.SetUnsignedIntegerValue(1)
@@ -193,35 +187,38 @@ class MyRandomClass:
193187
self.assertEqual(sb_data, example_arr)
194188

195189
def invalid_struct_test(self, example):
190+
invalid_struct = lldb.SBStructuredData()
196191
invalid_struct = example.GetValueForKey("invalid_key")
197192
if invalid_struct.IsValid():
198193
self.fail("An invalid object should have been returned")
199194

200195
# Check Type API
201-
if invalid_struct.GetType() != lldb.eStructuredDataTypeInvalid:
196+
if not invalid_struct.GetType() == lldb.eStructuredDataTypeInvalid:
202197
self.fail("Wrong type returned: " + str(invalid_struct.GetType()))
203198

204199
def dictionary_struct_test(self, example):
205200
# Check API returning a valid SBStructuredData of 'dictionary' type
201+
dict_struct = lldb.SBStructuredData()
206202
dict_struct = example.GetValueForKey("key_dict")
207203
if not dict_struct.IsValid():
208204
self.fail("A valid object should have been returned")
209205

210206
# Check Type API
211-
if dict_struct.GetType() != lldb.eStructuredDataTypeDictionary:
207+
if not dict_struct.GetType() == lldb.eStructuredDataTypeDictionary:
212208
self.fail("Wrong type returned: " + str(dict_struct.GetType()))
213209

214210
# Check Size API for 'dictionary' type
215-
if dict_struct.GetSize() != 6:
211+
if not dict_struct.GetSize() == 6:
216212
self.fail("Wrong no of elements returned: " + str(dict_struct.GetSize()))
217213

218214
def string_struct_test(self, dict_struct):
215+
string_struct = lldb.SBStructuredData()
219216
string_struct = dict_struct.GetValueForKey("key_string")
220217
if not string_struct.IsValid():
221218
self.fail("A valid object should have been returned")
222219

223220
# Check Type API
224-
if string_struct.GetType() != lldb.eStructuredDataTypeString:
221+
if not string_struct.GetType() == lldb.eStructuredDataTypeString:
225222
self.fail("Wrong type returned: " + str(string_struct.GetType()))
226223

227224
# Check API returning 'string' value
@@ -241,17 +238,18 @@ def uint_struct_test(self, dict_struct):
241238
# Check a valid SBStructuredData containing an unsigned integer.
242239
# We intentionally make this larger than what an int64_t can hold but
243240
# still small enough to fit a uint64_t
241+
uint_struct = lldb.SBStructuredData()
244242
uint_struct = dict_struct.GetValueForKey("key_uint")
245243
if not uint_struct.IsValid():
246244
self.fail("A valid object should have been returned")
247245

248246
# Check Type API
249-
if uint_struct.GetType() != lldb.eStructuredDataTypeInteger:
247+
if not uint_struct.GetType() == lldb.eStructuredDataTypeInteger:
250248
self.fail("Wrong type returned: " + str(uint_struct.GetType()))
251249

252250
# Check API returning unsigned integer value
253251
output = uint_struct.GetUnsignedIntegerValue()
254-
if output != 0xFFFFFFFF00000000:
252+
if not output == 0xFFFFFFFF00000000:
255253
self.fail("wrong output: " + str(output))
256254

257255
# Calling wrong API on a SBStructuredData
@@ -264,17 +262,18 @@ def sint_struct_test(self, dict_struct):
264262
# Check a valid SBStructuredData containing an signed integer.
265263
# We intentionally make this smaller than what an uint64_t can hold but
266264
# still small enough to fit a int64_t
265+
sint_struct = lldb.SBStructuredData()
267266
sint_struct = dict_struct.GetValueForKey("key_sint")
268267
if not sint_struct.IsValid():
269268
self.fail("A valid object should have been returned")
270269

271270
# Check Type API
272-
if sint_struct.GetType() != lldb.eStructuredDataTypeSignedInteger:
271+
if not sint_struct.GetType() == lldb.eStructuredDataTypeSignedInteger:
273272
self.fail("Wrong type returned: " + str(sint_struct.GetType()))
274273

275274
# Check API returning signed integer value
276275
output = sint_struct.GetSignedIntegerValue()
277-
if output != -42:
276+
if not output == -42:
278277
self.fail("wrong output: " + str(output))
279278

280279
# Calling wrong API on a SBStructuredData
@@ -284,26 +283,28 @@ def sint_struct_test(self, dict_struct):
284283
self.fail("Valid string " + output + " returned for an integer object")
285284

286285
def double_struct_test(self, dict_struct):
286+
floating_point_struct = lldb.SBStructuredData()
287287
floating_point_struct = dict_struct.GetValueForKey("key_float")
288288
if not floating_point_struct.IsValid():
289289
self.fail("A valid object should have been returned")
290290

291291
# Check Type API
292-
if floating_point_struct.GetType() != lldb.eStructuredDataTypeFloat:
292+
if not floating_point_struct.GetType() == lldb.eStructuredDataTypeFloat:
293293
self.fail("Wrong type returned: " + str(floating_point_struct.GetType()))
294294

295295
# Check API returning 'double' value
296296
output = floating_point_struct.GetFloatValue()
297-
if output != 2.99:
297+
if not output == 2.99:
298298
self.fail("wrong output: " + str(output))
299299

300300
def bool_struct_test(self, dict_struct):
301+
bool_struct = lldb.SBStructuredData()
301302
bool_struct = dict_struct.GetValueForKey("key_bool")
302303
if not bool_struct.IsValid():
303304
self.fail("A valid object should have been returned")
304305

305306
# Check Type API
306-
if bool_struct.GetType() != lldb.eStructuredDataTypeBoolean:
307+
if not bool_struct.GetType() == lldb.eStructuredDataTypeBoolean:
307308
self.fail("Wrong type returned: " + str(bool_struct.GetType()))
308309

309310
# Check API returning 'bool' value
@@ -313,108 +314,35 @@ def bool_struct_test(self, dict_struct):
313314

314315
def array_struct_test(self, dict_struct):
315316
# Check API returning a valid SBStructuredData of 'array' type
317+
array_struct = lldb.SBStructuredData()
316318
array_struct = dict_struct.GetValueForKey("key_array")
317319
if not array_struct.IsValid():
318320
self.fail("A valid object should have been returned")
319321

320322
# Check Type API
321-
if array_struct.GetType() != lldb.eStructuredDataTypeArray:
323+
if not array_struct.GetType() == lldb.eStructuredDataTypeArray:
322324
self.fail("Wrong type returned: " + str(array_struct.GetType()))
323325

324326
# Check Size API for 'array' type
325-
if array_struct.GetSize() != 2:
327+
if not array_struct.GetSize() == 2:
326328
self.fail("Wrong no of elements returned: " + str(array_struct.GetSize()))
327329

328330
# Check API returning a valid SBStructuredData for different 'array'
329331
# indices
330332
string_struct = array_struct.GetItemAtIndex(0)
331333
if not string_struct.IsValid():
332334
self.fail("A valid object should have been returned")
333-
if string_struct.GetType() != lldb.eStructuredDataTypeString:
335+
if not string_struct.GetType() == lldb.eStructuredDataTypeString:
334336
self.fail("Wrong type returned: " + str(string_struct.GetType()))
335337
output = string_struct.GetStringValue(5)
336-
if output != "23":
338+
if not output == "23":
337339
self.fail("wrong output: " + str(output))
338340

339341
string_struct = array_struct.GetItemAtIndex(1)
340342
if not string_struct.IsValid():
341343
self.fail("A valid object should have been returned")
342-
if string_struct.GetType() != lldb.eStructuredDataTypeString:
344+
if not string_struct.GetType() == lldb.eStructuredDataTypeString:
343345
self.fail("Wrong type returned: " + str(string_struct.GetType()))
344346
output = string_struct.GetStringValue(5)
345-
if output != "arr":
347+
if not output == "arr":
346348
self.fail("wrong output: " + str(output))
347-
348-
def test_round_trip_scalars(self):
349-
for original in (0, 11, -1, 0.0, 4.5, -0.25, True, False):
350-
constructor = type(original)
351-
data = lldb.SBStructuredData()
352-
data.SetFromJSON(json.dumps(original))
353-
round_tripped = constructor(data)
354-
self.assertEqual(round_tripped, original)
355-
356-
def test_dynamic(self):
357-
for original in (0, 11, -1, 0.0, 4.5, -0.25, "", "dirk", True, False):
358-
data = lldb.SBStructuredData()
359-
data.SetFromJSON(json.dumps(original))
360-
self.assertEqual(data.dynamic, original)
361-
362-
def test_round_trip_int(self):
363-
for original in (0, 11, -1):
364-
data = lldb.SBStructuredData()
365-
data.SetFromJSON(json.dumps(original))
366-
self.assertEqual(int(data), int(original))
367-
368-
def test_round_trip_float(self):
369-
for original in (0, 11, -1, 0.0, 4.5, -0.25):
370-
data = lldb.SBStructuredData()
371-
data.SetFromJSON(json.dumps(original))
372-
self.assertEqual(float(data), float(original))
373-
374-
def test_round_trip_bool(self):
375-
for original in (0, 11, -1, 0.0, 4.5, -0.25, "0.0", "4.5", "-0.25"):
376-
data = lldb.SBStructuredData()
377-
data.SetFromJSON(json.dumps(original))
378-
self.assertEqual(bool(data), bool(original))
379-
380-
for original in ([], {}, [1], {1: 1}):
381-
data = lldb.SBStructuredData()
382-
data.SetFromJSON(json.dumps(original))
383-
self.assertEqual(bool(data), bool(original))
384-
385-
def test_assert_false(self):
386-
self.assertFalse(lldb.SBStructuredData())
387-
for original in ("0", "0.0", '""', "[]", "{}"):
388-
data = lldb.SBStructuredData()
389-
data.SetFromJSON(original)
390-
self.assertFalse(data)
391-
392-
def test_iterate_array(self):
393-
array = [0, 1, 2]
394-
data = lldb.SBStructuredData()
395-
data.SetFromJSON(json.dumps(array))
396-
for value in data:
397-
self.assertEqual(value, array.pop(0))
398-
399-
def test_iterate_dictionary(self):
400-
dictionary = {"0": 0, "1": 1, "2": 2}
401-
keys = set(dictionary.keys())
402-
data = lldb.SBStructuredData()
403-
data.SetFromJSON(json.dumps(dictionary))
404-
for key in data:
405-
self.assertIn(key, keys)
406-
keys.remove(key)
407-
408-
def test_getitem_array(self):
409-
array = [1, 2, 3]
410-
data = lldb.SBStructuredData()
411-
data.SetFromJSON(json.dumps(array))
412-
for i in range(len(array)):
413-
self.assertEqual(data[i], array[i])
414-
415-
def test_getitem_dictionary(self):
416-
dictionary = {"one": 1, "two": 2, "three": 3}
417-
data = lldb.SBStructuredData()
418-
data.SetFromJSON(json.dumps(dictionary))
419-
for key in dictionary:
420-
self.assertEqual(data[key], dictionary[key])

0 commit comments

Comments
 (0)