|
|
#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 |
|
|
|
|
|
#include "pycore_atomic.h" |
|
|
#include "pycore_ast_state.h" |
|
|
#include "pycore_gil.h" |
|
|
#include "pycore_gc.h" |
|
|
#include "pycore_warnings.h" |
|
|
|
|
|
struct _pending_calls { |
|
|
PyThread_type_lock lock; |
|
|
|
|
|
_Py_atomic_int calls_to_do; |
|
|
|
|
|
|
|
|
|
|
|
int async_exc; |
|
|
#define NPENDINGCALLS 32 |
|
|
struct { |
|
|
int (*func)(void *); |
|
|
void *arg; |
|
|
} calls[NPENDINGCALLS]; |
|
|
int first; |
|
|
int last; |
|
|
}; |
|
|
|
|
|
struct _ceval_state { |
|
|
int recursion_limit; |
|
|
|
|
|
|
|
|
_Py_atomic_int eval_breaker; |
|
|
|
|
|
_Py_atomic_int gil_drop_request; |
|
|
struct _pending_calls pending; |
|
|
#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS |
|
|
struct _gil_runtime_state gil; |
|
|
#endif |
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
struct _Py_unicode_fs_codec { |
|
|
char *encoding; |
|
|
int utf8; |
|
|
char *errors; |
|
|
_Py_error_handler error_handler; |
|
|
}; |
|
|
|
|
|
struct _Py_bytes_state { |
|
|
PyObject *empty_string; |
|
|
PyBytesObject *characters[256]; |
|
|
}; |
|
|
|
|
|
struct _Py_unicode_ids { |
|
|
Py_ssize_t size; |
|
|
PyObject **array; |
|
|
}; |
|
|
|
|
|
struct _Py_unicode_state { |
|
|
|
|
|
PyObject *empty_string; |
|
|
|
|
|
|
|
|
PyObject *latin1[256]; |
|
|
struct _Py_unicode_fs_codec fs_codec; |
|
|
|
|
|
|
|
|
|
|
|
PyObject *unused_interned; |
|
|
|
|
|
|
|
|
struct _Py_unicode_ids ids; |
|
|
}; |
|
|
|
|
|
struct _Py_float_state { |
|
|
|
|
|
|
|
|
|
|
|
int numfree; |
|
|
PyFloatObject *free_list; |
|
|
}; |
|
|
|
|
|
|
|
|
#ifndef PyTuple_MAXSAVESIZE |
|
|
|
|
|
# define PyTuple_MAXSAVESIZE 20 |
|
|
#endif |
|
|
#ifndef PyTuple_MAXFREELIST |
|
|
|
|
|
# define PyTuple_MAXFREELIST 2000 |
|
|
#endif |
|
|
|
|
|
struct _Py_tuple_state { |
|
|
#if PyTuple_MAXSAVESIZE > 0 |
|
|
|
|
|
|
|
|
|
|
|
PyTupleObject *free_list[PyTuple_MAXSAVESIZE]; |
|
|
int numfree[PyTuple_MAXSAVESIZE]; |
|
|
#endif |
|
|
}; |
|
|
|
|
|
|
|
|
#ifndef PyList_MAXFREELIST |
|
|
# define PyList_MAXFREELIST 80 |
|
|
#endif |
|
|
|
|
|
struct _Py_list_state { |
|
|
PyListObject *free_list[PyList_MAXFREELIST]; |
|
|
int numfree; |
|
|
}; |
|
|
|
|
|
#ifndef PyDict_MAXFREELIST |
|
|
# define PyDict_MAXFREELIST 80 |
|
|
#endif |
|
|
|
|
|
struct _Py_dict_state { |
|
|
|
|
|
PyDictObject *free_list[PyDict_MAXFREELIST]; |
|
|
int numfree; |
|
|
PyDictKeysObject *keys_free_list[PyDict_MAXFREELIST]; |
|
|
int keys_numfree; |
|
|
}; |
|
|
|
|
|
struct _Py_frame_state { |
|
|
PyFrameObject *free_list; |
|
|
|
|
|
int numfree; |
|
|
}; |
|
|
|
|
|
#ifndef _PyAsyncGen_MAXFREELIST |
|
|
# define _PyAsyncGen_MAXFREELIST 80 |
|
|
#endif |
|
|
|
|
|
struct _Py_async_gen_state { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
struct _PyAsyncGenWrappedValue* value_freelist[_PyAsyncGen_MAXFREELIST]; |
|
|
int value_numfree; |
|
|
|
|
|
struct PyAsyncGenASend* asend_freelist[_PyAsyncGen_MAXFREELIST]; |
|
|
int asend_numfree; |
|
|
}; |
|
|
|
|
|
struct _Py_context_state { |
|
|
|
|
|
PyContext *freelist; |
|
|
int numfree; |
|
|
}; |
|
|
|
|
|
struct _Py_exc_state { |
|
|
|
|
|
PyObject *errnomap; |
|
|
PyBaseExceptionObject *memerrors_freelist; |
|
|
int memerrors_numfree; |
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
typedef struct { |
|
|
PyObject *func; |
|
|
PyObject *args; |
|
|
PyObject *kwargs; |
|
|
} atexit_callback; |
|
|
|
|
|
struct atexit_state { |
|
|
atexit_callback **callbacks; |
|
|
int ncallbacks; |
|
|
int callback_len; |
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
struct type_cache_entry { |
|
|
unsigned int version; |
|
|
PyObject *name; |
|
|
PyObject *value; |
|
|
}; |
|
|
|
|
|
#define MCACHE_SIZE_EXP 12 |
|
|
#define MCACHE_STATS 0 |
|
|
|
|
|
struct type_cache { |
|
|
struct type_cache_entry hashtable[1 << MCACHE_SIZE_EXP]; |
|
|
#if MCACHE_STATS |
|
|
size_t hits; |
|
|
size_t misses; |
|
|
size_t collisions; |
|
|
#endif |
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define _PY_NSMALLPOSINTS 257 |
|
|
#define _PY_NSMALLNEGINTS 5 |
|
|
|
|
|
|
|
|
#if _PY_NSMALLPOSINTS < 2 |
|
|
# error "_PY_NSMALLPOSINTS must be greater than 1" |
|
|
#endif |
|
|
|
|
|
|
|
|
struct _is { |
|
|
|
|
|
struct _is *next; |
|
|
struct _ts *tstate_head; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
struct pyruntimestate *runtime; |
|
|
|
|
|
int64_t id; |
|
|
int64_t id_refcount; |
|
|
int requires_idref; |
|
|
PyThread_type_lock id_mutex; |
|
|
|
|
|
int finalizing; |
|
|
|
|
|
struct _ceval_state ceval; |
|
|
struct _gc_runtime_state gc; |
|
|
|
|
|
|
|
|
PyObject *modules; |
|
|
PyObject *modules_by_index; |
|
|
|
|
|
PyObject *sysdict; |
|
|
|
|
|
PyObject *builtins; |
|
|
|
|
|
PyObject *importlib; |
|
|
|
|
|
|
|
|
long num_threads; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
size_t pythread_stacksize; |
|
|
|
|
|
PyObject *codec_search_path; |
|
|
PyObject *codec_search_cache; |
|
|
PyObject *codec_error_registry; |
|
|
int codecs_initialized; |
|
|
|
|
|
PyConfig config; |
|
|
#ifdef HAVE_DLOPEN |
|
|
int dlopenflags; |
|
|
#endif |
|
|
|
|
|
PyObject *dict; |
|
|
|
|
|
PyObject *builtins_copy; |
|
|
PyObject *import_func; |
|
|
|
|
|
_PyFrameEvalFunction eval_frame; |
|
|
|
|
|
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 |
|
|
|
|
|
uint64_t tstate_next_unique_id; |
|
|
|
|
|
struct _warnings_runtime_state warnings; |
|
|
struct atexit_state atexit; |
|
|
|
|
|
PyObject *audit_hooks; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
PyLongObject* small_ints[_PY_NSMALLNEGINTS + _PY_NSMALLPOSINTS]; |
|
|
struct _Py_bytes_state bytes; |
|
|
struct _Py_unicode_state unicode; |
|
|
struct _Py_float_state float_state; |
|
|
|
|
|
|
|
|
PySliceObject *slice_cache; |
|
|
|
|
|
struct _Py_tuple_state tuple; |
|
|
struct _Py_list_state list; |
|
|
struct _Py_dict_state dict_state; |
|
|
struct _Py_frame_state frame; |
|
|
struct _Py_async_gen_state async_gen; |
|
|
struct _Py_context_state context; |
|
|
struct _Py_exc_state exc_state; |
|
|
|
|
|
struct ast_state ast; |
|
|
struct type_cache type_cache; |
|
|
|
|
|
int int_max_str_digits; |
|
|
}; |
|
|
|
|
|
extern void _PyInterpreterState_ClearModules(PyInterpreterState *interp); |
|
|
extern void _PyInterpreterState_Clear(PyThreadState *tstate); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
struct _xidregitem; |
|
|
|
|
|
struct _xidregitem { |
|
|
PyTypeObject *cls; |
|
|
crossinterpdatafunc getdata; |
|
|
struct _xidregitem *next; |
|
|
}; |
|
|
|
|
|
PyAPI_FUNC(struct _is*) _PyInterpreterState_LookUpID(int64_t); |
|
|
|
|
|
PyAPI_FUNC(int) _PyInterpreterState_IDInitref(struct _is *); |
|
|
PyAPI_FUNC(int) _PyInterpreterState_IDIncref(struct _is *); |
|
|
PyAPI_FUNC(void) _PyInterpreterState_IDDecref(struct _is *); |
|
|
|
|
|
#ifdef __cplusplus |
|
|
} |
|
|
#endif |
|
|
#endif |
|
|
|