Author: Jeremy Thurgood <[email protected]>
Branch: split-verify
Changeset: r1357:9f5e04349245
Date: 2013-10-06 15:36 +0200
http://bitbucket.org/cffi/cffi/changeset/9f5e04349245/
Log: Fix (and test) ffi proxy functions.
diff --git a/cffi/builder.py b/cffi/builder.py
--- a/cffi/builder.py
+++ b/cffi/builder.py
@@ -13,85 +13,34 @@
_ffi = FFI()
-### The functions below are proxies for `_ffi` to make things more convenient.
+### Proxy `_ffi` methods to make things more convenient.
-@wraps(_ffi.typeof)
-def typeof(cdecl):
- return _ffi.typeof(cdecl)
+typeof = _ffi.typeof
+sizeof = _ffi.sizeof
+alignof = _ffi.alignof
+offsetof = _ffi.offsetof
+new = _ffi.new
+cast = _ffi.cast
+string = _ffi.string
+buffer = _ffi.buffer
+callback = _ffi.callback
+getctype = _ffi.getctype
+gc = _ffi.gc
-@wraps(_ffi.sizeof)
-def sizeof(cdecl):
- return _ffi.sizeof(cdecl)
+# Can't have properties on modules. :-(
+def get_errno():
+ return _ffi.errno
-@wraps(_ffi.alignof)
-def alignof(cdecl):
- return _ffi.alignof(cdecl)
+def set_errno(errno):
+ _ffi.errno = errno
-@wraps(_ffi.offsetof)
-def offsetof(cdecl):
- return _ffi.offsetof(cdecl)
-
-
-@wraps(_ffi.new)
-def new(cdecl, init=None):
- return _ffi.new(cdecl, init=init)
-
-
-@wraps(_ffi.cast)
-def cast(cdecl, source):
- return _ffi.cast(cdecl, source)
-
-
-@wraps(_ffi.string)
-def string(cdecl, maxlen=-1):
- return _ffi.string(cdecl, maxlen=-1)
-
-
-@wraps(_ffi.buffer)
-def buffer(cdecl, maxlen=-1):
- return _ffi.buffer(cdecl, maxlen=-1)
-
-
-@wraps(_ffi.callback)
-def callback(cdecl, python_callable=None, error=None):
- return _ffi.callback(cdecl, python_callable=python_callable, error=error)
-
-
-@wraps(_ffi.getctype)
-def getctype(cdecl, replace_with=''):
- return _ffi.getctype(cdecl, replace_with=replace_with)
-
-
-@wraps(_ffi.gc)
-def gc(cdata, destructor):
- return _ffi.gc(cdata, destructor)
-
-
-def _get_errno():
- return _ffi.errno
-def _set_errno(errno):
- _ffi.errno = errno
-errno = property(_get_errno, _set_errno, None,
- "the value of 'errno' from/to the C calls")
-
-
-@wraps(_ffi.addressof)
-def addressof(cdata, field=None):
- return _ffi.addressof(cdata, field=field)
-
-
-@wraps(_ffi.new_handle)
-def new_handle(x):
- return _ffi.new_handle(x)
-
-
-@wraps(_ffi.from_handle)
-def from_handle(x):
- return _ffi.from_handle(x)
+addressof = _ffi.addressof
+new_handle = _ffi.new_handle
+from_handle = _ffi.from_handle
### The functions below are generated by cffi.
diff --git a/testing/test_makelib.py b/testing/test_makelib.py
--- a/testing/test_makelib.py
+++ b/testing/test_makelib.py
@@ -80,3 +80,73 @@
assert lib_foo.sin(12.3) == math.sin(12.3)
lib_bar = foo_ffi.load_bar()
assert lib_bar.sin(12.3) == math.sin(12.3)
+
+
+def test_ffi_module_functions(tmpdir):
+ builder = FFIBuilder("foo_ffi", str(tmpdir))
+ builder.cdef("""
+ double sin(double x);
+ """)
+ builder.makelib('foo', '#include <math.h>')
+ builder.write_ffi_module()
+
+ sys.path.append(str(tmpdir))
+ try:
+ import foo_ffi
+ finally:
+ _clean_modules(tmpdir, 'foo_ffi')
+
+ assert foo_ffi.typeof == foo_ffi._ffi.typeof
+ assert foo_ffi.sizeof == foo_ffi._ffi.sizeof
+ assert foo_ffi.alignof == foo_ffi._ffi.alignof
+ assert foo_ffi.offsetof == foo_ffi._ffi.offsetof
+ assert foo_ffi.new == foo_ffi._ffi.new
+ assert foo_ffi.cast == foo_ffi._ffi.cast
+ assert foo_ffi.string == foo_ffi._ffi.string
+ assert foo_ffi.buffer == foo_ffi._ffi.buffer
+ assert foo_ffi.callback == foo_ffi._ffi.callback
+ assert foo_ffi.getctype == foo_ffi._ffi.getctype
+ assert foo_ffi.gc == foo_ffi._ffi.gc
+
+ foo_ffi.set_errno(7)
+ assert foo_ffi.get_errno() == 7
+
+ assert foo_ffi.addressof == foo_ffi._ffi.addressof
+ assert foo_ffi.new_handle == foo_ffi._ffi.new_handle
+ assert foo_ffi.from_handle == foo_ffi._ffi.from_handle
+
+
+def test_ffi_do_some_stuff(tmpdir):
+ builder = FFIBuilder("foo_ffi", str(tmpdir))
+ builder.cdef("""
+ struct foo_s { int x; int y; };
+ int grid_distance(struct foo_s offset);
+ """)
+ builder.makelib('foo', """
+ struct foo_s { int x; int y; };
+ int grid_distance(struct foo_s offset) {
+ return offset.x + offset.y;
+ }
+ """)
+ builder.write_ffi_module()
+
+ sys.path.append(str(tmpdir))
+ try:
+ import foo_ffi
+ finally:
+ _clean_modules(tmpdir, 'foo_ffi')
+
+ my_struct = foo_ffi.new('struct foo_s *', {'x': 1, 'y': 2})
+ assert foo_ffi.typeof(my_struct) == foo_ffi.typeof("struct foo_s *")
+ assert foo_ffi.sizeof('struct foo_s') == 2 * foo_ffi.sizeof('int')
+ assert foo_ffi.alignof('struct foo_s') == foo_ffi.sizeof('int')
+ assert foo_ffi.typeof(foo_ffi.cast('long', 42)) == foo_ffi.typeof('long')
+ assert foo_ffi.string(foo_ffi.new('char *', b"\x00")) == b""
+
+ def cb(n):
+ return n + 1
+ f = foo_ffi.callback("int(*)(int)", cb)
+ assert f(1) == 2
+
+ lib = foo_ffi.load_foo()
+ assert lib.grid_distance(my_struct[0]) == 3
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit