[pypy-commit] pypy cpyext-injection: (arigato, fijal, plan_rich) create a new type def. myitem, need to redirect properly

plan_rich pypy.commits at gmail.com
Wed Oct 19 12:40:59 EDT 2016


Author: Richard Plangger <planrichi at gmail.com>
Branch: cpyext-injection
Changeset: r87881:fbb30091e897
Date: 2016-10-19 18:40 +0200
http://bitbucket.org/pypy/pypy/changeset/fbb30091e897/

Log:	(arigato, fijal, plan_rich) create a new type def. myitem, need to
	redirect properly

diff --git a/pypy/module/cpyext/__init__.py b/pypy/module/cpyext/__init__.py
--- a/pypy/module/cpyext/__init__.py
+++ b/pypy/module/cpyext/__init__.py
@@ -74,6 +74,7 @@
 import pypy.module.cpyext.pystrtod
 import pypy.module.cpyext.pytraceback
 import pypy.module.cpyext.methodobject
+import pypy.module.cpyext.injection._test_module
 
 # now that all rffi_platform.Struct types are registered, configure them
 api.configure_types()
diff --git a/pypy/module/cpyext/injection/_test_module.py b/pypy/module/cpyext/injection/_test_module.py
--- a/pypy/module/cpyext/injection/_test_module.py
+++ b/pypy/module/cpyext/injection/_test_module.py
@@ -1,8 +1,11 @@
 from rpython.rtyper.lltypesystem import lltype, rffi
 from pypy.interpreter.gateway import interp2app
-from pypy.interpreter.typedef import unwrap_spec
-from pypy.module.cpyext.pyobject import as_pyobj
+from pypy.interpreter.typedef import unwrap_spec, TypeDef
+from pypy.module.cpyext.pyobject import as_pyobj, make_typedescr, track_reference
 from pypy.module.cpyext.api import PyObjectFields
+from pypy.interpreter import typedef
+from pypy.objspace.std.intobject import W_IntObject
+from pypy.module.cpyext.api import bootstrap_function
 
 
 mytype_object = lltype.Ptr(lltype.Struct(
@@ -26,11 +29,36 @@
         return space.call_function(org.w_original_getitem, w_self,
                                    space.wrap(index))
 
+class W_MyItem(W_IntObject):
+    pass
+
+W_MyItem.typedef = TypeDef("mything", __doc__ = "foo")
+
+def mything_attach(space, py_obj, w_obj):
+    py_mything = rffi.cast(mytype_object, py_obj)
+    rffi.setintfield(py_mything, 'foo', space.int_w(w_obj))
+
+def mything_realize(space, obj):
+    intval = rffi.cast(lltype.Signed, rffi.cast(mytype_object, obj).foo)
+    w_obj = W_MyItem(intval)
+    track_reference(space, obj, w_obj)
+    return w_obj
+
+ at bootstrap_function
+def init_mything(space):
+    make_typedescr(W_MyItem.typedef,
+                   basestruct=mytype_object.TO,
+                   attach=mything_attach,
+                   realize=mything_realize)
+
 @unwrap_spec(arg=int)
 def injected_make(space, arg):
     if arg == 15:
         org = space.fromcache(Original)
         return space.call_function(org.w_original_make, space.wrap(arg))
+    if arg == 25:
+        org = space.fromcache(Original)
+        return space.wrap(W_MyItem(2))
     return space.w_Ellipsis
 
 
diff --git a/pypy/module/cpyext/test/injection.c b/pypy/module/cpyext/test/injection.c
--- a/pypy/module/cpyext/test/injection.c
+++ b/pypy/module/cpyext/test/injection.c
@@ -129,7 +129,6 @@
 initinjection(void)
 #endif
 {
-    PyObject *d;
 #if PY_MAJOR_VERSION >= 3
     PyObject *module = PyModule_Create(&moduledef);
 #else
diff --git a/pypy/module/cpyext/test/test_injection.py b/pypy/module/cpyext/test/test_injection.py
--- a/pypy/module/cpyext/test/test_injection.py
+++ b/pypy/module/cpyext/test/test_injection.py
@@ -11,6 +11,7 @@
             return space.w_False
         cls.w_is_there_an_pyobj_version = cls.space.wrap(
                          interp2app(is_there_an_pyobj_version))
+        AppTestCpythonExtensionBase.setup_class.im_func(cls)
 
     def test_getitem_basic(self):
         module = self.import_module(name='injection')


More information about the pypy-commit mailing list