Author: Wim Lavrijsen <[email protected]>
Branch: reflex-support
Changeset: r59761:1ce8a3559f72
Date: 2013-01-05 00:52 -0800
http://bitbucket.org/pypy/pypy/changeset/1ce8a3559f72/

Log:    simplification of interface for bringing cpp objects from
        interpreter to app

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
@@ -449,8 +449,8 @@
     def from_memory(self, space, w_obj, w_pycppclass, offset):
         address = rffi.cast(capi.C_OBJECT, self._get_raw_address(space, w_obj, 
offset))
         from pypy.module.cppyy import interp_cppyy
-        return interp_cppyy.wrap_cppobject_nocast(
-            space, space.w_None, self.cppclass, address, isref=True, 
python_owns=False)
+        return interp_cppyy.wrap_cppobject(space, address, self.cppclass,
+                                           do_cast=False, is_ref=True)
 
     def to_memory(self, space, w_obj, w_value, offset):
         address = rffi.cast(rffi.VOIDPP, self._get_raw_address(space, w_obj, 
offset))
@@ -465,8 +465,7 @@
     def from_memory(self, space, w_obj, w_pycppclass, offset):
         address = rffi.cast(capi.C_OBJECT, self._get_raw_address(space, w_obj, 
offset))
         from pypy.module.cppyy import interp_cppyy
-        return interp_cppyy.wrap_cppobject_nocast(
-            space, space.w_None, self.cppclass, address, isref=False, 
python_owns=False)
+        return interp_cppyy.wrap_cppobject(space, address, self.cppclass, 
do_cast=False)
 
     def to_memory(self, space, w_obj, w_value, offset):
         self._is_abstract(space)
diff --git a/pypy/module/cppyy/executor.py b/pypy/module/cppyy/executor.py
--- a/pypy/module/cppyy/executor.py
+++ b/pypy/module/cppyy/executor.py
@@ -159,16 +159,14 @@
         from pypy.module.cppyy import interp_cppyy
         long_result = capi.c_call_l(cppmethod, cppthis, num_args, args)
         ptr_result = rffi.cast(capi.C_OBJECT, long_result)
-        return interp_cppyy.wrap_cppobject(
-            space, space.w_None, self.cppclass, ptr_result, isref=False, 
python_owns=False)
+        return interp_cppyy.wrap_cppobject(space, ptr_result, self.cppclass)
 
     def execute_libffi(self, space, cif_descr, funcaddr, buffer):
         jit_libffi.jit_ffi_call(cif_descr, funcaddr, buffer)
         result = rffi.ptradd(buffer, cif_descr.exchange_result)
         from pypy.module.cppyy import interp_cppyy
         ptr_result = rffi.cast(capi.C_OBJECT, rffi.cast(rffi.VOIDPP, 
result)[0])
-        return interp_cppyy.wrap_cppobject(
-            space, space.w_None, self.cppclass, ptr_result, isref=False, 
python_owns=False)
+        return interp_cppyy.wrap_cppobject(space, ptr_result, self.cppclass)
 
 class InstancePtrPtrExecutor(InstancePtrExecutor):
 
@@ -177,8 +175,7 @@
         voidp_result = capi.c_call_r(cppmethod, cppthis, num_args, args)
         ref_address = rffi.cast(rffi.VOIDPP, voidp_result)
         ptr_result = rffi.cast(capi.C_OBJECT, ref_address[0])
-        return interp_cppyy.wrap_cppobject(
-            space, space.w_None, self.cppclass, ptr_result, isref=False, 
python_owns=False)
+        return interp_cppyy.wrap_cppobject(space, ptr_result, self.cppclass)
 
     def execute_libffi(self, space, cif_descr, funcaddr, buffer):
         from pypy.module.cppyy.interp_cppyy import FastCallNotPossible
@@ -190,8 +187,8 @@
         from pypy.module.cppyy import interp_cppyy
         long_result = capi.c_call_o(cppmethod, cppthis, num_args, args, 
self.cppclass)
         ptr_result = rffi.cast(capi.C_OBJECT, long_result)
-        return interp_cppyy.wrap_cppobject_nocast(
-            space, space.w_None, self.cppclass, ptr_result, isref=False, 
python_owns=True)
+        return interp_cppyy.wrap_cppobject(space, ptr_result, self.cppclass,
+                                           do_cast=False, python_owns=True)
 
     def execute_libffi(self, space, cif_descr, funcaddr, buffer):
         from pypy.module.cppyy.interp_cppyy import FastCallNotPossible
