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

wlav at codespeak.net wlav at codespeak.net
Fri Sep 3 20:20:26 CEST 2010


Author: wlav
Date: Fri Sep  3 20:20:24 2010
New Revision: 76860

Modified:
   pypy/branch/reflex-support/pypy/module/cppyy/converter.py
   pypy/branch/reflex-support/pypy/module/cppyy/test/test_datatypes.py
Log:
Initial int array data member access.


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	Fri Sep  3 20:20:24 2010
@@ -193,7 +193,6 @@
         # TODO: now what ... ?? AFAICS, w_value is a pure python list, not an array?
 #        byteptr[0] = space.unwrap(space.id(w_value.getslotvalue(2)))
 
-
 class ShortArrayConverter(ShortPtrConverter):
     def to_memory(self, space, w_obj, w_value, offset):
         # copy the full array (uses byte copy for now)
@@ -202,6 +201,39 @@
         for i in range(min(self.size*2, value.getlength())):
             fieldptr[i] = value.getitem(i)
 
+class LongPtrConverter(TypeConverter):
+    _immutable_ = True
+    def __init__(self, detail=None):
+        if detail is None:
+            import sys
+            detail = sys.maxint
+        self.size = detail
+    
+    def convert_argument(self, space, w_obj):
+        assert "not yet implemented"
+
+    def from_memory(self, space, w_obj, offset):
+        # read access, so no copy needed
+        fieldptr = self._get_fieldptr(space, w_obj, offset)
+        longptr = rffi.cast(rffi.LONGP, fieldptr)
+        w_array = unpack_simple_shape(space, space.wrap('l'))
+        return w_array.fromaddress(space, longptr, self.size)
+
+    def to_memory(self, space, w_obj, w_value, offset):
+        # copy only the pointer value
+        obj = space.interpclass_w(space.findattr(w_obj, space.wrap("_cppinstance")))
+        byteptr = rffi.cast(rffi.LONGP, obj.rawobject[offset])
+        # TODO: now what ... ?? AFAICS, w_value is a pure python list, not an array?
+#        byteptr[0] = space.unwrap(space.id(w_value.getslotvalue(2)))
+
+class LongArrayConverter(LongPtrConverter):
+    def to_memory(self, space, w_obj, w_value, offset):
+        # copy the full array (uses byte copy for now)
+        fieldptr = self._get_fieldptr(space, w_obj, offset)
+        value = w_value.getslotvalue(2)
+        for i in range(min(self.size*4, value.getlength())):
+            fieldptr[i] = value.getitem(i)
+
 
 class InstancePtrConverter(TypeConverter):
     _immutable_ = True
@@ -271,6 +303,8 @@
 _converters["unsigned short int*"]      = ShortPtrConverter
 _converters["unsigned short int[]"]     = ShortArrayConverter
 _converters["int"]                      = LongConverter
+_converters["int*"]                     = LongPtrConverter
+_converters["int[]"]                    = LongArrayConverter
 _converters["unsigned int"]             = LongConverter
 _converters["long int"]                 = LongConverter
 _converters["unsigned long int"]        = LongConverter

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	Fri Sep  3 20:20:24 2010
@@ -98,7 +98,7 @@
         # integer arrays
         import array
         a = range(self.N)
-        atypes = ['h', 'H']#, 'i', 'I', 'l', 'L' ]
+        atypes = ['h', 'H', 'i']#, 'I', 'l', 'L' ]
         for j in range(len(atypes)):#names)):
             b = array.array(atypes[j], a)
             exec 'c.m_%s_array = b' % names[j]   # buffer copies



More information about the Pypy-commit mailing list