diff options
Diffstat (limited to 'doc/source/whatsnew.rst')
-rw-r--r-- | doc/source/whatsnew.rst | 714 |
1 files changed, 714 insertions, 0 deletions
diff --git a/doc/source/whatsnew.rst b/doc/source/whatsnew.rst new file mode 100644 index 0000000..18bb218 --- /dev/null +++ b/doc/source/whatsnew.rst @@ -0,0 +1,714 @@ +====================== +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 |