Author: Ronan Lamy <ronan.l...@gmail.com> Branch: Changeset: r89002:ced4d857b5dc Date: 2016-12-10 17:03 +0000 http://bitbucket.org/pypy/pypy/changeset/ced4d857b5dc/
Log: Simplify slot definition code by adding llslot() helper diff --git a/pypy/module/cpyext/pyobject.py b/pypy/module/cpyext/pyobject.py --- a/pypy/module/cpyext/pyobject.py +++ b/pypy/module/cpyext/pyobject.py @@ -27,9 +27,7 @@ def get_dealloc(self, space): from pypy.module.cpyext.typeobject import subtype_dealloc - return llhelper( - subtype_dealloc.api_func.functype, - subtype_dealloc.api_func.get_wrapper(space)) + return subtype_dealloc.api_func.get_llhelper(space) def allocate(self, space, w_type, itemcount=0): # similar to PyType_GenericAlloc? @@ -110,9 +108,7 @@ if tp_dealloc: def get_dealloc(self, space): - return llhelper( - tp_dealloc.api_func.functype, - tp_dealloc.api_func.get_wrapper(space)) + return tp_dealloc.api_func.get_llhelper(space) if tp_attach: def attach(self, space, pyobj, w_obj): 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 @@ -59,6 +59,9 @@ "expected %d-%d arguments, got %d", low, high, space.len_w(w_ob)) +def llslot(space, func): + return llhelper(func.api_func.functype, func.api_func.get_wrapper(space)) + def wrap_init(space, w_self, w_args, func, w_kwargs): func_init = rffi.cast(initproc, func) res = generic_cpy_call(space, func_init, w_self, w_args, w_kwargs) @@ -106,7 +109,7 @@ args_w = space.fixedview(w_args) arg3 = space.w_None if len(args_w) > 1: - arg3 = args_w[1] + arg3 = args_w[1] return generic_cpy_call(space, func_ternary, w_self, args_w[0], arg3) def wrap_ternaryfunc_r(space, w_self, w_args, func): @@ -121,7 +124,7 @@ Py_DecRef(space, ref) arg3 = space.w_None if len(args_w) > 1: - arg3 = args_w[1] + arg3 = args_w[1] return generic_cpy_call(space, func_ternary, args_w[0], w_self, arg3) @@ -322,7 +325,7 @@ self.strides = [1] else: self.strides = strides - self.ndim = ndim + self.ndim = ndim self.itemsize = itemsize self.readonly = readonly @@ -472,7 +475,6 @@ @func_renamer("cpyext_%s_%s" % (name.replace('.', '_'), typedef.name)) def slot_func(space, w_self): return space.call_function(slot_fn, w_self) - api_func = slot_func.api_func handled = True # binary functions @@ -499,7 +501,6 @@ @func_renamer("cpyext_%s_%s" % (name.replace('.', '_'), typedef.name)) def slot_func(space, w_self, w_arg): return space.call_function(slot_fn, w_self, w_arg) - api_func = slot_func.api_func handled = True # binary-with-Py_ssize_t-type @@ -517,7 +518,6 @@ @func_renamer("cpyext_%s_%s" % (name.replace('.', '_'), typedef.name)) def slot_func(space, w_self, arg): return space.call_function(slot_fn, w_self, space.wrap(arg)) - api_func = slot_func.api_func handled = True # ternary functions @@ -532,7 +532,6 @@ @func_renamer("cpyext_%s_%s" % (name.replace('.', '_'), typedef.name)) def slot_func(space, w_self, w_arg1, w_arg2): return space.call_function(slot_fn, w_self, w_arg1, w_arg2) - api_func = slot_func.api_func handled = True if handled: @@ -552,7 +551,7 @@ else: space.call_function(delattr_fn, w_self, w_name) return 0 - api_func = slot_tp_setattro.api_func + slot_func = slot_tp_setattro elif name == 'tp_getattro': getattr_fn = w_type.getdictvalue(space, '__getattribute__') if getattr_fn is None: @@ -562,7 +561,7 @@ @func_renamer("cpyext_tp_getattro_%s" % (typedef.name,)) def slot_tp_getattro(space, w_self, w_name): return space.call_function(getattr_fn, w_self, w_name) - api_func = slot_tp_getattro.api_func + slot_func = slot_tp_getattro elif name == 'tp_call': call_fn = w_type.getdictvalue(space, '__call__') if call_fn is None: @@ -574,7 +573,7 @@ args = Arguments(space, [w_self], w_stararg=w_args, w_starstararg=w_kwds) return space.call_args(call_fn, args) - api_func = slot_tp_call.api_func + slot_func = slot_tp_call elif name == 'tp_iternext': iternext_fn = w_type.getdictvalue(space, 'next') @@ -590,7 +589,7 @@ if not e.match(space, space.w_StopIteration): raise return None - api_func = slot_tp_iternext.api_func + slot_func = slot_tp_iternext elif name == 'tp_init': init_fn = w_type.getdictvalue(space, '__init__') @@ -605,7 +604,7 @@ w_stararg=w_args, w_starstararg=w_kwds) space.call_args(init_fn, args) return 0 - api_func = slot_tp_init.api_func + slot_func = slot_tp_init elif name == 'tp_new': new_fn = w_type.getdictvalue(space, '__new__') if new_fn is None: @@ -617,12 +616,12 @@ args = Arguments(space, [w_self], w_stararg=w_args, w_starstararg=w_kwds) return space.call_args(space.get(new_fn, w_self), args) - api_func = slot_tp_new.api_func + slot_func = slot_tp_new elif name == 'tp_as_buffer.c_bf_getbuffer': buff_fn = w_type.getdictvalue(space, '__buffer__') if buff_fn is None: return - @cpython_api([PyObject, Py_bufferP, rffi.INT_real], + @cpython_api([PyObject, Py_bufferP, rffi.INT_real], rffi.INT_real, header=None, error=-1) @func_renamer("cpyext_%s_%s" % (name.replace('.', '_'), typedef.name)) def buff_w(space, w_self, view, flags): @@ -646,14 +645,14 @@ return 0 # XXX remove this when it no longer crashes a translated PyPy return - api_func = buff_w.api_func + slot_func = buff_w else: # missing: tp_as_number.nb_nonzero, tp_as_number.nb_coerce # tp_as_sequence.c_sq_contains, tp_as_sequence.c_sq_length # richcmpfunc(s) return - return lambda: llhelper(api_func.functype, api_func.get_wrapper(space)) + return lambda: llslot(space, slot_func) PyWrapperFlag_KEYWORDS = 1 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 @@ -3,7 +3,6 @@ from rpython.rlib import jit from rpython.rlib.objectmodel import specialize from rpython.rlib.rstring import rsplit -from rpython.rtyper.annlowlevel import llhelper from rpython.rtyper.lltypesystem import rffi, lltype from pypy.interpreter.baseobjspace import W_Root, DescrMismatch @@ -28,7 +27,8 @@ PyObject, make_ref, create_ref, from_ref, get_typedescr, make_typedescr, track_reference, Py_DecRef, as_pyobj) from pypy.module.cpyext.slotdefs import ( - slotdefs_for_tp_slots, slotdefs_for_wrappers, get_slot_tp_function) + slotdefs_for_tp_slots, slotdefs_for_wrappers, get_slot_tp_function, + llslot) from pypy.module.cpyext.state import State from pypy.module.cpyext.structmember import PyMember_GetOne, PyMember_SetOne from pypy.module.cpyext.typeobjectdefs import ( @@ -260,8 +260,7 @@ if get_slot: slot_func_helper = get_slot() elif slot_func: - slot_func_helper = llhelper(slot_func.api_func.functype, - slot_func.api_func.get_wrapper(space)) + slot_func_helper = llslot(space, slot_func) if slot_func_helper is None: if WARN_ABOUT_MISSING_SLOT_FUNCTIONS: @@ -373,9 +372,8 @@ def setup_new_method_def(space): ptr = get_new_method_def(space) - ptr.c_ml_meth = rffi.cast(PyCFunction_typedef, - llhelper(tp_new_wrapper.api_func.functype, - tp_new_wrapper.api_func.get_wrapper(space))) + ptr.c_ml_meth = rffi.cast( + PyCFunction_typedef, llslot(space, tp_new_wrapper)) def add_tp_new_wrapper(space, dict_w, pto): if "__new__" in dict_w: @@ -498,8 +496,7 @@ def subtype_dealloc(space, obj): pto = obj.c_ob_type base = pto - this_func_ptr = llhelper(subtype_dealloc.api_func.functype, - subtype_dealloc.api_func.get_wrapper(space)) + this_func_ptr = llslot(space, subtype_dealloc) while base.c_tp_dealloc == this_func_ptr: base = base.c_tp_base assert base @@ -601,46 +598,31 @@ return c_buf = lltype.malloc(PyBufferProcs, flavor='raw', zero=True) lltype.render_immortal(c_buf) - c_buf.c_bf_getsegcount = llhelper(bf_segcount.api_func.functype, - bf_segcount.api_func.get_wrapper(space)) + c_buf.c_bf_getsegcount = llslot(space, bf_segcount) if space.is_w(w_type, space.w_str): # Special case: str doesn't support get_raw_address(), so we have a # custom get*buffer that instead gives the address of the char* in the # PyBytesObject*! - c_buf.c_bf_getreadbuffer = llhelper( - str_getreadbuffer.api_func.functype, - str_getreadbuffer.api_func.get_wrapper(space)) - c_buf.c_bf_getcharbuffer = llhelper( - str_getcharbuffer.api_func.functype, - str_getcharbuffer.api_func.get_wrapper(space)) + c_buf.c_bf_getreadbuffer = llslot(space, str_getreadbuffer) + c_buf.c_bf_getcharbuffer = llslot(space, str_getcharbuffer) elif space.is_w(w_type, space.w_unicode): # Special case: unicode doesn't support get_raw_address(), so we have a # custom get*buffer that instead gives the address of the char* in the # PyUnicodeObject*! - c_buf.c_bf_getreadbuffer = llhelper( - unicode_getreadbuffer.api_func.functype, - unicode_getreadbuffer.api_func.get_wrapper(space)) + c_buf.c_bf_getreadbuffer = llslot(space, unicode_getreadbuffer) elif space.is_w(w_type, space.w_buffer): # Special case: we store a permanent address on the cpyext wrapper, # so we'll reuse that. # Note: we could instead store a permanent address on the buffer object, # and use get_raw_address() - c_buf.c_bf_getreadbuffer = llhelper( - buf_getreadbuffer.api_func.functype, - buf_getreadbuffer.api_func.get_wrapper(space)) - c_buf.c_bf_getcharbuffer = llhelper( - buf_getcharbuffer.api_func.functype, - buf_getcharbuffer.api_func.get_wrapper(space)) + c_buf.c_bf_getreadbuffer = llslot(space, buf_getreadbuffer) + c_buf.c_bf_getcharbuffer = llslot(space, buf_getcharbuffer) else: # use get_raw_address() - c_buf.c_bf_getreadbuffer = llhelper(bf_getreadbuffer.api_func.functype, - bf_getreadbuffer.api_func.get_wrapper(space)) - c_buf.c_bf_getcharbuffer = llhelper(bf_getcharbuffer.api_func.functype, - bf_getcharbuffer.api_func.get_wrapper(space)) + c_buf.c_bf_getreadbuffer = llslot(space, bf_getreadbuffer) + c_buf.c_bf_getcharbuffer = llslot(space, bf_getcharbuffer) if bufspec == 'read-write': - c_buf.c_bf_getwritebuffer = llhelper( - bf_getwritebuffer.api_func.functype, - bf_getwritebuffer.api_func.get_wrapper(space)) + c_buf.c_bf_getwritebuffer = llslot(space, bf_getwritebuffer) pto.c_tp_as_buffer = c_buf pto.c_tp_flags |= Py_TPFLAGS_HAVE_GETCHARBUFFER pto.c_tp_flags |= Py_TPFLAGS_HAVE_NEWBUFFER @@ -704,9 +686,7 @@ pto.c_tp_dealloc = typedescr.get_dealloc(space) else: # for all subtypes, use subtype_dealloc() - pto.c_tp_dealloc = llhelper( - subtype_dealloc.api_func.functype, - subtype_dealloc.api_func.get_wrapper(space)) + pto.c_tp_dealloc = llslot(space, subtype_dealloc) if space.is_w(w_type, space.w_str): pto.c_tp_itemsize = 1 elif space.is_w(w_type, space.w_tuple): @@ -714,10 +694,8 @@ # buffer protocol setup_buffer_procs(space, w_type, pto) - pto.c_tp_free = llhelper(PyObject_Free.api_func.functype, - PyObject_Free.api_func.get_wrapper(space)) - pto.c_tp_alloc = llhelper(PyType_GenericAlloc.api_func.functype, - PyType_GenericAlloc.api_func.get_wrapper(space)) + pto.c_tp_free = llslot(space, PyObject_Free) + pto.c_tp_alloc = llslot(space, PyType_GenericAlloc) builder = space.fromcache(StaticObjectBuilder) if ((pto.c_tp_flags & Py_TPFLAGS_HEAPTYPE) != 0 and builder.cpyext_type_init is None): @@ -908,15 +886,11 @@ if not pto.c_tp_setattro: from pypy.module.cpyext.object import PyObject_GenericSetAttr - pto.c_tp_setattro = llhelper( - PyObject_GenericSetAttr.api_func.functype, - PyObject_GenericSetAttr.api_func.get_wrapper(space)) + pto.c_tp_setattro = llslot(space, PyObject_GenericSetAttr) if not pto.c_tp_getattro: from pypy.module.cpyext.object import PyObject_GenericGetAttr - pto.c_tp_getattro = llhelper( - PyObject_GenericGetAttr.api_func.functype, - PyObject_GenericGetAttr.api_func.get_wrapper(space)) + pto.c_tp_getattro = llslot(space, PyObject_GenericGetAttr) if w_obj.is_cpytype(): Py_DecRef(space, pto.c_tp_dict) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit