Files
Ebuka Ezike 81e0360246 [lldb] Fix SBStructuredData::GetStringValue method (#216875)
In python the method's signature is
```py
class SBStructuredData:
    def GetStringValue(self, dst_len: int) -> str:
```
There is no way from python to get the total data from GetStringValue
regardless of how many times you call GetStringValue.

Update the implementation
```py
    def GetStringValue(self, len: int = 0) -> str:
```

Fixes crash when input is None in `SBStructuredData.SetStringValue`
Don't trim the result when called with the `dynamic` property.

(cherry picked from commit 93377d703115b45c3ad8f5f218cb85769d24a1b0)
2026-08-26 11:01:00 +02:00

121 lines
4.1 KiB
OpenEdge ABL

STRING_EXTENSION_OUTSIDE(SBStructuredData)
%extend lldb::SBStructuredData {
#ifdef SWIGPYTHON
%pythoncode%{
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.'''
data_type = self.GetType()
if data_type == eStructuredDataTypeArray:
for i in range(self.GetSize()):
yield self.GetItemAtIndex(i).dynamic
return
elif data_type == eStructuredDataTypeDictionary:
keys = SBStringList()
self.GetKeys(keys)
return iter(keys)
else:
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).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).dynamic
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 __int__(self):
data_type = self.GetType()
if data_type in (
eStructuredDataTypeInteger,
eStructuredDataTypeSignedInteger,
):
return 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 in (
eStructuredDataTypeFloat,
eStructuredDataTypeInteger,
eStructuredDataTypeSignedInteger,
):
return float(self.dynamic)
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:
return self.GetStringValue()
elif data_type == eStructuredDataTypeGeneric:
return self.GetGenericValue()
else:
return self
@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
}