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

Reply via email to