Author: Armin Rigo <ar...@tunes.org> Branch: Changeset: r1257:5494afe611a2 Date: 2013-05-30 18:16 +0200 http://bitbucket.org/cffi/cffi/changeset/5494afe611a2/
Log: Failing tests for issue #82. diff --git a/testing/test_ffi_backend.py b/testing/test_ffi_backend.py --- a/testing/test_ffi_backend.py +++ b/testing/test_ffi_backend.py @@ -1,4 +1,4 @@ -import py +import py, sys from testing import backend_tests, test_function, test_ownlib from cffi import FFI import _cffi_backend @@ -36,3 +36,52 @@ assert ffi.from_handle(p) is o assert ffi.from_handle(ffi.cast("char *", p)) is o py.test.raises(RuntimeError, ffi.from_handle, ffi.NULL) + + +class TestBitfield: + def check(self, source, expected_ofs_y, expected_align, expected_size): + # verify the information with gcc + if sys.platform != "win32": + ffi1 = FFI() + ffi1.cdef("static const int Gofs_y, Galign, Gsize;") + lib = ffi1.verify(""" + struct s1 { %s }; + struct sa { char a; struct s1 b; }; + #define Gofs_y offsetof(struct s1, y) + #define Galign offsetof(struct sa, b) + #define Gsize sizeof(struct s1) + """ % source) + assert lib.Gofs_y == expected_ofs_y + assert lib.Galign == expected_align + assert lib.Gsize == expected_size + # the real test follows + ffi = FFI() + ffi.cdef("struct s1 { %s };" % source) + assert ffi.offsetof("struct s1", "y") == expected_ofs_y + assert ffi.alignof("struct s1") == expected_align + assert ffi.sizeof("struct s1") == expected_size + + def test_bitfield_basic(self): + self.check("int a; int b:9; int c:20; int y;", 8, 4, 12) + self.check("int a; short b:9; short c:7; int y;", 8, 4, 12) + self.check("int a; short b:9; short c:9; int y;", 8, 4, 12) + + def test_bitfield_reuse_if_enough_space(self): + self.check("char a; int b:9; char y;", 3, 4, 4) + self.check("char a; short b:9; char y;", 4, 2, 6) + + def test_bitfield_anonymous_no_align(self): + L = FFI().alignof("long long") + self.check("char x; int z:1; char y;", 2, 4, 4) + self.check("char x; int :1; char y;", 2, 1, 3) + self.check("char x; long long z:48; char y;", 7, L, 8) + self.check("char x; long long :48; char y;", 7, 1, 8) + self.check("char x; long long z:56; char y;", 8, L, 8 + L) + self.check("char x; long long :56; char y;", 8, 1, 9) + self.check("char x; long long z:57; char y;", L + 8, L, L + 8 + L) + self.check("char x; long long :57; char y;", L + 8, 1, L + 9) + + def test_bitfield_zero(self): + L = FFI().alignof("long long") + self.check("char x; int :0; char y;", 4, 1, 5) + self.check("char x; long long :0; char y;", L, 1, L + 1) _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit