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.
This commit is contained in:
Victor Stinner 2021-10-13 14:09:13 +02:00 committed by GitHub
parent 7733307739
commit 7cdc2a0f4b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
23 changed files with 87 additions and 77 deletions

View file

@ -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;