[pypy-svn] r76462 - in pypy/branch/reflex-support/pypy/module/cppyy: . test

wlav at codespeak.net wlav at codespeak.net
Wed Aug 4 00:33:33 CEST 2010


Author: wlav
Date: Wed Aug  4 00:33:26 2010
New Revision: 76462

Modified:
   pypy/branch/reflex-support/pypy/module/cppyy/converter.py
   pypy/branch/reflex-support/pypy/module/cppyy/test/test_datatypes.py
Log:
Enable float and double data members


Modified: pypy/branch/reflex-support/pypy/module/cppyy/converter.py
==============================================================================
--- pypy/branch/reflex-support/pypy/module/cppyy/converter.py	(original)
+++ pypy/branch/reflex-support/pypy/module/cppyy/converter.py	Wed Aug  4 00:33:26 2010
@@ -8,12 +8,19 @@
 _converters = {}
 
 class TypeConverter(object):
+    def _get_fieldptr(self, space, w_obj, offset):
+        obj = space.interpclass_w(space.findattr(w_obj, space.wrap("_cppinstance")))
+        return lltype.direct_ptradd(obj.rawobject, offset)
+
     def convert_argument(self, space, w_obj):
         raise NotImplementedError("abstract base class")
 
     def from_memory(self, space, w_obj, offset):
         raise NotImplementedError("abstract base class")
 
+    def to_memory(self, space, w_obj, w_value, offset):
+        raise NotImplementedError("abstract base class")
+
     def free_argument(self, arg):
         lltype.free(arg, flavor='raw')
 
@@ -26,6 +33,7 @@
         raise OperationError(space.w_TypeError,
                              space.wrap('no converter available for type "%s"' % self.name))
 
+
 class BoolConverter(TypeConverter):
     def convert_argument(self, space, w_obj):
         arg = space.c_int_w(w_obj)
@@ -58,13 +66,11 @@
         return rffi.cast(rffi.VOIDP, x)
 
     def from_memory(self, space, w_obj, offset):
-        obj = space.interpclass_w(space.findattr(w_obj, space.wrap("_cppinstance")))
-        fieldptr = lltype.direct_ptradd(obj.rawobject, offset)
+        fieldptr = self._get_fieldptr(space, w_obj, offset)
         return space.wrap(fieldptr[0])
 
     def to_memory(self, space, w_obj, w_value, offset):
-        obj = space.interpclass_w(space.findattr(w_obj, space.wrap("_cppinstance")))
-        fieldptr = lltype.direct_ptradd(obj.rawobject, offset)
+        fieldptr = self._get_fieldptr(space, w_obj, offset)
         fieldptr[0] = self._from_space(space, w_value)
 
 class IntConverter(TypeConverter):
@@ -81,6 +87,16 @@
         x[0] = r_singlefloat(arg)
         return rffi.cast(rffi.VOIDP, x)        
 
+    def from_memory(self, space, w_obj, offset):
+        fieldptr = self._get_fieldptr(space, w_obj, offset)
+        floatptr = rffi.cast(rffi.FLOATP, fieldptr)
+        return space.wrap(float(floatptr[0]))
+
+    def to_memory(self, space, w_obj, w_value, offset):
+        fieldptr = self._get_fieldptr(space, w_obj, offset)
+        floatptr = rffi.cast(rffi.FLOATP, fieldptr)
+        floatptr[0] = r_singlefloat(space.float_w(w_value))
+
 class DoubleConverter(TypeConverter):
     def convert_argument(self, space, w_obj):
         arg = space.float_w(w_obj)
@@ -88,6 +104,17 @@
         x[0] = arg
         return rffi.cast(rffi.VOIDP, x)        
 
+    def from_memory(self, space, w_obj, offset):
+        fieldptr = self._get_fieldptr(space, w_obj, offset)
+        doubleptr = rffi.cast(rffi.DOUBLEP, fieldptr)
+        return space.wrap(doubleptr[0])
+
+    def to_memory(self, space, w_obj, w_value, offset):
+        fieldptr = self._get_fieldptr(space, w_obj, offset)
+        doubleptr = rffi.cast(rffi.DOUBLEP, fieldptr)
+        doubleptr[0] = space.float_w(w_value)
+
+
 class CStringConverter(TypeConverter):
     def convert_argument(self, space, w_obj):
         arg = space.str_w(w_obj)

Modified: pypy/branch/reflex-support/pypy/module/cppyy/test/test_datatypes.py
==============================================================================
--- pypy/branch/reflex-support/pypy/module/cppyy/test/test_datatypes.py	(original)
+++ pypy/branch/reflex-support/pypy/module/cppyy/test/test_datatypes.py	Wed Aug  4 00:33:26 2010
@@ -70,7 +70,7 @@
         raises(TypeError, 'c.set_char("string")')
         raises(TypeError, 'c.set_char(500)')
         raises(TypeError, 'c.set_uchar("string")')
-#        raises(TypeError, 'c.set_uchar(-1)')
+# TODO: raises(TypeError, 'c.set_uchar(-1)')
 
         """
         # integer types
@@ -84,15 +84,17 @@
             assert eval('c.m_%s' % names[i]) == i
         """
 
-        # float types
+        # float types through functions
         c.set_float( 0.123 );  assert round(c.get_float()  - 0.123, 5) == 0
         c.set_double( 0.456 ); assert round(c.get_double() - 0.456, 8) == 0
-        """
+
+        # float types through data members
         c.m_float = 0.123;     assert round(c.get_float()  - 0.123, 5) == 0
         c.set_float( 0.234 );  assert round(c.m_float      - 0.234, 5) == 0
         c.m_double = 0.456;    assert round(c.get_double() - 0.456, 8) == 0
         c.set_double( 0.567 ); assert round(c.m_double     - 0.567, 8) == 0
 
+        """
         # arrays; there will be pointer copies, so destroy the current ones
         c.destroy_arrays()
 



More information about the Pypy-commit mailing list