summaryrefslogtreecommitdiffstats
path: root/Modules/_decimal
diff options
context:
space:
mode:
authorVictor Stinner <vstinner@python.org>2021-10-13 12:09:13 (GMT)
committerGitHub <noreply@github.com>2021-10-13 12:09:13 (GMT)
commit7cdc2a0f4b785327ad9d55312409a06e554df3d5 (patch)
tree71a2b8fdc68c9fbebfc79e0a3dffafbcad72dd4e /Modules/_decimal
parent773330773968f211c77abc7b5b525faa7b3c35a2 (diff)
downloadcpython-7cdc2a0f4b785327ad9d55312409a06e554df3d5.zip
cpython-7cdc2a0f4b785327ad9d55312409a06e554df3d5.tar.gz
cpython-7cdc2a0f4b785327ad9d55312409a06e554df3d5.tar.bz2
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 'Modules/_decimal')
-rw-r--r--Modules/_decimal/_decimal.c24
1 files changed, 11 insertions, 13 deletions
diff --git a/Modules/_decimal/_decimal.c b/Modules/_decimal/_decimal.c
index e2979a5..dd876f2 100644
--- a/Modules/_decimal/_decimal.c
+++ b/Modules/_decimal/_decimal.c
@@ -27,6 +27,7 @@
#include <Python.h>
+#include "pycore_pystate.h" // _PyThreadState_GET()
#include "longintrepr.h"
#include "complexobject.h"
#include "mpdecimal.h"
@@ -1511,18 +1512,20 @@ static PyGetSetDef context_getsets [] =
static PyObject *
current_context_from_dict(void)
{
- PyObject *dict;
- PyObject *tl_context;
- PyThreadState *tstate;
+ PyThreadState *tstate = _PyThreadState_GET();
+#ifdef Py_DEBUG
+ // The caller must hold the GIL
+ _Py_EnsureTstateNotNULL(tstate);
+#endif
- dict = PyThreadState_GetDict();
+ PyObject *dict = _PyThreadState_GetDict(tstate);
if (dict == NULL) {
PyErr_SetString(PyExc_RuntimeError,
"cannot get thread state");
return NULL;
}
- tl_context = PyDict_GetItemWithError(dict, tls_context_key);
+ PyObject *tl_context = PyDict_GetItemWithError(dict, tls_context_key);
if (tl_context != NULL) {
/* We already have a thread local context. */
CONTEXT_CHECK(tl_context);
@@ -1548,11 +1551,8 @@ current_context_from_dict(void)
/* Cache the context of the current thread, assuming that it
* will be accessed several times before a thread switch. */
- tstate = PyThreadState_GET();
- if (tstate) {
- cached_context = (PyDecContextObject *)tl_context;
- cached_context->tstate = tstate;
- }
+ cached_context = (PyDecContextObject *)tl_context;
+ cached_context->tstate = tstate;
/* Borrowed reference with refcount==1 */
return tl_context;
@@ -1562,9 +1562,7 @@ current_context_from_dict(void)
static PyObject *
current_context(void)
{
- PyThreadState *tstate;
-
- tstate = PyThreadState_GET();
+ PyThreadState *tstate = _PyThreadState_GET();
if (cached_context && cached_context->tstate == tstate) {
return (PyObject *)cached_context;
}