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