import lldb from lldbsuite.test.lldbtest import * from lldbsuite.test.decorators import * import lldbsuite.test.lldbutil as lldbutil class TestCase(TestBase): @skipUnlessDarwin def test(self): self.build() _, _, thread, _ = lldbutil.run_to_source_breakpoint( self, "break here", lldb.SBFileSpec("lib.cpp") ) frame = thread.selected_frame self.assertEqual(frame.GuessLanguage(), lldb.eLanguageTypeC_plus_plus_11) self.assertEqual(frame.name, "f()") # Test `help`. self.expect( "help demangle", substrs=[ "Demangle a C++ mangled name.", "Syntax: language cplusplus demangle [ ...]", ], ) # Run a `language cplusplus` command. self.expect("demangle _Z1fv", startstr="_Z1fv ---> f()") # Test prefix matching. self.expect("dem _Z1fv", startstr="_Z1fv ---> f()") # Select the objc caller. self.runCmd("up") frame = thread.selected_frame self.assertEqual(frame.GuessLanguage(), lldb.eLanguageTypeObjC_plus_plus) self.assertEqual(frame.name, "main") # Ensure `demangle` doesn't resolve from the objc frame. self.expect("help demangle", error=True) # Run a `language objc` command. self.expect( "tagged-pointer", substrs=[ "Commands for operating on Objective-C tagged pointers.", "Syntax: tagged-pointer []", "The following subcommands are supported:", "info -- Dump information on a tagged pointer.", ], ) # To ensure compatability with existing scripts, a language specific # command must not be invoked if another command (such as a python # command) has the language specific command name as its prefix. # # For example, this test loads a `tagged-pointer-collision` command. A # script could exist that invokes this command using its prefix # `tagged-pointer`, under the assumption that "tagged-pointer" uniquely # identifies the python command `tagged-pointer-collision`. self.runCmd("command script import commands.py") self.expect("tagged-pointer", startstr="ran tagged-pointer-collision")