Author: Armin Rigo <[email protected]>
Branch:
Changeset: r67553:b8da183e86ae
Date: 2013-10-24 10:17 +0200
http://bitbucket.org/pypy/pypy/changeset/b8da183e86ae/
Log: list(array-of-c-floats).
diff --git a/pypy/module/_cffi_backend/ctypeprim.py
b/pypy/module/_cffi_backend/ctypeprim.py
--- a/pypy/module/_cffi_backend/ctypeprim.py
+++ b/pypy/module/_cffi_backend/ctypeprim.py
@@ -370,13 +370,17 @@
misc.write_raw_float_data(cdata, value, self.size)
def unpack_list_of_float_items(self, w_cdata):
- if self.size == rffi.sizeof(rffi.DOUBLE): # XXX
+ if self.size == rffi.sizeof(rffi.DOUBLE):
from rpython.rlib.rarray import populate_list_from_raw_array
res = []
buf = rffi.cast(rffi.DOUBLEP, w_cdata._cdata)
length = w_cdata.get_array_length()
populate_list_from_raw_array(res, buf, length)
return res
+ elif self.size == rffi.sizeof(rffi.FLOAT):
+ res = [0.0] * w_cdata.get_array_length()
+ misc.unpack_cfloat_list_from_raw_array(res, w_cdata._cdata)
+ return res
return None
def pack_list_of_items(self, cdata, w_ob):
@@ -447,6 +451,10 @@
value = space.float_w(space.float(w_ob))
self._to_longdouble_and_write(value, cdata)
+ # Cannot have unpack_list_of_float_items() here:
+ # 'list(array-of-longdouble)' returns a list of cdata objects,
+ # not a list of floats.
+
def pack_list_of_items(self, cdata, w_ob):
float_list = self.space.listview_float(w_ob)
if float_list is not None:
diff --git a/pypy/module/_cffi_backend/misc.py
b/pypy/module/_cffi_backend/misc.py
--- a/pypy/module/_cffi_backend/misc.py
+++ b/pypy/module/_cffi_backend/misc.py
@@ -345,3 +345,8 @@
int_list[i] = rffi.cast(lltype.Signed, ptr[i])
return
raise NotImplementedError("bad integer size")
+
+def unpack_cfloat_list_from_raw_array(float_list, source):
+ ptr = rffi.cast(rffi.FLOATP, source)
+ for i in range(len(float_list)):
+ float_list[i] = rffi.cast(lltype.Float, ptr[i])
diff --git a/pypy/module/_cffi_backend/test/test_fastpath.py
b/pypy/module/_cffi_backend/test/test_fastpath.py
--- a/pypy/module/_cffi_backend/test/test_fastpath.py
+++ b/pypy/module/_cffi_backend/test/test_fastpath.py
@@ -145,6 +145,14 @@
self._original2 = original2
misc.unpack_list_from_raw_array = unpack_list_from_raw_array
#
+ original3 = misc.unpack_cfloat_list_from_raw_array
+ def unpack_cfloat_list_from_raw_array(*args):
+ self.count += 1
+ return original3(*args)
+ self._original3 = original3
+ misc.unpack_cfloat_list_from_raw_array = (
+ unpack_cfloat_list_from_raw_array)
+ #
self.w_runappdirect = self.space.wrap(self.runappdirect)
@@ -152,6 +160,7 @@
from rpython.rlib import rarray
rarray.populate_list_from_raw_array = self._original
misc.unpack_list_from_raw_array = self._original2
+ misc.unpack_cfloat_list_from_raw_array = self._original3
def test_list_int(self):
import _cffi_backend
@@ -226,3 +235,17 @@
assert lst == [1, 2, 3]
if not self.runappdirect:
assert self.get_count() == 1
+
+ def test_list_cfloat(self):
+ import _cffi_backend
+ FLOAT = _cffi_backend.new_primitive_type('float')
+ P_FLOAT = _cffi_backend.new_pointer_type(FLOAT)
+ FLOAT_ARRAY = _cffi_backend.new_array_type(P_FLOAT, 3)
+ buf = _cffi_backend.newp(FLOAT_ARRAY)
+ buf[0] = 1.25
+ buf[1] = -2.5
+ buf[2] = 3.75
+ lst = list(buf)
+ assert lst == [1.25, -2.5, 3.75]
+ if not self.runappdirect:
+ assert self.get_count() == 1
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit