bpo-36124: Add PyInterpreterState.dict. (gh-12132)
This commit is contained in:
parent
c11183cdcf
commit
d2fdd1fedf
|
@ -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
|
||||
|
|
|
@ -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(). */
|
||||
|
|
|
@ -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*);
|
||||
|
|
|
@ -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.
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue