@@ -3,16 +3,133 @@ STRING_EXTENSION_OUTSIDE(SBStructuredData)
33%extend lldb::SBStructuredData {
44#ifdef  SWIGPYTHON
55    %pythoncode%{
6-     def __int__ (self):
7-       return  self.GetSignedInteger ()
8- 
96    def __len__ (self):
107      ' ' ' Return the number of element in a lldb.SBStructuredData object.' ' ' 
118      return  self.GetSize ()
129
1310    def __iter__ (self):
1411        ' ' ' 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}" 
16133    %}
17134#endif 
18135}
0 commit comments