| """ | |
| Test stepping into std::function | |
| """ | |
| import lldb | |
| from lldbsuite.test.decorators import * | |
| from lldbsuite.test.lldbtest import * | |
| from lldbsuite.test import lldbutil | |
| class LibCxxFunctionSteppingIntoCallableTestCase(TestBase): | |
| NO_DEBUG_INFO_TESTCASE = True | |
| @add_test_categories(["libc++"]) | |
| def test(self): | |
| """Test that std::function as defined by libc++ is correctly printed by LLDB""" | |
| self.build() | |
| self.main_source = "main.cpp" | |
| self.main_source_spec = lldb.SBFileSpec(self.main_source) | |
| self.source_foo_line = line_number(self.main_source, "// Source foo start line") | |
| self.source_lambda_f2_line = line_number( | |
| self.main_source, "// Source lambda used by f2 start line" | |
| ) | |
| self.source_lambda_f3_line = line_number( | |
| self.main_source, "// Source lambda used by f3 start line" | |
| ) | |
| self.source_bar_operator_line = line_number( | |
| self.main_source, "// Source Bar::operator()() start line" | |
| ) | |
| self.source_bar_add_num_line = line_number( | |
| self.main_source, "// Source Bar::add_num start line" | |
| ) | |
| self.source_main_invoking_f1 = line_number( | |
| self.main_source, "// Source main invoking f1" | |
| ) | |
| (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint( | |
| self, "// Set break point at this line.", self.main_source_spec | |
| ) | |
| thread.StepInto() | |
| self.assertEqual( | |
| thread.GetFrameAtIndex(0).GetLineEntry().GetLine(), | |
| self.source_main_invoking_f1, | |
| ) | |
| self.assertEqual( | |
| thread.GetFrameAtIndex(0).GetLineEntry().GetFileSpec().GetFilename(), | |
| self.main_source, | |
| ) | |
| thread.StepInto() | |
| self.assertEqual( | |
| thread.GetFrameAtIndex(0).GetLineEntry().GetLine(), self.source_foo_line | |
| ) | |
| self.assertEqual( | |
| thread.GetFrameAtIndex(0).GetLineEntry().GetFileSpec().GetFilename(), | |
| self.main_source, | |
| ) | |
| process.Continue() | |
| thread.StepInto() | |
| self.assertEqual( | |
| thread.GetFrameAtIndex(0).GetLineEntry().GetLine(), | |
| self.source_lambda_f2_line, | |
| ) | |
| self.assertEqual( | |
| thread.GetFrameAtIndex(0).GetLineEntry().GetFileSpec().GetFilename(), | |
| self.main_source, | |
| ) | |
| process.Continue() | |
| thread.StepInto() | |
| self.assertEqual( | |
| thread.GetFrameAtIndex(0).GetLineEntry().GetLine(), | |
| self.source_lambda_f3_line, | |
| ) | |
| self.assertEqual( | |
| thread.GetFrameAtIndex(0).GetLineEntry().GetFileSpec().GetFilename(), | |
| self.main_source, | |
| ) | |
| process.Continue() | |
| # TODO reenable this case when std::function formatter supports | |
| # general callable object case. | |
| # thread.StepInto() | |
| # self.assertEqual( thread.GetFrameAtIndex(0).GetLineEntry().GetLine(), self.source_bar_operator_line ) ; | |
| # self.assertEqual( thread.GetFrameAtIndex(0).GetLineEntry().GetFileSpec().GetFilename(), self.main_source) ; | |
| # process.Continue() | |
| thread.StepInto() | |
| self.assertEqual( | |
| thread.GetFrameAtIndex(0).GetLineEntry().GetLine(), | |
| self.source_bar_add_num_line, | |
| ) | |
| self.assertEqual( | |
| thread.GetFrameAtIndex(0).GetLineEntry().GetFileSpec().GetFilename(), | |
| self.main_source, | |
| ) | |
| process.Continue() |