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 NO_DEBUG_INFO_TESTCASE = True 16 17 @add_test_categories(["libc++"]) 18 def test(self): 19 """Test that std::function as defined by libc++ is correctly printed by LLDB""" 20 self.build() 21 22 self.main_source = "main.cpp" 23 self.main_source_spec = lldb.SBFileSpec(self.main_source) 24 self.source_foo_line = line_number( 25 self.main_source, '// Source foo start line') 26 self.source_lambda_f2_line = line_number( 27 self.main_source, '// Source lambda used by f2 start line') 28 self.source_lambda_f3_line = line_number( 29 self.main_source, '// Source lambda used by f3 start line') 30 self.source_bar_operator_line = line_number( 31 self.main_source, '// Source Bar::operator()() start line') 32 self.source_bar_add_num_line = line_number( 33 self.main_source, '// Source Bar::add_num start line') 34 self.source_main_invoking_f1 = line_number( 35 self.main_source, '// Source main invoking f1') 36 37 (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint( 38 self, "// Set break point at this line.", self.main_source_spec) 39 40 thread.StepInto() 41 self.assertEqual( thread.GetFrameAtIndex(0).GetLineEntry().GetLine(), self.source_main_invoking_f1 ) ; 42 self.assertEqual( thread.GetFrameAtIndex(0).GetLineEntry().GetFileSpec().GetFilename(), self.main_source) ; 43 44 thread.StepInto() 45 self.assertEqual( thread.GetFrameAtIndex(0).GetLineEntry().GetLine(), self.source_foo_line ) ; 46 self.assertEqual( thread.GetFrameAtIndex(0).GetLineEntry().GetFileSpec().GetFilename(), self.main_source) ; 47 process.Continue() 48 49 thread.StepInto() 50 self.assertEqual( thread.GetFrameAtIndex(0).GetLineEntry().GetLine(), self.source_lambda_f2_line ) ; 51 self.assertEqual( thread.GetFrameAtIndex(0).GetLineEntry().GetFileSpec().GetFilename(), self.main_source) ; 52 process.Continue() 53 54 thread.StepInto() 55 self.assertEqual( thread.GetFrameAtIndex(0).GetLineEntry().GetLine(), self.source_lambda_f3_line ) ; 56 self.assertEqual( thread.GetFrameAtIndex(0).GetLineEntry().GetFileSpec().GetFilename(), self.main_source) ; 57 process.Continue() 58 59 # TODO reenable this case when std::function formatter supports 60 # general callable object case. 61 #thread.StepInto() 62 #self.assertEqual( thread.GetFrameAtIndex(0).GetLineEntry().GetLine(), self.source_bar_operator_line ) ; 63 #self.assertEqual( thread.GetFrameAtIndex(0).GetLineEntry().GetFileSpec().GetFilename(), self.main_source) ; 64 #process.Continue() 65 66 thread.StepInto() 67 self.assertEqual( thread.GetFrameAtIndex(0).GetLineEntry().GetLine(), self.source_bar_add_num_line ) ; 68 self.assertEqual( thread.GetFrameAtIndex(0).GetLineEntry().GetFileSpec().GetFilename(), self.main_source) ; 69 process.Continue() 70