[Lldb-commits] [lldb] r253487 - Fix some issues with swig & string conversion.

Zachary Turner via lldb-commits lldb-commits at lists.llvm.org
Wed Nov 18 10:40:16 PST 2015


Author: zturner
Date: Wed Nov 18 12:40:16 2015
New Revision: 253487

URL: http://llvm.org/viewvc/llvm-project?rev=253487&view=rev
Log:
Fix some issues with swig & string conversion.

This patch fixes two issues:

1) Popen needs to be used with universal_newlines=True by default.
   This elicits automatic decoding from bytes -> string in Py3,
   and has no negative effects in other Py versions.
2) The swig typemaps for converting between string and (char*, int)
   did not work correctly when the length of the string was 0,
   indicating an error.  In this case we would try to construct a
   string from uninitialized data.
3) Ironically, the bug mentioned in #2 led to a test passing on
   Windows that was actually broken, because the test was written
   such that the assertion was never even getting checked, so it
   passed by default.  So we additionally fix this test to also
   fail if the method errors.  By fixing this test it's now broken
   on Windows, so we also xfail it.

Modified:
    lldb/trunk/packages/Python/lldbsuite/test/functionalities/process_launch/TestProcessLaunch.py
    lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/virtual/TestVirtual.py
    lldb/trunk/packages/Python/lldbsuite/test/lldbtest.py
    lldb/trunk/scripts/Python/python-typemaps.swig

Modified: lldb/trunk/packages/Python/lldbsuite/test/functionalities/process_launch/TestProcessLaunch.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/functionalities/process_launch/TestProcessLaunch.py?rev=253487&r1=253486&r2=253487&view=diff
==============================================================================
--- lldb/trunk/packages/Python/lldbsuite/test/functionalities/process_launch/TestProcessLaunch.py (original)
+++ lldb/trunk/packages/Python/lldbsuite/test/functionalities/process_launch/TestProcessLaunch.py Wed Nov 18 12:40:16 2015
@@ -192,10 +192,16 @@ class ProcessLaunchTestCase(TestBase):
         process = target.LaunchSimple(None, ['EVIL=' + evil_var], self.get_process_working_directory())
         self.assertEqual(process.GetState(), lldb.eStateExited, PROCESS_EXITED)
 
-        out = process.GetSTDOUT(len(evil_var))[:len(evil_var)]
+        out = process.GetSTDOUT(len(evil_var))
+        self.assertIsNotNone(out, "Encountered an error reading the process's output")
+
+        out = out[:len(evil_var)]
         if out != evil_var:
             self.fail('The environment variable was mis-coded: %s\n' % repr(out))
 
-        newline = process.GetSTDOUT(1)[0]
+        newline = process.GetSTDOUT(1)
+        self.assertIsNotNone(newline, "Encountered an error reading the process's output")
+
+        newline = newline[0]
         if newline != '\r' and newline != '\n':
             self.fail('Garbage at end of environment variable')

Modified: lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/virtual/TestVirtual.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/virtual/TestVirtual.py?rev=253487&r1=253486&r2=253487&view=diff
==============================================================================
--- lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/virtual/TestVirtual.py (original)
+++ lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/virtual/TestVirtual.py Wed Nov 18 12:40:16 2015
@@ -32,6 +32,7 @@ class CppVirtualMadness(TestBase):
         self.line = line_number(self.source, '// Set first breakpoint here.')
 
     @expectedFailureIcc('llvm.org/pr16808') # lldb does not call the correct virtual function with icc
+    @expectedFailureAll(oslist=['windows'])
     def test_virtual_madness(self):
         """Test that expression works correctly with virtual inheritance as well as virtual function."""
         self.build()
@@ -60,6 +61,8 @@ class CppVirtualMadness(TestBase):
         # series of printf statements.
         stdout = process.GetSTDOUT(1024)
         
+        self.assertIsNotNone(stdout, "Encountered an error reading the process's output")
+
         # This golden list contains a list of "my_expr = 'value' pairs extracted
         # from the golden output.
         gl = []

Modified: lldb/trunk/packages/Python/lldbsuite/test/lldbtest.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/lldbtest.py?rev=253487&r1=253486&r2=253487&view=diff
==============================================================================
--- lldb/trunk/packages/Python/lldbsuite/test/lldbtest.py (original)
+++ lldb/trunk/packages/Python/lldbsuite/test/lldbtest.py Wed Nov 18 12:40:16 2015
@@ -388,7 +388,7 @@ def system(commands, **kwargs):
             raise ValueError('stdout argument not allowed, it will be overridden.')
         if 'shell' in kwargs and kwargs['shell']==False:
             raise ValueError('shell=False not allowed')
-        process = Popen(shellCommand, stdout=PIPE, stderr=PIPE, shell=True, **kwargs)
+        process = Popen(shellCommand, stdout=PIPE, stderr=PIPE, shell=True, universal_newlines=True, **kwargs)
         pid = process.pid
         this_output, this_error = process.communicate()
         retcode = process.poll()

Modified: lldb/trunk/scripts/Python/python-typemaps.swig
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/scripts/Python/python-typemaps.swig?rev=253487&r1=253486&r2=253487&view=diff
==============================================================================
--- lldb/trunk/scripts/Python/python-typemaps.swig (original)
+++ lldb/trunk/scripts/Python/python-typemaps.swig Wed Nov 18 12:40:16 2015
@@ -151,8 +151,14 @@
 // See also SBThread::GetStopDescription.
 %typemap(argout) (char *dst, size_t dst_len) {
    Py_XDECREF($result);   /* Blow away any previous result */
-   lldb_private::PythonString str($1);
-   $result = str.release();
+   if (result == 0) {
+      $result = Py_None;
+      Py_INCREF($result);
+   } else {
+      llvm::StringRef ref(static_cast<const char*>($1), result);
+      lldb_private::PythonString string(ref);
+      $result = string.release();
+   }
    free($1);
 }
 
@@ -242,9 +248,14 @@
 // See also SBProcess::ReadMemory.
 %typemap(argout) (void *buf, size_t size) {
    Py_XDECREF($result);   /* Blow away any previous result */
-   llvm::StringRef ref(static_cast<const char*>($1), result);
-   lldb_private::PythonString string(ref);
-   $result = string.release();
+   if (result == 0) {
+      $result = Py_None;
+      Py_INCREF($result);
+   } else {
+      llvm::StringRef ref(static_cast<const char*>($1), result);
+      lldb_private::PythonString string(ref);
+      $result = string.release();
+   }
    free($1);
 }
 




More information about the lldb-commits mailing list