[pypy-commit] cffi default: alignof() on a non-completed struct
arigo
noreply at buildbot.pypy.org
Sat Jun 23 15:42:46 CEST 2012
Author: Armin Rigo <arigo at tunes.org>
Branch:
Changeset: r496:d5a0cbf8a551
Date: 2012-06-23 15:42 +0200
http://bitbucket.org/cffi/cffi/changeset/d5a0cbf8a551/
Log: alignof() on a non-completed struct
diff --git a/c/_ffi_backend.c b/c/_ffi_backend.c
--- a/c/_ffi_backend.c
+++ b/c/_ffi_backend.c
@@ -962,7 +962,8 @@
{
int align;
retry:
- if (ct->ct_flags & (CT_PRIMITIVE_ANY|CT_STRUCT|CT_UNION)) {
+ if ((ct->ct_flags & (CT_PRIMITIVE_ANY|CT_STRUCT|CT_UNION)) &&
+ !(ct->ct_flags & CT_IS_OPAQUE)) {
align = ct->ct_length;
}
else if (ct->ct_flags & (CT_POINTER|CT_FUNCTIONPTR)) {
@@ -980,7 +981,7 @@
}
if ((align < 1) || (align & (align-1))) {
- PyErr_Format(PyExc_TypeError,
+ PyErr_Format(PyExc_SystemError,
"found for ctype '%s' bogus alignment '%d'",
ct->ct_name, align);
return -1;
@@ -2361,6 +2362,7 @@
return NULL;
td->ct_size = -1;
+ td->ct_length = -1;
td->ct_flags = flag | CT_IS_OPAQUE;
memcpy(td->ct_name, kind, kindlen);
td->ct_name[kindlen] = ' ';
diff --git a/c/test_c.py b/c/test_c.py
--- a/c/test_c.py
+++ b/c/test_c.py
@@ -450,6 +450,7 @@
assert repr(BStruct) == "<ctype 'struct foo'>"
BPtr = new_pointer_type(BStruct)
assert repr(BPtr) == "<ctype 'struct foo *'>"
+ py.test.raises(TypeError, alignof, BStruct)
def test_new_union_type():
BUnion = new_union_type("foo")
More information about the pypy-commit
mailing list