| ====================== |
| What's New |
| ====================== |
| |
| |
| v1.12.2 |
| ======= |
| |
| * Added temporary workaround to compile on CPython 3.8.0a2. |
| |
| |
| v1.12.1 |
| ======= |
| |
| * CPython 3 on Windows: we again no longer compile with ``Py_LIMITED_API`` |
| by default because such modules *still* cannot be used with virtualenv. |
| The problem is that it doesn't work in CPython <= 3.4, and for |
| technical reason we can't enable this flag automatically based on the |
| version of Python. |
| |
| Like before, `Issue #350`_ mentions a workaround if you still want |
| the ``Py_LIMITED_API`` flag and *either* you are not concerned about |
| virtualenv *or* you are sure your module will not be used on CPython |
| <= 3.4: pass ``define_macros=[("Py_LIMITED_API", None)]`` to the |
| ``ffibuilder.set_source()`` call. |
| |
| |
| v1.12 |
| ===== |
| |
| * `Direct support for pkg-config`__. |
| |
| * ``ffi.from_buffer()`` takes a new optional *first* argument that gives |
| the array type of the result. It also takes an optional keyword argument |
| ``require_writable`` to refuse read-only Python buffers. |
| |
| * ``ffi.new()``, ``ffi.gc()`` or ``ffi.from_buffer()`` cdata objects |
| can now be released at known times, either by using the ``with`` |
| keyword or by calling the new ``ffi.release()``. |
| |
| * Windows, CPython 3.x: cffi modules are linked with ``python3.dll`` |
| again. This makes them independant on the exact CPython version, |
| like they are on other platforms. **It requires virtualenv 16.0.0.** |
| |
| * Accept an expression like ``ffi.new("int[4]", p)`` if ``p`` is itself |
| another cdata ``int[4]``. |
| |
| * CPython 2.x: ``ffi.dlopen()`` failed with non-ascii file names on Posix |
| |
| * CPython: if a thread is started from C and then runs Python code (with |
| callbacks or with the embedding solution), then previous versions of |
| cffi would contain possible crashes and/or memory leaks. Hopefully, |
| this has been fixed (see `issue #362`_). |
| |
| * Support for ``ffi.cdef(..., pack=N)`` where N is a power of two. |
| Means to emulate ``#pragma pack(N)`` on MSVC. Also, the default on |
| Windows is now ``pack=8``, like on MSVC. This might make a difference |
| in corner cases, although I can't think of one in the context of CFFI. |
| The old way ``ffi.cdef(..., packed=True)`` remains and is equivalent |
| to ``pack=1`` (saying e.g. that fields like ``int`` should be aligned |
| to 1 byte instead of 4). |
| |
| .. __: cdef.html#pkgconfig |
| .. _`issue #362`: https://bitbucket.org/cffi/cffi/issues/362/ |
| |
| |
| Older Versions |
| ============== |
| |
| v1.11.5 |
| ------- |
| |
| * `Issue #357`_: fix ``ffi.emit_python_code()`` which generated a buggy |
| Python file if you are using a ``struct`` with an anonymous ``union`` |
| field or vice-versa. |
| |
| * Windows: ``ffi.dlopen()`` should now handle unicode filenames. |
| |
| * ABI mode: implemented ``ffi.dlclose()`` for the in-line case (it used |
| to be present only in the out-of-line case). |
| |
| * Fixed a corner case for ``setup.py install --record=xx --root=yy`` |
| with an out-of-line ABI module. Also fixed `Issue #345`_. |
| |
| * More hacks on Windows for running CFFI's own ``setup.py``. |
| |
| * `Issue #358`_: in embedding, to protect against (the rare case of) |
| Python initialization from several threads in parallel, we have to use |
| a spin-lock. On CPython 3 it is worse because it might spin-lock for |
| a long time (execution of ``Py_InitializeEx()``). Sadly, recent |
| changes to CPython make that solution needed on CPython 2 too. |
| |
| * CPython 3 on Windows: we no longer compile with ``Py_LIMITED_API`` |
| by default because such modules cannot be used with virtualenv. |
| `Issue #350`_ mentions a workaround if you still want that and are not |
| concerned about virtualenv: pass a ``define_macros=[("Py_LIMITED_API", |
| None)]`` to the ``ffibuilder.set_source()`` call. |
| |
| .. _`Issue #345`: https://bitbucket.org/cffi/cffi/issues/345/ |
| .. _`Issue #350`: https://bitbucket.org/cffi/cffi/issues/350/ |
| .. _`Issue #358`: https://bitbucket.org/cffi/cffi/issues/358/ |
| .. _`Issue #357`: https://bitbucket.org/cffi/cffi/issues/357/ |
| |
| |
| v1.11.4 |
| ------- |
| |
| * Windows: reverted linking with ``python3.dll``, because |
| virtualenv does not make this DLL available to virtual environments |
| for now. See `Issue #355`_. On Windows only, the C extension |
| modules created by cffi follow for now the standard naming scheme |
| ``foo.cp36-win32.pyd``, to make it clear that they are regular |
| CPython modules depending on ``python36.dll``. |
| |
| .. _`Issue #355`: https://bitbucket.org/cffi/cffi/issues/355/ |
| |
| |
| v1.11.3 |
| ------- |
| |
| * Fix on CPython 3.x: reading the attributes ``__loader__`` or |
| ``__spec__`` from the cffi-generated lib modules gave a buggy |
| SystemError. (These attributes are always None, and provided only to |
| help compatibility with tools that expect them in all modules.) |
| |
| * More Windows fixes: workaround for MSVC not supporting large |
| literal strings in C code (from |
| ``ffi.embedding_init_code(large_string)``); and an issue with |
| ``Py_LIMITED_API`` linking with ``python35.dll/python36.dll`` instead |
| of ``python3.dll``. |
| |
| * Small documentation improvements. |
| |
| |
| v1.11.2 |
| ------- |
| |
| * Fix Windows issue with managing the thread-state on CPython 3.0 to 3.5 |
| |
| |
| v1.11.1 |
| ------- |
| |
| * Fix tests, remove deprecated C API usage |
| |
| * Fix (hack) for 3.6.0/3.6.1/3.6.2 giving incompatible binary extensions |
| (cpython issue `#29943`_) |
| |
| * Fix for 3.7.0a1+ |
| |
| .. _`#29943`: https://bugs.python.org/issue29943 |
| |
| |
| v1.11 |
| ----- |
| |
| * Support the modern standard types ``char16_t`` and ``char32_t``. |
| These work like ``wchar_t``: they represent one unicode character, or |
| when used as ``charN_t *`` or ``charN_t[]`` they represent a unicode |
| string. The difference with ``wchar_t`` is that they have a known, |
| fixed size. They should work at all places that used to work with |
| ``wchar_t`` (please report an issue if I missed something). Note |
| that with ``set_source()``, you need to make sure that these types are |
| actually defined by the C source you provide (if used in ``cdef()``). |
| |
| * Support the C99 types ``float _Complex`` and ``double _Complex``. |
| Note that libffi doesn't support them, which means that in the ABI |
| mode you still cannot call C functions that take complex numbers |
| directly as arguments or return type. |
| |
| * Fixed a rare race condition when creating multiple ``FFI`` instances |
| from multiple threads. (Note that you aren't meant to create many |
| ``FFI`` instances: in inline mode, you should write ``ffi = |
| cffi.FFI()`` at module level just after ``import cffi``; and in |
| out-of-line mode you don't instantiate ``FFI`` explicitly at all.) |
| |
| * Windows: using callbacks can be messy because the CFFI internal error |
| messages show up to stderr---but stderr goes nowhere in many |
| applications. This makes it particularly hard to get started with the |
| embedding mode. (Once you get started, you can at least use |
| ``@ffi.def_extern(onerror=...)`` and send the error logs where it |
| makes sense for your application, or record them in log files, and so |
| on.) So what is new in CFFI is that now, on Windows CFFI will try to |
| open a non-modal MessageBox (in addition to sending raw messages to |
| stderr). The MessageBox is only visible if the process stays alive: |
| typically, console applications that crash close immediately, but that |
| is also the situation where stderr should be visible anyway. |
| |
| * Progress on support for `callbacks in NetBSD`__. |
| |
| * Functions returning booleans would in some case still return 0 or 1 |
| instead of False or True. Fixed. |
| |
| * `ffi.gc()`__ now takes an optional third parameter, which gives an |
| estimate of the size (in bytes) of the object. So far, this is only |
| used by PyPy, to make the next GC occur more quickly (`issue #320`__). |
| In the future, this might have an effect on CPython too (provided |
| the CPython `issue 31105`__ is addressed). |
| |
| * Add a note to the documentation: the ABI mode gives function objects |
| that are *slower* to call than the API mode does. For some reason it |
| is often thought to be faster. It is not! |
| |
| .. __: https://bitbucket.org/cffi/cffi/issues/321/cffi-191-segmentation-fault-during-self |
| .. __: ref.html#ffi-gc |
| .. __: https://bitbucket.org/cffi/cffi/issues/320/improve-memory_pressure-management |
| .. __: http://bugs.python.org/issue31105 |
| |
| |
| v1.10.1 |
| ------- |
| |
| (only released inside PyPy 5.8.0) |
| |
| * Fixed the line numbers reported in case of ``cdef()`` errors. |
| Also, I just noticed, but pycparser always supported the preprocessor |
| directive ``# 42 "foo.h"`` to mean "from the next line, we're in file |
| foo.h starting from line 42", which it puts in the error messages. |
| |
| |
| v1.10 |
| ----- |
| |
| * Issue #295: use calloc() directly instead of |
| PyObject_Malloc()+memset() to handle ffi.new() with a default |
| allocator. Speeds up ``ffi.new(large-array)`` where most of the time |
| you never touch most of the array. |
| |
| * Some OS/X build fixes ("only with Xcode but without CLT"). |
| |
| * Improve a couple of error messages: when getting mismatched versions |
| of cffi and its backend; and when calling functions which cannot be |
| called with libffi because an argument is a struct that is "too |
| complicated" (and not a struct *pointer*, which always works). |
| |
| * Add support for some unusual compilers (non-msvc, non-gcc, non-icc, |
| non-clang) |
| |
| * Implemented the remaining cases for ``ffi.from_buffer``. Now all |
| buffer/memoryview objects can be passed. The one remaining check is |
| against passing unicode strings in Python 2. (They support the buffer |
| interface, but that gives the raw bytes behind the UTF16/UCS4 storage, |
| which is most of the times not what you expect. In Python 3 this has |
| been fixed and the unicode strings don't support the memoryview |
| interface any more.) |
| |
| * The C type ``_Bool`` or ``bool`` now converts to a Python boolean |
| when reading, instead of the content of the byte as an integer. The |
| potential incompatibility here is what occurs if the byte contains a |
| value different from 0 and 1. Previously, it would just return it; |
| with this change, CFFI raises an exception in this case. But this |
| case means "undefined behavior" in C; if you really have to interface |
| with a library relying on this, don't use ``bool`` in the CFFI side. |
| Also, it is still valid to use a byte string as initializer for a |
| ``bool[]``, but now it must only contain ``\x00`` or ``\x01``. As an |
| aside, ``ffi.string()`` no longer works on ``bool[]`` (but it never |
| made much sense, as this function stops at the first zero). |
| |
| * ``ffi.buffer`` is now the name of cffi's buffer type, and |
| ``ffi.buffer()`` works like before but is the constructor of that type. |
| |
| * ``ffi.addressof(lib, "name")`` now works also in in-line mode, not |
| only in out-of-line mode. This is useful for taking the address of |
| global variables. |
| |
| * Issue #255: ``cdata`` objects of a primitive type (integers, floats, |
| char) are now compared and ordered by value. For example, ``<cdata |
| 'int' 42>`` compares equal to ``42`` and ``<cdata 'char' b'A'>`` |
| compares equal to ``b'A'``. Unlike C, ``<cdata 'int' -1>`` does not |
| compare equal to ``ffi.cast("unsigned int", -1)``: it compares |
| smaller, because ``-1 < 4294967295``. |
| |
| * PyPy: ``ffi.new()`` and ``ffi.new_allocator()()`` did not record |
| "memory pressure", causing the GC to run too infrequently if you call |
| ``ffi.new()`` very often and/or with large arrays. Fixed in PyPy 5.7. |
| |
| * Support in ``ffi.cdef()`` for numeric expressions with ``+`` or |
| ``-``. Assumes that there is no overflow; it should be fixed first |
| before we add more general support for arbitrary arithmetic on |
| constants. |
| |
| |
| v1.9 |
| ---- |
| |
| * Structs with variable-sized arrays as their last field: now we track |
| the length of the array after ``ffi.new()`` is called, just like we |
| always tracked the length of ``ffi.new("int[]", 42)``. This lets us |
| detect out-of-range accesses to array items. This also lets us |
| display a better ``repr()``, and have the total size returned by |
| ``ffi.sizeof()`` and ``ffi.buffer()``. Previously both functions |
| would return a result based on the size of the declared structure |
| type, with an assumed empty array. (Thanks andrew for starting this |
| refactoring.) |
| |
| * Add support in ``cdef()/set_source()`` for unspecified-length arrays |
| in typedefs: ``typedef int foo_t[...];``. It was already supported |
| for global variables or structure fields. |
| |
| * I turned in v1.8 a warning from ``cffi/model.py`` into an error: |
| ``'enum xxx' has no values explicitly defined: refusing to guess which |
| integer type it is meant to be (unsigned/signed, int/long)``. Now I'm |
| turning it back to a warning again; it seems that guessing that the |
| enum has size ``int`` is a 99%-safe bet. (But not 100%, so it stays |
| as a warning.) |
| |
| * Fix leaks in the code handling ``FILE *`` arguments. In CPython 3 |
| there is a remaining issue that is hard to fix: if you pass a Python |
| file object to a ``FILE *`` argument, then ``os.dup()`` is used and |
| the new file descriptor is only closed when the GC reclaims the Python |
| file object---and not at the earlier time when you call ``close()``, |
| which only closes the original file descriptor. If this is an issue, |
| you should avoid this automatic convertion of Python file objects: |
| instead, explicitly manipulate file descriptors and call ``fdopen()`` |
| from C (...via cffi). |
| |
| |
| v1.8.3 |
| ------ |
| |
| * When passing a ``void *`` argument to a function with a different |
| pointer type, or vice-versa, the cast occurs automatically, like in C. |
| The same occurs for initialization with ``ffi.new()`` and a few other |
| places. However, I thought that ``char *`` had the same |
| property---but I was mistaken. In C you get the usual warning if you |
| try to give a ``char *`` to a ``char **`` argument, for example. |
| Sorry about the confusion. This has been fixed in CFFI by giving for |
| now a warning, too. It will turn into an error in a future version. |
| |
| |
| v1.8.2 |
| ------ |
| |
| * Issue #283: fixed ``ffi.new()`` on structures/unions with nested |
| anonymous structures/unions, when there is at least one union in |
| the mix. When initialized with a list or a dict, it should now |
| behave more closely like the ``{ }`` syntax does in GCC. |
| |
| |
| v1.8.1 |
| ------ |
| |
| * CPython 3.x: experimental: the generated C extension modules now use |
| the "limited API", which means that, as a compiled .so/.dll, it should |
| work directly on any version of CPython >= 3.2. The name produced by |
| distutils is still version-specific. To get the version-independent |
| name, you can rename it manually to ``NAME.abi3.so``, or use the very |
| recent setuptools 26. |
| |
| * Added ``ffi.compile(debug=...)``, similar to ``python setup.py build |
| --debug`` but defaulting to True if we are running a debugging |
| version of Python itself. |
| |
| |
| v1.8 |
| ---- |
| |
| * Removed the restriction that ``ffi.from_buffer()`` cannot be used on |
| byte strings. Now you can get a ``char *`` out of a byte string, |
| which is valid as long as the string object is kept alive. (But |
| don't use it to *modify* the string object! If you need this, use |
| ``bytearray`` or other official techniques.) |
| |
| * PyPy 5.4 can now pass a byte string directly to a ``char *`` |
| argument (in older versions, a copy would be made). This used to be |
| a CPython-only optimization. |
| |
| |
| v1.7 |
| ---- |
| |
| * ``ffi.gc(p, None)`` removes the destructor on an object previously |
| created by another call to ``ffi.gc()`` |
| |
| * ``bool(ffi.cast("primitive type", x))`` now returns False if the |
| value is zero (including ``-0.0``), and True otherwise. Previously |
| this would only return False for cdata objects of a pointer type when |
| the pointer is NULL. |
| |
| * bytearrays: ``ffi.from_buffer(bytearray-object)`` is now supported. |
| (The reason it was not supported was that it was hard to do in PyPy, |
| but it works since PyPy 5.3.) To call a C function with a ``char *`` |
| argument from a buffer object---now including bytearrays---you write |
| ``lib.foo(ffi.from_buffer(x))``. Additionally, this is now supported: |
| ``p[0:length] = bytearray-object``. The problem with this was that a |
| iterating over bytearrays gives *numbers* instead of *characters*. |
| (Now it is implemented with just a memcpy, of course, not actually |
| iterating over the characters.) |
| |
| * C++: compiling the generated C code with C++ was supposed to work, |
| but failed if you make use the ``bool`` type (because that is rendered |
| as the C ``_Bool`` type, which doesn't exist in C++). |
| |
| * ``help(lib)`` and ``help(lib.myfunc)`` now give useful information, |
| as well as ``dir(p)`` where ``p`` is a struct or pointer-to-struct. |
| |
| |
| v1.6 |
| ---- |
| |
| * `ffi.list_types()`_ |
| |
| * `ffi.unpack()`_ |
| |
| * `extern "Python+C"`_ |
| |
| * in API mode, ``lib.foo.__doc__`` contains the C signature now. On |
| CPython you can say ``help(lib.foo)``, but for some reason |
| ``help(lib)`` (or ``help(lib.foo)`` on PyPy) is still useless; I |
| haven't yet figured out the hacks needed to convince ``pydoc`` to |
| show more. (You can use ``dir(lib)`` but it is not most helpful.) |
| |
| * Yet another attempt at robustness of ``ffi.def_extern()`` against |
| CPython's interpreter shutdown logic. |
| |
| .. _`ffi.list_types()`: ref.html#ffi-list-types |
| .. _`ffi.unpack()`: ref.html#ffi-unpack |
| .. _`extern "Python+C"`: using.html#extern-python-c |
| |
| |
| v1.5.2 |
| ------ |
| |
| * Fix 1.5.1 for Python 2.6. |
| |
| |
| v1.5.1 |
| ------ |
| |
| * A few installation-time tweaks (thanks Stefano!) |
| |
| * Issue #245: Win32: ``__stdcall`` was never generated for |
| ``extern "Python"`` functions |
| |
| * Issue #246: trying to be more robust against CPython's fragile |
| interpreter shutdown logic |
| |
| |
| v1.5.0 |
| ------ |
| |
| * Support for `using CFFI for embedding`__. |
| |
| .. __: embedding.html |
| |
| |
| v1.4.2 |
| ------ |
| |
| Nothing changed from v1.4.1. |
| |
| |
| v1.4.1 |
| ------ |
| |
| * Fix the compilation failure of cffi on CPython 3.5.0. (3.5.1 works; |
| some detail changed that makes some underscore-starting macros |
| disappear from view of extension modules, and I worked around it, |
| thinking it changed in all 3.5 versions---but no: it was only in |
| 3.5.1.) |
| |
| |
| v1.4.0 |
| ------ |
| |
| * A `better way to do callbacks`__ has been added (faster and more |
| portable, and usually cleaner). It is a mechanism for the |
| out-of-line API mode that replaces the dynamic creation of callback |
| objects (i.e. C functions that invoke Python) with the static |
| declaration in ``cdef()`` of which callbacks are needed. This is |
| more C-like, in that you have to structure your code around the idea |
| that you get a fixed number of function pointers, instead of |
| creating them on-the-fly. |
| |
| * ``ffi.compile()`` now takes an optional ``verbose`` argument. When |
| ``True``, distutils prints the calls to the compiler. |
| |
| * ``ffi.compile()`` used to fail if given ``sources`` with a path that |
| includes ``".."``. Fixed. |
| |
| * ``ffi.init_once()`` added. See docs__. |
| |
| * ``dir(lib)`` now works on libs returned by ``ffi.dlopen()`` too. |
| |
| * Cleaned up and modernized the content of the ``demo`` subdirectory |
| in the sources (thanks matti!). |
| |
| * ``ffi.new_handle()`` is now guaranteed to return unique ``void *`` |
| values, even if called twice on the same object. Previously, in |
| that case, CPython would return two ``cdata`` objects with the same |
| ``void *`` value. This change is useful to add and remove handles |
| from a global dict (or set) without worrying about duplicates. |
| It already used to work like that on PyPy. |
| *This change can break code that used to work on CPython by relying |
| on the object to be kept alive by other means than keeping the |
| result of ffi.new_handle() alive.* (The corresponding `warning in |
| the docs`__ of ``ffi.new_handle()`` has been here since v0.8!) |
| |
| .. __: using.html#extern-python |
| .. __: ref.html#ffi-init-once |
| .. __: ref.html#ffi-new-handle |
| |
| |
| v1.3.1 |
| ------ |
| |
| * The optional typedefs (``bool``, ``FILE`` and all Windows types) were |
| not always available from out-of-line FFI objects. |
| |
| * Opaque enums are phased out from the cdefs: they now give a warning, |
| instead of (possibly wrongly) being assumed equal to ``unsigned int``. |
| Please report if you get a reasonable use case for them. |
| |
| * Some parsing details, notably ``volatile`` is passed along like |
| ``const`` and ``restrict``. Also, older versions of pycparser |
| mis-parse some pointer-to-pointer types like ``char * const *``: the |
| "const" ends up at the wrong place. Added a workaround. |
| |
| |
| v1.3.0 |
| ------ |
| |
| * Added `ffi.memmove()`_. |
| |
| * Pull request #64: out-of-line API mode: we can now declare |
| floating-point types with ``typedef float... foo_t;``. This only |
| works if ``foo_t`` is a float or a double, not ``long double``. |
| |
| * Issue #217: fix possible unaligned pointer manipulation, which crashes |
| on some architectures (64-bit, non-x86). |
| |
| * Issues #64 and #126: when using ``set_source()`` or ``verify()``, |
| the ``const`` and ``restrict`` keywords are copied from the cdef |
| to the generated C code; this fixes warnings by the C compiler. |
| It also fixes corner cases like ``typedef const int T; T a;`` |
| which would previously not consider ``a`` as a constant. (The |
| cdata objects themselves are never ``const``.) |
| |
| * Win32: support for ``__stdcall``. For callbacks and function |
| pointers; regular C functions still don't need to have their `calling |
| convention`_ declared. |
| |
| * Windows: CPython 2.7 distutils doesn't work with Microsoft's official |
| Visual Studio for Python, and I'm told this is `not a bug`__. For |
| ffi.compile(), we `removed a workaround`__ that was inside cffi but |
| which had unwanted side-effects. Try saying ``import setuptools`` |
| first, which patches distutils... |
| |
| .. _`ffi.memmove()`: ref.html#ffi-memmove |
| .. __: https://bugs.python.org/issue23246 |
| .. __: https://bitbucket.org/cffi/cffi/pull-requests/65/remove-_hack_at_distutils-which-imports/diff |
| .. _`calling convention`: using.html#windows-calling-conventions |
| |
| |
| v1.2.1 |
| ------ |
| |
| Nothing changed from v1.2.0. |
| |
| |
| v1.2.0 |
| ------ |
| |
| * Out-of-line mode: ``int a[][...];`` can be used to declare a structure |
| field or global variable which is, simultaneously, of total length |
| unknown to the C compiler (the ``a[]`` part) and each element is |
| itself an array of N integers, where the value of N *is* known to the |
| C compiler (the ``int`` and ``[...]`` parts around it). Similarly, |
| ``int a[5][...];`` is supported (but probably less useful: remember |
| that in C it means ``int (a[5])[...];``). |
| |
| * PyPy: the ``lib.some_function`` objects were missing the attributes |
| ``__name__``, ``__module__`` and ``__doc__`` that are expected e.g. by |
| some decorators-management functions from ``functools``. |
| |
| * Out-of-line API mode: you can now do ``from _example.lib import x`` |
| to import the name ``x`` from ``_example.lib``, even though the |
| ``lib`` object is not a standard module object. (Also works in ``from |
| _example.lib import *``, but this is even more of a hack and will fail |
| if ``lib`` happens to declare a name called ``__all__``. Note that |
| ``*`` excludes the global variables; only the functions and constants |
| make sense to import like this.) |
| |
| * ``lib.__dict__`` works again and gives you a copy of the |
| dict---assuming that ``lib`` has got no symbol called precisely |
| ``__dict__``. (In general, it is safer to use ``dir(lib)``.) |
| |
| * Out-of-line API mode: global variables are now fetched on demand at |
| every access. It fixes issue #212 (Windows DLL variables), and also |
| allows variables that are defined as dynamic macros (like ``errno``) |
| or ``__thread`` -local variables. (This change might also tighten |
| the C compiler's check on the variables' type.) |
| |
| * Issue #209: dereferencing NULL pointers now raises RuntimeError |
| instead of segfaulting. Meant as a debugging aid. The check is |
| only for NULL: if you dereference random or dead pointers you might |
| still get segfaults. |
| |
| * Issue #152: callbacks__: added an argument ``ffi.callback(..., |
| onerror=...)``. If the main callback function raises an exception |
| and ``onerror`` is provided, then ``onerror(exception, exc_value, |
| traceback)`` is called. This is similar to writing a ``try: |
| except:`` in the main callback function, but in some cases (e.g. a |
| signal) an exception can occur at the very start of the callback |
| function---before it had time to enter the ``try: except:`` block. |
| |
| * Issue #115: added ``ffi.new_allocator()``, which officializes |
| support for `alternative allocators`__. |
| |
| .. __: using.html#callbacks |
| .. __: ref.html#ffi-new-allocator |
| |
| |
| v1.1.2 |
| ------ |
| |
| * ``ffi.gc()``: fixed a race condition in multithreaded programs |
| introduced in 1.1.1 |
| |
| |
| v1.1.1 |
| ------ |
| |
| * Out-of-line mode: ``ffi.string()``, ``ffi.buffer()`` and |
| ``ffi.getwinerror()`` didn't accept their arguments as keyword |
| arguments, unlike their in-line mode equivalent. (It worked in PyPy.) |
| |
| * Out-of-line ABI mode: documented a restriction__ of ``ffi.dlopen()`` |
| when compared to the in-line mode. |
| |
| * ``ffi.gc()``: when called several times with equal pointers, it was |
| accidentally registering only the last destructor, or even none at |
| all depending on details. (It was correctly registering all of them |
| only in PyPy, and only with the out-of-line FFIs.) |
| |
| .. __: cdef.html#dlopen-note |
| |
| |
| v1.1.0 |
| ------ |
| |
| * Out-of-line API mode: we can now declare integer types with |
| ``typedef int... foo_t;``. The exact size and signedness of ``foo_t`` |
| is figured out by the compiler. |
| |
| * Out-of-line API mode: we can now declare multidimensional arrays |
| (as fields or as globals) with ``int n[...][...]``. Before, only the |
| outermost dimension would support the ``...`` syntax. |
| |
| * Out-of-line ABI mode: we now support any constant declaration, |
| instead of only integers whose value is given in the cdef. Such "new" |
| constants, i.e. either non-integers or without a value given in the |
| cdef, must correspond to actual symbols in the lib. At runtime they |
| are looked up the first time we access them. This is useful if the |
| library defines ``extern const sometype somename;``. |
| |
| * ``ffi.addressof(lib, "func_name")`` now returns a regular cdata object |
| of type "pointer to function". You can use it on any function from a |
| library in API mode (in ABI mode, all functions are already regular |
| cdata objects). To support this, you need to recompile your cffi |
| modules. |
| |
| * Issue #198: in API mode, if you declare constants of a ``struct`` |
| type, what you saw from lib.CONSTANT was corrupted. |
| |
| * Issue #196: ``ffi.set_source("package._ffi", None)`` would |
| incorrectly generate the Python source to ``package._ffi.py`` instead |
| of ``package/_ffi.py``. Also fixed: in some cases, if the C file was |
| in ``build/foo.c``, the .o file would be put in ``build/build/foo.o``. |
| |
| |
| v1.0.3 |
| ------ |
| |
| * Same as 1.0.2, apart from doc and test fixes on some platforms. |
| |
| |
| v1.0.2 |
| ------ |
| |
| * Variadic C functions (ending in a "..." argument) were not supported |
| in the out-of-line ABI mode. This was a bug---there was even a |
| (non-working) example__ doing exactly that! |
| |
| .. __: overview.html#out-of-line-abi-level |
| |
| |
| v1.0.1 |
| ------ |
| |
| * ``ffi.set_source()`` crashed if passed a ``sources=[..]`` argument. |
| Fixed by chrippa on pull request #60. |
| |
| * Issue #193: if we use a struct between the first cdef() where it is |
| declared and another cdef() where its fields are defined, then this |
| definition was ignored. |
| |
| * Enums were buggy if you used too many "..." in their definition. |
| |
| |
| v1.0.0 |
| ------ |
| |
| * The main news item is out-of-line module generation: |
| |
| * `for ABI level`_, with ``ffi.dlopen()`` |
| |
| * `for API level`_, which used to be with ``ffi.verify()``, now deprecated |
| |
| * (this page will list what is new from all versions from 1.0.0 |
| forward.) |
| |
| .. _`for ABI level`: overview.html#out-of-line-abi-level |
| .. _`for API level`: overview.html#out-of-line-api-level |