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

Reply via email to