[pypy-commit] pypy cpyext-ext: fix for tp_new slot

mattip pypy.commits at gmail.com
Thu Mar 3 10:14:46 EST 2016


Author: mattip <matti.picus at gmail.com>
Branch: cpyext-ext
Changeset: r82675:3e9fab0f7ce6
Date: 2016-03-02 23:25 -0500
http://bitbucket.org/pypy/pypy/changeset/3e9fab0f7ce6/

Log:	fix for tp_new slot

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
@@ -318,17 +318,6 @@
 
     return space.wrap(generic_cpy_call(space, func_target, w_self, w_other))
 
- at cpython_api([PyTypeObjectPtr, PyObject, PyObject], PyObject, header=None)
-def slot_tp_new(space, type, w_args, w_kwds):
-    from pypy.module.cpyext.tupleobject import PyTuple_Check
-    pyo = rffi.cast(PyObject, type)
-    w_type = from_ref(space, pyo)
-    w_func = space.getattr(w_type, space.wrap("__new__"))
-    assert PyTuple_Check(space, w_args)
-    args_w = [w_type] + space.fixedview(w_args)
-    w_args_new = space.newtuple(args_w)
-    return space.call(w_func, w_args_new, w_kwds)
-
 from rpython.rlib.nonconst import NonConstant
 
 SLOTS = {}
@@ -463,7 +452,16 @@
             space.call_args(init_fn, args)
             return 0
         api_func = slot_tp_init.api_func
+    elif name == 'tp_new':
+        new_fn = w_type.getdictvalue(space, '__new__')
+        if new_fn is None:
+            return
 
+        @cpython_api([PyTypeObjectPtr, PyObject, PyObject], PyObject, header=None)
+        @func_renamer("cpyext_%s_%s" % (name.replace('.', '_'), typedef.name))
+        def slot_tp_new(space, type, w_args, w_kwds):
+            return space.call(w_type, w_args, w_kwds)
+        api_func = slot_tp_new.api_func
     else:
         return
 


More information about the pypy-commit mailing list