""" Tests expression evaluation in context of an object. """ import lldb import lldbsuite.test.lldbutil as lldbutil from lldbsuite.test.lldbtest import * class ContextObjectTestCase(TestBase): mydir = TestBase.compute_mydir(__file__) def test_context_object(self): """Tests expression evaluation in context of an object.""" self.build() (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint(self, '// Break here', self.main_source_spec) frame = thread.GetFrameAtIndex(0) # # Test C++ struct variable # obj_val = frame.FindVariable("cpp_struct") self.assertTrue(obj_val.IsValid()) # Test an empty expression evaluation value = obj_val.EvaluateExpression("") self.assertFalse(value.IsValid()) self.assertFalse(value.GetError().Success()) # Test retrieveing of a field (not a local with the same name) value = obj_val.EvaluateExpression("field") self.assertTrue(value.IsValid()) self.assertTrue(value.GetError().Success()) self.assertEqual(value.GetValueAsSigned(), 1111) # Test functions evaluation value = obj_val.EvaluateExpression("function()") self.assertTrue(value.IsValid()) self.assertTrue(value.GetError().Success()) self.assertEqual(value.GetValueAsSigned(), 2222) # Test that we retrieve the right global value = obj_val.EvaluateExpression("global.field") self.assertTrue(value.IsValid()) self.assertTrue(value.GetError().Success()) self.assertEqual(value.GetValueAsSigned(), 1111) # # Test C++ union variable # obj_val = frame.FindVariable("cpp_union") self.assertTrue(obj_val.IsValid()) # Test retrieveing of a field value = obj_val.EvaluateExpression("field_int") self.assertTrue(value.IsValid()) self.assertTrue(value.GetError().Success()) self.assertEqual(value.GetValueAsSigned(), 5555) # # Test C++ scalar # obj_val = frame.FindVariable("cpp_scalar") self.assertTrue(obj_val.IsValid()) # Test an expression evaluation value = obj_val.EvaluateExpression("1") self.assertFalse(value.IsValid()) self.assertFalse(value.GetError().Success()) # # Test C++ array # obj_val = frame.FindVariable("cpp_array") self.assertTrue(obj_val.IsValid()) # Test an expression evaluation value = obj_val.EvaluateExpression("1") self.assertFalse(value.IsValid()) self.assertFalse(value.GetError().Success()) # Test retrieveing of an element's field value = obj_val.GetValueForExpressionPath("[7]").EvaluateExpression("field") self.assertTrue(value.IsValid()) self.assertTrue(value.GetError().Success()) self.assertEqual(value.GetValueAsSigned(), 1111) # # Test C++ pointer # obj_val = frame.FindVariable("cpp_pointer") self.assertTrue(obj_val.IsValid()) # Test an expression evaluation value = obj_val.EvaluateExpression("1") self.assertFalse(value.IsValid()) self.assertFalse(value.GetError().Success()) # Test retrieveing of a dereferenced object's field value = obj_val.Dereference().EvaluateExpression("field") self.assertTrue(value.IsValid()) self.assertTrue(value.GetError().Success()) self.assertEqual(value.GetValueAsSigned(), 1111) # # Test C++ computation result # obj_val = frame.EvaluateExpression("cpp_namespace::GetCppStruct()") self.assertTrue(obj_val.IsValid()) # Test an expression evaluation value = obj_val.EvaluateExpression("1") self.assertTrue(value.IsValid()) self.assertFalse(value.GetError().Success()) # # Test C++ computation result located in debuggee memory # obj_val = frame.EvaluateExpression("cpp_namespace::GetCppStructPtr()") self.assertTrue(obj_val.IsValid()) # Test an expression evaluation value = obj_val.EvaluateExpression("1") self.assertFalse(value.IsValid()) self.assertFalse(value.GetError().Success()) # Test retrieveing of a dereferenced object's field value = obj_val.Dereference().EvaluateExpression("field") self.assertTrue(value.IsValid()) self.assertTrue(value.GetError().Success()) self.assertEqual(value.GetValueAsSigned(), 1111) def setUp(self): TestBase.setUp(self) self.main_source = "main.cpp" self.main_source_spec = lldb.SBFileSpec(self.main_source)