Skip to content

Conversation

kastiglione
Copy link
Contributor

@kastiglione kastiglione commented Sep 3, 2025

Follow up to #155061 and #156721.

After discussing with @medismailben, the ideal course of to have a __str__, however, instead of throwing an exception, the fallback behavior calls __repr__ (GetDescription).

The main value of this is that str(string_data) will produce the string itself, not a quoted string as returned by __repr__/GetDescription.

Follow up to llvm#155061 and llvm#156721.

After discussing with @medismailben, the ideal course of to have a `__str__`, however,
instead of throwing an exception, the fallback behavior calls `__repr__`
(`GetDescription`).

The main value of this is that `str(string_data)` will produce the string itself, not a
quoted string as returned by `__repr__`/`GetDescription`.
@llvmbot
Copy link
Member

llvmbot commented Sep 3, 2025

@llvm/pr-subscribers-lldb

Author: Dave Lee (kastiglione)

Changes

Follow up to #155061 and #156721.

After discussing with @medismailben, the ideal course of to have a __str__, however, instead of throwing an exception, the fallback behavior calls __repr__ (GetDescription).

The main value of this is that str(string_data) will produce the string itself, not a quoted string as returned by __repr__/GetDescription.


Full diff: https://github.com/llvm/llvm-project/pull/156725.diff

2 Files Affected:

  • (modified) lldb/bindings/interface/SBStructuredDataExtensions.i (+12)
  • (modified) lldb/test/API/python_api/sbstructureddata/TestStructuredDataAPI.py (+15-2)
diff --git a/lldb/bindings/interface/SBStructuredDataExtensions.i b/lldb/bindings/interface/SBStructuredDataExtensions.i
index 9def366a4cf11..35aa2044eb1ac 100644
--- a/lldb/bindings/interface/SBStructuredDataExtensions.i
+++ b/lldb/bindings/interface/SBStructuredDataExtensions.i
@@ -38,6 +38,18 @@ STRING_EXTENSION_OUTSIDE(SBStructuredData)
         else:
             raise TypeError(f"cannot subscript {self.type_name(data_type)} type")
 
+    def __str__(self):
+        data_type = self.GetType()
+        if data_type in (
+            eStructuredDataTypeString,
+            eStructuredDataTypeInteger,
+            eStructuredDataTypeSignedInteger,
+            eStructuredDataTypeFloat,
+        ):
+             return str(self.dynamic)
+        else:
+            return repr(self)
+
     def __bool__(self):
         data_type = self.GetType()
         if data_type == eStructuredDataTypeInvalid:
diff --git a/lldb/test/API/python_api/sbstructureddata/TestStructuredDataAPI.py b/lldb/test/API/python_api/sbstructureddata/TestStructuredDataAPI.py
index 275ac03a5a86d..b55f17c151ad5 100644
--- a/lldb/test/API/python_api/sbstructureddata/TestStructuredDataAPI.py
+++ b/lldb/test/API/python_api/sbstructureddata/TestStructuredDataAPI.py
@@ -2,7 +2,6 @@
 Test some SBStructuredData API.
 """
 
-
 import lldb
 from lldbsuite.test.decorators import *
 from lldbsuite.test.lldbtest import *
@@ -10,6 +9,7 @@
 
 import json
 
+
 class TestStructuredDataAPI(TestBase):
     NO_DEBUG_INFO_TESTCASE = True
 
@@ -346,7 +346,7 @@ def array_struct_test(self, dict_struct):
             self.fail("wrong output: " + str(output))
 
     def test_round_trip_scalars(self):
-        for original in (0, 11, -1, 0.0, 4.5, -0.25, True, False):
+        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))
@@ -359,6 +359,19 @@ def test_dynamic(self):
             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", True, False):
+            data = lldb.SBStructuredData()
+            data.SetFromJSON(json.dumps(original))
+            self.assertEqual(str(data), str(original))
+
+    def test_str(self):
+        for original in ([15], {"id": 23}, None):
+            data = lldb.SBStructuredData()
+            data.SetFromJSON(json.dumps(original))
+            self.assertTrue(str(data))
+
     def test_round_trip_int(self):
         for original in (0, 11, -1):
             data = lldb.SBStructuredData()

@kastiglione kastiglione closed this Sep 3, 2025
@kastiglione kastiglione deleted the lldb-Reimplement-__str__-in-SBStructuredDataExtensions.i branch September 3, 2025 19:15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants