""" Test lldb data formatter subsystem. """ import lldb from lldbsuite.test.decorators import * from lldbsuite.test.lldbtest import * from lldbsuite.test import lldbutil class LibCxxFunctionTestCase(TestBase): # Run frame var for a variable twice. Verify we do not hit the cache # the first time but do the second time. def run_frame_var_check_cache_use(self, variable, result_to_match, skip_find_function=False): self.runCmd("log timers reset") self.expect("frame variable " + variable, substrs=[variable + " = " + result_to_match]) if not skip_find_function: self.expect("log timers dump", substrs=["lldb_private::CompileUnit::FindFunction"]) self.runCmd("log timers reset") self.expect("frame variable " + variable, substrs=[variable + " = " + result_to_match]) self.expect("log timers dump", matching=False, substrs=["lldb_private::CompileUnit::FindFunction"]) @add_test_categories(["libc++"]) def test(self): """Test that std::function as defined by libc++ is correctly printed by LLDB""" self.build() self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET) bkpt = self.target().FindBreakpointByID( lldbutil.run_break_set_by_source_regexp( self, "Set break point at this line.")) self.runCmd("run", RUN_SUCCEEDED) # The stop reason of the thread should be breakpoint. self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT, substrs=['stopped', 'stop reason = breakpoint']) self.run_frame_var_check_cache_use("foo2_f", "Lambda in File main.cpp at Line 22") lldbutil.continue_to_breakpoint(self.process(), bkpt) self.run_frame_var_check_cache_use("add_num2_f", "Lambda in File main.cpp at Line 13") lldbutil.continue_to_breakpoint(self.process(), bkpt) self.run_frame_var_check_cache_use("f2", "Lambda in File main.cpp at Line 35") self.run_frame_var_check_cache_use("f3", "Lambda in File main.cpp at Line 39", True) # TODO reenable this case when std::function formatter supports # general callable object case. #self.run_frame_var_check_cache_use("f4", "Function in File main.cpp at Line 8") # These cases won't hit the cache at all but also don't require # an expensive lookup. self.expect("frame variable f1", substrs=['f1 = Function = foo(int, int)']) self.expect("frame variable f5", substrs=['f5 = Function = Bar::add_num(int) const'])