xref: /llvm-project/lldb/test/API/commands/expression/context-object/TestContextObject.py (revision 2238dcc39358353cac21df75c3c3286ab20b8f53)
1"""
2Tests expression evaluation in context of an object.
3"""
4
5import lldb
6import lldbsuite.test.lldbutil as lldbutil
7from lldbsuite.test.lldbtest import *
8
9
10class ContextObjectTestCase(TestBase):
11    def test_context_object(self):
12        """Tests expression evaluation in context of an object."""
13        self.build()
14
15        (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint(
16            self, "// Break here", self.main_source_spec
17        )
18        frame = thread.GetFrameAtIndex(0)
19
20        #
21        # Test C++ struct variable and reference-to-struct variable
22        #
23        for obj in "cpp_struct", "cpp_struct_ref":
24            obj_val = frame.FindVariable(obj)
25            self.assertTrue(obj_val.IsValid())
26
27            # Test an empty expression evaluation
28            value = obj_val.EvaluateExpression("")
29            self.assertFalse(value.IsValid())
30            self.assertFalse(value.GetError().Success())
31
32            # Test retrieveing of a field (not a local with the same name)
33            value = obj_val.EvaluateExpression("field")
34            self.assertTrue(value.IsValid())
35            self.assertSuccess(value.GetError())
36            self.assertEqual(value.GetValueAsSigned(), 1111)
37
38            # Test functions evaluation
39            value = obj_val.EvaluateExpression("function()")
40            self.assertTrue(value.IsValid())
41            self.assertSuccess(value.GetError())
42            self.assertEqual(value.GetValueAsSigned(), 2222)
43
44            # Test that we retrieve the right global
45            value = obj_val.EvaluateExpression("global.field")
46            self.assertTrue(value.IsValid())
47            self.assertSuccess(value.GetError())
48            self.assertEqual(value.GetValueAsSigned(), 1111)
49
50        #
51        # Test C++ union variable
52        #
53
54        obj_val = frame.FindVariable("cpp_union")
55        self.assertTrue(obj_val.IsValid())
56
57        # Test retrieveing of a field
58        value = obj_val.EvaluateExpression("field_int")
59        self.assertTrue(value.IsValid())
60        self.assertSuccess(value.GetError())
61        self.assertEqual(value.GetValueAsSigned(), 5555)
62
63        #
64        # Test C++ scalar
65        #
66
67        obj_val = frame.FindVariable("cpp_scalar")
68        self.assertTrue(obj_val.IsValid())
69
70        # Test an expression evaluation
71        value = obj_val.EvaluateExpression("1")
72        self.assertTrue(value.IsValid())
73        self.assertFalse(value.GetError().Success())
74
75        #
76        # Test C++ array
77        #
78
79        obj_val = frame.FindVariable("cpp_array")
80        self.assertTrue(obj_val.IsValid())
81
82        # Test an expression evaluation
83        value = obj_val.EvaluateExpression("1")
84        self.assertTrue(value.IsValid())
85        self.assertFalse(value.GetError().Success())
86
87        # Test retrieveing of an element's field
88        value = obj_val.GetValueForExpressionPath("[7]").EvaluateExpression("field")
89        self.assertTrue(value.IsValid())
90        self.assertSuccess(value.GetError())
91        self.assertEqual(value.GetValueAsSigned(), 1111)
92
93        #
94        # Test C++ pointer
95        #
96
97        obj_val = frame.FindVariable("cpp_pointer")
98        self.assertTrue(obj_val.IsValid())
99
100        # Test an expression evaluation
101        value = obj_val.EvaluateExpression("1")
102        self.assertTrue(value.IsValid())
103        self.assertFalse(value.GetError().Success())
104
105        # Test retrieveing of a dereferenced object's field
106        value = obj_val.Dereference().EvaluateExpression("field")
107        self.assertTrue(value.IsValid())
108        self.assertSuccess(value.GetError())
109        self.assertEqual(value.GetValueAsSigned(), 1111)
110
111        #
112        # Test C++ computation result
113        #
114
115        obj_val = frame.EvaluateExpression("cpp_namespace::GetCppStruct()")
116        self.assertTrue(obj_val.IsValid())
117
118        # Test an expression evaluation
119        value = obj_val.EvaluateExpression("1")
120        self.assertTrue(value.IsValid())
121        self.assertFalse(value.GetError().Success())
122
123        #
124        # Test C++ computation result located in debuggee memory
125        #
126
127        obj_val = frame.EvaluateExpression("cpp_namespace::GetCppStructPtr()")
128        self.assertTrue(obj_val.IsValid())
129
130        # Test an expression evaluation
131        value = obj_val.EvaluateExpression("1")
132        self.assertTrue(value.IsValid())
133        self.assertFalse(value.GetError().Success())
134
135        # Test retrieveing of a dereferenced object's field
136        value = obj_val.Dereference().EvaluateExpression("field")
137        self.assertTrue(value.IsValid())
138        self.assertSuccess(value.GetError())
139        self.assertEqual(value.GetValueAsSigned(), 1111)
140
141    def setUp(self):
142        TestBase.setUp(self)
143
144        self.main_source = "main.cpp"
145        self.main_source_spec = lldb.SBFileSpec(self.main_source)
146