]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - packages/Python/lldbsuite/test/expression_command/formatters/TestFormatters.py
Vendor import of lldb trunk r338150:
[FreeBSD/FreeBSD.git] / packages / Python / lldbsuite / test / expression_command / formatters / TestFormatters.py
1 """
2 Test using LLDB data formatters with frozen objects coming from the expression parser.
3 """
4
5 from __future__ import print_function
6
7
8 import lldb
9 from lldbsuite.test.decorators import *
10 from lldbsuite.test.lldbtest import *
11 from lldbsuite.test import lldbutil
12
13
14 class ExprFormattersTestCase(TestBase):
15
16     mydir = TestBase.compute_mydir(__file__)
17
18     def setUp(self):
19         # Call super's setUp().
20         TestBase.setUp(self)
21         # Find the line number to break for main.cpp.
22         self.line = line_number('main.cpp',
23                                 '// Stop here')
24
25     @skipIfFreeBSD  # llvm.org/pr24691 skipping to avoid crashing the test runner
26     @expectedFailureAll(
27         oslist=['freebsd'],
28         bugnumber='llvm.org/pr19011 Newer Clang omits C1 complete object constructor')
29     @expectedFailureAll(oslist=["windows"], bugnumber="llvm.org/pr21765")
30     @skipIfTargetAndroid()  # skipping to avoid crashing the test runner
31     @expectedFailureAndroid('llvm.org/pr24691')  # we hit an assertion in clang
32     def test(self):
33         """Test expr + formatters for good interoperability."""
34         self.build()
35
36         # This is the function to remove the custom formats in order to have a
37         # clean slate for the next test case.
38         def cleanup():
39             self.runCmd('type summary clear', check=False)
40             self.runCmd('type synthetic clear', check=False)
41
42         # Execute the cleanup function during test case tear down.
43         self.addTearDownHook(cleanup)
44
45         """Test expr + formatters for good interoperability."""
46         self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET)
47
48         lldbutil.run_break_set_by_file_and_line(
49             self, "main.cpp", self.line, loc_exact=True)
50
51         self.runCmd("run", RUN_SUCCEEDED)
52         self.runCmd("command script import formatters.py")
53         self.runCmd("command script import foosynth.py")
54
55         if self.TraceOn():
56             self.runCmd("frame variable foo1 --show-types")
57             self.runCmd("frame variable foo1.b --show-types")
58             self.runCmd("frame variable foo1.b.b_ref --show-types")
59
60         self.expect(
61             "expression --show-types -- *(new foo(47))",
62             substrs=[
63                 '(int) a = 47',
64                 '(bar) b = {',
65                 '(int) i = 94',
66                 '(baz) b = {',
67                 '(int) k = 99'])
68
69         self.runCmd("type summary add -F formatters.foo_SummaryProvider foo")
70
71         self.expect("expression new int(12)",
72                     substrs=['(int *) $', ' = 0x'])
73
74         self.runCmd(
75             "type summary add -s \"${var%pointer} -> ${*var%decimal}\" \"int *\"")
76
77         self.expect("expression new int(12)",
78                     substrs=['(int *) $', '= 0x', ' -> 12'])
79
80         self.expect("expression foo1.a_ptr",
81                     substrs=['(int *) $', '= 0x', ' -> 13'])
82
83         self.expect(
84             "expression foo1",
85             substrs=[
86                 '(foo) $',
87                 ' a = 12',
88                 'a_ptr = ',
89                 ' -> 13',
90                 'i = 24',
91                 'i_ptr = ',
92                 ' -> 25'])
93
94         self.expect(
95             "expression --ptr-depth=1 -- new foo(47)",
96             substrs=[
97                 '(foo *) $',
98                 'a = 47',
99                 'a_ptr = ',
100                 ' -> 48',
101                 'i = 94',
102                 'i_ptr = ',
103                 ' -> 95'])
104
105         self.expect(
106             "expression foo2",
107             substrs=[
108                 '(foo) $',
109                 'a = 121',
110                 'a_ptr = ',
111                 ' -> 122',
112                 'i = 242',
113                 'i_ptr = ',
114                 ' -> 243'])
115
116         object_name = self.res.GetOutput()
117         object_name = object_name[7:]
118         object_name = object_name[0:object_name.find(' =')]
119
120         self.expect(
121             "frame variable foo2",
122             substrs=[
123                 '(foo)',
124                 'foo2',
125                 'a = 121',
126                 'a_ptr = ',
127                 ' -> 122',
128                 'i = 242',
129                 'i_ptr = ',
130                 ' -> 243'])
131
132         self.expect(
133             "expression $" +
134             object_name,
135             substrs=[
136                 '(foo) $',
137                 'a = 121',
138                 'a_ptr = ',
139                 ' -> 122',
140                 'i = 242',
141                 'i_ptr = ',
142                 ' -> 243',
143                 'h = 245',
144                 'k = 247'])
145
146         self.runCmd("type summary delete foo")
147         self.runCmd(
148             "type synthetic add --python-class foosynth.FooSyntheticProvider foo")
149
150         self.expect("expression --show-types -- $" + object_name,
151                     substrs=['(foo) $', ' = {', '(int) *i_ptr = 243'])
152
153         self.runCmd("n")
154         self.runCmd("n")
155
156         self.runCmd("type synthetic delete foo")
157         self.runCmd("type summary add -F formatters.foo_SummaryProvider foo")
158
159         self.expect(
160             "expression foo2",
161             substrs=[
162                 '(foo) $',
163                 'a = 7777',
164                 'a_ptr = ',
165                 ' -> 122',
166                 'i = 242',
167                 'i_ptr = ',
168                 ' -> 8888'])
169
170         self.expect("expression $" + object_name + '.a',
171                     substrs=['7777'])
172
173         self.expect("expression *$" + object_name + '.b.i_ptr',
174                     substrs=['8888'])
175
176         self.expect(
177             "expression $" +
178             object_name,
179             substrs=[
180                 '(foo) $',
181                 'a = 121',
182                 'a_ptr = ',
183                 ' -> 122',
184                 'i = 242',
185                 'i_ptr = ',
186                 ' -> 8888',
187                 'h = 245',
188                 'k = 247'])
189
190         self.runCmd("type summary delete foo")
191         self.runCmd(
192             "type synthetic add --python-class foosynth.FooSyntheticProvider foo")
193
194         self.expect("expression --show-types -- $" + object_name,
195                     substrs=['(foo) $', ' = {', '(int) *i_ptr = 8888'])
196
197         self.runCmd("n")
198
199         self.runCmd("type synthetic delete foo")
200         self.runCmd("type summary add -F formatters.foo_SummaryProvider foo")
201
202         self.expect(
203             "expression $" +
204             object_name,
205             substrs=[
206                 '(foo) $',
207                 'a = 121',
208                 'a_ptr = ',
209                 ' -> 122',
210                 'i = 242',
211                 'i_ptr = ',
212                 ' -> 8888',
213                 'k = 247'])
214
215         process = self.dbg.GetSelectedTarget().GetProcess()
216         thread = process.GetThreadAtIndex(0)
217         frame = thread.GetSelectedFrame()
218
219         frozen = frame.EvaluateExpression("$" + object_name + ".a_ptr")
220
221         a_data = frozen.GetPointeeData()
222
223         error = lldb.SBError()
224         self.assertTrue(
225             a_data.GetUnsignedInt32(
226                 error,
227                 0) == 122,
228             '*a_ptr = 122')
229
230         self.runCmd("n")
231         self.runCmd("n")
232         self.runCmd("n")
233
234         self.expect("frame variable numbers",
235                     substrs=['1', '2', '3', '4', '5'])
236
237         self.expect("expression numbers",
238                     substrs=['1', '2', '3', '4', '5'])
239
240         frozen = frame.EvaluateExpression("&numbers")
241
242         a_data = frozen.GetPointeeData(0, 1)
243
244         self.assertTrue(
245             a_data.GetUnsignedInt32(
246                 error,
247                 0) == 1,
248             'numbers[0] == 1')
249         self.assertTrue(
250             a_data.GetUnsignedInt32(
251                 error,
252                 4) == 2,
253             'numbers[1] == 2')
254         self.assertTrue(
255             a_data.GetUnsignedInt32(
256                 error,
257                 8) == 3,
258             'numbers[2] == 3')
259         self.assertTrue(
260             a_data.GetUnsignedInt32(
261                 error,
262                 12) == 4,
263             'numbers[3] == 4')
264         self.assertTrue(
265             a_data.GetUnsignedInt32(
266                 error,
267                 16) == 5,
268             'numbers[4] == 5')
269
270         frozen = frame.EvaluateExpression("numbers")
271
272         a_data = frozen.GetData()
273
274         self.assertTrue(
275             a_data.GetUnsignedInt32(
276                 error,
277                 0) == 1,
278             'numbers[0] == 1')
279         self.assertTrue(
280             a_data.GetUnsignedInt32(
281                 error,
282                 4) == 2,
283             'numbers[1] == 2')
284         self.assertTrue(
285             a_data.GetUnsignedInt32(
286                 error,
287                 8) == 3,
288             'numbers[2] == 3')
289         self.assertTrue(
290             a_data.GetUnsignedInt32(
291                 error,
292                 12) == 4,
293             'numbers[3] == 4')
294         self.assertTrue(
295             a_data.GetUnsignedInt32(
296                 error,
297                 16) == 5,
298             'numbers[4] == 5')