[pypy-commit] cffi default: Support bitfields in initializers.

arigo noreply at buildbot.pypy.org
Sat Jun 23 16:36:24 CEST 2012


Author: Armin Rigo <arigo at tunes.org>
Branch: 
Changeset: r497:9da8decd4c42
Date: 2012-06-23 16:31 +0200
http://bitbucket.org/cffi/cffi/changeset/9da8decd4c42/

Log:	Support bitfields in initializers.

diff --git a/c/_ffi_backend.c b/c/_ffi_backend.c
--- a/c/_ffi_backend.c
+++ b/c/_ffi_backend.c
@@ -699,6 +699,20 @@
     return -1;
 }
 
+static int    /* forward */
+convert_from_object(char *data, CTypeDescrObject *ct, PyObject *init);
+static int    /* forward */
+convert_from_object_bitfield(char *data, CFieldObject *cf, PyObject *init);
+
+static int
+convert_field_from_object(char *data, CFieldObject *cf, PyObject *value)
+{
+    if (cf->cf_bitshift >= 0)
+        return convert_from_object_bitfield(data, cf, value);
+    else
+        return convert_from_object(data, cf->cf_type, value);
+}
+
 static int
 convert_from_object(char *data, CTypeDescrObject *ct, PyObject *init)
 {
@@ -840,10 +854,8 @@
                                  ct->ct_name, n);
                     return -1;
                 }
-                if (bitfield_not_supported(cf) < 0)
-                    return -1;
-                if (convert_from_object(data + cf->cf_offset,
-                                        cf->cf_type, items[i]) < 0)
+                if (convert_field_from_object(data + cf->cf_offset,
+                                              cf, items[i]) < 0)
                     return -1;
                 cf = cf->cf_next;
             }
@@ -1374,10 +1386,7 @@
             /* write the field 'cf' */
             char *data = cd->c_data + cf->cf_offset;
             if (value != NULL) {
-                if (cf->cf_bitshift >= 0)
-                    return convert_from_object_bitfield(data, cf, value);
-                else
-                    return convert_from_object(data, cf->cf_type, value);
+                return convert_field_from_object(data, cf, value);
             }
             else {
                 PyErr_SetString(PyExc_AttributeError,
diff --git a/c/test_c.py b/c/test_c.py
--- a/c/test_c.py
+++ b/c/test_c.py
@@ -841,7 +841,8 @@
     BInt = new_primitive_type("int")
     BStruct = new_struct_type("foo")
     complete_struct_or_union(BStruct, [('a1', BInt, 1)])
-    py.test.raises(NotImplementedError, newp, new_pointer_type(BStruct), [-1])
+    p = newp(new_pointer_type(BStruct), [-1])
+    assert p.a1 == -1
 
 def test_weakref():
     import weakref


More information about the pypy-commit mailing list