import lldb
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
from lldbsuite.test import lldbutil
class LibCxxStdFunctionRecognizerTestCase(TestBase):
NO_DEBUG_INFO_TESTCASE = True
@add_test_categories(["libc++"])
def test_frame_recognizer(self):
"""Test that implementation details of `std::invoke` are hidden"""
self.build()
(target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint(
self, "break here", lldb.SBFileSpec("main.cpp")
)
stop_cnt = 0
while process.GetState() != lldb.eStateExited:
stop_cnt += 1
self.assertTrue(
any(
f in thread.GetFrameAtIndex(0).GetFunctionName()
for f in ["consume_number", "add", "Callable"]
)
)
# Skip all hidden frames
frame_id = 1
while (
frame_id < thread.GetNumFrames()
and thread.GetFrameAtIndex(frame_id).IsHidden()
):
frame_id = frame_id + 1
# Expect `std::invoke` to be the direct parent
self.assertIn(
"::invoke", thread.GetFrameAtIndex(frame_id).GetFunctionName()
)
# And right above that, there should be the `main` frame
self.assertIn(
"main", thread.GetFrameAtIndex(frame_id + 1).GetFunctionName()
)
process.Continue()
self.assertEqual(stop_cnt, 4)