https://github.com/kastiglione updated 
https://github.com/llvm/llvm-project/pull/155061

>From 8c8a17a0ac56d31ec9cf8319a5aa33060852ef27 Mon Sep 17 00:00:00 2001
From: Dave Lee <davelee....@gmail.com>
Date: Fri, 22 Aug 2025 19:34:57 -0700
Subject: [PATCH 1/4] [lldb] Add Pythonic API to SBStructuredData extension

* Implements `__getitem__` for array and dictionary subscripting
* Updates `__iter__` to support dictionary instances
* Adds converstion to `str`, `int`, and `float`
* Adds `bool` conversion

Additionally did some cleanup in TestStructuredDataAPI.py.
---
 .../interface/SBStructuredDataExtensions.i    | 119 ++++++++++++++++-
 .../sbstructureddata/TestStructuredDataAPI.py | 121 ++++++++++++++----
 2 files changed, 210 insertions(+), 30 deletions(-)

diff --git a/lldb/bindings/interface/SBStructuredDataExtensions.i 
b/lldb/bindings/interface/SBStructuredDataExtensions.i
index ca3d0966f9fc1..900dc192df2bb 100644
--- a/lldb/bindings/interface/SBStructuredDataExtensions.i
+++ b/lldb/bindings/interface/SBStructuredDataExtensions.i
@@ -3,16 +3,127 @@ STRING_EXTENSION_OUTSIDE(SBStructuredData)
 %extend lldb::SBStructuredData {
 #ifdef SWIGPYTHON
     %pythoncode%{
-    def __int__(self):
-      return self.GetSignedInteger()
-
     def __len__(self):
       '''Return the number of element in a lldb.SBStructuredData object.'''
       return self.GetSize()
 
     def __iter__(self):
         '''Iterate over all the elements in a lldb.SBStructuredData object.'''
-        return lldb_iter(self, 'GetSize', 'GetItemAtIndex')
+        data_type = self.GetType()
+        if data_type == eStructuredDataTypeArray:
+            return lldb_iter(self, 'GetSize', 'GetItemAtIndex')
+        elif data_type == eStructuredDataTypeDictionary:
+            keys = SBStringList()
+            self.GetKeys(keys)
+            return iter(keys)
+        raise TypeError(f"cannot iterate {self.type_name(data_type)} type")
+
+    def __getitem__(self, key):
+        data_type = self.GetType()
+        if data_type == eStructuredDataTypeArray:
+            if not isinstance(key, int):
+                raise TypeError("subscript index must be an integer")
+            count = len(self)
+            if -count <= key < count:
+                key %= count
+                return self.GetItemAtIndex(key)
+            raise IndexError("index out of range")
+        elif data_type == eStructuredDataTypeDictionary:
+            if not isinstance(key, str):
+                raise TypeError("subscript key must be a string")
+            return self.GetValueForKey(key)
+        else:
+            raise TypeError(f"cannot subscript {self.type_name(data_type)} 
type")
+
+    def __bool__(self):
+        data_type = self.GetType()
+        if data_type == eStructuredDataTypeBoolean:
+            return self.GetBooleanValue()
+        elif data_type == eStructuredDataTypeInteger:
+            return bool(int(self))
+        elif data_type == eStructuredDataTypeSignedInteger:
+            return bool(int(self))
+        elif data_type == eStructuredDataTypeFloat:
+            return bool(float(self))
+        elif data_type == eStructuredDataTypeString:
+            return bool(str(self))
+        elif data_type == eStructuredDataTypeArray:
+            return bool(len(self))
+        elif data_type == eStructuredDataTypeDictionary:
+            return bool(len(self))
+        elif data_type == eStructuredDataTypeNull:
+            return False
+        elif data_type == eStructuredDataTypeInvalid:
+            return False
+        else:
+            raise TypeError(f"cannot convert {self.type_name(data_type)} to 
bool")
+
+    def __str__(self):
+        data_type = self.GetType()
+        if data_type == eStructuredDataTypeString:
+            size = len(self) or 1023
+            return self.GetStringValue(size + 1)
+        elif data_type == eStructuredDataTypeInteger:
+            return str(int(self))
+        elif data_type == eStructuredDataTypeSignedInteger:
+            return str(int(self))
+        elif data_type == eStructuredDataTypeFloat:
+            return str(float(self))
+        else:
+            raise TypeError(f"cannot convert {self.type_name(data_type)} to 
string")
+
+    def __int__(self):
+        data_type = self.GetType()
+        if data_type == eStructuredDataTypeInteger:
+            return self.GetUnsignedIntegerValue()
+        elif data_type == eStructuredDataTypeSignedInteger:
+            return self.GetSignedIntegerValue()
+        elif data_type == eStructuredDataTypeFloat:
+            return int(float(self))
+        elif data_type == eStructuredDataTypeString:
+            return int(str(self))
+        elif data_type == eStructuredDataTypeBoolean:
+            return int(bool(self))
+        else:
+            raise TypeError(f"cannot convert {self.type_name(data_type)} to 
int")
+
+    def __float__(self):
+        data_type = self.GetType()
+        if data_type == eStructuredDataTypeFloat:
+            return self.GetFloatValue()
+        elif data_type == eStructuredDataTypeInteger:
+            return float(int(self))
+        elif data_type == eStructuredDataTypeSignedInteger:
+            return float(int(self))
+        elif data_type == eStructuredDataTypeString:
+            return float(str(self))
+        else:
+            raise TypeError(f"cannot convert {self.type_name(data_type)} to 
float")
+
+    @staticmethod
+    def type_name(t):
+        if t == eStructuredDataTypeNull:
+            return "null"
+        elif t == eStructuredDataTypeBoolean:
+            return "boolean"
+        elif t == eStructuredDataTypeInteger:
+            return "integer"
+        elif t == eStructuredDataTypeSignedInteger:
+            return "integer"
+        elif t == eStructuredDataTypeFloat:
+            return "float"
+        elif t == eStructuredDataTypeString:
+            return "string"
+        elif t == eStructuredDataTypeArray:
+            return "array"
+        elif t == eStructuredDataTypeDictionary:
+            return "dictionary"
+        elif t == eStructuredDataTypeGeneric:
+            return "generic"
+        elif t == eStructuredDataTypeInvalid:
+            return "invalid"
+        else:
+            raise TypeError(f"unknown structured data type: {t}")
     %}
 #endif
 }
diff --git a/lldb/test/API/python_api/sbstructureddata/TestStructuredDataAPI.py 
b/lldb/test/API/python_api/sbstructureddata/TestStructuredDataAPI.py
index 99f88d3da794a..6594c3604d26a 100644
--- a/lldb/test/API/python_api/sbstructureddata/TestStructuredDataAPI.py
+++ b/lldb/test/API/python_api/sbstructureddata/TestStructuredDataAPI.py
@@ -51,7 +51,6 @@ def structured_data_api_test(self):
         if not "key_float" in s.GetData():
             self.fail("FAILED: could not find key_float in description output")
 
-        dict_struct = lldb.SBStructuredData()
         dict_struct = example.GetValueForKey("key_dict")
 
         # Tests for dictionary data type
@@ -113,21 +112,26 @@ class MyRandomClass:
         self.assertSuccess(example.SetFromJSON("1"))
         self.assertEqual(example.GetType(), lldb.eStructuredDataTypeInteger)
         self.assertEqual(example.GetIntegerValue(), 1)
+        self.assertEqual(int(example), 1)
 
         self.assertSuccess(example.SetFromJSON("4.19"))
         self.assertEqual(example.GetType(), lldb.eStructuredDataTypeFloat)
         self.assertEqual(example.GetFloatValue(), 4.19)
+        self.assertEqual(float(example), 4.19)
 
         self.assertSuccess(example.SetFromJSON('"Bonjour, 123!"'))
         self.assertEqual(example.GetType(), lldb.eStructuredDataTypeString)
         self.assertEqual(example.GetStringValue(42), "Bonjour, 123!")
+        self.assertEqual(str(example), "Bonjour, 123!")
 
         self.assertSuccess(example.SetFromJSON("true"))
         self.assertEqual(example.GetType(), lldb.eStructuredDataTypeBoolean)
         self.assertTrue(example.GetBooleanValue())
+        self.assertTrue(example)
 
         self.assertSuccess(example.SetFromJSON("null"))
         self.assertEqual(example.GetType(), lldb.eStructuredDataTypeNull)
+        self.assertFalse(example)
 
         example = lldb.SBStructuredData()
         example.SetUnsignedIntegerValue(1)
@@ -187,38 +191,35 @@ class MyRandomClass:
         self.assertEqual(sb_data, example_arr)
 
     def invalid_struct_test(self, example):
-        invalid_struct = lldb.SBStructuredData()
         invalid_struct = example.GetValueForKey("invalid_key")
         if invalid_struct.IsValid():
             self.fail("An invalid object should have been returned")
 
         # Check Type API
-        if not invalid_struct.GetType() == lldb.eStructuredDataTypeInvalid:
+        if invalid_struct.GetType() != lldb.eStructuredDataTypeInvalid:
             self.fail("Wrong type returned: " + str(invalid_struct.GetType()))
 
     def dictionary_struct_test(self, example):
         # Check API returning a valid SBStructuredData of 'dictionary' type
-        dict_struct = lldb.SBStructuredData()
         dict_struct = example.GetValueForKey("key_dict")
         if not dict_struct.IsValid():
             self.fail("A valid object should have been returned")
 
         # Check Type API
-        if not dict_struct.GetType() == lldb.eStructuredDataTypeDictionary:
+        if dict_struct.GetType() != lldb.eStructuredDataTypeDictionary:
             self.fail("Wrong type returned: " + str(dict_struct.GetType()))
 
         # Check Size API for 'dictionary' type
-        if not dict_struct.GetSize() == 6:
+        if dict_struct.GetSize() != 6:
             self.fail("Wrong no of elements returned: " + 
str(dict_struct.GetSize()))
 
     def string_struct_test(self, dict_struct):
-        string_struct = lldb.SBStructuredData()
         string_struct = dict_struct.GetValueForKey("key_string")
         if not string_struct.IsValid():
             self.fail("A valid object should have been returned")
 
         # Check Type API
-        if not string_struct.GetType() == lldb.eStructuredDataTypeString:
+        if string_struct.GetType() != lldb.eStructuredDataTypeString:
             self.fail("Wrong type returned: " + str(string_struct.GetType()))
 
         # Check API returning 'string' value
@@ -238,18 +239,17 @@ def uint_struct_test(self, dict_struct):
         # Check a valid SBStructuredData containing an unsigned integer.
         # We intentionally make this larger than what an int64_t can hold but
         # still small enough to fit a uint64_t
-        uint_struct = lldb.SBStructuredData()
         uint_struct = dict_struct.GetValueForKey("key_uint")
         if not uint_struct.IsValid():
             self.fail("A valid object should have been returned")
 
         # Check Type API
-        if not uint_struct.GetType() == lldb.eStructuredDataTypeInteger:
+        if uint_struct.GetType() != lldb.eStructuredDataTypeInteger:
             self.fail("Wrong type returned: " + str(uint_struct.GetType()))
 
         # Check API returning unsigned integer value
         output = uint_struct.GetUnsignedIntegerValue()
-        if not output == 0xFFFFFFFF00000000:
+        if output != 0xFFFFFFFF00000000:
             self.fail("wrong output: " + str(output))
 
         # Calling wrong API on a SBStructuredData
@@ -262,18 +262,17 @@ def sint_struct_test(self, dict_struct):
         # Check a valid SBStructuredData containing an signed integer.
         # We intentionally make this smaller than what an uint64_t can hold but
         # still small enough to fit a int64_t
-        sint_struct = lldb.SBStructuredData()
         sint_struct = dict_struct.GetValueForKey("key_sint")
         if not sint_struct.IsValid():
             self.fail("A valid object should have been returned")
 
         # Check Type API
-        if not sint_struct.GetType() == lldb.eStructuredDataTypeSignedInteger:
+        if sint_struct.GetType() != lldb.eStructuredDataTypeSignedInteger:
             self.fail("Wrong type returned: " + str(sint_struct.GetType()))
 
         # Check API returning signed integer value
         output = sint_struct.GetSignedIntegerValue()
-        if not output == -42:
+        if output != -42:
             self.fail("wrong output: " + str(output))
 
         # Calling wrong API on a SBStructuredData
@@ -283,28 +282,26 @@ def sint_struct_test(self, dict_struct):
             self.fail("Valid string " + output + " returned for an integer 
object")
 
     def double_struct_test(self, dict_struct):
-        floating_point_struct = lldb.SBStructuredData()
         floating_point_struct = dict_struct.GetValueForKey("key_float")
         if not floating_point_struct.IsValid():
             self.fail("A valid object should have been returned")
 
         # Check Type API
-        if not floating_point_struct.GetType() == 
lldb.eStructuredDataTypeFloat:
+        if floating_point_struct.GetType() != lldb.eStructuredDataTypeFloat:
             self.fail("Wrong type returned: " + 
str(floating_point_struct.GetType()))
 
         # Check API returning 'double' value
         output = floating_point_struct.GetFloatValue()
-        if not output == 2.99:
+        if output != 2.99:
             self.fail("wrong output: " + str(output))
 
     def bool_struct_test(self, dict_struct):
-        bool_struct = lldb.SBStructuredData()
         bool_struct = dict_struct.GetValueForKey("key_bool")
         if not bool_struct.IsValid():
             self.fail("A valid object should have been returned")
 
         # Check Type API
-        if not bool_struct.GetType() == lldb.eStructuredDataTypeBoolean:
+        if bool_struct.GetType() != lldb.eStructuredDataTypeBoolean:
             self.fail("Wrong type returned: " + str(bool_struct.GetType()))
 
         # Check API returning 'bool' value
@@ -314,17 +311,16 @@ def bool_struct_test(self, dict_struct):
 
     def array_struct_test(self, dict_struct):
         # Check API returning a valid SBStructuredData of 'array' type
-        array_struct = lldb.SBStructuredData()
         array_struct = dict_struct.GetValueForKey("key_array")
         if not array_struct.IsValid():
             self.fail("A valid object should have been returned")
 
         # Check Type API
-        if not array_struct.GetType() == lldb.eStructuredDataTypeArray:
+        if array_struct.GetType() != lldb.eStructuredDataTypeArray:
             self.fail("Wrong type returned: " + str(array_struct.GetType()))
 
         # Check Size API for 'array' type
-        if not array_struct.GetSize() == 2:
+        if array_struct.GetSize() != 2:
             self.fail("Wrong no of elements returned: " + 
str(array_struct.GetSize()))
 
         # Check API returning a valid SBStructuredData for different 'array'
@@ -332,17 +328,90 @@ def array_struct_test(self, dict_struct):
         string_struct = array_struct.GetItemAtIndex(0)
         if not string_struct.IsValid():
             self.fail("A valid object should have been returned")
-        if not string_struct.GetType() == lldb.eStructuredDataTypeString:
+        if string_struct.GetType() != lldb.eStructuredDataTypeString:
             self.fail("Wrong type returned: " + str(string_struct.GetType()))
         output = string_struct.GetStringValue(5)
-        if not output == "23":
+        if output != "23":
             self.fail("wrong output: " + str(output))
 
         string_struct = array_struct.GetItemAtIndex(1)
         if not string_struct.IsValid():
             self.fail("A valid object should have been returned")
-        if not string_struct.GetType() == lldb.eStructuredDataTypeString:
+        if string_struct.GetType() != lldb.eStructuredDataTypeString:
             self.fail("Wrong type returned: " + str(string_struct.GetType()))
         output = string_struct.GetStringValue(5)
-        if not output == "arr":
+        if output != "arr":
             self.fail("wrong output: " + str(output))
+
+    def test_round_trip_scalars(self):
+        for original in (0, 11, -1, 0.0, 4.5, -0.25, "", "dirk", True, False):
+            constructor = type(original)
+            data = lldb.SBStructuredData()
+            data.SetFromJSON(json.dumps(original))
+            round_tripped = constructor(data)
+            self.assertEqual(round_tripped, original)
+
+    def test_round_trip_string(self):
+        # No 0.0, it inherently does not round trip.
+        for original in (0, 11, -1, 4.5, -0.25, "", "dirk"):
+            data = lldb.SBStructuredData()
+            data.SetFromJSON(json.dumps(original))
+            self.assertEqual(str(data), str(original))
+
+    def test_round_trip_int(self):
+        for original in (0, 11, -1, 0.0, 4.5, -0.25, "0", "11", "-1", True, 
False):
+            data = lldb.SBStructuredData()
+            data.SetFromJSON(json.dumps(original))
+            self.assertEqual(int(data), int(original))
+
+    def test_round_trip_float(self):
+        for original in (0, 11, -1, 0.0, 4.5, -0.25, "0.0", "4.5", "-0.25"):
+            data = lldb.SBStructuredData()
+            data.SetFromJSON(json.dumps(original))
+            self.assertEqual(float(data), float(original))
+
+    def test_round_trip_bool(self):
+        for original in (0, 11, -1, 0.0, 4.5, -0.25, "0.0", "4.5", "-0.25"):
+            data = lldb.SBStructuredData()
+            data.SetFromJSON(json.dumps(original))
+            self.assertEqual(bool(data), bool(original))
+
+        for original in ([], {}, [1], {1: 1}):
+            data = lldb.SBStructuredData()
+            data.SetFromJSON(json.dumps(original))
+            self.assertEqual(bool(data), bool(original))
+
+    def test_assert_false(self):
+        self.assertFalse(lldb.SBStructuredData())
+        for original in ("0", "0.0", '""', "[]", "{}"):
+            data = lldb.SBStructuredData()
+            data.SetFromJSON(original)
+            self.assertFalse(data)
+
+    def test_iterate_array(self):
+        array = [0, 1, 2]
+        data = lldb.SBStructuredData()
+        data.SetFromJSON(json.dumps(array))
+        for value in data:
+            self.assertEqual(int(value), array.pop(0))
+
+    def test_iterate_dictionary(self):
+        dictionary = {"0": 0, "1": 1, "2": 2}
+        data = lldb.SBStructuredData()
+        data.SetFromJSON(json.dumps(dictionary))
+        for key in data:
+            self.assertEqual(int(key), dictionary[key])
+
+    def test_getitem_array(self):
+        array = [1, 2, 3]
+        data = lldb.SBStructuredData()
+        data.SetFromJSON(json.dumps(array))
+        for i in range(len(array)):
+            self.assertEqual(int(data[i]), array[i])
+
+    def test_getitem_dictionary(self):
+        dictionary = {"one": 1, "two": 2, "three": 3}
+        data = lldb.SBStructuredData()
+        data.SetFromJSON(json.dumps(dictionary))
+        for key in dictionary:
+            self.assertEqual(int(data[key]), dictionary[key])

>From c7994222101add29c6d4fd9b291599a3ebb4b8d2 Mon Sep 17 00:00:00 2001
From: Dave Lee <davelee....@gmail.com>
Date: Sat, 23 Aug 2025 09:34:49 -0700
Subject: [PATCH 2/4] unwrap dynamically when using getitem/iter

---
 .../interface/SBStructuredDataExtensions.i    | 32 ++++++++++++++++---
 .../sbstructureddata/TestStructuredDataAPI.py | 12 +++++--
 2 files changed, 37 insertions(+), 7 deletions(-)

diff --git a/lldb/bindings/interface/SBStructuredDataExtensions.i 
b/lldb/bindings/interface/SBStructuredDataExtensions.i
index 900dc192df2bb..2a6e5790c965d 100644
--- a/lldb/bindings/interface/SBStructuredDataExtensions.i
+++ b/lldb/bindings/interface/SBStructuredDataExtensions.i
@@ -11,12 +11,15 @@ STRING_EXTENSION_OUTSIDE(SBStructuredData)
         '''Iterate over all the elements in a lldb.SBStructuredData object.'''
         data_type = self.GetType()
         if data_type == eStructuredDataTypeArray:
-            return lldb_iter(self, 'GetSize', 'GetItemAtIndex')
+            for i in range(self.GetSize()):
+                yield self.GetItemAtIndex(i).dynamic
+            return
         elif data_type == eStructuredDataTypeDictionary:
             keys = SBStringList()
             self.GetKeys(keys)
             return iter(keys)
-        raise TypeError(f"cannot iterate {self.type_name(data_type)} type")
+        else:
+            raise TypeError(f"cannot iterate {self.type_name(data_type)} type")
 
     def __getitem__(self, key):
         data_type = self.GetType()
@@ -26,12 +29,12 @@ STRING_EXTENSION_OUTSIDE(SBStructuredData)
             count = len(self)
             if -count <= key < count:
                 key %= count
-                return self.GetItemAtIndex(key)
+                return self.GetItemAtIndex(key).dynamic
             raise IndexError("index out of range")
         elif data_type == eStructuredDataTypeDictionary:
             if not isinstance(key, str):
                 raise TypeError("subscript key must be a string")
-            return self.GetValueForKey(key)
+            return self.GetValueForKey(key).dynamic
         else:
             raise TypeError(f"cannot subscript {self.type_name(data_type)} 
type")
 
@@ -100,6 +103,27 @@ STRING_EXTENSION_OUTSIDE(SBStructuredData)
         else:
             raise TypeError(f"cannot convert {self.type_name(data_type)} to 
float")
 
+    @property
+    def dynamic(self):
+        data_type = self.GetType()
+        if data_type == eStructuredDataTypeNull:
+            return None
+        elif data_type == eStructuredDataTypeBoolean:
+            return self.GetBooleanValue()
+        elif data_type == eStructuredDataTypeInteger:
+            return self.GetUnsignedIntegerValue()
+        elif data_type == eStructuredDataTypeSignedInteger:
+            return self.GetSignedIntegerValue()
+        elif data_type == eStructuredDataTypeFloat:
+            return self.GetFloatValue()
+        elif data_type == eStructuredDataTypeString:
+            size = len(self) or 1023
+            return self.GetStringValue(size + 1)
+        elif data_type == eStructuredDataTypeGeneric:
+            return self.GetGenericValue()
+        else:
+            return self
+
     @staticmethod
     def type_name(t):
         if t == eStructuredDataTypeNull:
diff --git a/lldb/test/API/python_api/sbstructureddata/TestStructuredDataAPI.py 
b/lldb/test/API/python_api/sbstructureddata/TestStructuredDataAPI.py
index 6594c3604d26a..f3add778ef554 100644
--- a/lldb/test/API/python_api/sbstructureddata/TestStructuredDataAPI.py
+++ b/lldb/test/API/python_api/sbstructureddata/TestStructuredDataAPI.py
@@ -351,6 +351,12 @@ def test_round_trip_scalars(self):
             round_tripped = constructor(data)
             self.assertEqual(round_tripped, original)
 
+    def test_dynamic(self):
+        for original in (0, 11, -1, 0.0, 4.5, -0.25, "", "dirk", True, False):
+            data = lldb.SBStructuredData()
+            data.SetFromJSON(json.dumps(original))
+            self.assertEqual(data.dynamic, original)
+
     def test_round_trip_string(self):
         # No 0.0, it inherently does not round trip.
         for original in (0, 11, -1, 4.5, -0.25, "", "dirk"):
@@ -393,7 +399,7 @@ def test_iterate_array(self):
         data = lldb.SBStructuredData()
         data.SetFromJSON(json.dumps(array))
         for value in data:
-            self.assertEqual(int(value), array.pop(0))
+            self.assertEqual(value, array.pop(0))
 
     def test_iterate_dictionary(self):
         dictionary = {"0": 0, "1": 1, "2": 2}
@@ -407,11 +413,11 @@ def test_getitem_array(self):
         data = lldb.SBStructuredData()
         data.SetFromJSON(json.dumps(array))
         for i in range(len(array)):
-            self.assertEqual(int(data[i]), array[i])
+            self.assertEqual(data[i], array[i])
 
     def test_getitem_dictionary(self):
         dictionary = {"one": 1, "two": 2, "three": 3}
         data = lldb.SBStructuredData()
         data.SetFromJSON(json.dumps(dictionary))
         for key in dictionary:
-            self.assertEqual(int(data[key]), dictionary[key])
+            self.assertEqual(data[key], dictionary[key])

>From a68276bf196c591dc718d89bc618b5c203952e59 Mon Sep 17 00:00:00 2001
From: Dave Lee <davelee....@gmail.com>
Date: Sat, 23 Aug 2025 10:37:00 -0700
Subject: [PATCH 3/4] tweak test_iterate_dictionary

---
 .../API/python_api/sbstructureddata/TestStructuredDataAPI.py  | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/lldb/test/API/python_api/sbstructureddata/TestStructuredDataAPI.py 
b/lldb/test/API/python_api/sbstructureddata/TestStructuredDataAPI.py
index f3add778ef554..d3ec4dcc4f6ca 100644
--- a/lldb/test/API/python_api/sbstructureddata/TestStructuredDataAPI.py
+++ b/lldb/test/API/python_api/sbstructureddata/TestStructuredDataAPI.py
@@ -403,10 +403,12 @@ def test_iterate_array(self):
 
     def test_iterate_dictionary(self):
         dictionary = {"0": 0, "1": 1, "2": 2}
+        keys = set(dictionary.keys())
         data = lldb.SBStructuredData()
         data.SetFromJSON(json.dumps(dictionary))
         for key in data:
-            self.assertEqual(int(key), dictionary[key])
+            self.assertIn(key, keys)
+            keys.remove(key)
 
     def test_getitem_array(self):
         array = [1, 2, 3]

>From d75c5ffa8413f228ee6b5d9b2503a48f3ddc4d3f Mon Sep 17 00:00:00 2001
From: Dave Lee <davelee....@gmail.com>
Date: Sat, 23 Aug 2025 11:11:54 -0700
Subject: [PATCH 4/4] simplify str/bool/int/float

---
 .../interface/SBStructuredDataExtensions.i    | 76 ++++++++-----------
 1 file changed, 31 insertions(+), 45 deletions(-)

diff --git a/lldb/bindings/interface/SBStructuredDataExtensions.i 
b/lldb/bindings/interface/SBStructuredDataExtensions.i
index 2a6e5790c965d..cf3b240df2456 100644
--- a/lldb/bindings/interface/SBStructuredDataExtensions.i
+++ b/lldb/bindings/interface/SBStructuredDataExtensions.i
@@ -40,66 +40,52 @@ STRING_EXTENSION_OUTSIDE(SBStructuredData)
 
     def __bool__(self):
         data_type = self.GetType()
-        if data_type == eStructuredDataTypeBoolean:
-            return self.GetBooleanValue()
-        elif data_type == eStructuredDataTypeInteger:
-            return bool(int(self))
-        elif data_type == eStructuredDataTypeSignedInteger:
-            return bool(int(self))
-        elif data_type == eStructuredDataTypeFloat:
-            return bool(float(self))
-        elif data_type == eStructuredDataTypeString:
-            return bool(str(self))
-        elif data_type == eStructuredDataTypeArray:
-            return bool(len(self))
-        elif data_type == eStructuredDataTypeDictionary:
-            return bool(len(self))
-        elif data_type == eStructuredDataTypeNull:
-            return False
-        elif data_type == eStructuredDataTypeInvalid:
+        if data_type == eStructuredDataTypeInvalid:
             return False
+        elif data_type in (
+            eStructuredDataTypeArray,
+            eStructuredDataTypeDictionary,
+        ):
+            return self.GetSize() != 0
+        elif data_type != eStructuredDataTypeGeneric:
+            return bool(self.dynamic)
         else:
-            raise TypeError(f"cannot convert {self.type_name(data_type)} to 
bool")
+            raise TypeError("cannot convert generic to bool")
 
     def __str__(self):
         data_type = self.GetType()
-        if data_type == eStructuredDataTypeString:
-            size = len(self) or 1023
-            return self.GetStringValue(size + 1)
-        elif data_type == eStructuredDataTypeInteger:
-            return str(int(self))
-        elif data_type == eStructuredDataTypeSignedInteger:
-            return str(int(self))
-        elif data_type == eStructuredDataTypeFloat:
-            return str(float(self))
+        if data_type in (
+            eStructuredDataTypeString,
+            eStructuredDataTypeInteger,
+            eStructuredDataTypeSignedInteger,
+            eStructuredDataTypeFloat,
+        ):
+            return str(self.dynamic)
         else:
             raise TypeError(f"cannot convert {self.type_name(data_type)} to 
string")
 
     def __int__(self):
         data_type = self.GetType()
-        if data_type == eStructuredDataTypeInteger:
-            return self.GetUnsignedIntegerValue()
-        elif data_type == eStructuredDataTypeSignedInteger:
-            return self.GetSignedIntegerValue()
-        elif data_type == eStructuredDataTypeFloat:
-            return int(float(self))
-        elif data_type == eStructuredDataTypeString:
-            return int(str(self))
-        elif data_type == eStructuredDataTypeBoolean:
-            return int(bool(self))
+        if data_type in (
+            eStructuredDataTypeInteger,
+            eStructuredDataTypeSignedInteger,
+            eStructuredDataTypeFloat,
+            eStructuredDataTypeString,
+            eStructuredDataTypeBoolean,
+        ):
+            return int(self.dynamic)
         else:
             raise TypeError(f"cannot convert {self.type_name(data_type)} to 
int")
 
     def __float__(self):
         data_type = self.GetType()
-        if data_type == eStructuredDataTypeFloat:
-            return self.GetFloatValue()
-        elif data_type == eStructuredDataTypeInteger:
-            return float(int(self))
-        elif data_type == eStructuredDataTypeSignedInteger:
-            return float(int(self))
-        elif data_type == eStructuredDataTypeString:
-            return float(str(self))
+        if data_type in (
+            eStructuredDataTypeFloat,
+            eStructuredDataTypeInteger,
+            eStructuredDataTypeSignedInteger,
+            eStructuredDataTypeString,
+        ):
+            return float(self.dynamic)
         else:
             raise TypeError(f"cannot convert {self.type_name(data_type)} to 
float")
 

_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to