[pypy-svn] pypy reflex-support: refactoring of array handling
wlav
commits-noreply at bitbucket.org
Sat Feb 5 00:06:36 CET 2011
Author: Wim Lavrijsen <WLavrijsen at lbl.gov>
Branch: reflex-support
Changeset: r41620:d300522715d1
Date: 2011-02-04 14:49 -0800
http://bitbucket.org/pypy/pypy/changeset/d300522715d1/
Log: refactoring of array handling
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
@@ -52,13 +52,36 @@
class ArrayTypeConverter(TypeConverter):
- _immutable_ = True
+ typecode = ''
+ typesize = 0 # TODO: get sizeof(type) from system
+
def __init__(self, space, array_size):
if array_size <= 0:
self.size = sys.maxint
else:
self.size = array_size
+ def from_memory(self, space, w_obj, offset):
+ # read access, so no copy needed
+ fieldptr = self._get_fieldptr(space, w_obj, offset)
+ ptrval = rffi.cast(rffi.UINT, fieldptr)
+ arr = space.interp_w(W_Array, unpack_simple_shape(space, space.wrap(self.typecode)))
+ return arr.fromaddress(space, fieldptr, self.size)
+
+ 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)
+ buf = space.interp_w(Buffer, w_value.getslotvalue(2))
+ for i in range(min(self.size*self.typesize, buf.getlength())):
+ fieldptr[i] = buf.getitem(i)
+
+
+class PtrTypeConverter(ArrayTypeConverter):
+ def _get_fieldptr(self, space, w_obj, offset):
+ fieldptr = TypeConverter._get_fieldptr(self, space, w_obj, offset)
+ ptrptr = rffi.cast(rffi.LONGP, fieldptr)
+ return ptrptr[0]
+
class VoidConverter(TypeConverter):
libffitype = libffi.types.void
@@ -230,45 +253,19 @@
class ShortArrayConverter(ArrayTypeConverter):
_immutable_ = True
- def from_memory(self, space, w_obj, offset):
- # read access, so no copy needed
- fieldptr = self._get_fieldptr(space, w_obj, offset)
- ptrval = rffi.cast(rffi.UINT, fieldptr)
- arr = space.interp_w(W_Array, unpack_simple_shape(space, space.wrap('h')))
- return arr.fromaddress(space, fieldptr, self.size)
-
- 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)
- buf = space.interp_w(Buffer, w_value.getslotvalue(2))
- # TODO: get sizeof(short) from system
- for i in range(min(self.size*2, buf.getlength())):
- fieldptr[i] = buf.getitem(i)
+ typecode = 'h'
+ typesize = 2
class LongArrayConverter(ArrayTypeConverter):
_immutable_ = True
- def from_memory(self, space, w_obj, offset):
- # read access, so no copy needed
- fieldptr = self._get_fieldptr(space, w_obj, offset)
- ptrval = rffi.cast(rffi.UINT, fieldptr)
- arr = space.interp_w(W_Array, unpack_simple_shape(space, space.wrap('l')))
- return arr.fromaddress(space, ptrval, self.size)
+ typecode = 'l'
+ typesize = 4
- 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)
- buf = space.interp_w(Buffer, w_value.getslotvalue(2))
- # TODO: get sizeof(long) from system
- for i in range(min(self.size*4, buf.getlength())):
- fieldptr[i] = buf.getitem(i)
-
-class ShortPtrConverter(ShortArrayConverter):
+class ShortPtrConverter(PtrTypeConverter):
_immutable_ = True
- def _get_fieldptr(self, space, w_obj, offset):
- fieldptr = TypeConverter._get_fieldptr(self, space, w_obj, offset)
- ptrptr = rffi.cast(rffi.LONGP, fieldptr)
- return ptrptr[0]
+ typecode = 'h'
+ typesize = 2
def to_memory(self, space, w_obj, w_value, offset):
# copy only the pointer value
@@ -277,20 +274,10 @@
# 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 LongPtrConverter(LongArrayConverter):
+class LongPtrConverter(PtrTypeConverter):
_immutable_ = True
- def _get_fieldptr(self, space, w_obj, offset):
- fieldptr = TypeConverter._get_fieldptr(self, space, w_obj, offset)
- ptrptr = rffi.cast(rffi.LONGP, fieldptr)
- return ptrptr[0]
-
- def to_memory(self, space, w_obj, w_value, offset):
- # copy only the pointer value
- rawobject = get_rawobject(space, w_obj)
- byteptr = rffi.cast(rffi.LONGP, 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)))
-
+ typecode = 'l'
+ typesize = 4
class InstancePtrConverter(TypeConverter):
More information about the Pypy-commit
mailing list