| """ |
| 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() |