mirror of
https://github.com/python/cpython.git
synced 2026-01-28 05:35:31 +00:00
variables to store internal data. As a result, any atempts to use the unicode system with multiple active interpreters, or successive interpreter executions, would fail. Now that information is stored into members of the PyInterpreterState structure.
123 lines
3.0 KiB
C
123 lines
3.0 KiB
C
|
|
/* Thread and interpreter state structures and their interfaces */
|
|
|
|
|
|
#ifndef Py_PYSTATE_H
|
|
#define Py_PYSTATE_H
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/* State shared between threads */
|
|
|
|
struct _ts; /* Forward */
|
|
struct _is; /* Forward */
|
|
|
|
typedef struct _is {
|
|
|
|
struct _is *next;
|
|
struct _ts *tstate_head;
|
|
|
|
PyObject *modules;
|
|
PyObject *sysdict;
|
|
PyObject *builtins;
|
|
|
|
PyObject *codec_search_path;
|
|
PyObject *codec_search_cache;
|
|
PyObject *codec_error_registry;
|
|
|
|
#ifdef HAVE_DLOPEN
|
|
int dlopenflags;
|
|
#endif
|
|
|
|
} PyInterpreterState;
|
|
|
|
|
|
/* State unique per thread */
|
|
|
|
struct _frame; /* Avoid including frameobject.h */
|
|
|
|
/* Py_tracefunc return -1 when raising an exception, or 0 for success. */
|
|
typedef int (*Py_tracefunc)(PyObject *, struct _frame *, int, PyObject *);
|
|
|
|
/* The following values are used for 'what' for tracefunc functions: */
|
|
#define PyTrace_CALL 0
|
|
#define PyTrace_EXCEPTION 1
|
|
#define PyTrace_LINE 2
|
|
#define PyTrace_RETURN 3
|
|
|
|
typedef struct _ts {
|
|
|
|
struct _ts *next;
|
|
PyInterpreterState *interp;
|
|
|
|
struct _frame *frame;
|
|
int recursion_depth;
|
|
int tracing;
|
|
int use_tracing;
|
|
|
|
Py_tracefunc c_profilefunc;
|
|
Py_tracefunc c_tracefunc;
|
|
PyObject *c_profileobj;
|
|
PyObject *c_traceobj;
|
|
|
|
PyObject *curexc_type;
|
|
PyObject *curexc_value;
|
|
PyObject *curexc_traceback;
|
|
|
|
PyObject *exc_type;
|
|
PyObject *exc_value;
|
|
PyObject *exc_traceback;
|
|
|
|
PyObject *dict;
|
|
|
|
int tick_counter;
|
|
|
|
/* XXX signal handlers should also be here */
|
|
|
|
} PyThreadState;
|
|
|
|
|
|
PyAPI_FUNC(PyInterpreterState *) PyInterpreterState_New(void);
|
|
PyAPI_FUNC(void) PyInterpreterState_Clear(PyInterpreterState *);
|
|
PyAPI_FUNC(void) PyInterpreterState_Delete(PyInterpreterState *);
|
|
|
|
PyAPI_FUNC(PyThreadState *) PyThreadState_New(PyInterpreterState *);
|
|
PyAPI_FUNC(void) PyThreadState_Clear(PyThreadState *);
|
|
PyAPI_FUNC(void) PyThreadState_Delete(PyThreadState *);
|
|
#ifdef WITH_THREAD
|
|
PyAPI_FUNC(void) PyThreadState_DeleteCurrent(void);
|
|
#endif
|
|
|
|
PyAPI_FUNC(PyThreadState *) PyThreadState_Get(void);
|
|
PyAPI_FUNC(PyThreadState *) PyThreadState_Swap(PyThreadState *);
|
|
PyAPI_FUNC(PyObject *) PyThreadState_GetDict(void);
|
|
|
|
|
|
/* Variable and macro for in-line access to current thread state */
|
|
|
|
PyAPI_DATA(PyThreadState *) _PyThreadState_Current;
|
|
|
|
#ifdef Py_DEBUG
|
|
#define PyThreadState_GET() PyThreadState_Get()
|
|
#else
|
|
#define PyThreadState_GET() (_PyThreadState_Current)
|
|
#endif
|
|
|
|
/* Routines for advanced debuggers, requested by David Beazley.
|
|
Don't use unless you know what you are doing! */
|
|
PyAPI_FUNC(PyInterpreterState *) PyInterpreterState_Head(void);
|
|
PyAPI_FUNC(PyInterpreterState *) PyInterpreterState_Next(PyInterpreterState *);
|
|
PyAPI_FUNC(PyThreadState *) PyInterpreterState_ThreadHead(PyInterpreterState *);
|
|
PyAPI_FUNC(PyThreadState *) PyThreadState_Next(PyThreadState *);
|
|
|
|
typedef struct _frame *(*PyThreadFrameGetter)(PyThreadState *self_);
|
|
|
|
/* hook for PyEval_GetFrame(), requested for Psyco */
|
|
PyAPI_DATA(PyThreadFrameGetter) _PyThreadState_GetFrame;
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
#endif /* !Py_PYSTATE_H */
|