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

Reply via email to