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
|
.. 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()
|
.. c:function:: PyObject* PyThreadState_GetDict()
|
||||||
|
|
||||||
Return a dictionary in which extensions can store thread-specific state
|
Return a dictionary in which extensions can store thread-specific state
|
||||||
|
|
|
@ -63,6 +63,8 @@ struct _is {
|
||||||
int dlopenflags;
|
int dlopenflags;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
PyObject *dict; /* Stores per-interpreter state */
|
||||||
|
|
||||||
PyObject *builtins_copy;
|
PyObject *builtins_copy;
|
||||||
PyObject *import_func;
|
PyObject *import_func;
|
||||||
/* Initialized to PyEval_EvalFrameDefault(). */
|
/* Initialized to PyEval_EvalFrameDefault(). */
|
||||||
|
|
|
@ -24,17 +24,23 @@ typedef struct _ts PyThreadState;
|
||||||
/* struct _is is defined in internal/pycore_pystate.h */
|
/* struct _is is defined in internal/pycore_pystate.h */
|
||||||
typedef struct _is PyInterpreterState;
|
typedef struct _is PyInterpreterState;
|
||||||
|
|
||||||
/* State unique per thread */
|
|
||||||
|
|
||||||
PyAPI_FUNC(PyInterpreterState *) PyInterpreterState_New(void);
|
PyAPI_FUNC(PyInterpreterState *) PyInterpreterState_New(void);
|
||||||
PyAPI_FUNC(void) PyInterpreterState_Clear(PyInterpreterState *);
|
PyAPI_FUNC(void) PyInterpreterState_Clear(PyInterpreterState *);
|
||||||
PyAPI_FUNC(void) PyInterpreterState_Delete(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
|
#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03070000
|
||||||
/* New in 3.7 */
|
/* New in 3.7 */
|
||||||
PyAPI_FUNC(int64_t) PyInterpreterState_GetID(PyInterpreterState *);
|
PyAPI_FUNC(int64_t) PyInterpreterState_GetID(PyInterpreterState *);
|
||||||
#endif
|
#endif
|
||||||
#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000
|
#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000
|
||||||
|
|
||||||
|
/* State unique per thread */
|
||||||
|
|
||||||
/* New in 3.3 */
|
/* New in 3.3 */
|
||||||
PyAPI_FUNC(int) PyState_AddModule(PyObject*, struct PyModuleDef*);
|
PyAPI_FUNC(int) PyState_AddModule(PyObject*, struct PyModuleDef*);
|
||||||
PyAPI_FUNC(int) PyState_RemoveModule(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->builtins_copy);
|
||||||
Py_CLEAR(interp->importlib);
|
Py_CLEAR(interp->importlib);
|
||||||
Py_CLEAR(interp->import_func);
|
Py_CLEAR(interp->import_func);
|
||||||
|
Py_CLEAR(interp->dict);
|
||||||
#ifdef HAVE_FORK
|
#ifdef HAVE_FORK
|
||||||
Py_CLEAR(interp->before_forkers);
|
Py_CLEAR(interp->before_forkers);
|
||||||
Py_CLEAR(interp->after_forkers_parent);
|
Py_CLEAR(interp->after_forkers_parent);
|
||||||
|
@ -462,6 +463,19 @@ _PyInterpreterState_GetMainModule(PyInterpreterState *interp)
|
||||||
return PyMapping_GetItemString(interp->modules, "__main__");
|
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 */
|
/* Default implementation for _PyThreadState_GetFrame */
|
||||||
static struct _frame *
|
static struct _frame *
|
||||||
threadstate_getframe(PyThreadState *self)
|
threadstate_getframe(PyThreadState *self)
|
||||||
|
|
Loading…
Reference in New Issue