- Masking out SBCommandReturnObject::Printf() from the Python layer because SWIG and varargs do not get along well.
It is replaced by a Print("str") call which is equivalent to Printf("%s","str")
- Providing file-like behavior for SBStream with appropriate extension write() and flush() calls, plus documenting that these are only meant and only exist for Python
Documenting the file-like behavior on our website



git-svn-id: https://llvm.org/svn/llvm-project/lldb/trunk@177877 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/scripts/Python/interface/SBCommandReturnObject.i b/scripts/Python/interface/SBCommandReturnObject.i
index e5f062c..e72c1e2 100644
--- a/scripts/Python/interface/SBCommandReturnObject.i
+++ b/scripts/Python/interface/SBCommandReturnObject.i
@@ -86,8 +86,14 @@
 	void
 	PutCString(const char* string, int len = -1);
 
-	size_t
-	Printf(const char* format, ...);
+    // wrapping the variadic Printf() with a plain Print()
+    // because it is hard to support varargs in SWIG bridgings
+    %extend {
+        void Print (const char* str)
+        {
+            self->Printf("%s", str);
+        }
+    }
 
 };
 
diff --git a/scripts/Python/python-extensions.swig b/scripts/Python/python-extensions.swig
index 84c719c..29eae6d 100644
--- a/scripts/Python/python-extensions.swig
+++ b/scripts/Python/python-extensions.swig
@@ -68,6 +68,12 @@
                 else
                     return PyString_FromString("");
         }
+        
+        /* the write() and flush() calls are not part of the SB API proper, and are solely for Python usage
+        they are meant to make an SBCommandReturnObject into a file-like object so that instructions of the sort
+        print >>sb_command_return_object, "something"
+        will work correctly */
+
         void lldb::SBCommandReturnObject::write (const char* str)
         {
             if (str)
@@ -272,6 +278,20 @@
                     return PyString_FromString("");
         }
 }
+%extend lldb::SBStream {
+        /* the write() and flush() calls are not part of the SB API proper, and are solely for Python usage
+        they are meant to make an SBStream into a file-like object so that instructions of the sort
+        print >>sb_stream, "something"
+        will work correctly */
+
+        void lldb::SBStream::write (const char* str)
+        {
+            if (str)
+                $self->Printf("%s",str);
+        }
+        void lldb::SBStream::flush ()
+        {}
+}
 %extend lldb::SBSymbol {
         PyObject *lldb::SBSymbol::__str__ (){
                 lldb::SBStream description;
diff --git a/www/python-reference.html b/www/python-reference.html
index 86edbc5..daf0b98 100755
--- a/www/python-reference.html
+++ b/www/python-reference.html
@@ -368,10 +368,9 @@
                 <b>lldb.SBCommandReturnObject</b>

             </td>

             <td class="content">

-                A return object where you can indicate the success or failure of your command. You can also

-                provide information for the command result by printing data into it. You can also just print

-                data as you normally would in a python script and the output will show up; this is useful for

-                logging, but the real output for your command should go in the result object.

+                A return object which encapsulates success/failure information for the command and output text

+                that needs to be printed as a result of the command. The plain Python "print" command also works but

+                text won't go in the result by default (it is useful as a temporary logging facility).

             </td>

         </tr>

         <tr>

@@ -387,6 +386,9 @@
             </td>

         </tr>

         </table>

+        <p>As a convenience, you can treat the result object as a Python file object, and say

+        print >>result, "my command does lots of cool stuff". SBCommandReturnObject and SBStream

+        both support this file-like behavior by providing write() and flush() calls at the Python layer.</p>

         <p>One other handy convenience when defining lldb command-line commands is the command

           <b>command script import</b> which will import a module specified by file path - so you

           don't have to change your PYTHONPATH for temporary scripts.  It also has another convenience