199451b44SJordan Rupprecht""" 299451b44SJordan RupprechtTests expression evaluation in context of an object. 399451b44SJordan Rupprecht""" 499451b44SJordan Rupprecht 599451b44SJordan Rupprechtimport lldb 699451b44SJordan Rupprechtimport lldbsuite.test.lldbutil as lldbutil 799451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import * 899451b44SJordan Rupprecht 999451b44SJordan Rupprecht 10*2238dcc3SJonas Devlieghereclass ContextObjectTestCase(TestBase): 1199451b44SJordan Rupprecht def test_context_object(self): 1299451b44SJordan Rupprecht """Tests expression evaluation in context of an object.""" 1399451b44SJordan Rupprecht self.build() 1499451b44SJordan Rupprecht 15*2238dcc3SJonas Devlieghere (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint( 16*2238dcc3SJonas Devlieghere self, "// Break here", self.main_source_spec 17*2238dcc3SJonas Devlieghere ) 1899451b44SJordan Rupprecht frame = thread.GetFrameAtIndex(0) 1999451b44SJordan Rupprecht 2099451b44SJordan Rupprecht # 216a85b9d1SEmre Kultursay # Test C++ struct variable and reference-to-struct variable 2299451b44SJordan Rupprecht # 236a85b9d1SEmre Kultursay for obj in "cpp_struct", "cpp_struct_ref": 246a85b9d1SEmre Kultursay obj_val = frame.FindVariable(obj) 2599451b44SJordan Rupprecht self.assertTrue(obj_val.IsValid()) 2699451b44SJordan Rupprecht 2799451b44SJordan Rupprecht # Test an empty expression evaluation 2899451b44SJordan Rupprecht value = obj_val.EvaluateExpression("") 2999451b44SJordan Rupprecht self.assertFalse(value.IsValid()) 3099451b44SJordan Rupprecht self.assertFalse(value.GetError().Success()) 3199451b44SJordan Rupprecht 3299451b44SJordan Rupprecht # Test retrieveing of a field (not a local with the same name) 3399451b44SJordan Rupprecht value = obj_val.EvaluateExpression("field") 3499451b44SJordan Rupprecht self.assertTrue(value.IsValid()) 3535674976SPavel Labath self.assertSuccess(value.GetError()) 3699451b44SJordan Rupprecht self.assertEqual(value.GetValueAsSigned(), 1111) 3799451b44SJordan Rupprecht 3899451b44SJordan Rupprecht # Test functions evaluation 3999451b44SJordan Rupprecht value = obj_val.EvaluateExpression("function()") 4099451b44SJordan Rupprecht self.assertTrue(value.IsValid()) 4135674976SPavel Labath self.assertSuccess(value.GetError()) 4299451b44SJordan Rupprecht self.assertEqual(value.GetValueAsSigned(), 2222) 4399451b44SJordan Rupprecht 4499451b44SJordan Rupprecht # Test that we retrieve the right global 4599451b44SJordan Rupprecht value = obj_val.EvaluateExpression("global.field") 4699451b44SJordan Rupprecht self.assertTrue(value.IsValid()) 4735674976SPavel Labath self.assertSuccess(value.GetError()) 4899451b44SJordan Rupprecht self.assertEqual(value.GetValueAsSigned(), 1111) 4999451b44SJordan Rupprecht 5099451b44SJordan Rupprecht # 5199451b44SJordan Rupprecht # Test C++ union variable 5299451b44SJordan Rupprecht # 5399451b44SJordan Rupprecht 5499451b44SJordan Rupprecht obj_val = frame.FindVariable("cpp_union") 5599451b44SJordan Rupprecht self.assertTrue(obj_val.IsValid()) 5699451b44SJordan Rupprecht 5799451b44SJordan Rupprecht # Test retrieveing of a field 5899451b44SJordan Rupprecht value = obj_val.EvaluateExpression("field_int") 5999451b44SJordan Rupprecht self.assertTrue(value.IsValid()) 6035674976SPavel Labath self.assertSuccess(value.GetError()) 6199451b44SJordan Rupprecht self.assertEqual(value.GetValueAsSigned(), 5555) 6299451b44SJordan Rupprecht 6399451b44SJordan Rupprecht # 6499451b44SJordan Rupprecht # Test C++ scalar 6599451b44SJordan Rupprecht # 6699451b44SJordan Rupprecht 6799451b44SJordan Rupprecht obj_val = frame.FindVariable("cpp_scalar") 6899451b44SJordan Rupprecht self.assertTrue(obj_val.IsValid()) 6999451b44SJordan Rupprecht 7099451b44SJordan Rupprecht # Test an expression evaluation 7199451b44SJordan Rupprecht value = obj_val.EvaluateExpression("1") 72dd5c5f72SAdrian Prantl self.assertTrue(value.IsValid()) 7399451b44SJordan Rupprecht self.assertFalse(value.GetError().Success()) 7499451b44SJordan Rupprecht 7599451b44SJordan Rupprecht # 7699451b44SJordan Rupprecht # Test C++ array 7799451b44SJordan Rupprecht # 7899451b44SJordan Rupprecht 7999451b44SJordan Rupprecht obj_val = frame.FindVariable("cpp_array") 8099451b44SJordan Rupprecht self.assertTrue(obj_val.IsValid()) 8199451b44SJordan Rupprecht 8299451b44SJordan Rupprecht # Test an expression evaluation 8399451b44SJordan Rupprecht value = obj_val.EvaluateExpression("1") 84dd5c5f72SAdrian Prantl self.assertTrue(value.IsValid()) 8599451b44SJordan Rupprecht self.assertFalse(value.GetError().Success()) 8699451b44SJordan Rupprecht 8799451b44SJordan Rupprecht # Test retrieveing of an element's field 8899451b44SJordan Rupprecht value = obj_val.GetValueForExpressionPath("[7]").EvaluateExpression("field") 8999451b44SJordan Rupprecht self.assertTrue(value.IsValid()) 9035674976SPavel Labath self.assertSuccess(value.GetError()) 9199451b44SJordan Rupprecht self.assertEqual(value.GetValueAsSigned(), 1111) 9299451b44SJordan Rupprecht 9399451b44SJordan Rupprecht # 9499451b44SJordan Rupprecht # Test C++ pointer 9599451b44SJordan Rupprecht # 9699451b44SJordan Rupprecht 9799451b44SJordan Rupprecht obj_val = frame.FindVariable("cpp_pointer") 9899451b44SJordan Rupprecht self.assertTrue(obj_val.IsValid()) 9999451b44SJordan Rupprecht 10099451b44SJordan Rupprecht # Test an expression evaluation 10199451b44SJordan Rupprecht value = obj_val.EvaluateExpression("1") 102dd5c5f72SAdrian Prantl self.assertTrue(value.IsValid()) 10399451b44SJordan Rupprecht self.assertFalse(value.GetError().Success()) 10499451b44SJordan Rupprecht 10599451b44SJordan Rupprecht # Test retrieveing of a dereferenced object's field 10699451b44SJordan Rupprecht value = obj_val.Dereference().EvaluateExpression("field") 10799451b44SJordan Rupprecht self.assertTrue(value.IsValid()) 10835674976SPavel Labath self.assertSuccess(value.GetError()) 10999451b44SJordan Rupprecht self.assertEqual(value.GetValueAsSigned(), 1111) 11099451b44SJordan Rupprecht 11199451b44SJordan Rupprecht # 11299451b44SJordan Rupprecht # Test C++ computation result 11399451b44SJordan Rupprecht # 11499451b44SJordan Rupprecht 11599451b44SJordan Rupprecht obj_val = frame.EvaluateExpression("cpp_namespace::GetCppStruct()") 11699451b44SJordan Rupprecht self.assertTrue(obj_val.IsValid()) 11799451b44SJordan Rupprecht 11899451b44SJordan Rupprecht # Test an expression evaluation 11999451b44SJordan Rupprecht value = obj_val.EvaluateExpression("1") 12099451b44SJordan Rupprecht self.assertTrue(value.IsValid()) 12199451b44SJordan Rupprecht self.assertFalse(value.GetError().Success()) 12299451b44SJordan Rupprecht 12399451b44SJordan Rupprecht # 12499451b44SJordan Rupprecht # Test C++ computation result located in debuggee memory 12599451b44SJordan Rupprecht # 12699451b44SJordan Rupprecht 12799451b44SJordan Rupprecht obj_val = frame.EvaluateExpression("cpp_namespace::GetCppStructPtr()") 12899451b44SJordan Rupprecht self.assertTrue(obj_val.IsValid()) 12999451b44SJordan Rupprecht 13099451b44SJordan Rupprecht # Test an expression evaluation 13199451b44SJordan Rupprecht value = obj_val.EvaluateExpression("1") 132dd5c5f72SAdrian Prantl self.assertTrue(value.IsValid()) 13399451b44SJordan Rupprecht self.assertFalse(value.GetError().Success()) 13499451b44SJordan Rupprecht 13599451b44SJordan Rupprecht # Test retrieveing of a dereferenced object's field 13699451b44SJordan Rupprecht value = obj_val.Dereference().EvaluateExpression("field") 13799451b44SJordan Rupprecht self.assertTrue(value.IsValid()) 13835674976SPavel Labath self.assertSuccess(value.GetError()) 13999451b44SJordan Rupprecht self.assertEqual(value.GetValueAsSigned(), 1111) 14099451b44SJordan Rupprecht 14199451b44SJordan Rupprecht def setUp(self): 14299451b44SJordan Rupprecht TestBase.setUp(self) 14399451b44SJordan Rupprecht 14499451b44SJordan Rupprecht self.main_source = "main.cpp" 14599451b44SJordan Rupprecht self.main_source_spec = lldb.SBFileSpec(self.main_source) 146