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 }