]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-39947: Add PyInterpreterState_Get() function (GH-18979)
authorVictor Stinner <vstinner@python.org>
Fri, 13 Mar 2020 17:15:33 +0000 (18:15 +0100)
committerGitHub <noreply@github.com>
Fri, 13 Mar 2020 17:15:33 +0000 (18:15 +0100)
* Rename _PyInterpreterState_Get() to PyInterpreterState_Get() and
  move it the limited C API.
* Add _PyInterpreterState_Get() alias to PyInterpreterState_Get() for
  backward compatibility with Python 3.8.

Doc/c-api/init.rst
Doc/whatsnew/3.9.rst
Include/cpython/pystate.h
Include/pystate.h
Misc/NEWS.d/next/C API/2020-03-13-17-43-00.bpo-39947.1Cu_d2.rst [new file with mode: 0644]
Modules/_posixsubprocess.c
Modules/_xxsubinterpretersmodule.c
Python/pystate.c

index 747278c60b0dffcac11e097b4ee0f413fa0ffd53..661ed59ceb96dbd8f79cf948515d37d705d9c2ab 100644 (file)
@@ -1072,6 +1072,18 @@ All of the following functions must be called after :c:func:`Py_Initialize`.
     to :c:func:`PyThreadState_Clear`.
 
 
+.. c:function:: PyInterpreterState* PyInterpreterState_Get(void)
+
+   Get the current interpreter.
+
+   Issue a fatal error if there no current Python thread state or no current
+   interpreter. It cannot return NULL.
+
+   The caller must hold the GIL.
+
+   .. versionadded:: 3.9
+
+
 .. c:function:: PY_INT64_T PyInterpreterState_GetID(PyInterpreterState *interp)
 
    Return the interpreter's unique ID.  If there was any error in doing
index 0b61fb8f0deb9562996b9a84cef9a491d7969828..4373e37f55e9c3aac7026fdfcd9045f689f2b3d3 100644 (file)
@@ -406,6 +406,8 @@ Optimizations
 Build and C API Changes
 =======================
 
+* New :c:func:`PyInterpreterState_Get` function.
+
 * Add ``--with-platlibdir`` option to the ``configure`` script: name of the
   platform-specific library directory, stored in the new :attr:`sys.platlibdir`
   attribute. See :attr:`sys.platlibdir` attribute for more information.
index fbb0899186f6070a03ce7c190fcfddbb90b1730f..96df0d91fb544bde9a2239dcca7aa1953617f875 100644 (file)
@@ -139,13 +139,8 @@ struct _ts {
 
 };
 
-/* Get the current interpreter state.
-
-   Issue a fatal error if there no current Python thread state or no current
-   interpreter. It cannot return NULL.
-
-   The caller must hold the GIL.*/
-PyAPI_FUNC(PyInterpreterState *) _PyInterpreterState_Get(void);
+// Alias for backward compatibility with Python 3.8
+#define _PyInterpreterState_Get PyInterpreterState_Get
 
 PyAPI_FUNC(PyThreadState *) _PyThreadState_Prealloc(PyInterpreterState *);
 
index 1cb2305696f2920538079d11d18b6f12498b4eeb..57dc9e45a78f3cbe023a58424bd11cf1ed67a0ca 100644 (file)
@@ -28,6 +28,17 @@ PyAPI_FUNC(PyInterpreterState *) PyInterpreterState_New(void);
 PyAPI_FUNC(void) PyInterpreterState_Clear(PyInterpreterState *);
 PyAPI_FUNC(void) PyInterpreterState_Delete(PyInterpreterState *);
 
+#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03090000
+/* New in 3.9 */
+/* Get the current interpreter state.
+
+   Issue a fatal error if there no current Python thread state or no current
+   interpreter. It cannot return NULL.
+
+   The caller must hold the GIL. */
+PyAPI_FUNC(PyInterpreterState *) PyInterpreterState_Get(void);
+#endif
+
 #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03080000
 /* New in 3.8 */
 PyAPI_FUNC(PyObject *) PyInterpreterState_GetDict(PyInterpreterState *);
diff --git a/Misc/NEWS.d/next/C API/2020-03-13-17-43-00.bpo-39947.1Cu_d2.rst b/Misc/NEWS.d/next/C API/2020-03-13-17-43-00.bpo-39947.1Cu_d2.rst
new file mode 100644 (file)
index 0000000..c7184be
--- /dev/null
@@ -0,0 +1 @@
+Add :c:func:`PyInterpreterState_Get` function to the limited C API.
index 2aed79e14c4b5102c57576787a2492255f5da2c1..f9919c3ab4f7dd617c209d6209e01384251e6321 100644 (file)
@@ -635,7 +635,7 @@ subprocess_fork_exec(PyObject* self, PyObject *args)
         return NULL;
 
     if ((preexec_fn != Py_None) &&
-            (_PyInterpreterState_Get() != PyInterpreterState_Main())) {
+            (PyInterpreterState_Get() != PyInterpreterState_Main())) {
         PyErr_SetString(PyExc_RuntimeError,
                         "preexec_fn not supported within subinterpreters");
         return NULL;
index cc4f5d9e6dc16685f5a8500febd6df651f5b54f0..526115a682648e689abc5eb3a62b49776f5b0f4b 100644 (file)
@@ -26,9 +26,9 @@ _copy_raw_string(PyObject *strobj)
 static PyInterpreterState *
 _get_current(void)
 {
-    // _PyInterpreterState_Get() aborts if lookup fails, so don't need
+    // PyInterpreterState_Get() aborts if lookup fails, so don't need
     // to check the result for NULL.
-    return _PyInterpreterState_Get();
+    return PyInterpreterState_Get();
 }
 
 
@@ -1928,7 +1928,7 @@ _run_script_in_interpreter(PyInterpreterState *interp, const char *codestr,
 
     // Switch to interpreter.
     PyThreadState *save_tstate = NULL;
-    if (interp != _PyInterpreterState_Get()) {
+    if (interp != PyInterpreterState_Get()) {
         // XXX Using the "head" thread isn't strictly correct.
         PyThreadState *tstate = PyInterpreterState_ThreadHead(interp);
         // XXX Possible GILState issues?
index 9cf6bea1a027d1bad7c767eaf78813f491d263aa..28c5578664475106f5c9ce5792268a2ab9d7b632 100644 (file)
@@ -396,7 +396,7 @@ _PyInterpreterState_DeleteExceptMain(_PyRuntimeState *runtime)
 
 
 PyInterpreterState *
-_PyInterpreterState_Get(void)
+PyInterpreterState_Get(void)
 {
     PyThreadState *tstate = _PyThreadState_GET();
     if (tstate == NULL) {
@@ -1423,9 +1423,9 @@ _check_xidata(_PyCrossInterpreterData *data)
 int
 _PyObject_GetCrossInterpreterData(PyObject *obj, _PyCrossInterpreterData *data)
 {
-    // _PyInterpreterState_Get() aborts if lookup fails, so we don't need
+    // PyInterpreterState_Get() aborts if lookup fails, so we don't need
     // to check the result for NULL.
-    PyInterpreterState *interp = _PyInterpreterState_Get();
+    PyInterpreterState *interp = PyInterpreterState_Get();
 
     // Reset data before re-populating.
     *data = (_PyCrossInterpreterData){0};