[Python-Dev] Using PEP384 Stable ABI for the lzma extension module
Amaury Forgeot d'Arc
amauryfa at gmail.com
Tue Oct 4 18:18:27 CEST 2011
Hi,
Has someone already tried to *really* use Py_LIMITED_API
for some "serious" extension module?
I wanted to give it a try for the _lzma module (see issue 6715)
because liblzma does not compile with Microsoft compilers; an
alternative could be to use mingw to (pre)build _lzma.pyd, which would
link with a static liblzma.a also compiled with mingw.
Mixing compilers in a Python process is one of the reasons of PEP384,
so I added #define Py_LIMITED_API on top of the module,
and "fixed" the issues one by one:
- Py_LIMITED_API is incompatible with --with-pydebug, and compilation stops.
I skipped the check to continue.
- I replaced PyBytes_GET_SIZE() with Py_SIZE(), which is OK,
and PyBytes_AS_STRING() with PyBytes_AsString(), which may
have a slight performance impact.
- I replaced
Py_TYPE(self)->tp_free((PyObject *)self);
with PyObject_Del(self), I hope this is the same thing
(for a non-GC object)
- _PyBytes_Resize() is missing; I moved it under a Py_LIMITED_API
section.
- For the "y*" argument spec, the Py_buffer structure is required
(only for two fields: buf and len), as well as PyBuffer_Release()
- PyType_FromSpec() does not call PyType_Ready(), which caused
crashes in __new__.
Now the module seems to work correctly and passes tests... at least on
Linux in a standard environment. I will do other tests on Windows.
What do you think about using the stable ABI even in shipped extensions?
Have you already used it somewhere else?
Cheers,
--
Amaury Forgeot d'Arc
More information about the Python-Dev
mailing list