122 lines · plain
1STRING_EXTENSION_OUTSIDE(SBStructuredData)2 3%extend lldb::SBStructuredData {4#ifdef SWIGPYTHON5 %pythoncode%{6 def __len__(self):7 '''Return the number of element in a lldb.SBStructuredData object.'''8 return self.GetSize()9 10 def __iter__(self):11 '''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).dynamic16 return17 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 %= count32 return self.GetItemAtIndex(key).dynamic33 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).dynamic38 else:39 raise TypeError(f"cannot subscript {self.type_name(data_type)} type")40 41 def __str__(self):42 data_type = self.GetType()43 if data_type in (44 eStructuredDataTypeString,45 eStructuredDataTypeInteger,46 eStructuredDataTypeSignedInteger,47 eStructuredDataTypeFloat,48 ):49 return str(self.dynamic)50 else:51 return repr(self)52 53 def __int__(self):54 data_type = self.GetType()55 if data_type in (56 eStructuredDataTypeInteger,57 eStructuredDataTypeSignedInteger,58 ):59 return self.dynamic60 else:61 raise TypeError(f"cannot convert {self.type_name(data_type)} to int")62 63 def __float__(self):64 data_type = self.GetType()65 if data_type in (66 eStructuredDataTypeFloat,67 eStructuredDataTypeInteger,68 eStructuredDataTypeSignedInteger,69 ):70 return float(self.dynamic)71 else:72 raise TypeError(f"cannot convert {self.type_name(data_type)} to float")73 74 @property75 def dynamic(self):76 data_type = self.GetType()77 if data_type == eStructuredDataTypeNull:78 return None79 elif data_type == eStructuredDataTypeBoolean:80 return self.GetBooleanValue()81 elif data_type == eStructuredDataTypeInteger:82 return self.GetUnsignedIntegerValue()83 elif data_type == eStructuredDataTypeSignedInteger:84 return self.GetSignedIntegerValue()85 elif data_type == eStructuredDataTypeFloat:86 return self.GetFloatValue()87 elif data_type == eStructuredDataTypeString:88 size = len(self) or 102389 return self.GetStringValue(size + 1)90 elif data_type == eStructuredDataTypeGeneric:91 return self.GetGenericValue()92 else:93 return self94 95 @staticmethod96 def type_name(t):97 if t == eStructuredDataTypeNull:98 return "null"99 elif t == eStructuredDataTypeBoolean:100 return "boolean"101 elif t == eStructuredDataTypeInteger:102 return "integer"103 elif t == eStructuredDataTypeSignedInteger:104 return "integer"105 elif t == eStructuredDataTypeFloat:106 return "float"107 elif t == eStructuredDataTypeString:108 return "string"109 elif t == eStructuredDataTypeArray:110 return "array"111 elif t == eStructuredDataTypeDictionary:112 return "dictionary"113 elif t == eStructuredDataTypeGeneric:114 return "generic"115 elif t == eStructuredDataTypeInvalid:116 return "invalid"117 else:118 raise TypeError(f"unknown structured data type: {t}")119 %}120#endif121}122