Author: Brian Kearns <bdkea...@gmail.com> Branch: refactor-buffer-api Changeset: r70923:bd46658a05eb Date: 2014-04-24 03:38 -0400 http://bitbucket.org/pypy/pypy/changeset/bd46658a05eb/
Log: unicodeobject has old buffer interface diff --git a/pypy/module/__pypy__/test/test_bytebuffer.py b/pypy/module/__pypy__/test/test_bytebuffer.py --- a/pypy/module/__pypy__/test/test_bytebuffer.py +++ b/pypy/module/__pypy__/test/test_bytebuffer.py @@ -25,3 +25,5 @@ assert str(b) == "\x00xy" + "\x00" * 7 b[4:8:2] = 'zw' assert str(b) == "\x00xy\x00z\x00w" + "\x00" * 3 + b[6:10] = u'#' + assert str(b) == "\x00xy\x00z\x00#" + "\x00" * 3 diff --git a/pypy/module/_io/test/test_bufferedio.py b/pypy/module/_io/test/test_bufferedio.py --- a/pypy/module/_io/test/test_bufferedio.py +++ b/pypy/module/_io/test/test_bufferedio.py @@ -139,6 +139,8 @@ raw = _io.FileIO(self.tmpfile) f = _io.BufferedReader(raw) assert f.readinto(a) == 5 + exc = raises(TypeError, f.readinto, u"hello") + assert str(exc.value) == "cannot use unicode as modifiable buffer" exc = raises(TypeError, f.readinto, buffer(b"hello")) assert str(exc.value) == "must be read-write buffer, not buffer" exc = raises(TypeError, f.readinto, memoryview(b"hello")) @@ -239,7 +241,8 @@ import _io raw = _io.FileIO(self.tmpfile, 'w') f = _io.BufferedWriter(raw) - f.write("abcd") + f.write("ab") + f.write(u"cd") f.close() assert self.readfile() == "abcd" diff --git a/pypy/module/_io/test/test_bytesio.py b/pypy/module/_io/test/test_bytesio.py --- a/pypy/module/_io/test/test_bytesio.py +++ b/pypy/module/_io/test/test_bytesio.py @@ -38,6 +38,8 @@ f = _io.BytesIO() assert f.write("") == 0 assert f.write("hello") == 5 + exc = raises(TypeError, f.write, u"lo") + assert str(exc.value) == "'unicode' does not have the buffer interface" import gc; gc.collect() assert f.getvalue() == "hello" f.close() @@ -97,6 +99,8 @@ a2 = bytearray('testing') assert b.readinto(a1) == 1 assert b.readinto(a2) == 4 + exc = raises(TypeError, b.readinto, u"hello") + assert str(exc.value) == "cannot use unicode as modifiable buffer" exc = raises(TypeError, b.readinto, buffer(b"hello")) assert str(exc.value) == "must be read-write buffer, not buffer" exc = raises(TypeError, b.readinto, memoryview(b"hello")) diff --git a/pypy/module/_io/test/test_fileio.py b/pypy/module/_io/test/test_fileio.py --- a/pypy/module/_io/test/test_fileio.py +++ b/pypy/module/_io/test/test_fileio.py @@ -82,7 +82,8 @@ import _io filename = self.tmpfile + '_w' f = _io.FileIO(filename, 'wb') - f.write("test") + f.write("te") + f.write(u"st") # try without flushing f2 = _io.FileIO(filename, 'rb') assert f2.read() == "test" @@ -135,6 +136,8 @@ a = bytearray('x' * 10) f = _io.FileIO(self.tmpfile, 'r+') assert f.readinto(a) == 10 + exc = raises(TypeError, f.readinto, u"hello") + assert str(exc.value) == "cannot use unicode as modifiable buffer" exc = raises(TypeError, f.readinto, buffer(b"hello")) assert str(exc.value) == "must be read-write buffer, not buffer" exc = raises(TypeError, f.readinto, memoryview(b"hello")) diff --git a/pypy/objspace/std/bufferobject.py b/pypy/objspace/std/bufferobject.py --- a/pypy/objspace/std/bufferobject.py +++ b/pypy/objspace/std/bufferobject.py @@ -37,18 +37,7 @@ @staticmethod @unwrap_spec(offset=int, size=int) def descr_new_buffer(space, w_subtype, w_object, offset=0, size=-1): - if space.isinstance_w(w_object, space.w_unicode): - # unicode objects support the old buffer interface - # but not the new buffer interface (change in python 2.7) - from rpython.rlib.rstruct.unichar import pack_unichar, UNICODE_SIZE - unistr = space.unicode_w(w_object) - builder = StringBuilder(len(unistr) * UNICODE_SIZE) - for unich in unistr: - pack_unichar(unich, builder) - buf = StringBuffer(builder.build()) - else: - buf = space.readbuf_w(w_object) - + buf = space.readbuf_w(w_object) if offset == 0 and size == -1: return W_Buffer(buf) # handle buffer slices diff --git a/pypy/objspace/std/unicodeobject.py b/pypy/objspace/std/unicodeobject.py --- a/pypy/objspace/std/unicodeobject.py +++ b/pypy/objspace/std/unicodeobject.py @@ -2,7 +2,8 @@ from rpython.rlib.objectmodel import ( compute_hash, compute_unique_id, import_from_mixin) -from rpython.rlib.rstring import UnicodeBuilder +from rpython.rlib.buffer import StringBuffer +from rpython.rlib.rstring import StringBuilder, UnicodeBuilder from rpython.rlib.runicode import ( make_unicode_escape_function, str_decode_ascii, str_decode_utf_8, unicode_encode_ascii, unicode_encode_utf_8) @@ -64,6 +65,17 @@ def unicode_w(self, space): return self._value + def readbuf_w(self, space): + from rpython.rlib.rstruct.unichar import pack_unichar, UNICODE_SIZE + builder = StringBuilder(len(self._value) * UNICODE_SIZE) + for unich in self._value: + pack_unichar(unich, builder) + return StringBuffer(builder.build()) + + def writebuf_w(self, space): + raise OperationError(space.w_TypeError, space.wrap( + "cannot use unicode as modifiable buffer")) + def listview_unicode(w_self): return _create_list_from_unicode(w_self._value) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit