[pypy-commit] pypy reflex-support: const builtin& for CINT backend

wlav noreply at buildbot.pypy.org
Fri Apr 13 05:43:26 CEST 2012


Author: Wim Lavrijsen <WLavrijsen at lbl.gov>
Branch: reflex-support
Changeset: r54322:6c02358185a1
Date: 2012-04-12 12:41 -0700
http://bitbucket.org/pypy/pypy/changeset/6c02358185a1/

Log:	const builtin& for CINT backend

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
@@ -338,6 +338,13 @@
 class ConstLongRefConverter(LongConverter):
     _immutable_ = True
     libffitype = lltype.nullptr(clibffi.FFI_TYPE_P.TO)
+    typecode = 'r'
+
+    def convert_argument(self, space, w_obj, address):
+        x = rffi.cast(self.rffiptype, address)
+        x[0] = self._unwrap_object(space, w_obj)
+        ba = rffi.cast(rffi.CCHARP, address)
+        ba[capi.c_function_arg_typeoffset()] = self.typecode
 
 class UnsignedLongConverter(IntTypeConverterMixin, TypeConverter):
     _immutable_ = True
@@ -378,6 +385,7 @@
 class ConstFloatRefConverter(FloatConverter):
     _immutable_ = True
     libffitype = lltype.nullptr(clibffi.FFI_TYPE_P.TO)
+    typecode = 'F'
 
 class DoubleConverter(FloatTypeConverterMixin, TypeConverter):
     _immutable_ = True
@@ -397,6 +405,7 @@
 class ConstDoubleRefConverter(DoubleConverter):
     _immutable_ = True
     libffitype = lltype.nullptr(clibffi.FFI_TYPE_P.TO)
+    typecode = 'D'
 
 
 class CStringConverter(TypeConverter):
diff --git a/pypy/module/cppyy/src/cintcwrapper.cxx b/pypy/module/cppyy/src/cintcwrapper.cxx
--- a/pypy/module/cppyy/src/cintcwrapper.cxx
+++ b/pypy/module/cppyy/src/cintcwrapper.cxx
@@ -167,15 +167,33 @@
     for (int i = 0; i < libp->paran; ++i) {
         libp->para[i].ref = libp->para[i].obj.i;
         const char partype = libp->para[i].type;
-        if (partype == 'p')
+        switch (partype) {
+        case 'p': {
             libp->para[i].obj.i = (long)&libp->para[i].ref;
-        else if (partype == 'r')
+            break;
+        }
+        case 'r': {
             libp->para[i].ref = (long)&libp->para[i].obj.i;
-        else if (partype == 'f') {
+            break;
+        }
+        case 'f': {
             assert(sizeof(float) <= sizeof(long));
             long val = libp->para[i].obj.i;
             void* pval = (void*)&val;
             libp->para[i].obj.d = *(float*)pval;
+            break;
+        }
+        case 'F': {
+            libp->para[i].ref = (long)&libp->para[i].obj.i;
+            libp->para[i].type = 'f';
+            break;
+        }
+        case 'D': {
+            libp->para[i].ref = (long)&libp->para[i].obj.i;
+            libp->para[i].type = 'd';
+            break;
+
+        }
         }
     }
 }


More information about the pypy-commit mailing list