blob: af76cfc5c2db310e46f57896eae3f7c49daca654 [file] [log] [blame] [edit]
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:
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:
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
}