199451b44SJordan Rupprechtimport lldb 299451b44SJordan Rupprechtfrom lldbsuite.test.decorators import * 399451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import * 499451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil 599451b44SJordan Rupprecht 699451b44SJordan Rupprecht 7*2238dcc3SJonas Devlieghereclass ValueAPIEmptyClassTestCase(TestBase): 899451b44SJordan Rupprecht def test(self): 999451b44SJordan Rupprecht self.build() 1099451b44SJordan Rupprecht exe = self.getBuildArtifact("a.out") 11*2238dcc3SJonas Devlieghere line = line_number("main.cpp", "// Break at this line") 1299451b44SJordan Rupprecht 1399451b44SJordan Rupprecht # Create a target by the debugger. 1499451b44SJordan Rupprecht target = self.dbg.CreateTarget(exe) 1599451b44SJordan Rupprecht self.assertTrue(target, VALID_TARGET) 1699451b44SJordan Rupprecht 1799451b44SJordan Rupprecht # Create the breakpoint inside function 'main'. 18*2238dcc3SJonas Devlieghere breakpoint = target.BreakpointCreateByLocation("main.cpp", line) 1999451b44SJordan Rupprecht self.assertTrue(breakpoint, VALID_BREAKPOINT) 2099451b44SJordan Rupprecht 2199451b44SJordan Rupprecht # Now launch the process, and do not stop at entry point. 22*2238dcc3SJonas Devlieghere process = target.LaunchSimple(None, None, self.get_process_working_directory()) 2399451b44SJordan Rupprecht self.assertTrue(process, PROCESS_IS_VALID) 2499451b44SJordan Rupprecht 2599451b44SJordan Rupprecht # Get Frame #0. 26ce825e46SJonas Devlieghere self.assertState(process.GetState(), lldb.eStateStopped) 27*2238dcc3SJonas Devlieghere thread = lldbutil.get_stopped_thread(process, lldb.eStopReasonBreakpoint) 2899451b44SJordan Rupprecht self.assertTrue( 2999451b44SJordan Rupprecht thread.IsValid(), 30*2238dcc3SJonas Devlieghere "There should be a thread stopped due to breakpoint condition", 31*2238dcc3SJonas Devlieghere ) 3299451b44SJordan Rupprecht frame0 = thread.GetFrameAtIndex(0) 3399451b44SJordan Rupprecht 3499451b44SJordan Rupprecht # Verify that we can access to a frame variable with an empty class type 35*2238dcc3SJonas Devlieghere e = frame0.FindVariable("e") 3699451b44SJordan Rupprecht self.assertTrue(e.IsValid(), VALID_VARIABLE) 3799451b44SJordan Rupprecht self.DebugSBValue(e) 3899451b44SJordan Rupprecht self.assertEqual(e.GetNumChildren(), 0) 3999451b44SJordan Rupprecht 4099451b44SJordan Rupprecht # Verify that we can acces to a frame variable what is a pointer to an 4199451b44SJordan Rupprecht # empty class 42*2238dcc3SJonas Devlieghere ep = frame0.FindVariable("ep") 4399451b44SJordan Rupprecht self.assertTrue(ep.IsValid(), VALID_VARIABLE) 4499451b44SJordan Rupprecht self.DebugSBValue(ep) 4599451b44SJordan Rupprecht 4699451b44SJordan Rupprecht # Verify that we can dereference a pointer to an empty class 4799451b44SJordan Rupprecht epd = ep.Dereference() 4899451b44SJordan Rupprecht self.assertTrue(epd.IsValid(), VALID_VARIABLE) 4999451b44SJordan Rupprecht self.DebugSBValue(epd) 5099451b44SJordan Rupprecht self.assertEqual(epd.GetNumChildren(), 0) 51