| 
									
										
										
										
											2020-04-13 12:47:17 +02:00
										 |  |  | #ifndef Py_INTERNAL_INTERP_H
 | 
					
						
							|  |  |  | #define Py_INTERNAL_INTERP_H
 | 
					
						
							|  |  |  | #ifdef __cplusplus
 | 
					
						
							|  |  |  | extern "C" { | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef Py_BUILD_CORE
 | 
					
						
							|  |  |  | #  error "this header requires Py_BUILD_CORE define"
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-12 16:28:46 -07:00
										 |  |  | #include <stdbool.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-02 22:03:28 +01:00
										 |  |  | #include "pycore_atomic.h"        // _Py_atomic_address
 | 
					
						
							| 
									
										
										
										
											2021-03-17 23:11:03 +01:00
										 |  |  | #include "pycore_ast_state.h"     // struct ast_state
 | 
					
						
							| 
									
										
										
										
											2022-03-07 11:45:00 -08:00
										 |  |  | #include "pycore_code.h"          // struct callable_cache
 | 
					
						
							| 
									
										
										
										
											2021-12-09 12:59:26 -07:00
										 |  |  | #include "pycore_context.h"       // struct _Py_context_state
 | 
					
						
							|  |  |  | #include "pycore_dict.h"          // struct _Py_dict_state
 | 
					
						
							|  |  |  | #include "pycore_exceptions.h"    // struct _Py_exc_state
 | 
					
						
							|  |  |  | #include "pycore_floatobject.h"   // struct _Py_float_state
 | 
					
						
							|  |  |  | #include "pycore_genobject.h"     // struct _Py_async_gen_state
 | 
					
						
							| 
									
										
										
										
											2022-04-06 13:58:07 +02:00
										 |  |  | #include "pycore_gc.h"            // struct _gc_runtime_state
 | 
					
						
							| 
									
										
										
										
											2021-12-09 12:59:26 -07:00
										 |  |  | #include "pycore_list.h"          // struct _Py_list_state
 | 
					
						
							| 
									
										
										
										
											2022-11-11 14:24:18 -07:00
										 |  |  | #include "pycore_global_objects.h"  // struct _Py_interp_static_objects
 | 
					
						
							| 
									
										
										
										
											2021-12-09 12:59:26 -07:00
										 |  |  | #include "pycore_tuple.h"         // struct _Py_tuple_state
 | 
					
						
							|  |  |  | #include "pycore_typeobject.h"    // struct type_cache
 | 
					
						
							|  |  |  | #include "pycore_unicodeobject.h" // struct _Py_unicode_state
 | 
					
						
							| 
									
										
										
										
											2020-11-02 22:03:28 +01:00
										 |  |  | #include "pycore_warnings.h"      // struct _warnings_runtime_state
 | 
					
						
							| 
									
										
										
										
											2020-04-13 12:47:17 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | struct _pending_calls { | 
					
						
							|  |  |  |     PyThread_type_lock lock; | 
					
						
							|  |  |  |     /* Request for running pending calls. */ | 
					
						
							|  |  |  |     _Py_atomic_int calls_to_do; | 
					
						
							|  |  |  |     /* Request for looking at the `async_exc` field of the current
 | 
					
						
							|  |  |  |        thread state. | 
					
						
							|  |  |  |        Guarded by the GIL. */ | 
					
						
							|  |  |  |     int async_exc; | 
					
						
							|  |  |  | #define NPENDINGCALLS 32
 | 
					
						
							|  |  |  |     struct { | 
					
						
							|  |  |  |         int (*func)(void *); | 
					
						
							|  |  |  |         void *arg; | 
					
						
							|  |  |  |     } calls[NPENDINGCALLS]; | 
					
						
							|  |  |  |     int first; | 
					
						
							|  |  |  |     int last; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct _ceval_state { | 
					
						
							| 
									
										
										
										
											2020-05-05 16:52:52 +02:00
										 |  |  |     int recursion_limit; | 
					
						
							| 
									
										
										
										
											2020-04-13 12:47:17 +02:00
										 |  |  |     /* This single variable consolidates all requests to break out of
 | 
					
						
							|  |  |  |        the fast path in the eval loop. */ | 
					
						
							|  |  |  |     _Py_atomic_int eval_breaker; | 
					
						
							| 
									
										
										
										
											2020-05-05 16:14:31 +02:00
										 |  |  |     /* Request for dropping the GIL */ | 
					
						
							|  |  |  |     _Py_atomic_int gil_drop_request; | 
					
						
							| 
									
										
										
										
											2022-10-08 07:57:09 -07:00
										 |  |  |     /* The GC is ready to be executed */ | 
					
						
							|  |  |  |     _Py_atomic_int gc_scheduled; | 
					
						
							| 
									
										
										
										
											2020-04-13 12:47:17 +02:00
										 |  |  |     struct _pending_calls pending; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-05 02:34:14 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-15 14:34:19 +01:00
										 |  |  | // atexit state
 | 
					
						
							|  |  |  | typedef struct { | 
					
						
							|  |  |  |     PyObject *func; | 
					
						
							|  |  |  |     PyObject *args; | 
					
						
							|  |  |  |     PyObject *kwargs; | 
					
						
							|  |  |  | } atexit_callback; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct atexit_state { | 
					
						
							|  |  |  |     atexit_callback **callbacks; | 
					
						
							|  |  |  |     int ncallbacks; | 
					
						
							|  |  |  |     int callback_len; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-19 14:27:46 -06:00
										 |  |  | struct _Py_long_state { | 
					
						
							|  |  |  |     int max_str_digits; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-13 12:47:17 +02:00
										 |  |  | /* interpreter state */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-12 16:28:46 -07:00
										 |  |  | /* PyInterpreterState holds the global state for one of the runtime's
 | 
					
						
							|  |  |  |    interpreters.  Typically the initial (main) interpreter is the only one. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-09 06:58:30 -07:00
										 |  |  |    The PyInterpreterState typedef is in Include/pytypedefs.h. | 
					
						
							| 
									
										
										
										
											2022-01-12 16:28:46 -07:00
										 |  |  |    */ | 
					
						
							| 
									
										
										
										
											2020-04-13 12:47:17 +02:00
										 |  |  | struct _is { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-03 23:08:07 +01:00
										 |  |  |     PyInterpreterState *next; | 
					
						
							| 
									
										
										
										
											2021-12-07 14:03:47 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     struct pythreads { | 
					
						
							|  |  |  |         uint64_t next_unique_id; | 
					
						
							| 
									
										
										
										
											2022-01-12 16:28:46 -07:00
										 |  |  |         /* The linked list of threads, newest first. */ | 
					
						
							| 
									
										
										
										
											2022-03-03 23:08:07 +01:00
										 |  |  |         PyThreadState *head; | 
					
						
							| 
									
										
										
										
											2021-12-07 14:03:47 -07:00
										 |  |  |         /* Used in Modules/_threadmodule.c. */ | 
					
						
							|  |  |  |         long count; | 
					
						
							|  |  |  |         /* Support for runtime thread stack size tuning.
 | 
					
						
							|  |  |  |            A value of 0 means using the platform's default stack size | 
					
						
							|  |  |  |            or the size specified by the THREAD_STACK_SIZE macro. */ | 
					
						
							|  |  |  |         /* Used in Python/thread.c. */ | 
					
						
							|  |  |  |         size_t stacksize; | 
					
						
							|  |  |  |     } threads; | 
					
						
							| 
									
										
										
										
											2020-04-13 12:47:17 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /* Reference to the _PyRuntime global variable. This field exists
 | 
					
						
							|  |  |  |        to not have to pass runtime in addition to tstate to a function. | 
					
						
							|  |  |  |        Get runtime from tstate: tstate->interp->runtime. */ | 
					
						
							|  |  |  |     struct pyruntimestate *runtime; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     int64_t id; | 
					
						
							|  |  |  |     int64_t id_refcount; | 
					
						
							|  |  |  |     int requires_idref; | 
					
						
							|  |  |  |     PyThread_type_lock id_mutex; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-07 18:59:49 -07:00
										 |  |  |     /* Has been initialized to a safe state.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |        In order to be effective, this must be set to 0 during or right | 
					
						
							|  |  |  |        after allocation. */ | 
					
						
							|  |  |  |     int _initialized; | 
					
						
							| 
									
										
										
										
											2020-04-13 12:47:17 +02:00
										 |  |  |     int finalizing; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     struct _ceval_state ceval; | 
					
						
							|  |  |  |     struct _gc_runtime_state gc; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-12 15:14:13 +01:00
										 |  |  |     // sys.modules dictionary
 | 
					
						
							| 
									
										
										
										
											2020-04-13 12:47:17 +02:00
										 |  |  |     PyObject *modules; | 
					
						
							| 
									
										
										
										
											2022-11-11 14:16:28 -07:00
										 |  |  |     /* This is the list of module objects for all legacy (single-phase init)
 | 
					
						
							|  |  |  |        extension modules ever loaded in this process (i.e. imported | 
					
						
							|  |  |  |        in this interpreter or in any other).  Py_None stands in for | 
					
						
							|  |  |  |        modules that haven't actually been imported in this interpreter. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |        A module's index (PyModuleDef.m_base.m_index) is used to look up | 
					
						
							|  |  |  |        the corresponding module object for this interpreter, if any. | 
					
						
							|  |  |  |        (See PyState_FindModule().)  When any extension module | 
					
						
							|  |  |  |        is initialized during import, its moduledef gets initialized by | 
					
						
							|  |  |  |        PyModuleDef_Init(), and the first time that happens for each | 
					
						
							|  |  |  |        PyModuleDef, its index gets set to the current value of | 
					
						
							|  |  |  |        a global counter (see _PyRuntimeState.imports.last_module_index). | 
					
						
							|  |  |  |        The entry for that index in this interpreter remains unset until | 
					
						
							|  |  |  |        the module is actually imported here.  (Py_None is used as | 
					
						
							|  |  |  |        a placeholder.)  Note that multi-phase init modules always get | 
					
						
							|  |  |  |        an index for which there will never be a module set. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |        This is initialized lazily in _PyState_AddModule(), which is also | 
					
						
							|  |  |  |        where modules get added. */ | 
					
						
							| 
									
										
										
										
											2020-04-13 12:47:17 +02:00
										 |  |  |     PyObject *modules_by_index; | 
					
						
							| 
									
										
										
										
											2020-11-12 15:14:13 +01:00
										 |  |  |     // Dictionary of the sys module
 | 
					
						
							| 
									
										
										
										
											2020-04-13 12:47:17 +02:00
										 |  |  |     PyObject *sysdict; | 
					
						
							| 
									
										
										
										
											2020-11-12 15:14:13 +01:00
										 |  |  |     // Dictionary of the builtins module
 | 
					
						
							| 
									
										
										
										
											2020-04-13 12:47:17 +02:00
										 |  |  |     PyObject *builtins; | 
					
						
							| 
									
										
										
										
											2020-11-12 15:14:13 +01:00
										 |  |  |     // importlib module
 | 
					
						
							| 
									
										
										
										
											2020-04-13 12:47:17 +02:00
										 |  |  |     PyObject *importlib; | 
					
						
							| 
									
										
										
										
											2021-09-14 17:31:45 -06:00
										 |  |  |     // override for config->use_frozen_modules (for tests)
 | 
					
						
							|  |  |  |     // (-1: "off", 1: "on", 0: no override)
 | 
					
						
							|  |  |  |     int override_frozen_modules; | 
					
						
							| 
									
										
										
										
											2020-04-13 12:47:17 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     PyObject *codec_search_path; | 
					
						
							|  |  |  |     PyObject *codec_search_cache; | 
					
						
							|  |  |  |     PyObject *codec_error_registry; | 
					
						
							|  |  |  |     int codecs_initialized; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     PyConfig config; | 
					
						
							|  |  |  | #ifdef HAVE_DLOPEN
 | 
					
						
							|  |  |  |     int dlopenflags; | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2022-10-26 11:16:30 -06:00
										 |  |  |     unsigned long feature_flags; | 
					
						
							| 
									
										
										
										
											2020-04-13 12:47:17 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     PyObject *dict;  /* Stores per-interpreter state */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     PyObject *builtins_copy; | 
					
						
							|  |  |  |     PyObject *import_func; | 
					
						
							| 
									
										
										
										
											2020-11-12 15:14:13 +01:00
										 |  |  |     // Initialized to _PyEval_EvalFrameDefault().
 | 
					
						
							| 
									
										
										
										
											2020-04-13 12:47:17 +02:00
										 |  |  |     _PyFrameEvalFunction eval_frame; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-06 17:08:00 -07:00
										 |  |  |     PyDict_WatchCallback dict_watchers[DICT_MAX_WATCHERS]; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-13 12:47:17 +02:00
										 |  |  |     Py_ssize_t co_extra_user_count; | 
					
						
							|  |  |  |     freefunc co_extra_freefuncs[MAX_CO_EXTRA_USERS]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef HAVE_FORK
 | 
					
						
							|  |  |  |     PyObject *before_forkers; | 
					
						
							|  |  |  |     PyObject *after_forkers_parent; | 
					
						
							|  |  |  |     PyObject *after_forkers_child; | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2020-12-14 23:07:54 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-13 12:47:17 +02:00
										 |  |  |     struct _warnings_runtime_state warnings; | 
					
						
							| 
									
										
										
										
											2020-12-15 14:34:19 +01:00
										 |  |  |     struct atexit_state atexit; | 
					
						
							| 
									
										
										
										
											2020-04-13 12:47:17 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     PyObject *audit_hooks; | 
					
						
							| 
									
										
										
										
											2022-10-21 07:41:51 -06:00
										 |  |  |     PyType_WatchCallback type_watchers[TYPE_MAX_WATCHERS]; | 
					
						
							| 
									
										
										
										
											2020-04-13 12:47:17 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-23 11:33:18 +02:00
										 |  |  |     struct _Py_unicode_state unicode; | 
					
						
							|  |  |  |     struct _Py_float_state float_state; | 
					
						
							| 
									
										
										
										
											2022-10-19 14:27:46 -06:00
										 |  |  |     struct _Py_long_state long_state; | 
					
						
							| 
									
										
										
										
											2020-06-23 11:33:18 +02:00
										 |  |  |     /* Using a cache is very effective since typically only a single slice is
 | 
					
						
							|  |  |  |        created and then deleted again. */ | 
					
						
							|  |  |  |     PySliceObject *slice_cache; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-04 23:38:36 +02:00
										 |  |  |     struct _Py_tuple_state tuple; | 
					
						
							| 
									
										
										
										
											2020-06-05 02:05:41 +02:00
										 |  |  |     struct _Py_list_state list; | 
					
						
							| 
									
										
										
										
											2020-06-23 11:33:18 +02:00
										 |  |  |     struct _Py_dict_state dict_state; | 
					
						
							| 
									
										
										
										
											2020-06-05 02:34:14 +02:00
										 |  |  |     struct _Py_async_gen_state async_gen; | 
					
						
							| 
									
										
										
										
											2020-06-05 02:56:37 +02:00
										 |  |  |     struct _Py_context_state context; | 
					
						
							| 
									
										
										
										
											2020-06-23 22:55:46 +02:00
										 |  |  |     struct _Py_exc_state exc_state; | 
					
						
							| 
									
										
										
										
											2020-11-02 22:03:28 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     struct ast_state ast; | 
					
						
							| 
									
										
										
										
											2022-07-26 17:26:43 -06:00
										 |  |  |     struct types_state types; | 
					
						
							| 
									
										
										
										
											2022-03-07 11:45:00 -08:00
										 |  |  |     struct callable_cache callable_cache; | 
					
						
							| 
									
										
										
										
											2022-11-10 04:34:57 -08:00
										 |  |  |     PyCodeObject *interpreter_trampoline; | 
					
						
							| 
									
										
										
										
											2022-01-12 16:28:46 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-11 14:24:18 -07:00
										 |  |  |     struct _Py_interp_cached_objects cached_objects; | 
					
						
							|  |  |  |     struct _Py_interp_static_objects static_objects; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-12 16:28:46 -07:00
										 |  |  |     /* The following fields are here to avoid allocation during init.
 | 
					
						
							|  |  |  |        The data is exposed through PyInterpreterState pointer fields. | 
					
						
							|  |  |  |        These fields should not be accessed directly outside of init. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |        All other PyInterpreterState pointer fields are populated when | 
					
						
							|  |  |  |        needed and default to NULL. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |        For now there are some exceptions to that rule, which require | 
					
						
							|  |  |  |        allocation during init.  These will be addressed on a case-by-case | 
					
						
							|  |  |  |        basis.  Also see _PyRuntimeState regarding the various mutex fields. | 
					
						
							|  |  |  |        */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* the initial PyInterpreterState.threads.head */ | 
					
						
							| 
									
										
										
										
											2022-03-03 23:08:07 +01:00
										 |  |  |     PyThreadState _initial_thread; | 
					
						
							| 
									
										
										
										
											2020-04-13 12:47:17 +02:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-12 16:28:46 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* other API */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-13 12:47:17 +02:00
										 |  |  | extern void _PyInterpreterState_ClearModules(PyInterpreterState *interp); | 
					
						
							| 
									
										
										
										
											2020-10-30 22:51:02 +01:00
										 |  |  | extern void _PyInterpreterState_Clear(PyThreadState *tstate); | 
					
						
							| 
									
										
										
										
											2020-04-13 12:47:17 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* cross-interpreter data registry */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* For now we use a global registry of shareable classes.  An
 | 
					
						
							|  |  |  |    alternative would be to add a tp_* slot for a class's | 
					
						
							|  |  |  |    crossinterpdatafunc. It would be simpler and more efficient. */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct _xidregitem; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct _xidregitem { | 
					
						
							|  |  |  |     PyTypeObject *cls; | 
					
						
							|  |  |  |     crossinterpdatafunc getdata; | 
					
						
							|  |  |  |     struct _xidregitem *next; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-03 23:08:07 +01:00
										 |  |  | PyAPI_FUNC(PyInterpreterState*) _PyInterpreterState_LookUpID(int64_t); | 
					
						
							| 
									
										
										
										
											2020-04-13 12:47:17 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-03 23:08:07 +01:00
										 |  |  | PyAPI_FUNC(int) _PyInterpreterState_IDInitref(PyInterpreterState *); | 
					
						
							|  |  |  | PyAPI_FUNC(int) _PyInterpreterState_IDIncref(PyInterpreterState *); | 
					
						
							|  |  |  | PyAPI_FUNC(void) _PyInterpreterState_IDDecref(PyInterpreterState *); | 
					
						
							| 
									
										
										
										
											2020-04-13 12:47:17 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | #ifdef __cplusplus
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #endif /* !Py_INTERNAL_INTERP_H */
 |