1""" 2Test stepping into std::function 3""" 4 5 6 7import lldb 8from lldbsuite.test.decorators import * 9from lldbsuite.test.lldbtest import * 10from lldbsuite.test import lldbutil 11 12 13class LibCxxFunctionSteppingIntoCallableTestCase(TestBase): 14 15 mydir = TestBase.compute_mydir(__file__) 16 17 NO_DEBUG_INFO_TESTCASE = True 18 19 @add_test_categories(["libc++"]) 20 def test(self): 21 """Test that std::function as defined by libc++ is correctly printed by LLDB""" 22 self.build() 23 24 self.main_source = "main.cpp" 25 self.main_source_spec = lldb.SBFileSpec(self.main_source) 26 self.source_foo_line = line_number( 27 self.main_source, '// Source foo start line') 28 self.source_lambda_f2_line = line_number( 29 self.main_source, '// Source lambda used by f2 start line') 30 self.source_lambda_f3_line = line_number( 31 self.main_source, '// Source lambda used by f3 start line') 32 self.source_bar_operator_line = line_number( 33 self.main_source, '// Source Bar::operator()() start line') 34 self.source_bar_add_num_line = line_number( 35 self.main_source, '// Source Bar::add_num start line') 36 self.source_main_invoking_f1 = line_number( 37 self.main_source, '// Source main invoking f1') 38 39 (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint( 40 self, "// Set break point at this line.", self.main_source_spec) 41 42 thread.StepInto() 43 self.assertEqual( thread.GetFrameAtIndex(0).GetLineEntry().GetLine(), self.source_main_invoking_f1 ) ; 44 self.assertEqual( thread.GetFrameAtIndex(0).GetLineEntry().GetFileSpec().GetFilename(), self.main_source) ; 45 46 thread.StepInto() 47 self.assertEqual( thread.GetFrameAtIndex(0).GetLineEntry().GetLine(), self.source_foo_line ) ; 48 self.assertEqual( thread.GetFrameAtIndex(0).GetLineEntry().GetFileSpec().GetFilename(), self.main_source) ; 49 process.Continue() 50 51 thread.StepInto() 52 self.assertEqual( thread.GetFrameAtIndex(0).GetLineEntry().GetLine(), self.source_lambda_f2_line ) ; 53 self.assertEqual( thread.GetFrameAtIndex(0).GetLineEntry().GetFileSpec().GetFilename(), self.main_source) ; 54 process.Continue() 55 56 thread.StepInto() 57 self.assertEqual( thread.GetFrameAtIndex(0).GetLineEntry().GetLine(), self.source_lambda_f3_line ) ; 58 self.assertEqual( thread.GetFrameAtIndex(0).GetLineEntry().GetFileSpec().GetFilename(), self.main_source) ; 59 process.Continue() 60 61 # TODO reenable this case when std::function formatter supports 62 # general callable object case. 63 #thread.StepInto() 64 #self.assertEqual( thread.GetFrameAtIndex(0).GetLineEntry().GetLine(), self.source_bar_operator_line ) ; 65 #self.assertEqual( thread.GetFrameAtIndex(0).GetLineEntry().GetFileSpec().GetFilename(), self.main_source) ; 66 #process.Continue() 67 68 thread.StepInto() 69 self.assertEqual( thread.GetFrameAtIndex(0).GetLineEntry().GetLine(), self.source_bar_add_num_line ) ; 70 self.assertEqual( thread.GetFrameAtIndex(0).GetLineEntry().GetFileSpec().GetFilename(), self.main_source) ; 71 process.Continue() 72