summaryrefslogtreecommitdiff
path: root/Python
diff options
context:
space:
mode:
authorVictor Stinner <vstinner@python.org>2021-10-13 14:09:13 +0200
committerGitHub <noreply@github.com>2021-10-13 14:09:13 +0200
commit7cdc2a0f4b785327ad9d55312409a06e554df3d5 (patch)
tree71a2b8fdc68c9fbebfc79e0a3dffafbcad72dd4e /Python
parent773330773968f211c77abc7b5b525faa7b3c35a2 (diff)
downloadcpython-git-7cdc2a0f4b785327ad9d55312409a06e554df3d5.tar.gz
pycore_pystate.h no longer redefines PyThreadState_GET() (GH-28921)
Redefining the PyThreadState_GET() macro in pycore_pystate.h is useless since it doesn't affect files not including it. Either use _PyThreadState_GET() directly, or don't use pycore_pystate.h internal C API. For example, the _testcapi extension don't use the internal C API, but use the public PyThreadState_Get() function instead. Replace PyThreadState_Get() with _PyThreadState_GET(). The _PyThreadState_GET() macro is more efficient than PyThreadState_Get() and PyThreadState_GET() function calls which call fail with a fatal Python error. posixmodule.c and _ctypes extension now include <windows.h> before pycore header files (like pycore_call.h). _PyTraceback_Add() now uses _PyErr_Fetch()/_PyErr_Restore() instead of PyErr_Fetch()/PyErr_Restore(). The _decimal and _xxsubinterpreters extensions are now built with the Py_BUILD_CORE_MODULE macro defined to get access to the internal C API.
Diffstat (limited to 'Python')
-rw-r--r--Python/bltinmodule.c2
-rw-r--r--Python/ceval.c2
-rw-r--r--Python/context.c2
-rw-r--r--Python/pylifecycle.c2
-rw-r--r--Python/pystate.c7
-rw-r--r--Python/traceback.c13
6 files changed, 17 insertions, 11 deletions
diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c
index d07ba38b69..9e3b25c59a 100644
--- a/Python/bltinmodule.c
+++ b/Python/bltinmodule.c
@@ -213,7 +213,7 @@ builtin___build_class__(PyObject *self, PyObject *const *args, Py_ssize_t nargs,
goto error;
}
PyFrameConstructor *f = PyFunction_AS_FRAME_CONSTRUCTOR(func);
- PyThreadState *tstate = PyThreadState_GET();
+ PyThreadState *tstate = _PyThreadState_GET();
cell = _PyEval_Vector(tstate, f, ns, NULL, 0, NULL);
if (cell != NULL) {
if (bases != orig_bases) {
diff --git a/Python/ceval.c b/Python/ceval.c
index 2d617a6364..f4cacd84b6 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -1064,7 +1064,7 @@ static int unpack_iterable(PyThreadState *, PyObject *, int, int, PyObject **);
PyObject *
PyEval_EvalCode(PyObject *co, PyObject *globals, PyObject *locals)
{
- PyThreadState *tstate = PyThreadState_GET();
+ PyThreadState *tstate = _PyThreadState_GET();
if (locals == NULL) {
locals = globals;
}
diff --git a/Python/context.c b/Python/context.c
index 9560fb3f66..ad47992d9e 100644
--- a/Python/context.c
+++ b/Python/context.c
@@ -728,7 +728,7 @@ static int
contextvar_set(PyContextVar *var, PyObject *val)
{
var->var_cached = NULL;
- PyThreadState *ts = PyThreadState_Get();
+ PyThreadState *ts = _PyThreadState_GET();
PyContext *ctx = context_get();
if (ctx == NULL) {
diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c
index bfddc1922d..c67a9b7fbf 100644
--- a/Python/pylifecycle.c
+++ b/Python/pylifecycle.c
@@ -472,7 +472,7 @@ interpreter_update_config(PyThreadState *tstate, int only_update_path_config)
int
_PyInterpreterState_SetConfig(const PyConfig *src_config)
{
- PyThreadState *tstate = PyThreadState_Get();
+ PyThreadState *tstate = _PyThreadState_GET();
int res = -1;
PyConfig config;
diff --git a/Python/pystate.c b/Python/pystate.c
index f02de926c6..ee9507c7dd 100644
--- a/Python/pystate.c
+++ b/Python/pystate.c
@@ -1671,8 +1671,11 @@ _check_xidata(PyThreadState *tstate, _PyCrossInterpreterData *data)
int
_PyObject_GetCrossInterpreterData(PyObject *obj, _PyCrossInterpreterData *data)
{
- // PyThreadState_Get() aborts if tstate is NULL.
- PyThreadState *tstate = PyThreadState_Get();
+ PyThreadState *tstate = _PyThreadState_GET();
+#ifdef Py_DEBUG
+ // The caller must hold the GIL
+ _Py_EnsureTstateNotNULL(tstate);
+#endif
PyInterpreterState *interp = tstate->interp;
// Reset data before re-populating.
diff --git a/Python/traceback.c b/Python/traceback.c
index 06b40bbbdc..3ea1db578b 100644
--- a/Python/traceback.c
+++ b/Python/traceback.c
@@ -6,11 +6,13 @@
#include "code.h" // PyCode_Addr2Line etc
#include "pycore_interp.h" // PyInterpreterState.gc
#include "frameobject.h" // PyFrame_GetBack()
-#include "pycore_frame.h" // _PyFrame_GetCode()
-#include "pycore_pyarena.h" // _PyArena_Free()
#include "pycore_ast.h" // asdl_seq_*
#include "pycore_compile.h" // _PyAST_Optimize
+#include "pycore_frame.h" // _PyFrame_GetCode()
#include "pycore_parser.h" // _PyParser_ASTFromString
+#include "pycore_pyarena.h" // _PyArena_Free()
+#include "pycore_pyerrors.h" // _PyErr_Fetch()
+#include "pycore_pystate.h" // _PyThreadState_GET()
#include "../Parser/pegen.h" // _PyPegen_byte_offset_to_character_offset()
#include "structmember.h" // PyMemberDef
#include "osdefs.h" // SEP
@@ -267,11 +269,12 @@ void _PyTraceback_Add(const char *funcname, const char *filename, int lineno)
PyCodeObject *code;
PyFrameObject *frame;
PyObject *exc, *val, *tb;
+ PyThreadState *tstate = _PyThreadState_GET();
/* Save and clear the current exception. Python functions must not be
called with an exception set. Calling Python functions happens when
the codec of the filesystem encoding is implemented in pure Python. */
- PyErr_Fetch(&exc, &val, &tb);
+ _PyErr_Fetch(tstate, &exc, &val, &tb);
globals = PyDict_New();
if (!globals)
@@ -281,14 +284,14 @@ void _PyTraceback_Add(const char *funcname, const char *filename, int lineno)
Py_DECREF(globals);
goto error;
}
- frame = PyFrame_New(PyThreadState_Get(), code, globals, NULL);
+ frame = PyFrame_New(tstate, code, globals, NULL);
Py_DECREF(globals);
Py_DECREF(code);
if (!frame)
goto error;
frame->f_lineno = lineno;
- PyErr_Restore(exc, val, tb);
+ _PyErr_Restore(tstate, exc, val, tb);
PyTraceBack_Here(frame);
Py_DECREF(frame);
return;