Author: Brian Kearns <bdkea...@gmail.com> Branch: refactor-buffer-api Changeset: r70861:f71f35155a2b Date: 2014-03-21 13:23 -0400 http://bitbucket.org/pypy/pypy/changeset/f71f35155a2b/
Log: get tests passing diff --git a/pypy/interpreter/baseobjspace.py b/pypy/interpreter/baseobjspace.py --- a/pypy/interpreter/baseobjspace.py +++ b/pypy/interpreter/baseobjspace.py @@ -1345,6 +1345,11 @@ self.wrap('cannot convert negative integer ' 'to unsigned int')) + BUF_SIMPLE = 0 + BUF_FULL_RO = 1 + BUF_CONTIG = 2 + BUF_CONTIG_RO = 3 + def buffer_w(self, w_obj, flags): # New buffer interface, returns a buffer based on flags return w_obj.buffer_w(self, flags) @@ -1377,6 +1382,14 @@ raise return self.readbuf_w(w_obj).as_str() + def bufferchar_w(self, w_obj): + try: + return self.str_w(w_obj) + except OperationError, e: + if not e.match(self, self.w_TypeError): + raise + return self.charbuf_w(w_obj) + def str_or_None_w(self, w_obj): if self.is_w(w_obj, self.w_None): return None diff --git a/pypy/module/_file/interp_file.py b/pypy/module/_file/interp_file.py --- a/pypy/module/_file/interp_file.py +++ b/pypy/module/_file/interp_file.py @@ -468,7 +468,7 @@ """readinto() -> Undocumented. Don't use this; it may go away.""" # XXX not the most efficient solution as it doesn't avoid the copying space = self.space - rwbuffer = space.rwbuffer_w(w_rwbuffer) + rwbuffer = space.writebuf_w(w_rwbuffer) w_data = self.file_read(rwbuffer.getlength()) data = space.str_w(w_data) rwbuffer.setslice(0, data) diff --git a/pypy/module/_io/interp_bufferedio.py b/pypy/module/_io/interp_bufferedio.py --- a/pypy/module/_io/interp_bufferedio.py +++ b/pypy/module/_io/interp_bufferedio.py @@ -80,7 +80,7 @@ self._unsupportedoperation(space, "detach") def readinto_w(self, space, w_buffer): - rwbuffer = space.rwbuffer_w(w_buffer) + rwbuffer = space.buffer_w(w_buffer, space.BUF_CONTIG) length = rwbuffer.getlength() w_data = space.call_method(self, "read", space.wrap(length)) diff --git a/pypy/module/_io/interp_bytesio.py b/pypy/module/_io/interp_bytesio.py --- a/pypy/module/_io/interp_bytesio.py +++ b/pypy/module/_io/interp_bytesio.py @@ -41,7 +41,7 @@ def readinto_w(self, space, w_buffer): self._check_closed(space) - rwbuffer = space.rwbuffer_w(w_buffer) + rwbuffer = space.buffer_w(w_buffer, space.BUF_CONTIG) size = rwbuffer.getlength() output = self.read(size) diff --git a/pypy/module/_io/interp_fileio.py b/pypy/module/_io/interp_fileio.py --- a/pypy/module/_io/interp_fileio.py +++ b/pypy/module/_io/interp_fileio.py @@ -366,7 +366,7 @@ def readinto_w(self, space, w_buffer): self._check_closed(space) self._check_readable(space) - rwbuffer = space.rwbuffer_w(w_buffer) + rwbuffer = space.buffer_w(w_buffer, space.BUF_CONTIG) length = rwbuffer.getlength() try: buf = os.read(self.fd, length) diff --git a/pypy/module/_multiprocessing/interp_connection.py b/pypy/module/_multiprocessing/interp_connection.py --- a/pypy/module/_multiprocessing/interp_connection.py +++ b/pypy/module/_multiprocessing/interp_connection.py @@ -122,7 +122,7 @@ @unwrap_spec(offset='index') def recv_bytes_into(self, space, w_buffer, offset=0): - rwbuffer = space.rwbuffer_w(w_buffer) + rwbuffer = space.writebuf_w(w_buffer) length = rwbuffer.getlength() res, newbuf = self.do_recv_string( diff --git a/pypy/module/_rawffi/interp_rawffi.py b/pypy/module/_rawffi/interp_rawffi.py --- a/pypy/module/_rawffi/interp_rawffi.py +++ b/pypy/module/_rawffi/interp_rawffi.py @@ -16,6 +16,7 @@ from rpython.tool.sourcetools import func_with_new_name from rpython.rlib.rarithmetic import intmask, r_uint +from pypy.module._rawffi.buffer import RawFFIBuffer from pypy.module._rawffi.tracker import tracker TYPEMAP = { @@ -352,8 +353,13 @@ lltype.free(self.ll_buffer, flavor='raw') self.ll_buffer = lltype.nullptr(rffi.VOIDP.TO) - def buffer_w(self, space): - from pypy.module._rawffi.buffer import RawFFIBuffer + def buffer_w(self, space, flags): + return RawFFIBuffer(self) + + def readbuf_w(self, space): + return RawFFIBuffer(self) + + def writebuf_w(self, space): return RawFFIBuffer(self) def getrawsize(self): diff --git a/pypy/module/_rawffi/test/test__rawffi.py b/pypy/module/_rawffi/test/test__rawffi.py --- a/pypy/module/_rawffi/test/test__rawffi.py +++ b/pypy/module/_rawffi/test/test__rawffi.py @@ -1100,6 +1100,12 @@ assert a[3] == 'z' assert a[4] == 't' + b = memoryview(a) + assert len(b) == 10 + assert b[3] == 'z' + b[3] = 'x' + assert b[3] == 'x' + def test_union(self): import _rawffi longsize = _rawffi.sizeof('l') diff --git a/pypy/module/_socket/interp_socket.py b/pypy/module/_socket/interp_socket.py --- a/pypy/module/_socket/interp_socket.py +++ b/pypy/module/_socket/interp_socket.py @@ -419,7 +419,7 @@ @unwrap_spec(nbytes=int, flags=int) def recv_into_w(self, space, w_buffer, nbytes=0, flags=0): - rwbuffer = space.rwbuffer_w(w_buffer) + rwbuffer = space.writebuf_w(w_buffer) lgt = rwbuffer.getlength() if nbytes == 0 or nbytes > lgt: nbytes = lgt @@ -430,7 +430,7 @@ @unwrap_spec(nbytes=int, flags=int) def recvfrom_into_w(self, space, w_buffer, nbytes=0, flags=0): - rwbuffer = space.rwbuffer_w(w_buffer) + rwbuffer = space.writebuf_w(w_buffer) lgt = rwbuffer.getlength() if nbytes == 0 or nbytes > lgt: nbytes = lgt diff --git a/pypy/module/array/interp_array.py b/pypy/module/array/interp_array.py --- a/pypy/module/array/interp_array.py +++ b/pypy/module/array/interp_array.py @@ -132,7 +132,10 @@ self.len = 0 self.allocated = 0 - def buffer_w(self, space): + def readbuf_w(self, space): + return ArrayBuffer(self) + + def writebuf_w(self, space): return ArrayBuffer(self) def descr_append(self, space, w_x): diff --git a/pypy/module/cppyy/converter.py b/pypy/module/cppyy/converter.py --- a/pypy/module/cppyy/converter.py +++ b/pypy/module/cppyy/converter.py @@ -49,7 +49,7 @@ def get_rawbuffer(space, w_obj): try: - buf = space.buffer_w(w_obj) + buf = space.buffer_w(w_obj, space.BUF_SIMPLE) return rffi.cast(rffi.VOIDP, buf.get_raw_address()) except Exception: pass @@ -151,7 +151,7 @@ def to_memory(self, space, w_obj, w_value, offset): # copy the full array (uses byte copy for now) address = rffi.cast(rffi.CCHARP, self._get_raw_address(space, w_obj, offset)) - buf = space.buffer_w(w_value) + buf = space.buffer_w(w_value, space.BUF_SIMPLE) # TODO: report if too many items given? for i in range(min(self.size*self.typesize, buf.getlength())): address[i] = buf.getitem(i) @@ -192,7 +192,7 @@ # copy only the pointer value rawobject = get_rawobject_nonnull(space, w_obj) byteptr = rffi.cast(rffi.CCHARPP, capi.direct_ptradd(rawobject, offset)) - buf = space.buffer_w(w_value) + buf = space.buffer_w(w_value, space.BUF_SIMPLE) try: byteptr[0] = buf.get_raw_address() except ValueError: diff --git a/pypy/module/fcntl/interp_fcntl.py b/pypy/module/fcntl/interp_fcntl.py --- a/pypy/module/fcntl/interp_fcntl.py +++ b/pypy/module/fcntl/interp_fcntl.py @@ -209,7 +209,7 @@ if mutate_flag != 0: try: - rwbuffer = space.rwbuffer_w(w_arg) + rwbuffer = space.writebuf_w(w_arg) except OperationError, e: if not e.match(space, space.w_TypeError): raise diff --git a/pypy/module/marshal/interp_marshal.py b/pypy/module/marshal/interp_marshal.py --- a/pypy/module/marshal/interp_marshal.py +++ b/pypy/module/marshal/interp_marshal.py @@ -220,7 +220,7 @@ space = self.space if space.type(w_obj).is_heaptype(): try: - buf = space.buffer_w(w_obj) + buf = space.readbuf_w(w_obj) except OperationError as e: if not e.match(space, space.w_TypeError): raise diff --git a/pypy/module/micronumpy/boxes.py b/pypy/module/micronumpy/boxes.py --- a/pypy/module/micronumpy/boxes.py +++ b/pypy/module/micronumpy/boxes.py @@ -342,8 +342,14 @@ def descr_copy(self, space): return self.convert_to(space, self.get_dtype(space)) - def buffer_w(self, space): - return self.descr_ravel(space).buffer_w(space) + def buffer_w(self, space, flags): + return self.descr_ravel(space).buffer_w(space, flags) + + def readbuf_w(self, space): + return self.descr_ravel(space).readbuf_w(space) + + def charbuf_w(self, space): + return self.descr_ravel(space).charbuf_w(space) def descr_byteswap(self, space): return self.get_dtype(space).itemtype.byteswap(self) diff --git a/pypy/module/micronumpy/ndarray.py b/pypy/module/micronumpy/ndarray.py --- a/pypy/module/micronumpy/ndarray.py +++ b/pypy/module/micronumpy/ndarray.py @@ -602,11 +602,20 @@ raise OperationError(space.w_NotImplementedError, space.wrap( "ctypes not implemented yet")) - def buffer_w(self, space): + def buffer_w(self, space, flags): return self.implementation.get_buffer(space) + def readbuf_w(self, space): + return self.implementation.get_buffer(space) + + def writebuf_w(self, space): + return self.implementation.get_buffer(space) + + def charbuf_w(self, space): + return self.implementation.get_buffer(space).as_str() + def descr_get_data(self, space): - return space.newbuffer(self.buffer_w(space)) + return space.newbuffer(self.implementation.get_buffer(space)) @unwrap_spec(offset=int, axis1=int, axis2=int) def descr_diagonal(self, space, offset=0, axis1=0, axis2=1): @@ -1159,7 +1168,10 @@ raise OperationError(space.w_NotImplementedError, space.wrap("unsupported param")) - buf = space.buffer_w(w_buffer) + try: + buf = space.writebuf_w(w_buffer) + except OperationError: + buf = space.readbuf_w(w_buffer) try: raw_ptr = buf.get_raw_address() except ValueError: diff --git a/pypy/module/mmap/interp_mmap.py b/pypy/module/mmap/interp_mmap.py --- a/pypy/module/mmap/interp_mmap.py +++ b/pypy/module/mmap/interp_mmap.py @@ -17,7 +17,7 @@ self.space = space self.mmap = mmap_obj - def buffer_w(self, space): + def readbuf_w(self, space): self.check_valid() return MMapBuffer(self.space, self.mmap) diff --git a/pypy/objspace/fake/objspace.py b/pypy/objspace/fake/objspace.py --- a/pypy/objspace/fake/objspace.py +++ b/pypy/objspace/fake/objspace.py @@ -1,6 +1,7 @@ from rpython.annotator.model import SomeInstance, s_None from pypy.interpreter import argument, gateway from pypy.interpreter.baseobjspace import W_Root, ObjSpace, SpaceCache +from pypy.interpreter.buffer import Buffer from pypy.interpreter.typedef import TypeDef, GetSetProperty from pypy.objspace.std.stdtypedef import StdTypeDef from pypy.objspace.std.sliceobject import W_SliceObject @@ -295,8 +296,11 @@ ec._py_repr = None return ec - def buffer_w(self, w_obj): - from pypy.interpreter.buffer import Buffer + def readbuf_w(self, w_obj): + is_root(w_obj) + return Buffer() + + def writebuf_w(self, w_obj): is_root(w_obj) return Buffer() diff --git a/pypy/objspace/std/bytearrayobject.py b/pypy/objspace/std/bytearrayobject.py --- a/pypy/objspace/std/bytearrayobject.py +++ b/pypy/objspace/std/bytearrayobject.py @@ -27,8 +27,17 @@ """representation for debugging purposes""" return "%s(%s)" % (w_self.__class__.__name__, ''.join(w_self.data)) - def buffer_w(w_self, space): - return BytearrayBuffer(w_self.data) + def buffer_w(self, space, flags): + return BytearrayBuffer(self.data) + + def readbuf_w(self, space): + return BytearrayBuffer(self.data) + + def writebuf_w(self, space): + return BytearrayBuffer(self.data) + + def charbuf_w(self, space): + return ''.join(self.data) def _new(self, value): return W_BytearrayObject(_make_data(value)) @@ -50,10 +59,10 @@ return space.wrap(ord(character)) def _val(self, space): - return space.bufferstr_w(self) + return space.buffer_w(self, space.BUF_SIMPLE).as_str() def _op_val(self, space, w_other): - return space.buffer_w(w_other).as_str() + return space.buffer_w(w_other, space.BUF_SIMPLE).as_str() def _chr(self, char): assert len(char) == 1 @@ -432,7 +441,7 @@ def makebytearraydata_w(space, w_source): # String-like argument try: - buf = space.buffer_w(w_source) + buf = space.buffer_w(w_source, space.BUF_FULL_RO) except OperationError as e: if not e.match(space, space.w_TypeError): raise diff --git a/pypy/objspace/std/bytesobject.py b/pypy/objspace/std/bytesobject.py --- a/pypy/objspace/std/bytesobject.py +++ b/pypy/objspace/std/bytesobject.py @@ -442,8 +442,14 @@ def str_w(self, space): return self._value - def buffer_w(w_self, space): - return StringBuffer(w_self._value) + def buffer_w(self, space, flags): + return StringBuffer(self._value) + + def readbuf_w(self, space): + return StringBuffer(self._value) + + def charbuf_w(self, space): + return self._value def listview_bytes(self): return _create_list_from_bytes(self._value) @@ -471,8 +477,7 @@ return self._value def _op_val(self, space, w_other): - return space.bufferstr_w(w_other) - #return w_other._value + return space.bufferchar_w(w_other) def _chr(self, char): assert len(char) == 1 diff --git a/pypy/objspace/std/intobject.py b/pypy/objspace/std/intobject.py --- a/pypy/objspace/std/intobject.py +++ b/pypy/objspace/std/intobject.py @@ -692,7 +692,7 @@ else: # If object supports the buffer interface try: - buf = space.buffer_w(w_value) + buf = space.charbuf_w(w_value) except OperationError as e: if not e.match(space, space.w_TypeError): raise @@ -700,8 +700,7 @@ "int() argument must be a string or a number, " "not '%T'", w_value) else: - value, w_longval = _string_to_int_or_long(space, w_value, - buf.as_str()) + value, w_longval = _string_to_int_or_long(space, w_value, buf) else: base = space.int_w(w_base) diff --git a/pypy/objspace/std/longobject.py b/pypy/objspace/std/longobject.py --- a/pypy/objspace/std/longobject.py +++ b/pypy/objspace/std/longobject.py @@ -512,7 +512,7 @@ unicode_to_decimal_w(space, w_value)) else: try: - buf = space.buffer_w(w_value) + buf = space.charbuf_w(w_value) except OperationError, e: if not e.match(space, space.w_TypeError): raise @@ -520,8 +520,7 @@ "long() argument must be a string or a number, " "not '%T'", w_value) else: - return _string_to_w_long(space, w_longtype, w_value, - buf.as_str()) + return _string_to_w_long(space, w_longtype, w_value, buf) else: base = space.int_w(w_base) diff --git a/pypy/objspace/std/memoryview.py b/pypy/objspace/std/memoryview.py --- a/pypy/objspace/std/memoryview.py +++ b/pypy/objspace/std/memoryview.py @@ -40,9 +40,18 @@ assert isinstance(buf, buffer.Buffer) self.buf = buf - def buffer_w(self, space): + def buffer_w(self, space, flags): return self.buf + def readbuf_w(self, space): + return self.buf + + def writebuf_w(self, space): + return self.buf + + def charbuf_w(self, space): + return self.buf.as_str() + @staticmethod @unwrap_spec(offset=int, size=int) def descr_new_buffer(space, w_subtype, w_object, offset=0, size=-1): @@ -57,7 +66,7 @@ from pypy.interpreter.buffer import StringBuffer buf = StringBuffer(builder.build()) else: - buf = space.buffer_w(w_object) + buf = space.readbuf_w(w_object) if offset == 0 and size == -1: return W_Buffer(buf) @@ -175,20 +184,12 @@ assert isinstance(buf, buffer.Buffer) self.buf = buf - def buffer_w(self, space): - """ - Note that memoryview() is very inconsistent in CPython: it does not - support the buffer interface but does support the new buffer - interface: as a result, it is possible to pass memoryview to - e.g. socket.send() but not to file.write(). For simplicity and - consistency, in PyPy memoryview DOES support buffer(), which means - that it is accepted in more places than CPython. - """ + def buffer_w(self, space, flags): return self.buf @staticmethod def descr_new_memoryview(space, w_subtype, w_object): - return W_MemoryView(space.buffer_w(w_object)) + return W_MemoryView(space.buffer_w(w_object, space.BUF_FULL_RO)) def _make_descr__cmp(name): def descr__cmp(self, space, w_other): @@ -199,7 +200,7 @@ return space.wrap(getattr(operator, name)(str1, str2)) try: - buf = space.buffer_w(w_other) + buf = space.buffer_w(w_other, space.BUF_CONTIG_RO) except OperationError, e: if not e.match(space, space.w_TypeError): raise diff --git a/pypy/objspace/std/strbufobject.py b/pypy/objspace/std/strbufobject.py --- a/pypy/objspace/std/strbufobject.py +++ b/pypy/objspace/std/strbufobject.py @@ -36,7 +36,10 @@ def str_w(self, space): return self.force() - def buffer_w(self, space): + def buffer_w(self, space, flags): + return StringBuffer(self.force()) + + def readbuf_w(self, space): return StringBuffer(self.force()) def descr_len(self, space): diff --git a/pypy/objspace/std/test/test_bytesobject.py b/pypy/objspace/std/test/test_bytesobject.py --- a/pypy/objspace/std/test/test_bytesobject.py +++ b/pypy/objspace/std/test/test_bytesobject.py @@ -634,7 +634,8 @@ table = maketrans('abc', 'xyz') assert 'xyzxyz' == 'xyzabcdef'.translate(table, 'def') - assert 'xyzxyz' == 'xyzabcdef'.translate(memoryview(table), 'def') + exc = raises(TypeError, "'xyzabcdef'.translate(memoryview(table), 'def')") + assert 'character buffer' in str(exc.value) table = maketrans('a', 'A') assert 'Abc' == 'abc'.translate(table) diff --git a/pypy/objspace/std/test/test_strbufobject.py b/pypy/objspace/std/test/test_strbufobject.py --- a/pypy/objspace/std/test/test_strbufobject.py +++ b/pypy/objspace/std/test/test_strbufobject.py @@ -44,6 +44,11 @@ assert len(r) == 2 assert len(t) == 4 + def test_buffer(self): + s = 'a'.__add__('b') + assert buffer(s) == buffer('ab') + assert memoryview(s) == 'ab' + def test_add_strbuf(self): # make three strbuf objects s = 'a'.__add__('b') _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit