Author: Armin Rigo <ar...@tunes.org>
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
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to