gh-90928: Statically Initialize the Keywords Tuple in Clinic-Generated Code (gh-95860)

We only statically initialize for core code and builtin modules.  Extension modules still create
the tuple at runtime.  We'll solve that part of interpreter isolation separately.

This change includes generated code. The non-generated changes are in:

* Tools/clinic/clinic.py
* Python/getargs.c
* Include/cpython/modsupport.h
* Makefile.pre.in (re-generate global strings after running clinic)
* very minor tweaks to Modules/_codecsmodule.c and Python/Python-tokenize.c

All other changes are generated code (clinic, global strings).
This commit is contained in:
Eric Snow 2022-08-11 15:25:49 -06:00 • committed by GitHub
parent bdb2cf8e91
commit 6f6a4e6cc5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
127 changed files with 16242 additions and 621 deletions

8
PC/clinic/_msi.c.h generated
View file

@ -2,6 +2,12 @@
preserve
[clinic start generated code]*/
#if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
# include "pycore_gc.h" // PyGC_Head
# include "pycore_runtime.h" // _Py_ID()
#endif
PyDoc_STRVAR(_msi_UuidCreate__doc__,
"UuidCreate($module, /)\n"
"--\n"
@ -689,4 +695,4 @@ _msi_CreateRecord(PyObject *module, PyObject *arg)
exit:
return return_value;
}
/*[clinic end generated code: output=a592695c4315db22 input=a9049054013a1b77]*/
/*[clinic end generated code: output=583505220fadb52b input=a9049054013a1b77]*/

View file

