[pypy-svn] r74448 - in pypy/trunk/pypy/module/cpyext: . test

agaynor at codespeak.net agaynor at codespeak.net
Sun May 9 08:45:18 CEST 2010


Author: agaynor
Date: Sun May  9 08:45:15 2010
New Revision: 74448

Modified:
   pypy/trunk/pypy/module/cpyext/slotdefs.py
   pypy/trunk/pypy/module/cpyext/test/test_typeobject.py
   pypy/trunk/pypy/module/cpyext/typeobject.py
Log:
Make __init__ on subclasses of cpyext types works.

Modified: pypy/trunk/pypy/module/cpyext/slotdefs.py
==============================================================================
--- pypy/trunk/pypy/module/cpyext/slotdefs.py	(original)
+++ pypy/trunk/pypy/module/cpyext/slotdefs.py	Sun May  9 08:45:15 2010
@@ -5,7 +5,8 @@
         PyObject
 from pypy.module.cpyext.typeobjectdefs import unaryfunc, wrapperfunc,\
         ternaryfunc, PyTypeObjectPtr, binaryfunc, getattrfunc, lenfunc,\
-        ssizeargfunc, ssizessizeargfunc, ssizeobjargproc, iternextfunc
+        ssizeargfunc, ssizessizeargfunc, ssizeobjargproc, iternextfunc,\
+        initproc
 from pypy.module.cpyext.pyobject import from_ref
 from pypy.module.cpyext.pyerrors import PyErr_Occurred
 from pypy.module.cpyext.state import State
@@ -26,6 +27,11 @@
     raise operationerrfmt(space.w_TypeError,
         "expected %d arguments, got %d", n, PyTuple_GET_SIZE(space, ob))
 
+def wrap_init(space, w_self, w_args, func, w_kwargs):
+    func_init = rffi.cast(initproc, func)
+    generic_cpy_call(space, func_init, w_self, w_args, w_kwargs)
+    return None
+
 def wrap_unaryfunc(space, w_self, w_args, func):
     func_unary = rffi.cast(unaryfunc, func)
     check_num_args(space, w_args, 0)

Modified: pypy/trunk/pypy/module/cpyext/test/test_typeobject.py
==============================================================================
--- pypy/trunk/pypy/module/cpyext/test/test_typeobject.py	(original)
+++ pypy/trunk/pypy/module/cpyext/test/test_typeobject.py	Sun May  9 08:45:15 2010
@@ -113,6 +113,15 @@
         module = self.import_module(name="foo")
         newobj = module.FuuType()
         assert newobj.get_val() == 42
+        
+        class Fuu2(module.FuuType):
+            def __init__(self):
+                self.foobar = 32
+                super(Fuu2, self).__init__()
+        
+        newobj = Fuu2()
+        assert newobj.get_val() == 42
+        assert newobj.foobar == 32
 
     def test_sre(self):
         module = self.import_module(name='_sre')

Modified: pypy/trunk/pypy/module/cpyext/typeobject.py
==============================================================================
--- pypy/trunk/pypy/module/cpyext/typeobject.py	(original)
+++ pypy/trunk/pypy/module/cpyext/typeobject.py	Sun May  9 08:45:15 2010
@@ -285,6 +285,9 @@
                     try:
                         if pto.c_tp_init:
                             generic_cpy_call(space, pto.c_tp_init, w_obj, w_args, w_kw)
+                        else:
+                            w_descr = space.lookup(w_obj, '__init__')
+                            w_result = space.get_and_call_args(w_descr, w_obj, __args__)
                         return w_obj
                     finally:
                         Py_DecRef(space, pyo)



More information about the Pypy-commit mailing list