[pypy-commit] pypy reflex-support: (arigo, wlav) cleanup of array converters
wlav
noreply at buildbot.pypy.org
Mon Jul 11 19:01:51 CEST 2011
Author: Wim Lavrijsen <WLavrijsen at lbl.gov>
Branch: reflex-support
Changeset: r45461:85a563569b81
Date: 2011-07-11 08:45 -0700
http://bitbucket.org/pypy/pypy/changeset/85a563569b81/
Log: (arigo, wlav) cleanup of array converters
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
@@ -62,11 +62,20 @@
lltype.free(arg, flavor='raw')
-class ArrayTypeConverter(TypeConverter):
+class ArrayCache(object):
+ def __init__(self, space):
+ self.space = space
+ def __getattr__(self, name):
+ if name.startswith('array_'):
+ typecode = name[len('array_'):]
+ arr = self.space.interp_w(W_Array, unpack_simple_shape(self.space, self.space.wrap(typecode)))
+ setattr(self, name, arr)
+ return arr
+ raise AttributeError(name)
+
+class ArrayTypeConverterMixin(object):
+ _mixin_ = True
_immutable = True
- _immutable_fields_ = ["size"]
- typecode = ''
- typesize = 0 # TODO: get sizeof(type) from system
def __init__(self, space, array_size):
if array_size <= 0:
@@ -78,18 +87,20 @@
# read access, so no copy needed
address_value = self._get_raw_address(space, w_obj, offset)
address = rffi.cast(rffi.UINT, address_value)
- arr = space.interp_w(W_Array, unpack_simple_shape(space, space.wrap(self.typecode)))
+ cache = space.fromcache(ArrayCache)
+ arr = getattr(cache, 'array_' + self.typecode)
return arr.fromaddress(space, address, self.size)
def to_memory(self, space, w_obj, w_value, offset):
# copy the full array (uses byte copy for now)
address = self._get_raw_address(space, w_obj, offset)
- buf = space.interp_w(Buffer, w_value.getslotvalue(2))
+ buf = space.buffer_w(w_value)
+ # TODO: report if too many items given?
for i in range(min(self.size*self.typesize, buf.getlength())):
address[i] = buf.getitem(i)
-class PtrTypeConverter(ArrayTypeConverter):
+class PtrTypeConverter(ArrayTypeConverterMixin, TypeConverter):
_immutable_ = True
def _get_raw_address(self, space, w_obj, offset):
@@ -294,22 +305,22 @@
return rffi.cast(rffi.VOIDP, x)
-class ShortArrayConverter(ArrayTypeConverter):
+class ShortArrayConverter(ArrayTypeConverterMixin, TypeConverter):
_immutable_=True
typecode = 'h'
typesize = 2
-class LongArrayConverter(ArrayTypeConverter):
+class LongArrayConverter(ArrayTypeConverterMixin, TypeConverter):
_immutable_=True
typecode = 'l'
typesize = 4
-class FloatArrayConverter(ArrayTypeConverter):
+class FloatArrayConverter(ArrayTypeConverterMixin, TypeConverter):
_immutable_=True
typecode = 'f'
typesize = 4
-class DoubleArrayConverter(ArrayTypeConverter):
+class DoubleArrayConverter(ArrayTypeConverterMixin, TypeConverter):
_immutable_=True
typecode = 'd'
typesize = 8
More information about the pypy-commit
mailing list