[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