@ -2,6 +2,12 @@
preserve
[clinic start generated code]*/
#if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
# include "pycore_gc.h" // PyGC_Head
# include "pycore_runtime.h" // _Py_ID()
#endif
#if defined(MS_WINDOWS)
PyDoc_STRVAR(_testconsole_write_input__doc__,
@ -21,8 +27,41 @@ static PyObject *
_testconsole_write_input(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
{
PyObject *return_value = NULL;
#define NUM_KEYWORDS 2
#if NUM_KEYWORDS == 0
# if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
# define KWTUPLE (PyObject *)&_Py_SINGLETON(tuple_empty)
# else
# define KWTUPLE NULL
# endif
#else // NUM_KEYWORDS != 0
# if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
static struct {
PyGC_Head _this_is_not_used;
PyObject_VAR_HEAD
PyObject *ob_item[NUM_KEYWORDS];
} _kwtuple = {
.ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS)
.ob_item = { &_Py_ID(file), &_Py_ID(s), },
};
# define KWTUPLE (&_kwtuple.ob_base.ob_base)
# else // !Py_BUILD_CORE
# define KWTUPLE NULL
# endif // !Py_BUILD_CORE
#endif // NUM_KEYWORDS != 0
#undef NUM_KEYWORDS
static const char * const _keywords[] = {"file", "s", NULL};
static _PyArg_Parser _parser = {NULL, _keywords, "write_input", 0};
static _PyArg_Parser _parser = {
.keywords = _keywords,
.fname = "write_input",
.kwtuple = KWTUPLE,
};
#undef KWTUPLE
PyObject *argsbuf[2];
PyObject *file;
PyBytesObject *s;
@ -63,8 +102,41 @@ static PyObject *
_testconsole_read_output(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
{
PyObject *return_value = NULL;
#define NUM_KEYWORDS 1
#if NUM_KEYWORDS == 0
# if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
# define KWTUPLE (PyObject *)&_Py_SINGLETON(tuple_empty)
# else
# define KWTUPLE NULL
# endif
#else // NUM_KEYWORDS != 0
# if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
static struct {
PyGC_Head _this_is_not_used;
PyObject_VAR_HEAD
PyObject *ob_item[NUM_KEYWORDS];
} _kwtuple = {
.ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS)
.ob_item = { &_Py_ID(file), },
};
# define KWTUPLE (&_kwtuple.ob_base.ob_base)
# else // !Py_BUILD_CORE
# define KWTUPLE NULL
# endif // !Py_BUILD_CORE
#endif // NUM_KEYWORDS != 0
#undef NUM_KEYWORDS
static const char * const _keywords[] = {"file", NULL};
static _PyArg_Parser _parser = {NULL, _keywords, "read_output", 0};
static _PyArg_Parser _parser = {
.keywords = _keywords,
.fname = "read_output",
.kwtuple = KWTUPLE,
};
#undef KWTUPLE
PyObject *argsbuf[1];
PyObject *file;
@ -88,4 +160,4 @@ exit:
#ifndef _TESTCONSOLE_READ_OUTPUT_METHODDEF
#define _TESTCONSOLE_READ_OUTPUT_METHODDEF
#endif /* !defined(_TESTCONSOLE_READ_OUTPUT_METHODDEF) */
/*[clinic end generated code: output=6e9f8b0766eb5a0e input=a9049054013a1b77]*/
/*[clinic end generated code: output=73b7768a87e295a9 input=a9049054013a1b77]*/

View file

@ -2,6 +2,12 @@
preserve
[clinic start generated code]*/
#if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
# include "pycore_gc.h" // PyGC_Head
# include "pycore_runtime.h" // _Py_ID()
#endif
PyDoc_STRVAR(msvcrt_heapmin__doc__,
"heapmin($module, /)\n"
"--\n"
@ -661,4 +667,4 @@ exit:
#ifndef MSVCRT_SET_ERROR_MODE_METHODDEF
#define MSVCRT_SET_ERROR_MODE_METHODDEF
#endif /* !defined(MSVCRT_SET_ERROR_MODE_METHODDEF) */
/*[clinic end generated code: output=9d89e9414484d28c input=a9049054013a1b77]*/
/*[clinic end generated code: output=204bae9fee7f6124 input=a9049054013a1b77]*/

183
PC/clinic/winreg.c.h generated
View file

@ -2,6 +2,12 @@
preserve
[clinic start generated code]*/
#if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
# include "pycore_gc.h" // PyGC_Head
# include "pycore_runtime.h" // _Py_ID()
#endif
PyDoc_STRVAR(winreg_HKEYType_Close__doc__,
"Close($self, /)\n"
"--\n"
@ -87,8 +93,41 @@ static PyObject *
winreg_HKEYType___exit__(PyHKEYObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
{
PyObject *return_value = NULL;
#define NUM_KEYWORDS 3
#if NUM_KEYWORDS == 0
# if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
# define KWTUPLE (PyObject *)&_Py_SINGLETON(tuple_empty)
# else
# define KWTUPLE NULL
# endif
#else // NUM_KEYWORDS != 0
# if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
static struct {
PyGC_Head _this_is_not_used;
PyObject_VAR_HEAD
PyObject *ob_item[NUM_KEYWORDS];
} _kwtuple = {
.ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS)
.ob_item = { &_Py_ID(exc_type), &_Py_ID(exc_value), &_Py_ID(traceback), },
};
# define KWTUPLE (&_kwtuple.ob_base.ob_base)
# else // !Py_BUILD_CORE
# define KWTUPLE NULL
# endif // !Py_BUILD_CORE
#endif // NUM_KEYWORDS != 0
#undef NUM_KEYWORDS
static const char * const _keywords[] = {"exc_type", "exc_value", "traceback", NULL};
static _PyArg_Parser _parser = {NULL, _keywords, "__exit__", 0};
static _PyArg_Parser _parser = {
.keywords = _keywords,
.fname = "__exit__",
.kwtuple = KWTUPLE,
};
#undef KWTUPLE
PyObject *argsbuf[3];
PyObject *exc_type;
PyObject *exc_value;
@ -286,8 +325,41 @@ static PyObject *
winreg_CreateKeyEx(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
{
PyObject *return_value = NULL;
#define NUM_KEYWORDS 4
#if NUM_KEYWORDS == 0
# if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
# define KWTUPLE (PyObject *)&_Py_SINGLETON(tuple_empty)
# else
# define KWTUPLE NULL
# endif
#else // NUM_KEYWORDS != 0
# if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
static struct {
PyGC_Head _this_is_not_used;
PyObject_VAR_HEAD
PyObject *ob_item[NUM_KEYWORDS];
} _kwtuple = {
.ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS)
.ob_item = { &_Py_ID(key), &_Py_ID(sub_key), &_Py_ID(reserved), &_Py_ID(access), },
};
# define KWTUPLE (&_kwtuple.ob_base.ob_base)
# else // !Py_BUILD_CORE
# define KWTUPLE NULL
# endif // !Py_BUILD_CORE
#endif // NUM_KEYWORDS != 0
#undef NUM_KEYWORDS
static const char * const _keywords[] = {"key", "sub_key", "reserved", "access", NULL};
static _PyArg_Parser _parser = {NULL, _keywords, "CreateKeyEx", 0};
static _PyArg_Parser _parser = {
.keywords = _keywords,
.fname = "CreateKeyEx",
.kwtuple = KWTUPLE,
};
#undef KWTUPLE
PyObject *argsbuf[4];
Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2;
HKEY key;
@ -440,8 +512,41 @@ static PyObject *
winreg_DeleteKeyEx(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
{
PyObject *return_value = NULL;
#define NUM_KEYWORDS 4
#if NUM_KEYWORDS == 0
# if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
# define KWTUPLE (PyObject *)&_Py_SINGLETON(tuple_empty)
# else
# define KWTUPLE NULL
# endif
#else // NUM_KEYWORDS != 0
# if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
static struct {
PyGC_Head _this_is_not_used;
PyObject_VAR_HEAD
PyObject *ob_item[NUM_KEYWORDS];
} _kwtuple = {
.ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS)
.ob_item = { &_Py_ID(key), &_Py_ID(sub_key), &_Py_ID(access), &_Py_ID(reserved), },
};
# define KWTUPLE (&_kwtuple.ob_base.ob_base)
# else // !Py_BUILD_CORE
# define KWTUPLE NULL
# endif // !Py_BUILD_CORE
#endif // NUM_KEYWORDS != 0
#undef NUM_KEYWORDS
static const char * const _keywords[] = {"key", "sub_key", "access", "reserved", NULL};
static _PyArg_Parser _parser = {NULL, _keywords, "DeleteKeyEx", 0};
static _PyArg_Parser _parser = {
.keywords = _keywords,
.fname = "DeleteKeyEx",
.kwtuple = KWTUPLE,
};
#undef KWTUPLE
PyObject *argsbuf[4];
Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2;
HKEY key;
@ -821,8 +926,41 @@ static PyObject *
winreg_OpenKey(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
{
PyObject *return_value = NULL;
#define NUM_KEYWORDS 4
#if NUM_KEYWORDS == 0
# if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
# define KWTUPLE (PyObject *)&_Py_SINGLETON(tuple_empty)
# else
# define KWTUPLE NULL
# endif
#else // NUM_KEYWORDS != 0
# if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
static struct {
PyGC_Head _this_is_not_used;
PyObject_VAR_HEAD
PyObject *ob_item[NUM_KEYWORDS];
} _kwtuple = {
.ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS)
.ob_item = { &_Py_ID(key), &_Py_ID(sub_key), &_Py_ID(reserved), &_Py_ID(access), },
};
# define KWTUPLE (&_kwtuple.ob_base.ob_base)
# else // !Py_BUILD_CORE
# define KWTUPLE NULL
# endif // !Py_BUILD_CORE
#endif // NUM_KEYWORDS != 0
#undef NUM_KEYWORDS
static const char * const _keywords[] = {"key", "sub_key", "reserved", "access", NULL};
static _PyArg_Parser _parser = {NULL, _keywords, "OpenKey", 0};
static _PyArg_Parser _parser = {
.keywords = _keywords,
.fname = "OpenKey",
.kwtuple = KWTUPLE,
};
#undef KWTUPLE
PyObject *argsbuf[4];
Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2;
HKEY key;
@ -911,8 +1049,41 @@ static PyObject *
winreg_OpenKeyEx(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
{
PyObject *return_value = NULL;
#define NUM_KEYWORDS 4
#if NUM_KEYWORDS == 0
# if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
# define KWTUPLE (PyObject *)&_Py_SINGLETON(tuple_empty)
# else
# define KWTUPLE NULL
# endif
#else // NUM_KEYWORDS != 0
# if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
static struct {
PyGC_Head _this_is_not_used;
PyObject_VAR_HEAD
PyObject *ob_item[NUM_KEYWORDS];
} _kwtuple = {
.ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS)
.ob_item = { &_Py_ID(key), &_Py_ID(sub_key), &_Py_ID(reserved), &_Py_ID(access), },
};
# define KWTUPLE (&_kwtuple.ob_base.ob_base)
# else // !Py_BUILD_CORE
# define KWTUPLE NULL
# endif // !Py_BUILD_CORE
#endif // NUM_KEYWORDS != 0
#undef NUM_KEYWORDS
static const char * const _keywords[] = {"key", "sub_key", "reserved", "access", NULL};
static _PyArg_Parser _parser = {NULL, _keywords, "OpenKeyEx", 0};
static _PyArg_Parser _parser = {
.keywords = _keywords,
.fname = "OpenKeyEx",
.kwtuple = KWTUPLE,
};
#undef KWTUPLE
PyObject *argsbuf[4];
Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2;
HKEY key;
@ -1458,4 +1629,4 @@ winreg_QueryReflectionKey(PyObject *module, PyObject *arg)
exit:
return return_value;
}
/*[clinic end generated code: output=3faa63af6fd1653c input=a9049054013a1b77]*/
/*[clinic end generated code: output=dc148c077a03843e input=a9049054013a1b77]*/

113
PC/clinic/winsound.c.h generated
View file

@ -2,6 +2,12 @@
preserve
[clinic start generated code]*/
#if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
# include "pycore_gc.h" // PyGC_Head
# include "pycore_runtime.h" // _Py_ID()
#endif
PyDoc_STRVAR(winsound_PlaySound__doc__,
"PlaySound($module, /, sound, flags)\n"
"--\n"
@ -23,8 +29,41 @@ static PyObject *
winsound_PlaySound(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
{
PyObject *return_value = NULL;
#define NUM_KEYWORDS 2
#if NUM_KEYWORDS == 0
# if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
# define KWTUPLE (PyObject *)&_Py_SINGLETON(tuple_empty)
# else
# define KWTUPLE NULL
# endif
#else // NUM_KEYWORDS != 0
# if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
static struct {
PyGC_Head _this_is_not_used;
PyObject_VAR_HEAD
PyObject *ob_item[NUM_KEYWORDS];
} _kwtuple = {
.ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS)
.ob_item = { &_Py_ID(sound), &_Py_ID(flags), },
};
# define KWTUPLE (&_kwtuple.ob_base.ob_base)
# else // !Py_BUILD_CORE
# define KWTUPLE NULL
# endif // !Py_BUILD_CORE
#endif // NUM_KEYWORDS != 0
#undef NUM_KEYWORDS
static const char * const _keywords[] = {"sound", "flags", NULL};
static _PyArg_Parser _parser = {NULL, _keywords, "PlaySound", 0};
static _PyArg_Parser _parser = {
.keywords = _keywords,
.fname = "PlaySound",
.kwtuple = KWTUPLE,
};
#undef KWTUPLE
PyObject *argsbuf[2];
PyObject *sound;
int flags;
@ -66,8 +105,41 @@ static PyObject *
winsound_Beep(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
{
PyObject *return_value = NULL;
#define NUM_KEYWORDS 2
#if NUM_KEYWORDS == 0
# if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
# define KWTUPLE (PyObject *)&_Py_SINGLETON(tuple_empty)
# else
# define KWTUPLE NULL
# endif
#else // NUM_KEYWORDS != 0
# if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
static struct {
PyGC_Head _this_is_not_used;
PyObject_VAR_HEAD
PyObject *ob_item[NUM_KEYWORDS];
} _kwtuple = {
.ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS)
.ob_item = { &_Py_ID(frequency), &_Py_ID(duration), },
};
# define KWTUPLE (&_kwtuple.ob_base.ob_base)
# else // !Py_BUILD_CORE
# define KWTUPLE NULL
# endif // !Py_BUILD_CORE
#endif // NUM_KEYWORDS != 0
#undef NUM_KEYWORDS
static const char * const _keywords[] = {"frequency", "duration", NULL};
static _PyArg_Parser _parser = {NULL, _keywords, "Beep", 0};
static _PyArg_Parser _parser = {
.keywords = _keywords,
.fname = "Beep",
.kwtuple = KWTUPLE,
};
#undef KWTUPLE
PyObject *argsbuf[2];
int frequency;
int duration;
@ -108,8 +180,41 @@ static PyObject *
winsound_MessageBeep(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
{
PyObject *return_value = NULL;
#define NUM_KEYWORDS 1
#if NUM_KEYWORDS == 0
# if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
# define KWTUPLE (PyObject *)&_Py_SINGLETON(tuple_empty)
# else
# define KWTUPLE NULL
# endif
#else // NUM_KEYWORDS != 0
# if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
static struct {
PyGC_Head _this_is_not_used;
PyObject_VAR_HEAD
PyObject *ob_item[NUM_KEYWORDS];
} _kwtuple = {
.ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS)
.ob_item = { &_Py_ID(type), },
};
# define KWTUPLE (&_kwtuple.ob_base.ob_base)
# else // !Py_BUILD_CORE
# define KWTUPLE NULL
# endif // !Py_BUILD_CORE
#endif // NUM_KEYWORDS != 0
#undef NUM_KEYWORDS
static const char * const _keywords[] = {"type", NULL};
static _PyArg_Parser _parser = {NULL, _keywords, "MessageBeep", 0};
static _PyArg_Parser _parser = {
.keywords = _keywords,
.fname = "MessageBeep",
.kwtuple = KWTUPLE,
};
#undef KWTUPLE
PyObject *argsbuf[1];
Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0;
int type = MB_OK;
@ -131,4 +236,4 @@ skip_optional_pos:
exit:
return return_value;
}
/*[clinic end generated code: output=b7e53fab4f26aeaf input=a9049054013a1b77]*/
/*[clinic end generated code: output=bdca8518ca517fd8 input=a9049054013a1b77]*/