From: Victor Stinner Date: Fri, 11 Nov 2016 00:43:56 +0000 (+0100) Subject: Use PyThreadState_GET() in performance critical code X-Git-Tag: v3.7.0a1~2012 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=0cae609847cccd78d3a960a70782c7b7ee891e3e;p=thirdparty%2FPython%2Fcpython.git Use PyThreadState_GET() in performance critical code It seems like _PyThreadState_UncheckedGet() is not inlined as expected, even when using gcc -O3. --- diff --git a/Objects/dictobject.c b/Objects/dictobject.c index cb67dda33f78..290686b88faa 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -1409,7 +1409,7 @@ PyDict_GetItem(PyObject *op, PyObject *key) Let's just hope that no exception occurs then... This must be _PyThreadState_Current and not PyThreadState_GET() because in debug mode, the latter complains if tstate is NULL. */ - tstate = _PyThreadState_UncheckedGet(); + tstate = PyThreadState_GET(); if (tstate != NULL && tstate->curexc_type != NULL) { /* preserve the existing exception */ PyObject *err_type, *err_value, *err_tb; diff --git a/Python/errors.c b/Python/errors.c index 918f4dffab27..0c38f7cf0cd2 100644 --- a/Python/errors.c +++ b/Python/errors.c @@ -161,7 +161,7 @@ PyErr_SetString(PyObject *exception, const char *string) PyObject * PyErr_Occurred(void) { - PyThreadState *tstate = _PyThreadState_UncheckedGet(); + PyThreadState *tstate = PyThreadState_GET(); return tstate == NULL ? NULL : tstate->curexc_type; } diff --git a/Python/sysmodule.c b/Python/sysmodule.c index e348b3873e7e..9247d4ed69d1 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -1547,8 +1547,9 @@ error: Py_XDECREF(name); Py_XDECREF(value); /* No return value, therefore clear error state if possible */ - if (_PyThreadState_UncheckedGet()) + if (_PyThreadState_UncheckedGet()) { PyErr_Clear(); + } } PyObject *