Author: Ronan Lamy <ronan.l...@gmail.com>
Branch: py3.5
Changeset: r93934:235304efbb73
Date: 2018-03-01 21:10 +0000
http://bitbucket.org/pypy/pypy/changeset/235304efbb73/

Log:    Cleanup duplication between setup_buffer_procs() and
        make_bf_getbuffer() by killing the former

diff --git a/pypy/module/cpyext/buffer.py b/pypy/module/cpyext/buffer.py
--- a/pypy/module/cpyext/buffer.py
+++ b/pypy/module/cpyext/buffer.py
@@ -189,33 +189,6 @@
         decref(space, view.c_obj)
     return 0
 
-def fill_buffer(space, view, pybuf, py_obj):
-    view.c_buf = cts.cast('void *', pybuf.get_raw_address())
-    view.c_obj = py_obj
-    if py_obj:
-        incref(space, py_obj)
-    view.c_len = pybuf.getlength()
-    view.c_itemsize = pybuf.getitemsize()
-    rffi.setintfield(view, 'c_readonly', int(pybuf.readonly))
-    rffi.setintfield(view, 'c_ndim', pybuf.getndim())
-    view.c_format = rffi.str2charp(pybuf.getformat())
-    shape = pybuf.getshape()
-    if not shape:
-        view.c_shape = lltype.nullptr(Py_ssize_tP.TO)
-    else:
-        view.c_shape = cts.cast('Py_ssize_t*', view.c__shape)
-        for i, n in enumerate(shape):
-            view.c_shape[i] = n
-    strides = pybuf.getstrides()
-    if not strides:
-        view.c_strides = lltype.nullptr(Py_ssize_tP.TO)
-    else:
-        view.c_strides = cts.cast('Py_ssize_t*', view.c__strides)
-        for i, n in enumerate(strides):
-            view.c_strides[i] = n
-    view.c_suboffsets = lltype.nullptr(Py_ssize_tP.TO)
-    view.c_internal = lltype.nullptr(rffi.VOIDP.TO)
-
 DEFAULT_FMT = rffi.str2charp("B")
 
 @cpython_api([lltype.Ptr(Py_buffer), PyObject, rffi.VOIDP, Py_ssize_t,
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
@@ -688,12 +688,46 @@
         return space.call_args(space.get(new_fn, w_self), args)
     return slot_tp_new
 
+@slot_function([PyObject, lltype.Ptr(Py_buffer), rffi.INT_real],
+    rffi.INT_real, error=-1)
+def bytes_getbuffer(space, w_str, view, flags):
+    from pypy.module.cpyext.bytesobject import PyBytes_AsString
+    from pypy.module.cpyext.buffer 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 slot_from_buffer_w(space, typedef):
+    name = 'bf_getbuffer'
+    @slot_function([PyObject, Py_bufferP, rffi.INT_real],
+            rffi.INT_real, error=-1)
+    @func_renamer("cpyext_%s_%s" % (name, typedef.name))
+    def buff_w(space, w_self, c_view, flags):
+        w_obj = w_self
+        if c_view:
+            #like PyObject_GetBuffer
+            flags = widen(flags)
+            buf = space.buffer_w(w_obj, flags)
+            try:
+                c_view.c_buf = rffi.cast(rffi.VOIDP, buf.get_raw_address())
+                c_view.c_obj = make_ref(space, w_obj)
+            except ValueError:
+                s = buf.as_str()
+                w_s = space.newbytes(s)
+                c_view.c_obj = make_ref(space, w_s)
+                c_view.c_buf = rffi.cast(rffi.VOIDP, rffi.str2charp(
+                                        s, track_allocation=False))
+                rffi.setintfield(c_view, 'c_readonly', 1)
+            ret = fill_Py_buffer(space, buf, c_view)
+            return ret
+        return 0
+    return buff_w
+
 @slot_factory('tp_as_buffer.c_bf_getbuffer')
 def make_bf_getbuffer(space, typedef, name, attr):
     w_type = space.gettypeobject(typedef)
-    buff_fn = w_type.lookup('__buffer__')
-    if buff_fn is not None:
-        return slot_from___buffer__(space, typedef, buff_fn)
+    if space.is_w(w_type, space.w_bytes):
+        return bytes_getbuffer
     elif typedef.buffer:
         return slot_from_buffer_w(space, typedef)
     else:
@@ -739,59 +773,6 @@
     return slot_tp_descr_set
 
 
-def slot_from___buffer__(space, typedef, buff_fn):
-    name = 'bf_getbuffer'
-    @slot_function([PyObject, Py_bufferP, rffi.INT_real],
-            rffi.INT_real, error=-1)
-    @func_renamer("cpyext_%s_%s" % (name, typedef.name))
-    def buff_w(space, w_self, c_view, flags):
-        args = Arguments(space, [space.newint(flags)])
-        w_obj = space.call_args(space.get(buff_fn, w_self), args)
-        if c_view:
-            #like PyObject_GetBuffer
-            flags = widen(flags)
-            buf = space.buffer_w(w_obj, flags)
-            try:
-                c_view.c_buf = rffi.cast(rffi.VOIDP, buf.get_raw_address())
-                c_view.c_obj = make_ref(space, w_obj)
-            except ValueError:
-                s = buf.as_str()
-                w_s = space.newbytes(s)
-                c_view.c_obj = make_ref(space, w_s)
-                c_view.c_buf = rffi.cast(rffi.VOIDP, rffi.str2charp(
-                                        s, track_allocation=False))
-                rffi.setintfield(c_view, 'c_readonly', 1)
-            ret = fill_Py_buffer(space, buf, c_view)
-            return ret
-        return 0
-    return buff_w
-
-def slot_from_buffer_w(space, typedef):
-    name = 'bf_getbuffer'
-    @slot_function([PyObject, Py_bufferP, rffi.INT_real],
-            rffi.INT_real, error=-1)
-    @func_renamer("cpyext_%s_%s" % (name, typedef.name))
-    def buff_w(space, w_self, c_view, flags):
-        w_obj = w_self
-        if c_view:
-            #like PyObject_GetBuffer
-            flags = widen(flags)
-            buf = space.buffer_w(w_obj, flags)
-            try:
-                c_view.c_buf = rffi.cast(rffi.VOIDP, buf.get_raw_address())
-                c_view.c_obj = make_ref(space, w_obj)
-            except ValueError:
-                s = buf.as_str()
-                w_s = space.newbytes(s)
-                c_view.c_obj = make_ref(space, w_s)
-                c_view.c_buf = rffi.cast(rffi.VOIDP, rffi.str2charp(
-                                        s, track_allocation=False))
-                rffi.setintfield(c_view, 'c_readonly', 1)
-            ret = fill_Py_buffer(space, buf, c_view)
-            return ret
-        return 0
-    return buff_w
-
 missing_wrappers = ['wrap_indexargfunc', 'wrap_del']
 for name in missing_wrappers:
     assert name not in globals()
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
@@ -519,33 +519,6 @@
                    realize=type_realize,
                    dealloc=type_dealloc)
 
-@slot_function([PyObject, lltype.Ptr(Py_buffer), rffi.INT_real], 
rffi.INT_real, error=-1)
-def bytes_getbuffer(space, w_str, view, flags):
-    from pypy.module.cpyext.bytesobject import PyBytes_AsString
-    from pypy.module.cpyext.buffer 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)
-
-@slot_function([PyObject, lltype.Ptr(Py_buffer), rffi.INT_real], 
rffi.INT_real, error=-1)
-def bf_getbuffer(space, w_obj, view, flags):
-    from pypy.module.cpyext.buffer import fill_buffer
-    buf = space.buffer_w(w_obj, rffi.cast(lltype.Signed, flags))
-    fill_buffer(space, view, buf, as_pyobj(space, w_obj))
-    return 0
-
-def setup_buffer_procs(space, w_type, pto):
-    bufspec = w_type.layout.typedef.buffer
-    if not bufspec:
-        return
-    c_buf = lltype.malloc(PyBufferProcs, flavor='raw', zero=True)
-    lltype.render_immortal(c_buf)
-    if space.is_w(w_type, space.w_bytes):
-        c_buf.c_bf_getbuffer = llslot(space, bytes_getbuffer)
-    else:
-        c_buf.c_bf_getbuffer = llslot(space, bf_getbuffer)
-    pto.c_tp_as_buffer = c_buf
-
 @slot_function([PyObject], lltype.Void)
 def type_dealloc(space, obj):
     from pypy.module.cpyext.object import _dealloc
@@ -604,8 +577,6 @@
         pto.c_tp_itemsize = 1
     elif space.is_w(w_type, space.w_tuple):
         pto.c_tp_itemsize = rffi.sizeof(PyObject)
-    # buffer protocol
-    setup_buffer_procs(space, w_type, pto)
 
     state = space.fromcache(State)
     pto.c_tp_free = state.C.PyObject_Free
@@ -723,7 +694,6 @@
             pto.c_tp_as_buffer = base.c_tp_as_buffer
         if base.c_tp_as_buffer:
             # inherit base.c_tp_as_buffer functions not inherited from w_type
-            # note: builtin types are handled in setup_buffer_procs
             pto_as = pto.c_tp_as_buffer
             base_as = base.c_tp_as_buffer
             if not pto_as.c_bf_getbuffer:
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to