[pypy-commit] pypy ffistruct: applevel support for float fields
antocuni
noreply at buildbot.pypy.org
Wed Nov 9 19:12:08 CET 2011
Author: Antonio Cuni <anto.cuni at gmail.com>
Branch: ffistruct
Changeset: r49039:0aad7df24682
Date: 2011-11-09 18:02 +0100
http://bitbucket.org/pypy/pypy/changeset/0aad7df24682/
Log: applevel support for float fields
diff --git a/pypy/module/_ffi/interp_struct.py b/pypy/module/_ffi/interp_struct.py
--- a/pypy/module/_ffi/interp_struct.py
+++ b/pypy/module/_ffi/interp_struct.py
@@ -145,6 +145,10 @@
return space.wrap(r_uint(value))
return space.wrap(value)
#
+ if w_ffitype.is_double():
+ value = libffi.struct_getfield_float(w_ffitype.ffitype, self.rawmem, offset)
+ return space.wrap(value)
+ #
assert False, 'unknown type'
@unwrap_spec(name=str)
@@ -160,6 +164,11 @@
libffi.struct_setfield_int(w_ffitype.ffitype, self.rawmem, offset, value)
return
#
+ if w_ffitype.is_double():
+ value = space.float_w(w_value)
+ libffi.struct_setfield_float(w_ffitype.ffitype, self.rawmem, offset, value)
+ return
+ #
assert False, 'unknown type'
W__StructInstance.typedef = TypeDef(
diff --git a/pypy/module/_ffi/test/test_struct.py b/pypy/module/_ffi/test/test_struct.py
--- a/pypy/module/_ffi/test/test_struct.py
+++ b/pypy/module/_ffi/test/test_struct.py
@@ -168,6 +168,20 @@
mem = self.read_raw_mem(struct.getaddr(), 'c_longlong', 2)
assert mem == [-9223372036854775808, -1]
+ def test_getfield_setfield_float(self):
+ import sys
+ from _ffi import _StructDescr, Field, types
+ longsize = types.slong.sizeof()
+ fields = [
+ Field('x', types.double),
+ ]
+ descr = _StructDescr('foo', fields)
+ struct = descr.allocate()
+ struct.setfield('x', 123.4)
+ assert struct.getfield('x') == 123.4
+ mem = self.read_raw_mem(struct.getaddr(), 'c_double', 1)
+ assert mem == [123.4]
+
def test_compute_shape(self):
from _ffi import Structure, Field, types
class Point(Structure):
More information about the pypy-commit
mailing list