[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