Author: Ronan Lamy <[email protected]>
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
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit