mirror of
https://github.com/python/cpython.git
synced 2025-08-22 09:45:06 +00:00
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:
parent
7733307739
commit
7cdc2a0f4b
23 changed files with 87 additions and 77 deletions
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue