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