199451b44SJordan Rupprecht""" 299451b44SJordan RupprechtTest lldb Python API SBValue::Cast(SBType) for C++ types. 399451b44SJordan Rupprecht""" 499451b44SJordan Rupprecht 599451b44SJordan Rupprechtfrom __future__ import print_function 699451b44SJordan Rupprecht 799451b44SJordan Rupprecht 899451b44SJordan Rupprechtimport unittest2 999451b44SJordan Rupprechtimport lldb 1099451b44SJordan Rupprechtfrom lldbsuite.test.decorators import * 1199451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import * 1299451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil 1399451b44SJordan Rupprecht 1499451b44SJordan Rupprecht 1599451b44SJordan Rupprechtclass CppValueCastTestCase(TestBase): 1699451b44SJordan Rupprecht 1799451b44SJordan Rupprecht @skipIf(bugnumber="llvm.org/PR36714") 1899451b44SJordan Rupprecht @add_test_categories(['pyapi']) 1999451b44SJordan Rupprecht def test_value_cast_with_virtual_inheritance(self): 2099451b44SJordan Rupprecht """Test SBValue::Cast(SBType) API for C++ types with virtual inheritance.""" 2199451b44SJordan Rupprecht self.build(dictionary=self.d_virtual) 2299451b44SJordan Rupprecht self.setTearDownCleanup(dictionary=self.d_virtual) 2399451b44SJordan Rupprecht self.do_sbvalue_cast(self.exe_name) 2499451b44SJordan Rupprecht 2599451b44SJordan Rupprecht @add_test_categories(['pyapi']) 2699451b44SJordan Rupprecht def test_value_cast_with_regular_inheritance(self): 2799451b44SJordan Rupprecht """Test SBValue::Cast(SBType) API for C++ types with regular inheritance.""" 2899451b44SJordan Rupprecht self.build(dictionary=self.d_regular) 2999451b44SJordan Rupprecht self.setTearDownCleanup(dictionary=self.d_regular) 3099451b44SJordan Rupprecht self.do_sbvalue_cast(self.exe_name) 3199451b44SJordan Rupprecht 3299451b44SJordan Rupprecht def setUp(self): 3399451b44SJordan Rupprecht # Call super's setUp(). 3499451b44SJordan Rupprecht TestBase.setUp(self) 3599451b44SJordan Rupprecht 3699451b44SJordan Rupprecht # Find the line number to break for main.c. 3799451b44SJordan Rupprecht self.source = 'sbvalue-cast.cpp' 3899451b44SJordan Rupprecht self.line = line_number(self.source, '// Set breakpoint here.') 3999451b44SJordan Rupprecht self.exe_name = self.testMethodName 4099451b44SJordan Rupprecht self.d_virtual = { 4199451b44SJordan Rupprecht 'CXX_SOURCES': self.source, 4299451b44SJordan Rupprecht 'EXE': self.exe_name, 4399451b44SJordan Rupprecht 'CFLAGS_EXTRAS': '-DDO_VIRTUAL_INHERITANCE'} 4499451b44SJordan Rupprecht self.d_regular = {'CXX_SOURCES': self.source, 'EXE': self.exe_name} 4599451b44SJordan Rupprecht 4699451b44SJordan Rupprecht def do_sbvalue_cast(self, exe_name): 4799451b44SJordan Rupprecht """Test SBValue::Cast(SBType) API for C++ types.""" 4899451b44SJordan Rupprecht exe = self.getBuildArtifact(exe_name) 4999451b44SJordan Rupprecht 5099451b44SJordan Rupprecht # Create a target from the debugger. 5199451b44SJordan Rupprecht 5299451b44SJordan Rupprecht target = self.dbg.CreateTarget(exe) 5399451b44SJordan Rupprecht self.assertTrue(target, VALID_TARGET) 5499451b44SJordan Rupprecht 5599451b44SJordan Rupprecht # Set up our breakpoints: 5699451b44SJordan Rupprecht 5799451b44SJordan Rupprecht breakpoint = target.BreakpointCreateByLocation(self.source, self.line) 5899451b44SJordan Rupprecht self.assertTrue(breakpoint, VALID_BREAKPOINT) 5999451b44SJordan Rupprecht 6099451b44SJordan Rupprecht # Now launch the process, and do not stop at the entry point. 6199451b44SJordan Rupprecht process = target.LaunchSimple( 6299451b44SJordan Rupprecht None, None, self.get_process_working_directory()) 6399451b44SJordan Rupprecht 64*47c4c6a7SDave Lee self.assertState(process.GetState(), lldb.eStateStopped, 6599451b44SJordan Rupprecht PROCESS_STOPPED) 6699451b44SJordan Rupprecht 6799451b44SJordan Rupprecht # Find DerivedA and DerivedB types. 6899451b44SJordan Rupprecht typeA = target.FindFirstType('DerivedA') 6999451b44SJordan Rupprecht typeB = target.FindFirstType('DerivedB') 7099451b44SJordan Rupprecht self.DebugSBType(typeA) 7199451b44SJordan Rupprecht self.DebugSBType(typeB) 7299451b44SJordan Rupprecht self.assertTrue(typeA) 7399451b44SJordan Rupprecht self.assertTrue(typeB) 7499451b44SJordan Rupprecht error = lldb.SBError() 7599451b44SJordan Rupprecht 7699451b44SJordan Rupprecht # First stop is for DerivedA instance. 7799451b44SJordan Rupprecht threads = lldbutil.get_threads_stopped_at_breakpoint( 7899451b44SJordan Rupprecht process, breakpoint) 79619e2e09SDave Lee self.assertEqual(len(threads), 1) 8099451b44SJordan Rupprecht thread = threads[0] 8199451b44SJordan Rupprecht frame0 = thread.GetFrameAtIndex(0) 8299451b44SJordan Rupprecht 8399451b44SJordan Rupprecht tellerA = frame0.FindVariable('teller', lldb.eNoDynamicValues) 8499451b44SJordan Rupprecht self.DebugSBValue(tellerA) 8599451b44SJordan Rupprecht self.assertTrue(tellerA.GetChildMemberWithName( 8699451b44SJordan Rupprecht 'm_base_val').GetValueAsUnsigned(error, 0) == 20) 8799451b44SJordan Rupprecht 8899451b44SJordan Rupprecht if self.TraceOn(): 8999451b44SJordan Rupprecht for child in tellerA: 9099451b44SJordan Rupprecht print("child name:", child.GetName()) 9199451b44SJordan Rupprecht print(child) 9299451b44SJordan Rupprecht 9399451b44SJordan Rupprecht # Call SBValue.Cast() to obtain instanceA. 9499451b44SJordan Rupprecht instanceA = tellerA.Cast(typeA.GetPointerType()) 9599451b44SJordan Rupprecht self.DebugSBValue(instanceA) 9699451b44SJordan Rupprecht 9799451b44SJordan Rupprecht # Iterate through all the children and print their values. 9899451b44SJordan Rupprecht if self.TraceOn(): 9999451b44SJordan Rupprecht for child in instanceA: 10099451b44SJordan Rupprecht print("child name:", child.GetName()) 10199451b44SJordan Rupprecht print(child) 10299451b44SJordan Rupprecht a_member_val = instanceA.GetChildMemberWithName('m_a_val') 10399451b44SJordan Rupprecht self.DebugSBValue(a_member_val) 104619e2e09SDave Lee self.assertEqual(a_member_val.GetValueAsUnsigned(error, 0), 10) 10599451b44SJordan Rupprecht 10699451b44SJordan Rupprecht # Second stop is for DerivedB instance. 10799451b44SJordan Rupprecht threads = lldbutil.continue_to_breakpoint(process, breakpoint) 108619e2e09SDave Lee self.assertEqual(len(threads), 1) 10999451b44SJordan Rupprecht thread = threads[0] 11099451b44SJordan Rupprecht frame0 = thread.GetFrameAtIndex(0) 11199451b44SJordan Rupprecht 11299451b44SJordan Rupprecht tellerB = frame0.FindVariable('teller', lldb.eNoDynamicValues) 11399451b44SJordan Rupprecht self.DebugSBValue(tellerB) 11499451b44SJordan Rupprecht self.assertTrue(tellerB.GetChildMemberWithName( 11599451b44SJordan Rupprecht 'm_base_val').GetValueAsUnsigned(error, 0) == 12) 11699451b44SJordan Rupprecht 11799451b44SJordan Rupprecht if self.TraceOn(): 11899451b44SJordan Rupprecht for child in tellerB: 11999451b44SJordan Rupprecht print("child name:", child.GetName()) 12099451b44SJordan Rupprecht print(child) 12199451b44SJordan Rupprecht 12299451b44SJordan Rupprecht # Call SBValue.Cast() to obtain instanceB. 12399451b44SJordan Rupprecht instanceB = tellerB.Cast(typeB.GetPointerType()) 12499451b44SJordan Rupprecht self.DebugSBValue(instanceB) 12599451b44SJordan Rupprecht 12699451b44SJordan Rupprecht # Iterate through all the children and print their values. 12799451b44SJordan Rupprecht if self.TraceOn(): 12899451b44SJordan Rupprecht for child in instanceB: 12999451b44SJordan Rupprecht print("child name:", child.GetName()) 13099451b44SJordan Rupprecht print(child) 13199451b44SJordan Rupprecht b_member_val = instanceB.GetChildMemberWithName('m_b_val') 13299451b44SJordan Rupprecht self.DebugSBValue(b_member_val) 133619e2e09SDave Lee self.assertEqual(b_member_val.GetValueAsUnsigned(error, 0), 36) 134