brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.1 KiB · af76cfc Raw
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