lubgr created this revision. lubgr added a reviewer: jingham. lubgr added a project: LLDB.
This issue goes back to this SO answer <https://stackoverflow.com/a/54317534/9593596> by Jim Ingham, suggesting to fix the python bindings for RunCommandInterpreter. The reference parameters aren't properly handled by SWIG, but we can use the default typemaps library to generate the necessary glue. The new test captures this behavior (it fails without the adjustment in SBDebugger.i). This is my first patch, so let me know if any additional tests/background/info would be helpful. Repository: rLLDB LLDB https://reviews.llvm.org/D61602 Files: packages/Python/lldbsuite/test/python_api/interpreter/TestRunCommandInterpreterAPI.py scripts/interface/SBDebugger.i Index: scripts/interface/SBDebugger.i =================================================================== --- scripts/interface/SBDebugger.i +++ scripts/interface/SBDebugger.i @@ -423,6 +423,9 @@ lldb::SBTypeSynthetic GetSyntheticForType (lldb::SBTypeNameSpecifier); + %apply int& INOUT { int& num_errors }; + %apply bool& INOUT { bool& quit_requested }; + %apply bool& INOUT { bool& stopped_for_crash }; void RunCommandInterpreter (bool auto_handle_events, bool spawn_thread, Index: packages/Python/lldbsuite/test/python_api/interpreter/TestRunCommandInterpreterAPI.py =================================================================== --- /dev/null +++ packages/Python/lldbsuite/test/python_api/interpreter/TestRunCommandInterpreterAPI.py @@ -0,0 +1,38 @@ +"""Test the RunCommandInterpreter API.""" + +import os +import lldb +from lldbsuite.test.decorators import * +from lldbsuite.test.lldbtest import * + +class CommandRunInterpreterAPICase(TestBase): + + mydir = TestBase.compute_mydir(__file__) + + def setUp(self): + TestBase.setUp(self) + + self.stdin_path = self.getBuildArtifact("stdin.txt") + + with open(self.stdin_path, 'w') as input_handle: + input_handle.write("nonexistingcommand\nquit") + + with open(self.stdin_path, 'r') as input_handle: + self.dbg.SetInputFileHandle(input_handle, False) + + # No need to track the output + devnull = open(os.devnull, 'w') + self.dbg.SetOutputFileHandle(devnull, False) + self.dbg.SetErrorFileHandle(devnull, False) + + @add_test_categories(['pyapi']) + def test_run_session_with_error_and_quit(self): + """Run non-existing and quit command returns appropriate values""" + + n_errors, quit_requested, has_crashed = self.dbg.RunCommandInterpreter( + True, False, lldb.SBCommandInterpreterRunOptions(), 0, False, + False) + + self.assertGreater(n_errors, 0) + self.assertTrue(quit_requested) + self.assertFalse(has_crashed)
Index: scripts/interface/SBDebugger.i =================================================================== --- scripts/interface/SBDebugger.i +++ scripts/interface/SBDebugger.i @@ -423,6 +423,9 @@ lldb::SBTypeSynthetic GetSyntheticForType (lldb::SBTypeNameSpecifier); + %apply int& INOUT { int& num_errors }; + %apply bool& INOUT { bool& quit_requested }; + %apply bool& INOUT { bool& stopped_for_crash }; void RunCommandInterpreter (bool auto_handle_events, bool spawn_thread, Index: packages/Python/lldbsuite/test/python_api/interpreter/TestRunCommandInterpreterAPI.py =================================================================== --- /dev/null +++ packages/Python/lldbsuite/test/python_api/interpreter/TestRunCommandInterpreterAPI.py @@ -0,0 +1,38 @@ +"""Test the RunCommandInterpreter API.""" + +import os +import lldb +from lldbsuite.test.decorators import * +from lldbsuite.test.lldbtest import * + +class CommandRunInterpreterAPICase(TestBase): + + mydir = TestBase.compute_mydir(__file__) + + def setUp(self): + TestBase.setUp(self) + + self.stdin_path = self.getBuildArtifact("stdin.txt") + + with open(self.stdin_path, 'w') as input_handle: + input_handle.write("nonexistingcommand\nquit") + + with open(self.stdin_path, 'r') as input_handle: + self.dbg.SetInputFileHandle(input_handle, False) + + # No need to track the output + devnull = open(os.devnull, 'w') + self.dbg.SetOutputFileHandle(devnull, False) + self.dbg.SetErrorFileHandle(devnull, False) + + @add_test_categories(['pyapi']) + def test_run_session_with_error_and_quit(self): + """Run non-existing and quit command returns appropriate values""" + + n_errors, quit_requested, has_crashed = self.dbg.RunCommandInterpreter( + True, False, lldb.SBCommandInterpreterRunOptions(), 0, False, + False) + + self.assertGreater(n_errors, 0) + self.assertTrue(quit_requested) + self.assertFalse(has_crashed)
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits