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