[Python-checkins] bpo-36124: Add PyInterpreterState.dict. (gh-12132)
Eric Snow
webhook-mailer at python.org
Fri Mar 15 19:47:49 EDT 2019
https://github.com/python/cpython/commit/d2fdd1fedf6b9dc785cf5025b548a989faed089a
commit: d2fdd1fedf6b9dc785cf5025b548a989faed089a
branch: master
author: Eric Snow <ericsnowcurrently at gmail.com>
committer: GitHub <noreply at github.com>
date: 2019-03-15T17:47:43-06:00
summary:
bpo-36124: Add PyInterpreterState.dict. (gh-12132)
files:
A Misc/NEWS.d/next/Core and Builtins/2019-03-01-13-48-01.bpo-36124.Blzxq1.rst
M Doc/c-api/init.rst
M Include/internal/pycore_pystate.h
M Include/pystate.h
M Python/pystate.c
diff --git a/Doc/c-api/init.rst b/Doc/c-api/init.rst
index 6b5290a7ebbb..2c6d21fa9da1 100644
--- a/Doc/c-api/init.rst
+++ b/Doc/c-api/init.rst
@@ -1026,6 +1026,18 @@ All of the following functions must be called after :c:func:`Py_Initialize`.
.. versionadded:: 3.7
+.. c:function:: PyObject* PyInterpreterState_GetDict(PyInterpreterState *interp)
+
+ Return a dictionary in which interpreter-specific data may be stored.
+ If this function returns *NULL* then no exception has been raised and
+ the caller should assume no interpreter-specific dict is available.
+
+ This is not a replacement for :c:func:`PyModule_GetState()`, which
+ extensions should use to store interpreter-specific state information.
+
+ .. versionadded:: 3.8
+
+
.. c:function:: PyObject* PyThreadState_GetDict()
Return a dictionary in which extensions can store thread-specific state
diff --git a/Include/internal/pycore_pystate.h b/Include/internal/pycore_pystate.h
index 945d9923a884..703a85b96b4e 100644
--- a/Include/internal/pycore_pystate.h
+++ b/Include/internal/pycore_pystate.h
@@ -63,6 +63,8 @@ struct _is {
int dlopenflags;
#endif
+ PyObject *dict; /* Stores per-interpreter state */
+
PyObject *builtins_copy;
PyObject *import_func;
/* Initialized to PyEval_EvalFrameDefault(). */
diff --git a/Include/pystate.h b/Include/pystate.h
index a79a2e60e210..4c25e3f7ef84 100644
--- a/Include/pystate.h
+++ b/Include/pystate.h
@@ -24,17 +24,23 @@ typedef struct _ts PyThreadState;
/* struct _is is defined in internal/pycore_pystate.h */
typedef struct _is PyInterpreterState;
-/* State unique per thread */
-
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 >= 0x03080000
+/* New in 3.8 */
+PyAPI_FUNC(PyObject *) PyInterpreterState_GetDict(PyInterpreterState *);
+#endif
+
#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03070000
/* New in 3.7 */
PyAPI_FUNC(int64_t) PyInterpreterState_GetID(PyInterpreterState *);
#endif
#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000
+
+/* State unique per thread */
+
/* New in 3.3 */
PyAPI_FUNC(int) PyState_AddModule(PyObject*, struct PyModuleDef*);
PyAPI_FUNC(int) PyState_RemoveModule(struct PyModuleDef*);
diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-03-01-13-48-01.bpo-36124.Blzxq1.rst b/Misc/NEWS.d/next/Core and Builtins/2019-03-01-13-48-01.bpo-36124.Blzxq1.rst
new file mode 100644
index 000000000000..ee9b0c110241
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2019-03-01-13-48-01.bpo-36124.Blzxq1.rst
@@ -0,0 +1,4 @@
+Add a new interpreter-specific dict and expose it in the C-API via
+PyInterpreterState_GetDict(). This parallels PyThreadState_GetDict().
+However, extension modules should continue using PyModule_GetState() for
+their own internal per-interpreter state.
diff --git a/Python/pystate.c b/Python/pystate.c
index cdf5a698cbab..6a2dc102ecfe 100644
--- a/Python/pystate.c
+++ b/Python/pystate.c
@@ -224,6 +224,7 @@ PyInterpreterState_Clear(PyInterpreterState *interp)
Py_CLEAR(interp->builtins_copy);
Py_CLEAR(interp->importlib);
Py_CLEAR(interp->import_func);
+ Py_CLEAR(interp->dict);
#ifdef HAVE_FORK
Py_CLEAR(interp->before_forkers);
Py_CLEAR(interp->after_forkers_parent);
@@ -462,6 +463,19 @@ _PyInterpreterState_GetMainModule(PyInterpreterState *interp)
return PyMapping_GetItemString(interp->modules, "__main__");
}
+PyObject *
+PyInterpreterState_GetDict(PyInterpreterState *interp)
+{
+ if (interp->dict == NULL) {
+ interp->dict = PyDict_New();
+ if (interp->dict == NULL) {
+ PyErr_Clear();
+ }
+ }
+ /* Returning NULL means no per-interpreter dict is available. */
+ return interp->dict;
+}
+
/* Default implementation for _PyThreadState_GetFrame */
static struct _frame *
threadstate_getframe(PyThreadState *self)
More information about the Python-checkins
mailing list