From: Tim Peters Date: Sun, 24 Mar 2002 19:25:00 +0000 (+0000) Subject: SF bug 480215: softspace confused in nested print X-Git-Tag: v2.3c1~6358 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8e5fd53be00001cbfa9368bd64f67cdef5d46771;p=python SF bug 480215: softspace confused in nested print 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. --- diff --git a/Lib/test/test_softspace.py b/Lib/test/test_softspace.py new file mode 100644 index 0000000000..ba860ebf85 --- /dev/null +++ b/Lib/test/test_softspace.py @@ -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') diff --git a/Python/ceval.c b/Python/ceval.c index 5e67b297f8..97a734cf94 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -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);