Author: Antonio Cuni <[email protected]>
Branch: ffistruct
Changeset: r49042:5ed2330756bb
Date: 2011-11-09 19:11 +0100
http://bitbucket.org/pypy/pypy/changeset/5ed2330756bb/
Log: add support for char/unichar 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,14 @@
return space.wrap(r_uint(value))
return space.wrap(value)
#
+ if w_ffitype.is_char():
+ value = libffi.struct_getfield_int(w_ffitype.ffitype, self.rawmem,
offset)
+ return space.wrap(chr(value))
+ #
+ if w_ffitype.is_unichar():
+ value = libffi.struct_getfield_int(w_ffitype.ffitype, self.rawmem,
offset)
+ return space.wrap(unichr(value))
+ #
if w_ffitype.is_double():
value = libffi.struct_getfield_float(w_ffitype.ffitype,
self.rawmem, offset)
return space.wrap(value)
@@ -168,6 +176,11 @@
libffi.struct_setfield_int(w_ffitype.ffitype, self.rawmem, offset,
value)
return
#
+ if w_ffitype.is_char() or w_ffitype.is_unichar():
+ value = space.int_w(space.ord(w_value))
+ 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)
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
@@ -137,6 +137,8 @@
Field('ushort', types.ushort),
Field('uint', types.uint),
Field('ulong', types.ulong),
+ Field('char', types.char),
+ Field('unichar', types.unichar),
]
descr = _StructDescr('foo', fields)
struct = descr.allocate()
@@ -150,6 +152,11 @@
assert struct.getfield('ulong') == sys.maxint*2 + 1
struct.setfield('ulong', sys.maxint*2 + 2)
assert struct.getfield('ulong') == 0
+ struct.setfield('char', 'a')
+ assert struct.getfield('char') == 'a'
+ struct.setfield('unichar', u'\u1234')
+ assert struct.getfield('unichar') == u'\u1234'
+
def test_getfield_setfield_longlong(self):
import sys
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit