[pypy-commit] pypy PyBuffer-backport: progress
rlamy
pypy.commits at gmail.com
Mon May 8 14:14:30 EDT 2017
Author: Ronan Lamy <ronan.lamy at gmail.com>
Branch: PyBuffer-backport
Changeset: r91204:4f1fa0d61a99
Date: 2017-05-08 19:13 +0100
http://bitbucket.org/pypy/pypy/changeset/4f1fa0d61a99/
Log: progress
diff --git a/pypy/interpreter/baseobjspace.py b/pypy/interpreter/baseobjspace.py
--- a/pypy/interpreter/baseobjspace.py
+++ b/pypy/interpreter/baseobjspace.py
@@ -1504,10 +1504,15 @@
def readbuf_w(self, w_obj):
# Old buffer interface, returns a readonly buffer (PyObject_AsReadBuffer)
try:
+ return w_obj.buffer_w(self, self.BUF_SIMPLE).as_readbuf()
+ except OperationError:
+ self._getarg_error("convertible to a buffer", w_obj)
+ except BufferInterfaceNotFound:
+ pass
+ try:
return w_obj.readbuf_w(self)
except BufferInterfaceNotFound:
- raise oefmt(self.w_TypeError,
- "expected a readable buffer object")
+ self._getarg_error("convertible to a buffer", w_obj)
def writebuf_w(self, w_obj):
# Old buffer interface, returns a writeable buffer (PyObject_AsWriteBuffer)
@@ -1549,12 +1554,10 @@
if self.isinstance_w(w_obj, self.w_unicode):
return self.str(w_obj).readbuf_w(self)
try:
- return w_obj.buffer_w(self, 0)
- except BufferInterfaceNotFound:
- pass
- try:
- return w_obj.readbuf_w(self)
- except BufferInterfaceNotFound:
+ return self.readbuf_w(w_obj)
+ except OperationError as e:
+ if not e.match(self, self.w_TypeError):
+ raise
self._getarg_error("string or buffer", w_obj)
elif code == 's#':
if self.isinstance_w(w_obj, self.w_bytes):
diff --git a/pypy/module/_cffi_backend/cbuffer.py b/pypy/module/_cffi_backend/cbuffer.py
--- a/pypy/module/_cffi_backend/cbuffer.py
+++ b/pypy/module/_cffi_backend/cbuffer.py
@@ -4,6 +4,7 @@
from pypy.module._cffi_backend import cdataobj, ctypeptr, ctypearray
from pypy.module._cffi_backend import ctypestruct
from pypy.objspace.std.bufferobject import W_Buffer
+from pypy.interpreter.buffer import SimpleView
from rpython.rlib.buffer import Buffer
from rpython.rtyper.annlowlevel import llstr
@@ -60,7 +61,7 @@
if space.isinstance_w(w_other, space.w_unicode):
return space.w_NotImplemented
try:
- other_buf = space.buffer_w(w_other, space.BUF_SIMPLE)
+ other_buf = space.readbuf_w(w_other)
except OperationError as e:
if e.async(space):
raise
diff --git a/pypy/module/_cffi_backend/func.py b/pypy/module/_cffi_backend/func.py
--- a/pypy/module/_cffi_backend/func.py
+++ b/pypy/module/_cffi_backend/func.py
@@ -105,24 +105,10 @@
# ____________________________________________________________
def _fetch_as_read_buffer(space, w_x):
- # xxx do we really need to implement the same mess as in CPython 2.7
- # w.r.t. buffers and memoryviews??
- try:
- buf = space.readbuf_w(w_x)
- except OperationError as e:
- if not e.match(space, space.w_TypeError):
- raise
- buf = space.buffer_w(w_x, space.BUF_SIMPLE)
- return buf
+ return space.readbuf_w(w_x)
def _fetch_as_write_buffer(space, w_x):
- try:
- buf = space.writebuf_w(w_x)
- except OperationError as e:
- if not e.match(space, space.w_TypeError):
- raise
- buf = space.buffer_w(w_x, space.BUF_WRITABLE)
- return buf
+ return space.writebuf_w(w_x)
@unwrap_spec(w_ctype=ctypeobj.W_CType)
def from_buffer(space, w_ctype, w_x):
diff --git a/pypy/module/_rawffi/buffer.py b/pypy/module/_rawffi/buffer.py
--- a/pypy/module/_rawffi/buffer.py
+++ b/pypy/module/_rawffi/buffer.py
@@ -1,5 +1,6 @@
+from rpython.rtyper.lltypesystem import rffi
+
from rpython.rlib.buffer import Buffer
-from rpython.rtyper.lltypesystem import rffi
# XXX not the most efficient implementation
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
@@ -1,5 +1,6 @@
import sys
from pypy.interpreter.baseobjspace import W_Root
+from pypy.interpreter.buffer import SimpleView
from pypy.interpreter.error import OperationError, oefmt, wrap_oserror
from pypy.interpreter.gateway import interp2app, unwrap_spec
from pypy.interpreter.typedef import interp_attrproperty
@@ -371,13 +372,7 @@
self._ll_buffer = self.ll_buffer
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)
+ return SimpleView(RawFFIBuffer(self))
def getrawsize(self):
raise NotImplementedError("abstract base class")
diff --git a/pypy/module/struct/test/test_struct.py b/pypy/module/struct/test/test_struct.py
--- a/pypy/module/struct/test/test_struct.py
+++ b/pypy/module/struct/test/test_struct.py
@@ -382,6 +382,7 @@
raises(self.struct.error, self.struct.unpack, "i", b)
def test_pack_unpack_buffer(self):
+ import sys
import array
b = array.array('c', '\x00' * 19)
sz = self.struct.calcsize("ii")
@@ -391,9 +392,11 @@
self.struct.pack("ii", 17, 42) +
'\x00' * (19-sz-2))
exc = raises(TypeError, self.struct.pack_into, "ii", buffer(b), 0, 17, 42)
- assert str(exc.value) == "must be read-write buffer, not buffer"
+ if '__pypy__' in sys.modules:
+ assert str(exc.value) == "must be read-write buffer, not buffer"
exc = raises(TypeError, self.struct.pack_into, "ii", 'test', 0, 17, 42)
- assert str(exc.value) == "must be read-write buffer, not str"
+ if '__pypy__' in sys.modules:
+ assert str(exc.value) == "must be read-write buffer, not str"
exc = raises(self.struct.error, self.struct.pack_into, "ii", b[0:1], 0, 17, 42)
assert str(exc.value) == "pack_into requires a buffer of at least 8 bytes"
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
@@ -2,9 +2,9 @@
import py
-from pypy.objspace.std.bytesobject import (W_AbstractBytesObject,
- W_BytesObject, StringBuffer)
+from pypy.objspace.std.bytesobject import W_AbstractBytesObject, W_BytesObject
from pypy.interpreter.gateway import interp2app, unwrap_spec
+from pypy.interpreter.buffer import SimpleView, StringBuffer
from pypy.interpreter.error import OperationError
from rpython.rlib.rstring import StringBuilder
@@ -38,10 +38,7 @@
return self.force()
def buffer_w(self, space, flags):
- return StringBuffer(self.force())
-
- def readbuf_w(self, space):
- return StringBuffer(self.force())
+ return SimpleView(StringBuffer(self.force()))
def descr_len(self, space):
return space.newint(self.length)
More information about the pypy-commit
mailing list