[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