I agree that passing a struct size as struct member values sounds a bit
unidiomatic.

Also, it doesn't achieve ABI stability, just allows erroring out in
case the user links with the wrong Python version.

Regards

Antoine.


On Sun, 29 Sep 2019 16:47:41 +1000
Nick Coghlan <ncogh...@gmail.com> wrote:
> On Sat, 28 Sep 2019 at 12:56, Victor Stinner <vstin...@python.org> wrote:
> >
> > Hi,
> >
> > I dislike having to do that, but I had to make a last minute change in
> > my PEP 587 "Python Initialization Configuration" to allow to modify
> > the structure in the future without breaking the backward
> > compatibility. I added a "struct_size" field to PyPreConfig and
> > PyConfig:
> >
> > * https://bugs.python.org/issue38304
> > * 
> > https://github.com/python/peps/commit/afa38c0bef7738b8fcc3173daee8488e0420833d
> >
> > The example:
> >
> >    PyConfig config;
> >    PyStatus status = PyConfig_InitPythonConfig(&config);
> >    ...
> >
> > must now be written:
> >
> >    PyConfig config;
> >    config.struct_size = sizeof(PyConfig);
> >    PyStatus status = PyConfig_InitPythonConfig(&config);
> >    ...
> >
> > At the beginning, I used a private "_config_version" field which was
> > initialized statically by a macro. But it was decided to replace
> > macros with functions. I only noticed today that the conversion to
> > function broke the API/ABI future compatibility.
> >
> > PyConfig_InitPythonConfig() got uninitialized memory and didn't know
> > the size of the config variable.  
> 
> I don't quite understand the purpose of this change, as there's no
> stable ABI for applications embedding CPython. As a result, updating
> to a new X.Y.0 release always requires rebuilding the entire
> application, not just building and relinking CPython.
> 
> I could understand a change to require passing in an expected Python
> version so we can fail more gracefully on a bad link where an
> application that intended to embed Python 3.8 is incorrectly linked
> against Python 3.9 (for example), but performing that kind of check
> would require passing in PY_VERSION_HEX, not the size of the config
> struct.
> 
> > With my change, the function now requires the "struct_size" field to
> > be set, and so it can support internally different versions of the
> > PyConfig structure.
> >
> > Storing the structure size directly in the structure is a common
> > practice in the Windows API which is a good example of long term ABI
> > compatibility.  
> 
> This analogy doesn't hold, as Microsoft explicitly support running old
> binaries on new versions of Windows, and hence need a way to determine
> which version of the structure is being passed in.
> 
> We don't support that - all our APIs that accept
> PyObject/PyTypeObject/etc require that the caller pass in structs of
> the correct size for the version of Python being used. The PyConfig
> and PyPreConfig structs are no different from PyObject in that regard:
> if there's a size mismatch, then the developers of the embedding
> application have somehow messed up their build process.
> 
> The stable ABI is a different story, but that's why we try very hard
> to avoid exposing any structs in the stable ABI.
> 
> Cheers,
> Nick.
> 


_______________________________________________
Python-Dev mailing list -- python-dev@python.org
To unsubscribe send an email to python-dev-le...@python.org
https://mail.python.org/mailman3/lists/python-dev.python.org/
Message archived at 
https://mail.python.org/archives/list/python-dev@python.org/message/ZDZ7DFZZIUYGQJOGZ3ONTTCRYGZ6KVCS/

Reply via email to