@@ -3,16 +3,133 @@ STRING_EXTENSION_OUTSIDE(SBStructuredData)
3
3
%extend lldb::SBStructuredData {
4
4
#ifdef SWIGPYTHON
5
5
%pythoncode%{
6
- def __int__ (self):
7
- return self.GetSignedInteger ()
8
-
9
6
def __len__ (self):
10
7
' ' ' Return the number of element in a lldb.SBStructuredData object.' ' '
11
8
return self.GetSize ()
12
9
13
10
def __iter__ (self):
14
11
' ' ' Iterate over all the elements in a lldb.SBStructuredData object.' ' '
15
- return lldb_iter (self, ' GetSize' , ' GetItemAtIndex' )
12
+ data_type = self.GetType ()
13
+ if data_type == eStructuredDataTypeArray:
14
+ for i in range (self.GetSize ()):
15
+ yield self.GetItemAtIndex (i).dynamic
16
+ return
17
+ 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 %= count
32
+ return self.GetItemAtIndex (key).dynamic
33
+ 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).dynamic
38
+ else :
39
+ raise TypeError (f" cannot subscript {self.type_name(data_type)} type" )
40
+
41
+ def __bool__ (self):
42
+ data_type = self.GetType ()
43
+ if data_type == eStructuredDataTypeInvalid:
44
+ return False
45
+ elif data_type in (
46
+ eStructuredDataTypeArray,
47
+ eStructuredDataTypeDictionary,
48
+ ):
49
+ return self.GetSize () != 0
50
+ elif data_type != eStructuredDataTypeGeneric:
51
+ return bool (self.dynamic )
52
+ else :
53
+ raise TypeError (" cannot convert generic to bool" )
54
+
55
+ def __str__ (self):
56
+ data_type = self.GetType ()
57
+ if data_type in (
58
+ eStructuredDataTypeString,
59
+ eStructuredDataTypeInteger,
60
+ eStructuredDataTypeSignedInteger,
61
+ eStructuredDataTypeFloat,
62
+ ):
63
+ return str (self.dynamic )
64
+ else :
65
+ raise TypeError (f" cannot convert {self.type_name(data_type)} to string" )
66
+
67
+ def __int__ (self):
68
+ data_type = self.GetType ()
69
+ if data_type in (
70
+ eStructuredDataTypeInteger,
71
+ eStructuredDataTypeSignedInteger,
72
+ ):
73
+ return int (self.dynamic )
74
+ else :
75
+ raise TypeError (f" cannot convert {self.type_name(data_type)} to int" )
76
+
77
+ def __float__ (self):
78
+ data_type = self.GetType ()
79
+ if data_type in (
80
+ eStructuredDataTypeFloat,
81
+ eStructuredDataTypeInteger,
82
+ eStructuredDataTypeSignedInteger,
83
+ ):
84
+ return float (self.dynamic )
85
+ else :
86
+ raise TypeError (f" cannot convert {self.type_name(data_type)} to float" )
87
+
88
+ @property
89
+ def dynamic (self):
90
+ data_type = self.GetType ()
91
+ if data_type == eStructuredDataTypeNull:
92
+ return None
93
+ elif data_type == eStructuredDataTypeBoolean:
94
+ return self.GetBooleanValue ()
95
+ elif data_type == eStructuredDataTypeInteger:
96
+ return self.GetUnsignedIntegerValue ()
97
+ elif data_type == eStructuredDataTypeSignedInteger:
98
+ return self.GetSignedIntegerValue ()
99
+ elif data_type == eStructuredDataTypeFloat:
100
+ return self.GetFloatValue ()
101
+ elif data_type == eStructuredDataTypeString:
102
+ size = len (self) or 1023
103
+ return self.GetStringValue (size + 1 )
104
+ elif data_type == eStructuredDataTypeGeneric:
105
+ return self.GetGenericValue ()
106
+ else :
107
+ return self
108
+
109
+ @staticmethod
110
+ def type_name (t):
111
+ if t == eStructuredDataTypeNull:
112
+ return " null"
113
+ elif t == eStructuredDataTypeBoolean:
114
+ return " boolean"
115
+ elif t == eStructuredDataTypeInteger:
116
+ return " integer"
117
+ elif t == eStructuredDataTypeSignedInteger:
118
+ return " integer"
119
+ elif t == eStructuredDataTypeFloat:
120
+ return " float"
121
+ elif t == eStructuredDataTypeString:
122
+ return " string"
123
+ elif t == eStructuredDataTypeArray:
124
+ return " array"
125
+ elif t == eStructuredDataTypeDictionary:
126
+ return " dictionary"
127
+ elif t == eStructuredDataTypeGeneric:
128
+ return " generic"
129
+ elif t == eStructuredDataTypeInvalid:
130
+ return " invalid"
131
+ else :
132
+ raise TypeError (f" unknown structured data type: {t}" )
16
133
%}
17
134
#endif
18
135
}
0 commit comments