Author: Ronan Lamy <[email protected]>
Branch: py3.5
Changeset: r88991:1c85b8127b59
Date: 2016-12-10 03:58 +0000
http://bitbucket.org/pypy/pypy/changeset/1c85b8127b59/
Log: Fix behaviour of PyObject_GetBuffer(<bytes>, ...)
diff --git a/pypy/module/cpyext/slotdefs.py b/pypy/module/cpyext/slotdefs.py
--- a/pypy/module/cpyext/slotdefs.py
+++ b/pypy/module/cpyext/slotdefs.py
@@ -358,7 +358,10 @@
ptr = pybuf.c_buf
size = pybuf.c_len
ndim = widen(pybuf.c_ndim)
- shape = [pybuf.c_shape[i] for i in range(ndim)]
+ if pybuf.c_shape:
+ shape = [pybuf.c_shape[i] for i in range(ndim)]
+ else:
+ shape = None
if pybuf.c_strides:
strides = [pybuf.c_strides[i] for i in range(ndim)]
else:
diff --git a/pypy/module/cpyext/test/test_bytesobject.py
b/pypy/module/cpyext/test/test_bytesobject.py
--- a/pypy/module/cpyext/test/test_bytesobject.py
+++ b/pypy/module/cpyext/test/test_bytesobject.py
@@ -3,13 +3,14 @@
from pypy.module.cpyext.test.test_api import BaseApiTest
from pypy.module.cpyext.test.test_cpyext import AppTestCpythonExtensionBase
from pypy.module.cpyext.bytesobject import new_empty_str, PyBytesObject
-from pypy.module.cpyext.api import PyObjectP, PyObject, Py_ssize_tP,
generic_cpy_call
-from pypy.module.cpyext.pyobject import Py_DecRef, from_ref, make_ref
+from pypy.module.cpyext.api import PyObjectP, PyObject, Py_ssize_tP,
generic_cpy_call, Py_buffer
+from pypy.module.cpyext.pyobject import Py_DecRef, from_ref, make_ref, as_pyobj
from pypy.module.cpyext.typeobjectdefs import PyTypeObjectPtr
import py
import sys
+
class AppTestBytesObject(AppTestCpythonExtensionBase):
def test_bytesobject(self):
module = self.import_extension('foo', [
@@ -290,3 +291,10 @@
w_obj = space.wrap(u"test")
assert api.PyBytes_FromObject(w_obj) is None
api.PyErr_Clear()
+
+ def test_suboffsets(self, space, api):
+ w_bytes = space.newbytes('1234')
+ view = lltype.malloc(Py_buffer, flavor='raw', zero=True)
+ flags = rffi.cast(rffi.INT_real, 0)
+ api.PyObject_GetBuffer(w_bytes, view, flags)
+ assert not view.c_suboffsets
diff --git a/pypy/module/cpyext/typeobject.py b/pypy/module/cpyext/typeobject.py
--- a/pypy/module/cpyext/typeobject.py
+++ b/pypy/module/cpyext/typeobject.py
@@ -505,10 +505,10 @@
header=None, error=-1)
def bytes_getbuffer(space, w_str, view, flags):
from pypy.module.cpyext.bytesobject import PyBytes_AsString
- view.c_obj = make_ref(space, w_str)
- view.c_buf = rffi.cast(rffi.VOIDP, PyBytes_AsString(space, view.c_obj))
- view.c_len = space.len_w(w_str)
- return 0
+ from pypy.module.cpyext.object import PyBuffer_FillInfo
+ c_buf = rffi.cast(rffi.VOIDP, PyBytes_AsString(space, w_str))
+ return PyBuffer_FillInfo(space, view, w_str, c_buf,
+ space.len_w(w_str), 1, flags)
def setup_bytes_buffer_procs(space, pto):
c_buf = lltype.malloc(PyBufferProcs, flavor='raw', zero=True)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit