import lldb from lldbsuite.test.decorators import * from lldbsuite.test.lldbtest import * from lldbsuite.test import lldbutil class TestCase(TestBase): def test(self): """ Tests that running the utility expression that retrieves the Objective-C class list works even when user-code contains functions with apparently conflicting identifiers (e.g. 'free') but that are not in the global scope. This is *not* supposed to test what happens when there are actual conflicts such as when a user somehow defined their own '::free' function. """ self.build() lldbutil.run_to_source_breakpoint( self, "// break here", lldb.SBFileSpec("main.mm") ) # First check our side effect variable is in its initial state. self.expect_expr("called_function", result_summary='"none"') # Get the (dynamic) type of our 'id' variable so that our Objective-C # runtime information is updated. str_val = self.expect_expr("str") dyn_val = str_val.GetDynamicValue(lldb.eDynamicCanRunTarget) dyn_type = dyn_val.GetTypeName() # Check our side effect variable which should still be in its initial # state if none of our trap functions were called. # If this is failing, then LLDB called one of the trap functions. self.expect_expr("called_function", result_summary='"none"') # Double check that our dynamic type is correct. This is done last # as the assert message from above is the more descriptive one (it # contains the unintentionally called function). self.assertEqual(dyn_type, "__NSCFConstantString *")