summaryrefslogtreecommitdiffstats
path: root/contrib/tools/python3/src/Include/internal
diff options
context:
space:
mode:
authorshadchin <[email protected]>2022-04-18 12:39:32 +0300
committershadchin <[email protected]>2022-04-18 12:39:32 +0300
commitd4be68e361f4258cf0848fc70018dfe37a2acc24 (patch)
tree153e294cd97ac8b5d7a989612704a0c1f58e8ad4 /contrib/tools/python3/src/Include/internal
parent260c02f5ccf242d9d9b8a873afaf6588c00237d6 (diff)
IGNIETFERRO-1816 Update Python 3 from 3.9.12 to 3.10.4
ref:9f96be6d02ee8044fdd6f124b799b270c20ce641
Diffstat (limited to 'contrib/tools/python3/src/Include/internal')
-rw-r--r--contrib/tools/python3/src/Include/internal/pegen_interface.h46
-rw-r--r--contrib/tools/python3/src/Include/internal/pycore_asdl.h112
-rw-r--r--contrib/tools/python3/src/Include/internal/pycore_ast.h855
-rw-r--r--contrib/tools/python3/src/Include/internal/pycore_ast_state.h255
-rw-r--r--contrib/tools/python3/src/Include/internal/pycore_atomic.h6
-rw-r--r--contrib/tools/python3/src/Include/internal/pycore_atomic_funcs.h94
-rw-r--r--contrib/tools/python3/src/Include/internal/pycore_bitutils.h176
-rw-r--r--contrib/tools/python3/src/Include/internal/pycore_blocks_output_buffer.h317
-rw-r--r--contrib/tools/python3/src/Include/internal/pycore_byteswap.h88
-rw-r--r--contrib/tools/python3/src/Include/internal/pycore_ceval.h36
-rw-r--r--contrib/tools/python3/src/Include/internal/pycore_code.h7
-rw-r--r--contrib/tools/python3/src/Include/internal/pycore_compile.h44
-rw-r--r--contrib/tools/python3/src/Include/internal/pycore_context.h2
-rw-r--r--contrib/tools/python3/src/Include/internal/pycore_fileutils.h5
-rw-r--r--contrib/tools/python3/src/Include/internal/pycore_format.h27
-rw-r--r--contrib/tools/python3/src/Include/internal/pycore_gc.h18
-rw-r--r--contrib/tools/python3/src/Include/internal/pycore_import.h9
-rw-r--r--contrib/tools/python3/src/Include/internal/pycore_initconfig.h11
-rw-r--r--contrib/tools/python3/src/Include/internal/pycore_interp.h215
-rw-r--r--contrib/tools/python3/src/Include/internal/pycore_list.h20
-rw-r--r--contrib/tools/python3/src/Include/internal/pycore_long.h40
-rw-r--r--contrib/tools/python3/src/Include/internal/pycore_moduleobject.h42
-rw-r--r--contrib/tools/python3/src/Include/internal/pycore_object.h113
-rw-r--r--contrib/tools/python3/src/Include/internal/pycore_parser.h31
-rw-r--r--contrib/tools/python3/src/Include/internal/pycore_pathconfig.h1
-rw-r--r--contrib/tools/python3/src/Include/internal/pycore_pyarena.h64
-rw-r--r--contrib/tools/python3/src/Include/internal/pycore_pyerrors.h6
-rw-r--r--contrib/tools/python3/src/Include/internal/pycore_pylifecycle.h83
-rw-r--r--contrib/tools/python3/src/Include/internal/pycore_pymem.h3
-rw-r--r--contrib/tools/python3/src/Include/internal/pycore_pystate.h23
-rw-r--r--contrib/tools/python3/src/Include/internal/pycore_runtime.h15
-rw-r--r--contrib/tools/python3/src/Include/internal/pycore_structseq.h21
-rw-r--r--contrib/tools/python3/src/Include/internal/pycore_symtable.h133
-rw-r--r--contrib/tools/python3/src/Include/internal/pycore_traceback.h12
-rw-r--r--contrib/tools/python3/src/Include/internal/pycore_tuple.h (renamed from contrib/tools/python3/src/Include/internal/pycore_tupleobject.h)7
-rw-r--r--contrib/tools/python3/src/Include/internal/pycore_ucnhash.h34
-rw-r--r--contrib/tools/python3/src/Include/internal/pycore_unionobject.h22
-rw-r--r--contrib/tools/python3/src/Include/internal/pycore_warnings.h2
38 files changed, 2718 insertions, 277 deletions
diff --git a/contrib/tools/python3/src/Include/internal/pegen_interface.h b/contrib/tools/python3/src/Include/internal/pegen_interface.h
deleted file mode 100644
index ee4c77ec006..00000000000
--- a/contrib/tools/python3/src/Include/internal/pegen_interface.h
+++ /dev/null
@@ -1,46 +0,0 @@
-#ifndef Py_PEGENINTERFACE
-#define Py_PEGENINTERFACE
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#ifndef Py_BUILD_CORE
-# error "this header requires Py_BUILD_CORE define"
-#endif
-
-#include "Python.h"
-#include "Python-ast.h"
-
-PyAPI_FUNC(mod_ty) PyPegen_ASTFromString(
- const char *str,
- const char *filename,
- int mode,
- PyCompilerFlags *flags,
- PyArena *arena);
-PyAPI_FUNC(mod_ty) PyPegen_ASTFromStringObject(
- const char *str,
- PyObject* filename,
- int mode,
- PyCompilerFlags *flags,
- PyArena *arena);
-PyAPI_FUNC(mod_ty) PyPegen_ASTFromFileObject(
- FILE *fp,
- PyObject *filename_ob,
- int mode,
- const char *enc,
- const char *ps1,
- const char *ps2,
- PyCompilerFlags *flags,
- int *errcode,
- PyArena *arena);
-PyAPI_FUNC(mod_ty) PyPegen_ASTFromFilename(
- const char *filename,
- int mode,
- PyCompilerFlags *flags,
- PyArena *arena);
-
-
-#ifdef __cplusplus
-}
-#endif
-#endif /* !Py_PEGENINTERFACE*/
diff --git a/contrib/tools/python3/src/Include/internal/pycore_asdl.h b/contrib/tools/python3/src/Include/internal/pycore_asdl.h
new file mode 100644
index 00000000000..c0b07c31810
--- /dev/null
+++ b/contrib/tools/python3/src/Include/internal/pycore_asdl.h
@@ -0,0 +1,112 @@
+#ifndef Py_INTERNAL_ASDL_H
+#define Py_INTERNAL_ASDL_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef Py_BUILD_CORE
+# error "this header requires Py_BUILD_CORE define"
+#endif
+
+#include "pycore_pyarena.h" // _PyArena_Malloc()
+
+typedef PyObject * identifier;
+typedef PyObject * string;
+typedef PyObject * object;
+typedef PyObject * constant;
+
+/* It would be nice if the code generated by asdl_c.py was completely
+ independent of Python, but it is a goal the requires too much work
+ at this stage. So, for example, I'll represent identifiers as
+ interned Python strings.
+*/
+
+#define _ASDL_SEQ_HEAD \
+ Py_ssize_t size; \
+ void **elements;
+
+typedef struct {
+ _ASDL_SEQ_HEAD
+} asdl_seq;
+
+typedef struct {
+ _ASDL_SEQ_HEAD
+ void *typed_elements[1];
+} asdl_generic_seq;
+
+typedef struct {
+ _ASDL_SEQ_HEAD
+ PyObject *typed_elements[1];
+} asdl_identifier_seq;
+
+typedef struct {
+ _ASDL_SEQ_HEAD
+ int typed_elements[1];
+} asdl_int_seq;
+
+asdl_generic_seq *_Py_asdl_generic_seq_new(Py_ssize_t size, PyArena *arena);
+asdl_identifier_seq *_Py_asdl_identifier_seq_new(Py_ssize_t size, PyArena *arena);
+asdl_int_seq *_Py_asdl_int_seq_new(Py_ssize_t size, PyArena *arena);
+
+
+#define GENERATE_ASDL_SEQ_CONSTRUCTOR(NAME, TYPE) \
+asdl_ ## NAME ## _seq *_Py_asdl_ ## NAME ## _seq_new(Py_ssize_t size, PyArena *arena) \
+{ \
+ asdl_ ## NAME ## _seq *seq = NULL; \
+ size_t n; \
+ /* check size is sane */ \
+ if (size < 0 || \
+ (size && (((size_t)size - 1) > (SIZE_MAX / sizeof(void *))))) { \
+ PyErr_NoMemory(); \
+ return NULL; \
+ } \
+ n = (size ? (sizeof(TYPE *) * (size - 1)) : 0); \
+ /* check if size can be added safely */ \
+ if (n > SIZE_MAX - sizeof(asdl_ ## NAME ## _seq)) { \
+ PyErr_NoMemory(); \
+ return NULL; \
+ } \
+ n += sizeof(asdl_ ## NAME ## _seq); \
+ seq = (asdl_ ## NAME ## _seq *)_PyArena_Malloc(arena, n); \
+ if (!seq) { \
+ PyErr_NoMemory(); \
+ return NULL; \
+ } \
+ memset(seq, 0, n); \
+ seq->size = size; \
+ seq->elements = (void**)seq->typed_elements; \
+ return seq; \
+}
+
+#define asdl_seq_GET_UNTYPED(S, I) (S)->elements[(I)]
+#define asdl_seq_GET(S, I) (S)->typed_elements[(I)]
+#define asdl_seq_LEN(S) ((S) == NULL ? 0 : (S)->size)
+
+#ifdef Py_DEBUG
+# define asdl_seq_SET(S, I, V) \
+ do { \
+ Py_ssize_t _asdl_i = (I); \
+ assert((S) != NULL); \
+ assert(0 <= _asdl_i && _asdl_i < (S)->size); \
+ (S)->typed_elements[_asdl_i] = (V); \
+ } while (0)
+#else
+# define asdl_seq_SET(S, I, V) (S)->typed_elements[I] = (V)
+#endif
+
+#ifdef Py_DEBUG
+# define asdl_seq_SET_UNTYPED(S, I, V) \
+ do { \
+ Py_ssize_t _asdl_i = (I); \
+ assert((S) != NULL); \
+ assert(0 <= _asdl_i && _asdl_i < (S)->size); \
+ (S)->elements[_asdl_i] = (V); \
+ } while (0)
+#else
+# define asdl_seq_SET_UNTYPED(S, I, V) (S)->elements[I] = (V)
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* !Py_INTERNAL_ASDL_H */
diff --git a/contrib/tools/python3/src/Include/internal/pycore_ast.h b/contrib/tools/python3/src/Include/internal/pycore_ast.h
new file mode 100644
index 00000000000..ebb6a90087b
--- /dev/null
+++ b/contrib/tools/python3/src/Include/internal/pycore_ast.h
@@ -0,0 +1,855 @@
+// File automatically generated by Parser/asdl_c.py.
+
+#ifndef Py_INTERNAL_AST_H
+#define Py_INTERNAL_AST_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef Py_BUILD_CORE
+# error "this header requires Py_BUILD_CORE define"
+#endif
+
+#include "pycore_asdl.h"
+
+typedef struct _mod *mod_ty;
+
+typedef struct _stmt *stmt_ty;
+
+typedef struct _expr *expr_ty;
+
+typedef enum _expr_context { Load=1, Store=2, Del=3 } expr_context_ty;
+
+typedef enum _boolop { And=1, Or=2 } boolop_ty;
+
+typedef enum _operator { Add=1, Sub=2, Mult=3, MatMult=4, Div=5, Mod=6, Pow=7,
+ LShift=8, RShift=9, BitOr=10, BitXor=11, BitAnd=12,
+ FloorDiv=13 } operator_ty;
+
+typedef enum _unaryop { Invert=1, Not=2, UAdd=3, USub=4 } unaryop_ty;
+
+typedef enum _cmpop { Eq=1, NotEq=2, Lt=3, LtE=4, Gt=5, GtE=6, Is=7, IsNot=8,
+ In=9, NotIn=10 } cmpop_ty;
+
+typedef struct _comprehension *comprehension_ty;
+
+typedef struct _excepthandler *excepthandler_ty;
+
+typedef struct _arguments *arguments_ty;
+
+typedef struct _arg *arg_ty;
+
+typedef struct _keyword *keyword_ty;
+
+typedef struct _alias *alias_ty;
+
+typedef struct _withitem *withitem_ty;
+
+typedef struct _match_case *match_case_ty;
+
+typedef struct _pattern *pattern_ty;
+
+typedef struct _type_ignore *type_ignore_ty;
+
+
+typedef struct {
+ _ASDL_SEQ_HEAD
+ mod_ty typed_elements[1];
+} asdl_mod_seq;
+
+asdl_mod_seq *_Py_asdl_mod_seq_new(Py_ssize_t size, PyArena *arena);
+
+typedef struct {
+ _ASDL_SEQ_HEAD
+ stmt_ty typed_elements[1];
+} asdl_stmt_seq;
+
+asdl_stmt_seq *_Py_asdl_stmt_seq_new(Py_ssize_t size, PyArena *arena);
+
+typedef struct {
+ _ASDL_SEQ_HEAD
+ expr_ty typed_elements[1];
+} asdl_expr_seq;
+
+asdl_expr_seq *_Py_asdl_expr_seq_new(Py_ssize_t size, PyArena *arena);
+
+typedef struct {
+ _ASDL_SEQ_HEAD
+ comprehension_ty typed_elements[1];
+} asdl_comprehension_seq;
+
+asdl_comprehension_seq *_Py_asdl_comprehension_seq_new(Py_ssize_t size, PyArena
+ *arena);
+
+typedef struct {
+ _ASDL_SEQ_HEAD
+ excepthandler_ty typed_elements[1];
+} asdl_excepthandler_seq;
+
+asdl_excepthandler_seq *_Py_asdl_excepthandler_seq_new(Py_ssize_t size, PyArena
+ *arena);
+
+typedef struct {
+ _ASDL_SEQ_HEAD
+ arguments_ty typed_elements[1];
+} asdl_arguments_seq;
+
+asdl_arguments_seq *_Py_asdl_arguments_seq_new(Py_ssize_t size, PyArena *arena);
+
+typedef struct {
+ _ASDL_SEQ_HEAD
+ arg_ty typed_elements[1];
+} asdl_arg_seq;
+
+asdl_arg_seq *_Py_asdl_arg_seq_new(Py_ssize_t size, PyArena *arena);
+
+typedef struct {
+ _ASDL_SEQ_HEAD
+ keyword_ty typed_elements[1];
+} asdl_keyword_seq;
+
+asdl_keyword_seq *_Py_asdl_keyword_seq_new(Py_ssize_t size, PyArena *arena);
+
+typedef struct {
+ _ASDL_SEQ_HEAD
+ alias_ty typed_elements[1];
+} asdl_alias_seq;
+
+asdl_alias_seq *_Py_asdl_alias_seq_new(Py_ssize_t size, PyArena *arena);
+
+typedef struct {
+ _ASDL_SEQ_HEAD
+ withitem_ty typed_elements[1];
+} asdl_withitem_seq;
+
+asdl_withitem_seq *_Py_asdl_withitem_seq_new(Py_ssize_t size, PyArena *arena);
+
+typedef struct {
+ _ASDL_SEQ_HEAD
+ match_case_ty typed_elements[1];
+} asdl_match_case_seq;
+
+asdl_match_case_seq *_Py_asdl_match_case_seq_new(Py_ssize_t size, PyArena
+ *arena);
+
+typedef struct {
+ _ASDL_SEQ_HEAD
+ pattern_ty typed_elements[1];
+} asdl_pattern_seq;
+
+asdl_pattern_seq *_Py_asdl_pattern_seq_new(Py_ssize_t size, PyArena *arena);
+
+typedef struct {
+ _ASDL_SEQ_HEAD
+ type_ignore_ty typed_elements[1];
+} asdl_type_ignore_seq;
+
+asdl_type_ignore_seq *_Py_asdl_type_ignore_seq_new(Py_ssize_t size, PyArena
+ *arena);
+
+
+enum _mod_kind {Module_kind=1, Interactive_kind=2, Expression_kind=3,
+ FunctionType_kind=4};
+struct _mod {
+ enum _mod_kind kind;
+ union {
+ struct {
+ asdl_stmt_seq *body;
+ asdl_type_ignore_seq *type_ignores;
+ } Module;
+
+ struct {
+ asdl_stmt_seq *body;
+ } Interactive;
+
+ struct {
+ expr_ty body;
+ } Expression;
+
+ struct {
+ asdl_expr_seq *argtypes;
+ expr_ty returns;
+ } FunctionType;
+
+ } v;
+};
+
+enum _stmt_kind {FunctionDef_kind=1, AsyncFunctionDef_kind=2, ClassDef_kind=3,
+ Return_kind=4, Delete_kind=5, Assign_kind=6,
+ AugAssign_kind=7, AnnAssign_kind=8, For_kind=9,
+ AsyncFor_kind=10, While_kind=11, If_kind=12, With_kind=13,
+ AsyncWith_kind=14, Match_kind=15, Raise_kind=16, Try_kind=17,
+ Assert_kind=18, Import_kind=19, ImportFrom_kind=20,
+ Global_kind=21, Nonlocal_kind=22, Expr_kind=23, Pass_kind=24,
+ Break_kind=25, Continue_kind=26};
+struct _stmt {
+ enum _stmt_kind kind;
+ union {
+ struct {
+ identifier name;
+ arguments_ty args;
+ asdl_stmt_seq *body;
+ asdl_expr_seq *decorator_list;
+ expr_ty returns;
+ string type_comment;
+ } FunctionDef;
+
+ struct {
+ identifier name;
+ arguments_ty args;
+ asdl_stmt_seq *body;
+ asdl_expr_seq *decorator_list;
+ expr_ty returns;
+ string type_comment;
+ } AsyncFunctionDef;
+
+ struct {
+ identifier name;
+ asdl_expr_seq *bases;
+ asdl_keyword_seq *keywords;
+ asdl_stmt_seq *body;
+ asdl_expr_seq *decorator_list;
+ } ClassDef;
+
+ struct {
+ expr_ty value;
+ } Return;
+
+ struct {
+ asdl_expr_seq *targets;
+ } Delete;
+
+ struct {
+ asdl_expr_seq *targets;
+ expr_ty value;
+ string type_comment;
+ } Assign;
+
+ struct {
+ expr_ty target;
+ operator_ty op;
+ expr_ty value;
+ } AugAssign;
+
+ struct {
+ expr_ty target;
+ expr_ty annotation;
+ expr_ty value;
+ int simple;
+ } AnnAssign;
+
+ struct {
+ expr_ty target;
+ expr_ty iter;
+ asdl_stmt_seq *body;
+ asdl_stmt_seq *orelse;
+ string type_comment;
+ } For;
+
+ struct {
+ expr_ty target;
+ expr_ty iter;
+ asdl_stmt_seq *body;
+ asdl_stmt_seq *orelse;
+ string type_comment;
+ } AsyncFor;
+
+ struct {
+ expr_ty test;
+ asdl_stmt_seq *body;
+ asdl_stmt_seq *orelse;
+ } While;
+
+ struct {
+ expr_ty test;
+ asdl_stmt_seq *body;
+ asdl_stmt_seq *orelse;
+ } If;
+
+ struct {
+ asdl_withitem_seq *items;
+ asdl_stmt_seq *body;
+ string type_comment;
+ } With;
+
+ struct {
+ asdl_withitem_seq *items;
+ asdl_stmt_seq *body;
+ string type_comment;
+ } AsyncWith;
+
+ struct {
+ expr_ty subject;
+ asdl_match_case_seq *cases;
+ } Match;
+
+ struct {
+ expr_ty exc;
+ expr_ty cause;
+ } Raise;
+
+ struct {
+ asdl_stmt_seq *body;
+ asdl_excepthandler_seq *handlers;
+ asdl_stmt_seq *orelse;
+ asdl_stmt_seq *finalbody;
+ } Try;
+
+ struct {
+ expr_ty test;
+ expr_ty msg;
+ } Assert;
+
+ struct {
+ asdl_alias_seq *names;
+ } Import;
+
+ struct {
+ identifier module;
+ asdl_alias_seq *names;
+ int level;
+ } ImportFrom;
+
+ struct {
+ asdl_identifier_seq *names;
+ } Global;
+
+ struct {
+ asdl_identifier_seq *names;
+ } Nonlocal;
+
+ struct {
+ expr_ty value;
+ } Expr;
+
+ } v;
+ int lineno;
+ int col_offset;
+ int end_lineno;
+ int end_col_offset;
+};
+
+enum _expr_kind {BoolOp_kind=1, NamedExpr_kind=2, BinOp_kind=3, UnaryOp_kind=4,
+ Lambda_kind=5, IfExp_kind=6, Dict_kind=7, Set_kind=8,
+ ListComp_kind=9, SetComp_kind=10, DictComp_kind=11,
+ GeneratorExp_kind=12, Await_kind=13, Yield_kind=14,
+ YieldFrom_kind=15, Compare_kind=16, Call_kind=17,
+ FormattedValue_kind=18, JoinedStr_kind=19, Constant_kind=20,
+ Attribute_kind=21, Subscript_kind=22, Starred_kind=23,
+ Name_kind=24, List_kind=25, Tuple_kind=26, Slice_kind=27};
+struct _expr {
+ enum _expr_kind kind;
+ union {
+ struct {
+ boolop_ty op;
+ asdl_expr_seq *values;
+ } BoolOp;
+
+ struct {
+ expr_ty target;
+ expr_ty value;
+ } NamedExpr;
+
+ struct {
+ expr_ty left;
+ operator_ty op;
+ expr_ty right;
+ } BinOp;
+
+ struct {
+ unaryop_ty op;
+ expr_ty operand;
+ } UnaryOp;
+
+ struct {
+ arguments_ty args;
+ expr_ty body;
+ } Lambda;
+
+ struct {
+ expr_ty test;
+ expr_ty body;
+ expr_ty orelse;
+ } IfExp;
+
+ struct {
+ asdl_expr_seq *keys;
+ asdl_expr_seq *values;
+ } Dict;
+
+ struct {
+ asdl_expr_seq *elts;
+ } Set;
+
+ struct {
+ expr_ty elt;
+ asdl_comprehension_seq *generators;
+ } ListComp;
+
+ struct {
+ expr_ty elt;
+ asdl_comprehension_seq *generators;
+ } SetComp;
+
+ struct {
+ expr_ty key;
+ expr_ty value;
+ asdl_comprehension_seq *generators;
+ } DictComp;
+
+ struct {
+ expr_ty elt;
+ asdl_comprehension_seq *generators;
+ } GeneratorExp;
+
+ struct {
+ expr_ty value;
+ } Await;
+
+ struct {
+ expr_ty value;
+ } Yield;
+
+ struct {
+ expr_ty value;
+ } YieldFrom;
+
+ struct {
+ expr_ty left;
+ asdl_int_seq *ops;
+ asdl_expr_seq *comparators;
+ } Compare;
+
+ struct {
+ expr_ty func;
+ asdl_expr_seq *args;
+ asdl_keyword_seq *keywords;
+ } Call;
+
+ struct {
+ expr_ty value;
+ int conversion;
+ expr_ty format_spec;
+ } FormattedValue;
+
+ struct {
+ asdl_expr_seq *values;
+ } JoinedStr;
+
+ struct {
+ constant value;
+ string kind;
+ } Constant;
+
+ struct {
+ expr_ty value;
+ identifier attr;
+ expr_context_ty ctx;
+ } Attribute;
+
+ struct {
+ expr_ty value;
+ expr_ty slice;
+ expr_context_ty ctx;
+ } Subscript;
+
+ struct {
+ expr_ty value;
+ expr_context_ty ctx;
+ } Starred;
+
+ struct {
+ identifier id;
+ expr_context_ty ctx;
+ } Name;
+
+ struct {
+ asdl_expr_seq *elts;
+ expr_context_ty ctx;
+ } List;
+
+ struct {
+ asdl_expr_seq *elts;
+ expr_context_ty ctx;
+ } Tuple;
+
+ struct {
+ expr_ty lower;
+ expr_ty upper;
+ expr_ty step;
+ } Slice;
+
+ } v;
+ int lineno;
+ int col_offset;
+ int end_lineno;
+ int end_col_offset;
+};
+
+struct _comprehension {
+ expr_ty target;
+ expr_ty iter;
+ asdl_expr_seq *ifs;
+ int is_async;
+};
+
+enum _excepthandler_kind {ExceptHandler_kind=1};
+struct _excepthandler {
+ enum _excepthandler_kind kind;
+ union {
+ struct {
+ expr_ty type;
+ identifier name;
+ asdl_stmt_seq *body;
+ } ExceptHandler;
+
+ } v;
+ int lineno;
+ int col_offset;
+ int end_lineno;
+ int end_col_offset;
+};
+
+struct _arguments {
+ asdl_arg_seq *posonlyargs;
+ asdl_arg_seq *args;
+ arg_ty vararg;
+ asdl_arg_seq *kwonlyargs;
+ asdl_expr_seq *kw_defaults;
+ arg_ty kwarg;
+ asdl_expr_seq *defaults;
+};
+
+struct _arg {
+ identifier arg;
+ expr_ty annotation;
+ string type_comment;
+ int lineno;
+ int col_offset;
+ int end_lineno;
+ int end_col_offset;
+};
+
+struct _keyword {
+ identifier arg;
+ expr_ty value;
+ int lineno;
+ int col_offset;
+ int end_lineno;
+ int end_col_offset;
+};
+
+struct _alias {
+ identifier name;
+ identifier asname;
+ int lineno;
+ int col_offset;
+ int end_lineno;
+ int end_col_offset;
+};
+
+struct _withitem {
+ expr_ty context_expr;
+ expr_ty optional_vars;
+};
+
+struct _match_case {
+ pattern_ty pattern;
+ expr_ty guard;
+ asdl_stmt_seq *body;
+};
+
+enum _pattern_kind {MatchValue_kind=1, MatchSingleton_kind=2,
+ MatchSequence_kind=3, MatchMapping_kind=4,
+ MatchClass_kind=5, MatchStar_kind=6, MatchAs_kind=7,
+ MatchOr_kind=8};
+struct _pattern {
+ enum _pattern_kind kind;
+ union {
+ struct {
+ expr_ty value;
+ } MatchValue;
+
+ struct {
+ constant value;
+ } MatchSingleton;
+
+ struct {
+ asdl_pattern_seq *patterns;
+ } MatchSequence;
+
+ struct {
+ asdl_expr_seq *keys;
+ asdl_pattern_seq *patterns;
+ identifier rest;
+ } MatchMapping;
+
+ struct {
+ expr_ty cls;
+ asdl_pattern_seq *patterns;
+ asdl_identifier_seq *kwd_attrs;
+ asdl_pattern_seq *kwd_patterns;
+ } MatchClass;
+
+ struct {
+ identifier name;
+ } MatchStar;
+
+ struct {
+ pattern_ty pattern;
+ identifier name;
+ } MatchAs;
+
+ struct {
+ asdl_pattern_seq *patterns;
+ } MatchOr;
+
+ } v;
+ int lineno;
+ int col_offset;
+ int end_lineno;
+ int end_col_offset;
+};
+
+enum _type_ignore_kind {TypeIgnore_kind=1};
+struct _type_ignore {
+ enum _type_ignore_kind kind;
+ union {
+ struct {
+ int lineno;
+ string tag;
+ } TypeIgnore;
+
+ } v;
+};
+
+
+// Note: these macros affect function definitions, not only call sites.
+mod_ty _PyAST_Module(asdl_stmt_seq * body, asdl_type_ignore_seq * type_ignores,
+ PyArena *arena);
+mod_ty _PyAST_Interactive(asdl_stmt_seq * body, PyArena *arena);
+mod_ty _PyAST_Expression(expr_ty body, PyArena *arena);
+mod_ty _PyAST_FunctionType(asdl_expr_seq * argtypes, expr_ty returns, PyArena
+ *arena);
+stmt_ty _PyAST_FunctionDef(identifier name, arguments_ty args, asdl_stmt_seq *
+ body, asdl_expr_seq * decorator_list, expr_ty
+ returns, string type_comment, int lineno, int
+ col_offset, int end_lineno, int end_col_offset,
+ PyArena *arena);
+stmt_ty _PyAST_AsyncFunctionDef(identifier name, arguments_ty args,
+ asdl_stmt_seq * body, asdl_expr_seq *
+ decorator_list, expr_ty returns, string
+ type_comment, int lineno, int col_offset, int
+ end_lineno, int end_col_offset, PyArena *arena);
+stmt_ty _PyAST_ClassDef(identifier name, asdl_expr_seq * bases,
+ asdl_keyword_seq * keywords, asdl_stmt_seq * body,
+ asdl_expr_seq * decorator_list, int lineno, int
+ col_offset, int end_lineno, int end_col_offset, PyArena
+ *arena);
+stmt_ty _PyAST_Return(expr_ty value, int lineno, int col_offset, int
+ end_lineno, int end_col_offset, PyArena *arena);
+stmt_ty _PyAST_Delete(asdl_expr_seq * targets, int lineno, int col_offset, int
+ end_lineno, int end_col_offset, PyArena *arena);
+stmt_ty _PyAST_Assign(asdl_expr_seq * targets, expr_ty value, string
+ type_comment, int lineno, int col_offset, int end_lineno,
+ int end_col_offset, PyArena *arena);
+stmt_ty _PyAST_AugAssign(expr_ty target, operator_ty op, expr_ty value, int
+ lineno, int col_offset, int end_lineno, int
+ end_col_offset, PyArena *arena);
+stmt_ty _PyAST_AnnAssign(expr_ty target, expr_ty annotation, expr_ty value, int
+ simple, int lineno, int col_offset, int end_lineno,
+ int end_col_offset, PyArena *arena);
+stmt_ty _PyAST_For(expr_ty target, expr_ty iter, asdl_stmt_seq * body,
+ asdl_stmt_seq * orelse, string type_comment, int lineno, int
+ col_offset, int end_lineno, int end_col_offset, PyArena
+ *arena);
+stmt_ty _PyAST_AsyncFor(expr_ty target, expr_ty iter, asdl_stmt_seq * body,
+ asdl_stmt_seq * orelse, string type_comment, int
+ lineno, int col_offset, int end_lineno, int
+ end_col_offset, PyArena *arena);
+stmt_ty _PyAST_While(expr_ty test, asdl_stmt_seq * body, asdl_stmt_seq *
+ orelse, int lineno, int col_offset, int end_lineno, int
+ end_col_offset, PyArena *arena);
+stmt_ty _PyAST_If(expr_ty test, asdl_stmt_seq * body, asdl_stmt_seq * orelse,
+ int lineno, int col_offset, int end_lineno, int
+ end_col_offset, PyArena *arena);
+stmt_ty _PyAST_With(asdl_withitem_seq * items, asdl_stmt_seq * body, string
+ type_comment, int lineno, int col_offset, int end_lineno,
+ int end_col_offset, PyArena *arena);
+stmt_ty _PyAST_AsyncWith(asdl_withitem_seq * items, asdl_stmt_seq * body,
+ string type_comment, int lineno, int col_offset, int
+ end_lineno, int end_col_offset, PyArena *arena);
+stmt_ty _PyAST_Match(expr_ty subject, asdl_match_case_seq * cases, int lineno,
+ int col_offset, int end_lineno, int end_col_offset,
+ PyArena *arena);
+stmt_ty _PyAST_Raise(expr_ty exc, expr_ty cause, int lineno, int col_offset,
+ int end_lineno, int end_col_offset, PyArena *arena);
+stmt_ty _PyAST_Try(asdl_stmt_seq * body, asdl_excepthandler_seq * handlers,
+ asdl_stmt_seq * orelse, asdl_stmt_seq * finalbody, int
+ lineno, int col_offset, int end_lineno, int end_col_offset,
+ PyArena *arena);
+stmt_ty _PyAST_Assert(expr_ty test, expr_ty msg, int lineno, int col_offset,
+ int end_lineno, int end_col_offset, PyArena *arena);
+stmt_ty _PyAST_Import(asdl_alias_seq * names, int lineno, int col_offset, int
+ end_lineno, int end_col_offset, PyArena *arena);
+stmt_ty _PyAST_ImportFrom(identifier module, asdl_alias_seq * names, int level,
+ int lineno, int col_offset, int end_lineno, int
+ end_col_offset, PyArena *arena);
+stmt_ty _PyAST_Global(asdl_identifier_seq * names, int lineno, int col_offset,
+ int end_lineno, int end_col_offset, PyArena *arena);
+stmt_ty _PyAST_Nonlocal(asdl_identifier_seq * names, int lineno, int
+ col_offset, int end_lineno, int end_col_offset, PyArena
+ *arena);
+stmt_ty _PyAST_Expr(expr_ty value, int lineno, int col_offset, int end_lineno,
+ int end_col_offset, PyArena *arena);
+stmt_ty _PyAST_Pass(int lineno, int col_offset, int end_lineno, int
+ end_col_offset, PyArena *arena);
+stmt_ty _PyAST_Break(int lineno, int col_offset, int end_lineno, int
+ end_col_offset, PyArena *arena);
+stmt_ty _PyAST_Continue(int lineno, int col_offset, int end_lineno, int
+ end_col_offset, PyArena *arena);
+expr_ty _PyAST_BoolOp(boolop_ty op, asdl_expr_seq * values, int lineno, int
+ col_offset, int end_lineno, int end_col_offset, PyArena
+ *arena);
+expr_ty _PyAST_NamedExpr(expr_ty target, expr_ty value, int lineno, int
+ col_offset, int end_lineno, int end_col_offset,
+ PyArena *arena);
+expr_ty _PyAST_BinOp(expr_ty left, operator_ty op, expr_ty right, int lineno,
+ int col_offset, int end_lineno, int end_col_offset,
+ PyArena *arena);
+expr_ty _PyAST_UnaryOp(unaryop_ty op, expr_ty operand, int lineno, int
+ col_offset, int end_lineno, int end_col_offset, PyArena
+ *arena);
+expr_ty _PyAST_Lambda(arguments_ty args, expr_ty body, int lineno, int
+ col_offset, int end_lineno, int end_col_offset, PyArena
+ *arena);
+expr_ty _PyAST_IfExp(expr_ty test, expr_ty body, expr_ty orelse, int lineno,
+ int col_offset, int end_lineno, int end_col_offset,
+ PyArena *arena);
+expr_ty _PyAST_Dict(asdl_expr_seq * keys, asdl_expr_seq * values, int lineno,
+ int col_offset, int end_lineno, int end_col_offset, PyArena
+ *arena);
+expr_ty _PyAST_Set(asdl_expr_seq * elts, int lineno, int col_offset, int
+ end_lineno, int end_col_offset, PyArena *arena);
+expr_ty _PyAST_ListComp(expr_ty elt, asdl_comprehension_seq * generators, int
+ lineno, int col_offset, int end_lineno, int
+ end_col_offset, PyArena *arena);
+expr_ty _PyAST_SetComp(expr_ty elt, asdl_comprehension_seq * generators, int
+ lineno, int col_offset, int end_lineno, int
+ end_col_offset, PyArena *arena);
+expr_ty _PyAST_DictComp(expr_ty key, expr_ty value, asdl_comprehension_seq *
+ generators, int lineno, int col_offset, int end_lineno,
+ int end_col_offset, PyArena *arena);
+expr_ty _PyAST_GeneratorExp(expr_ty elt, asdl_comprehension_seq * generators,
+ int lineno, int col_offset, int end_lineno, int
+ end_col_offset, PyArena *arena);
+expr_ty _PyAST_Await(expr_ty value, int lineno, int col_offset, int end_lineno,
+ int end_col_offset, PyArena *arena);
+expr_ty _PyAST_Yield(expr_ty value, int lineno, int col_offset, int end_lineno,
+ int end_col_offset, PyArena *arena);
+expr_ty _PyAST_YieldFrom(expr_ty value, int lineno, int col_offset, int
+ end_lineno, int end_col_offset, PyArena *arena);
+expr_ty _PyAST_Compare(expr_ty left, asdl_int_seq * ops, asdl_expr_seq *
+ comparators, int lineno, int col_offset, int end_lineno,
+ int end_col_offset, PyArena *arena);
+expr_ty _PyAST_Call(expr_ty func, asdl_expr_seq * args, asdl_keyword_seq *
+ keywords, int lineno, int col_offset, int end_lineno, int
+ end_col_offset, PyArena *arena);
+expr_ty _PyAST_FormattedValue(expr_ty value, int conversion, expr_ty
+ format_spec, int lineno, int col_offset, int
+ end_lineno, int end_col_offset, PyArena *arena);
+expr_ty _PyAST_JoinedStr(asdl_expr_seq * values, int lineno, int col_offset,
+ int end_lineno, int end_col_offset, PyArena *arena);
+expr_ty _PyAST_Constant(constant value, string kind, int lineno, int
+ col_offset, int end_lineno, int end_col_offset, PyArena
+ *arena);
+expr_ty _PyAST_Attribute(expr_ty value, identifier attr, expr_context_ty ctx,
+ int lineno, int col_offset, int end_lineno, int
+ end_col_offset, PyArena *arena);
+expr_ty _PyAST_Subscript(expr_ty value, expr_ty slice, expr_context_ty ctx, int
+ lineno, int col_offset, int end_lineno, int
+ end_col_offset, PyArena *arena);
+expr_ty _PyAST_Starred(expr_ty value, expr_context_ty ctx, int lineno, int
+ col_offset, int end_lineno, int end_col_offset, PyArena
+ *arena);
+expr_ty _PyAST_Name(identifier id, expr_context_ty ctx, int lineno, int
+ col_offset, int end_lineno, int end_col_offset, PyArena
+ *arena);
+expr_ty _PyAST_List(asdl_expr_seq * elts, expr_context_ty ctx, int lineno, int
+ col_offset, int end_lineno, int end_col_offset, PyArena
+ *arena);
+expr_ty _PyAST_Tuple(asdl_expr_seq * elts, expr_context_ty ctx, int lineno, int
+ col_offset, int end_lineno, int end_col_offset, PyArena
+ *arena);
+expr_ty _PyAST_Slice(expr_ty lower, expr_ty upper, expr_ty step, int lineno,
+ int col_offset, int end_lineno, int end_col_offset,
+ PyArena *arena);
+comprehension_ty _PyAST_comprehension(expr_ty target, expr_ty iter,
+ asdl_expr_seq * ifs, int is_async,
+ PyArena *arena);
+excepthandler_ty _PyAST_ExceptHandler(expr_ty type, identifier name,
+ asdl_stmt_seq * body, int lineno, int
+ col_offset, int end_lineno, int
+ end_col_offset, PyArena *arena);
+arguments_ty _PyAST_arguments(asdl_arg_seq * posonlyargs, asdl_arg_seq * args,
+ arg_ty vararg, asdl_arg_seq * kwonlyargs,
+ asdl_expr_seq * kw_defaults, arg_ty kwarg,
+ asdl_expr_seq * defaults, PyArena *arena);
+arg_ty _PyAST_arg(identifier arg, expr_ty annotation, string type_comment, int
+ lineno, int col_offset, int end_lineno, int end_col_offset,
+ PyArena *arena);
+keyword_ty _PyAST_keyword(identifier arg, expr_ty value, int lineno, int
+ col_offset, int end_lineno, int end_col_offset,
+ PyArena *arena);
+alias_ty _PyAST_alias(identifier name, identifier asname, int lineno, int
+ col_offset, int end_lineno, int end_col_offset, PyArena
+ *arena);
+withitem_ty _PyAST_withitem(expr_ty context_expr, expr_ty optional_vars,
+ PyArena *arena);
+match_case_ty _PyAST_match_case(pattern_ty pattern, expr_ty guard,
+ asdl_stmt_seq * body, PyArena *arena);
+pattern_ty _PyAST_MatchValue(expr_ty value, int lineno, int col_offset, int
+ end_lineno, int end_col_offset, PyArena *arena);
+pattern_ty _PyAST_MatchSingleton(constant value, int lineno, int col_offset,
+ int end_lineno, int end_col_offset, PyArena
+ *arena);
+pattern_ty _PyAST_MatchSequence(asdl_pattern_seq * patterns, int lineno, int
+ col_offset, int end_lineno, int end_col_offset,
+ PyArena *arena);
+pattern_ty _PyAST_MatchMapping(asdl_expr_seq * keys, asdl_pattern_seq *
+ patterns, identifier rest, int lineno, int
+ col_offset, int end_lineno, int end_col_offset,
+ PyArena *arena);
+pattern_ty _PyAST_MatchClass(expr_ty cls, asdl_pattern_seq * patterns,
+ asdl_identifier_seq * kwd_attrs, asdl_pattern_seq
+ * kwd_patterns, int lineno, int col_offset, int
+ end_lineno, int end_col_offset, PyArena *arena);
+pattern_ty _PyAST_MatchStar(identifier name, int lineno, int col_offset, int
+ end_lineno, int end_col_offset, PyArena *arena);
+pattern_ty _PyAST_MatchAs(pattern_ty pattern, identifier name, int lineno, int
+ col_offset, int end_lineno, int end_col_offset,
+ PyArena *arena);
+pattern_ty _PyAST_MatchOr(asdl_pattern_seq * patterns, int lineno, int
+ col_offset, int end_lineno, int end_col_offset,
+ PyArena *arena);
+type_ignore_ty _PyAST_TypeIgnore(int lineno, string tag, PyArena *arena);
+
+
+PyObject* PyAST_mod2obj(mod_ty t);
+mod_ty PyAST_obj2mod(PyObject* ast, PyArena* arena, int mode);
+int PyAST_Check(PyObject* obj);
+
+extern int _PyAST_Validate(mod_ty);
+
+/* _PyAST_ExprAsUnicode is defined in ast_unparse.c */
+extern PyObject* _PyAST_ExprAsUnicode(expr_ty);
+
+/* Return the borrowed reference to the first literal string in the
+ sequence of statements or NULL if it doesn't start from a literal string.
+ Doesn't set exception. */
+extern PyObject* _PyAST_GetDocString(asdl_stmt_seq *);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* !Py_INTERNAL_AST_H */
diff --git a/contrib/tools/python3/src/Include/internal/pycore_ast_state.h b/contrib/tools/python3/src/Include/internal/pycore_ast_state.h
new file mode 100644
index 00000000000..882cd09c006
--- /dev/null
+++ b/contrib/tools/python3/src/Include/internal/pycore_ast_state.h
@@ -0,0 +1,255 @@
+// File automatically generated by Parser/asdl_c.py.
+
+#ifndef Py_INTERNAL_AST_STATE_H
+#define Py_INTERNAL_AST_STATE_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef Py_BUILD_CORE
+# error "this header requires Py_BUILD_CORE define"
+#endif
+
+struct ast_state {
+ int initialized;
+ PyObject *AST_type;
+ PyObject *Add_singleton;
+ PyObject *Add_type;
+ PyObject *And_singleton;
+ PyObject *And_type;
+ PyObject *AnnAssign_type;
+ PyObject *Assert_type;
+ PyObject *Assign_type;
+ PyObject *AsyncFor_type;
+ PyObject *AsyncFunctionDef_type;
+ PyObject *AsyncWith_type;
+ PyObject *Attribute_type;
+ PyObject *AugAssign_type;
+ PyObject *Await_type;
+ PyObject *BinOp_type;
+ PyObject *BitAnd_singleton;
+ PyObject *BitAnd_type;
+ PyObject *BitOr_singleton;
+ PyObject *BitOr_type;
+ PyObject *BitXor_singleton;
+ PyObject *BitXor_type;
+ PyObject *BoolOp_type;
+ PyObject *Break_type;
+ PyObject *Call_type;
+ PyObject *ClassDef_type;
+ PyObject *Compare_type;
+ PyObject *Constant_type;
+ PyObject *Continue_type;
+ PyObject *Del_singleton;
+ PyObject *Del_type;
+ PyObject *Delete_type;
+ PyObject *DictComp_type;
+ PyObject *Dict_type;
+ PyObject *Div_singleton;
+ PyObject *Div_type;
+ PyObject *Eq_singleton;
+ PyObject *Eq_type;
+ PyObject *ExceptHandler_type;
+ PyObject *Expr_type;
+ PyObject *Expression_type;
+ PyObject *FloorDiv_singleton;
+ PyObject *FloorDiv_type;
+ PyObject *For_type;
+ PyObject *FormattedValue_type;
+ PyObject *FunctionDef_type;
+ PyObject *FunctionType_type;
+ PyObject *GeneratorExp_type;
+ PyObject *Global_type;
+ PyObject *GtE_singleton;
+ PyObject *GtE_type;
+ PyObject *Gt_singleton;
+ PyObject *Gt_type;
+ PyObject *IfExp_type;
+ PyObject *If_type;
+ PyObject *ImportFrom_type;
+ PyObject *Import_type;
+ PyObject *In_singleton;
+ PyObject *In_type;
+ PyObject *Interactive_type;
+ PyObject *Invert_singleton;
+ PyObject *Invert_type;
+ PyObject *IsNot_singleton;
+ PyObject *IsNot_type;
+ PyObject *Is_singleton;
+ PyObject *Is_type;
+ PyObject *JoinedStr_type;
+ PyObject *LShift_singleton;
+ PyObject *LShift_type;
+ PyObject *Lambda_type;
+ PyObject *ListComp_type;
+ PyObject *List_type;
+ PyObject *Load_singleton;
+ PyObject *Load_type;
+ PyObject *LtE_singleton;
+ PyObject *LtE_type;
+ PyObject *Lt_singleton;
+ PyObject *Lt_type;
+ PyObject *MatMult_singleton;
+ PyObject *MatMult_type;
+ PyObject *MatchAs_type;
+ PyObject *MatchClass_type;
+ PyObject *MatchMapping_type;
+ PyObject *MatchOr_type;
+ PyObject *MatchSequence_type;
+ PyObject *MatchSingleton_type;
+ PyObject *MatchStar_type;
+ PyObject *MatchValue_type;
+ PyObject *Match_type;
+ PyObject *Mod_singleton;
+ PyObject *Mod_type;
+ PyObject *Module_type;
+ PyObject *Mult_singleton;
+ PyObject *Mult_type;
+ PyObject *Name_type;
+ PyObject *NamedExpr_type;
+ PyObject *Nonlocal_type;
+ PyObject *NotEq_singleton;
+ PyObject *NotEq_type;
+ PyObject *NotIn_singleton;
+ PyObject *NotIn_type;
+ PyObject *Not_singleton;
+ PyObject *Not_type;
+ PyObject *Or_singleton;
+ PyObject *Or_type;
+ PyObject *Pass_type;
+ PyObject *Pow_singleton;
+ PyObject *Pow_type;
+ PyObject *RShift_singleton;
+ PyObject *RShift_type;
+ PyObject *Raise_type;
+ PyObject *Return_type;
+ PyObject *SetComp_type;
+ PyObject *Set_type;
+ PyObject *Slice_type;
+ PyObject *Starred_type;
+ PyObject *Store_singleton;
+ PyObject *Store_type;
+ PyObject *Sub_singleton;
+ PyObject *Sub_type;
+ PyObject *Subscript_type;
+ PyObject *Try_type;
+ PyObject *Tuple_type;
+ PyObject *TypeIgnore_type;
+ PyObject *UAdd_singleton;
+ PyObject *UAdd_type;
+ PyObject *USub_singleton;
+ PyObject *USub_type;
+ PyObject *UnaryOp_type;
+ PyObject *While_type;
+ PyObject *With_type;
+ PyObject *YieldFrom_type;
+ PyObject *Yield_type;
+ PyObject *__dict__;
+ PyObject *__doc__;
+ PyObject *__match_args__;
+ PyObject *__module__;
+ PyObject *_attributes;
+ PyObject *_fields;
+ PyObject *alias_type;
+ PyObject *annotation;
+ PyObject *arg;
+ PyObject *arg_type;
+ PyObject *args;
+ PyObject *argtypes;
+ PyObject *arguments_type;
+ PyObject *asname;
+ PyObject *ast;
+ PyObject *attr;
+ PyObject *bases;
+ PyObject *body;
+ PyObject *boolop_type;
+ PyObject *cases;
+ PyObject *cause;
+ PyObject *cls;
+ PyObject *cmpop_type;
+ PyObject *col_offset;
+ PyObject *comparators;
+ PyObject *comprehension_type;
+ PyObject *context_expr;
+ PyObject *conversion;
+ PyObject *ctx;
+ PyObject *decorator_list;
+ PyObject *defaults;
+ PyObject *elt;
+ PyObject *elts;
+ PyObject *end_col_offset;
+ PyObject *end_lineno;
+ PyObject *exc;
+ PyObject *excepthandler_type;
+ PyObject *expr_context_type;
+ PyObject *expr_type;
+ PyObject *finalbody;
+ PyObject *format_spec;
+ PyObject *func;
+ PyObject *generators;
+ PyObject *guard;
+ PyObject *handlers;
+ PyObject *id;
+ PyObject *ifs;
+ PyObject *is_async;
+ PyObject *items;
+ PyObject *iter;
+ PyObject *key;
+ PyObject *keys;
+ PyObject *keyword_type;
+ PyObject *keywords;
+ PyObject *kind;
+ PyObject *kw_defaults;
+ PyObject *kwarg;
+ PyObject *kwd_attrs;
+ PyObject *kwd_patterns;
+ PyObject *kwonlyargs;
+ PyObject *left;
+ PyObject *level;
+ PyObject *lineno;
+ PyObject *lower;
+ PyObject *match_case_type;
+ PyObject *mod_type;
+ PyObject *module;
+ PyObject *msg;
+ PyObject *name;
+ PyObject *names;
+ PyObject *op;
+ PyObject *operand;
+ PyObject *operator_type;
+ PyObject *ops;
+ PyObject *optional_vars;
+ PyObject *orelse;
+ PyObject *pattern;
+ PyObject *pattern_type;
+ PyObject *patterns;
+ PyObject *posonlyargs;
+ PyObject *rest;
+ PyObject *returns;
+ PyObject *right;
+ PyObject *simple;
+ PyObject *slice;
+ PyObject *step;
+ PyObject *stmt_type;
+ PyObject *subject;
+ PyObject *tag;
+ PyObject *target;
+ PyObject *targets;
+ PyObject *test;
+ PyObject *type;
+ PyObject *type_comment;
+ PyObject *type_ignore_type;
+ PyObject *type_ignores;
+ PyObject *unaryop_type;
+ PyObject *upper;
+ PyObject *value;
+ PyObject *values;
+ PyObject *vararg;
+ PyObject *withitem_type;
+};
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* !Py_INTERNAL_AST_STATE_H */
+
diff --git a/contrib/tools/python3/src/Include/internal/pycore_atomic.h b/contrib/tools/python3/src/Include/internal/pycore_atomic.h
index 1d5c5621677..3d42e54464c 100644
--- a/contrib/tools/python3/src/Include/internal/pycore_atomic.h
+++ b/contrib/tools/python3/src/Include/internal/pycore_atomic.h
@@ -11,8 +11,8 @@ extern "C" {
#include "dynamic_annotations.h" /* _Py_ANNOTATE_MEMORY_ORDER */
#include "pyconfig.h"
-#if defined(HAVE_STD_ATOMIC)
-#include <stdatomic.h>
+#ifdef HAVE_STD_ATOMIC
+# include <stdatomic.h>
#endif
@@ -62,7 +62,7 @@ typedef struct _Py_atomic_int {
#define _Py_atomic_load_explicit(ATOMIC_VAL, ORDER) \
atomic_load_explicit(&((ATOMIC_VAL)->_value), ORDER)
-/* Use builtin atomic operations in GCC >= 4.7 */
+// Use builtin atomic operations in GCC >= 4.7 and clang
#elif defined(HAVE_BUILTIN_ATOMIC)
typedef enum _Py_memory_order {
diff --git a/contrib/tools/python3/src/Include/internal/pycore_atomic_funcs.h b/contrib/tools/python3/src/Include/internal/pycore_atomic_funcs.h
new file mode 100644
index 00000000000..a708789cea7
--- /dev/null
+++ b/contrib/tools/python3/src/Include/internal/pycore_atomic_funcs.h
@@ -0,0 +1,94 @@
+/* Atomic functions: similar to pycore_atomic.h, but don't need
+ to declare variables as atomic.
+
+ Py_ssize_t type:
+
+ * value = _Py_atomic_size_get(&var)
+ * _Py_atomic_size_set(&var, value)
+
+ Use sequentially-consistent ordering (__ATOMIC_SEQ_CST memory order):
+ enforce total ordering with all other atomic functions.
+*/
+#ifndef Py_ATOMIC_FUNC_H
+#define Py_ATOMIC_FUNC_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef Py_BUILD_CORE
+# error "this header requires Py_BUILD_CORE define"
+#endif
+
+#if defined(_MSC_VER)
+# include <intrin.h> // _InterlockedExchange()
+#endif
+
+
+// Use builtin atomic operations in GCC >= 4.7 and clang
+#ifdef HAVE_BUILTIN_ATOMIC
+
+static inline Py_ssize_t _Py_atomic_size_get(Py_ssize_t *var)
+{
+ return __atomic_load_n(var, __ATOMIC_SEQ_CST);
+}
+
+static inline void _Py_atomic_size_set(Py_ssize_t *var, Py_ssize_t value)
+{
+ __atomic_store_n(var, value, __ATOMIC_SEQ_CST);
+}
+
+#elif defined(_MSC_VER)
+
+static inline Py_ssize_t _Py_atomic_size_get(Py_ssize_t *var)
+{
+#if SIZEOF_VOID_P == 8
+ Py_BUILD_ASSERT(sizeof(__int64) == sizeof(*var));
+ volatile __int64 *volatile_var = (volatile __int64 *)var;
+ __int64 old;
+ do {
+ old = *volatile_var;
+ } while(_InterlockedCompareExchange64(volatile_var, old, old) != old);
+#else
+ Py_BUILD_ASSERT(sizeof(long) == sizeof(*var));
+ volatile long *volatile_var = (volatile long *)var;
+ long old;
+ do {
+ old = *volatile_var;
+ } while(_InterlockedCompareExchange(volatile_var, old, old) != old);
+#endif
+ return old;
+}
+
+static inline void _Py_atomic_size_set(Py_ssize_t *var, Py_ssize_t value)
+{
+#if SIZEOF_VOID_P == 8
+ Py_BUILD_ASSERT(sizeof(__int64) == sizeof(*var));
+ volatile __int64 *volatile_var = (volatile __int64 *)var;
+ _InterlockedExchange64(volatile_var, value);
+#else
+ Py_BUILD_ASSERT(sizeof(long) == sizeof(*var));
+ volatile long *volatile_var = (volatile long *)var;
+ _InterlockedExchange(volatile_var, value);
+#endif
+}
+
+#else
+// Fallback implementation using volatile
+
+static inline Py_ssize_t _Py_atomic_size_get(Py_ssize_t *var)
+{
+ volatile Py_ssize_t *volatile_var = (volatile Py_ssize_t *)var;
+ return *volatile_var;
+}
+
+static inline void _Py_atomic_size_set(Py_ssize_t *var, Py_ssize_t value)
+{
+ volatile Py_ssize_t *volatile_var = (volatile Py_ssize_t *)var;
+ *volatile_var = value;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* Py_ATOMIC_FUNC_H */
diff --git a/contrib/tools/python3/src/Include/internal/pycore_bitutils.h b/contrib/tools/python3/src/Include/internal/pycore_bitutils.h
new file mode 100644
index 00000000000..e4aa7a3d0d0
--- /dev/null
+++ b/contrib/tools/python3/src/Include/internal/pycore_bitutils.h
@@ -0,0 +1,176 @@
+/* Bit and bytes utilities.
+
+ Bytes swap functions, reverse order of bytes:
+
+ - _Py_bswap16(uint16_t)
+ - _Py_bswap32(uint32_t)
+ - _Py_bswap64(uint64_t)
+*/
+
+#ifndef Py_INTERNAL_BITUTILS_H
+#define Py_INTERNAL_BITUTILS_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef Py_BUILD_CORE
+# error "this header requires Py_BUILD_CORE define"
+#endif
+
+#if defined(__GNUC__) \
+ && ((__GNUC__ >= 5) || (__GNUC__ == 4) && (__GNUC_MINOR__ >= 8))
+ /* __builtin_bswap16() is available since GCC 4.8,
+ __builtin_bswap32() is available since GCC 4.3,
+ __builtin_bswap64() is available since GCC 4.3. */
+# define _PY_HAVE_BUILTIN_BSWAP
+#endif
+
+#ifdef _MSC_VER
+ /* Get _byteswap_ushort(), _byteswap_ulong(), _byteswap_uint64() */
+# include <intrin.h>
+#endif
+
+static inline uint16_t
+_Py_bswap16(uint16_t word)
+{
+#if defined(_PY_HAVE_BUILTIN_BSWAP) || _Py__has_builtin(__builtin_bswap16)
+ return __builtin_bswap16(word);
+#elif defined(_MSC_VER)
+ Py_BUILD_ASSERT(sizeof(word) == sizeof(unsigned short));
+ return _byteswap_ushort(word);
+#else
+ // Portable implementation which doesn't rely on circular bit shift
+ return ( ((word & UINT16_C(0x00FF)) << 8)
+ | ((word & UINT16_C(0xFF00)) >> 8));
+#endif
+}
+
+static inline uint32_t
+_Py_bswap32(uint32_t word)
+{
+#if defined(_PY_HAVE_BUILTIN_BSWAP) || _Py__has_builtin(__builtin_bswap32)
+ return __builtin_bswap32(word);
+#elif defined(_MSC_VER)
+ Py_BUILD_ASSERT(sizeof(word) == sizeof(unsigned long));
+ return _byteswap_ulong(word);
+#else
+ // Portable implementation which doesn't rely on circular bit shift
+ return ( ((word & UINT32_C(0x000000FF)) << 24)
+ | ((word & UINT32_C(0x0000FF00)) << 8)
+ | ((word & UINT32_C(0x00FF0000)) >> 8)
+ | ((word & UINT32_C(0xFF000000)) >> 24));
+#endif
+}
+
+static inline uint64_t
+_Py_bswap64(uint64_t word)
+{
+#if defined(_PY_HAVE_BUILTIN_BSWAP) || _Py__has_builtin(__builtin_bswap64)
+ return __builtin_bswap64(word);
+#elif defined(_MSC_VER)
+ return _byteswap_uint64(word);
+#else
+ // Portable implementation which doesn't rely on circular bit shift
+ return ( ((word & UINT64_C(0x00000000000000FF)) << 56)
+ | ((word & UINT64_C(0x000000000000FF00)) << 40)
+ | ((word & UINT64_C(0x0000000000FF0000)) << 24)
+ | ((word & UINT64_C(0x00000000FF000000)) << 8)
+ | ((word & UINT64_C(0x000000FF00000000)) >> 8)
+ | ((word & UINT64_C(0x0000FF0000000000)) >> 24)
+ | ((word & UINT64_C(0x00FF000000000000)) >> 40)
+ | ((word & UINT64_C(0xFF00000000000000)) >> 56));
+#endif
+}
+
+
+// Population count: count the number of 1's in 'x'
+// (number of bits set to 1), also known as the hamming weight.
+//
+// Implementation note. CPUID is not used, to test if x86 POPCNT instruction
+// can be used, to keep the implementation simple. For example, Visual Studio
+// __popcnt() is not used this reason. The clang and GCC builtin function can
+// use the x86 POPCNT instruction if the target architecture has SSE4a or
+// newer.
+static inline int
+_Py_popcount32(uint32_t x)
+{
+#if (defined(__clang__) || defined(__GNUC__))
+
+#if SIZEOF_INT >= 4
+ Py_BUILD_ASSERT(sizeof(x) <= sizeof(unsigned int));
+ return __builtin_popcount(x);
+#else
+ // The C standard guarantees that unsigned long will always be big enough
+ // to hold a uint32_t value without losing information.
+ Py_BUILD_ASSERT(sizeof(x) <= sizeof(unsigned long));
+ return __builtin_popcountl(x);
+#endif
+
+#else
+ // 32-bit SWAR (SIMD Within A Register) popcount
+
+ // Binary: 0 1 0 1 ...
+ const uint32_t M1 = 0x55555555;
+ // Binary: 00 11 00 11. ..
+ const uint32_t M2 = 0x33333333;
+ // Binary: 0000 1111 0000 1111 ...
+ const uint32_t M4 = 0x0F0F0F0F;
+ // 256**4 + 256**3 + 256**2 + 256**1
+ const uint32_t SUM = 0x01010101;
+
+ // Put count of each 2 bits into those 2 bits
+ x = x - ((x >> 1) & M1);
+ // Put count of each 4 bits into those 4 bits
+ x = (x & M2) + ((x >> 2) & M2);
+ // Put count of each 8 bits into those 8 bits
+ x = (x + (x >> 4)) & M4;
+ // Sum of the 4 byte counts
+ return (uint32_t)((uint64_t)x * (uint64_t)SUM) >> 24;
+#endif
+}
+
+
+// Return the index of the most significant 1 bit in 'x'. This is the smallest
+// integer k such that x < 2**k. Equivalent to floor(log2(x)) + 1 for x != 0.
+static inline int
+_Py_bit_length(unsigned long x)
+{
+#if (defined(__clang__) || defined(__GNUC__))
+ if (x != 0) {
+ // __builtin_clzl() is available since GCC 3.4.
+ // Undefined behavior for x == 0.
+ return (int)sizeof(unsigned long) * 8 - __builtin_clzl(x);
+ }
+ else {
+ return 0;
+ }
+#elif defined(_MSC_VER)
+ // _BitScanReverse() is documented to search 32 bits.
+ Py_BUILD_ASSERT(sizeof(unsigned long) <= 4);
+ unsigned long msb;
+ if (_BitScanReverse(&msb, x)) {
+ return (int)msb + 1;
+ }
+ else {
+ return 0;
+ }
+#else
+ const int BIT_LENGTH_TABLE[32] = {
+ 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5
+ };
+ int msb = 0;
+ while (x >= 32) {
+ msb += 6;
+ x >>= 6;
+ }
+ msb += BIT_LENGTH_TABLE[x];
+ return msb;
+#endif
+}
+
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* !Py_INTERNAL_BITUTILS_H */
diff --git a/contrib/tools/python3/src/Include/internal/pycore_blocks_output_buffer.h b/contrib/tools/python3/src/Include/internal/pycore_blocks_output_buffer.h
new file mode 100644
index 00000000000..28cf6fba4ee
--- /dev/null
+++ b/contrib/tools/python3/src/Include/internal/pycore_blocks_output_buffer.h
@@ -0,0 +1,317 @@
+/*
+ _BlocksOutputBuffer is used to maintain an output buffer
+ that has unpredictable size. Suitable for compression/decompression
+ API (bz2/lzma/zlib) that has stream->next_out and stream->avail_out:
+
+ stream->next_out: point to the next output position.
+ stream->avail_out: the number of available bytes left in the buffer.
+
+ It maintains a list of bytes object, so there is no overhead of resizing
+ the buffer.
+
+ Usage:
+
+ 1, Initialize the struct instance like this:
+ _BlocksOutputBuffer buffer = {.list = NULL};
+ Set .list to NULL for _BlocksOutputBuffer_OnError()
+
+ 2, Initialize the buffer use one of these functions:
+ _BlocksOutputBuffer_InitAndGrow()
+ _BlocksOutputBuffer_InitWithSize()
+
+ 3, If (avail_out == 0), grow the buffer:
+ _BlocksOutputBuffer_Grow()
+
+ 4, Get the current outputted data size:
+ _BlocksOutputBuffer_GetDataSize()
+
+ 5, Finish the buffer, and return a bytes object:
+ _BlocksOutputBuffer_Finish()
+
+ 6, Clean up the buffer when an error occurred:
+ _BlocksOutputBuffer_OnError()
+*/
+
+#ifndef Py_INTERNAL_BLOCKS_OUTPUT_BUFFER_H
+#define Py_INTERNAL_BLOCKS_OUTPUT_BUFFER_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "Python.h"
+
+typedef struct {
+ // List of bytes objects
+ PyObject *list;
+ // Number of whole allocated size
+ Py_ssize_t allocated;
+ // Max length of the buffer, negative number means unlimited length.
+ Py_ssize_t max_length;
+} _BlocksOutputBuffer;
+
+static const char unable_allocate_msg[] = "Unable to allocate output buffer.";
+
+/* In 32-bit build, the max block size should <= INT32_MAX. */
+#define OUTPUT_BUFFER_MAX_BLOCK_SIZE (256*1024*1024)
+
+/* Block size sequence */
+#define KB (1024)
+#define MB (1024*1024)
+static const Py_ssize_t BUFFER_BLOCK_SIZE[] =
+ { 32*KB, 64*KB, 256*KB, 1*MB, 4*MB, 8*MB, 16*MB, 16*MB,
+ 32*MB, 32*MB, 32*MB, 32*MB, 64*MB, 64*MB, 128*MB, 128*MB,
+ OUTPUT_BUFFER_MAX_BLOCK_SIZE };
+#undef KB
+#undef MB
+
+/* According to the block sizes defined by BUFFER_BLOCK_SIZE, the whole
+ allocated size growth step is:
+ 1 32 KB +32 KB
+ 2 96 KB +64 KB
+ 3 352 KB +256 KB
+ 4 1.34 MB +1 MB
+ 5 5.34 MB +4 MB
+ 6 13.34 MB +8 MB
+ 7 29.34 MB +16 MB
+ 8 45.34 MB +16 MB
+ 9 77.34 MB +32 MB
+ 10 109.34 MB +32 MB
+ 11 141.34 MB +32 MB
+ 12 173.34 MB +32 MB
+ 13 237.34 MB +64 MB
+ 14 301.34 MB +64 MB
+ 15 429.34 MB +128 MB
+ 16 557.34 MB +128 MB
+ 17 813.34 MB +256 MB
+ 18 1069.34 MB +256 MB
+ 19 1325.34 MB +256 MB
+ 20 1581.34 MB +256 MB
+ 21 1837.34 MB +256 MB
+ 22 2093.34 MB +256 MB
+ ...
+*/
+
+/* Initialize the buffer, and grow the buffer.
+
+ max_length: Max length of the buffer, -1 for unlimited length.
+
+ On success, return allocated size (>=0)
+ On failure, return -1
+*/
+static inline Py_ssize_t
+_BlocksOutputBuffer_InitAndGrow(_BlocksOutputBuffer *buffer,
+ const Py_ssize_t max_length,
+ void **next_out)
+{
+ PyObject *b;
+ Py_ssize_t block_size;
+
+ // ensure .list was set to NULL
+ assert(buffer->list == NULL);
+
+ // get block size
+ if (0 <= max_length && max_length < BUFFER_BLOCK_SIZE[0]) {
+ block_size = max_length;
+ } else {
+ block_size = BUFFER_BLOCK_SIZE[0];
+ }
+
+ // the first block
+ b = PyBytes_FromStringAndSize(NULL, block_size);
+ if (b == NULL) {
+ return -1;
+ }
+
+ // create the list
+ buffer->list = PyList_New(1);
+ if (buffer->list == NULL) {
+ Py_DECREF(b);
+ return -1;
+ }
+ PyList_SET_ITEM(buffer->list, 0, b);
+
+ // set variables
+ buffer->allocated = block_size;
+ buffer->max_length = max_length;
+
+ *next_out = PyBytes_AS_STRING(b);
+ return block_size;
+}
+
+/* Initialize the buffer, with an initial size.
+
+ Check block size limit in the outer wrapper function. For example, some libs
+ accept UINT32_MAX as the maximum block size, then init_size should <= it.
+
+ On success, return allocated size (>=0)
+ On failure, return -1
+*/
+static inline Py_ssize_t
+_BlocksOutputBuffer_InitWithSize(_BlocksOutputBuffer *buffer,
+ const Py_ssize_t init_size,
+ void **next_out)
+{
+ PyObject *b;
+
+ // ensure .list was set to NULL
+ assert(buffer->list == NULL);
+
+ // the first block
+ b = PyBytes_FromStringAndSize(NULL, init_size);
+ if (b == NULL) {
+ PyErr_SetString(PyExc_MemoryError, unable_allocate_msg);
+ return -1;
+ }
+
+ // create the list
+ buffer->list = PyList_New(1);
+ if (buffer->list == NULL) {
+ Py_DECREF(b);
+ return -1;
+ }
+ PyList_SET_ITEM(buffer->list, 0, b);
+
+ // set variables
+ buffer->allocated = init_size;
+ buffer->max_length = -1;
+
+ *next_out = PyBytes_AS_STRING(b);
+ return init_size;
+}
+
+/* Grow the buffer. The avail_out must be 0, please check it before calling.
+
+ On success, return allocated size (>=0)
+ On failure, return -1
+*/
+static inline Py_ssize_t
+_BlocksOutputBuffer_Grow(_BlocksOutputBuffer *buffer,
+ void **next_out,
+ const Py_ssize_t avail_out)
+{
+ PyObject *b;
+ const Py_ssize_t list_len = Py_SIZE(buffer->list);
+ Py_ssize_t block_size;
+
+ // ensure no gaps in the data
+ if (avail_out != 0) {
+ PyErr_SetString(PyExc_SystemError,
+ "avail_out is non-zero in _BlocksOutputBuffer_Grow().");
+ return -1;
+ }
+
+ // get block size
+ if (list_len < (Py_ssize_t) Py_ARRAY_LENGTH(BUFFER_BLOCK_SIZE)) {
+ block_size = BUFFER_BLOCK_SIZE[list_len];
+ } else {
+ block_size = BUFFER_BLOCK_SIZE[Py_ARRAY_LENGTH(BUFFER_BLOCK_SIZE) - 1];
+ }
+
+ // check max_length
+ if (buffer->max_length >= 0) {
+ // if (rest == 0), should not grow the buffer.
+ Py_ssize_t rest = buffer->max_length - buffer->allocated;
+ assert(rest > 0);
+
+ // block_size of the last block
+ if (block_size > rest) {
+ block_size = rest;
+ }
+ }
+
+ // check buffer->allocated overflow
+ if (block_size > PY_SSIZE_T_MAX - buffer->allocated) {
+ PyErr_SetString(PyExc_MemoryError, unable_allocate_msg);
+ return -1;
+ }
+
+ // create the block
+ b = PyBytes_FromStringAndSize(NULL, block_size);
+ if (b == NULL) {
+ PyErr_SetString(PyExc_MemoryError, unable_allocate_msg);
+ return -1;
+ }
+ if (PyList_Append(buffer->list, b) < 0) {
+ Py_DECREF(b);
+ return -1;
+ }
+ Py_DECREF(b);
+
+ // set variables
+ buffer->allocated += block_size;
+
+ *next_out = PyBytes_AS_STRING(b);
+ return block_size;
+}
+
+/* Return the current outputted data size. */
+static inline Py_ssize_t
+_BlocksOutputBuffer_GetDataSize(_BlocksOutputBuffer *buffer,
+ const Py_ssize_t avail_out)
+{
+ return buffer->allocated - avail_out;
+}
+
+/* Finish the buffer.
+
+ Return a bytes object on success
+ Return NULL on failure
+*/
+static inline PyObject *
+_BlocksOutputBuffer_Finish(_BlocksOutputBuffer *buffer,
+ const Py_ssize_t avail_out)
+{
+ PyObject *result, *block;
+ const Py_ssize_t list_len = Py_SIZE(buffer->list);
+
+ // fast path for single block
+ if ((list_len == 1 && avail_out == 0) ||
+ (list_len == 2 && Py_SIZE(PyList_GET_ITEM(buffer->list, 1)) == avail_out))
+ {
+ block = PyList_GET_ITEM(buffer->list, 0);
+ Py_INCREF(block);
+
+ Py_CLEAR(buffer->list);
+ return block;
+ }
+
+ // final bytes object
+ result = PyBytes_FromStringAndSize(NULL, buffer->allocated - avail_out);
+ if (result == NULL) {
+ PyErr_SetString(PyExc_MemoryError, unable_allocate_msg);
+ return NULL;
+ }
+
+ // memory copy
+ if (list_len > 0) {
+ char *posi = PyBytes_AS_STRING(result);
+
+ // blocks except the last one
+ Py_ssize_t i = 0;
+ for (; i < list_len-1; i++) {
+ block = PyList_GET_ITEM(buffer->list, i);
+ memcpy(posi, PyBytes_AS_STRING(block), Py_SIZE(block));
+ posi += Py_SIZE(block);
+ }
+ // the last block
+ block = PyList_GET_ITEM(buffer->list, i);
+ memcpy(posi, PyBytes_AS_STRING(block), Py_SIZE(block) - avail_out);
+ } else {
+ assert(Py_SIZE(result) == 0);
+ }
+
+ Py_CLEAR(buffer->list);
+ return result;
+}
+
+/* Clean up the buffer when an error occurred. */
+static inline void
+_BlocksOutputBuffer_OnError(_BlocksOutputBuffer *buffer)
+{
+ Py_CLEAR(buffer->list);
+}
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* Py_INTERNAL_BLOCKS_OUTPUT_BUFFER_H */ \ No newline at end of file
diff --git a/contrib/tools/python3/src/Include/internal/pycore_byteswap.h b/contrib/tools/python3/src/Include/internal/pycore_byteswap.h
deleted file mode 100644
index 2b20fc6c7d3..00000000000
--- a/contrib/tools/python3/src/Include/internal/pycore_byteswap.h
+++ /dev/null
@@ -1,88 +0,0 @@
-/* Bytes swap functions, reverse order of bytes:
-
- - _Py_bswap16(uint16_t)
- - _Py_bswap32(uint32_t)
- - _Py_bswap64(uint64_t)
-*/
-
-#ifndef Py_INTERNAL_BSWAP_H
-#define Py_INTERNAL_BSWAP_H
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#ifndef Py_BUILD_CORE
-# error "this header requires Py_BUILD_CORE define"
-#endif
-
-#if defined(__GNUC__) \
- && ((__GNUC__ >= 5) || (__GNUC__ == 4) && (__GNUC_MINOR__ >= 8))
- /* __builtin_bswap16() is available since GCC 4.8,
- __builtin_bswap32() is available since GCC 4.3,
- __builtin_bswap64() is available since GCC 4.3. */
-# define _PY_HAVE_BUILTIN_BSWAP
-#endif
-
-#ifdef _MSC_VER
- /* Get _byteswap_ushort(), _byteswap_ulong(), _byteswap_uint64() */
-# include <intrin.h>
-#endif
-
-static inline uint16_t
-_Py_bswap16(uint16_t word)
-{
-#if defined(_PY_HAVE_BUILTIN_BSWAP) || _Py__has_builtin(__builtin_bswap16)
- return __builtin_bswap16(word);
-#elif defined(_MSC_VER)
- Py_BUILD_ASSERT(sizeof(word) == sizeof(unsigned short));
- return _byteswap_ushort(word);
-#else
- // Portable implementation which doesn't rely on circular bit shift
- return ( ((word & UINT16_C(0x00FF)) << 8)
- | ((word & UINT16_C(0xFF00)) >> 8));
-#endif
-}
-
-static inline uint32_t
-_Py_bswap32(uint32_t word)
-{
-#if defined(_PY_HAVE_BUILTIN_BSWAP) || _Py__has_builtin(__builtin_bswap32)
- return __builtin_bswap32(word);
-#elif defined(_MSC_VER)
- Py_BUILD_ASSERT(sizeof(word) == sizeof(unsigned long));
- return _byteswap_ulong(word);
-#else
- // Portable implementation which doesn't rely on circular bit shift
- return ( ((word & UINT32_C(0x000000FF)) << 24)
- | ((word & UINT32_C(0x0000FF00)) << 8)
- | ((word & UINT32_C(0x00FF0000)) >> 8)
- | ((word & UINT32_C(0xFF000000)) >> 24));
-#endif
-}
-
-static inline uint64_t
-_Py_bswap64(uint64_t word)
-{
-#if defined(_PY_HAVE_BUILTIN_BSWAP) || _Py__has_builtin(__builtin_bswap64)
- return __builtin_bswap64(word);
-#elif defined(_MSC_VER)
- return _byteswap_uint64(word);
-#else
- // Portable implementation which doesn't rely on circular bit shift
- return ( ((word & UINT64_C(0x00000000000000FF)) << 56)
- | ((word & UINT64_C(0x000000000000FF00)) << 40)
- | ((word & UINT64_C(0x0000000000FF0000)) << 24)
- | ((word & UINT64_C(0x00000000FF000000)) << 8)
- | ((word & UINT64_C(0x000000FF00000000)) >> 8)
- | ((word & UINT64_C(0x0000FF0000000000)) >> 24)
- | ((word & UINT64_C(0x00FF000000000000)) >> 40)
- | ((word & UINT64_C(0xFF00000000000000)) >> 56));
-#endif
-}
-
-
-#ifdef __cplusplus
-}
-#endif
-#endif /* !Py_INTERNAL_BSWAP_H */
-
diff --git a/contrib/tools/python3/src/Include/internal/pycore_ceval.h b/contrib/tools/python3/src/Include/internal/pycore_ceval.h
index e7ace9bd01c..f573c3e5086 100644
--- a/contrib/tools/python3/src/Include/internal/pycore_ceval.h
+++ b/contrib/tools/python3/src/Include/internal/pycore_ceval.h
@@ -23,43 +23,49 @@ PyAPI_FUNC(int) _PyEval_AddPendingCall(
PyInterpreterState *interp,
int (*func)(void *),
void *arg);
-PyAPI_FUNC(void) _PyEval_SignalAsyncExc(PyThreadState *tstate);
+PyAPI_FUNC(void) _PyEval_SignalAsyncExc(PyInterpreterState *interp);
#ifdef HAVE_FORK
-extern void _PyEval_ReInitThreads(struct pyruntimestate *runtime);
+extern PyStatus _PyEval_ReInitThreads(PyThreadState *tstate);
#endif
PyAPI_FUNC(void) _PyEval_SetCoroutineOriginTrackingDepth(
PyThreadState *tstate,
int new_depth);
-/* Private function */
void _PyEval_Fini(void);
+
+extern PyObject* _PyEval_GetBuiltins(PyThreadState *tstate);
+extern PyObject *_PyEval_BuiltinsFromGlobals(
+ PyThreadState *tstate,
+ PyObject *globals);
+
+
static inline PyObject*
_PyEval_EvalFrame(PyThreadState *tstate, PyFrameObject *f, int throwflag)
{
return tstate->interp->eval_frame(tstate, f, throwflag);
}
-extern PyObject *_PyEval_EvalCode(
- PyThreadState *tstate,
- PyObject *_co, PyObject *globals, PyObject *locals,
- PyObject *const *args, Py_ssize_t argcount,
- PyObject *const *kwnames, PyObject *const *kwargs,
- Py_ssize_t kwcount, int kwstep,
- PyObject *const *defs, Py_ssize_t defcount,
- PyObject *kwdefs, PyObject *closure,
- PyObject *name, PyObject *qualname);
+extern PyObject *
+_PyEval_Vector(PyThreadState *tstate,
+ PyFrameConstructor *desc, PyObject *locals,
+ PyObject* const* args, size_t argcount,
+ PyObject *kwnames);
+#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
+extern int _PyEval_ThreadsInitialized(PyInterpreterState *interp);
+#else
extern int _PyEval_ThreadsInitialized(struct pyruntimestate *runtime);
+#endif
extern PyStatus _PyEval_InitGIL(PyThreadState *tstate);
-extern void _PyEval_FiniGIL(PyThreadState *tstate);
+extern void _PyEval_FiniGIL(PyInterpreterState *interp);
extern void _PyEval_ReleaseLock(PyThreadState *tstate);
+extern void _PyEval_DeactivateOpCache(void);
-/* --- _Py_EnterRecursiveCall() ----------------------------------------- */
-PyAPI_DATA(int) _Py_CheckRecursionLimit;
+/* --- _Py_EnterRecursiveCall() ----------------------------------------- */
#ifdef USE_STACKCHECK
/* With USE_STACKCHECK macro defined, trigger stack checks in
diff --git a/contrib/tools/python3/src/Include/internal/pycore_code.h b/contrib/tools/python3/src/Include/internal/pycore_code.h
index a1bd6a0bc0f..8ff1863dc00 100644
--- a/contrib/tools/python3/src/Include/internal/pycore_code.h
+++ b/contrib/tools/python3/src/Include/internal/pycore_code.h
@@ -10,9 +10,16 @@ typedef struct {
uint64_t builtins_ver; /* ma_version of builtin dict */
} _PyOpcache_LoadGlobal;
+typedef struct {
+ PyTypeObject *type;
+ Py_ssize_t hint;
+ unsigned int tp_version_tag;
+} _PyOpCodeOpt_LoadAttr;
+
struct _PyOpcache {
union {
_PyOpcache_LoadGlobal lg;
+ _PyOpCodeOpt_LoadAttr la;
} u;
char optimized;
};
diff --git a/contrib/tools/python3/src/Include/internal/pycore_compile.h b/contrib/tools/python3/src/Include/internal/pycore_compile.h
new file mode 100644
index 00000000000..06a6082cdda
--- /dev/null
+++ b/contrib/tools/python3/src/Include/internal/pycore_compile.h
@@ -0,0 +1,44 @@
+#ifndef Py_INTERNAL_COMPILE_H
+#define Py_INTERNAL_COMPILE_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef Py_BUILD_CORE
+# error "this header requires Py_BUILD_CORE define"
+#endif
+
+struct _arena; // Type defined in pycore_pyarena.h
+struct _mod; // Type defined in pycore_ast.h
+
+// Export the symbol for test_peg_generator (built as a library)
+PyAPI_FUNC(PyCodeObject*) _PyAST_Compile(
+ struct _mod *mod,
+ PyObject *filename,
+ PyCompilerFlags *flags,
+ int optimize,
+ struct _arena *arena);
+extern PyFutureFeatures* _PyFuture_FromAST(
+ struct _mod * mod,
+ PyObject *filename
+ );
+
+extern PyObject* _Py_Mangle(PyObject *p, PyObject *name);
+
+typedef struct {
+ int optimize;
+ int ff_features;
+
+ int recursion_depth; /* current recursion depth */
+ int recursion_limit; /* recursion limit */
+} _PyASTOptimizeState;
+
+extern int _PyAST_Optimize(
+ struct _mod *,
+ struct _arena *arena,
+ _PyASTOptimizeState *state);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* !Py_INTERNAL_COMPILE_H */
diff --git a/contrib/tools/python3/src/Include/internal/pycore_context.h b/contrib/tools/python3/src/Include/internal/pycore_context.h
index f665ad5c115..a482dd42122 100644
--- a/contrib/tools/python3/src/Include/internal/pycore_context.h
+++ b/contrib/tools/python3/src/Include/internal/pycore_context.h
@@ -37,6 +37,6 @@ struct _pycontexttokenobject {
int _PyContext_Init(void);
-void _PyContext_Fini(void);
+void _PyContext_Fini(PyInterpreterState *interp);
#endif /* !Py_INTERNAL_CONTEXT_H */
diff --git a/contrib/tools/python3/src/Include/internal/pycore_fileutils.h b/contrib/tools/python3/src/Include/internal/pycore_fileutils.h
index 8cf137bb4bd..c1c9244a1bc 100644
--- a/contrib/tools/python3/src/Include/internal/pycore_fileutils.h
+++ b/contrib/tools/python3/src/Include/internal/pycore_fileutils.h
@@ -48,6 +48,11 @@ PyAPI_FUNC(int) _Py_GetLocaleconvNumeric(
PyObject **decimal_point,
PyObject **thousands_sep);
+PyAPI_FUNC(void) _Py_closerange(int first, int last);
+
+PyAPI_FUNC(wchar_t*) _Py_GetLocaleEncoding(void);
+PyAPI_FUNC(PyObject*) _Py_GetLocaleEncodingObject(void);
+
#ifdef HAVE_NON_UNICODE_WCHAR_T_REPRESENTATION
extern int _Py_LocaleUsesNonUnicodeWchar(void);
diff --git a/contrib/tools/python3/src/Include/internal/pycore_format.h b/contrib/tools/python3/src/Include/internal/pycore_format.h
new file mode 100644
index 00000000000..1b8d57539ca
--- /dev/null
+++ b/contrib/tools/python3/src/Include/internal/pycore_format.h
@@ -0,0 +1,27 @@
+#ifndef Py_INTERNAL_FORMAT_H
+#define Py_INTERNAL_FORMAT_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef Py_BUILD_CORE
+# error "this header requires Py_BUILD_CORE define"
+#endif
+
+/* Format codes
+ * F_LJUST '-'
+ * F_SIGN '+'
+ * F_BLANK ' '
+ * F_ALT '#'
+ * F_ZERO '0'
+ */
+#define F_LJUST (1<<0)
+#define F_SIGN (1<<1)
+#define F_BLANK (1<<2)
+#define F_ALT (1<<3)
+#define F_ZERO (1<<4)
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* !Py_INTERNAL_FORMAT_H */
diff --git a/contrib/tools/python3/src/Include/internal/pycore_gc.h b/contrib/tools/python3/src/Include/internal/pycore_gc.h
index 0511eea779a..9db4a4716fa 100644
--- a/contrib/tools/python3/src/Include/internal/pycore_gc.h
+++ b/contrib/tools/python3/src/Include/internal/pycore_gc.h
@@ -161,17 +161,19 @@ struct _gc_runtime_state {
Py_ssize_t long_lived_pending;
};
-PyAPI_FUNC(void) _PyGC_InitState(struct _gc_runtime_state *);
+extern void _PyGC_InitState(struct _gc_runtime_state *);
+
+extern Py_ssize_t _PyGC_CollectNoFail(PyThreadState *tstate);
// Functions to clear types free lists
-extern void _PyFrame_ClearFreeList(void);
-extern void _PyTuple_ClearFreeList(void);
-extern void _PyFloat_ClearFreeList(void);
-extern void _PyList_ClearFreeList(void);
-extern void _PyDict_ClearFreeList(void);
-extern void _PyAsyncGen_ClearFreeLists(void);
-extern void _PyContext_ClearFreeList(void);
+extern void _PyFrame_ClearFreeList(PyInterpreterState *interp);
+extern void _PyTuple_ClearFreeList(PyInterpreterState *interp);
+extern void _PyFloat_ClearFreeList(PyInterpreterState *interp);
+extern void _PyList_ClearFreeList(PyInterpreterState *interp);
+extern void _PyDict_ClearFreeList(PyInterpreterState *interp);
+extern void _PyAsyncGen_ClearFreeLists(PyInterpreterState *interp);
+extern void _PyContext_ClearFreeList(PyInterpreterState *interp);
#ifdef __cplusplus
}
diff --git a/contrib/tools/python3/src/Include/internal/pycore_import.h b/contrib/tools/python3/src/Include/internal/pycore_import.h
index b011ea44251..e21ed0a7a06 100644
--- a/contrib/tools/python3/src/Include/internal/pycore_import.h
+++ b/contrib/tools/python3/src/Include/internal/pycore_import.h
@@ -5,15 +5,10 @@
extern "C" {
#endif
-PyAPI_FUNC(PyObject *) _PyImport_FindBuiltin(
- PyThreadState *tstate,
- const char *name /* UTF-8 encoded string */
- );
-
#ifdef HAVE_FORK
-extern void _PyImport_ReInitLock(void);
+extern PyStatus _PyImport_ReInitLock(void);
#endif
-extern void _PyImport_Cleanup(PyThreadState *tstate);
+extern PyObject* _PyImport_BootstrapImp(PyThreadState *tstate);
#ifdef __cplusplus
}
diff --git a/contrib/tools/python3/src/Include/internal/pycore_initconfig.h b/contrib/tools/python3/src/Include/internal/pycore_initconfig.h
index 457a005860b..4b009e816b4 100644
--- a/contrib/tools/python3/src/Include/internal/pycore_initconfig.h
+++ b/contrib/tools/python3/src/Include/internal/pycore_initconfig.h
@@ -44,6 +44,8 @@ struct pyruntimestate;
#define _PyStatus_UPDATE_FUNC(err) \
do { err.func = _PyStatus_GET_FUNC(); } while (0)
+PyObject* _PyErr_SetFromPyStatus(PyStatus status);
+
/* --- PyWideStringList ------------------------------------------------ */
#define _PyWideStringList_INIT (PyWideStringList){.length = 0, .items = NULL}
@@ -100,6 +102,7 @@ typedef struct {
int isolated; /* -I option */
int use_environment; /* -E option */
int dev_mode; /* -X dev and PYTHONDEVMODE */
+ int warn_default_encoding; /* -X warn_default_encoding and PYTHONWARNDEFAULTENCODING */
} _PyPreCmdline;
#define _PyPreCmdline_INIT \
@@ -149,13 +152,19 @@ PyAPI_FUNC(void) _PyConfig_InitCompatConfig(PyConfig *config);
extern PyStatus _PyConfig_Copy(
PyConfig *config,
const PyConfig *config2);
-extern PyStatus _PyConfig_InitPathConfig(PyConfig *config);
+extern PyStatus _PyConfig_InitPathConfig(
+ PyConfig *config,
+ int compute_path_config);
+extern PyStatus _PyConfig_Read(PyConfig *config, int compute_path_config);
extern PyStatus _PyConfig_Write(const PyConfig *config,
struct pyruntimestate *runtime);
extern PyStatus _PyConfig_SetPyArgv(
PyConfig *config,
const _PyArgv *args);
+PyAPI_FUNC(PyObject*) _PyConfig_AsDict(const PyConfig *config);
+PyAPI_FUNC(int) _PyConfig_FromDict(PyConfig *config, PyObject *dict);
+
/* --- Function used for testing ---------------------------------- */
diff --git a/contrib/tools/python3/src/Include/internal/pycore_interp.h b/contrib/tools/python3/src/Include/internal/pycore_interp.h
index 551ad833bb6..4307b61ca36 100644
--- a/contrib/tools/python3/src/Include/internal/pycore_interp.h
+++ b/contrib/tools/python3/src/Include/internal/pycore_interp.h
@@ -8,12 +8,11 @@ extern "C" {
# error "this header requires Py_BUILD_CORE define"
#endif
-#include "pycore_atomic.h" /* _Py_atomic_address */
-#include "pycore_gil.h" /* struct _gil_runtime_state */
-#include "pycore_gc.h" /* struct _gc_runtime_state */
-#include "pycore_warnings.h" /* struct _warnings_runtime_state */
-
-/* ceval state */
+#include "pycore_atomic.h" // _Py_atomic_address
+#include "pycore_ast_state.h" // struct ast_state
+#include "pycore_gil.h" // struct _gil_runtime_state
+#include "pycore_gc.h" // struct _gc_runtime_state
+#include "pycore_warnings.h" // struct _warnings_runtime_state
struct _pending_calls {
PyThread_type_lock lock;
@@ -34,18 +33,15 @@ struct _pending_calls {
struct _ceval_state {
int recursion_limit;
- /* Records whether tracing is on for any thread. Counts the number
- of threads for which tstate->c_tracefunc is non-NULL, so if the
- value is 0, we know we don't have to check this thread's
- c_tracefunc. This speeds up the if statement in
- _PyEval_EvalFrameDefault() after fast_next_opcode. */
- int tracing_possible;
/* This single variable consolidates all requests to break out of
the fast path in the eval loop. */
_Py_atomic_int eval_breaker;
/* Request for dropping the GIL */
_Py_atomic_int gil_drop_request;
struct _pending_calls pending;
+#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
+ struct _gil_runtime_state gil;
+#endif
};
/* fs_codec.encoding is initialized to NULL.
@@ -57,8 +53,150 @@ struct _Py_unicode_fs_codec {
_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 {
+ // The empty Unicode object is a singleton to improve performance.
+ PyObject *empty_string;
+ /* Single character Unicode strings in the Latin-1 range are being
+ shared as well. */
+ PyObject *latin1[256];
struct _Py_unicode_fs_codec fs_codec;
+
+ // Unused member kept for ABI backward compatibility with Python 3.10.0:
+ // see bpo-46006.
+ PyObject *unused_interned;
+
+ // Unicode identifiers (_Py_Identifier): see _PyUnicode_FromId()
+ struct _Py_unicode_ids ids;
+};
+
+struct _Py_float_state {
+ /* Special free list
+ free_list is a singly-linked list of available PyFloatObjects,
+ linked via abuse of their ob_type members. */
+ int numfree;
+ PyFloatObject *free_list;
+};
+
+/* Speed optimization to avoid frequent malloc/free of small tuples */
+#ifndef PyTuple_MAXSAVESIZE
+ // Largest tuple to save on free list
+# define PyTuple_MAXSAVESIZE 20
+#endif
+#ifndef PyTuple_MAXFREELIST
+ // Maximum number of tuples of each size to save
+# define PyTuple_MAXFREELIST 2000
+#endif
+
+struct _Py_tuple_state {
+#if PyTuple_MAXSAVESIZE > 0
+ /* Entries 1 up to PyTuple_MAXSAVESIZE are free lists,
+ entry 0 is the empty tuple () of which at most one instance
+ will be allocated. */
+ PyTupleObject *free_list[PyTuple_MAXSAVESIZE];
+ int numfree[PyTuple_MAXSAVESIZE];
+#endif
+};
+
+/* Empty list reuse scheme to save calls to malloc and free */
+#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 {
+ /* Dictionary reuse scheme to save calls to malloc and free */
+ PyDictObject *free_list[PyDict_MAXFREELIST];
+ int numfree;
+ PyDictKeysObject *keys_free_list[PyDict_MAXFREELIST];
+ int keys_numfree;
+};
+
+struct _Py_frame_state {
+ PyFrameObject *free_list;
+ /* number of frames currently in free_list */
+ int numfree;
+};
+
+#ifndef _PyAsyncGen_MAXFREELIST
+# define _PyAsyncGen_MAXFREELIST 80
+#endif
+
+struct _Py_async_gen_state {
+ /* Freelists boost performance 6-10%; they also reduce memory
+ fragmentation, as _PyAsyncGenWrappedValue and PyAsyncGenASend
+ are short-living objects that are instantiated for every
+ __anext__() call. */
+ struct _PyAsyncGenWrappedValue* value_freelist[_PyAsyncGen_MAXFREELIST];
+ int value_numfree;
+
+ struct PyAsyncGenASend* asend_freelist[_PyAsyncGen_MAXFREELIST];
+ int asend_numfree;
+};
+
+struct _Py_context_state {
+ // List of free PyContext objects
+ PyContext *freelist;
+ int numfree;
+};
+
+struct _Py_exc_state {
+ // The dict mapping from errno codes to OSError subclasses
+ PyObject *errnomap;
+ PyBaseExceptionObject *memerrors_freelist;
+ int memerrors_numfree;
+};
+
+
+// atexit state
+typedef struct {
+ PyObject *func;
+ PyObject *args;
+ PyObject *kwargs;
+} atexit_callback;
+
+struct atexit_state {
+ atexit_callback **callbacks;
+ int ncallbacks;
+ int callback_len;
+};
+
+
+// Type attribute lookup cache: speed up attribute and method lookups,
+// see _PyType_Lookup().
+struct type_cache_entry {
+ unsigned int version; // initialized from type->tp_version_tag
+ PyObject *name; // reference to exactly a str or None
+ PyObject *value; // borrowed reference or NULL
+};
+
+#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
};
@@ -67,6 +205,11 @@ struct _Py_unicode_state {
#define _PY_NSMALLPOSINTS 257
#define _PY_NSMALLNEGINTS 5
+// _PyLong_GetZero() and _PyLong_GetOne() must always be available
+#if _PY_NSMALLPOSINTS < 2
+# error "_PY_NSMALLPOSINTS must be greater than 1"
+#endif
+
// The PyInterpreterState typedef is in Include/pystate.h.
struct _is {
@@ -88,10 +231,14 @@ struct _is {
struct _ceval_state ceval;
struct _gc_runtime_state gc;
+ // sys.modules dictionary
PyObject *modules;
PyObject *modules_by_index;
+ // Dictionary of the sys module
PyObject *sysdict;
+ // Dictionary of the builtins module
PyObject *builtins;
+ // importlib module
PyObject *importlib;
/* Used in Modules/_threadmodule.c. */
@@ -107,8 +254,6 @@ struct _is {
PyObject *codec_error_registry;
int codecs_initialized;
- struct _Py_unicode_state unicode;
-
PyConfig config;
#ifdef HAVE_DLOPEN
int dlopenflags;
@@ -118,7 +263,7 @@ struct _is {
PyObject *builtins_copy;
PyObject *import_func;
- /* Initialized to PyEval_EvalFrameDefault(). */
+ // Initialized to _PyEval_EvalFrameDefault().
_PyFrameEvalFunction eval_frame;
Py_ssize_t co_extra_user_count;
@@ -129,40 +274,41 @@ struct _is {
PyObject *after_forkers_parent;
PyObject *after_forkers_child;
#endif
- /* AtExit module */
- void (*pyexitfunc)(PyObject *);
- PyObject *pyexitmodule;
uint64_t tstate_next_unique_id;
struct _warnings_runtime_state warnings;
+ struct atexit_state atexit;
PyObject *audit_hooks;
- struct {
- struct {
- int level;
- int atbol;
- } listnode;
- } parser;
-
-#if _PY_NSMALLNEGINTS + _PY_NSMALLPOSINTS > 0
/* Small integers are preallocated in this array so that they
can be shared.
The integers that are preallocated are those in the range
-_PY_NSMALLNEGINTS (inclusive) to _PY_NSMALLPOSINTS (not inclusive).
*/
PyLongObject* small_ints[_PY_NSMALLNEGINTS + _PY_NSMALLPOSINTS];
-#endif
-};
+ struct _Py_bytes_state bytes;
+ struct _Py_unicode_state unicode;
+ struct _Py_float_state float_state;
+ /* Using a cache is very effective since typically only a single slice is
+ created and then deleted again. */
+ PySliceObject *slice_cache;
-/* Used by _PyImport_Cleanup() */
-extern void _PyInterpreterState_ClearModules(PyInterpreterState *interp);
+ 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;
-extern PyStatus _PyInterpreterState_SetConfig(
- PyInterpreterState *interp,
- const PyConfig *config);
+ struct ast_state ast;
+ struct type_cache type_cache;
+};
+extern void _PyInterpreterState_ClearModules(PyInterpreterState *interp);
+extern void _PyInterpreterState_Clear(PyThreadState *tstate);
/* cross-interpreter data registry */
@@ -182,11 +328,10 @@ struct _xidregitem {
PyAPI_FUNC(struct _is*) _PyInterpreterState_LookUpID(int64_t);
PyAPI_FUNC(int) _PyInterpreterState_IDInitref(struct _is *);
-PyAPI_FUNC(void) _PyInterpreterState_IDIncref(struct _is *);
+PyAPI_FUNC(int) _PyInterpreterState_IDIncref(struct _is *);
PyAPI_FUNC(void) _PyInterpreterState_IDDecref(struct _is *);
#ifdef __cplusplus
}
#endif
#endif /* !Py_INTERNAL_INTERP_H */
-
diff --git a/contrib/tools/python3/src/Include/internal/pycore_list.h b/contrib/tools/python3/src/Include/internal/pycore_list.h
new file mode 100644
index 00000000000..f18fb052c49
--- /dev/null
+++ b/contrib/tools/python3/src/Include/internal/pycore_list.h
@@ -0,0 +1,20 @@
+#ifndef Py_INTERNAL_LIST_H
+#define Py_INTERNAL_LIST_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef Py_BUILD_CORE
+# error "this header requires Py_BUILD_CORE define"
+#endif
+
+#include "listobject.h" // _PyList_CAST()
+
+
+#define _PyList_ITEMS(op) (_PyList_CAST(op)->ob_item)
+
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* !Py_INTERNAL_LIST_H */
diff --git a/contrib/tools/python3/src/Include/internal/pycore_long.h b/contrib/tools/python3/src/Include/internal/pycore_long.h
new file mode 100644
index 00000000000..2bea3a55ec8
--- /dev/null
+++ b/contrib/tools/python3/src/Include/internal/pycore_long.h
@@ -0,0 +1,40 @@
+#ifndef Py_INTERNAL_LONG_H
+#define Py_INTERNAL_LONG_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef Py_BUILD_CORE
+# error "this header requires Py_BUILD_CORE define"
+#endif
+
+#include "pycore_interp.h" // PyInterpreterState.small_ints
+#include "pycore_pystate.h" // _PyThreadState_GET()
+
+// Don't call this function but _PyLong_GetZero() and _PyLong_GetOne()
+static inline PyObject* __PyLong_GetSmallInt_internal(int value)
+{
+ PyInterpreterState *interp = _PyInterpreterState_GET();
+ assert(-_PY_NSMALLNEGINTS <= value && value < _PY_NSMALLPOSINTS);
+ size_t index = _PY_NSMALLNEGINTS + value;
+ PyObject *obj = (PyObject*)interp->small_ints[index];
+ // _PyLong_GetZero(), _PyLong_GetOne() and get_small_int() must not be
+ // called before _PyLong_Init() nor after _PyLong_Fini().
+ assert(obj != NULL);
+ return obj;
+}
+
+// Return a borrowed reference to the zero singleton.
+// The function cannot return NULL.
+static inline PyObject* _PyLong_GetZero(void)
+{ return __PyLong_GetSmallInt_internal(0); }
+
+// Return a borrowed reference to the one singleton.
+// The function cannot return NULL.
+static inline PyObject* _PyLong_GetOne(void)
+{ return __PyLong_GetSmallInt_internal(1); }
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* !Py_INTERNAL_LONG_H */
diff --git a/contrib/tools/python3/src/Include/internal/pycore_moduleobject.h b/contrib/tools/python3/src/Include/internal/pycore_moduleobject.h
new file mode 100644
index 00000000000..e9978abd25b
--- /dev/null
+++ b/contrib/tools/python3/src/Include/internal/pycore_moduleobject.h
@@ -0,0 +1,42 @@
+#ifndef Py_INTERNAL_MODULEOBJECT_H
+#define Py_INTERNAL_MODULEOBJECT_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef Py_BUILD_CORE
+# error "this header requires Py_BUILD_CORE define"
+#endif
+
+typedef struct {
+ PyObject_HEAD
+ PyObject *md_dict;
+ struct PyModuleDef *md_def;
+ void *md_state;
+ PyObject *md_weaklist;
+ // for logging purposes after md_dict is cleared
+ PyObject *md_name;
+} PyModuleObject;
+
+static inline PyModuleDef* _PyModule_GetDef(PyObject *mod) {
+ assert(PyModule_Check(mod));
+ return ((PyModuleObject *)mod)->md_def;
+}
+
+static inline void* _PyModule_GetState(PyObject* mod) {
+ assert(PyModule_Check(mod));
+ return ((PyModuleObject *)mod)->md_state;
+}
+
+static inline PyObject* _PyModule_GetDict(PyObject *mod) {
+ assert(PyModule_Check(mod));
+ PyObject *dict = ((PyModuleObject *)mod) -> md_dict;
+ // _PyModule_GetDict(mod) must not be used after calling module_clear(mod)
+ assert(dict != NULL);
+ return dict;
+}
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* !Py_INTERNAL_MODULEOBJECT_H */
diff --git a/contrib/tools/python3/src/Include/internal/pycore_object.h b/contrib/tools/python3/src/Include/internal/pycore_object.h
index c66ff12d7ec..90d98134b89 100644
--- a/contrib/tools/python3/src/Include/internal/pycore_object.h
+++ b/contrib/tools/python3/src/Include/internal/pycore_object.h
@@ -8,18 +8,59 @@ extern "C" {
# error "this header requires Py_BUILD_CORE define"
#endif
-#include "pycore_gc.h" // _PyObject_GC_IS_TRACKED()
-#include "pycore_interp.h" // PyInterpreterState.gc
-#include "pycore_pystate.h" // _PyThreadState_GET()
+#include "pycore_gc.h" // _PyObject_GC_IS_TRACKED()
+#include "pycore_interp.h" // PyInterpreterState.gc
+#include "pycore_pystate.h" // _PyInterpreterState_GET()
PyAPI_FUNC(int) _PyType_CheckConsistency(PyTypeObject *type);
PyAPI_FUNC(int) _PyDict_CheckConsistency(PyObject *mp, int check_content);
+/* Update the Python traceback of an object. This function must be called
+ when a memory block is reused from a free list.
+
+ Internal function called by _Py_NewReference(). */
+extern int _PyTraceMalloc_NewReference(PyObject *op);
+
+// Fast inlined version of PyType_HasFeature()
+static inline int
+_PyType_HasFeature(PyTypeObject *type, unsigned long feature) {
+ return ((type->tp_flags & feature) != 0);
+}
+
+extern void _PyType_InitCache(PyInterpreterState *interp);
+
/* Only private in Python 3.10 and 3.9.8+; public in 3.11 */
extern PyObject *_PyType_GetQualName(PyTypeObject *type);
+/* Inline functions trading binary compatibility for speed:
+ _PyObject_Init() is the fast version of PyObject_Init(), and
+ _PyObject_InitVar() is the fast version of PyObject_InitVar().
+
+ These inline functions must not be called with op=NULL. */
+static inline void
+_PyObject_Init(PyObject *op, PyTypeObject *typeobj)
+{
+ assert(op != NULL);
+ Py_SET_TYPE(op, typeobj);
+ if (_PyType_HasFeature(typeobj, Py_TPFLAGS_HEAPTYPE)) {
+ Py_INCREF(typeobj);
+ }
+ _Py_NewReference(op);
+}
+
+static inline void
+_PyObject_InitVar(PyVarObject *op, PyTypeObject *typeobj, Py_ssize_t size)
+{
+ assert(op != NULL);
+ Py_SET_SIZE(op, size);
+ _PyObject_Init((PyObject *)op, typeobj);
+}
+
+
/* Tell the GC to track this object.
*
+ * The object must not be tracked by the GC.
+ *
* NB: While the object is tracked by the collector, it must be safe to call the
* ob_traverse method.
*
@@ -27,23 +68,27 @@ extern PyObject *_PyType_GetQualName(PyTypeObject *type);
* because it's not object header. So we don't use _PyGCHead_PREV() and
* _PyGCHead_SET_PREV() for it to avoid unnecessary bitwise operations.
*
- * The PyObject_GC_Track() function is the public version of this macro.
+ * See also the public PyObject_GC_Track() function.
*/
-static inline void _PyObject_GC_TRACK_impl(const char *filename, int lineno,
- PyObject *op)
+static inline void _PyObject_GC_TRACK(
+// The preprocessor removes _PyObject_ASSERT_FROM() calls if NDEBUG is defined
+#ifndef NDEBUG
+ const char *filename, int lineno,
+#endif
+ PyObject *op)
{
_PyObject_ASSERT_FROM(op, !_PyObject_GC_IS_TRACKED(op),
"object already tracked by the garbage collector",
- filename, lineno, "_PyObject_GC_TRACK");
+ filename, lineno, __func__);
PyGC_Head *gc = _Py_AS_GC(op);
_PyObject_ASSERT_FROM(op,
(gc->_gc_prev & _PyGC_PREV_MASK_COLLECTING) == 0,
"object is in generation which is garbage collected",
- filename, lineno, "_PyObject_GC_TRACK");
+ filename, lineno, __func__);
- PyThreadState *tstate = _PyThreadState_GET();
- PyGC_Head *generation0 = tstate->interp->gc.generation0;
+ PyInterpreterState *interp = _PyInterpreterState_GET();
+ PyGC_Head *generation0 = interp->gc.generation0;
PyGC_Head *last = (PyGC_Head*)(generation0->_gc_prev);
_PyGCHead_SET_NEXT(last, gc);
_PyGCHead_SET_PREV(gc, last);
@@ -51,9 +96,6 @@ static inline void _PyObject_GC_TRACK_impl(const char *filename, int lineno,
generation0->_gc_prev = (uintptr_t)gc;
}
-#define _PyObject_GC_TRACK(op) \
- _PyObject_GC_TRACK_impl(__FILE__, __LINE__, _PyObject_CAST(op))
-
/* Tell the GC to stop tracking this object.
*
* Internal note: This may be called while GC. So _PyGC_PREV_MASK_COLLECTING
@@ -61,14 +103,19 @@ static inline void _PyObject_GC_TRACK_impl(const char *filename, int lineno,
*
* The object must be tracked by the GC.
*
- * The PyObject_GC_UnTrack() function is the public version of this macro.
+ * See also the public PyObject_GC_UnTrack() which accept an object which is
+ * not tracked.
*/
-static inline void _PyObject_GC_UNTRACK_impl(const char *filename, int lineno,
- PyObject *op)
+static inline void _PyObject_GC_UNTRACK(
+// The preprocessor removes _PyObject_ASSERT_FROM() calls if NDEBUG is defined
+#ifndef NDEBUG
+ const char *filename, int lineno,
+#endif
+ PyObject *op)
{
_PyObject_ASSERT_FROM(op, _PyObject_GC_IS_TRACKED(op),
"object not tracked by the garbage collector",
- filename, lineno, "_PyObject_GC_UNTRACK");
+ filename, lineno, __func__);
PyGC_Head *gc = _Py_AS_GC(op);
PyGC_Head *prev = _PyGCHead_PREV(gc);
@@ -79,8 +126,20 @@ static inline void _PyObject_GC_UNTRACK_impl(const char *filename, int lineno,
gc->_gc_prev &= _PyGC_PREV_MASK_FINALIZED;
}
-#define _PyObject_GC_UNTRACK(op) \
- _PyObject_GC_UNTRACK_impl(__FILE__, __LINE__, _PyObject_CAST(op))
+// Macros to accept any type for the parameter, and to automatically pass
+// the filename and the filename (if NDEBUG is not defined) where the macro
+// is called.
+#ifdef NDEBUG
+# define _PyObject_GC_TRACK(op) \
+ _PyObject_GC_TRACK(_PyObject_CAST(op))
+# define _PyObject_GC_UNTRACK(op) \
+ _PyObject_GC_UNTRACK(_PyObject_CAST(op))
+#else
+# define _PyObject_GC_TRACK(op) \
+ _PyObject_GC_TRACK(__FILE__, __LINE__, _PyObject_CAST(op))
+# define _PyObject_GC_UNTRACK(op) \
+ _PyObject_GC_UNTRACK(__FILE__, __LINE__, _PyObject_CAST(op))
+#endif
#ifdef Py_REF_DEBUG
extern void _PyDebug_PrintTotalRefs(void);
@@ -99,12 +158,6 @@ _PyObject_GET_WEAKREFS_LISTPTR(PyObject *op)
return (PyObject **)((char *)op + offset);
}
-// Fast inlined version of PyType_HasFeature()
-static inline int
-_PyType_HasFeature(PyTypeObject *type, unsigned long feature) {
- return ((type->tp_flags & feature) != 0);
-}
-
// Fast inlined version of PyObject_IS_GC()
static inline int
_PyObject_IS_GC(PyObject *obj)
@@ -117,6 +170,16 @@ _PyObject_IS_GC(PyObject *obj)
// Fast inlined version of PyType_IS_GC()
#define _PyType_IS_GC(t) _PyType_HasFeature((t), Py_TPFLAGS_HAVE_GC)
+// Usage: assert(_Py_CheckSlotResult(obj, "__getitem__", result != NULL));
+extern int _Py_CheckSlotResult(
+ PyObject *obj,
+ const char *slot_name,
+ int success);
+
+// PyType_Ready() must be called if _PyType_IsReady() is false.
+// See also the Py_TPFLAGS_READY flag.
+#define _PyType_IsReady(type) ((type)->tp_dict != NULL)
+
#ifdef __cplusplus
}
#endif
diff --git a/contrib/tools/python3/src/Include/internal/pycore_parser.h b/contrib/tools/python3/src/Include/internal/pycore_parser.h
new file mode 100644
index 00000000000..e2de24e2ca9
--- /dev/null
+++ b/contrib/tools/python3/src/Include/internal/pycore_parser.h
@@ -0,0 +1,31 @@
+#ifndef Py_INTERNAL_PARSER_H
+#define Py_INTERNAL_PARSER_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef Py_BUILD_CORE
+# error "this header requires Py_BUILD_CORE define"
+#endif
+
+extern struct _mod* _PyParser_ASTFromString(
+ const char *str,
+ PyObject* filename,
+ int mode,
+ PyCompilerFlags *flags,
+ PyArena *arena);
+extern struct _mod* _PyParser_ASTFromFile(
+ FILE *fp,
+ PyObject *filename_ob,
+ const char *enc,
+ int mode,
+ const char *ps1,
+ const char *ps2,
+ PyCompilerFlags *flags,
+ int *errcode,
+ PyArena *arena);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* !Py_INTERNAL_PARSER_H */
diff --git a/contrib/tools/python3/src/Include/internal/pycore_pathconfig.h b/contrib/tools/python3/src/Include/internal/pycore_pathconfig.h
index 42d61b1ca26..15447f54490 100644
--- a/contrib/tools/python3/src/Include/internal/pycore_pathconfig.h
+++ b/contrib/tools/python3/src/Include/internal/pycore_pathconfig.h
@@ -65,6 +65,7 @@ extern wchar_t* _Py_GetDLLPath(void);
extern PyStatus _PyConfig_WritePathConfig(const PyConfig *config);
extern void _Py_DumpPathConfig(PyThreadState *tstate);
+extern PyObject* _PyPathConfig_AsDict(void);
#ifdef __cplusplus
}
diff --git a/contrib/tools/python3/src/Include/internal/pycore_pyarena.h b/contrib/tools/python3/src/Include/internal/pycore_pyarena.h
new file mode 100644
index 00000000000..d78972a88ca
--- /dev/null
+++ b/contrib/tools/python3/src/Include/internal/pycore_pyarena.h
@@ -0,0 +1,64 @@
+/* An arena-like memory interface for the compiler.
+ */
+
+#ifndef Py_INTERNAL_PYARENA_H
+#define Py_INTERNAL_PYARENA_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef Py_BUILD_CORE
+# error "this header requires Py_BUILD_CORE define"
+#endif
+
+typedef struct _arena PyArena;
+
+/* _PyArena_New() and _PyArena_Free() create a new arena and free it,
+ respectively. Once an arena has been created, it can be used
+ to allocate memory via _PyArena_Malloc(). Pointers to PyObject can
+ also be registered with the arena via _PyArena_AddPyObject(), and the
+ arena will ensure that the PyObjects stay alive at least until
+ _PyArena_Free() is called. When an arena is freed, all the memory it
+ allocated is freed, the arena releases internal references to registered
+ PyObject*, and none of its pointers are valid.
+ XXX (tim) What does "none of its pointers are valid" mean? Does it
+ XXX mean that pointers previously obtained via _PyArena_Malloc() are
+ XXX no longer valid? (That's clearly true, but not sure that's what
+ XXX the text is trying to say.)
+
+ _PyArena_New() returns an arena pointer. On error, it
+ returns a negative number and sets an exception.
+ XXX (tim): Not true. On error, _PyArena_New() actually returns NULL,
+ XXX and looks like it may or may not set an exception (e.g., if the
+ XXX internal PyList_New(0) returns NULL, _PyArena_New() passes that on
+ XXX and an exception is set; OTOH, if the internal
+ XXX block_new(DEFAULT_BLOCK_SIZE) returns NULL, that's passed on but
+ XXX an exception is not set in that case).
+*/
+PyAPI_FUNC(PyArena*) _PyArena_New(void);
+PyAPI_FUNC(void) _PyArena_Free(PyArena *);
+
+/* Mostly like malloc(), return the address of a block of memory spanning
+ * `size` bytes, or return NULL (without setting an exception) if enough
+ * new memory can't be obtained. Unlike malloc(0), _PyArena_Malloc() with
+ * size=0 does not guarantee to return a unique pointer (the pointer
+ * returned may equal one or more other pointers obtained from
+ * _PyArena_Malloc()).
+ * Note that pointers obtained via _PyArena_Malloc() must never be passed to
+ * the system free() or realloc(), or to any of Python's similar memory-
+ * management functions. _PyArena_Malloc()-obtained pointers remain valid
+ * until _PyArena_Free(ar) is called, at which point all pointers obtained
+ * from the arena `ar` become invalid simultaneously.
+ */
+PyAPI_FUNC(void*) _PyArena_Malloc(PyArena *, size_t size);
+
+/* This routine isn't a proper arena allocation routine. It takes
+ * a PyObject* and records it so that it can be DECREFed when the
+ * arena is freed.
+ */
+PyAPI_FUNC(int) _PyArena_AddPyObject(PyArena *, PyObject *);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* !Py_INTERNAL_PYARENA_H */
diff --git a/contrib/tools/python3/src/Include/internal/pycore_pyerrors.h b/contrib/tools/python3/src/Include/internal/pycore_pyerrors.h
index 2cf1160afc0..a5e97fe23fb 100644
--- a/contrib/tools/python3/src/Include/internal/pycore_pyerrors.h
+++ b/contrib/tools/python3/src/Include/internal/pycore_pyerrors.h
@@ -84,6 +84,12 @@ PyAPI_FUNC(PyObject *) _PyErr_FormatFromCauseTstate(
PyAPI_FUNC(int) _PyErr_CheckSignalsTstate(PyThreadState *tstate);
+PyAPI_FUNC(void) _Py_DumpExtensionModules(int fd, PyInterpreterState *interp);
+
+extern PyObject* _Py_Offer_Suggestions(PyObject* exception);
+PyAPI_FUNC(Py_ssize_t) _Py_UTF8_Edit_Cost(PyObject *str_a, PyObject *str_b,
+ Py_ssize_t max_cost);
+
#ifdef __cplusplus
}
#endif
diff --git a/contrib/tools/python3/src/Include/internal/pycore_pylifecycle.h b/contrib/tools/python3/src/Include/internal/pycore_pylifecycle.h
index 50ab645fc74..524be9d4cbb 100644
--- a/contrib/tools/python3/src/Include/internal/pycore_pylifecycle.h
+++ b/contrib/tools/python3/src/Include/internal/pycore_pylifecycle.h
@@ -8,6 +8,24 @@ extern "C" {
# error "this header requires Py_BUILD_CORE define"
#endif
+#ifdef HAVE_SIGNAL_H
+#include <signal.h>
+#endif
+
+#include "pycore_runtime.h" // _PyRuntimeState
+
+#ifndef NSIG
+# if defined(_NSIG)
+# define NSIG _NSIG /* For BSD/SysV */
+# elif defined(_SIGMAX)
+# define NSIG (_SIGMAX + 1) /* For QNX */
+# elif defined(SIGMAX)
+# define NSIG (SIGMAX + 1) /* For djgpp */
+# else
+# define NSIG 64 /* Use a reasonable default value */
+# endif
+#endif
+
/* Forward declarations */
struct _PyArgv;
struct pyruntimestate;
@@ -31,64 +49,71 @@ PyAPI_FUNC(int) _Py_IsLocaleCoercionTarget(const char *ctype_loc);
/* Various one-time initializers */
-extern PyStatus _PyUnicode_Init(void);
+extern PyStatus _PyUnicode_Init(PyInterpreterState *interp);
+extern PyStatus _PyUnicode_InitTypes(void);
+extern PyStatus _PyBytes_Init(PyInterpreterState *interp);
extern int _PyStructSequence_Init(void);
-extern int _PyLong_Init(PyThreadState *tstate);
+extern int _PyLong_Init(PyInterpreterState *interp);
+extern int _PyLong_InitTypes(void);
+extern PyStatus _PyTuple_Init(PyInterpreterState *interp);
extern PyStatus _PyFaulthandler_Init(int enable);
extern int _PyTraceMalloc_Init(int enable);
-extern PyObject * _PyBuiltin_Init(PyThreadState *tstate);
+extern PyObject * _PyBuiltin_Init(PyInterpreterState *interp);
extern PyStatus _PySys_Create(
PyThreadState *tstate,
PyObject **sysmod_p);
extern PyStatus _PySys_ReadPreinitWarnOptions(PyWideStringList *options);
extern PyStatus _PySys_ReadPreinitXOptions(PyConfig *config);
-extern int _PySys_InitMain(PyThreadState *tstate);
-extern PyStatus _PyExc_Init(void);
-extern PyStatus _PyErr_Init(void);
+extern int _PySys_UpdateConfig(PyThreadState *tstate);
+extern PyStatus _PyExc_Init(PyInterpreterState *interp);
+extern PyStatus _PyErr_InitTypes(void);
extern PyStatus _PyBuiltins_AddExceptions(PyObject * bltinmod);
-extern PyStatus _PyImportHooks_Init(PyThreadState *tstate);
-extern int _PyFloat_Init(void);
+extern void _PyFloat_Init(void);
+extern int _PyFloat_InitTypes(void);
extern PyStatus _Py_HashRandomization_Init(const PyConfig *);
extern PyStatus _PyTypes_Init(void);
extern PyStatus _PyTypes_InitSlotDefs(void);
extern PyStatus _PyImportZip_Init(PyThreadState *tstate);
-extern PyStatus _PyGC_Init(PyThreadState *tstate);
+extern PyStatus _PyGC_Init(PyInterpreterState *interp);
+extern PyStatus _PyAtExit_Init(PyInterpreterState *interp);
/* Various internal finalizers */
-extern void _PyFrame_Fini(void);
-extern void _PyDict_Fini(void);
-extern void _PyTuple_Fini(void);
-extern void _PyList_Fini(void);
-extern void _PySet_Fini(void);
-extern void _PyBytes_Fini(void);
-extern void _PyFloat_Fini(void);
-extern void _PySlice_Fini(void);
-extern void _PyAsyncGen_Fini(void);
+extern void _PyFrame_Fini(PyInterpreterState *interp);
+extern void _PyDict_Fini(PyInterpreterState *interp);
+extern void _PyTuple_Fini(PyInterpreterState *interp);
+extern void _PyList_Fini(PyInterpreterState *interp);
+extern void _PyBytes_Fini(PyInterpreterState *interp);
+extern void _PyFloat_Fini(PyInterpreterState *interp);
+extern void _PySlice_Fini(PyInterpreterState *interp);
+extern void _PyAsyncGen_Fini(PyInterpreterState *interp);
extern int _PySignal_Init(int install_signal_handlers);
-extern void PyOS_FiniInterrupts(void);
+extern void _PySignal_Fini(void);
-extern void _PyExc_Fini(void);
+extern void _PyExc_Fini(PyInterpreterState *interp);
extern void _PyImport_Fini(void);
extern void _PyImport_Fini2(void);
-extern void _PyGC_Fini(PyThreadState *tstate);
-extern void _PyType_Fini(void);
+extern void _PyGC_Fini(PyInterpreterState *interp);
+extern void _PyType_Fini(PyInterpreterState *interp);
extern void _Py_HashRandomization_Fini(void);
-extern void _PyUnicode_Fini(PyThreadState *tstate);
-extern void _PyLong_Fini(PyThreadState *tstate);
+extern void _PyUnicode_Fini(PyInterpreterState *interp);
+extern void _PyUnicode_ClearInterned(PyInterpreterState *interp);
+extern void _PyLong_Fini(PyInterpreterState *interp);
extern void _PyFaulthandler_Fini(void);
extern void _PyHash_Fini(void);
extern void _PyTraceMalloc_Fini(void);
extern void _PyWarnings_Fini(PyInterpreterState *interp);
-extern void _PyAST_Fini(void);
+extern void _PyAST_Fini(PyInterpreterState *interp);
+extern void _PyAtExit_Fini(PyInterpreterState *interp);
-extern PyStatus _PyGILState_Init(PyThreadState *tstate);
-extern void _PyGILState_Fini(PyThreadState *tstate);
+extern PyStatus _PyGILState_Init(_PyRuntimeState *runtime);
+extern PyStatus _PyGILState_SetTstate(PyThreadState *tstate);
+extern void _PyGILState_Fini(PyInterpreterState *interp);
-PyAPI_FUNC(void) _PyGC_DumpShutdownStats(PyThreadState *tstate);
+PyAPI_FUNC(void) _PyGC_DumpShutdownStats(PyInterpreterState *interp);
PyAPI_FUNC(PyStatus) _Py_PreInitializeFromPyArgv(
const PyPreConfig *src_config,
@@ -108,6 +133,8 @@ PyAPI_FUNC(void) _PyErr_Display(PyObject *file, PyObject *exception,
PyAPI_FUNC(void) _PyThreadState_DeleteCurrent(PyThreadState *tstate);
+extern void _PyAtExit_Call(PyInterpreterState *interp);
+
#ifdef __cplusplus
}
#endif
diff --git a/contrib/tools/python3/src/Include/internal/pycore_pymem.h b/contrib/tools/python3/src/Include/internal/pycore_pymem.h
index 9bcb5f5efd7..49af17146ff 100644
--- a/contrib/tools/python3/src/Include/internal/pycore_pymem.h
+++ b/contrib/tools/python3/src/Include/internal/pycore_pymem.h
@@ -69,9 +69,6 @@ PyAPI_FUNC(int) _PyMem_GetAllocatorName(
PYMEM_ALLOCATOR_NOT_SET does nothing. */
PyAPI_FUNC(int) _PyMem_SetupAllocators(PyMemAllocatorName allocator);
-/* bpo-35053: Expose _Py_tracemalloc_config for _Py_NewReference()
- which access directly _Py_tracemalloc_config.tracing for best
- performances. */
struct _PyTraceMalloc_Config {
/* Module initialized?
Variable protected by the GIL */
diff --git a/contrib/tools/python3/src/Include/internal/pycore_pystate.h b/contrib/tools/python3/src/Include/internal/pycore_pystate.h
index 835d6e029c4..4b894f3eff4 100644
--- a/contrib/tools/python3/src/Include/internal/pycore_pystate.h
+++ b/contrib/tools/python3/src/Include/internal/pycore_pystate.h
@@ -22,11 +22,11 @@ _Py_IsMainThread(void)
static inline int
-_Py_IsMainInterpreter(PyThreadState* tstate)
+_Py_IsMainInterpreter(PyInterpreterState *interp)
{
/* Use directly _PyRuntime rather than tstate->interp->runtime, since
this function is used in performance critical code path (ceval) */
- return (tstate->interp == _PyRuntime.interpreters.main);
+ return (interp == _PyRuntime.interpreters.main);
}
@@ -49,10 +49,18 @@ _Py_ThreadCanHandlePendingCalls(void)
/* Variable and macro for in-line access to current thread
and interpreter state */
+#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
+PyAPI_FUNC(PyThreadState*) _PyThreadState_GetTSS(void);
+#endif
+
static inline PyThreadState*
_PyRuntimeState_GetThreadState(_PyRuntimeState *runtime)
{
+#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
+ return _PyThreadState_GetTSS();
+#else
return (PyThreadState*)_Py_atomic_load_relaxed(&runtime->gilstate.tstate_current);
+#endif
}
/* Get the current Python thread state.
@@ -67,7 +75,11 @@ _PyRuntimeState_GetThreadState(_PyRuntimeState *runtime)
static inline PyThreadState*
_PyThreadState_GET(void)
{
+#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
+ return _PyThreadState_GetTSS();
+#else
return _PyRuntimeState_GetThreadState(&_PyRuntime);
+#endif
}
/* Redefine PyThreadState_GET() as an alias to _PyThreadState_GET() */
@@ -119,9 +131,12 @@ PyAPI_FUNC(PyThreadState *) _PyThreadState_Swap(
PyThreadState *newts);
PyAPI_FUNC(PyStatus) _PyInterpreterState_Enable(_PyRuntimeState *runtime);
-PyAPI_FUNC(void) _PyInterpreterState_DeleteExceptMain(_PyRuntimeState *runtime);
-PyAPI_FUNC(void) _PyGILState_Reinit(_PyRuntimeState *runtime);
+#ifdef HAVE_FORK
+extern PyStatus _PyInterpreterState_DeleteExceptMain(_PyRuntimeState *runtime);
+extern PyStatus _PyGILState_Reinit(_PyRuntimeState *runtime);
+extern void _PySignal_AfterFork(void);
+#endif
PyAPI_FUNC(int) _PyState_AddModule(
diff --git a/contrib/tools/python3/src/Include/internal/pycore_runtime.h b/contrib/tools/python3/src/Include/internal/pycore_runtime.h
index 34eb492b9f2..bcd710c4496 100644
--- a/contrib/tools/python3/src/Include/internal/pycore_runtime.h
+++ b/contrib/tools/python3/src/Include/internal/pycore_runtime.h
@@ -19,7 +19,9 @@ struct _ceval_runtime_state {
the main thread of the main interpreter can handle signals: see
_Py_ThreadCanHandleSignals(). */
_Py_atomic_int signals_pending;
+#ifndef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
struct _gil_runtime_state gil;
+#endif
};
/* GIL state */
@@ -47,6 +49,13 @@ typedef struct _Py_AuditHookEntry {
void *userData;
} _Py_AuditHookEntry;
+struct _Py_unicode_runtime_ids {
+ PyThread_type_lock lock;
+ // next_index value must be preserved when Py_Initialize()/Py_Finalize()
+ // is called multiple times: see _PyUnicode_FromId() implementation.
+ Py_ssize_t next_index;
+};
+
/* Full Python runtime state */
typedef struct pyruntimestate {
@@ -100,10 +109,14 @@ typedef struct pyruntimestate {
PyPreConfig preconfig;
+ // Audit values must be preserved when Py_Initialize()/Py_Finalize()
+ // is called multiple times.
Py_OpenCodeHookFunction open_code_hook;
void *open_code_userdata;
_Py_AuditHookEntry *audit_hook_head;
+ struct _Py_unicode_runtime_ids unicode_ids;
+
// XXX Consolidate globals found via the check-c-globals script.
} _PyRuntimeState;
@@ -118,7 +131,7 @@ PyAPI_FUNC(PyStatus) _PyRuntimeState_Init(_PyRuntimeState *runtime);
PyAPI_FUNC(void) _PyRuntimeState_Fini(_PyRuntimeState *runtime);
#ifdef HAVE_FORK
-PyAPI_FUNC(void) _PyRuntimeState_ReInitThreads(_PyRuntimeState *runtime);
+extern PyStatus _PyRuntimeState_ReInitThreads(_PyRuntimeState *runtime);
#endif
/* Initialize _PyRuntimeState.
diff --git a/contrib/tools/python3/src/Include/internal/pycore_structseq.h b/contrib/tools/python3/src/Include/internal/pycore_structseq.h
new file mode 100644
index 00000000000..84c8d477e0d
--- /dev/null
+++ b/contrib/tools/python3/src/Include/internal/pycore_structseq.h
@@ -0,0 +1,21 @@
+#ifndef Py_INTERNAL_STRUCTSEQ_H
+#define Py_INTERNAL_STRUCTSEQ_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef Py_BUILD_CORE
+# error "this header requires Py_BUILD_CORE define"
+#endif
+
+
+PyAPI_FUNC(int) _PyStructSequence_InitType(
+ PyTypeObject *type,
+ PyStructSequence_Desc *desc,
+ unsigned long tp_flags);
+
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* !Py_INTERNAL_STRUCTSEQ_H */
diff --git a/contrib/tools/python3/src/Include/internal/pycore_symtable.h b/contrib/tools/python3/src/Include/internal/pycore_symtable.h
new file mode 100644
index 00000000000..a2e520b8e25
--- /dev/null
+++ b/contrib/tools/python3/src/Include/internal/pycore_symtable.h
@@ -0,0 +1,133 @@
+#ifndef Py_INTERNAL_SYMTABLE_H
+#define Py_INTERNAL_SYMTABLE_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef Py_BUILD_CORE
+# error "this header requires Py_BUILD_CORE define"
+#endif
+
+struct _mod; // Type defined in pycore_ast.h
+
+typedef enum _block_type { FunctionBlock, ClassBlock, ModuleBlock, AnnotationBlock }
+ _Py_block_ty;
+
+typedef enum _comprehension_type {
+ NoComprehension = 0,
+ ListComprehension = 1,
+ DictComprehension = 2,
+ SetComprehension = 3,
+ GeneratorExpression = 4 } _Py_comprehension_ty;
+
+struct _symtable_entry;
+
+struct symtable {
+ PyObject *st_filename; /* name of file being compiled,
+ decoded from the filesystem encoding */
+ struct _symtable_entry *st_cur; /* current symbol table entry */
+ struct _symtable_entry *st_top; /* symbol table entry for module */
+ PyObject *st_blocks; /* dict: map AST node addresses
+ * to symbol table entries */
+ PyObject *st_stack; /* list: stack of namespace info */
+ PyObject *st_global; /* borrowed ref to st_top->ste_symbols */
+ int st_nblocks; /* number of blocks used. kept for
+ consistency with the corresponding
+ compiler structure */
+ PyObject *st_private; /* name of current class or NULL */
+ PyFutureFeatures *st_future; /* module's future features that affect
+ the symbol table */
+ int recursion_depth; /* current recursion depth */
+ int recursion_limit; /* recursion limit */
+};
+
+typedef struct _symtable_entry {
+ PyObject_HEAD
+ PyObject *ste_id; /* int: key in ste_table->st_blocks */
+ PyObject *ste_symbols; /* dict: variable names to flags */
+ PyObject *ste_name; /* string: name of current block */
+ PyObject *ste_varnames; /* list of function parameters */
+ PyObject *ste_children; /* list of child blocks */
+ PyObject *ste_directives;/* locations of global and nonlocal statements */
+ _Py_block_ty ste_type; /* module, class or function */
+ int ste_nested; /* true if block is nested */
+ unsigned ste_free : 1; /* true if block has free variables */
+ unsigned ste_child_free : 1; /* true if a child block has free vars,
+ including free refs to globals */
+ unsigned ste_generator : 1; /* true if namespace is a generator */
+ unsigned ste_coroutine : 1; /* true if namespace is a coroutine */
+ _Py_comprehension_ty ste_comprehension; /* Kind of comprehension (if any) */
+ unsigned ste_varargs : 1; /* true if block has varargs */
+ unsigned ste_varkeywords : 1; /* true if block has varkeywords */
+ unsigned ste_returns_value : 1; /* true if namespace uses return with
+ an argument */
+ unsigned ste_needs_class_closure : 1; /* for class scopes, true if a
+ closure over __class__
+ should be created */
+ unsigned ste_comp_iter_target : 1; /* true if visiting comprehension target */
+ int ste_comp_iter_expr; /* non-zero if visiting a comprehension range expression */
+ int ste_lineno; /* first line of block */
+ int ste_col_offset; /* offset of first line of block */
+ int ste_end_lineno; /* end line of block */
+ int ste_end_col_offset; /* end offset of first line of block */
+ int ste_opt_lineno; /* lineno of last exec or import * */
+ int ste_opt_col_offset; /* offset of last exec or import * */
+ struct symtable *ste_table;
+} PySTEntryObject;
+
+extern PyTypeObject PySTEntry_Type;
+
+#define PySTEntry_Check(op) Py_IS_TYPE(op, &PySTEntry_Type)
+
+extern int _PyST_GetScope(PySTEntryObject *, PyObject *);
+
+extern struct symtable* _PySymtable_Build(
+ struct _mod *mod,
+ PyObject *filename,
+ PyFutureFeatures *future);
+PyAPI_FUNC(PySTEntryObject *) PySymtable_Lookup(struct symtable *, void *);
+
+extern void _PySymtable_Free(struct symtable *);
+
+/* Flags for def-use information */
+
+#define DEF_GLOBAL 1 /* global stmt */
+#define DEF_LOCAL 2 /* assignment in code block */
+#define DEF_PARAM 2<<1 /* formal parameter */
+#define DEF_NONLOCAL 2<<2 /* nonlocal stmt */
+#define USE 2<<3 /* name is used */
+#define DEF_FREE 2<<4 /* name used but not defined in nested block */
+#define DEF_FREE_CLASS 2<<5 /* free variable from class's method */
+#define DEF_IMPORT 2<<6 /* assignment occurred via import */
+#define DEF_ANNOT 2<<7 /* this name is annotated */
+#define DEF_COMP_ITER 2<<8 /* this name is a comprehension iteration variable */
+
+#define DEF_BOUND (DEF_LOCAL | DEF_PARAM | DEF_IMPORT)
+
+/* GLOBAL_EXPLICIT and GLOBAL_IMPLICIT are used internally by the symbol
+ table. GLOBAL is returned from PyST_GetScope() for either of them.
+ It is stored in ste_symbols at bits 12-15.
+*/
+#define SCOPE_OFFSET 11
+#define SCOPE_MASK (DEF_GLOBAL | DEF_LOCAL | DEF_PARAM | DEF_NONLOCAL)
+
+#define LOCAL 1
+#define GLOBAL_EXPLICIT 2
+#define GLOBAL_IMPLICIT 3
+#define FREE 4
+#define CELL 5
+
+#define GENERATOR 1
+#define GENERATOR_EXPRESSION 2
+
+// Used by symtablemodule.c
+extern struct symtable* _Py_SymtableStringObjectFlags(
+ const char *str,
+ PyObject *filename,
+ int start,
+ PyCompilerFlags *flags);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* !Py_INTERNAL_SYMTABLE_H */
diff --git a/contrib/tools/python3/src/Include/internal/pycore_traceback.h b/contrib/tools/python3/src/Include/internal/pycore_traceback.h
index c23290ebec5..c01a47639d5 100644
--- a/contrib/tools/python3/src/Include/internal/pycore_traceback.h
+++ b/contrib/tools/python3/src/Include/internal/pycore_traceback.h
@@ -74,17 +74,13 @@ PyAPI_FUNC(void) _Py_DumpASCII(int fd, PyObject *text);
This function is signal safe. */
PyAPI_FUNC(void) _Py_DumpDecimal(
int fd,
- unsigned long value);
+ size_t value);
-/* Format an integer as hexadecimal into the file descriptor fd with at least
- width digits.
-
- The maximum width is sizeof(unsigned long)*2 digits.
-
- This function is signal safe. */
+/* Format an integer as hexadecimal with width digits into fd file descriptor.
+ The function is signal safe. */
PyAPI_FUNC(void) _Py_DumpHexadecimal(
int fd,
- unsigned long value,
+ uintptr_t value,
Py_ssize_t width);
PyAPI_FUNC(PyObject*) _PyTraceBack_FromFrame(
diff --git a/contrib/tools/python3/src/Include/internal/pycore_tupleobject.h b/contrib/tools/python3/src/Include/internal/pycore_tuple.h
index f95f16c0ed0..5353e18d083 100644
--- a/contrib/tools/python3/src/Include/internal/pycore_tupleobject.h
+++ b/contrib/tools/python3/src/Include/internal/pycore_tuple.h
@@ -1,5 +1,5 @@
-#ifndef Py_INTERNAL_TUPLEOBJECT_H
-#define Py_INTERNAL_TUPLEOBJECT_H
+#ifndef Py_INTERNAL_TUPLE_H
+#define Py_INTERNAL_TUPLE_H
#ifdef __cplusplus
extern "C" {
#endif
@@ -11,9 +11,10 @@ extern "C" {
#include "tupleobject.h" /* _PyTuple_CAST() */
#define _PyTuple_ITEMS(op) (_PyTuple_CAST(op)->ob_item)
+
PyAPI_FUNC(PyObject *) _PyTuple_FromArray(PyObject *const *, Py_ssize_t);
#ifdef __cplusplus
}
#endif
-#endif /* !Py_INTERNAL_TUPLEOBJECT_H */
+#endif /* !Py_INTERNAL_TUPLE_H */
diff --git a/contrib/tools/python3/src/Include/internal/pycore_ucnhash.h b/contrib/tools/python3/src/Include/internal/pycore_ucnhash.h
new file mode 100644
index 00000000000..187dd68e734
--- /dev/null
+++ b/contrib/tools/python3/src/Include/internal/pycore_ucnhash.h
@@ -0,0 +1,34 @@
+/* Unicode name database interface */
+#ifndef Py_INTERNAL_UCNHASH_H
+#define Py_INTERNAL_UCNHASH_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef Py_BUILD_CORE
+# error "this header requires Py_BUILD_CORE define"
+#endif
+
+/* revised ucnhash CAPI interface (exported through a "wrapper") */
+
+#define PyUnicodeData_CAPSULE_NAME "unicodedata._ucnhash_CAPI"
+
+typedef struct {
+
+ /* Get name for a given character code.
+ Returns non-zero if success, zero if not.
+ Does not set Python exceptions. */
+ int (*getname)(Py_UCS4 code, char* buffer, int buflen,
+ int with_alias_and_seq);
+
+ /* Get character code for a given name.
+ Same error handling as for getname(). */
+ int (*getcode)(const char* name, int namelen, Py_UCS4* code,
+ int with_named_seq);
+
+} _PyUnicode_Name_CAPI;
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* !Py_INTERNAL_UCNHASH_H */
diff --git a/contrib/tools/python3/src/Include/internal/pycore_unionobject.h b/contrib/tools/python3/src/Include/internal/pycore_unionobject.h
new file mode 100644
index 00000000000..9962f576103
--- /dev/null
+++ b/contrib/tools/python3/src/Include/internal/pycore_unionobject.h
@@ -0,0 +1,22 @@
+#ifndef Py_INTERNAL_UNIONOBJECT_H
+#define Py_INTERNAL_UNIONOBJECT_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef Py_BUILD_CORE
+# error "this header requires Py_BUILD_CORE define"
+#endif
+
+extern PyTypeObject _PyUnion_Type;
+#define _PyUnion_Check(op) Py_IS_TYPE(op, &_PyUnion_Type)
+extern PyObject *_Py_union_type_or(PyObject *, PyObject *);
+
+#define _PyGenericAlias_Check(op) PyObject_TypeCheck(op, &Py_GenericAliasType)
+extern PyObject *_Py_subs_parameters(PyObject *, PyObject *, PyObject *, PyObject *);
+extern PyObject *_Py_make_parameters(PyObject *);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* !Py_INTERNAL_UNIONOBJECT_H */
diff --git a/contrib/tools/python3/src/Include/internal/pycore_warnings.h b/contrib/tools/python3/src/Include/internal/pycore_warnings.h
index cafe305edb0..f728ec3077b 100644
--- a/contrib/tools/python3/src/Include/internal/pycore_warnings.h
+++ b/contrib/tools/python3/src/Include/internal/pycore_warnings.h
@@ -17,7 +17,7 @@ struct _warnings_runtime_state {
long filters_version;
};
-extern PyStatus _PyWarnings_InitState(PyThreadState *tstate);
+extern int _PyWarnings_InitState(PyInterpreterState *interp);
#ifdef __cplusplus
}