[pypy-commit] cffi cffi-1.0: Fix issues with uncomputed alignment

arigo noreply at buildbot.pypy.org
Sun May 10 13:52:56 CEST 2015


Author: Armin Rigo <arigo at tunes.org>
Branch: cffi-1.0
Changeset: r1962:d09c84106ff9
Date: 2015-05-10 13:53 +0200
http://bitbucket.org/cffi/cffi/changeset/d09c84106ff9/

Log:	Fix issues with uncomputed alignment

diff --git a/_cffi1/realize_c_type.c b/_cffi1/realize_c_type.c
--- a/_cffi1/realize_c_type.c
+++ b/_cffi1/realize_c_type.c
@@ -329,10 +329,7 @@
             if (s->first_field_index >= 0) {
                 ct = (CTypeDescrObject *)x;
                 ct->ct_size = (Py_ssize_t)s->size;
-                if (s->alignment == 0)
-                    ct->ct_length = 1;    /* guess; should not really matter */
-                else
-                    ct->ct_length = s->alignment;
+                ct->ct_length = s->alignment;   /* may be -1 */
                 ct->ct_flags &= ~CT_IS_OPAQUE;
                 ct->ct_flags |= CT_LAZY_FIELD_LIST;
                 ct->ct_extra = builder;
@@ -678,9 +675,9 @@
         if (s->flags & _CFFI_F_PACKED)
             sflags |= SF_PACKED;
 
-        args = Py_BuildValue("(OOOnni)", ct, fields, Py_None,
+        args = Py_BuildValue("(OOOnii)", ct, fields, Py_None,
                              (Py_ssize_t)s->size,
-                             s->alignment ? (Py_ssize_t)s->alignment : -1,
+                             s->alignment,
                              sflags);
         Py_DECREF(fields);
         if (args == NULL)
diff --git a/_cffi1/recompiler.py b/_cffi1/recompiler.py
--- a/_cffi1/recompiler.py
+++ b/_cffi1/recompiler.py
@@ -606,7 +606,7 @@
             else:
                 if named_ptr is not None:
                     size = 'sizeof(*(%s)0)' % (named_ptr.name,)
-                    align = '0  /* unknown */'
+                    align = '-1  /* unknown alignment */'
                 else:
                     size = 'sizeof(%s)' % (cname,)
                     align = 'offsetof(struct _cffi_align_%s, y)' % (approxname,)
diff --git a/_cffi1/test_recompiler.py b/_cffi1/test_recompiler.py
--- a/_cffi1/test_recompiler.py
+++ b/_cffi1/test_recompiler.py
@@ -573,6 +573,7 @@
     lib = verify(ffi, "test_include_5",
         "typedef struct {int x[2]; int y; } *mystruct_p; //usually #include\n"
         "mystruct_p ff5(mystruct_p p) { p->x[1] += 42; return p; }")
+    assert ffi.alignof(ffi.typeof("mystruct_p").item) == 4
     assert ffi1.typeof("mystruct_p") is ffi.typeof("mystruct_p")
     p = ffi.new("mystruct_p", [[5, 10], -17])
     q = lib.ff5(p)
diff --git a/c/_cffi_backend.c b/c/_cffi_backend.c
--- a/c/_cffi_backend.c
+++ b/c/_cffi_backend.c
@@ -1496,6 +1496,10 @@
     if ((ct->ct_flags & (CT_PRIMITIVE_ANY|CT_STRUCT|CT_UNION)) &&
         !(ct->ct_flags & CT_IS_OPAQUE)) {
         align = ct->ct_length;
+        if (align == -1 && (ct->ct_flags & CT_LAZY_FIELD_LIST)) {
+            force_lazy_struct(ct);
+            align = ct->ct_length;
+        }
     }
     else if (ct->ct_flags & (CT_POINTER|CT_FUNCTIONPTR)) {
         struct aligncheck_ptr { char x; char *y; };


More information about the pypy-commit mailing list