Author: Armin Rigo <[email protected]>
Branch: cffi-1.0
Changeset: r77244:69505a9f7b2b
Date: 2015-05-09 12:13 +0200
http://bitbucket.org/pypy/pypy/changeset/69505a9f7b2b/
Log: OP_BITFIELD
diff --git a/pypy/module/_cffi_backend/realize_c_type.py
b/pypy/module/_cffi_backend/realize_c_type.py
--- a/pypy/module/_cffi_backend/realize_c_type.py
+++ b/pypy/module/_cffi_backend/realize_c_type.py
@@ -336,20 +336,23 @@
fields_w = [None] * num_fields
for i in range(num_fields):
- fbitsize = -1
fld = ffi.ctxobj.ctx.c_fields[first_field + i]
+ field_name = rffi.charp2str(fld.c_name)
+ field_size = rffi.getintfield(fld, 'c_field_size')
+ field_offset = rffi.getintfield(fld, 'c_field_offset')
op = rffi.getintfield(fld, 'c_field_type_op')
case = getop(op)
if case == cffi_opcode.OP_NOOP:
- # standard field
- w_ctf = realize_c_type(ffi, ffi.ctxobj.ctx.c_types, getarg(op))
+ fbitsize = -1 # standard field
+ elif case == cffi_opcode.OP_BITFIELD:
+ assert field_size >= 0
+ fbitsize = field_size
else:
raise oefmt(space.w_NotImplementedError, "field op=%d", case)
- field_name = rffi.charp2str(fld.c_name)
- field_size = rffi.getintfield(fld, 'c_field_size')
- field_offset = rffi.getintfield(fld, 'c_field_offset')
+ w_ctf = realize_c_type(ffi, ffi.ctxobj.ctx.c_types, getarg(op))
+
if field_offset == -1:
# unnamed struct, with field positions and sizes entirely
# determined by complete_struct_or_union() and not checked.
diff --git a/pypy/module/_cffi_backend/test/test_recompiler.py
b/pypy/module/_cffi_backend/test/test_recompiler.py
--- a/pypy/module/_cffi_backend/test/test_recompiler.py
+++ b/pypy/module/_cffi_backend/test/test_recompiler.py
@@ -596,3 +596,14 @@
p = lib.ff7()
assert ffi.cast("int *", p)[0] == 42
assert lib.ff7b(p) == 42
+
+ def test_bitfield_basic(self):
+ ffi, lib = self.prepare(
+ "struct bitfield { int a:10, b:25; };",
+ "test_bitfield_basic",
+ "struct bitfield { int a:10, b:25; };")
+ assert ffi.sizeof("struct bitfield") == 8
+ s = ffi.new("struct bitfield *")
+ s.a = -512
+ raises(OverflowError, "s.a = -513")
+ assert s.a == -512
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit