Le lun. 29 oct. 2018 à 06:32, Benjamin Peterson <[email protected]> a écrit :
> > My overall approach is to make sure that we don't leak functions by
> > mistakes into the public API or into the stable API anymore. For
> > example, if a function is really for the core, put it in pycore/. It
> > will be more explicit when reviewing a change for example.
>
> How does the current Include/internal/ directory fail at accomplishing your
> goal?
Hum, let me understand how I came into this issue. I tried to convert
_PyObject_GC_TRACK() macro to a static inline function. The macro uses
"_PyGC_generation0" which is defined earlier as: "extern PyGC_Head
*_PyGC_generation0;". Problem: this symbol has been removed when Eric
Snow moved it into _PyRuntime which contains "#define
_PyGC_generation0 _PyRuntime.gc.generation0".
Hum, how is possible that _PyObject_GC_TRACK() of objimpl.h works as expected?
It seems like all C file using this macro explicitly uses #include
"internal/pystate.h" which uses #include "internal/mem.h". Oh.
To me, it seems wrong that a function or macro defined in
Include/objimpl.h requires an explicit #include "internal/pystate.h".
objimpl.h should be self-sufficient.
I started to hack Include/internals/*.h, but then I have been traped
by #include which is relative: an include from Include/internals/
first looks for the included file in Include/internals/. It means that
Include/internals/mem.h cannot include Include/objimpl.h if
Include/internals/objimpl.h also exists.
Well, I would like to reorganize all these headers to make them more
consistent, and converting macros to static inline functions force me
to fix dependencies between header files.
> > Py_BUILD_CORE is not only used to select which functions you get.
> > Py_BUILD_CORE is also commonly used to get a macro instead of a
> > function call, for best performances.
>
> I think the macro and function versions should just have different names then.
I don't want to break the backward compatibility. I would like to make
small steps towards a better API. Concrete example with pystate.h:
/* Variable and macro for in-line access to current thread state */
/* Assuming the current thread holds the GIL, this is the
PyThreadState for the current thread. */
#ifdef Py_BUILD_CORE
# define _PyThreadState_Current _PyRuntime.gilstate.tstate_current
# define PyThreadState_GET() \
((PyThreadState*)_Py_atomic_load_relaxed(&_PyThreadState_Current))
#else
# define PyThreadState_GET() PyThreadState_Get()
#endif
We cannot remove PyThreadState_GET() from the Python C API. Removing
any function is likely going to break multiple C extensions.
I don't want to change too many things at once.
My first intent is to convert _PyObject_GC_TRACK() into a static
function, not to break the Python C API :-)
Victor
_______________________________________________
Python-Dev mailing list
[email protected]
https://mail.python.org/mailman/listinfo/python-dev
Unsubscribe:
https://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com