[pypy-commit] pypy reflex-support: fix rtyper errors

wlav noreply at buildbot.pypy.org
Sat Aug 31 01:21:57 CEST 2013


Author: Wim Lavrijsen <WLavrijsen at lbl.gov>
Branch: reflex-support
Changeset: r66704:d0ce2419ea7e
Date: 2013-08-30 16:19 -0700
http://bitbucket.org/pypy/pypy/changeset/d0ce2419ea7e/

Log:	fix rtyper errors

diff --git a/pypy/module/cppyy/capi/builtin_capi.py b/pypy/module/cppyy/capi/builtin_capi.py
--- a/pypy/module/cppyy/capi/builtin_capi.py
+++ b/pypy/module/cppyy/capi/builtin_capi.py
@@ -543,4 +543,3 @@
     compilation_info=backend.eci)
 def c_stdstring2stdstring(space, cppobject):
     return _c_stdstring2stdstring(cppobject)
-
diff --git a/pypy/module/cppyy/capi/cint_capi.py b/pypy/module/cppyy/capi/cint_capi.py
--- a/pypy/module/cppyy/capi/cint_capi.py
+++ b/pypy/module/cppyy/capi/cint_capi.py
@@ -324,33 +324,6 @@
         _method_alias(space, w_pycppclass, "__cmp__", "CompareTo")
         _method_alias(space, w_pycppclass, "_cppyy_as_builtin", "Data")
 
-        # ROOT-specific converters (TODO: this is a general problem and would serve
-        # with its own API; problem is that constructing temporaries leads to recursive
-        # calls, as the copy-constructor takes a type of the same class, so uses the
-        # same converter)
-        from pypy.module.cppyy import converter
-        class TStringConverter(converter.InstanceConverter):
-            def __init__(self, space, extra):
-                from pypy.module.cppyy import interp_cppyy
-                cppclass = interp_cppyy.scope_byname(space, "TString")
-                converter.InstanceConverter.__init__(self, space, cppclass)
-
-            def _unwrap_object(self, space, w_obj):
-                from pypy.module.cppyy import interp_cppyy
-                if isinstance(w_obj, interp_cppyy.W_CPPInstance):
-                    arg = converter.InstanceConverter._unwrap_object(self, space, w_obj)
-                    return c_TString2TString(space, arg)
-                else:
-                    return c_charp2TString(space, space.str_w(w_obj))
-
-            def free_argument(self, space, arg, call_local):
-                from pypy.module.cppyy import interp_cppyy, capi
-                capi.c_destruct(space, self.cppclass, rffi.cast(capi.C_OBJECT, rffi.cast(rffi.VOIDPP, arg)[0]))
-
-        # TODO: make an API for this
-        converter._converters["TString"]        = TStringConverter
-        converter._converters["const TString&"] = TStringConverter
-
     elif name == "TTree":
         _method_alias(space, w_pycppclass, "_unpythonized_Branch", "Branch")
 
@@ -361,7 +334,6 @@
     elif name[0:8] == "TVectorT":    # TVectorT<> template
         _method_alias(space, w_pycppclass, "__len__", "GetNoElements")
 
-   
 # destruction callback (needs better solution, but this is for CINT
 # only and should not appear outside of ROOT-specific uses)
 from pypy.module.cpyext.api import cpython_api, CANNOT_FAIL
diff --git a/pypy/module/cppyy/converter.py b/pypy/module/cppyy/converter.py
--- a/pypy/module/cppyy/converter.py
+++ b/pypy/module/cppyy/converter.py
@@ -777,3 +777,27 @@
     for c_type, alias in aliases:
         _converters[alias] = _converters[c_type]
 _add_aliased_converters()
+
+# ROOT-specific converters (TODO: this is a general use case and should grow
+# an API; putting it here is done only to circumvent circular imports)
+if capi.identify() == "CINT":
+
+    class TStringConverter(InstanceConverter):
+        def __init__(self, space, extra):
+            from pypy.module.cppyy import interp_cppyy
+            cppclass = interp_cppyy.scope_byname(space, "TString")
+            InstanceConverter.__init__(self, space, cppclass)
+
+        def _unwrap_object(self, space, w_obj):
+            from pypy.module.cppyy import interp_cppyy
+            if isinstance(w_obj, interp_cppyy.W_CPPInstance):
+                arg = InstanceConverter._unwrap_object(self, space, w_obj)
+                return capi.backend.c_TString2TString(space, arg)
+            else:
+                return capi.backend.c_charp2TString(space, space.str_w(w_obj))
+
+        def free_argument(self, space, arg, call_local):
+            capi.c_destruct(space, self.cppclass, rffi.cast(capi.C_OBJECT, rffi.cast(rffi.VOIDPP, arg)[0]))
+
+    _converters["TString"]        = TStringConverter
+    _converters["const TString&"] = TStringConverter


More information about the pypy-commit mailing list