Revert the fix for #1548891, it broke backwards compatibility with arbitrary read buffers.

Fixes #1730114.
 (backport from rev. 56830)
This commit is contained in:
Georg Brandl 2007-08-08 13:03:45 +00:00
parent e51d1d11f0
commit eb4b738963
4 changed files with 12 additions and 24 deletions

View File

@ -78,6 +78,10 @@ Unlike the memory files implemented by the \refmodule{StringIO}
module, those provided by this module are not able to accept Unicode module, those provided by this module are not able to accept Unicode
strings that cannot be encoded as plain \ASCII{} strings. strings that cannot be encoded as plain \ASCII{} strings.
Calling \function{StringIO()} with a Unicode string parameter populates
the object with the buffer representation of the Unicode string, instead of
encoding the string.
Another difference from the \refmodule{StringIO} module is that calling Another difference from the \refmodule{StringIO} module is that calling
\function{StringIO()} with a string parameter creates a read-only object. \function{StringIO()} with a string parameter creates a read-only object.
Unlike an object created without a string parameter, it does not have Unlike an object created without a string parameter, it does not have

View File

@ -120,28 +120,6 @@ class TestStringIO(TestGenericStringIO):
class TestcStringIO(TestGenericStringIO): class TestcStringIO(TestGenericStringIO):
MODULE = cStringIO MODULE = cStringIO
def test_unicode(self):
if not test_support.have_unicode: return
# The cStringIO module converts Unicode strings to character
# strings when writing them to cStringIO objects.
# Check that this works.
f = self.MODULE.StringIO()
f.write(unicode(self._line[:5]))
s = f.getvalue()
self.assertEqual(s, 'abcde')
self.assertEqual(type(s), types.StringType)
f = self.MODULE.StringIO(unicode(self._line[:5]))
s = f.getvalue()
self.assertEqual(s, 'abcde')
self.assertEqual(type(s), types.StringType)
self.assertRaises(UnicodeEncodeError, self.MODULE.StringIO,
unicode('\xf4', 'latin-1'))
import sys import sys
if sys.platform.startswith('java'): if sys.platform.startswith('java'):
# Jython doesn't have a buffer object, so we just do a useless # Jython doesn't have a buffer object, so we just do a useless

View File

@ -26,6 +26,9 @@ Core and builtins
Library Library
------- -------
- Reverted the fix for bug #1548891 because it broke compatibility with
arbitrary read buffers. Added a note in the documentation.
- GB18030 codec now can encode additional two-byte characters that - GB18030 codec now can encode additional two-byte characters that
are missing in GBK. are missing in GBK.

View File

@ -665,8 +665,11 @@ newIobject(PyObject *s) {
char *buf; char *buf;
Py_ssize_t size; Py_ssize_t size;
if (PyObject_AsCharBuffer(s, (const char **)&buf, &size) != 0) if (PyObject_AsReadBuffer(s, (const char **)&buf, &size)) {
return NULL; PyErr_Format(PyExc_TypeError, "expected read buffer, %.200s found",
s->ob_type->tp_name);
return NULL;
}
self = PyObject_New(Iobject, &Itype); self = PyObject_New(Iobject, &Itype);
if (!self) return NULL; if (!self) return NULL;