Author: Armin Rigo <[email protected]>
Branch:
Changeset: r64826:c7cda7189297
Date: 2013-06-08 11:26 +0200
http://bitbucket.org/pypy/pypy/changeset/c7cda7189297/
Log: Import cffi/28f10889b5aa.
diff --git a/lib_pypy/cffi/api.py b/lib_pypy/cffi/api.py
--- a/lib_pypy/cffi/api.py
+++ b/lib_pypy/cffi/api.py
@@ -361,13 +361,13 @@
backend = ffi._backend
try:
if '.' not in name and '/' not in name:
- raise OSError
+ raise OSError("library not found: %r" % (name,))
backendlib = backend.load_library(name, flags)
except OSError:
import ctypes.util
path = ctypes.util.find_library(name)
if path is None:
- raise OSError("library not found: %r" % (name,))
+ raise # propagate the original OSError
backendlib = backend.load_library(path, flags)
copied_enums = []
#
diff --git a/pypy/module/test_lib_pypy/cffi_tests/test_ffi_backend.py
b/pypy/module/test_lib_pypy/cffi_tests/test_ffi_backend.py
--- a/pypy/module/test_lib_pypy/cffi_tests/test_ffi_backend.py
+++ b/pypy/module/test_lib_pypy/cffi_tests/test_ffi_backend.py
@@ -41,40 +41,43 @@
class TestBitfield:
def check(self, source, expected_ofs_y, expected_align, expected_size):
+ # NOTE: 'expected_*' is the numbers expected from GCC.
+ # The numbers expected from MSVC are not explicitly written
+ # in this file, and will just be taken from the compiler.
ffi = FFI()
ffi.cdef("struct s1 { %s };" % source)
ctype = ffi.typeof("struct s1")
# verify the information with gcc
- if sys.platform != "win32":
- ffi1 = FFI()
- ffi1.cdef("""
- static const int Gofs_y, Galign, Gsize;
- struct s1 *try_with_value(int fieldnum, long long value);
- """)
- fnames = [name for name, cfield in ctype.fields
- if name and cfield.bitsize > 0]
- setters = ['case %d: s.%s = value; break;' % iname
- for iname in enumerate(fnames)]
- 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)
- struct s1 *try_with_value(int fieldnum, long long value)
- {
- static struct s1 s;
- memset(&s, 0, sizeof(s));
- switch (fieldnum) { %s }
- return &s;
- }
- """ % (source, ' '.join(setters)))
- assert lib.Gofs_y == expected_ofs_y
- assert lib.Galign == expected_align
- assert lib.Gsize == expected_size
+ ffi1 = FFI()
+ ffi1.cdef("""
+ static const int Gofs_y, Galign, Gsize;
+ struct s1 *try_with_value(int fieldnum, long long value);
+ """)
+ fnames = [name for name, cfield in ctype.fields
+ if name and cfield.bitsize > 0]
+ setters = ['case %d: s.%s = value; break;' % iname
+ for iname in enumerate(fnames)]
+ 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)
+ struct s1 *try_with_value(int fieldnum, long long value)
+ {
+ static struct s1 s;
+ memset(&s, 0, sizeof(s));
+ switch (fieldnum) { %s }
+ return &s;
+ }
+ """ % (source, ' '.join(setters)))
+ if sys.platform == 'win32':
+ expected_ofs_y = lib.Gofs_y
+ expected_align = lib.Galign
+ expected_size = lib.Gsize
else:
- lib = None
- fnames = None
+ assert (lib.Gofs_y, lib.Galign, lib.Gsize) == (
+ expected_ofs_y, expected_align, expected_size)
# the real test follows
assert ffi.offsetof("struct s1", "y") == expected_ofs_y
assert ffi.alignof("struct s1") == expected_align
@@ -99,10 +102,9 @@
setattr(s, name, value)
assert getattr(s, name) == value
raw1 = ffi.buffer(s)[:]
- if lib is not None:
- t = lib.try_with_value(fnames.index(name), value)
- raw2 = ffi.buffer(t, len(raw1))[:]
- assert raw1 == raw2
+ t = lib.try_with_value(fnames.index(name), value)
+ raw2 = ffi.buffer(t, len(raw1))[:]
+ assert raw1 == raw2
def test_bitfield_basic(self):
self.check("int a; int b:9; int c:20; int y;", 8, 4, 12)
@@ -136,9 +138,11 @@
L = FFI().alignof("long long")
self.check("char y; int :0;", 0, 1, 4)
self.check("char x; int :0; char y;", 4, 1, 5)
+ self.check("char x; int :0; int :0; char y;", 4, 1, 5)
self.check("char x; long long :0; char y;", L, 1, L + 1)
self.check("short x, y; int :0; int :0;", 2, 2, 4)
self.check("char x; int :0; short b:1; char y;", 5, 2, 6)
+ self.check("int a:1; int :0; int b:1; char y;", 5, 4, 8)
def test_error_cases(self):
ffi = FFI()
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit