]> granicus.if.org Git - python/commitdiff
SF bug 480215: softspace confused in nested print
authorTim Peters <tim.peters@gmail.com>
Sun, 24 Mar 2002 19:25:00 +0000 (19:25 +0000)
committerTim Peters <tim.peters@gmail.com>
Sun, 24 Mar 2002 19:25:00 +0000 (19:25 +0000)
This fixes the symptom, but PRINT_ITEM has no way to know what (if
anything) PyFile_WriteObject() writes unless the object being printed
is a string.  When the object isn't a string, this fix retains the
guess that softspace should be set after PyFile_WriteObject().
We might want to say that it's the job of filelike-object write methods
to leave the file's softspace in the correct state.  That would probably
be better -- but everyone relies on PRINT_ITEM to guess for them now.

Lib/test/test_softspace.py [new file with mode: 0644]
Python/ceval.c

diff --git a/Lib/test/test_softspace.py b/Lib/test/test_softspace.py
new file mode 100644 (file)
index 0000000..ba860eb
--- /dev/null
@@ -0,0 +1,14 @@
+import test_support
+import StringIO
+
+# SF bug 480215:  softspace confused in nested print
+f = StringIO.StringIO()
+class C:
+    def __str__(self):
+        print >> f, 'a'
+        return 'b'
+
+print >> f, C(), 'c ', 'd\t', 'e'
+print >> f, 'f', 'g'
+# In 2.2 & earlier, this printed ' a\nbc  d\te\nf g\n'
+test_support.vereq(f.getvalue(), 'a\nb c  d\te\nf g\n')
index 5e67b297f8d2162ca50e25aa85dfcd3f2a04e0db..97a734cf949cfb1ff98007057f03fac5e5507ebe 100644 (file)
@@ -1397,29 +1397,31 @@ eval_frame(PyFrameObject *f)
                                        err = -1;
                                }
                        }
-                       if (w != NULL && PyFile_SoftSpace(w, 1))
+                       if (w != NULL && PyFile_SoftSpace(w, 0))
                                err = PyFile_WriteString(" ", w);
                        if (err == 0)
                                err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
                        if (err == 0) {
-                               /* XXX move into writeobject() ? */
+                           /* XXX move into writeobject() ? */
                            if (PyString_Check(v)) {
                                char *s = PyString_AS_STRING(v);
                                int len = PyString_GET_SIZE(v);
-                               if (len > 0 &&
-                                   isspace(Py_CHARMASK(s[len-1])) &&
-                                   s[len-1] != ' ')
-                                       PyFile_SoftSpace(w, 0);
+                               if (len == 0 ||
+                                   !isspace(Py_CHARMASK(s[len-1])) ||
+                                   s[len-1] == ' ')
+                                       PyFile_SoftSpace(w, 1);
                            } 
 #ifdef Py_USING_UNICODE
                            else if (PyUnicode_Check(v)) {
                                Py_UNICODE *s = PyUnicode_AS_UNICODE(v);
                                int len = PyUnicode_GET_SIZE(v);
-                               if (len > 0 &&
-                                   Py_UNICODE_ISSPACE(s[len-1]) &&
-                                   s[len-1] != ' ')
-                                   PyFile_SoftSpace(w, 0);
+                               if (len == 0 ||
+                                   !Py_UNICODE_ISSPACE(s[len-1]) ||
+                                   s[len-1] == ' ')
+                                   PyFile_SoftSpace(w, 1);
                            }
+                           else
+                               PyFile_SoftSpace(w, 1);
 #endif
                        }
                        Py_DECREF(v);