diff --git a/pypy/module/cppyy/interp_cppyy.py 
b/pypy/module/cppyy/interp_cppyy.py
--- a/pypy/module/cppyy/interp_cppyy.py
+++ b/pypy/module/cppyy/interp_cppyy.py
@@ -384,8 +384,8 @@
         vscope = rffi.cast(capi.C_OBJECT, self.scope.handle)
         w_result = CPPMethod.call(self, vscope, args_w)
         newthis = rffi.cast(capi.C_OBJECT, self.space.int_w(w_result))
-        return wrap_new_cppobject_nocast(
-            self.space, self.space.w_None, self.scope, newthis, isref=False, 
python_owns=True)
+        return wrap_cppobject(self.space, newthis, self.scope,
+                              do_cast=False, python_owns=True, fresh=True)
 
     def __repr__(self):
         return "CPPConstructor: %s" % self.signature()
@@ -1049,26 +1049,13 @@
         w_pycppclass = space.call_function(state.w_clgen_callback, 
space.wrap(final_name))
     return w_pycppclass
 
-def wrap_new_cppobject_nocast(space, w_pycppclass, cppclass, rawobject, isref, 
python_owns):
+def wrap_cppobject(space, rawobject, cppclass,
+                   do_cast=True, python_owns=False, is_ref=False, fresh=False):
     rawobject = rffi.cast(capi.C_OBJECT, rawobject)
-    if space.is_w(w_pycppclass, space.w_None):
-        w_pycppclass = get_pythonized_cppclass(space, cppclass.handle)
-    w_cppinstance = space.allocate_instance(W_CPPInstance, w_pycppclass)
-    cppinstance = space.interp_w(W_CPPInstance, w_cppinstance)
-    cppinstance.__init__(space, cppclass, rawobject, isref, python_owns)
-    memory_regulator.register(cppinstance)
-    return w_cppinstance
 
-def wrap_cppobject_nocast(space, w_pycppclass, cppclass, rawobject, isref, 
python_owns):
-    rawobject = rffi.cast(capi.C_OBJECT, rawobject)
-    obj = memory_regulator.retrieve(rawobject)
-    if obj is not None and obj.cppclass is cppclass:
-        return obj
-    return wrap_new_cppobject_nocast(space, w_pycppclass, cppclass, rawobject, 
isref, python_owns)
-
-def wrap_cppobject(space, w_pycppclass, cppclass, rawobject, isref, 
python_owns):
-    rawobject = rffi.cast(capi.C_OBJECT, rawobject)
-    if rawobject:
+    # cast to actual cast if requested and possible
+    w_pycppclass = space.w_None
+    if do_cast and rawobject:
         actual = capi.c_actual_class(cppclass, rawobject)
         if actual != cppclass.handle:
             try:
@@ -1082,7 +1069,22 @@
                 # that only get_pythonized_cppclass is expected to raise, so 
none of
                 # the variables are re-assigned yet)
                 pass
-    return wrap_cppobject_nocast(space, w_pycppclass, cppclass, rawobject, 
isref, python_owns)
+
+    if space.is_w(w_pycppclass, space.w_None):
+        w_pycppclass = get_pythonized_cppclass(space, cppclass.handle)
+
+    # try to recycle existing object if this one is not newly created
+    if not fresh:
+        obj = memory_regulator.retrieve(rawobject)
+        if obj is not None and obj.cppclass is cppclass:
+            return obj
+
+    # fresh creation
+    w_cppinstance = space.allocate_instance(W_CPPInstance, w_pycppclass)
+    cppinstance = space.interp_w(W_CPPInstance, w_cppinstance)
+    cppinstance.__init__(space, cppclass, rawobject, is_ref, python_owns)
+    memory_regulator.register(cppinstance)
+    return w_cppinstance
 
 @unwrap_spec(cppinstance=W_CPPInstance)
 def addressof(space, cppinstance):
@@ -1096,4 +1098,4 @@
     rawobject = rffi.cast(capi.C_OBJECT, address)
     w_cppclass = space.findattr(w_pycppclass, space.wrap("_cpp_proxy"))
     cppclass = space.interp_w(W_CPPClass, w_cppclass, can_be_None=False)
-    return wrap_cppobject_nocast(space, w_pycppclass, cppclass, rawobject, 
False, owns)
+    return wrap_cppobject(space, rawobject, cppclass, do_cast=False, 
python_owns=owns)
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to