From 5e4af2a3e90d78fdf6a4cc42e0472576b1f2b975 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Sat, 22 Jul 2023 17:04:34 +0200 Subject: [PATCH] gh-106320: Move private _PySet API to the internal API (#107041) * Add pycore_setobject.h header file. * Move the following API to the internal C API: * _PySet_Dummy * _PySet_NextEntry() * _PySet_Update() --- Include/cpython/setobject.h | 5 ----- Include/internal/pycore_pymem.h | 2 +- Include/internal/pycore_setobject.h | 25 +++++++++++++++++++++++++ Makefile.pre.in | 1 + Modules/_abc.c | 1 + Modules/_pickle.c | 1 + Objects/codeobject.c | 1 + Objects/dictobject.c | 1 + Objects/setobject.c | 1 + PCbuild/pythoncore.vcxproj | 1 + PCbuild/pythoncore.vcxproj.filters | 3 +++ Python/ast_opt.c | 5 +++-- Python/bytecodes.c | 7 ++++--- Python/ceval.c | 7 ++++--- Python/compile.c | 3 ++- Python/executor.c | 1 + Python/marshal.c | 3 ++- Python/pylifecycle.c | 1 + 18 files changed, 53 insertions(+), 16 deletions(-) create mode 100644 Include/internal/pycore_setobject.h diff --git a/Include/cpython/setobject.h b/Include/cpython/setobject.h index 20fd63eaae5..1778c778a05 100644 --- a/Include/cpython/setobject.h +++ b/Include/cpython/setobject.h @@ -65,8 +65,3 @@ static inline Py_ssize_t PySet_GET_SIZE(PyObject *so) { return _PySet_CAST(so)->used; } #define PySet_GET_SIZE(so) PySet_GET_SIZE(_PyObject_CAST(so)) - -PyAPI_DATA(PyObject *) _PySet_Dummy; - -PyAPI_FUNC(int) _PySet_NextEntry(PyObject *set, Py_ssize_t *pos, PyObject **key, Py_hash_t *hash); -PyAPI_FUNC(int) _PySet_Update(PyObject *set, PyObject *iterable); diff --git a/Include/internal/pycore_pymem.h b/Include/internal/pycore_pymem.h index 81a707a0a5d..c2f03254bb8 100644 --- a/Include/internal/pycore_pymem.h +++ b/Include/internal/pycore_pymem.h @@ -95,4 +95,4 @@ PyAPI_FUNC(int) _PyMem_SetupAllocators(PyMemAllocatorName allocator); #ifdef __cplusplus } #endif -#endif /* !Py_INTERNAL_PYMEM_H */ +#endif // !Py_INTERNAL_PYMEM_H diff --git a/Include/internal/pycore_setobject.h b/Include/internal/pycore_setobject.h new file mode 100644 index 00000000000..96f9aea7be9 --- /dev/null +++ b/Include/internal/pycore_setobject.h @@ -0,0 +1,25 @@ +#ifndef Py_INTERNAL_SETOBJECT_H +#define Py_INTERNAL_SETOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +// _pickle shared extension uses _PySet_NextEntry() and _PySet_Update() +PyAPI_FUNC(int) _PySet_NextEntry( + PyObject *set, + Py_ssize_t *pos, + PyObject **key, + Py_hash_t *hash); +PyAPI_FUNC(int) _PySet_Update(PyObject *set, PyObject *iterable); + +// Export _PySet_Dummy for the gdb plugin's benefit +PyAPI_DATA(PyObject *) _PySet_Dummy; + +#ifdef __cplusplus +} +#endif +#endif // !Py_INTERNAL_SETOBJECT_H diff --git a/Makefile.pre.in b/Makefile.pre.in index f3a0db163ed..a4f76eaaaba 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -1798,6 +1798,7 @@ PYTHON_HEADERS= \ $(srcdir)/Include/internal/pycore_runtime.h \ $(srcdir)/Include/internal/pycore_runtime_init_generated.h \ $(srcdir)/Include/internal/pycore_runtime_init.h \ + $(srcdir)/Include/internal/pycore_setobject.h \ $(srcdir)/Include/internal/pycore_signal.h \ $(srcdir)/Include/internal/pycore_sliceobject.h \ $(srcdir)/Include/internal/pycore_strhex.h \ diff --git a/Modules/_abc.c b/Modules/_abc.c index 8a3aa9cb888..9473905243d 100644 --- a/Modules/_abc.c +++ b/Modules/_abc.c @@ -7,6 +7,7 @@ #include "pycore_moduleobject.h" // _PyModule_GetState() #include "pycore_object.h" // _PyType_GetSubclasses() #include "pycore_runtime.h" // _Py_ID() +#include "pycore_setobject.h" // _PySet_NextEntry() #include "pycore_typeobject.h" // _PyType_GetMRO() #include "pycore_weakref.h" // _PyWeakref_GET_REF() #include "clinic/_abc.c.h" diff --git a/Modules/_pickle.c b/Modules/_pickle.c index f2e98c10ef7..d9395e35daf 100644 --- a/Modules/_pickle.c +++ b/Modules/_pickle.c @@ -15,6 +15,7 @@ #include "pycore_object.h" // _PyNone_Type #include "pycore_pystate.h" // _PyThreadState_GET() #include "pycore_runtime.h" // _Py_ID() +#include "pycore_setobject.h" // _PySet_NextEntry() #include "structmember.h" // PyMemberDef #include // strtol() diff --git a/Objects/codeobject.c b/Objects/codeobject.c index d2670c71caa..977e5b05b3d 100644 --- a/Objects/codeobject.c +++ b/Objects/codeobject.c @@ -8,6 +8,7 @@ #include "pycore_interp.h" // PyInterpreterState.co_extra_freefuncs #include "pycore_opcode.h" // _PyOpcode_Deopt #include "pycore_pystate.h" // _PyInterpreterState_GET() +#include "pycore_setobject.h" // _PySet_NextEntry() #include "pycore_tuple.h" // _PyTuple_ITEMS() #include "clinic/codeobject.c.h" diff --git a/Objects/dictobject.c b/Objects/dictobject.c index 3f9297c8a41..26e2dc31e36 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -121,6 +121,7 @@ As a consequence of this, split keys have a maximum size of 16. #include "pycore_object.h" // _PyObject_GC_TRACK() #include "pycore_pyerrors.h" // _PyErr_GetRaisedException() #include "pycore_pystate.h" // _PyThreadState_GET() +#include "pycore_setobject.h" // _PySet_NextEntry() #include "stringlib/eq.h" // unicode_eq() #include diff --git a/Objects/setobject.c b/Objects/setobject.c index 4ac541b9509..2f12320254e 100644 --- a/Objects/setobject.c +++ b/Objects/setobject.c @@ -34,6 +34,7 @@ #include "Python.h" #include "pycore_modsupport.h" // _PyArg_NoKwnames() #include "pycore_object.h" // _PyObject_GC_UNTRACK() +#include "pycore_setobject.h" // _PySet_NextEntry() definition #include // offsetof() /* Object used as dummy key to fill deleted entries */ diff --git a/PCbuild/pythoncore.vcxproj b/PCbuild/pythoncore.vcxproj index 0fe24082ca4..bfe59acf12a 100644 --- a/PCbuild/pythoncore.vcxproj +++ b/PCbuild/pythoncore.vcxproj @@ -261,6 +261,7 @@ + diff --git a/PCbuild/pythoncore.vcxproj.filters b/PCbuild/pythoncore.vcxproj.filters index 2b3793cb0f7..0a8b0c3faf5 100644 --- a/PCbuild/pythoncore.vcxproj.filters +++ b/PCbuild/pythoncore.vcxproj.filters @@ -687,6 +687,9 @@ Include\internal + + Include\internal + Include\internal diff --git a/Python/ast_opt.c b/Python/ast_opt.c index 276e910089a..ad1e312b084 100644 --- a/Python/ast_opt.c +++ b/Python/ast_opt.c @@ -1,9 +1,10 @@ /* AST Optimizer */ #include "Python.h" #include "pycore_ast.h" // _PyAST_GetDocString() -#include "pycore_long.h" // _PyLong -#include "pycore_pystate.h" // _PyThreadState_GET() #include "pycore_format.h" // F_LJUST +#include "pycore_long.h" // _PyLong +#include "pycore_pystate.h" // _PyThreadState_GET() +#include "pycore_setobject.h" // _PySet_NextEntry() typedef struct { diff --git a/Python/bytecodes.c b/Python/bytecodes.c index 3a191aca730..7ce8978e998 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -10,23 +10,24 @@ #include "pycore_abstract.h" // _PyIndex_Check() #include "pycore_ceval.h" // _PyEval_SignalAsyncExc() #include "pycore_code.h" +#include "pycore_emscripten_signal.h" // _Py_CHECK_EMSCRIPTEN_SIGNALS #include "pycore_function.h" +#include "pycore_instruments.h" #include "pycore_intrinsics.h" #include "pycore_long.h" // _PyLong_GetZero() -#include "pycore_instruments.h" -#include "pycore_object.h" // _PyObject_GC_TRACK() #include "pycore_moduleobject.h" // PyModuleObject +#include "pycore_object.h" // _PyObject_GC_TRACK() #include "pycore_opcode.h" // EXTRA_CASES #include "pycore_opcode_metadata.h" // uop names #include "pycore_opcode_utils.h" // MAKE_FUNCTION_* #include "pycore_pyerrors.h" // _PyErr_GetRaisedException() #include "pycore_pystate.h" // _PyInterpreterState_GET() #include "pycore_range.h" // _PyRangeIterObject +#include "pycore_setobject.h" // _PySet_NextEntry() #include "pycore_sliceobject.h" // _PyBuildSlice_ConsumeRefs #include "pycore_sysmodule.h" // _PySys_Audit() #include "pycore_tuple.h" // _PyTuple_ITEMS() #include "pycore_typeobject.h" // _PySuper_Lookup() -#include "pycore_emscripten_signal.h" // _Py_CHECK_EMSCRIPTEN_SIGNALS #include "pycore_dict.h" #include "dictobject.h" diff --git a/Python/ceval.c b/Python/ceval.c index 9f2855f964a..e9f082f85bd 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -7,24 +7,25 @@ #include "pycore_call.h" // _PyObject_CallNoArgs() #include "pycore_ceval.h" // _PyEval_SignalAsyncExc() #include "pycore_code.h" +#include "pycore_emscripten_signal.h" // _Py_CHECK_EMSCRIPTEN_SIGNALS #include "pycore_function.h" +#include "pycore_instruments.h" #include "pycore_intrinsics.h" #include "pycore_long.h" // _PyLong_GetZero() -#include "pycore_instruments.h" -#include "pycore_object.h" // _PyObject_GC_TRACK() #include "pycore_moduleobject.h" // PyModuleObject +#include "pycore_object.h" // _PyObject_GC_TRACK() #include "pycore_opcode.h" // EXTRA_CASES #include "pycore_opcode_metadata.h" #include "pycore_opcode_utils.h" // MAKE_FUNCTION_* #include "pycore_pyerrors.h" // _PyErr_GetRaisedException() #include "pycore_pystate.h" // _PyInterpreterState_GET() #include "pycore_range.h" // _PyRangeIterObject +#include "pycore_setobject.h" // _PySet_Update() #include "pycore_sliceobject.h" // _PyBuildSlice_ConsumeRefs #include "pycore_sysmodule.h" // _PySys_Audit() #include "pycore_tuple.h" // _PyTuple_ITEMS() #include "pycore_typeobject.h" // _PySuper_Lookup() #include "pycore_uops.h" // _PyUOpExecutorObject -#include "pycore_emscripten_signal.h" // _Py_CHECK_EMSCRIPTEN_SIGNALS #include "pycore_dict.h" #include "dictobject.h" diff --git a/Python/compile.c b/Python/compile.c index 9a13ab525d8..600118768e6 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -28,12 +28,13 @@ #define NEED_OPCODE_TABLES #include "pycore_opcode_utils.h" #undef NEED_OPCODE_TABLES -#include "pycore_flowgraph.h" #include "pycore_code.h" // _PyCode_New() #include "pycore_compile.h" +#include "pycore_flowgraph.h" #include "pycore_intrinsics.h" #include "pycore_long.h" // _PyLong_GetZero() #include "pycore_pystate.h" // _Py_GetConfig() +#include "pycore_setobject.h" // _PySet_NextEntry() #include "pycore_symtable.h" // PySTEntryObject, _PyFuture_FromAST() #define NEED_OPCODE_METADATA diff --git a/Python/executor.c b/Python/executor.c index 17322526a7b..57525df202d 100644 --- a/Python/executor.c +++ b/Python/executor.c @@ -11,6 +11,7 @@ #include "pycore_opcode_utils.h" #include "pycore_pyerrors.h" #include "pycore_range.h" +#include "pycore_setobject.h" // _PySet_Update() #include "pycore_sliceobject.h" #include "pycore_uops.h" diff --git a/Python/marshal.c b/Python/marshal.c index 517220a4463..8940582c7f5 100644 --- a/Python/marshal.c +++ b/Python/marshal.c @@ -9,8 +9,9 @@ #include "Python.h" #include "pycore_call.h" // _PyObject_CallNoArgs() #include "pycore_code.h" // _PyCode_New() -#include "pycore_long.h" // _PyLong_DigitCount #include "pycore_hashtable.h" // _Py_hashtable_t +#include "pycore_long.h" // _PyLong_DigitCount +#include "pycore_setobject.h" // _PySet_NextEntry() #include "marshal.h" // Py_MARSHAL_VERSION /*[clinic input] diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index f91fac9379e..ceca7776a27 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -24,6 +24,7 @@ #include "pycore_pystate.h" // _PyThreadState_GET() #include "pycore_runtime.h" // _Py_ID() #include "pycore_runtime_init.h" // _PyRuntimeState_INIT +#include "pycore_setobject.h" // _PySet_NextEntry() #include "pycore_sliceobject.h" // _PySlice_Fini() #include "pycore_sysmodule.h" // _PySys_ClearAuditHooks() #include "pycore_traceback.h" // _Py_DumpTracebackThreads()