summaryrefslogtreecommitdiffstats
path: root/Python
diff options
context:
space:
mode:
authorJelle Zijlstra <jelle.zijlstra@gmail.com>2023-05-16 03:36:23 (GMT)
committerGitHub <noreply@github.com>2023-05-16 03:36:23 (GMT)
commit24d8b88420b81fc60aeb0cbcacef1e72d633824a (patch)
tree1b06e157ddc7d1066fd41a28d2c27270ccf2e278 /Python
parentfdafdc235e74f2f4fedc1f745bf8b90141daa162 (diff)
downloadcpython-24d8b88420b81fc60aeb0cbcacef1e72d633824a.zip
cpython-24d8b88420b81fc60aeb0cbcacef1e72d633824a.tar.gz
cpython-24d8b88420b81fc60aeb0cbcacef1e72d633824a.tar.bz2
gh-103763: Implement PEP 695 (#103764)
This implements PEP 695, Type Parameter Syntax. It adds support for: - Generic functions (def func[T](): ...) - Generic classes (class X[T](): ...) - Type aliases (type X = ...) - New scoping when the new syntax is used within a class body - Compiler and interpreter changes to support the new syntax and scoping rules Co-authored-by: Marc Mueller <30130371+cdce8p@users.noreply.github.com> Co-authored-by: Eric Traut <eric@traut.com> Co-authored-by: Larry Hastings <larry@hastings.org> Co-authored-by: Alex Waygood <Alex.Waygood@Gmail.com>
Diffstat (limited to 'Python')
-rw-r--r--Python/Python-ast.c767
-rw-r--r--Python/ast.c45
-rw-r--r--Python/ast_opt.c24
-rw-r--r--Python/bytecodes.c53
-rw-r--r--Python/compile.c623
-rw-r--r--Python/generated_cases.c.h984
-rw-r--r--Python/intrinsics.c34
-rw-r--r--Python/opcode_metadata.h20
-rw-r--r--Python/opcode_targets.h10
-rw-r--r--Python/pylifecycle.c2
-rw-r--r--Python/symtable.c355
11 files changed, 2291 insertions, 626 deletions
diff --git a/Python/Python-ast.c b/Python/Python-ast.c
index 81ab71c..d62cccb 100644
--- a/Python/Python-ast.c
+++ b/Python/Python-ast.c
@@ -131,6 +131,7 @@ void _PyAST_Fini(PyInterpreterState *interp)
Py_CLEAR(state->Not_type);
Py_CLEAR(state->Or_singleton);
Py_CLEAR(state->Or_type);
+ Py_CLEAR(state->ParamSpec_type);
Py_CLEAR(state->Pass_type);
Py_CLEAR(state->Pow_singleton);
Py_CLEAR(state->Pow_type);
@@ -150,7 +151,10 @@ void _PyAST_Fini(PyInterpreterState *interp)
Py_CLEAR(state->TryStar_type);
Py_CLEAR(state->Try_type);
Py_CLEAR(state->Tuple_type);
+ Py_CLEAR(state->TypeAlias_type);
Py_CLEAR(state->TypeIgnore_type);
+ Py_CLEAR(state->TypeVarTuple_type);
+ Py_CLEAR(state->TypeVar_type);
Py_CLEAR(state->UAdd_singleton);
Py_CLEAR(state->UAdd_type);
Py_CLEAR(state->USub_singleton);
@@ -179,6 +183,7 @@ void _PyAST_Fini(PyInterpreterState *interp)
Py_CLEAR(state->bases);
Py_CLEAR(state->body);
Py_CLEAR(state->boolop_type);
+ Py_CLEAR(state->bound);
Py_CLEAR(state->cases);
Py_CLEAR(state->cause);
Py_CLEAR(state->cls);
@@ -256,6 +261,8 @@ void _PyAST_Fini(PyInterpreterState *interp)
Py_CLEAR(state->type_comment);
Py_CLEAR(state->type_ignore_type);
Py_CLEAR(state->type_ignores);
+ Py_CLEAR(state->typeparam_type);
+ Py_CLEAR(state->typeparams);
Py_CLEAR(state->unaryop_type);
Py_CLEAR(state->upper);
Py_CLEAR(state->value);
@@ -289,6 +296,7 @@ static int init_identifiers(struct ast_state *state)
if ((state->attr = PyUnicode_InternFromString("attr")) == NULL) return 0;
if ((state->bases = PyUnicode_InternFromString("bases")) == NULL) return 0;
if ((state->body = PyUnicode_InternFromString("body")) == NULL) return 0;
+ if ((state->bound = PyUnicode_InternFromString("bound")) == NULL) return 0;
if ((state->cases = PyUnicode_InternFromString("cases")) == NULL) return 0;
if ((state->cause = PyUnicode_InternFromString("cause")) == NULL) return 0;
if ((state->cls = PyUnicode_InternFromString("cls")) == NULL) return 0;
@@ -354,6 +362,7 @@ static int init_identifiers(struct ast_state *state)
if ((state->type = PyUnicode_InternFromString("type")) == NULL) return 0;
if ((state->type_comment = PyUnicode_InternFromString("type_comment")) == NULL) return 0;
if ((state->type_ignores = PyUnicode_InternFromString("type_ignores")) == NULL) return 0;
+ if ((state->typeparams = PyUnicode_InternFromString("typeparams")) == NULL) return 0;
if ((state->upper = PyUnicode_InternFromString("upper")) == NULL) return 0;
if ((state->value = PyUnicode_InternFromString("value")) == NULL) return 0;
if ((state->values = PyUnicode_InternFromString("values")) == NULL) return 0;
@@ -374,6 +383,7 @@ GENERATE_ASDL_SEQ_CONSTRUCTOR(withitem, withitem_ty)
GENERATE_ASDL_SEQ_CONSTRUCTOR(match_case, match_case_ty)
GENERATE_ASDL_SEQ_CONSTRUCTOR(pattern, pattern_ty)
GENERATE_ASDL_SEQ_CONSTRUCTOR(type_ignore, type_ignore_ty)
+GENERATE_ASDL_SEQ_CONSTRUCTOR(typeparam, typeparam_ty)
static PyObject* ast2obj_mod(struct ast_state *state, void*);
static const char * const Module_fields[]={
@@ -399,6 +409,7 @@ static const char * const stmt_attributes[] = {
static PyObject* ast2obj_stmt(struct ast_state *state, void*);
static const char * const FunctionDef_fields[]={
"name",
+ "typeparams",
"args",
"body",
"decorator_list",
@@ -407,6 +418,7 @@ static const char * const FunctionDef_fields[]={
};
static const char * const AsyncFunctionDef_fields[]={
"name",
+ "typeparams",
"args",
"body",
"decorator_list",
@@ -415,6 +427,7 @@ static const char * const AsyncFunctionDef_fields[]={
};
static const char * const ClassDef_fields[]={
"name",
+ "typeparams",
"bases",
"keywords",
"body",
@@ -431,6 +444,11 @@ static const char * const Assign_fields[]={
"value",
"type_comment",
};
+static const char * const TypeAlias_fields[]={
+ "name",
+ "typeparams",
+ "value",
+};
static const char * const AugAssign_fields[]={
"target",
"op",
@@ -757,6 +775,23 @@ static const char * const TypeIgnore_fields[]={
"lineno",
"tag",
};
+static const char * const typeparam_attributes[] = {
+ "lineno",
+ "col_offset",
+ "end_lineno",
+ "end_col_offset",
+};
+static PyObject* ast2obj_typeparam(struct ast_state *state, void*);
+static const char * const TypeVar_fields[]={
+ "name",
+ "bound",
+};
+static const char * const ParamSpec_fields[]={
+ "name",
+};
+static const char * const TypeVarTuple_fields[]={
+ "name",
+};
@@ -1134,12 +1169,13 @@ init_types(struct ast_state *state)
"FunctionType(expr* argtypes, expr returns)");
if (!state->FunctionType_type) return 0;
state->stmt_type = make_type(state, "stmt", state->AST_type, NULL, 0,
- "stmt = FunctionDef(identifier name, arguments args, stmt* body, expr* decorator_list, expr? returns, string? type_comment)\n"
- " | AsyncFunctionDef(identifier name, arguments args, stmt* body, expr* decorator_list, expr? returns, string? type_comment)\n"
- " | ClassDef(identifier name, expr* bases, keyword* keywords, stmt* body, expr* decorator_list)\n"
+ "stmt = FunctionDef(identifier name, typeparam* typeparams, arguments args, stmt* body, expr* decorator_list, expr? returns, string? type_comment)\n"
+ " | AsyncFunctionDef(identifier name, typeparam* typeparams, arguments args, stmt* body, expr* decorator_list, expr? returns, string? type_comment)\n"
+ " | ClassDef(identifier name, typeparam* typeparams, expr* bases, keyword* keywords, stmt* body, expr* decorator_list)\n"
" | Return(expr? value)\n"
" | Delete(expr* targets)\n"
" | Assign(expr* targets, expr value, string? type_comment)\n"
+ " | TypeAlias(expr name, typeparam* typeparams, expr value)\n"
" | AugAssign(expr target, operator op, expr value)\n"
" | AnnAssign(expr target, expr annotation, expr? value, int simple)\n"
" | For(expr target, expr iter, stmt* body, stmt* orelse, string? type_comment)\n"
@@ -1169,8 +1205,8 @@ init_types(struct ast_state *state)
-1)
return 0;
state->FunctionDef_type = make_type(state, "FunctionDef", state->stmt_type,
- FunctionDef_fields, 6,
- "FunctionDef(identifier name, arguments args, stmt* body, expr* decorator_list, expr? returns, string? type_comment)");
+ FunctionDef_fields, 7,
+ "FunctionDef(identifier name, typeparam* typeparams, arguments args, stmt* body, expr* decorator_list, expr? returns, string? type_comment)");
if (!state->FunctionDef_type) return 0;
if (PyObject_SetAttr(state->FunctionDef_type, state->returns, Py_None) ==
-1)
@@ -1180,8 +1216,8 @@ init_types(struct ast_state *state)
return 0;
state->AsyncFunctionDef_type = make_type(state, "AsyncFunctionDef",
state->stmt_type,
- AsyncFunctionDef_fields, 6,
- "AsyncFunctionDef(identifier name, arguments args, stmt* body, expr* decorator_list, expr? returns, string? type_comment)");
+ AsyncFunctionDef_fields, 7,
+ "AsyncFunctionDef(identifier name, typeparam* typeparams, arguments args, stmt* body, expr* decorator_list, expr? returns, string? type_comment)");
if (!state->AsyncFunctionDef_type) return 0;
if (PyObject_SetAttr(state->AsyncFunctionDef_type, state->returns, Py_None)
== -1)
@@ -1190,8 +1226,8 @@ init_types(struct ast_state *state)
Py_None) == -1)
return 0;
state->ClassDef_type = make_type(state, "ClassDef", state->stmt_type,
- ClassDef_fields, 5,
- "ClassDef(identifier name, expr* bases, keyword* keywords, stmt* body, expr* decorator_list)");
+ ClassDef_fields, 6,
+ "ClassDef(identifier name, typeparam* typeparams, expr* bases, keyword* keywords, stmt* body, expr* decorator_list)");
if (!state->ClassDef_type) return 0;
state->Return_type = make_type(state, "Return", state->stmt_type,
Return_fields, 1,
@@ -1210,6 +1246,10 @@ init_types(struct ast_state *state)
if (PyObject_SetAttr(state->Assign_type, state->type_comment, Py_None) ==
-1)
return 0;
+ state->TypeAlias_type = make_type(state, "TypeAlias", state->stmt_type,
+ TypeAlias_fields, 3,
+ "TypeAlias(expr name, typeparam* typeparams, expr value)");
+ if (!state->TypeAlias_type) return 0;
state->AugAssign_type = make_type(state, "AugAssign", state->stmt_type,
AugAssign_fields, 3,
"AugAssign(expr target, operator op, expr value)");
@@ -1854,6 +1894,36 @@ init_types(struct ast_state *state)
TypeIgnore_fields, 2,
"TypeIgnore(int lineno, string tag)");
if (!state->TypeIgnore_type) return 0;
+ state->typeparam_type = make_type(state, "typeparam", state->AST_type,
+ NULL, 0,
+ "typeparam = TypeVar(identifier name, expr? bound)\n"
+ " | ParamSpec(identifier name)\n"
+ " | TypeVarTuple(identifier name)");
+ if (!state->typeparam_type) return 0;
+ if (!add_attributes(state, state->typeparam_type, typeparam_attributes, 4))
+ return 0;
+ if (PyObject_SetAttr(state->typeparam_type, state->end_lineno, Py_None) ==
+ -1)
+ return 0;
+ if (PyObject_SetAttr(state->typeparam_type, state->end_col_offset, Py_None)
+ == -1)
+ return 0;
+ state->TypeVar_type = make_type(state, "TypeVar", state->typeparam_type,
+ TypeVar_fields, 2,
+ "TypeVar(identifier name, expr? bound)");
+ if (!state->TypeVar_type) return 0;
+ if (PyObject_SetAttr(state->TypeVar_type, state->bound, Py_None) == -1)
+ return 0;
+ state->ParamSpec_type = make_type(state, "ParamSpec",
+ state->typeparam_type, ParamSpec_fields,
+ 1,
+ "ParamSpec(identifier name)");
+ if (!state->ParamSpec_type) return 0;
+ state->TypeVarTuple_type = make_type(state, "TypeVarTuple",
+ state->typeparam_type,
+ TypeVarTuple_fields, 1,
+ "TypeVarTuple(identifier name)");
+ if (!state->TypeVarTuple_type) return 0;
state->recursion_depth = 0;
state->recursion_limit = 0;
@@ -1897,6 +1967,8 @@ static int obj2ast_pattern(struct ast_state *state, PyObject* obj, pattern_ty*
out, PyArena* arena);
static int obj2ast_type_ignore(struct ast_state *state, PyObject* obj,
type_ignore_ty* out, PyArena* arena);
+static int obj2ast_typeparam(struct ast_state *state, PyObject* obj,
+ typeparam_ty* out, PyArena* arena);
mod_ty
_PyAST_Module(asdl_stmt_seq * body, asdl_type_ignore_seq * type_ignores,
@@ -1960,10 +2032,11 @@ _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)
+_PyAST_FunctionDef(identifier name, asdl_typeparam_seq * typeparams,
+ 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 p;
if (!name) {
@@ -1981,6 +2054,7 @@ _PyAST_FunctionDef(identifier name, arguments_ty args, asdl_stmt_seq * body,
return NULL;
p->kind = FunctionDef_kind;
p->v.FunctionDef.name = name;
+ p->v.FunctionDef.typeparams = typeparams;
p->v.FunctionDef.args = args;
p->v.FunctionDef.body = body;
p->v.FunctionDef.decorator_list = decorator_list;
@@ -1994,10 +2068,11 @@ _PyAST_FunctionDef(identifier name, arguments_ty args, asdl_stmt_seq * body,
}
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)
+_PyAST_AsyncFunctionDef(identifier name, asdl_typeparam_seq * typeparams,
+ 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 p;
if (!name) {
@@ -2015,6 +2090,7 @@ _PyAST_AsyncFunctionDef(identifier name, arguments_ty args, asdl_stmt_seq *
return NULL;
p->kind = AsyncFunctionDef_kind;
p->v.AsyncFunctionDef.name = name;
+ p->v.AsyncFunctionDef.typeparams = typeparams;
p->v.AsyncFunctionDef.args = args;
p->v.AsyncFunctionDef.body = body;
p->v.AsyncFunctionDef.decorator_list = decorator_list;
@@ -2028,10 +2104,10 @@ _PyAST_AsyncFunctionDef(identifier name, arguments_ty args, asdl_stmt_seq *
}
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)
+_PyAST_ClassDef(identifier name, asdl_typeparam_seq * typeparams, 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 p;
if (!name) {
@@ -2044,6 +2120,7 @@ _PyAST_ClassDef(identifier name, asdl_expr_seq * bases, asdl_keyword_seq *
return NULL;
p->kind = ClassDef_kind;
p->v.ClassDef.name = name;
+ p->v.ClassDef.typeparams = typeparams;
p->v.ClassDef.bases = bases;
p->v.ClassDef.keywords = keywords;
p->v.ClassDef.body = body;
@@ -2115,6 +2192,36 @@ _PyAST_Assign(asdl_expr_seq * targets, expr_ty value, string type_comment, int
}
stmt_ty
+_PyAST_TypeAlias(expr_ty name, asdl_typeparam_seq * typeparams, expr_ty value,
+ int lineno, int col_offset, int end_lineno, int
+ end_col_offset, PyArena *arena)
+{
+ stmt_ty p;
+ if (!name) {
+ PyErr_SetString(PyExc_ValueError,
+ "field 'name' is required for TypeAlias");
+ return NULL;
+ }
+ if (!value) {
+ PyErr_SetString(PyExc_ValueError,
+ "field 'value' is required for TypeAlias");
+ return NULL;
+ }
+ p = (stmt_ty)_PyArena_Malloc(arena, sizeof(*p));
+ if (!p)
+ return NULL;
+ p->kind = TypeAlias_kind;
+ p->v.TypeAlias.name = name;
+ p->v.TypeAlias.typeparams = typeparams;
+ p->v.TypeAlias.value = value;
+ p->lineno = lineno;
+ p->col_offset = col_offset;
+ p->end_lineno = end_lineno;
+ p->end_col_offset = end_col_offset;
+ return p;
+}
+
+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)
{
@@ -3606,6 +3713,73 @@ _PyAST_TypeIgnore(int lineno, string tag, PyArena *arena)
return p;
}
+typeparam_ty
+_PyAST_TypeVar(identifier name, expr_ty bound, int lineno, int col_offset, int
+ end_lineno, int end_col_offset, PyArena *arena)
+{
+ typeparam_ty p;
+ if (!name) {
+ PyErr_SetString(PyExc_ValueError,
+ "field 'name' is required for TypeVar");
+ return NULL;
+ }
+ p = (typeparam_ty)_PyArena_Malloc(arena, sizeof(*p));
+ if (!p)
+ return NULL;
+ p->kind = TypeVar_kind;
+ p->v.TypeVar.name = name;
+ p->v.TypeVar.bound = bound;
+ p->lineno = lineno;
+ p->col_offset = col_offset;
+ p->end_lineno = end_lineno;
+ p->end_col_offset = end_col_offset;
+ return p;
+}
+
+typeparam_ty
+_PyAST_ParamSpec(identifier name, int lineno, int col_offset, int end_lineno,
+ int end_col_offset, PyArena *arena)
+{
+ typeparam_ty p;
+ if (!name) {
+ PyErr_SetString(PyExc_ValueError,
+ "field 'name' is required for ParamSpec");
+ return NULL;
+ }
+ p = (typeparam_ty)_PyArena_Malloc(arena, sizeof(*p));
+ if (!p)
+ return NULL;
+ p->kind = ParamSpec_kind;
+ p->v.ParamSpec.name = name;
+ p->lineno = lineno;
+ p->col_offset = col_offset;
+ p->end_lineno = end_lineno;
+ p->end_col_offset = end_col_offset;
+ return p;
+}
+
+typeparam_ty
+_PyAST_TypeVarTuple(identifier name, int lineno, int col_offset, int
+ end_lineno, int end_col_offset, PyArena *arena)
+{
+ typeparam_ty p;
+ if (!name) {
+ PyErr_SetString(PyExc_ValueError,
+ "field 'name' is required for TypeVarTuple");
+ return NULL;
+ }
+ p = (typeparam_ty)_PyArena_Malloc(arena, sizeof(*p));
+ if (!p)
+ return NULL;
+ p->kind = TypeVarTuple_kind;
+ p->v.TypeVarTuple.name = name;
+ p->lineno = lineno;
+ p->col_offset = col_offset;
+ p->end_lineno = end_lineno;
+ p->end_col_offset = end_col_offset;
+ return p;
+}
+
PyObject*
ast2obj_mod(struct ast_state *state, void* _o)
@@ -3708,6 +3882,12 @@ ast2obj_stmt(struct ast_state *state, void* _o)
if (PyObject_SetAttr(result, state->name, value) == -1)
goto failed;
Py_DECREF(value);
+ value = ast2obj_list(state, (asdl_seq*)o->v.FunctionDef.typeparams,
+ ast2obj_typeparam);
+ if (!value) goto failed;
+ if (PyObject_SetAttr(result, state->typeparams, value) == -1)
+ goto failed;
+ Py_DECREF(value);
value = ast2obj_arguments(state, o->v.FunctionDef.args);
if (!value) goto failed;
if (PyObject_SetAttr(result, state->args, value) == -1)
@@ -3745,6 +3925,13 @@ ast2obj_stmt(struct ast_state *state, void* _o)
if (PyObject_SetAttr(result, state->name, value) == -1)
goto failed;
Py_DECREF(value);
+ value = ast2obj_list(state,
+ (asdl_seq*)o->v.AsyncFunctionDef.typeparams,
+ ast2obj_typeparam);
+ if (!value) goto failed;
+ if (PyObject_SetAttr(result, state->typeparams, value) == -1)
+ goto failed;
+ Py_DECREF(value);
value = ast2obj_arguments(state, o->v.AsyncFunctionDef.args);
if (!value) goto failed;
if (PyObject_SetAttr(result, state->args, value) == -1)
@@ -3783,6 +3970,12 @@ ast2obj_stmt(struct ast_state *state, void* _o)
if (PyObject_SetAttr(result, state->name, value) == -1)
goto failed;
Py_DECREF(value);
+ value = ast2obj_list(state, (asdl_seq*)o->v.ClassDef.typeparams,
+ ast2obj_typeparam);
+ if (!value) goto failed;
+ if (PyObject_SetAttr(result, state->typeparams, value) == -1)
+ goto failed;
+ Py_DECREF(value);
value = ast2obj_list(state, (asdl_seq*)o->v.ClassDef.bases,
ast2obj_expr);
if (!value) goto failed;
@@ -3850,6 +4043,27 @@ ast2obj_stmt(struct ast_state *state, void* _o)
goto failed;
Py_DECREF(value);
break;
+ case TypeAlias_kind:
+ tp = (PyTypeObject *)state->TypeAlias_type;
+ result = PyType_GenericNew(tp, NULL, NULL);
+ if (!result) goto failed;
+ value = ast2obj_expr(state, o->v.TypeAlias.name);
+ if (!value) goto failed;
+ if (PyObject_SetAttr(result, state->name, value) == -1)
+ goto failed;
+ Py_DECREF(value);
+ value = ast2obj_list(state, (asdl_seq*)o->v.TypeAlias.typeparams,
+ ast2obj_typeparam);
+ if (!value) goto failed;
+ if (PyObject_SetAttr(result, state->typeparams, value) == -1)
+ goto failed;
+ Py_DECREF(value);
+ value = ast2obj_expr(state, o->v.TypeAlias.value);
+ if (!value) goto failed;
+ if (PyObject_SetAttr(result, state->value, value) == -1)
+ goto failed;
+ Py_DECREF(value);
+ break;
case AugAssign_kind:
tp = (PyTypeObject *)state->AugAssign_type;
result = PyType_GenericNew(tp, NULL, NULL);
@@ -5441,6 +5655,85 @@ failed:
return NULL;
}
+PyObject*
+ast2obj_typeparam(struct ast_state *state, void* _o)
+{
+ typeparam_ty o = (typeparam_ty)_o;
+ PyObject *result = NULL, *value = NULL;
+ PyTypeObject *tp;
+ if (!o) {
+ Py_RETURN_NONE;
+ }
+ if (++state->recursion_depth > state->recursion_limit) {
+ PyErr_SetString(PyExc_RecursionError,
+ "maximum recursion depth exceeded during ast construction");
+ return 0;
+ }
+ switch (o->kind) {
+ case TypeVar_kind:
+ tp = (PyTypeObject *)state->TypeVar_type;
+ result = PyType_GenericNew(tp, NULL, NULL);
+ if (!result) goto failed;
+ value = ast2obj_identifier(state, o->v.TypeVar.name);
+ if (!value) goto failed;
+ if (PyObject_SetAttr(result, state->name, value) == -1)
+ goto failed;
+ Py_DECREF(value);
+ value = ast2obj_expr(state, o->v.TypeVar.bound);
+ if (!value) goto failed;
+ if (PyObject_SetAttr(result, state->bound, value) == -1)
+ goto failed;
+ Py_DECREF(value);
+ break;
+ case ParamSpec_kind:
+ tp = (PyTypeObject *)state->ParamSpec_type;
+ result = PyType_GenericNew(tp, NULL, NULL);
+ if (!result) goto failed;
+ value = ast2obj_identifier(state, o->v.ParamSpec.name);
+ if (!value) goto failed;
+ if (PyObject_SetAttr(result, state->name, value) == -1)
+ goto failed;
+ Py_DECREF(value);
+ break;
+ case TypeVarTuple_kind:
+ tp = (PyTypeObject *)state->TypeVarTuple_type;
+ result = PyType_GenericNew(tp, NULL, NULL);
+ if (!result) goto failed;
+ value = ast2obj_identifier(state, o->v.TypeVarTuple.name);
+ if (!value) goto failed;
+ if (PyObject_SetAttr(result, state->name, value) == -1)
+ goto failed;
+ Py_DECREF(value);
+ break;
+ }
+ value = ast2obj_int(state, o->lineno);
+ if (!value) goto failed;
+ if (PyObject_SetAttr(result, state->lineno, value) < 0)
+ goto failed;
+ Py_DECREF(value);
+ value = ast2obj_int(state, o->col_offset);
+ if (!value) goto failed;
+ if (PyObject_SetAttr(result, state->col_offset, value) < 0)
+ goto failed;
+ Py_DECREF(value);
+ value = ast2obj_int(state, o->end_lineno);
+ if (!value) goto failed;
+ if (PyObject_SetAttr(result, state->end_lineno, value) < 0)
+ goto failed;
+ Py_DECREF(value);
+ value = ast2obj_int(state, o->end_col_offset);
+ if (!value) goto failed;
+ if (PyObject_SetAttr(result, state->end_col_offset, value) < 0)
+ goto failed;
+ Py_DECREF(value);
+ state->recursion_depth--;
+ return result;
+failed:
+ Py_XDECREF(value);
+ Py_XDECREF(result);
+ return NULL;
+}
+
int
obj2ast_mod(struct ast_state *state, PyObject* obj, mod_ty* out, PyArena* arena)
@@ -5781,6 +6074,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena*
}
if (isinstance) {
identifier name;
+ asdl_typeparam_seq* typeparams;
arguments_ty args;
asdl_stmt_seq* body;
asdl_expr_seq* decorator_list;
@@ -5804,6 +6098,42 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena*
if (res != 0) goto failed;
Py_CLEAR(tmp);
}
+ if (_PyObject_LookupAttr(obj, state->typeparams, &tmp) < 0) {
+ return 1;
+ }
+ if (tmp == NULL) {
+ PyErr_SetString(PyExc_TypeError, "required field \"typeparams\" missing from FunctionDef");
+ return 1;
+ }
+ else {
+ int res;
+ Py_ssize_t len;
+ Py_ssize_t i;
+ if (!PyList_Check(tmp)) {
+ PyErr_Format(PyExc_TypeError, "FunctionDef field \"typeparams\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp)));
+ goto failed;
+ }
+ len = PyList_GET_SIZE(tmp);
+ typeparams = _Py_asdl_typeparam_seq_new(len, arena);
+ if (typeparams == NULL) goto failed;
+ for (i = 0; i < len; i++) {
+ typeparam_ty val;
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
+ if (_Py_EnterRecursiveCall(" while traversing 'FunctionDef' node")) {
+ goto failed;
+ }
+ res = obj2ast_typeparam(state, tmp2, &val, arena);
+ _Py_LeaveRecursiveCall();
+ Py_DECREF(tmp2);
+ if (res != 0) goto failed;
+ if (len != PyList_GET_SIZE(tmp)) {
+ PyErr_SetString(PyExc_RuntimeError, "FunctionDef field \"typeparams\" changed size during iteration");
+ goto failed;
+ }
+ asdl_seq_SET(typeparams, i, val);
+ }
+ Py_CLEAR(tmp);
+ }
if (_PyObject_LookupAttr(obj, state->args, &tmp) < 0) {
return 1;
}
@@ -5927,9 +6257,9 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena*
if (res != 0) goto failed;
Py_CLEAR(tmp);
}
- *out = _PyAST_FunctionDef(name, args, body, decorator_list, returns,
- type_comment, lineno, col_offset, end_lineno,
- end_col_offset, arena);
+ *out = _PyAST_FunctionDef(name, typeparams, args, body, decorator_list,
+ returns, type_comment, lineno, col_offset,
+ end_lineno, end_col_offset, arena);
if (*out == NULL) goto failed;
return 0;
}
@@ -5940,6 +6270,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena*
}
if (isinstance) {
identifier name;
+ asdl_typeparam_seq* typeparams;
arguments_ty args;
asdl_stmt_seq* body;
asdl_expr_seq* decorator_list;
@@ -5963,6 +6294,42 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena*
if (res != 0) goto failed;
Py_CLEAR(tmp);
}
+ if (_PyObject_LookupAttr(obj, state->typeparams, &tmp) < 0) {
+ return 1;
+ }
+ if (tmp == NULL) {
+ PyErr_SetString(PyExc_TypeError, "required field \"typeparams\" missing from AsyncFunctionDef");
+ return 1;
+ }
+ else {
+ int res;
+ Py_ssize_t len;
+ Py_ssize_t i;
+ if (!PyList_Check(tmp)) {
+ PyErr_Format(PyExc_TypeError, "AsyncFunctionDef field \"typeparams\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp)));
+ goto failed;
+ }
+ len = PyList_GET_SIZE(tmp);
+ typeparams = _Py_asdl_typeparam_seq_new(len, arena);
+ if (typeparams == NULL) goto failed;
+ for (i = 0; i < len; i++) {
+ typeparam_ty val;
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
+ if (_Py_EnterRecursiveCall(" while traversing 'AsyncFunctionDef' node")) {
+ goto failed;
+ }
+ res = obj2ast_typeparam(state, tmp2, &val, arena);
+ _Py_LeaveRecursiveCall();
+ Py_DECREF(tmp2);
+ if (res != 0) goto failed;
+ if (len != PyList_GET_SIZE(tmp)) {
+ PyErr_SetString(PyExc_RuntimeError, "AsyncFunctionDef field \"typeparams\" changed size during iteration");
+ goto failed;
+ }
+ asdl_seq_SET(typeparams, i, val);
+ }
+ Py_CLEAR(tmp);
+ }
if (_PyObject_LookupAttr(obj, state->args, &tmp) < 0) {
return 1;
}
@@ -6086,10 +6453,10 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena*
if (res != 0) goto failed;
Py_CLEAR(tmp);
}
- *out = _PyAST_AsyncFunctionDef(name, args, body, decorator_list,
- returns, type_comment, lineno,
- col_offset, end_lineno, end_col_offset,
- arena);
+ *out = _PyAST_AsyncFunctionDef(name, typeparams, args, body,
+ decorator_list, returns, type_comment,
+ lineno, col_offset, end_lineno,
+ end_col_offset, arena);
if (*out == NULL) goto failed;
return 0;
}
@@ -6100,6 +6467,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena*
}
if (isinstance) {
identifier name;
+ asdl_typeparam_seq* typeparams;
asdl_expr_seq* bases;
asdl_keyword_seq* keywords;
asdl_stmt_seq* body;
@@ -6122,6 +6490,42 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena*
if (res != 0) goto failed;
Py_CLEAR(tmp);
}
+ if (_PyObject_LookupAttr(obj, state->typeparams, &tmp) < 0) {
+ return 1;
+ }
+ if (tmp == NULL) {
+ PyErr_SetString(PyExc_TypeError, "required field \"typeparams\" missing from ClassDef");
+ return 1;
+ }
+ else {
+ int res;
+ Py_ssize_t len;
+ Py_ssize_t i;
+ if (!PyList_Check(tmp)) {
+ PyErr_Format(PyExc_TypeError, "ClassDef field \"typeparams\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp)));
+ goto failed;
+ }
+ len = PyList_GET_SIZE(tmp);
+ typeparams = _Py_asdl_typeparam_seq_new(len, arena);
+ if (typeparams == NULL) goto failed;
+ for (i = 0; i < len; i++) {
+ typeparam_ty val;
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
+ if (_Py_EnterRecursiveCall(" while traversing 'ClassDef' node")) {
+ goto failed;
+ }
+ res = obj2ast_typeparam(state, tmp2, &val, arena);
+ _Py_LeaveRecursiveCall();
+ Py_DECREF(tmp2);
+ if (res != 0) goto failed;
+ if (len != PyList_GET_SIZE(tmp)) {
+ PyErr_SetString(PyExc_RuntimeError, "ClassDef field \"typeparams\" changed size during iteration");
+ goto failed;
+ }
+ asdl_seq_SET(typeparams, i, val);
+ }
+ Py_CLEAR(tmp);
+ }
if (_PyObject_LookupAttr(obj, state->bases, &tmp) < 0) {
return 1;
}
@@ -6266,9 +6670,9 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena*
}
Py_CLEAR(tmp);
}
- *out = _PyAST_ClassDef(name, bases, keywords, body, decorator_list,
- lineno, col_offset, end_lineno, end_col_offset,
- arena);
+ *out = _PyAST_ClassDef(name, typeparams, bases, keywords, body,
+ decorator_list, lineno, col_offset, end_lineno,
+ end_col_offset, arena);
if (*out == NULL) goto failed;
return 0;
}
@@ -6436,6 +6840,91 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena*
if (*out == NULL) goto failed;
return 0;
}
+ tp = state->TypeAlias_type;
+ isinstance = PyObject_IsInstance(obj, tp);
+ if (isinstance == -1) {
+ return 1;
+ }
+ if (isinstance) {
+ expr_ty name;
+ asdl_typeparam_seq* typeparams;
+ expr_ty value;
+
+ if (_PyObject_LookupAttr(obj, state->name, &tmp) < 0) {
+ return 1;
+ }
+ if (tmp == NULL) {
+ PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from TypeAlias");
+ return 1;
+ }
+ else {
+ int res;
+ if (_Py_EnterRecursiveCall(" while traversing 'TypeAlias' node")) {
+ goto failed;
+ }
+ res = obj2ast_expr(state, tmp, &name, arena);
+ _Py_LeaveRecursiveCall();
+ if (res != 0) goto failed;
+ Py_CLEAR(tmp);
+ }
+ if (_PyObject_LookupAttr(obj, state->typeparams, &tmp) < 0) {
+ return 1;
+ }
+ if (tmp == NULL) {
+ PyErr_SetString(PyExc_TypeError, "required field \"typeparams\" missing from TypeAlias");
+ return 1;
+ }
+ else {
+ int res;
+ Py_ssize_t len;
+ Py_ssize_t i;
+ if (!PyList_Check(tmp)) {
+ PyErr_Format(PyExc_TypeError, "TypeAlias field \"typeparams\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp)));
+ goto failed;
+ }
+ len = PyList_GET_SIZE(tmp);
+ typeparams = _Py_asdl_typeparam_seq_new(len, arena);
+ if (typeparams == NULL) goto failed;
+ for (i = 0; i < len; i++) {
+ typeparam_ty val;
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
+ if (_Py_EnterRecursiveCall(" while traversing 'TypeAlias' node")) {
+ goto failed;
+ }
+ res = obj2ast_typeparam(state, tmp2, &val, arena);
+ _Py_LeaveRecursiveCall();
+ Py_DECREF(tmp2);
+ if (res != 0) goto failed;
+ if (len != PyList_GET_SIZE(tmp)) {
+ PyErr_SetString(PyExc_RuntimeError, "TypeAlias field \"typeparams\" changed size during iteration");
+ goto failed;
+ }
+ asdl_seq_SET(typeparams, i, val);
+ }
+ Py_CLEAR(tmp);
+ }
+ if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
+ return 1;
+ }
+ if (tmp == NULL) {
+ PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from TypeAlias");
+ return 1;
+ }
+ else {
+ int res;
+ if (_Py_EnterRecursiveCall(" while traversing 'TypeAlias' node")) {
+ goto failed;
+ }
+ res = obj2ast_expr(state, tmp, &value, arena);
+ _Py_LeaveRecursiveCall();
+ if (res != 0) goto failed;
+ Py_CLEAR(tmp);
+ }
+ *out = _PyAST_TypeAlias(name, typeparams, value, lineno, col_offset,
+ end_lineno, end_col_offset, arena);
+ if (*out == NULL) goto failed;
+ return 0;
+ }
tp = state->AugAssign_type;
isinstance = PyObject_IsInstance(obj, tp);
if (isinstance == -1) {
@@ -11803,6 +12292,206 @@ obj2ast_type_ignore(struct ast_state *state, PyObject* obj, type_ignore_ty*
return 1;
}
+int
+obj2ast_typeparam(struct ast_state *state, PyObject* obj, typeparam_ty* out,
+ PyArena* arena)
+{
+ int isinstance;
+
+ PyObject *tmp = NULL;
+ PyObject *tp;
+ int lineno;
+ int col_offset;
+ int end_lineno;
+ int end_col_offset;
+
+ if (obj == Py_None) {
+ *out = NULL;
+ return 0;
+ }
+ if (_PyObject_LookupAttr(obj, state->lineno, &tmp) < 0) {
+ return 1;
+ }
+ if (tmp == NULL) {
+ PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from typeparam");
+ return 1;
+ }
+ else {
+ int res;
+ if (_Py_EnterRecursiveCall(" while traversing 'typeparam' node")) {
+ goto failed;
+ }
+ res = obj2ast_int(state, tmp, &lineno, arena);
+ _Py_LeaveRecursiveCall();
+ if (res != 0) goto failed;
+ Py_CLEAR(tmp);
+ }
+ if (_PyObject_LookupAttr(obj, state->col_offset, &tmp) < 0) {
+ return 1;
+ }
+ if (tmp == NULL) {
+ PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from typeparam");
+ return 1;
+ }
+ else {
+ int res;
+ if (_Py_EnterRecursiveCall(" while traversing 'typeparam' node")) {
+ goto failed;
+ }
+ res = obj2ast_int(state, tmp, &col_offset, arena);
+ _Py_LeaveRecursiveCall();
+ if (res != 0) goto failed;
+ Py_CLEAR(tmp);
+ }
+ if (_PyObject_LookupAttr(obj, state->end_lineno, &tmp) < 0) {
+ return 1;
+ }
+ if (tmp == NULL || tmp == Py_None) {
+ Py_CLEAR(tmp);
+ end_lineno = lineno;
+ }
+ else {
+ int res;
+ if (_Py_EnterRecursiveCall(" while traversing 'typeparam' node")) {
+ goto failed;
+ }
+ res = obj2ast_int(state, tmp, &end_lineno, arena);
+ _Py_LeaveRecursiveCall();
+ if (res != 0) goto failed;
+ Py_CLEAR(tmp);
+ }
+ if (_PyObject_LookupAttr(obj, state->end_col_offset, &tmp) < 0) {
+ return 1;
+ }
+ if (tmp == NULL || tmp == Py_None) {
+ Py_CLEAR(tmp);
+ end_col_offset = col_offset;
+ }
+ else {
+ int res;
+ if (_Py_EnterRecursiveCall(" while traversing 'typeparam' node")) {
+ goto failed;
+ }
+ res = obj2ast_int(state, tmp, &end_col_offset, arena);
+ _Py_LeaveRecursiveCall();
+ if (res != 0) goto failed;
+ Py_CLEAR(tmp);
+ }
+ tp = state->TypeVar_type;
+ isinstance = PyObject_IsInstance(obj, tp);
+ if (isinstance == -1) {
+ return 1;
+ }
+ if (isinstance) {
+ identifier name;
+ expr_ty bound;
+
+ if (_PyObject_LookupAttr(obj, state->name, &tmp) < 0) {
+ return 1;
+ }
+ if (tmp == NULL) {
+ PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from TypeVar");
+ return 1;
+ }
+ else {
+ int res;
+ if (_Py_EnterRecursiveCall(" while traversing 'TypeVar' node")) {
+ goto failed;
+ }
+ res = obj2ast_identifier(state, tmp, &name, arena);
+ _Py_LeaveRecursiveCall();
+ if (res != 0) goto failed;
+ Py_CLEAR(tmp);
+ }
+ if (_PyObject_LookupAttr(obj, state->bound, &tmp) < 0) {
+ return 1;
+ }
+ if (tmp == NULL || tmp == Py_None) {
+ Py_CLEAR(tmp);
+ bound = NULL;
+ }
+ else {
+ int res;
+ if (_Py_EnterRecursiveCall(" while traversing 'TypeVar' node")) {
+ goto failed;
+ }
+ res = obj2ast_expr(state, tmp, &bound, arena);
+ _Py_LeaveRecursiveCall();
+ if (res != 0) goto failed;
+ Py_CLEAR(tmp);
+ }
+ *out = _PyAST_TypeVar(name, bound, lineno, col_offset, end_lineno,
+ end_col_offset, arena);
+ if (*out == NULL) goto failed;
+ return 0;
+ }
+ tp = state->ParamSpec_type;
+ isinstance = PyObject_IsInstance(obj, tp);
+ if (isinstance == -1) {
+ return 1;
+ }
+ if (isinstance) {
+ identifier name;
+
+ if (_PyObject_LookupAttr(obj, state->name, &tmp) < 0) {
+ return 1;
+ }
+ if (tmp == NULL) {
+ PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from ParamSpec");
+ return 1;
+ }
+ else {
+ int res;
+ if (_Py_EnterRecursiveCall(" while traversing 'ParamSpec' node")) {
+ goto failed;
+ }
+ res = obj2ast_identifier(state, tmp, &name, arena);
+ _Py_LeaveRecursiveCall();
+ if (res != 0) goto failed;
+ Py_CLEAR(tmp);
+ }
+ *out = _PyAST_ParamSpec(name, lineno, col_offset, end_lineno,
+ end_col_offset, arena);
+ if (*out == NULL) goto failed;
+ return 0;
+ }
+ tp = state->TypeVarTuple_type;
+ isinstance = PyObject_IsInstance(obj, tp);
+ if (isinstance == -1) {
+ return 1;
+ }
+ if (isinstance) {
+ identifier name;
+
+ if (_PyObject_LookupAttr(obj, state->name, &tmp) < 0) {
+ return 1;
+ }
+ if (tmp == NULL) {
+ PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from TypeVarTuple");
+ return 1;
+ }
+ else {
+ int res;
+ if (_Py_EnterRecursiveCall(" while traversing 'TypeVarTuple' node")) {
+ goto failed;
+ }
+ res = obj2ast_identifier(state, tmp, &name, arena);
+ _Py_LeaveRecursiveCall();
+ if (res != 0) goto failed;
+ Py_CLEAR(tmp);
+ }
+ *out = _PyAST_TypeVarTuple(name, lineno, col_offset, end_lineno,
+ end_col_offset, arena);
+ if (*out == NULL) goto failed;
+ return 0;
+ }
+
+ PyErr_Format(PyExc_TypeError, "expected some sort of typeparam, but got %R", obj);
+ failed:
+ Py_XDECREF(tmp);
+ return 1;
+}
+
static int
astmodule_exec(PyObject *m)
@@ -11861,6 +12550,9 @@ astmodule_exec(PyObject *m)
if (PyModule_AddObjectRef(m, "Assign", state->Assign_type) < 0) {
return -1;
}
+ if (PyModule_AddObjectRef(m, "TypeAlias", state->TypeAlias_type) < 0) {
+ return -1;
+ }
if (PyModule_AddObjectRef(m, "AugAssign", state->AugAssign_type) < 0) {
return -1;
}
@@ -12188,6 +12880,19 @@ astmodule_exec(PyObject *m)
if (PyModule_AddObjectRef(m, "TypeIgnore", state->TypeIgnore_type) < 0) {
return -1;
}
+ if (PyModule_AddObjectRef(m, "typeparam", state->typeparam_type) < 0) {
+ return -1;
+ }
+ if (PyModule_AddObjectRef(m, "TypeVar", state->TypeVar_type) < 0) {
+ return -1;
+ }
+ if (PyModule_AddObjectRef(m, "ParamSpec", state->ParamSpec_type) < 0) {
+ return -1;
+ }
+ if (PyModule_AddObjectRef(m, "TypeVarTuple", state->TypeVarTuple_type) < 0)
+ {
+ return -1;
+ }
return 0;
}
diff --git a/Python/ast.c b/Python/ast.c
index f079e64..0844f2a 100644
--- a/Python/ast.c
+++ b/Python/ast.c
@@ -17,10 +17,12 @@ struct validator {
static int validate_stmts(struct validator *, asdl_stmt_seq *);
static int validate_exprs(struct validator *, asdl_expr_seq *, expr_context_ty, int);
static int validate_patterns(struct validator *, asdl_pattern_seq *, int);
+static int validate_typeparams(struct validator *, asdl_typeparam_seq *);
static int _validate_nonempty_seq(asdl_seq *, const char *, const char *);
static int validate_stmt(struct validator *, stmt_ty);
static int validate_expr(struct validator *, expr_ty, expr_context_ty);
static int validate_pattern(struct validator *, pattern_ty, int);
+static int validate_typeparam(struct validator *, typeparam_ty);
#define VALIDATE_POSITIONS(node) \
if (node->lineno > node->end_lineno) { \
@@ -726,6 +728,7 @@ validate_stmt(struct validator *state, stmt_ty stmt)
switch (stmt->kind) {
case FunctionDef_kind:
ret = validate_body(state, stmt->v.FunctionDef.body, "FunctionDef") &&
+ validate_typeparams(state, stmt->v.FunctionDef.typeparams) &&
validate_arguments(state, stmt->v.FunctionDef.args) &&
validate_exprs(state, stmt->v.FunctionDef.decorator_list, Load, 0) &&
(!stmt->v.FunctionDef.returns ||
@@ -733,6 +736,7 @@ validate_stmt(struct validator *state, stmt_ty stmt)
break;
case ClassDef_kind:
ret = validate_body(state, stmt->v.ClassDef.body, "ClassDef") &&
+ validate_typeparams(state, stmt->v.ClassDef.typeparams) &&
validate_exprs(state, stmt->v.ClassDef.bases, Load, 0) &&
validate_keywords(state, stmt->v.ClassDef.keywords) &&
validate_exprs(state, stmt->v.ClassDef.decorator_list, Load, 0);
@@ -763,6 +767,11 @@ validate_stmt(struct validator *state, stmt_ty stmt)
validate_expr(state, stmt->v.AnnAssign.value, Load)) &&
validate_expr(state, stmt->v.AnnAssign.annotation, Load);
break;
+ case TypeAlias_kind:
+ ret = validate_expr(state, stmt->v.TypeAlias.name, Store) &&
+ validate_typeparams(state, stmt->v.TypeAlias.typeparams) &&
+ validate_expr(state, stmt->v.TypeAlias.value, Load);
+ break;
case For_kind:
ret = validate_expr(state, stmt->v.For.target, Store) &&
validate_expr(state, stmt->v.For.iter, Load) &&
@@ -910,6 +919,7 @@ validate_stmt(struct validator *state, stmt_ty stmt)
break;
case AsyncFunctionDef_kind:
ret = validate_body(state, stmt->v.AsyncFunctionDef.body, "AsyncFunctionDef") &&
+ validate_typeparams(state, stmt->v.AsyncFunctionDef.typeparams) &&
validate_arguments(state, stmt->v.AsyncFunctionDef.args) &&
validate_exprs(state, stmt->v.AsyncFunctionDef.decorator_list, Load, 0) &&
(!stmt->v.AsyncFunctionDef.returns ||
@@ -982,6 +992,41 @@ validate_patterns(struct validator *state, asdl_pattern_seq *patterns, int star_
return 1;
}
+static int
+validate_typeparam(struct validator *state, typeparam_ty tp)
+{
+ VALIDATE_POSITIONS(tp);
+ int ret = -1;
+ switch (tp->kind) {
+ case TypeVar_kind:
+ ret = validate_name(tp->v.TypeVar.name) &&
+ (!tp->v.TypeVar.bound ||
+ validate_expr(state, tp->v.TypeVar.bound, Load));
+ break;
+ case ParamSpec_kind:
+ ret = validate_name(tp->v.ParamSpec.name);
+ break;
+ case TypeVarTuple_kind:
+ ret = validate_name(tp->v.TypeVarTuple.name);
+ break;
+ }
+ return ret;
+}
+
+static int
+validate_typeparams(struct validator *state, asdl_typeparam_seq *tps)
+{
+ Py_ssize_t i;
+ for (i = 0; i < asdl_seq_LEN(tps); i++) {
+ typeparam_ty tp = asdl_seq_GET(tps, i);
+ if (tp) {
+ if (!validate_typeparam(state, tp))
+ return 0;
+ }
+ }
+ return 1;
+}
+
/* See comments in symtable.c. */
#define COMPILER_STACK_FRAME_SCALE 3
diff --git a/Python/ast_opt.c b/Python/ast_opt.c
index 3883ec9..c5b3e07 100644
--- a/Python/ast_opt.c
+++ b/Python/ast_opt.c
@@ -642,6 +642,7 @@ static int astfold_withitem(withitem_ty node_, PyArena *ctx_, _PyASTOptimizeStat
static int astfold_excepthandler(excepthandler_ty node_, PyArena *ctx_, _PyASTOptimizeState *state);
static int astfold_match_case(match_case_ty node_, PyArena *ctx_, _PyASTOptimizeState *state);
static int astfold_pattern(pattern_ty node_, PyArena *ctx_, _PyASTOptimizeState *state);
+static int astfold_typeparam(typeparam_ty node_, PyArena *ctx_, _PyASTOptimizeState *state);
#define CALL(FUNC, TYPE, ARG) \
if (!FUNC((ARG), ctx_, state)) \
@@ -880,6 +881,7 @@ astfold_stmt(stmt_ty node_, PyArena *ctx_, _PyASTOptimizeState *state)
}
switch (node_->kind) {
case FunctionDef_kind:
+ CALL_SEQ(astfold_typeparam, typeparam, node_->v.FunctionDef.typeparams);
CALL(astfold_arguments, arguments_ty, node_->v.FunctionDef.args);
CALL(astfold_body, asdl_seq, node_->v.FunctionDef.body);
CALL_SEQ(astfold_expr, expr, node_->v.FunctionDef.decorator_list);
@@ -888,6 +890,7 @@ astfold_stmt(stmt_ty node_, PyArena *ctx_, _PyASTOptimizeState *state)
}
break;
case AsyncFunctionDef_kind:
+ CALL_SEQ(astfold_typeparam, typeparam, node_->v.AsyncFunctionDef.typeparams);
CALL(astfold_arguments, arguments_ty, node_->v.AsyncFunctionDef.args);
CALL(astfold_body, asdl_seq, node_->v.AsyncFunctionDef.body);
CALL_SEQ(astfold_expr, expr, node_->v.AsyncFunctionDef.decorator_list);
@@ -896,6 +899,7 @@ astfold_stmt(stmt_ty node_, PyArena *ctx_, _PyASTOptimizeState *state)
}
break;
case ClassDef_kind:
+ CALL_SEQ(astfold_typeparam, typeparam, node_->v.ClassDef.typeparams);
CALL_SEQ(astfold_expr, expr, node_->v.ClassDef.bases);
CALL_SEQ(astfold_keyword, keyword, node_->v.ClassDef.keywords);
CALL(astfold_body, asdl_seq, node_->v.ClassDef.body);
@@ -922,6 +926,11 @@ astfold_stmt(stmt_ty node_, PyArena *ctx_, _PyASTOptimizeState *state)
}
CALL_OPT(astfold_expr, expr_ty, node_->v.AnnAssign.value);
break;
+ case TypeAlias_kind:
+ CALL(astfold_expr, expr_ty, node_->v.TypeAlias.name);
+ CALL_SEQ(astfold_typeparam, typeparam, node_->v.TypeAlias.typeparams);
+ CALL(astfold_expr, expr_ty, node_->v.TypeAlias.value);
+ break;
case For_kind:
CALL(astfold_expr, expr_ty, node_->v.For.target);
CALL(astfold_expr, expr_ty, node_->v.For.iter);
@@ -1074,6 +1083,21 @@ astfold_match_case(match_case_ty node_, PyArena *ctx_, _PyASTOptimizeState *stat
return 1;
}
+static int
+astfold_typeparam(typeparam_ty node_, PyArena *ctx_, _PyASTOptimizeState *state)
+{
+ switch (node_->kind) {
+ case TypeVar_kind:
+ CALL_OPT(astfold_expr, expr_ty, node_->v.TypeVar.bound);
+ break;
+ case ParamSpec_kind:
+ break;
+ case TypeVarTuple_kind:
+ break;
+ }
+ return 1;
+}
+
#undef CALL
#undef CALL_OPT
#undef CALL_SEQ
diff --git a/Python/bytecodes.c b/Python/bytecodes.c
index d84a078..1b8820f 100644
--- a/Python/bytecodes.c
+++ b/Python/bytecodes.c
@@ -56,7 +56,7 @@ static PyObject *value, *value1, *value2, *left, *right, *res, *sum, *prod, *sub
static PyObject *container, *start, *stop, *v, *lhs, *rhs, *res2;
static PyObject *list, *tuple, *dict, *owner, *set, *str, *tup, *map, *keys;
static PyObject *exit_func, *lasti, *val, *retval, *obj, *iter;
-static PyObject *aiter, *awaitable, *iterable, *w, *exc_value, *bc;
+static PyObject *aiter, *awaitable, *iterable, *w, *exc_value, *bc, *locals;
static PyObject *orig, *excs, *update, *b, *fromlist, *level, *from;
static PyObject **pieces, **values;
static size_t jump;
@@ -125,6 +125,7 @@ dummy_func(
PyObject *subject;
PyObject *top;
PyObject *type;
+ PyObject *typevars;
int values_or_none;
switch (opcode) {
@@ -1002,6 +1003,7 @@ dummy_func(
}
}
+
inst(STORE_NAME, (v -- )) {
PyObject *name = GETITEM(frame->f_code->co_names, oparg);
PyObject *ns = LOCALS();
@@ -1158,31 +1160,41 @@ dummy_func(
}
}
- inst(LOAD_NAME, ( -- v)) {
- PyObject *name = GETITEM(frame->f_code->co_names, oparg);
- PyObject *locals = LOCALS();
+ op(_LOAD_LOCALS, ( -- locals)) {
+ locals = LOCALS();
if (locals == NULL) {
- _PyErr_Format(tstate, PyExc_SystemError,
- "no locals when loading %R", name);
- goto error;
+ _PyErr_SetString(tstate, PyExc_SystemError,
+ "no locals found");
+ ERROR_IF(true, error);
}
- if (PyDict_CheckExact(locals)) {
- v = PyDict_GetItemWithError(locals, name);
+ Py_INCREF(locals);
+ }
+
+ macro(LOAD_LOCALS) = _LOAD_LOCALS;
+
+ op(_LOAD_FROM_DICT_OR_GLOBALS, (mod_or_class_dict -- v)) {
+ PyObject *name = GETITEM(frame->f_code->co_names, oparg);
+ if (PyDict_CheckExact(mod_or_class_dict)) {
+ v = PyDict_GetItemWithError(mod_or_class_dict, name);
if (v != NULL) {
Py_INCREF(v);
}
else if (_PyErr_Occurred(tstate)) {
+ Py_DECREF(mod_or_class_dict);
goto error;
}
}
else {
- v = PyObject_GetItem(locals, name);
+ v = PyObject_GetItem(mod_or_class_dict, name);
if (v == NULL) {
- if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError))
+ if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
+ Py_DECREF(mod_or_class_dict);
goto error;
+ }
_PyErr_Clear(tstate);
}
}
+ Py_DECREF(mod_or_class_dict);
if (v == NULL) {
v = PyDict_GetItemWithError(GLOBALS(), name);
if (v != NULL) {
@@ -1219,6 +1231,10 @@ dummy_func(
}
}
+ macro(LOAD_NAME) = _LOAD_LOCALS + _LOAD_FROM_DICT_OR_GLOBALS;
+
+ macro(LOAD_FROM_DICT_OR_GLOBALS) = _LOAD_FROM_DICT_OR_GLOBALS;
+
family(load_global, INLINE_CACHE_ENTRIES_LOAD_GLOBAL) = {
LOAD_GLOBAL,
LOAD_GLOBAL_MODULE,
@@ -1339,29 +1355,32 @@ dummy_func(
Py_DECREF(oldobj);
}
- inst(LOAD_CLASSDEREF, ( -- value)) {
- PyObject *name, *locals = LOCALS();
- assert(locals);
+ inst(LOAD_FROM_DICT_OR_DEREF, (class_dict -- value)) {
+ PyObject *name;
+ assert(class_dict);
assert(oparg >= 0 && oparg < frame->f_code->co_nlocalsplus);
name = PyTuple_GET_ITEM(frame->f_code->co_localsplusnames, oparg);
- if (PyDict_CheckExact(locals)) {
- value = PyDict_GetItemWithError(locals, name);
+ if (PyDict_CheckExact(class_dict)) {
+ value = PyDict_GetItemWithError(class_dict, name);
if (value != NULL) {
Py_INCREF(value);
}
else if (_PyErr_Occurred(tstate)) {
+ Py_DECREF(class_dict);
goto error;
}
}
else {
- value = PyObject_GetItem(locals, name);
+ value = PyObject_GetItem(class_dict, name);
if (value == NULL) {
if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
+ Py_DECREF(class_dict);
goto error;
}
_PyErr_Clear(tstate);
}
}
+ Py_DECREF(class_dict);
if (!value) {
PyObject *cell = GETLOCAL(oparg);
value = PyCell_GET(cell);
diff --git a/Python/compile.c b/Python/compile.c
index bf5e4a5..7adbf92 100644
--- a/Python/compile.c
+++ b/Python/compile.c
@@ -147,6 +147,7 @@ enum {
COMPILER_SCOPE_ASYNC_FUNCTION,
COMPILER_SCOPE_LAMBDA,
COMPILER_SCOPE_COMPREHENSION,
+ COMPILER_SCOPE_TYPEPARAMS,
};
@@ -231,6 +232,7 @@ instr_sequence_next_inst(instr_sequence *seq) {
&seq->s_allocated,
INITIAL_INSTR_SEQUENCE_SIZE,
sizeof(instruction)));
+ assert(seq->s_allocated >= 0);
assert(seq->s_used < seq->s_allocated);
return seq->s_used++;
}
@@ -714,6 +716,19 @@ compiler_set_qualname(struct compiler *c)
capsule = PyList_GET_ITEM(c->c_stack, stack_size - 1);
parent = (struct compiler_unit *)PyCapsule_GetPointer(capsule, CAPSULE_NAME);
assert(parent);
+ if (parent->u_scope_type == COMPILER_SCOPE_TYPEPARAMS) {
+ /* The parent is a type parameter scope, so we need to
+ look at the grandparent. */
+ if (stack_size == 2) {
+ // If we're immediately within the module, we can skip
+ // the rest and just set the qualname to be the same as name.
+ u->u_metadata.u_qualname = Py_NewRef(u->u_metadata.u_name);
+ return SUCCESS;
+ }
+ capsule = PyList_GET_ITEM(c->c_stack, stack_size - 2);
+ parent = (struct compiler_unit *)PyCapsule_GetPointer(capsule, CAPSULE_NAME);
+ assert(parent);
+ }
if (u->u_scope_type == COMPILER_SCOPE_FUNCTION
|| u->u_scope_type == COMPILER_SCOPE_ASYNC_FUNCTION
@@ -1114,16 +1129,18 @@ codegen_addop_j(instr_sequence *seq, location loc,
return instr_sequence_addop(seq, opcode, target.id, loc);
}
-#define ADDOP(C, LOC, OP) \
- RETURN_IF_ERROR(codegen_addop_noarg(INSTR_SEQUENCE(C), (OP), (LOC)))
-
-#define ADDOP_IN_SCOPE(C, LOC, OP) { \
- if (codegen_addop_noarg(INSTR_SEQUENCE(C), (OP), (LOC)) < 0) { \
- compiler_exit_scope(C); \
+#define RETURN_IF_ERROR_IN_SCOPE(C, CALL) { \
+ if ((CALL) < 0) { \
+ compiler_exit_scope((C)); \
return ERROR; \
} \
}
+#define ADDOP(C, LOC, OP) \
+ RETURN_IF_ERROR(codegen_addop_noarg(INSTR_SEQUENCE(C), (OP), (LOC)))
+
+#define ADDOP_IN_SCOPE(C, LOC, OP) RETURN_IF_ERROR_IN_SCOPE((C), codegen_addop_noarg(INSTR_SEQUENCE(C), (OP), (LOC)))
+
#define ADDOP_LOAD_CONST(C, LOC, O) \
RETURN_IF_ERROR(compiler_addop_load_const((C)->c_const_cache, (C)->u, (LOC), (O)))
@@ -1183,12 +1200,8 @@ codegen_addop_j(instr_sequence *seq, location loc,
#define VISIT(C, TYPE, V) \
RETURN_IF_ERROR(compiler_visit_ ## TYPE((C), (V)));
-#define VISIT_IN_SCOPE(C, TYPE, V) {\
- if (compiler_visit_ ## TYPE((C), (V)) < 0) { \
- compiler_exit_scope(C); \
- return ERROR; \
- } \
-}
+#define VISIT_IN_SCOPE(C, TYPE, V) \
+ RETURN_IF_ERROR_IN_SCOPE((C), compiler_visit_ ## TYPE((C), (V)))
#define VISIT_SEQ(C, TYPE, SEQ) { \
int _i; \
@@ -1252,6 +1265,16 @@ compiler_enter_scope(struct compiler *c, identifier name,
return ERROR;
}
}
+ if (u->u_ste->ste_needs_classdict) {
+ /* Cook up an implicit __classdict__ cell. */
+ Py_ssize_t res;
+ assert(u->u_scope_type == COMPILER_SCOPE_CLASS);
+ res = dict_add_o(u->u_metadata.u_cellvars, &_Py_ID(__classdict__));
+ if (res < 0) {
+ compiler_unit_free(u);
+ return ERROR;
+ }
+ }
u->u_metadata.u_freevars = dictbytype(u->u_ste->ste_symbols, FREE, DEF_FREE_CLASS,
PyDict_GET_SIZE(u->u_metadata.u_cellvars));
@@ -1718,8 +1741,10 @@ get_ref_type(struct compiler *c, PyObject *name)
{
int scope;
if (c->u->u_scope_type == COMPILER_SCOPE_CLASS &&
- _PyUnicode_EqualToASCIIString(name, "__class__"))
+ (_PyUnicode_EqualToASCIIString(name, "__class__") ||
+ _PyUnicode_EqualToASCIIString(name, "__classdict__"))) {
return CELL;
+ }
scope = _PyST_GetScope(c->u->u_ste, name);
if (scope == 0) {
PyErr_Format(PyExc_SystemError,
@@ -2085,26 +2110,81 @@ wrap_in_stopiteration_handler(struct compiler *c)
}
static int
-compiler_function(struct compiler *c, stmt_ty s, int is_async)
+compiler_type_params(struct compiler *c, asdl_typeparam_seq *typeparams)
+{
+ if (!typeparams) {
+ return SUCCESS;
+ }
+ Py_ssize_t n = asdl_seq_LEN(typeparams);
+
+ for (Py_ssize_t i = 0; i < n; i++) {
+ typeparam_ty typeparam = asdl_seq_GET(typeparams, i);
+ location loc = LOC(typeparam);
+ switch(typeparam->kind) {
+ case TypeVar_kind:
+ ADDOP_LOAD_CONST(c, loc, typeparam->v.TypeVar.name);
+ if (typeparam->v.TypeVar.bound) {
+ expr_ty bound = typeparam->v.TypeVar.bound;
+ if (compiler_enter_scope(c, typeparam->v.TypeVar.name, COMPILER_SCOPE_TYPEPARAMS,
+ (void *)typeparam, bound->lineno) == -1) {
+ return ERROR;
+ }
+ VISIT_IN_SCOPE(c, expr, bound);
+ ADDOP_IN_SCOPE(c, loc, RETURN_VALUE);
+ PyCodeObject *co = optimize_and_assemble(c, 1);
+ compiler_exit_scope(c);
+ if (co == NULL) {
+ return ERROR;
+ }
+ if (compiler_make_closure(c, loc, co, 0) < 0) {
+ Py_DECREF(co);
+ return ERROR;
+ }
+ Py_DECREF(co);
+
+ int intrinsic = bound->kind == Tuple_kind
+ ? INTRINSIC_TYPEVAR_WITH_CONSTRAINTS
+ : INTRINSIC_TYPEVAR_WITH_BOUND;
+ ADDOP_I(c, loc, CALL_INTRINSIC_2, intrinsic);
+ }
+ else {
+ ADDOP_I(c, loc, CALL_INTRINSIC_1, INTRINSIC_TYPEVAR);
+ }
+ ADDOP_I(c, loc, COPY, 1);
+ RETURN_IF_ERROR(compiler_nameop(c, loc, typeparam->v.TypeVar.name, Store));
+ break;
+ case TypeVarTuple_kind:
+ ADDOP_LOAD_CONST(c, loc, typeparam->v.TypeVarTuple.name);
+ ADDOP_I(c, loc, CALL_INTRINSIC_1, INTRINSIC_TYPEVARTUPLE);
+ ADDOP_I(c, loc, COPY, 1);
+ RETURN_IF_ERROR(compiler_nameop(c, loc, typeparam->v.TypeVarTuple.name, Store));
+ break;
+ case ParamSpec_kind:
+ ADDOP_LOAD_CONST(c, loc, typeparam->v.ParamSpec.name);
+ ADDOP_I(c, loc, CALL_INTRINSIC_1, INTRINSIC_PARAMSPEC);
+ ADDOP_I(c, loc, COPY, 1);
+ RETURN_IF_ERROR(compiler_nameop(c, loc, typeparam->v.ParamSpec.name, Store));
+ break;
+ }
+ }
+ ADDOP_I(c, LOC(asdl_seq_GET(typeparams, 0)), BUILD_TUPLE, n);
+ return SUCCESS;
+}
+
+static int
+compiler_function_body(struct compiler *c, stmt_ty s, int is_async, Py_ssize_t funcflags,
+ int firstlineno)
{
- PyCodeObject *co;
PyObject *docstring = NULL;
arguments_ty args;
- expr_ty returns;
identifier name;
- asdl_expr_seq* decos;
asdl_stmt_seq *body;
- Py_ssize_t i, funcflags;
- int annotations;
int scope_type;
- int firstlineno;
if (is_async) {
assert(s->kind == AsyncFunctionDef_kind);
args = s->v.AsyncFunctionDef.args;
- returns = s->v.AsyncFunctionDef.returns;
- decos = s->v.AsyncFunctionDef.decorator_list;
name = s->v.AsyncFunctionDef.name;
body = s->v.AsyncFunctionDef.body;
@@ -2113,33 +2193,12 @@ compiler_function(struct compiler *c, stmt_ty s, int is_async)
assert(s->kind == FunctionDef_kind);
args = s->v.FunctionDef.args;
- returns = s->v.FunctionDef.returns;
- decos = s->v.FunctionDef.decorator_list;
name = s->v.FunctionDef.name;
body = s->v.FunctionDef.body;
scope_type = COMPILER_SCOPE_FUNCTION;
}
- RETURN_IF_ERROR(compiler_check_debug_args(c, args));
- RETURN_IF_ERROR(compiler_decorators(c, decos));
-
- firstlineno = s->lineno;
- if (asdl_seq_LEN(decos)) {
- firstlineno = ((expr_ty)asdl_seq_GET(decos, 0))->lineno;
- }
-
- location loc = LOC(s);
- funcflags = compiler_default_arguments(c, loc, args);
- if (funcflags == -1) {
- return ERROR;
- }
- annotations = compiler_visit_annotations(c, loc, args, returns);
- RETURN_IF_ERROR(annotations);
- if (annotations > 0) {
- funcflags |= 0x04;
- }
-
RETURN_IF_ERROR(
compiler_enter_scope(c, name, scope_type, (void *)s, firstlineno));
@@ -2155,7 +2214,7 @@ compiler_function(struct compiler *c, stmt_ty s, int is_async)
c->u->u_metadata.u_argcount = asdl_seq_LEN(args->args);
c->u->u_metadata.u_posonlyargcount = asdl_seq_LEN(args->posonlyargs);
c->u->u_metadata.u_kwonlyargcount = asdl_seq_LEN(args->kwonlyargs);
- for (i = docstring ? 1 : 0; i < asdl_seq_LEN(body); i++) {
+ for (Py_ssize_t i = docstring ? 1 : 0; i < asdl_seq_LEN(body); i++) {
VISIT_IN_SCOPE(c, stmt, (stmt_ty)asdl_seq_GET(body, i));
}
if (c->u->u_ste->ste_coroutine || c->u->u_ste->ste_generator) {
@@ -2164,29 +2223,52 @@ compiler_function(struct compiler *c, stmt_ty s, int is_async)
return ERROR;
}
}
- co = optimize_and_assemble(c, 1);
+ PyCodeObject *co = optimize_and_assemble(c, 1);
compiler_exit_scope(c);
if (co == NULL) {
Py_XDECREF(co);
return ERROR;
}
+ location loc = LOC(s);
if (compiler_make_closure(c, loc, co, funcflags) < 0) {
Py_DECREF(co);
return ERROR;
}
Py_DECREF(co);
-
- RETURN_IF_ERROR(compiler_apply_decorators(c, decos));
- return compiler_nameop(c, loc, name, Store);
+ return SUCCESS;
}
static int
-compiler_class(struct compiler *c, stmt_ty s)
+compiler_function(struct compiler *c, stmt_ty s, int is_async)
{
- PyCodeObject *co;
- int i, firstlineno;
- asdl_expr_seq *decos = s->v.ClassDef.decorator_list;
+ arguments_ty args;
+ expr_ty returns;
+ identifier name;
+ asdl_expr_seq *decos;
+ asdl_typeparam_seq *typeparams;
+ Py_ssize_t funcflags;
+ int annotations;
+ int firstlineno;
+
+ if (is_async) {
+ assert(s->kind == AsyncFunctionDef_kind);
+ args = s->v.AsyncFunctionDef.args;
+ returns = s->v.AsyncFunctionDef.returns;
+ decos = s->v.AsyncFunctionDef.decorator_list;
+ name = s->v.AsyncFunctionDef.name;
+ typeparams = s->v.AsyncFunctionDef.typeparams;
+ } else {
+ assert(s->kind == FunctionDef_kind);
+
+ args = s->v.FunctionDef.args;
+ returns = s->v.FunctionDef.returns;
+ decos = s->v.FunctionDef.decorator_list;
+ name = s->v.FunctionDef.name;
+ typeparams = s->v.FunctionDef.typeparams;
+ }
+
+ RETURN_IF_ERROR(compiler_check_debug_args(c, args));
RETURN_IF_ERROR(compiler_decorators(c, decos));
firstlineno = s->lineno;
@@ -2194,6 +2276,108 @@ compiler_class(struct compiler *c, stmt_ty s)
firstlineno = ((expr_ty)asdl_seq_GET(decos, 0))->lineno;
}
+ location loc = LOC(s);
+
+ int is_generic = asdl_seq_LEN(typeparams) > 0;
+
+ if (is_generic) {
+ // Used by the CALL to the type parameters function.
+ ADDOP(c, loc, PUSH_NULL);
+ }
+
+ funcflags = compiler_default_arguments(c, loc, args);
+ if (funcflags == -1) {
+ return ERROR;
+ }
+
+ int num_typeparam_args = 0;
+
+ if (is_generic) {
+ if (funcflags & 0x01) {
+ num_typeparam_args += 1;
+ }
+ if (funcflags & 0x02) {
+ num_typeparam_args += 1;
+ }
+ if (num_typeparam_args == 2) {
+ ADDOP_I(c, loc, SWAP, 2);
+ }
+ PyObject *typeparams_name = PyUnicode_FromFormat("<generic parameters of %U>", name);
+ if (!typeparams_name) {
+ return ERROR;
+ }
+ if (compiler_enter_scope(c, typeparams_name, COMPILER_SCOPE_TYPEPARAMS,
+ (void *)typeparams, firstlineno) == -1) {
+ Py_DECREF(typeparams_name);
+ return ERROR;
+ }
+ Py_DECREF(typeparams_name);
+ RETURN_IF_ERROR_IN_SCOPE(c, compiler_type_params(c, typeparams));
+ if ((funcflags & 0x01) || (funcflags & 0x02)) {
+ RETURN_IF_ERROR_IN_SCOPE(c, codegen_addop_i(INSTR_SEQUENCE(c), LOAD_FAST, 0, loc));
+ }
+ if ((funcflags & 0x01) && (funcflags & 0x02)) {
+ RETURN_IF_ERROR_IN_SCOPE(c, codegen_addop_i(INSTR_SEQUENCE(c), LOAD_FAST, 1, loc));
+ }
+ }
+
+ annotations = compiler_visit_annotations(c, loc, args, returns);
+ if (annotations < 0) {
+ if (is_generic) {
+ compiler_exit_scope(c);
+ }
+ return ERROR;
+ }
+ if (annotations > 0) {
+ funcflags |= 0x04;
+ }
+
+ if (compiler_function_body(c, s, is_async, funcflags, firstlineno) < 0) {
+ if (is_generic) {
+ compiler_exit_scope(c);
+ }
+ return ERROR;
+ }
+
+ if (is_generic) {
+ RETURN_IF_ERROR_IN_SCOPE(c, codegen_addop_i(
+ INSTR_SEQUENCE(c), SWAP, 2, loc));
+ RETURN_IF_ERROR_IN_SCOPE(c, codegen_addop_i(
+ INSTR_SEQUENCE(c), CALL_INTRINSIC_2, INTRINSIC_SET_FUNCTION_TYPE_PARAMS, loc));
+
+ c->u->u_metadata.u_argcount = num_typeparam_args;
+ PyCodeObject *co = optimize_and_assemble(c, 0);
+ compiler_exit_scope(c);
+ if (co == NULL) {
+ return ERROR;
+ }
+ if (compiler_make_closure(c, loc, co, 0) < 0) {
+ Py_DECREF(co);
+ return ERROR;
+ }
+ Py_DECREF(co);
+ if (num_typeparam_args > 0) {
+ ADDOP_I(c, loc, SWAP, num_typeparam_args + 1);
+ }
+ ADDOP_I(c, loc, CALL, num_typeparam_args);
+ }
+
+ RETURN_IF_ERROR(compiler_apply_decorators(c, decos));
+ return compiler_nameop(c, loc, name, Store);
+}
+
+static int
+compiler_set_type_params_in_class(struct compiler *c, location loc)
+{
+ _Py_DECLARE_STR(type_params, ".type_params");
+ RETURN_IF_ERROR(compiler_nameop(c, loc, &_Py_STR(type_params), Load));
+ RETURN_IF_ERROR(compiler_nameop(c, loc, &_Py_ID(__type_params__), Store));
+ return 1;
+}
+
+static int
+compiler_class_body(struct compiler *c, stmt_ty s, int firstlineno)
+{
/* ultimately generate code for:
<name> = __build_class__(<func>, <name>, *<bases>, **<keywords>)
where:
@@ -2204,68 +2388,100 @@ compiler_class(struct compiler *c, stmt_ty s)
<keywords> is the keyword arguments and **kwds argument
This borrows from compiler_call.
*/
+
/* 1. compile the class body into a code object */
RETURN_IF_ERROR(
compiler_enter_scope(c, s->v.ClassDef.name,
COMPILER_SCOPE_CLASS, (void *)s, firstlineno));
- /* this block represents what we do in the new scope */
- {
- location loc = LOCATION(firstlineno, firstlineno, 0, 0);
- /* use the class name for name mangling */
- Py_XSETREF(c->u->u_private, Py_NewRef(s->v.ClassDef.name));
- /* load (global) __name__ ... */
- if (compiler_nameop(c, loc, &_Py_ID(__name__), Load) < 0) {
+ location loc = LOCATION(firstlineno, firstlineno, 0, 0);
+ /* use the class name for name mangling */
+ Py_XSETREF(c->u->u_private, Py_NewRef(s->v.ClassDef.name));
+ /* load (global) __name__ ... */
+ if (compiler_nameop(c, loc, &_Py_ID(__name__), Load) < 0) {
+ compiler_exit_scope(c);
+ return ERROR;
+ }
+ /* ... and store it as __module__ */
+ if (compiler_nameop(c, loc, &_Py_ID(__module__), Store) < 0) {
+ compiler_exit_scope(c);
+ return ERROR;
+ }
+ assert(c->u->u_metadata.u_qualname);
+ ADDOP_LOAD_CONST(c, loc, c->u->u_metadata.u_qualname);
+ if (compiler_nameop(c, loc, &_Py_ID(__qualname__), Store) < 0) {
+ compiler_exit_scope(c);
+ return ERROR;
+ }
+ asdl_typeparam_seq *typeparams = s->v.ClassDef.typeparams;
+ if (asdl_seq_LEN(typeparams) > 0) {
+ if (!compiler_set_type_params_in_class(c, loc)) {
compiler_exit_scope(c);
return ERROR;
}
- /* ... and store it as __module__ */
- if (compiler_nameop(c, loc, &_Py_ID(__module__), Store) < 0) {
+ }
+ if (c->u->u_ste->ste_needs_classdict) {
+ ADDOP(c, loc, LOAD_LOCALS);
+
+ // We can't use compiler_nameop here because we need to generate a
+ // STORE_DEREF in a class namespace, and compiler_nameop() won't do
+ // that by default.
+ PyObject *cellvars = c->u->u_metadata.u_cellvars;
+ if (compiler_addop_o(c->u, loc, STORE_DEREF, cellvars,
+ &_Py_ID(__classdict__)) < 0) {
compiler_exit_scope(c);
return ERROR;
}
- assert(c->u->u_metadata.u_qualname);
- ADDOP_LOAD_CONST(c, loc, c->u->u_metadata.u_qualname);
- if (compiler_nameop(c, loc, &_Py_ID(__qualname__), Store) < 0) {
+ }
+ /* compile the body proper */
+ if (compiler_body(c, loc, s->v.ClassDef.body) < 0) {
+ compiler_exit_scope(c);
+ return ERROR;
+ }
+ /* The following code is artificial */
+ /* Set __classdictcell__ if necessary */
+ if (c->u->u_ste->ste_needs_classdict) {
+ /* Store __classdictcell__ into class namespace */
+ int i = compiler_lookup_arg(c->u->u_metadata.u_cellvars, &_Py_ID(__classdict__));
+ if (i < 0) {
compiler_exit_scope(c);
return ERROR;
}
- /* compile the body proper */
- if (compiler_body(c, loc, s->v.ClassDef.body) < 0) {
+ ADDOP_I(c, NO_LOCATION, LOAD_CLOSURE, i);
+ if (compiler_nameop(c, NO_LOCATION, &_Py_ID(__classdictcell__), Store) < 0) {
compiler_exit_scope(c);
return ERROR;
}
- /* The following code is artificial */
- /* Return __classcell__ if it is referenced, otherwise return None */
- if (c->u->u_ste->ste_needs_class_closure) {
- /* Store __classcell__ into class namespace & return it */
- i = compiler_lookup_arg(c->u->u_metadata.u_cellvars, &_Py_ID(__class__));
- if (i < 0) {
- compiler_exit_scope(c);
- return ERROR;
- }
- ADDOP_I(c, NO_LOCATION, LOAD_CLOSURE, i);
- ADDOP_I(c, NO_LOCATION, COPY, 1);
- if (compiler_nameop(c, NO_LOCATION, &_Py_ID(__classcell__), Store) < 0) {
- compiler_exit_scope(c);
- return ERROR;
- }
+ }
+ /* Return __classcell__ if it is referenced, otherwise return None */
+ if (c->u->u_ste->ste_needs_class_closure) {
+ /* Store __classcell__ into class namespace & return it */
+ int i = compiler_lookup_arg(c->u->u_metadata.u_cellvars, &_Py_ID(__class__));
+ if (i < 0) {
+ compiler_exit_scope(c);
+ return ERROR;
}
- else {
- /* No methods referenced __class__, so just return None */
- ADDOP_LOAD_CONST(c, NO_LOCATION, Py_None);
+ ADDOP_I(c, NO_LOCATION, LOAD_CLOSURE, i);
+ ADDOP_I(c, NO_LOCATION, COPY, 1);
+ if (compiler_nameop(c, NO_LOCATION, &_Py_ID(__classcell__), Store) < 0) {
+ compiler_exit_scope(c);
+ return ERROR;
}
- ADDOP_IN_SCOPE(c, NO_LOCATION, RETURN_VALUE);
- /* create the code object */
- co = optimize_and_assemble(c, 1);
}
+ else {
+ /* No methods referenced __class__, so just return None */
+ ADDOP_LOAD_CONST(c, NO_LOCATION, Py_None);
+ }
+ ADDOP_IN_SCOPE(c, NO_LOCATION, RETURN_VALUE);
+ /* create the code object */
+ PyCodeObject *co = optimize_and_assemble(c, 1);
+
/* leave the new scope */
compiler_exit_scope(c);
if (co == NULL) {
return ERROR;
}
- location loc = LOC(s);
/* 2. load the 'build_class' function */
ADDOP(c, loc, PUSH_NULL);
ADDOP(c, loc, LOAD_BUILD_CLASS);
@@ -2280,10 +2496,100 @@ compiler_class(struct compiler *c, stmt_ty s)
/* 4. load class name */
ADDOP_LOAD_CONST(c, loc, s->v.ClassDef.name);
- /* 5. generate the rest of the code for the call */
- RETURN_IF_ERROR(compiler_call_helper(c, loc, 2,
- s->v.ClassDef.bases,
- s->v.ClassDef.keywords));
+ return SUCCESS;
+}
+
+static int
+compiler_class(struct compiler *c, stmt_ty s)
+{
+ asdl_expr_seq *decos = s->v.ClassDef.decorator_list;
+
+ RETURN_IF_ERROR(compiler_decorators(c, decos));
+
+ int firstlineno = s->lineno;
+ if (asdl_seq_LEN(decos)) {
+ firstlineno = ((expr_ty)asdl_seq_GET(decos, 0))->lineno;
+ }
+ location loc = LOC(s);
+
+ asdl_typeparam_seq *typeparams = s->v.ClassDef.typeparams;
+ int is_generic = asdl_seq_LEN(typeparams) > 0;
+ if (is_generic) {
+ Py_XSETREF(c->u->u_private, Py_NewRef(s->v.ClassDef.name));
+ ADDOP(c, loc, PUSH_NULL);
+ PyObject *typeparams_name = PyUnicode_FromFormat("<generic parameters of %U>",
+ s->v.ClassDef.name);
+ if (!typeparams_name) {
+ return ERROR;
+ }
+ if (compiler_enter_scope(c, typeparams_name, COMPILER_SCOPE_TYPEPARAMS,
+ (void *)typeparams, firstlineno) == -1) {
+ Py_DECREF(typeparams_name);
+ return ERROR;
+ }
+ Py_DECREF(typeparams_name);
+ RETURN_IF_ERROR_IN_SCOPE(c, compiler_type_params(c, typeparams));
+ _Py_DECLARE_STR(type_params, ".type_params");
+ RETURN_IF_ERROR_IN_SCOPE(c, compiler_nameop(c, loc, &_Py_STR(type_params), Store));
+ }
+
+ if (compiler_class_body(c, s, firstlineno) < 0) {
+ if (is_generic) {
+ compiler_exit_scope(c);
+ }
+ return ERROR;
+ }
+
+ /* generate the rest of the code for the call */
+
+ if (is_generic) {
+ _Py_DECLARE_STR(type_params, ".type_params");
+ _Py_DECLARE_STR(generic_base, ".generic_base");
+ RETURN_IF_ERROR_IN_SCOPE(c, compiler_nameop(c, loc, &_Py_STR(type_params), Load));
+ RETURN_IF_ERROR_IN_SCOPE(
+ c, codegen_addop_i(INSTR_SEQUENCE(c), CALL_INTRINSIC_1, INTRINSIC_SUBSCRIPT_GENERIC, loc)
+ )
+ RETURN_IF_ERROR_IN_SCOPE(c, compiler_nameop(c, loc, &_Py_STR(generic_base), Store));
+
+ Py_ssize_t original_len = asdl_seq_LEN(s->v.ClassDef.bases);
+ asdl_expr_seq *bases = _Py_asdl_expr_seq_new(
+ original_len + 1, c->c_arena);
+ if (bases == NULL) {
+ compiler_exit_scope(c);
+ return ERROR;
+ }
+ for (Py_ssize_t i = 0; i < original_len; i++) {
+ asdl_seq_SET(bases, i, asdl_seq_GET(s->v.ClassDef.bases, i));
+ }
+ expr_ty name_node = _PyAST_Name(
+ &_Py_STR(generic_base), Load,
+ loc.lineno, loc.col_offset, loc.end_lineno, loc.end_col_offset, c->c_arena
+ );
+ if (name_node == NULL) {
+ compiler_exit_scope(c);
+ return ERROR;
+ }
+ asdl_seq_SET(bases, original_len, name_node);
+ RETURN_IF_ERROR_IN_SCOPE(c, compiler_call_helper(c, loc, 2,
+ bases,
+ s->v.ClassDef.keywords));
+
+ PyCodeObject *co = optimize_and_assemble(c, 0);
+ compiler_exit_scope(c);
+ if (co == NULL) {
+ return ERROR;
+ }
+ if (compiler_make_closure(c, loc, co, 0) < 0) {
+ Py_DECREF(co);
+ return ERROR;
+ }
+ Py_DECREF(co);
+ ADDOP_I(c, loc, CALL, 0);
+ } else {
+ RETURN_IF_ERROR(compiler_call_helper(c, loc, 2,
+ s->v.ClassDef.bases,
+ s->v.ClassDef.keywords));
+ }
/* 6. apply decorators */
RETURN_IF_ERROR(compiler_apply_decorators(c, decos));
@@ -2293,6 +2599,87 @@ compiler_class(struct compiler *c, stmt_ty s)
return SUCCESS;
}
+static int
+compiler_typealias_body(struct compiler *c, stmt_ty s)
+{
+ location loc = LOC(s);
+ PyObject *name = s->v.TypeAlias.name->v.Name.id;
+ RETURN_IF_ERROR(
+ compiler_enter_scope(c, name, COMPILER_SCOPE_FUNCTION, s, loc.lineno));
+ /* Make None the first constant, so the evaluate function can't have a
+ docstring. */
+ RETURN_IF_ERROR(compiler_add_const(c->c_const_cache, c->u, Py_None));
+ VISIT_IN_SCOPE(c, expr, s->v.TypeAlias.value);
+ ADDOP_IN_SCOPE(c, loc, RETURN_VALUE);
+ PyCodeObject *co = optimize_and_assemble(c, 0);
+ compiler_exit_scope(c);
+ if (co == NULL) {
+ return ERROR;
+ }
+ if (compiler_make_closure(c, loc, co, 0) < 0) {
+ Py_DECREF(co);
+ return ERROR;
+ }
+ Py_DECREF(co);
+ ADDOP_I(c, loc, BUILD_TUPLE, 3);
+ ADDOP_I(c, loc, CALL_INTRINSIC_1, INTRINSIC_TYPEALIAS);
+ return SUCCESS;
+}
+
+static int
+compiler_typealias(struct compiler *c, stmt_ty s)
+{
+ location loc = LOC(s);
+ asdl_typeparam_seq *typeparams = s->v.TypeAlias.typeparams;
+ int is_generic = asdl_seq_LEN(typeparams) > 0;
+ PyObject *name = s->v.TypeAlias.name->v.Name.id;
+ if (is_generic) {
+ ADDOP(c, loc, PUSH_NULL);
+ PyObject *typeparams_name = PyUnicode_FromFormat("<generic parameters of %U>",
+ name);
+ if (!typeparams_name) {
+ return ERROR;
+ }
+ if (compiler_enter_scope(c, typeparams_name, COMPILER_SCOPE_TYPEPARAMS,
+ (void *)typeparams, loc.lineno) == -1) {
+ Py_DECREF(typeparams_name);
+ return ERROR;
+ }
+ Py_DECREF(typeparams_name);
+ RETURN_IF_ERROR_IN_SCOPE(
+ c, compiler_addop_load_const(c->c_const_cache, c->u, loc, name)
+ );
+ RETURN_IF_ERROR_IN_SCOPE(c, compiler_type_params(c, typeparams));
+ }
+ else {
+ ADDOP_LOAD_CONST(c, loc, name);
+ ADDOP_LOAD_CONST(c, loc, Py_None);
+ }
+
+ if (compiler_typealias_body(c, s) < 0) {
+ if (is_generic) {
+ compiler_exit_scope(c);
+ }
+ return ERROR;
+ }
+
+ if (is_generic) {
+ PyCodeObject *co = optimize_and_assemble(c, 0);
+ compiler_exit_scope(c);
+ if (co == NULL) {
+ return ERROR;
+ }
+ if (compiler_make_closure(c, loc, co, 0) < 0) {
+ Py_DECREF(co);
+ return ERROR;
+ }
+ Py_DECREF(co);
+ ADDOP_I(c, loc, CALL, 0);
+ }
+ RETURN_IF_ERROR(compiler_nameop(c, loc, name, Store));
+ return SUCCESS;
+}
+
/* Return false if the expression is a constant value except named singletons.
Return true otherwise. */
static bool
@@ -2705,7 +3092,7 @@ compiler_return(struct compiler *c, stmt_ty s)
location loc = LOC(s);
int preserve_tos = ((s->v.Return.value != NULL) &&
(s->v.Return.value->kind != Constant_kind));
- if (c->u->u_ste->ste_type != FunctionBlock) {
+ if (!_PyST_IsFunctionLike(c->u->u_ste)) {
return compiler_error(c, loc, "'return' outside function");
}
if (s->v.Return.value != NULL &&
@@ -3519,6 +3906,8 @@ compiler_visit_stmt(struct compiler *c, stmt_ty s)
return compiler_function(c, s, 0);
case ClassDef_kind:
return compiler_class(c, s);
+ case TypeAlias_kind:
+ return compiler_typealias(c, s);
case Return_kind:
return compiler_return(c, s);
case Delete_kind:
@@ -3725,12 +4114,12 @@ compiler_nameop(struct compiler *c, location loc,
optype = OP_DEREF;
break;
case LOCAL:
- if (c->u->u_ste->ste_type == FunctionBlock ||
+ if (_PyST_IsFunctionLike(c->u->u_ste) ||
(PyDict_GetItem(c->u->u_metadata.u_fasthidden, mangled) == Py_True))
optype = OP_FAST;
break;
case GLOBAL_IMPLICIT:
- if (c->u->u_ste->ste_type == FunctionBlock)
+ if (_PyST_IsFunctionLike(c->u->u_ste))
optype = OP_GLOBAL;
break;
case GLOBAL_EXPLICIT:
@@ -3748,7 +4137,24 @@ compiler_nameop(struct compiler *c, location loc,
case OP_DEREF:
switch (ctx) {
case Load:
- op = (c->u->u_ste->ste_type == ClassBlock) ? LOAD_CLASSDEREF : LOAD_DEREF;
+ if (c->u->u_ste->ste_type == ClassBlock) {
+ op = LOAD_FROM_DICT_OR_DEREF;
+ // First load the locals
+ if (codegen_addop_noarg(INSTR_SEQUENCE(c), LOAD_LOCALS, loc) < 0) {
+ return ERROR;
+ }
+ }
+ else if (c->u->u_ste->ste_can_see_class_scope) {
+ op = LOAD_FROM_DICT_OR_DEREF;
+ // First load the classdict
+ if (compiler_addop_o(c->u, loc, LOAD_DEREF,
+ c->u->u_metadata.u_freevars, &_Py_ID(__classdict__)) < 0) {
+ return ERROR;
+ }
+ }
+ else {
+ op = LOAD_DEREF;
+ }
break;
case Store: op = STORE_DEREF; break;
case Del: op = DELETE_DEREF; break;
@@ -3764,7 +4170,18 @@ compiler_nameop(struct compiler *c, location loc,
return SUCCESS;
case OP_GLOBAL:
switch (ctx) {
- case Load: op = LOAD_GLOBAL; break;
+ case Load:
+ if (c->u->u_ste->ste_can_see_class_scope && scope == GLOBAL_IMPLICIT) {
+ op = LOAD_FROM_DICT_OR_GLOBALS;
+ // First load the classdict
+ if (compiler_addop_o(c->u, loc, LOAD_DEREF,
+ c->u->u_metadata.u_freevars, &_Py_ID(__classdict__)) < 0) {
+ return ERROR;
+ }
+ } else {
+ op = LOAD_GLOBAL;
+ }
+ break;
case Store: op = STORE_GLOBAL; break;
case Del: op = DELETE_GLOBAL; break;
}
@@ -5008,7 +5425,7 @@ push_inlined_comprehension_state(struct compiler *c, location loc,
// assignment expression to a nonlocal in the comprehension, these don't
// need handling here since they shouldn't be isolated
if (symbol & DEF_LOCAL && !(symbol & DEF_NONLOCAL)) {
- if (c->u->u_ste->ste_type != FunctionBlock) {
+ if (!_PyST_IsFunctionLike(c->u->u_ste)) {
// non-function scope: override this name to use fast locals
PyObject *orig = PyDict_GetItem(c->u->u_metadata.u_fasthidden, k);
if (orig != Py_True) {
@@ -5604,7 +6021,7 @@ compiler_visit_expr1(struct compiler *c, expr_ty e)
case DictComp_kind:
return compiler_dictcomp(c, e);
case Yield_kind:
- if (c->u->u_ste->ste_type != FunctionBlock) {
+ if (!_PyST_IsFunctionLike(c->u->u_ste)) {
return compiler_error(c, loc, "'yield' outside function");
}
if (e->v.Yield.value) {
@@ -5616,7 +6033,7 @@ compiler_visit_expr1(struct compiler *c, expr_ty e)
ADDOP_YIELD(c, loc);
break;
case YieldFrom_kind:
- if (c->u->u_ste->ste_type != FunctionBlock) {
+ if (!_PyST_IsFunctionLike(c->u->u_ste)) {
return compiler_error(c, loc, "'yield' outside function");
}
if (c->u->u_scope_type == COMPILER_SCOPE_ASYNC_FUNCTION) {
@@ -5629,7 +6046,7 @@ compiler_visit_expr1(struct compiler *c, expr_ty e)
break;
case Await_kind:
if (!IS_TOP_LEVEL_AWAIT(c)){
- if (c->u->u_ste->ste_type != FunctionBlock){
+ if (!_PyST_IsFunctionLike(c->u->u_ste)) {
return compiler_error(c, loc, "'await' outside function");
}
@@ -6916,7 +7333,7 @@ compute_code_flags(struct compiler *c)
{
PySTEntryObject *ste = c->u->u_ste;
int flags = 0;
- if (ste->ste_type == FunctionBlock) {
+ if (_PyST_IsFunctionLike(c->u->u_ste)) {
flags |= CO_NEWLOCALS | CO_OPTIMIZED;
if (ste->ste_nested)
flags |= CO_NESTED;
@@ -7114,7 +7531,7 @@ fix_cell_offsets(_PyCompile_CodeUnitMetadata *umd, basicblock *entryblock, int *
case LOAD_DEREF:
case STORE_DEREF:
case DELETE_DEREF:
- case LOAD_CLASSDEREF:
+ case LOAD_FROM_DICT_OR_DEREF:
assert(oldoffset >= 0);
assert(oldoffset < noffsets);
assert(fixedmap[oldoffset] >= 0);
diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h
index 014a69f..fa4ff5c 100644
--- a/Python/generated_cases.c.h
+++ b/Python/generated_cases.c.h
@@ -8,7 +8,7 @@
}
TARGET(RESUME) {
- #line 137 "Python/bytecodes.c"
+ #line 138 "Python/bytecodes.c"
assert(tstate->cframe == &cframe);
assert(frame == cframe.current_frame);
/* Possibly combine this with eval breaker */
@@ -25,7 +25,7 @@
}
TARGET(INSTRUMENTED_RESUME) {
- #line 151 "Python/bytecodes.c"
+ #line 152 "Python/bytecodes.c"
/* Possible performance enhancement:
* We need to check the eval breaker anyway, can we
* combine the instrument verison check and the eval breaker test?
@@ -57,7 +57,7 @@
TARGET(LOAD_CLOSURE) {
PyObject *value;
- #line 179 "Python/bytecodes.c"
+ #line 180 "Python/bytecodes.c"
/* We keep LOAD_CLOSURE so that the bytecode stays more readable. */
value = GETLOCAL(oparg);
if (value == NULL) goto unbound_local_error;
@@ -70,7 +70,7 @@
TARGET(LOAD_FAST_CHECK) {
PyObject *value;
- #line 186 "Python/bytecodes.c"
+ #line 187 "Python/bytecodes.c"
value = GETLOCAL(oparg);
if (value == NULL) goto unbound_local_error;
Py_INCREF(value);
@@ -82,7 +82,7 @@
TARGET(LOAD_FAST) {
PyObject *value;
- #line 192 "Python/bytecodes.c"
+ #line 193 "Python/bytecodes.c"
value = GETLOCAL(oparg);
assert(value != NULL);
Py_INCREF(value);
@@ -94,7 +94,7 @@
TARGET(LOAD_FAST_AND_CLEAR) {
PyObject *value;
- #line 198 "Python/bytecodes.c"
+ #line 199 "Python/bytecodes.c"
value = GETLOCAL(oparg);
// do not use SETLOCAL here, it decrefs the old value
GETLOCAL(oparg) = NULL;
@@ -107,7 +107,7 @@
TARGET(LOAD_CONST) {
PREDICTED(LOAD_CONST);
PyObject *value;
- #line 204 "Python/bytecodes.c"
+ #line 205 "Python/bytecodes.c"
value = GETITEM(frame->f_code->co_consts, oparg);
Py_INCREF(value);
#line 114 "Python/generated_cases.c.h"
@@ -118,7 +118,7 @@
TARGET(STORE_FAST) {
PyObject *value = stack_pointer[-1];
- #line 209 "Python/bytecodes.c"
+ #line 210 "Python/bytecodes.c"
SETLOCAL(oparg, value);
#line 124 "Python/generated_cases.c.h"
STACK_SHRINK(1);
@@ -130,7 +130,7 @@
PyObject *_tmp_2;
{
PyObject *value;
- #line 192 "Python/bytecodes.c"
+ #line 193 "Python/bytecodes.c"
value = GETLOCAL(oparg);
assert(value != NULL);
Py_INCREF(value);
@@ -140,7 +140,7 @@
oparg = (next_instr++)->op.arg;
{
PyObject *value;
- #line 192 "Python/bytecodes.c"
+ #line 193 "Python/bytecodes.c"
value = GETLOCAL(oparg);
assert(value != NULL);
Py_INCREF(value);
@@ -158,7 +158,7 @@
PyObject *_tmp_2;
{
PyObject *value;
- #line 192 "Python/bytecodes.c"
+ #line 193 "Python/bytecodes.c"
value = GETLOCAL(oparg);
assert(value != NULL);
Py_INCREF(value);
@@ -168,7 +168,7 @@
oparg = (next_instr++)->op.arg;
{
PyObject *value;
- #line 204 "Python/bytecodes.c"
+ #line 205 "Python/bytecodes.c"
value = GETITEM(frame->f_code->co_consts, oparg);
Py_INCREF(value);
#line 175 "Python/generated_cases.c.h"
@@ -184,14 +184,14 @@
PyObject *_tmp_1 = stack_pointer[-1];
{
PyObject *value = _tmp_1;
- #line 209 "Python/bytecodes.c"
+ #line 210 "Python/bytecodes.c"
SETLOCAL(oparg, value);
#line 190 "Python/generated_cases.c.h"
}
oparg = (next_instr++)->op.arg;
{
PyObject *value;
- #line 192 "Python/bytecodes.c"
+ #line 193 "Python/bytecodes.c"
value = GETLOCAL(oparg);
assert(value != NULL);
Py_INCREF(value);
@@ -207,14 +207,14 @@
PyObject *_tmp_2 = stack_pointer[-2];
{
PyObject *value = _tmp_1;
- #line 209 "Python/bytecodes.c"
+ #line 210 "Python/bytecodes.c"
SETLOCAL(oparg, value);
#line 213 "Python/generated_cases.c.h"
}
oparg = (next_instr++)->op.arg;
{
PyObject *value = _tmp_2;
- #line 209 "Python/bytecodes.c"
+ #line 210 "Python/bytecodes.c"
SETLOCAL(oparg, value);
#line 220 "Python/generated_cases.c.h"
}
@@ -227,7 +227,7 @@
PyObject *_tmp_2;
{
PyObject *value;
- #line 204 "Python/bytecodes.c"
+ #line 205 "Python/bytecodes.c"
value = GETITEM(frame->f_code->co_consts, oparg);
Py_INCREF(value);
#line 234 "Python/generated_cases.c.h"
@@ -236,7 +236,7 @@
oparg = (next_instr++)->op.arg;
{
PyObject *value;
- #line 192 "Python/bytecodes.c"
+ #line 193 "Python/bytecodes.c"
value = GETLOCAL(oparg);
assert(value != NULL);
Py_INCREF(value);
@@ -251,7 +251,7 @@
TARGET(POP_TOP) {
PyObject *value = stack_pointer[-1];
- #line 219 "Python/bytecodes.c"
+ #line 220 "Python/bytecodes.c"
#line 256 "Python/generated_cases.c.h"
Py_DECREF(value);
STACK_SHRINK(1);
@@ -260,7 +260,7 @@
TARGET(PUSH_NULL) {
PyObject *res;
- #line 223 "Python/bytecodes.c"
+ #line 224 "Python/bytecodes.c"
res = NULL;
#line 266 "Python/generated_cases.c.h"
STACK_GROW(1);
@@ -273,13 +273,13 @@
PyObject *_tmp_2 = stack_pointer[-2];
{
PyObject *value = _tmp_1;
- #line 219 "Python/bytecodes.c"
+ #line 220 "Python/bytecodes.c"
#line 278 "Python/generated_cases.c.h"
Py_DECREF(value);
}
{
PyObject *value = _tmp_2;
- #line 219 "Python/bytecodes.c"
+ #line 220 "Python/bytecodes.c"
#line 284 "Python/generated_cases.c.h"
Py_DECREF(value);
}
@@ -290,7 +290,7 @@
TARGET(INSTRUMENTED_END_FOR) {
PyObject *value = stack_pointer[-1];
PyObject *receiver = stack_pointer[-2];
- #line 229 "Python/bytecodes.c"
+ #line 230 "Python/bytecodes.c"
/* Need to create a fake StopIteration error here,
* to conform to PEP 380 */
if (PyGen_Check(receiver)) {
@@ -310,7 +310,7 @@
TARGET(END_SEND) {
PyObject *value = stack_pointer[-1];
PyObject *receiver = stack_pointer[-2];
- #line 242 "Python/bytecodes.c"
+ #line 243 "Python/bytecodes.c"
Py_DECREF(receiver);
#line 316 "Python/generated_cases.c.h"
STACK_SHRINK(1);
@@ -321,7 +321,7 @@
TARGET(INSTRUMENTED_END_SEND) {
PyObject *value = stack_pointer[-1];
PyObject *receiver = stack_pointer[-2];
- #line 246 "Python/bytecodes.c"
+ #line 247 "Python/bytecodes.c"
if (PyGen_Check(receiver) || PyCoro_CheckExact(receiver)) {
PyErr_SetObject(PyExc_StopIteration, value);
if (monitor_stop_iteration(tstate, frame, next_instr-1)) {
@@ -339,11 +339,11 @@
TARGET(UNARY_NEGATIVE) {
PyObject *value = stack_pointer[-1];
PyObject *res;
- #line 257 "Python/bytecodes.c"
+ #line 258 "Python/bytecodes.c"
res = PyNumber_Negative(value);
#line 345 "Python/generated_cases.c.h"
Py_DECREF(value);
- #line 259 "Python/bytecodes.c"
+ #line 260 "Python/bytecodes.c"
if (res == NULL) goto pop_1_error;
#line 349 "Python/generated_cases.c.h"
stack_pointer[-1] = res;
@@ -353,11 +353,11 @@
TARGET(UNARY_NOT) {
PyObject *value = stack_pointer[-1];
PyObject *res;
- #line 263 "Python/bytecodes.c"
+ #line 264 "Python/bytecodes.c"
int err = PyObject_IsTrue(value);
#line 359 "Python/generated_cases.c.h"
Py_DECREF(value);
- #line 265 "Python/bytecodes.c"
+ #line 266 "Python/bytecodes.c"
if (err < 0) goto pop_1_error;
if (err == 0) {
res = Py_True;
@@ -374,11 +374,11 @@
TARGET(UNARY_INVERT) {
PyObject *value = stack_pointer[-1];
PyObject *res;
- #line 276 "Python/bytecodes.c"
+ #line 277 "Python/bytecodes.c"
res = PyNumber_Invert(value);
#line 380 "Python/generated_cases.c.h"
Py_DECREF(value);
- #line 278 "Python/bytecodes.c"
+ #line 279 "Python/bytecodes.c"
if (res == NULL) goto pop_1_error;
#line 384 "Python/generated_cases.c.h"
stack_pointer[-1] = res;
@@ -389,7 +389,7 @@
PyObject *right = stack_pointer[-1];
PyObject *left = stack_pointer[-2];
PyObject *prod;
- #line 295 "Python/bytecodes.c"
+ #line 296 "Python/bytecodes.c"
DEOPT_IF(!PyLong_CheckExact(left), BINARY_OP);
DEOPT_IF(!PyLong_CheckExact(right), BINARY_OP);
STAT_INC(BINARY_OP, hit);
@@ -408,7 +408,7 @@
PyObject *right = stack_pointer[-1];
PyObject *left = stack_pointer[-2];
PyObject *prod;
- #line 305 "Python/bytecodes.c"
+ #line 306 "Python/bytecodes.c"
DEOPT_IF(!PyFloat_CheckExact(left), BINARY_OP);
DEOPT_IF(!PyFloat_CheckExact(right), BINARY_OP);
STAT_INC(BINARY_OP, hit);
@@ -426,7 +426,7 @@
PyObject *right = stack_pointer[-1];
PyObject *left = stack_pointer[-2];
PyObject *sub;
- #line 314 "Python/bytecodes.c"
+ #line 315 "Python/bytecodes.c"
DEOPT_IF(!PyLong_CheckExact(left), BINARY_OP);
DEOPT_IF(!PyLong_CheckExact(right), BINARY_OP);
STAT_INC(BINARY_OP, hit);
@@ -445,7 +445,7 @@
PyObject *right = stack_pointer[-1];
PyObject *left = stack_pointer[-2];
PyObject *sub;
- #line 324 "Python/bytecodes.c"
+ #line 325 "Python/bytecodes.c"
DEOPT_IF(!PyFloat_CheckExact(left), BINARY_OP);
DEOPT_IF(!PyFloat_CheckExact(right), BINARY_OP);
STAT_INC(BINARY_OP, hit);
@@ -462,7 +462,7 @@
PyObject *right = stack_pointer[-1];
PyObject *left = stack_pointer[-2];
PyObject *res;
- #line 332 "Python/bytecodes.c"
+ #line 333 "Python/bytecodes.c"
DEOPT_IF(!PyUnicode_CheckExact(left), BINARY_OP);
DEOPT_IF(Py_TYPE(right) != Py_TYPE(left), BINARY_OP);
STAT_INC(BINARY_OP, hit);
@@ -480,7 +480,7 @@
TARGET(BINARY_OP_INPLACE_ADD_UNICODE) {
PyObject *right = stack_pointer[-1];
PyObject *left = stack_pointer[-2];
- #line 348 "Python/bytecodes.c"
+ #line 349 "Python/bytecodes.c"
DEOPT_IF(!PyUnicode_CheckExact(left), BINARY_OP);
DEOPT_IF(Py_TYPE(right) != Py_TYPE(left), BINARY_OP);
_Py_CODEUNIT true_next = next_instr[INLINE_CACHE_ENTRIES_BINARY_OP];
@@ -516,7 +516,7 @@
PyObject *right = stack_pointer[-1];
PyObject *left = stack_pointer[-2];
PyObject *sum;
- #line 377 "Python/bytecodes.c"
+ #line 378 "Python/bytecodes.c"
DEOPT_IF(!PyFloat_CheckExact(left), BINARY_OP);
DEOPT_IF(Py_TYPE(right) != Py_TYPE(left), BINARY_OP);
STAT_INC(BINARY_OP, hit);
@@ -534,7 +534,7 @@
PyObject *right = stack_pointer[-1];
PyObject *left = stack_pointer[-2];
PyObject *sum;
- #line 386 "Python/bytecodes.c"
+ #line 387 "Python/bytecodes.c"
DEOPT_IF(!PyLong_CheckExact(left), BINARY_OP);
DEOPT_IF(Py_TYPE(right) != Py_TYPE(left), BINARY_OP);
STAT_INC(BINARY_OP, hit);
@@ -555,7 +555,7 @@
PyObject *sub = stack_pointer[-1];
PyObject *container = stack_pointer[-2];
PyObject *res;
- #line 404 "Python/bytecodes.c"
+ #line 405 "Python/bytecodes.c"
#if ENABLE_SPECIALIZATION
_PyBinarySubscrCache *cache = (_PyBinarySubscrCache *)next_instr;
if (ADAPTIVE_COUNTER_IS_ZERO(cache->counter)) {
@@ -570,7 +570,7 @@
#line 571 "Python/generated_cases.c.h"
Py_DECREF(container);
Py_DECREF(sub);
- #line 416 "Python/bytecodes.c"
+ #line 417 "Python/bytecodes.c"
if (res == NULL) goto pop_2_error;
#line 576 "Python/generated_cases.c.h"
STACK_SHRINK(1);
@@ -584,7 +584,7 @@
PyObject *start = stack_pointer[-2];
PyObject *container = stack_pointer[-3];
PyObject *res;
- #line 420 "Python/bytecodes.c"
+ #line 421 "Python/bytecodes.c"
PyObject *slice = _PyBuildSlice_ConsumeRefs(start, stop);
// Can't use ERROR_IF() here, because we haven't
// DECREF'ed container yet, and we still own slice.
@@ -608,7 +608,7 @@
PyObject *start = stack_pointer[-2];
PyObject *container = stack_pointer[-3];
PyObject *v = stack_pointer[-4];
- #line 435 "Python/bytecodes.c"
+ #line 436 "Python/bytecodes.c"
PyObject *slice = _PyBuildSlice_ConsumeRefs(start, stop);
int err;
if (slice == NULL) {
@@ -630,7 +630,7 @@
PyObject *sub = stack_pointer[-1];
PyObject *list = stack_pointer[-2];
PyObject *res;
- #line 450 "Python/bytecodes.c"
+ #line 451 "Python/bytecodes.c"
DEOPT_IF(!PyLong_CheckExact(sub), BINARY_SUBSCR);
DEOPT_IF(!PyList_CheckExact(list), BINARY_SUBSCR);
@@ -655,7 +655,7 @@
PyObject *sub = stack_pointer[-1];
PyObject *tuple = stack_pointer[-2];
PyObject *res;
- #line 466 "Python/bytecodes.c"
+ #line 467 "Python/bytecodes.c"
DEOPT_IF(!PyLong_CheckExact(sub), BINARY_SUBSCR);
DEOPT_IF(!PyTuple_CheckExact(tuple), BINARY_SUBSCR);
@@ -680,7 +680,7 @@
PyObject *sub = stack_pointer[-1];
PyObject *dict = stack_pointer[-2];
PyObject *res;
- #line 482 "Python/bytecodes.c"
+ #line 483 "Python/bytecodes.c"
DEOPT_IF(!PyDict_CheckExact(dict), BINARY_SUBSCR);
STAT_INC(BINARY_SUBSCR, hit);
res = PyDict_GetItemWithError(dict, sub);
@@ -691,7 +691,7 @@
#line 692 "Python/generated_cases.c.h"
Py_DECREF(dict);
Py_DECREF(sub);
- #line 490 "Python/bytecodes.c"
+ #line 491 "Python/bytecodes.c"
if (true) goto pop_2_error;
}
Py_INCREF(res); // Do this before DECREF'ing dict, sub
@@ -707,7 +707,7 @@
TARGET(BINARY_SUBSCR_GETITEM) {
PyObject *sub = stack_pointer[-1];
PyObject *container = stack_pointer[-2];
- #line 497 "Python/bytecodes.c"
+ #line 498 "Python/bytecodes.c"
DEOPT_IF(tstate->interp->eval_frame, BINARY_SUBSCR);
PyTypeObject *tp = Py_TYPE(container);
DEOPT_IF(!PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE), BINARY_SUBSCR);
@@ -736,7 +736,7 @@
TARGET(LIST_APPEND) {
PyObject *v = stack_pointer[-1];
PyObject *list = stack_pointer[-(2 + (oparg-1))];
- #line 522 "Python/bytecodes.c"
+ #line 523 "Python/bytecodes.c"
if (_PyList_AppendTakeRef((PyListObject *)list, v) < 0) goto pop_1_error;
#line 742 "Python/generated_cases.c.h"
STACK_SHRINK(1);
@@ -747,11 +747,11 @@
TARGET(SET_ADD) {
PyObject *v = stack_pointer[-1];
PyObject *set = stack_pointer[-(2 + (oparg-1))];
- #line 527 "Python/bytecodes.c"
+ #line 528 "Python/bytecodes.c"
int err = PySet_Add(set, v);
#line 753 "Python/generated_cases.c.h"
Py_DECREF(v);
- #line 529 "Python/bytecodes.c"
+ #line 530 "Python/bytecodes.c"
if (err) goto pop_1_error;
#line 757 "Python/generated_cases.c.h"
STACK_SHRINK(1);
@@ -766,7 +766,7 @@
PyObject *container = stack_pointer[-2];
PyObject *v = stack_pointer[-3];
uint16_t counter = read_u16(&next_instr[0].cache);
- #line 540 "Python/bytecodes.c"
+ #line 541 "Python/bytecodes.c"
#if ENABLE_SPECIALIZATION
if (ADAPTIVE_COUNTER_IS_ZERO(counter)) {
next_instr--;
@@ -785,7 +785,7 @@
Py_DECREF(v);
Py_DECREF(container);
Py_DECREF(sub);
- #line 555 "Python/bytecodes.c"
+ #line 556 "Python/bytecodes.c"
if (err) goto pop_3_error;
#line 791 "Python/generated_cases.c.h"
STACK_SHRINK(3);
@@ -797,7 +797,7 @@
PyObject *sub = stack_pointer[-1];
PyObject *list = stack_pointer[-2];
PyObject *value = stack_pointer[-3];
- #line 559 "Python/bytecodes.c"
+ #line 560 "Python/bytecodes.c"
DEOPT_IF(!PyLong_CheckExact(sub), STORE_SUBSCR);
DEOPT_IF(!PyList_CheckExact(list), STORE_SUBSCR);
@@ -824,7 +824,7 @@
PyObject *sub = stack_pointer[-1];
PyObject *dict = stack_pointer[-2];
PyObject *value = stack_pointer[-3];
- #line 578 "Python/bytecodes.c"
+ #line 579 "Python/bytecodes.c"
DEOPT_IF(!PyDict_CheckExact(dict), STORE_SUBSCR);
STAT_INC(STORE_SUBSCR, hit);
int err = _PyDict_SetItem_Take2((PyDictObject *)dict, sub, value);
@@ -839,13 +839,13 @@
TARGET(DELETE_SUBSCR) {
PyObject *sub = stack_pointer[-1];
PyObject *container = stack_pointer[-2];
- #line 586 "Python/bytecodes.c"
+ #line 587 "Python/bytecodes.c"
/* del container[sub] */
int err = PyObject_DelItem(container, sub);
#line 846 "Python/generated_cases.c.h"
Py_DECREF(container);
Py_DECREF(sub);
- #line 589 "Python/bytecodes.c"
+ #line 590 "Python/bytecodes.c"
if (err) goto pop_2_error;
#line 851 "Python/generated_cases.c.h"
STACK_SHRINK(2);
@@ -855,12 +855,12 @@
TARGET(CALL_INTRINSIC_1) {
PyObject *value = stack_pointer[-1];
PyObject *res;
- #line 593 "Python/bytecodes.c"
+ #line 594 "Python/bytecodes.c"
assert(oparg <= MAX_INTRINSIC_1);
res = _PyIntrinsics_UnaryFunctions[oparg](tstate, value);
#line 862 "Python/generated_cases.c.h"
Py_DECREF(value);
- #line 596 "Python/bytecodes.c"
+ #line 597 "Python/bytecodes.c"
if (res == NULL) goto pop_1_error;
#line 866 "Python/generated_cases.c.h"
stack_pointer[-1] = res;
@@ -871,13 +871,13 @@
PyObject *value1 = stack_pointer[-1];
PyObject *value2 = stack_pointer[-2];
PyObject *res;
- #line 600 "Python/bytecodes.c"
+ #line 601 "Python/bytecodes.c"
assert(oparg <= MAX_INTRINSIC_2);
res = _PyIntrinsics_BinaryFunctions[oparg](tstate, value2, value1);
#line 878 "Python/generated_cases.c.h"
Py_DECREF(value2);
Py_DECREF(value1);
- #line 603 "Python/bytecodes.c"
+ #line 604 "Python/bytecodes.c"
if (res == NULL) goto pop_2_error;
#line 883 "Python/generated_cases.c.h"
STACK_SHRINK(1);
@@ -887,7 +887,7 @@
TARGET(RAISE_VARARGS) {
PyObject **args = (stack_pointer - oparg);
- #line 607 "Python/bytecodes.c"
+ #line 608 "Python/bytecodes.c"
PyObject *cause = NULL, *exc = NULL;
switch (oparg) {
case 2:
@@ -910,7 +910,7 @@
TARGET(INTERPRETER_EXIT) {
PyObject *retval = stack_pointer[-1];
- #line 627 "Python/bytecodes.c"
+ #line 628 "Python/bytecodes.c"
assert(frame == &entry_frame);
assert(_PyFrame_IsIncomplete(frame));
STACK_SHRINK(1); // Since we're not going to DISPATCH()
@@ -926,7 +926,7 @@
TARGET(RETURN_VALUE) {
PyObject *retval = stack_pointer[-1];
- #line 640 "Python/bytecodes.c"
+ #line 641 "Python/bytecodes.c"
STACK_SHRINK(1);
assert(EMPTY());
_PyFrame_SetStackPointer(frame, stack_pointer);
@@ -944,7 +944,7 @@
TARGET(INSTRUMENTED_RETURN_VALUE) {
PyObject *retval = stack_pointer[-1];
- #line 655 "Python/bytecodes.c"
+ #line 656 "Python/bytecodes.c"
int err = _Py_call_instrumentation_arg(
tstate, PY_MONITORING_EVENT_PY_RETURN,
frame, next_instr-1, retval);
@@ -965,7 +965,7 @@
}
TARGET(RETURN_CONST) {
- #line 674 "Python/bytecodes.c"
+ #line 675 "Python/bytecodes.c"
PyObject *retval = GETITEM(frame->f_code->co_consts, oparg);
Py_INCREF(retval);
assert(EMPTY());
@@ -983,7 +983,7 @@
}
TARGET(INSTRUMENTED_RETURN_CONST) {
- #line 690 "Python/bytecodes.c"
+ #line 691 "Python/bytecodes.c"
PyObject *retval = GETITEM(frame->f_code->co_consts, oparg);
int err = _Py_call_instrumentation_arg(
tstate, PY_MONITORING_EVENT_PY_RETURN,
@@ -1007,7 +1007,7 @@
TARGET(GET_AITER) {
PyObject *obj = stack_pointer[-1];
PyObject *iter;
- #line 710 "Python/bytecodes.c"
+ #line 711 "Python/bytecodes.c"
unaryfunc getter = NULL;
PyTypeObject *type = Py_TYPE(obj);
@@ -1022,14 +1022,14 @@
type->tp_name);
#line 1024 "Python/generated_cases.c.h"
Py_DECREF(obj);
- #line 723 "Python/bytecodes.c"
+ #line 724 "Python/bytecodes.c"
if (true) goto pop_1_error;
}
iter = (*getter)(obj);
#line 1031 "Python/generated_cases.c.h"
Py_DECREF(obj);
- #line 728 "Python/bytecodes.c"
+ #line 729 "Python/bytecodes.c"
if (iter == NULL) goto pop_1_error;
if (Py_TYPE(iter)->tp_as_async == NULL ||
@@ -1050,7 +1050,7 @@
TARGET(GET_ANEXT) {
PyObject *aiter = stack_pointer[-1];
PyObject *awaitable;
- #line 743 "Python/bytecodes.c"
+ #line 744 "Python/bytecodes.c"
unaryfunc getter = NULL;
PyObject *next_iter = NULL;
PyTypeObject *type = Py_TYPE(aiter);
@@ -1105,7 +1105,7 @@
PREDICTED(GET_AWAITABLE);
PyObject *iterable = stack_pointer[-1];
PyObject *iter;
- #line 790 "Python/bytecodes.c"
+ #line 791 "Python/bytecodes.c"
iter = _PyCoro_GetAwaitableIter(iterable);
if (iter == NULL) {
@@ -1114,7 +1114,7 @@
#line 1116 "Python/generated_cases.c.h"
Py_DECREF(iterable);
- #line 797 "Python/bytecodes.c"
+ #line 798 "Python/bytecodes.c"
if (iter != NULL && PyCoro_CheckExact(iter)) {
PyObject *yf = _PyGen_yf((PyGenObject*)iter);
@@ -1144,7 +1144,7 @@
PyObject *v = stack_pointer[-1];
PyObject *receiver = stack_pointer[-2];
PyObject *retval;
- #line 823 "Python/bytecodes.c"
+ #line 824 "Python/bytecodes.c"
#if ENABLE_SPECIALIZATION
_PySendCache *cache = (_PySendCache *)next_instr;
if (ADAPTIVE_COUNTER_IS_ZERO(cache->counter)) {
@@ -1200,7 +1200,7 @@
TARGET(SEND_GEN) {
PyObject *v = stack_pointer[-1];
PyObject *receiver = stack_pointer[-2];
- #line 872 "Python/bytecodes.c"
+ #line 873 "Python/bytecodes.c"
DEOPT_IF(tstate->interp->eval_frame, SEND);
PyGenObject *gen = (PyGenObject *)receiver;
DEOPT_IF(Py_TYPE(gen) != &PyGen_Type &&
@@ -1221,7 +1221,7 @@
TARGET(INSTRUMENTED_YIELD_VALUE) {
PyObject *retval = stack_pointer[-1];
- #line 890 "Python/bytecodes.c"
+ #line 891 "Python/bytecodes.c"
assert(frame != &entry_frame);
PyGenObject *gen = _PyFrame_GetGenerator(frame);
gen->gi_frame_state = FRAME_SUSPENDED;
@@ -1243,7 +1243,7 @@
TARGET(YIELD_VALUE) {
PyObject *retval = stack_pointer[-1];
- #line 909 "Python/bytecodes.c"
+ #line 910 "Python/bytecodes.c"
// NOTE: It's important that YIELD_VALUE never raises an exception!
// The compiler treats any exception raised here as a failed close()
// or throw() call.
@@ -1264,7 +1264,7 @@
TARGET(POP_EXCEPT) {
PyObject *exc_value = stack_pointer[-1];
- #line 927 "Python/bytecodes.c"
+ #line 928 "Python/bytecodes.c"
_PyErr_StackItem *exc_info = tstate->exc_info;
Py_XSETREF(exc_info->exc_value, exc_value);
#line 1271 "Python/generated_cases.c.h"
@@ -1275,7 +1275,7 @@
TARGET(RERAISE) {
PyObject *exc = stack_pointer[-1];
PyObject **values = (stack_pointer - (1 + oparg));
- #line 932 "Python/bytecodes.c"
+ #line 933 "Python/bytecodes.c"
assert(oparg >= 0 && oparg <= 2);
if (oparg) {
PyObject *lasti = values[0];
@@ -1299,13 +1299,13 @@
TARGET(END_ASYNC_FOR) {
PyObject *exc = stack_pointer[-1];
PyObject *awaitable = stack_pointer[-2];
- #line 952 "Python/bytecodes.c"
+ #line 953 "Python/bytecodes.c"
assert(exc && PyExceptionInstance_Check(exc));
if (PyErr_GivenExceptionMatches(exc, PyExc_StopAsyncIteration)) {
#line 1306 "Python/generated_cases.c.h"
Py_DECREF(awaitable);
Py_DECREF(exc);
- #line 955 "Python/bytecodes.c"
+ #line 956 "Python/bytecodes.c"
}
else {
Py_INCREF(exc);
@@ -1323,7 +1323,7 @@
PyObject *sub_iter = stack_pointer[-3];
PyObject *none;
PyObject *value;
- #line 964 "Python/bytecodes.c"
+ #line 965 "Python/bytecodes.c"
assert(throwflag);
assert(exc_value && PyExceptionInstance_Check(exc_value));
if (PyErr_GivenExceptionMatches(exc_value, PyExc_StopIteration)) {
@@ -1332,7 +1332,7 @@
Py_DECREF(sub_iter);
Py_DECREF(last_sent_val);
Py_DECREF(exc_value);
- #line 969 "Python/bytecodes.c"
+ #line 970 "Python/bytecodes.c"
none = Py_NewRef(Py_None);
}
else {
@@ -1348,7 +1348,7 @@
TARGET(LOAD_ASSERTION_ERROR) {
PyObject *value;
- #line 978 "Python/bytecodes.c"
+ #line 979 "Python/bytecodes.c"
value = Py_NewRef(PyExc_AssertionError);
#line 1354 "Python/generated_cases.c.h"
STACK_GROW(1);
@@ -1358,7 +1358,7 @@
TARGET(LOAD_BUILD_CLASS) {
PyObject *bc;
- #line 982 "Python/bytecodes.c"
+ #line 983 "Python/bytecodes.c"
if (PyDict_CheckExact(BUILTINS())) {
bc = _PyDict_GetItemWithError(BUILTINS(),
&_Py_ID(__build_class__));
@@ -1388,7 +1388,7 @@
TARGET(STORE_NAME) {
PyObject *v = stack_pointer[-1];
- #line 1006 "Python/bytecodes.c"
+ #line 1008 "Python/bytecodes.c"
PyObject *name = GETITEM(frame->f_code->co_names, oparg);
PyObject *ns = LOCALS();
int err;
@@ -1397,7 +1397,7 @@
"no locals found when storing %R", name);
#line 1399 "Python/generated_cases.c.h"
Py_DECREF(v);
- #line 1013 "Python/bytecodes.c"
+ #line 1015 "Python/bytecodes.c"
if (true) goto pop_1_error;
}
if (PyDict_CheckExact(ns))
@@ -1406,7 +1406,7 @@
err = PyObject_SetItem(ns, name, v);
#line 1408 "Python/generated_cases.c.h"
Py_DECREF(v);
- #line 1020 "Python/bytecodes.c"
+ #line 1022 "Python/bytecodes.c"
if (err) goto pop_1_error;
#line 1412 "Python/generated_cases.c.h"
STACK_SHRINK(1);
@@ -1414,7 +1414,7 @@
}
TARGET(DELETE_NAME) {
- #line 1024 "Python/bytecodes.c"
+ #line 1026 "Python/bytecodes.c"
PyObject *name = GETITEM(frame->f_code->co_names, oparg);
PyObject *ns = LOCALS();
int err;
@@ -1439,7 +1439,7 @@
PREDICTED(UNPACK_SEQUENCE);
static_assert(INLINE_CACHE_ENTRIES_UNPACK_SEQUENCE == 1, "incorrect cache size");
PyObject *seq = stack_pointer[-1];
- #line 1050 "Python/bytecodes.c"
+ #line 1052 "Python/bytecodes.c"
#if ENABLE_SPECIALIZATION
_PyUnpackSequenceCache *cache = (_PyUnpackSequenceCache *)next_instr;
if (ADAPTIVE_COUNTER_IS_ZERO(cache->counter)) {
@@ -1454,7 +1454,7 @@
int res = unpack_iterable(tstate, seq, oparg, -1, top);
#line 1456 "Python/generated_cases.c.h"
Py_DECREF(seq);
- #line 1063 "Python/bytecodes.c"
+ #line 1065 "Python/bytecodes.c"
if (res == 0) goto pop_1_error;
#line 1460 "Python/generated_cases.c.h"
STACK_SHRINK(1);
@@ -1466,7 +1466,7 @@
TARGET(UNPACK_SEQUENCE_TWO_TUPLE) {
PyObject *seq = stack_pointer[-1];
PyObject **values = stack_pointer - (1);
- #line 1067 "Python/bytecodes.c"
+ #line 1069 "Python/bytecodes.c"
DEOPT_IF(!PyTuple_CheckExact(seq), UNPACK_SEQUENCE);
DEOPT_IF(PyTuple_GET_SIZE(seq) != 2, UNPACK_SEQUENCE);
assert(oparg == 2);
@@ -1484,7 +1484,7 @@
TARGET(UNPACK_SEQUENCE_TUPLE) {
PyObject *seq = stack_pointer[-1];
PyObject **values = stack_pointer - (1);
- #line 1077 "Python/bytecodes.c"
+ #line 1079 "Python/bytecodes.c"
DEOPT_IF(!PyTuple_CheckExact(seq), UNPACK_SEQUENCE);
DEOPT_IF(PyTuple_GET_SIZE(seq) != oparg, UNPACK_SEQUENCE);
STAT_INC(UNPACK_SEQUENCE, hit);
@@ -1503,7 +1503,7 @@
TARGET(UNPACK_SEQUENCE_LIST) {
PyObject *seq = stack_pointer[-1];
PyObject **values = stack_pointer - (1);
- #line 1088 "Python/bytecodes.c"
+ #line 1090 "Python/bytecodes.c"
DEOPT_IF(!PyList_CheckExact(seq), UNPACK_SEQUENCE);
DEOPT_IF(PyList_GET_SIZE(seq) != oparg, UNPACK_SEQUENCE);
STAT_INC(UNPACK_SEQUENCE, hit);
@@ -1521,13 +1521,13 @@
TARGET(UNPACK_EX) {
PyObject *seq = stack_pointer[-1];
- #line 1099 "Python/bytecodes.c"
+ #line 1101 "Python/bytecodes.c"
int totalargs = 1 + (oparg & 0xFF) + (oparg >> 8);
PyObject **top = stack_pointer + totalargs - 1;
int res = unpack_iterable(tstate, seq, oparg & 0xFF, oparg >> 8, top);
#line 1529 "Python/generated_cases.c.h"
Py_DECREF(seq);
- #line 1103 "Python/bytecodes.c"
+ #line 1105 "Python/bytecodes.c"
if (res == 0) goto pop_1_error;
#line 1533 "Python/generated_cases.c.h"
STACK_GROW((oparg & 0xFF) + (oparg >> 8));
@@ -1540,7 +1540,7 @@
PyObject *owner = stack_pointer[-1];
PyObject *v = stack_pointer[-2];
uint16_t counter = read_u16(&next_instr[0].cache);
- #line 1114 "Python/bytecodes.c"
+ #line 1116 "Python/bytecodes.c"
#if ENABLE_SPECIALIZATION
if (ADAPTIVE_COUNTER_IS_ZERO(counter)) {
PyObject *name = GETITEM(frame->f_code->co_names, oparg);
@@ -1559,7 +1559,7 @@
#line 1560 "Python/generated_cases.c.h"
Py_DECREF(v);
Py_DECREF(owner);
- #line 1130 "Python/bytecodes.c"
+ #line 1132 "Python/bytecodes.c"
if (err) goto pop_2_error;
#line 1565 "Python/generated_cases.c.h"
STACK_SHRINK(2);
@@ -1569,12 +1569,12 @@
TARGET(DELETE_ATTR) {
PyObject *owner = stack_pointer[-1];
- #line 1134 "Python/bytecodes.c"
+ #line 1136 "Python/bytecodes.c"
PyObject *name = GETITEM(frame->f_code->co_names, oparg);
int err = PyObject_SetAttr(owner, name, (PyObject *)NULL);
#line 1576 "Python/generated_cases.c.h"
Py_DECREF(owner);
- #line 1137 "Python/bytecodes.c"
+ #line 1139 "Python/bytecodes.c"
if (err) goto pop_1_error;
#line 1580 "Python/generated_cases.c.h"
STACK_SHRINK(1);
@@ -1583,12 +1583,12 @@
TARGET(STORE_GLOBAL) {
PyObject *v = stack_pointer[-1];
- #line 1141 "Python/bytecodes.c"
+ #line 1143 "Python/bytecodes.c"
PyObject *name = GETITEM(frame->f_code->co_names, oparg);
int err = PyDict_SetItem(GLOBALS(), name, v);
#line 1590 "Python/generated_cases.c.h"
Py_DECREF(v);
- #line 1144 "Python/bytecodes.c"
+ #line 1146 "Python/bytecodes.c"
if (err) goto pop_1_error;
#line 1594 "Python/generated_cases.c.h"
STACK_SHRINK(1);
@@ -1596,7 +1596,7 @@
}
TARGET(DELETE_GLOBAL) {
- #line 1148 "Python/bytecodes.c"
+ #line 1150 "Python/bytecodes.c"
PyObject *name = GETITEM(frame->f_code->co_names, oparg);
int err;
err = PyDict_DelItem(GLOBALS(), name);
@@ -1612,70 +1612,175 @@
DISPATCH();
}
+ TARGET(LOAD_LOCALS) {
+ PyObject *_tmp_1;
+ {
+ PyObject *locals;
+ #line 1164 "Python/bytecodes.c"
+ locals = LOCALS();
+ if (locals == NULL) {
+ _PyErr_SetString(tstate, PyExc_SystemError,
+ "no locals found");
+ if (true) goto error;
+ }
+ Py_INCREF(locals);
+ #line 1628 "Python/generated_cases.c.h"
+ _tmp_1 = locals;
+ }
+ STACK_GROW(1);
+ stack_pointer[-1] = _tmp_1;
+ DISPATCH();
+ }
+
TARGET(LOAD_NAME) {
- PyObject *v;
- #line 1162 "Python/bytecodes.c"
- PyObject *name = GETITEM(frame->f_code->co_names, oparg);
- PyObject *locals = LOCALS();
- if (locals == NULL) {
- _PyErr_Format(tstate, PyExc_SystemError,
- "no locals when loading %R", name);
- goto error;
+ PyObject *_tmp_1;
+ {
+ PyObject *locals;
+ #line 1164 "Python/bytecodes.c"
+ locals = LOCALS();
+ if (locals == NULL) {
+ _PyErr_SetString(tstate, PyExc_SystemError,
+ "no locals found");
+ if (true) goto error;
+ }
+ Py_INCREF(locals);
+ #line 1648 "Python/generated_cases.c.h"
+ _tmp_1 = locals;
}
- if (PyDict_CheckExact(locals)) {
- v = PyDict_GetItemWithError(locals, name);
- if (v != NULL) {
- Py_INCREF(v);
+ {
+ PyObject *mod_or_class_dict = _tmp_1;
+ PyObject *v;
+ #line 1176 "Python/bytecodes.c"
+ PyObject *name = GETITEM(frame->f_code->co_names, oparg);
+ if (PyDict_CheckExact(mod_or_class_dict)) {
+ v = PyDict_GetItemWithError(mod_or_class_dict, name);
+ if (v != NULL) {
+ Py_INCREF(v);
+ }
+ else if (_PyErr_Occurred(tstate)) {
+ Py_DECREF(mod_or_class_dict);
+ goto error;
+ }
}
- else if (_PyErr_Occurred(tstate)) {
- goto error;
+ else {
+ v = PyObject_GetItem(mod_or_class_dict, name);
+ if (v == NULL) {
+ if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
+ Py_DECREF(mod_or_class_dict);
+ goto error;
+ }
+ _PyErr_Clear(tstate);
+ }
}
- }
- else {
- v = PyObject_GetItem(locals, name);
+ Py_DECREF(mod_or_class_dict);
if (v == NULL) {
- if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError))
+ v = PyDict_GetItemWithError(GLOBALS(), name);
+ if (v != NULL) {
+ Py_INCREF(v);
+ }
+ else if (_PyErr_Occurred(tstate)) {
goto error;
- _PyErr_Clear(tstate);
+ }
+ else {
+ if (PyDict_CheckExact(BUILTINS())) {
+ v = PyDict_GetItemWithError(BUILTINS(), name);
+ if (v == NULL) {
+ if (!_PyErr_Occurred(tstate)) {
+ format_exc_check_arg(
+ tstate, PyExc_NameError,
+ NAME_ERROR_MSG, name);
+ }
+ goto error;
+ }
+ Py_INCREF(v);
+ }
+ else {
+ v = PyObject_GetItem(BUILTINS(), name);
+ if (v == NULL) {
+ if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
+ format_exc_check_arg(
+ tstate, PyExc_NameError,
+ NAME_ERROR_MSG, name);
+ }
+ goto error;
+ }
+ }
+ }
}
+ #line 1711 "Python/generated_cases.c.h"
+ _tmp_1 = v;
}
- if (v == NULL) {
- v = PyDict_GetItemWithError(GLOBALS(), name);
- if (v != NULL) {
- Py_INCREF(v);
- }
- else if (_PyErr_Occurred(tstate)) {
- goto error;
+ STACK_GROW(1);
+ stack_pointer[-1] = _tmp_1;
+ DISPATCH();
+ }
+
+ TARGET(LOAD_FROM_DICT_OR_GLOBALS) {
+ PyObject *_tmp_1 = stack_pointer[-1];
+ {
+ PyObject *mod_or_class_dict = _tmp_1;
+ PyObject *v;
+ #line 1176 "Python/bytecodes.c"
+ PyObject *name = GETITEM(frame->f_code->co_names, oparg);
+ if (PyDict_CheckExact(mod_or_class_dict)) {
+ v = PyDict_GetItemWithError(mod_or_class_dict, name);
+ if (v != NULL) {
+ Py_INCREF(v);
+ }
+ else if (_PyErr_Occurred(tstate)) {
+ Py_DECREF(mod_or_class_dict);
+ goto error;
+ }
}
else {
- if (PyDict_CheckExact(BUILTINS())) {
- v = PyDict_GetItemWithError(BUILTINS(), name);
- if (v == NULL) {
- if (!_PyErr_Occurred(tstate)) {
- format_exc_check_arg(
- tstate, PyExc_NameError,
- NAME_ERROR_MSG, name);
- }
+ v = PyObject_GetItem(mod_or_class_dict, name);
+ if (v == NULL) {
+ if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
+ Py_DECREF(mod_or_class_dict);
goto error;
}
+ _PyErr_Clear(tstate);
+ }
+ }
+ Py_DECREF(mod_or_class_dict);
+ if (v == NULL) {
+ v = PyDict_GetItemWithError(GLOBALS(), name);
+ if (v != NULL) {
Py_INCREF(v);
}
+ else if (_PyErr_Occurred(tstate)) {
+ goto error;
+ }
else {
- v = PyObject_GetItem(BUILTINS(), name);
- if (v == NULL) {
- if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
- format_exc_check_arg(
+ if (PyDict_CheckExact(BUILTINS())) {
+ v = PyDict_GetItemWithError(BUILTINS(), name);
+ if (v == NULL) {
+ if (!_PyErr_Occurred(tstate)) {
+ format_exc_check_arg(
tstate, PyExc_NameError,
NAME_ERROR_MSG, name);
+ }
+ goto error;
+ }
+ Py_INCREF(v);
+ }
+ else {
+ v = PyObject_GetItem(BUILTINS(), name);
+ if (v == NULL) {
+ if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
+ format_exc_check_arg(
+ tstate, PyExc_NameError,
+ NAME_ERROR_MSG, name);
+ }
+ goto error;
}
- goto error;
}
}
}
+ #line 1781 "Python/generated_cases.c.h"
+ _tmp_1 = v;
}
- #line 1677 "Python/generated_cases.c.h"
- STACK_GROW(1);
- stack_pointer[-1] = v;
+ stack_pointer[-1] = _tmp_1;
DISPATCH();
}
@@ -1684,7 +1789,7 @@
static_assert(INLINE_CACHE_ENTRIES_LOAD_GLOBAL == 4, "incorrect cache size");
PyObject *null = NULL;
PyObject *v;
- #line 1229 "Python/bytecodes.c"
+ #line 1245 "Python/bytecodes.c"
#if ENABLE_SPECIALIZATION
_PyLoadGlobalCache *cache = (_PyLoadGlobalCache *)next_instr;
if (ADAPTIVE_COUNTER_IS_ZERO(cache->counter)) {
@@ -1736,7 +1841,7 @@
}
}
null = NULL;
- #line 1740 "Python/generated_cases.c.h"
+ #line 1845 "Python/generated_cases.c.h"
STACK_GROW(1);
STACK_GROW(((oparg & 1) ? 1 : 0));
stack_pointer[-1] = v;
@@ -1750,7 +1855,7 @@
PyObject *res;
uint16_t index = read_u16(&next_instr[1].cache);
uint16_t version = read_u16(&next_instr[2].cache);
- #line 1283 "Python/bytecodes.c"
+ #line 1299 "Python/bytecodes.c"
DEOPT_IF(!PyDict_CheckExact(GLOBALS()), LOAD_GLOBAL);
PyDictObject *dict = (PyDictObject *)GLOBALS();
DEOPT_IF(dict->ma_keys->dk_version != version, LOAD_GLOBAL);
@@ -1761,7 +1866,7 @@
Py_INCREF(res);
STAT_INC(LOAD_GLOBAL, hit);
null = NULL;
- #line 1765 "Python/generated_cases.c.h"
+ #line 1870 "Python/generated_cases.c.h"
STACK_GROW(1);
STACK_GROW(((oparg & 1) ? 1 : 0));
stack_pointer[-1] = res;
@@ -1776,7 +1881,7 @@
uint16_t index = read_u16(&next_instr[1].cache);
uint16_t mod_version = read_u16(&next_instr[2].cache);
uint16_t bltn_version = read_u16(&next_instr[3].cache);
- #line 1296 "Python/bytecodes.c"
+ #line 1312 "Python/bytecodes.c"
DEOPT_IF(!PyDict_CheckExact(GLOBALS()), LOAD_GLOBAL);
DEOPT_IF(!PyDict_CheckExact(BUILTINS()), LOAD_GLOBAL);
PyDictObject *mdict = (PyDictObject *)GLOBALS();
@@ -1791,7 +1896,7 @@
Py_INCREF(res);
STAT_INC(LOAD_GLOBAL, hit);
null = NULL;
- #line 1795 "Python/generated_cases.c.h"
+ #line 1900 "Python/generated_cases.c.h"
STACK_GROW(1);
STACK_GROW(((oparg & 1) ? 1 : 0));
stack_pointer[-1] = res;
@@ -1801,16 +1906,16 @@
}
TARGET(DELETE_FAST) {
- #line 1313 "Python/bytecodes.c"
+ #line 1329 "Python/bytecodes.c"
PyObject *v = GETLOCAL(oparg);
if (v == NULL) goto unbound_local_error;
SETLOCAL(oparg, NULL);
- #line 1809 "Python/generated_cases.c.h"
+ #line 1914 "Python/generated_cases.c.h"
DISPATCH();
}
TARGET(MAKE_CELL) {
- #line 1319 "Python/bytecodes.c"
+ #line 1335 "Python/bytecodes.c"
// "initial" is probably NULL but not if it's an arg (or set
// via PyFrame_LocalsToFast() before MAKE_CELL has run).
PyObject *initial = GETLOCAL(oparg);
@@ -1819,12 +1924,12 @@
goto resume_with_error;
}
SETLOCAL(oparg, cell);
- #line 1823 "Python/generated_cases.c.h"
+ #line 1928 "Python/generated_cases.c.h"
DISPATCH();
}
TARGET(DELETE_DEREF) {
- #line 1330 "Python/bytecodes.c"
+ #line 1346 "Python/bytecodes.c"
PyObject *cell = GETLOCAL(oparg);
PyObject *oldobj = PyCell_GET(cell);
// Can't use ERROR_IF here.
@@ -1835,35 +1940,39 @@
}
PyCell_SET(cell, NULL);
Py_DECREF(oldobj);
- #line 1839 "Python/generated_cases.c.h"
+ #line 1944 "Python/generated_cases.c.h"
DISPATCH();
}
- TARGET(LOAD_CLASSDEREF) {
+ TARGET(LOAD_FROM_DICT_OR_DEREF) {
+ PyObject *class_dict = stack_pointer[-1];
PyObject *value;
- #line 1343 "Python/bytecodes.c"
- PyObject *name, *locals = LOCALS();
- assert(locals);
+ #line 1359 "Python/bytecodes.c"
+ PyObject *name;
+ assert(class_dict);
assert(oparg >= 0 && oparg < frame->f_code->co_nlocalsplus);
name = PyTuple_GET_ITEM(frame->f_code->co_localsplusnames, oparg);
- if (PyDict_CheckExact(locals)) {
- value = PyDict_GetItemWithError(locals, name);
+ if (PyDict_CheckExact(class_dict)) {
+ value = PyDict_GetItemWithError(class_dict, name);
if (value != NULL) {
Py_INCREF(value);
}
else if (_PyErr_Occurred(tstate)) {
+ Py_DECREF(class_dict);
goto error;
}
}
else {
- value = PyObject_GetItem(locals, name);
+ value = PyObject_GetItem(class_dict, name);
if (value == NULL) {
if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
+ Py_DECREF(class_dict);
goto error;
}
_PyErr_Clear(tstate);
}
}
+ Py_DECREF(class_dict);
if (!value) {
PyObject *cell = GETLOCAL(oparg);
value = PyCell_GET(cell);
@@ -1873,15 +1982,14 @@
}
Py_INCREF(value);
}
- #line 1877 "Python/generated_cases.c.h"
- STACK_GROW(1);
+ #line 1986 "Python/generated_cases.c.h"
stack_pointer[-1] = value;
DISPATCH();
}
TARGET(LOAD_DEREF) {
PyObject *value;
- #line 1377 "Python/bytecodes.c"
+ #line 1396 "Python/bytecodes.c"
PyObject *cell = GETLOCAL(oparg);
value = PyCell_GET(cell);
if (value == NULL) {
@@ -1889,7 +1997,7 @@
if (true) goto error;
}
Py_INCREF(value);
- #line 1893 "Python/generated_cases.c.h"
+ #line 2001 "Python/generated_cases.c.h"
STACK_GROW(1);
stack_pointer[-1] = value;
DISPATCH();
@@ -1897,18 +2005,18 @@
TARGET(STORE_DEREF) {
PyObject *v = stack_pointer[-1];
- #line 1387 "Python/bytecodes.c"
+ #line 1406 "Python/bytecodes.c"
PyObject *cell = GETLOCAL(oparg);
PyObject *oldobj = PyCell_GET(cell);
PyCell_SET(cell, v);
Py_XDECREF(oldobj);
- #line 1906 "Python/generated_cases.c.h"
+ #line 2014 "Python/generated_cases.c.h"
STACK_SHRINK(1);
DISPATCH();
}
TARGET(COPY_FREE_VARS) {
- #line 1394 "Python/bytecodes.c"
+ #line 1413 "Python/bytecodes.c"
/* Copy closure variables to free variables */
PyCodeObject *co = frame->f_code;
assert(PyFunction_Check(frame->f_funcobj));
@@ -1919,22 +2027,22 @@
PyObject *o = PyTuple_GET_ITEM(closure, i);
frame->localsplus[offset + i] = Py_NewRef(o);
}
- #line 1923 "Python/generated_cases.c.h"
+ #line 2031 "Python/generated_cases.c.h"
DISPATCH();
}
TARGET(BUILD_STRING) {
PyObject **pieces = (stack_pointer - oparg);
PyObject *str;
- #line 1407 "Python/bytecodes.c"
+ #line 1426 "Python/bytecodes.c"
str = _PyUnicode_JoinArray(&_Py_STR(empty), pieces, oparg);
- #line 1932 "Python/generated_cases.c.h"
+ #line 2040 "Python/generated_cases.c.h"
for (int _i = oparg; --_i >= 0;) {
Py_DECREF(pieces[_i]);
}
- #line 1409 "Python/bytecodes.c"
+ #line 1428 "Python/bytecodes.c"
if (str == NULL) { STACK_SHRINK(oparg); goto error; }
- #line 1938 "Python/generated_cases.c.h"
+ #line 2046 "Python/generated_cases.c.h"
STACK_SHRINK(oparg);
STACK_GROW(1);
stack_pointer[-1] = str;
@@ -1944,10 +2052,10 @@
TARGET(BUILD_TUPLE) {
PyObject **values = (stack_pointer - oparg);
PyObject *tup;
- #line 1413 "Python/bytecodes.c"
+ #line 1432 "Python/bytecodes.c"
tup = _PyTuple_FromArraySteal(values, oparg);
if (tup == NULL) { STACK_SHRINK(oparg); goto error; }
- #line 1951 "Python/generated_cases.c.h"
+ #line 2059 "Python/generated_cases.c.h"
STACK_SHRINK(oparg);
STACK_GROW(1);
stack_pointer[-1] = tup;
@@ -1957,10 +2065,10 @@
TARGET(BUILD_LIST) {
PyObject **values = (stack_pointer - oparg);
PyObject *list;
- #line 1418 "Python/bytecodes.c"
+ #line 1437 "Python/bytecodes.c"
list = _PyList_FromArraySteal(values, oparg);
if (list == NULL) { STACK_SHRINK(oparg); goto error; }
- #line 1964 "Python/generated_cases.c.h"
+ #line 2072 "Python/generated_cases.c.h"
STACK_SHRINK(oparg);
STACK_GROW(1);
stack_pointer[-1] = list;
@@ -1970,7 +2078,7 @@
TARGET(LIST_EXTEND) {
PyObject *iterable = stack_pointer[-1];
PyObject *list = stack_pointer[-(2 + (oparg-1))];
- #line 1423 "Python/bytecodes.c"
+ #line 1442 "Python/bytecodes.c"
PyObject *none_val = _PyList_Extend((PyListObject *)list, iterable);
if (none_val == NULL) {
if (_PyErr_ExceptionMatches(tstate, PyExc_TypeError) &&
@@ -1981,13 +2089,13 @@
"Value after * must be an iterable, not %.200s",
Py_TYPE(iterable)->tp_name);
}
- #line 1985 "Python/generated_cases.c.h"
+ #line 2093 "Python/generated_cases.c.h"
Py_DECREF(iterable);
- #line 1434 "Python/bytecodes.c"
+ #line 1453 "Python/bytecodes.c"
if (true) goto pop_1_error;
}
Py_DECREF(none_val);
- #line 1991 "Python/generated_cases.c.h"
+ #line 2099 "Python/generated_cases.c.h"
Py_DECREF(iterable);
STACK_SHRINK(1);
DISPATCH();
@@ -1996,13 +2104,13 @@
TARGET(SET_UPDATE) {
PyObject *iterable = stack_pointer[-1];
PyObject *set = stack_pointer[-(2 + (oparg-1))];
- #line 1441 "Python/bytecodes.c"
+ #line 1460 "Python/bytecodes.c"
int err = _PySet_Update(set, iterable);
- #line 2002 "Python/generated_cases.c.h"
+ #line 2110 "Python/generated_cases.c.h"
Py_DECREF(iterable);
- #line 1443 "Python/bytecodes.c"
+ #line 1462 "Python/bytecodes.c"
if (err < 0) goto pop_1_error;
- #line 2006 "Python/generated_cases.c.h"
+ #line 2114 "Python/generated_cases.c.h"
STACK_SHRINK(1);
DISPATCH();
}
@@ -2010,7 +2118,7 @@
TARGET(BUILD_SET) {
PyObject **values = (stack_pointer - oparg);
PyObject *set;
- #line 1447 "Python/bytecodes.c"
+ #line 1466 "Python/bytecodes.c"
set = PySet_New(NULL);
if (set == NULL)
goto error;
@@ -2025,7 +2133,7 @@
Py_DECREF(set);
if (true) { STACK_SHRINK(oparg); goto error; }
}
- #line 2029 "Python/generated_cases.c.h"
+ #line 2137 "Python/generated_cases.c.h"
STACK_SHRINK(oparg);
STACK_GROW(1);
stack_pointer[-1] = set;
@@ -2035,7 +2143,7 @@
TARGET(BUILD_MAP) {
PyObject **values = (stack_pointer - oparg*2);
PyObject *map;
- #line 1464 "Python/bytecodes.c"
+ #line 1483 "Python/bytecodes.c"
map = _PyDict_FromItems(
values, 2,
values+1, 2,
@@ -2043,13 +2151,13 @@
if (map == NULL)
goto error;
- #line 2047 "Python/generated_cases.c.h"
+ #line 2155 "Python/generated_cases.c.h"
for (int _i = oparg*2; --_i >= 0;) {
Py_DECREF(values[_i]);
}
- #line 1472 "Python/bytecodes.c"
+ #line 1491 "Python/bytecodes.c"
if (map == NULL) { STACK_SHRINK(oparg*2); goto error; }
- #line 2053 "Python/generated_cases.c.h"
+ #line 2161 "Python/generated_cases.c.h"
STACK_SHRINK(oparg*2);
STACK_GROW(1);
stack_pointer[-1] = map;
@@ -2057,7 +2165,7 @@
}
TARGET(SETUP_ANNOTATIONS) {
- #line 1476 "Python/bytecodes.c"
+ #line 1495 "Python/bytecodes.c"
int err;
PyObject *ann_dict;
if (LOCALS() == NULL) {
@@ -2097,7 +2205,7 @@
Py_DECREF(ann_dict);
}
}
- #line 2101 "Python/generated_cases.c.h"
+ #line 2209 "Python/generated_cases.c.h"
DISPATCH();
}
@@ -2105,7 +2213,7 @@
PyObject *keys = stack_pointer[-1];
PyObject **values = (stack_pointer - (1 + oparg));
PyObject *map;
- #line 1518 "Python/bytecodes.c"
+ #line 1537 "Python/bytecodes.c"
if (!PyTuple_CheckExact(keys) ||
PyTuple_GET_SIZE(keys) != (Py_ssize_t)oparg) {
_PyErr_SetString(tstate, PyExc_SystemError,
@@ -2115,14 +2223,14 @@
map = _PyDict_FromItems(
&PyTuple_GET_ITEM(keys, 0), 1,
values, 1, oparg);
- #line 2119 "Python/generated_cases.c.h"
+ #line 2227 "Python/generated_cases.c.h"
for (int _i = oparg; --_i >= 0;) {
Py_DECREF(values[_i]);
}
Py_DECREF(keys);
- #line 1528 "Python/bytecodes.c"
+ #line 1547 "Python/bytecodes.c"
if (map == NULL) { STACK_SHRINK(oparg); goto pop_1_error; }
- #line 2126 "Python/generated_cases.c.h"
+ #line 2234 "Python/generated_cases.c.h"
STACK_SHRINK(oparg);
stack_pointer[-1] = map;
DISPATCH();
@@ -2130,7 +2238,7 @@
TARGET(DICT_UPDATE) {
PyObject *update = stack_pointer[-1];
- #line 1532 "Python/bytecodes.c"
+ #line 1551 "Python/bytecodes.c"
PyObject *dict = PEEK(oparg + 1); // update is still on the stack
if (PyDict_Update(dict, update) < 0) {
if (_PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) {
@@ -2138,12 +2246,12 @@
"'%.200s' object is not a mapping",
Py_TYPE(update)->tp_name);
}
- #line 2142 "Python/generated_cases.c.h"
+ #line 2250 "Python/generated_cases.c.h"
Py_DECREF(update);
- #line 1540 "Python/bytecodes.c"
+ #line 1559 "Python/bytecodes.c"
if (true) goto pop_1_error;
}
- #line 2147 "Python/generated_cases.c.h"
+ #line 2255 "Python/generated_cases.c.h"
Py_DECREF(update);
STACK_SHRINK(1);
DISPATCH();
@@ -2151,17 +2259,17 @@
TARGET(DICT_MERGE) {
PyObject *update = stack_pointer[-1];
- #line 1546 "Python/bytecodes.c"
+ #line 1565 "Python/bytecodes.c"
PyObject *dict = PEEK(oparg + 1); // update is still on the stack
if (_PyDict_MergeEx(dict, update, 2) < 0) {
format_kwargs_error(tstate, PEEK(3 + oparg), update);
- #line 2160 "Python/generated_cases.c.h"
+ #line 2268 "Python/generated_cases.c.h"
Py_DECREF(update);
- #line 1551 "Python/bytecodes.c"
+ #line 1570 "Python/bytecodes.c"
if (true) goto pop_1_error;
}
- #line 2165 "Python/generated_cases.c.h"
+ #line 2273 "Python/generated_cases.c.h"
Py_DECREF(update);
STACK_SHRINK(1);
PREDICT(CALL_FUNCTION_EX);
@@ -2171,13 +2279,13 @@
TARGET(MAP_ADD) {
PyObject *value = stack_pointer[-1];
PyObject *key = stack_pointer[-2];
- #line 1558 "Python/bytecodes.c"
+ #line 1577 "Python/bytecodes.c"
PyObject *dict = PEEK(oparg + 2); // key, value are still on the stack
assert(PyDict_CheckExact(dict));
/* dict[key] = value */
// Do not DECREF INPUTS because the function steals the references
if (_PyDict_SetItem_Take2((PyDictObject *)dict, key, value) != 0) goto pop_2_error;
- #line 2181 "Python/generated_cases.c.h"
+ #line 2289 "Python/generated_cases.c.h"
STACK_SHRINK(2);
PREDICT(JUMP_BACKWARD);
DISPATCH();
@@ -2191,7 +2299,7 @@
PyObject *global_super = stack_pointer[-3];
PyObject *res2 = NULL;
PyObject *res;
- #line 1573 "Python/bytecodes.c"
+ #line 1592 "Python/bytecodes.c"
PyObject *name = GETITEM(frame->f_code->co_names, oparg >> 2);
int load_method = oparg & 1;
#if ENABLE_SPECIALIZATION
@@ -2209,16 +2317,16 @@
// handle any case whose performance we care about
PyObject *stack[] = {class, self};
PyObject *super = PyObject_Vectorcall(global_super, stack, oparg & 2, NULL);
- #line 2213 "Python/generated_cases.c.h"
+ #line 2321 "Python/generated_cases.c.h"
Py_DECREF(global_super);
Py_DECREF(class);
Py_DECREF(self);
- #line 1591 "Python/bytecodes.c"
+ #line 1610 "Python/bytecodes.c"
if (super == NULL) goto pop_3_error;
res = PyObject_GetAttr(super, name);
Py_DECREF(super);
if (res == NULL) goto pop_3_error;
- #line 2222 "Python/generated_cases.c.h"
+ #line 2330 "Python/generated_cases.c.h"
STACK_SHRINK(2);
STACK_GROW(((oparg & 1) ? 1 : 0));
stack_pointer[-1] = res;
@@ -2233,20 +2341,20 @@
PyObject *global_super = stack_pointer[-3];
PyObject *res2 = NULL;
PyObject *res;
- #line 1598 "Python/bytecodes.c"
+ #line 1617 "Python/bytecodes.c"
assert(!(oparg & 1));
DEOPT_IF(global_super != (PyObject *)&PySuper_Type, LOAD_SUPER_ATTR);
DEOPT_IF(!PyType_Check(class), LOAD_SUPER_ATTR);
STAT_INC(LOAD_SUPER_ATTR, hit);
PyObject *name = GETITEM(frame->f_code->co_names, oparg >> 2);
res = _PySuper_Lookup((PyTypeObject *)class, self, name, NULL);
- #line 2244 "Python/generated_cases.c.h"
+ #line 2352 "Python/generated_cases.c.h"
Py_DECREF(global_super);
Py_DECREF(class);
Py_DECREF(self);
- #line 1605 "Python/bytecodes.c"
+ #line 1624 "Python/bytecodes.c"
if (res == NULL) goto pop_3_error;
- #line 2250 "Python/generated_cases.c.h"
+ #line 2358 "Python/generated_cases.c.h"
STACK_SHRINK(2);
STACK_GROW(((oparg & 1) ? 1 : 0));
stack_pointer[-1] = res;
@@ -2261,7 +2369,7 @@
PyObject *global_super = stack_pointer[-3];
PyObject *res2;
PyObject *res;
- #line 1609 "Python/bytecodes.c"
+ #line 1628 "Python/bytecodes.c"
assert(oparg & 1);
DEOPT_IF(global_super != (PyObject *)&PySuper_Type, LOAD_SUPER_ATTR);
DEOPT_IF(!PyType_Check(class), LOAD_SUPER_ATTR);
@@ -2282,7 +2390,7 @@
res = res2;
res2 = NULL;
}
- #line 2286 "Python/generated_cases.c.h"
+ #line 2394 "Python/generated_cases.c.h"
STACK_SHRINK(1);
stack_pointer[-1] = res;
stack_pointer[-2] = res2;
@@ -2296,7 +2404,7 @@
PyObject *owner = stack_pointer[-1];
PyObject *res2 = NULL;
PyObject *res;
- #line 1646 "Python/bytecodes.c"
+ #line 1665 "Python/bytecodes.c"
#if ENABLE_SPECIALIZATION
_PyAttrCache *cache = (_PyAttrCache *)next_instr;
if (ADAPTIVE_COUNTER_IS_ZERO(cache->counter)) {
@@ -2330,9 +2438,9 @@
NULL | meth | arg1 | ... | argN
*/
- #line 2334 "Python/generated_cases.c.h"
+ #line 2442 "Python/generated_cases.c.h"
Py_DECREF(owner);
- #line 1680 "Python/bytecodes.c"
+ #line 1699 "Python/bytecodes.c"
if (meth == NULL) goto pop_1_error;
res2 = NULL;
res = meth;
@@ -2341,12 +2449,12 @@
else {
/* Classic, pushes one value. */
res = PyObject_GetAttr(owner, name);
- #line 2345 "Python/generated_cases.c.h"
+ #line 2453 "Python/generated_cases.c.h"
Py_DECREF(owner);
- #line 1689 "Python/bytecodes.c"
+ #line 1708 "Python/bytecodes.c"
if (res == NULL) goto pop_1_error;
}
- #line 2350 "Python/generated_cases.c.h"
+ #line 2458 "Python/generated_cases.c.h"
STACK_GROW(((oparg & 1) ? 1 : 0));
stack_pointer[-1] = res;
if (oparg & 1) { stack_pointer[-(1 + ((oparg & 1) ? 1 : 0))] = res2; }
@@ -2360,7 +2468,7 @@
PyObject *res;
uint32_t type_version = read_u32(&next_instr[1].cache);
uint16_t index = read_u16(&next_instr[3].cache);
- #line 1694 "Python/bytecodes.c"
+ #line 1713 "Python/bytecodes.c"
PyTypeObject *tp = Py_TYPE(owner);
assert(type_version != 0);
DEOPT_IF(tp->tp_version_tag != type_version, LOAD_ATTR);
@@ -2373,7 +2481,7 @@
STAT_INC(LOAD_ATTR, hit);
Py_INCREF(res);
res2 = NULL;
- #line 2377 "Python/generated_cases.c.h"
+ #line 2485 "Python/generated_cases.c.h"
Py_DECREF(owner);
STACK_GROW(((oparg & 1) ? 1 : 0));
stack_pointer[-1] = res;
@@ -2388,7 +2496,7 @@
PyObject *res;
uint32_t type_version = read_u32(&next_instr[1].cache);
uint16_t index = read_u16(&next_instr[3].cache);
- #line 1710 "Python/bytecodes.c"
+ #line 1729 "Python/bytecodes.c"
DEOPT_IF(!PyModule_CheckExact(owner), LOAD_ATTR);
PyDictObject *dict = (PyDictObject *)((PyModuleObject *)owner)->md_dict;
assert(dict != NULL);
@@ -2401,7 +2509,7 @@
STAT_INC(LOAD_ATTR, hit);
Py_INCREF(res);
res2 = NULL;
- #line 2405 "Python/generated_cases.c.h"
+ #line 2513 "Python/generated_cases.c.h"
Py_DECREF(owner);
STACK_GROW(((oparg & 1) ? 1 : 0));
stack_pointer[-1] = res;
@@ -2416,7 +2524,7 @@
PyObject *res;
uint32_t type_version = read_u32(&next_instr[1].cache);
uint16_t index = read_u16(&next_instr[3].cache);
- #line 1726 "Python/bytecodes.c"
+ #line 1745 "Python/bytecodes.c"
PyTypeObject *tp = Py_TYPE(owner);
assert(type_version != 0);
DEOPT_IF(tp->tp_version_tag != type_version, LOAD_ATTR);
@@ -2443,7 +2551,7 @@
STAT_INC(LOAD_ATTR, hit);
Py_INCREF(res);
res2 = NULL;
- #line 2447 "Python/generated_cases.c.h"
+ #line 2555 "Python/generated_cases.c.h"
Py_DECREF(owner);
STACK_GROW(((oparg & 1) ? 1 : 0));
stack_pointer[-1] = res;
@@ -2458,7 +2566,7 @@
PyObject *res;
uint32_t type_version = read_u32(&next_instr[1].cache);
uint16_t index = read_u16(&next_instr[3].cache);
- #line 1756 "Python/bytecodes.c"
+ #line 1775 "Python/bytecodes.c"
PyTypeObject *tp = Py_TYPE(owner);
assert(type_version != 0);
DEOPT_IF(tp->tp_version_tag != type_version, LOAD_ATTR);
@@ -2468,7 +2576,7 @@
STAT_INC(LOAD_ATTR, hit);
Py_INCREF(res);
res2 = NULL;
- #line 2472 "Python/generated_cases.c.h"
+ #line 2580 "Python/generated_cases.c.h"
Py_DECREF(owner);
STACK_GROW(((oparg & 1) ? 1 : 0));
stack_pointer[-1] = res;
@@ -2483,7 +2591,7 @@
PyObject *res;
uint32_t type_version = read_u32(&next_instr[1].cache);
PyObject *descr = read_obj(&next_instr[5].cache);
- #line 1769 "Python/bytecodes.c"
+ #line 1788 "Python/bytecodes.c"
DEOPT_IF(!PyType_Check(cls), LOAD_ATTR);
DEOPT_IF(((PyTypeObject *)cls)->tp_version_tag != type_version,
@@ -2495,7 +2603,7 @@
res = descr;
assert(res != NULL);
Py_INCREF(res);
- #line 2499 "Python/generated_cases.c.h"
+ #line 2607 "Python/generated_cases.c.h"
Py_DECREF(cls);
STACK_GROW(((oparg & 1) ? 1 : 0));
stack_pointer[-1] = res;
@@ -2509,7 +2617,7 @@
uint32_t type_version = read_u32(&next_instr[1].cache);
uint32_t func_version = read_u32(&next_instr[3].cache);
PyObject *fget = read_obj(&next_instr[5].cache);
- #line 1784 "Python/bytecodes.c"
+ #line 1803 "Python/bytecodes.c"
DEOPT_IF(tstate->interp->eval_frame, LOAD_ATTR);
PyTypeObject *cls = Py_TYPE(owner);
@@ -2533,7 +2641,7 @@
JUMPBY(INLINE_CACHE_ENTRIES_LOAD_ATTR);
frame->return_offset = 0;
DISPATCH_INLINED(new_frame);
- #line 2537 "Python/generated_cases.c.h"
+ #line 2645 "Python/generated_cases.c.h"
}
TARGET(LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN) {
@@ -2541,7 +2649,7 @@
uint32_t type_version = read_u32(&next_instr[1].cache);
uint32_t func_version = read_u32(&next_instr[3].cache);
PyObject *getattribute = read_obj(&next_instr[5].cache);
- #line 1810 "Python/bytecodes.c"
+ #line 1829 "Python/bytecodes.c"
DEOPT_IF(tstate->interp->eval_frame, LOAD_ATTR);
PyTypeObject *cls = Py_TYPE(owner);
DEOPT_IF(cls->tp_version_tag != type_version, LOAD_ATTR);
@@ -2567,7 +2675,7 @@
JUMPBY(INLINE_CACHE_ENTRIES_LOAD_ATTR);
frame->return_offset = 0;
DISPATCH_INLINED(new_frame);
- #line 2571 "Python/generated_cases.c.h"
+ #line 2679 "Python/generated_cases.c.h"
}
TARGET(STORE_ATTR_INSTANCE_VALUE) {
@@ -2575,7 +2683,7 @@
PyObject *value = stack_pointer[-2];
uint32_t type_version = read_u32(&next_instr[1].cache);
uint16_t index = read_u16(&next_instr[3].cache);
- #line 1838 "Python/bytecodes.c"
+ #line 1857 "Python/bytecodes.c"
PyTypeObject *tp = Py_TYPE(owner);
assert(type_version != 0);
DEOPT_IF(tp->tp_version_tag != type_version, STORE_ATTR);
@@ -2593,7 +2701,7 @@
Py_DECREF(old_value);
}
Py_DECREF(owner);
- #line 2597 "Python/generated_cases.c.h"
+ #line 2705 "Python/generated_cases.c.h"
STACK_SHRINK(2);
next_instr += 4;
DISPATCH();
@@ -2604,7 +2712,7 @@
PyObject *value = stack_pointer[-2];
uint32_t type_version = read_u32(&next_instr[1].cache);
uint16_t hint = read_u16(&next_instr[3].cache);
- #line 1858 "Python/bytecodes.c"
+ #line 1877 "Python/bytecodes.c"
PyTypeObject *tp = Py_TYPE(owner);
assert(type_version != 0);
DEOPT_IF(tp->tp_version_tag != type_version, STORE_ATTR);
@@ -2643,7 +2751,7 @@
/* PEP 509 */
dict->ma_version_tag = new_version;
Py_DECREF(owner);
- #line 2647 "Python/generated_cases.c.h"
+ #line 2755 "Python/generated_cases.c.h"
STACK_SHRINK(2);
next_instr += 4;
DISPATCH();
@@ -2654,7 +2762,7 @@
PyObject *value = stack_pointer[-2];
uint32_t type_version = read_u32(&next_instr[1].cache);
uint16_t index = read_u16(&next_instr[3].cache);
- #line 1899 "Python/bytecodes.c"
+ #line 1918 "Python/bytecodes.c"
PyTypeObject *tp = Py_TYPE(owner);
assert(type_version != 0);
DEOPT_IF(tp->tp_version_tag != type_version, STORE_ATTR);
@@ -2664,7 +2772,7 @@
*(PyObject **)addr = value;
Py_XDECREF(old_value);
Py_DECREF(owner);
- #line 2668 "Python/generated_cases.c.h"
+ #line 2776 "Python/generated_cases.c.h"
STACK_SHRINK(2);
next_instr += 4;
DISPATCH();
@@ -2676,7 +2784,7 @@
PyObject *right = stack_pointer[-1];
PyObject *left = stack_pointer[-2];
PyObject *res;
- #line 1918 "Python/bytecodes.c"
+ #line 1937 "Python/bytecodes.c"
#if ENABLE_SPECIALIZATION
_PyCompareOpCache *cache = (_PyCompareOpCache *)next_instr;
if (ADAPTIVE_COUNTER_IS_ZERO(cache->counter)) {
@@ -2689,12 +2797,12 @@
#endif /* ENABLE_SPECIALIZATION */
assert((oparg >> 4) <= Py_GE);
res = PyObject_RichCompare(left, right, oparg>>4);
- #line 2693 "Python/generated_cases.c.h"
+ #line 2801 "Python/generated_cases.c.h"
Py_DECREF(left);
Py_DECREF(right);
- #line 1931 "Python/bytecodes.c"
+ #line 1950 "Python/bytecodes.c"
if (res == NULL) goto pop_2_error;
- #line 2698 "Python/generated_cases.c.h"
+ #line 2806 "Python/generated_cases.c.h"
STACK_SHRINK(1);
stack_pointer[-1] = res;
next_instr += 1;
@@ -2705,7 +2813,7 @@
PyObject *right = stack_pointer[-1];
PyObject *left = stack_pointer[-2];
PyObject *res;
- #line 1935 "Python/bytecodes.c"
+ #line 1954 "Python/bytecodes.c"
DEOPT_IF(!PyFloat_CheckExact(left), COMPARE_OP);
DEOPT_IF(!PyFloat_CheckExact(right), COMPARE_OP);
STAT_INC(COMPARE_OP, hit);
@@ -2717,7 +2825,7 @@
_Py_DECREF_SPECIALIZED(right, _PyFloat_ExactDealloc);
res = (sign_ish & oparg) ? Py_True : Py_False;
Py_INCREF(res);
- #line 2721 "Python/generated_cases.c.h"
+ #line 2829 "Python/generated_cases.c.h"
STACK_SHRINK(1);
stack_pointer[-1] = res;
next_instr += 1;
@@ -2728,7 +2836,7 @@
PyObject *right = stack_pointer[-1];
PyObject *left = stack_pointer[-2];
PyObject *res;
- #line 1950 "Python/bytecodes.c"
+ #line 1969 "Python/bytecodes.c"
DEOPT_IF(!PyLong_CheckExact(left), COMPARE_OP);
DEOPT_IF(!PyLong_CheckExact(right), COMPARE_OP);
DEOPT_IF(!_PyLong_IsCompact((PyLongObject *)left), COMPARE_OP);
@@ -2744,7 +2852,7 @@
_Py_DECREF_SPECIALIZED(right, (destructor)PyObject_Free);
res = (sign_ish & oparg) ? Py_True : Py_False;
Py_INCREF(res);
- #line 2748 "Python/generated_cases.c.h"
+ #line 2856 "Python/generated_cases.c.h"
STACK_SHRINK(1);
stack_pointer[-1] = res;
next_instr += 1;
@@ -2755,7 +2863,7 @@
PyObject *right = stack_pointer[-1];
PyObject *left = stack_pointer[-2];
PyObject *res;
- #line 1969 "Python/bytecodes.c"
+ #line 1988 "Python/bytecodes.c"
DEOPT_IF(!PyUnicode_CheckExact(left), COMPARE_OP);
DEOPT_IF(!PyUnicode_CheckExact(right), COMPARE_OP);
STAT_INC(COMPARE_OP, hit);
@@ -2768,7 +2876,7 @@
assert(COMPARISON_NOT_EQUALS + 1 == COMPARISON_EQUALS);
res = ((COMPARISON_NOT_EQUALS + eq) & oparg) ? Py_True : Py_False;
Py_INCREF(res);
- #line 2772 "Python/generated_cases.c.h"
+ #line 2880 "Python/generated_cases.c.h"
STACK_SHRINK(1);
stack_pointer[-1] = res;
next_instr += 1;
@@ -2779,14 +2887,14 @@
PyObject *right = stack_pointer[-1];
PyObject *left = stack_pointer[-2];
PyObject *b;
- #line 1984 "Python/bytecodes.c"
+ #line 2003 "Python/bytecodes.c"
int res = Py_Is(left, right) ^ oparg;
- #line 2785 "Python/generated_cases.c.h"
+ #line 2893 "Python/generated_cases.c.h"
Py_DECREF(left);
Py_DECREF(right);
- #line 1986 "Python/bytecodes.c"
+ #line 2005 "Python/bytecodes.c"
b = Py_NewRef(res ? Py_True : Py_False);
- #line 2790 "Python/generated_cases.c.h"
+ #line 2898 "Python/generated_cases.c.h"
STACK_SHRINK(1);
stack_pointer[-1] = b;
DISPATCH();
@@ -2796,15 +2904,15 @@
PyObject *right = stack_pointer[-1];
PyObject *left = stack_pointer[-2];
PyObject *b;
- #line 1990 "Python/bytecodes.c"
+ #line 2009 "Python/bytecodes.c"
int res = PySequence_Contains(right, left);
- #line 2802 "Python/generated_cases.c.h"
+ #line 2910 "Python/generated_cases.c.h"
Py_DECREF(left);
Py_DECREF(right);
- #line 1992 "Python/bytecodes.c"
+ #line 2011 "Python/bytecodes.c"
if (res < 0) goto pop_2_error;
b = Py_NewRef((res^oparg) ? Py_True : Py_False);
- #line 2808 "Python/generated_cases.c.h"
+ #line 2916 "Python/generated_cases.c.h"
STACK_SHRINK(1);
stack_pointer[-1] = b;
DISPATCH();
@@ -2815,12 +2923,12 @@
PyObject *exc_value = stack_pointer[-2];
PyObject *rest;
PyObject *match;
- #line 1997 "Python/bytecodes.c"
+ #line 2016 "Python/bytecodes.c"
if (check_except_star_type_valid(tstate, match_type) < 0) {
- #line 2821 "Python/generated_cases.c.h"
+ #line 2929 "Python/generated_cases.c.h"
Py_DECREF(exc_value);
Py_DECREF(match_type);
- #line 1999 "Python/bytecodes.c"
+ #line 2018 "Python/bytecodes.c"
if (true) goto pop_2_error;
}
@@ -2828,10 +2936,10 @@
rest = NULL;
int res = exception_group_match(exc_value, match_type,
&match, &rest);
- #line 2832 "Python/generated_cases.c.h"
+ #line 2940 "Python/generated_cases.c.h"
Py_DECREF(exc_value);
Py_DECREF(match_type);
- #line 2007 "Python/bytecodes.c"
+ #line 2026 "Python/bytecodes.c"
if (res < 0) goto pop_2_error;
assert((match == NULL) == (rest == NULL));
@@ -2840,7 +2948,7 @@
if (!Py_IsNone(match)) {
PyErr_SetHandledException(match);
}
- #line 2844 "Python/generated_cases.c.h"
+ #line 2952 "Python/generated_cases.c.h"
stack_pointer[-1] = match;
stack_pointer[-2] = rest;
DISPATCH();
@@ -2850,21 +2958,21 @@
PyObject *right = stack_pointer[-1];
PyObject *left = stack_pointer[-2];
PyObject *b;
- #line 2018 "Python/bytecodes.c"
+ #line 2037 "Python/bytecodes.c"
assert(PyExceptionInstance_Check(left));
if (check_except_type_valid(tstate, right) < 0) {
- #line 2857 "Python/generated_cases.c.h"
+ #line 2965 "Python/generated_cases.c.h"
Py_DECREF(right);
- #line 2021 "Python/bytecodes.c"
+ #line 2040 "Python/bytecodes.c"
if (true) goto pop_1_error;
}
int res = PyErr_GivenExceptionMatches(left, right);
- #line 2864 "Python/generated_cases.c.h"
+ #line 2972 "Python/generated_cases.c.h"
Py_DECREF(right);
- #line 2026 "Python/bytecodes.c"
+ #line 2045 "Python/bytecodes.c"
b = Py_NewRef(res ? Py_True : Py_False);
- #line 2868 "Python/generated_cases.c.h"
+ #line 2976 "Python/generated_cases.c.h"
stack_pointer[-1] = b;
DISPATCH();
}
@@ -2873,15 +2981,15 @@
PyObject *fromlist = stack_pointer[-1];
PyObject *level = stack_pointer[-2];
PyObject *res;
- #line 2030 "Python/bytecodes.c"
+ #line 2049 "Python/bytecodes.c"
PyObject *name = GETITEM(frame->f_code->co_names, oparg);
res = import_name(tstate, frame, name, fromlist, level);
- #line 2880 "Python/generated_cases.c.h"
+ #line 2988 "Python/generated_cases.c.h"
Py_DECREF(level);
Py_DECREF(fromlist);
- #line 2033 "Python/bytecodes.c"
+ #line 2052 "Python/bytecodes.c"
if (res == NULL) goto pop_2_error;
- #line 2885 "Python/generated_cases.c.h"
+ #line 2993 "Python/generated_cases.c.h"
STACK_SHRINK(1);
stack_pointer[-1] = res;
DISPATCH();
@@ -2890,29 +2998,29 @@
TARGET(IMPORT_FROM) {
PyObject *from = stack_pointer[-1];
PyObject *res;
- #line 2037 "Python/bytecodes.c"
+ #line 2056 "Python/bytecodes.c"
PyObject *name = GETITEM(frame->f_code->co_names, oparg);
res = import_from(tstate, from, name);
if (res == NULL) goto error;
- #line 2898 "Python/generated_cases.c.h"
+ #line 3006 "Python/generated_cases.c.h"
STACK_GROW(1);
stack_pointer[-1] = res;
DISPATCH();
}
TARGET(JUMP_FORWARD) {
- #line 2043 "Python/bytecodes.c"
+ #line 2062 "Python/bytecodes.c"
JUMPBY(oparg);
- #line 2907 "Python/generated_cases.c.h"
+ #line 3015 "Python/generated_cases.c.h"
DISPATCH();
}
TARGET(JUMP_BACKWARD) {
PREDICTED(JUMP_BACKWARD);
- #line 2047 "Python/bytecodes.c"
+ #line 2066 "Python/bytecodes.c"
assert(oparg < INSTR_OFFSET());
JUMPBY(-oparg);
- #line 2916 "Python/generated_cases.c.h"
+ #line 3024 "Python/generated_cases.c.h"
CHECK_EVAL_BREAKER();
DISPATCH();
}
@@ -2920,7 +3028,7 @@
TARGET(POP_JUMP_IF_FALSE) {
PREDICTED(POP_JUMP_IF_FALSE);
PyObject *cond = stack_pointer[-1];
- #line 2053 "Python/bytecodes.c"
+ #line 2072 "Python/bytecodes.c"
if (Py_IsTrue(cond)) {
_Py_DECREF_NO_DEALLOC(cond);
}
@@ -2930,9 +3038,9 @@
}
else {
int err = PyObject_IsTrue(cond);
- #line 2934 "Python/generated_cases.c.h"
+ #line 3042 "Python/generated_cases.c.h"
Py_DECREF(cond);
- #line 2063 "Python/bytecodes.c"
+ #line 2082 "Python/bytecodes.c"
if (err == 0) {
JUMPBY(oparg);
}
@@ -2940,14 +3048,14 @@
if (err < 0) goto pop_1_error;
}
}
- #line 2944 "Python/generated_cases.c.h"
+ #line 3052 "Python/generated_cases.c.h"
STACK_SHRINK(1);
DISPATCH();
}
TARGET(POP_JUMP_IF_TRUE) {
PyObject *cond = stack_pointer[-1];
- #line 2073 "Python/bytecodes.c"
+ #line 2092 "Python/bytecodes.c"
if (Py_IsFalse(cond)) {
_Py_DECREF_NO_DEALLOC(cond);
}
@@ -2957,9 +3065,9 @@
}
else {
int err = PyObject_IsTrue(cond);
- #line 2961 "Python/generated_cases.c.h"
+ #line 3069 "Python/generated_cases.c.h"
Py_DECREF(cond);
- #line 2083 "Python/bytecodes.c"
+ #line 2102 "Python/bytecodes.c"
if (err > 0) {
JUMPBY(oparg);
}
@@ -2967,67 +3075,67 @@
if (err < 0) goto pop_1_error;
}
}
- #line 2971 "Python/generated_cases.c.h"
+ #line 3079 "Python/generated_cases.c.h"
STACK_SHRINK(1);
DISPATCH();
}
TARGET(POP_JUMP_IF_NOT_NONE) {
PyObject *value = stack_pointer[-1];
- #line 2093 "Python/bytecodes.c"
+ #line 2112 "Python/bytecodes.c"
if (!Py_IsNone(value)) {
- #line 2980 "Python/generated_cases.c.h"
+ #line 3088 "Python/generated_cases.c.h"
Py_DECREF(value);
- #line 2095 "Python/bytecodes.c"
+ #line 2114 "Python/bytecodes.c"
JUMPBY(oparg);
}
else {
_Py_DECREF_NO_DEALLOC(value);
}
- #line 2988 "Python/generated_cases.c.h"
+ #line 3096 "Python/generated_cases.c.h"
STACK_SHRINK(1);
DISPATCH();
}
TARGET(POP_JUMP_IF_NONE) {
PyObject *value = stack_pointer[-1];
- #line 2103 "Python/bytecodes.c"
+ #line 2122 "Python/bytecodes.c"
if (Py_IsNone(value)) {
_Py_DECREF_NO_DEALLOC(value);
JUMPBY(oparg);
}
else {
- #line 3001 "Python/generated_cases.c.h"
+ #line 3109 "Python/generated_cases.c.h"
Py_DECREF(value);
- #line 2109 "Python/bytecodes.c"
+ #line 2128 "Python/bytecodes.c"
}
- #line 3005 "Python/generated_cases.c.h"
+ #line 3113 "Python/generated_cases.c.h"
STACK_SHRINK(1);
DISPATCH();
}
TARGET(JUMP_BACKWARD_NO_INTERRUPT) {
- #line 2113 "Python/bytecodes.c"
+ #line 2132 "Python/bytecodes.c"
/* This bytecode is used in the `yield from` or `await` loop.
* If there is an interrupt, we want it handled in the innermost
* generator or coroutine, so we deliberately do not check it here.
* (see bpo-30039).
*/
JUMPBY(-oparg);
- #line 3018 "Python/generated_cases.c.h"
+ #line 3126 "Python/generated_cases.c.h"
DISPATCH();
}
TARGET(GET_LEN) {
PyObject *obj = stack_pointer[-1];
PyObject *len_o;
- #line 2122 "Python/bytecodes.c"
+ #line 2141 "Python/bytecodes.c"
// PUSH(len(TOS))
Py_ssize_t len_i = PyObject_Length(obj);
if (len_i < 0) goto error;
len_o = PyLong_FromSsize_t(len_i);
if (len_o == NULL) goto error;
- #line 3031 "Python/generated_cases.c.h"
+ #line 3139 "Python/generated_cases.c.h"
STACK_GROW(1);
stack_pointer[-1] = len_o;
DISPATCH();
@@ -3038,16 +3146,16 @@
PyObject *type = stack_pointer[-2];
PyObject *subject = stack_pointer[-3];
PyObject *attrs;
- #line 2130 "Python/bytecodes.c"
+ #line 2149 "Python/bytecodes.c"
// Pop TOS and TOS1. Set TOS to a tuple of attributes on success, or
// None on failure.
assert(PyTuple_CheckExact(names));
attrs = match_class(tstate, subject, type, oparg, names);
- #line 3047 "Python/generated_cases.c.h"
+ #line 3155 "Python/generated_cases.c.h"
Py_DECREF(subject);
Py_DECREF(type);
Py_DECREF(names);
- #line 2135 "Python/bytecodes.c"
+ #line 2154 "Python/bytecodes.c"
if (attrs) {
assert(PyTuple_CheckExact(attrs)); // Success!
}
@@ -3055,7 +3163,7 @@
if (_PyErr_Occurred(tstate)) goto pop_3_error;
attrs = Py_NewRef(Py_None); // Failure!
}
- #line 3059 "Python/generated_cases.c.h"
+ #line 3167 "Python/generated_cases.c.h"
STACK_SHRINK(2);
stack_pointer[-1] = attrs;
DISPATCH();
@@ -3064,10 +3172,10 @@
TARGET(MATCH_MAPPING) {
PyObject *subject = stack_pointer[-1];
PyObject *res;
- #line 2145 "Python/bytecodes.c"
+ #line 2164 "Python/bytecodes.c"
int match = Py_TYPE(subject)->tp_flags & Py_TPFLAGS_MAPPING;
res = Py_NewRef(match ? Py_True : Py_False);
- #line 3071 "Python/generated_cases.c.h"
+ #line 3179 "Python/generated_cases.c.h"
STACK_GROW(1);
stack_pointer[-1] = res;
PREDICT(POP_JUMP_IF_FALSE);
@@ -3077,10 +3185,10 @@
TARGET(MATCH_SEQUENCE) {
PyObject *subject = stack_pointer[-1];
PyObject *res;
- #line 2151 "Python/bytecodes.c"
+ #line 2170 "Python/bytecodes.c"
int match = Py_TYPE(subject)->tp_flags & Py_TPFLAGS_SEQUENCE;
res = Py_NewRef(match ? Py_True : Py_False);
- #line 3084 "Python/generated_cases.c.h"
+ #line 3192 "Python/generated_cases.c.h"
STACK_GROW(1);
stack_pointer[-1] = res;
PREDICT(POP_JUMP_IF_FALSE);
@@ -3091,11 +3199,11 @@
PyObject *keys = stack_pointer[-1];
PyObject *subject = stack_pointer[-2];
PyObject *values_or_none;
- #line 2157 "Python/bytecodes.c"
+ #line 2176 "Python/bytecodes.c"
// On successful match, PUSH(values). Otherwise, PUSH(None).
values_or_none = match_keys(tstate, subject, keys);
if (values_or_none == NULL) goto error;
- #line 3099 "Python/generated_cases.c.h"
+ #line 3207 "Python/generated_cases.c.h"
STACK_GROW(1);
stack_pointer[-1] = values_or_none;
DISPATCH();
@@ -3104,14 +3212,14 @@
TARGET(GET_ITER) {
PyObject *iterable = stack_pointer[-1];
PyObject *iter;
- #line 2163 "Python/bytecodes.c"
+ #line 2182 "Python/bytecodes.c"
/* before: [obj]; after [getiter(obj)] */
iter = PyObject_GetIter(iterable);
- #line 3111 "Python/generated_cases.c.h"
+ #line 3219 "Python/generated_cases.c.h"
Py_DECREF(iterable);
- #line 2166 "Python/bytecodes.c"
+ #line 2185 "Python/bytecodes.c"
if (iter == NULL) goto pop_1_error;
- #line 3115 "Python/generated_cases.c.h"
+ #line 3223 "Python/generated_cases.c.h"
stack_pointer[-1] = iter;
DISPATCH();
}
@@ -3119,7 +3227,7 @@
TARGET(GET_YIELD_FROM_ITER) {
PyObject *iterable = stack_pointer[-1];
PyObject *iter;
- #line 2170 "Python/bytecodes.c"
+ #line 2189 "Python/bytecodes.c"
/* before: [obj]; after [getiter(obj)] */
if (PyCoro_CheckExact(iterable)) {
/* `iterable` is a coroutine */
@@ -3142,11 +3250,11 @@
if (iter == NULL) {
goto error;
}
- #line 3146 "Python/generated_cases.c.h"
+ #line 3254 "Python/generated_cases.c.h"
Py_DECREF(iterable);
- #line 2193 "Python/bytecodes.c"
+ #line 2212 "Python/bytecodes.c"
}
- #line 3150 "Python/generated_cases.c.h"
+ #line 3258 "Python/generated_cases.c.h"
stack_pointer[-1] = iter;
PREDICT(LOAD_CONST);
DISPATCH();
@@ -3157,7 +3265,7 @@
static_assert(INLINE_CACHE_ENTRIES_FOR_ITER == 1, "incorrect cache size");
PyObject *iter = stack_pointer[-1];
PyObject *next;
- #line 2212 "Python/bytecodes.c"
+ #line 2231 "Python/bytecodes.c"
#if ENABLE_SPECIALIZATION
_PyForIterCache *cache = (_PyForIterCache *)next_instr;
if (ADAPTIVE_COUNTER_IS_ZERO(cache->counter)) {
@@ -3188,7 +3296,7 @@
DISPATCH();
}
// Common case: no jump, leave it to the code generator
- #line 3192 "Python/generated_cases.c.h"
+ #line 3300 "Python/generated_cases.c.h"
STACK_GROW(1);
stack_pointer[-1] = next;
next_instr += 1;
@@ -3196,7 +3304,7 @@
}
TARGET(INSTRUMENTED_FOR_ITER) {
- #line 2245 "Python/bytecodes.c"
+ #line 2264 "Python/bytecodes.c"
_Py_CODEUNIT *here = next_instr-1;
_Py_CODEUNIT *target;
PyObject *iter = TOP();
@@ -3222,14 +3330,14 @@
target = next_instr + INLINE_CACHE_ENTRIES_FOR_ITER + oparg + 1;
}
INSTRUMENTED_JUMP(here, target, PY_MONITORING_EVENT_BRANCH);
- #line 3226 "Python/generated_cases.c.h"
+ #line 3334 "Python/generated_cases.c.h"
DISPATCH();
}
TARGET(FOR_ITER_LIST) {
PyObject *iter = stack_pointer[-1];
PyObject *next;
- #line 2273 "Python/bytecodes.c"
+ #line 2292 "Python/bytecodes.c"
DEOPT_IF(Py_TYPE(iter) != &PyListIter_Type, FOR_ITER);
_PyListIterObject *it = (_PyListIterObject *)iter;
STAT_INC(FOR_ITER, hit);
@@ -3249,7 +3357,7 @@
DISPATCH();
end_for_iter_list:
// Common case: no jump, leave it to the code generator
- #line 3253 "Python/generated_cases.c.h"
+ #line 3361 "Python/generated_cases.c.h"
STACK_GROW(1);
stack_pointer[-1] = next;
next_instr += 1;
@@ -3259,7 +3367,7 @@
TARGET(FOR_ITER_TUPLE) {
PyObject *iter = stack_pointer[-1];
PyObject *next;
- #line 2295 "Python/bytecodes.c"
+ #line 2314 "Python/bytecodes.c"
_PyTupleIterObject *it = (_PyTupleIterObject *)iter;
DEOPT_IF(Py_TYPE(it) != &PyTupleIter_Type, FOR_ITER);
STAT_INC(FOR_ITER, hit);
@@ -3279,7 +3387,7 @@
DISPATCH();
end_for_iter_tuple:
// Common case: no jump, leave it to the code generator
- #line 3283 "Python/generated_cases.c.h"
+ #line 3391 "Python/generated_cases.c.h"
STACK_GROW(1);
stack_pointer[-1] = next;
next_instr += 1;
@@ -3289,7 +3397,7 @@
TARGET(FOR_ITER_RANGE) {
PyObject *iter = stack_pointer[-1];
PyObject *next;
- #line 2317 "Python/bytecodes.c"
+ #line 2336 "Python/bytecodes.c"
_PyRangeIterObject *r = (_PyRangeIterObject *)iter;
DEOPT_IF(Py_TYPE(r) != &PyRangeIter_Type, FOR_ITER);
STAT_INC(FOR_ITER, hit);
@@ -3307,7 +3415,7 @@
if (next == NULL) {
goto error;
}
- #line 3311 "Python/generated_cases.c.h"
+ #line 3419 "Python/generated_cases.c.h"
STACK_GROW(1);
stack_pointer[-1] = next;
next_instr += 1;
@@ -3316,7 +3424,7 @@
TARGET(FOR_ITER_GEN) {
PyObject *iter = stack_pointer[-1];
- #line 2337 "Python/bytecodes.c"
+ #line 2356 "Python/bytecodes.c"
DEOPT_IF(tstate->interp->eval_frame, FOR_ITER);
PyGenObject *gen = (PyGenObject *)iter;
DEOPT_IF(Py_TYPE(gen) != &PyGen_Type, FOR_ITER);
@@ -3332,14 +3440,14 @@
assert(next_instr[oparg].op.code == END_FOR ||
next_instr[oparg].op.code == INSTRUMENTED_END_FOR);
DISPATCH_INLINED(gen_frame);
- #line 3336 "Python/generated_cases.c.h"
+ #line 3444 "Python/generated_cases.c.h"
}
TARGET(BEFORE_ASYNC_WITH) {
PyObject *mgr = stack_pointer[-1];
PyObject *exit;
PyObject *res;
- #line 2355 "Python/bytecodes.c"
+ #line 2374 "Python/bytecodes.c"
PyObject *enter = _PyObject_LookupSpecial(mgr, &_Py_ID(__aenter__));
if (enter == NULL) {
if (!_PyErr_Occurred(tstate)) {
@@ -3362,16 +3470,16 @@
Py_DECREF(enter);
goto error;
}
- #line 3366 "Python/generated_cases.c.h"
+ #line 3474 "Python/generated_cases.c.h"
Py_DECREF(mgr);
- #line 2378 "Python/bytecodes.c"
+ #line 2397 "Python/bytecodes.c"
res = _PyObject_CallNoArgs(enter);
Py_DECREF(enter);
if (res == NULL) {
Py_DECREF(exit);
if (true) goto pop_1_error;
}
- #line 3375 "Python/generated_cases.c.h"
+ #line 3483 "Python/generated_cases.c.h"
STACK_GROW(1);
stack_pointer[-1] = res;
stack_pointer[-2] = exit;
@@ -3383,7 +3491,7 @@
PyObject *mgr = stack_pointer[-1];
PyObject *exit;
PyObject *res;
- #line 2388 "Python/bytecodes.c"
+ #line 2407 "Python/bytecodes.c"
/* pop the context manager, push its __exit__ and the
* value returned from calling its __enter__
*/
@@ -3409,16 +3517,16 @@
Py_DECREF(enter);
goto error;
}
- #line 3413 "Python/generated_cases.c.h"
+ #line 3521 "Python/generated_cases.c.h"
Py_DECREF(mgr);
- #line 2414 "Python/bytecodes.c"
+ #line 2433 "Python/bytecodes.c"
res = _PyObject_CallNoArgs(enter);
Py_DECREF(enter);
if (res == NULL) {
Py_DECREF(exit);
if (true) goto pop_1_error;
}
- #line 3422 "Python/generated_cases.c.h"
+ #line 3530 "Python/generated_cases.c.h"
STACK_GROW(1);
stack_pointer[-1] = res;
stack_pointer[-2] = exit;
@@ -3430,7 +3538,7 @@
PyObject *lasti = stack_pointer[-3];
PyObject *exit_func = stack_pointer[-4];
PyObject *res;
- #line 2423 "Python/bytecodes.c"
+ #line 2442 "Python/bytecodes.c"
/* At the top of the stack are 4 values:
- val: TOP = exc_info()
- unused: SECOND = previous exception
@@ -3451,7 +3559,7 @@
res = PyObject_Vectorcall(exit_func, stack + 1,
3 | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL);
if (res == NULL) goto error;
- #line 3455 "Python/generated_cases.c.h"
+ #line 3563 "Python/generated_cases.c.h"
STACK_GROW(1);
stack_pointer[-1] = res;
DISPATCH();
@@ -3460,7 +3568,7 @@
TARGET(PUSH_EXC_INFO) {
PyObject *new_exc = stack_pointer[-1];
PyObject *prev_exc;
- #line 2446 "Python/bytecodes.c"
+ #line 2465 "Python/bytecodes.c"
_PyErr_StackItem *exc_info = tstate->exc_info;
if (exc_info->exc_value != NULL) {
prev_exc = exc_info->exc_value;
@@ -3470,7 +3578,7 @@
}
assert(PyExceptionInstance_Check(new_exc));
exc_info->exc_value = Py_NewRef(new_exc);
- #line 3474 "Python/generated_cases.c.h"
+ #line 3582 "Python/generated_cases.c.h"
STACK_GROW(1);
stack_pointer[-1] = new_exc;
stack_pointer[-2] = prev_exc;
@@ -3484,7 +3592,7 @@
uint32_t type_version = read_u32(&next_instr[1].cache);
uint32_t keys_version = read_u32(&next_instr[3].cache);
PyObject *descr = read_obj(&next_instr[5].cache);
- #line 2458 "Python/bytecodes.c"
+ #line 2477 "Python/bytecodes.c"
/* Cached method object */
PyTypeObject *self_cls = Py_TYPE(self);
assert(type_version != 0);
@@ -3501,7 +3609,7 @@
assert(_PyType_HasFeature(Py_TYPE(res2), Py_TPFLAGS_METHOD_DESCRIPTOR));
res = self;
assert(oparg & 1);
- #line 3505 "Python/generated_cases.c.h"
+ #line 3613 "Python/generated_cases.c.h"
STACK_GROW(((oparg & 1) ? 1 : 0));
stack_pointer[-1] = res;
if (oparg & 1) { stack_pointer[-(1 + ((oparg & 1) ? 1 : 0))] = res2; }
@@ -3515,7 +3623,7 @@
PyObject *res;
uint32_t type_version = read_u32(&next_instr[1].cache);
PyObject *descr = read_obj(&next_instr[5].cache);
- #line 2477 "Python/bytecodes.c"
+ #line 2496 "Python/bytecodes.c"
PyTypeObject *self_cls = Py_TYPE(self);
DEOPT_IF(self_cls->tp_version_tag != type_version, LOAD_ATTR);
assert(self_cls->tp_dictoffset == 0);
@@ -3525,7 +3633,7 @@
res2 = Py_NewRef(descr);
res = self;
assert(oparg & 1);
- #line 3529 "Python/generated_cases.c.h"
+ #line 3637 "Python/generated_cases.c.h"
STACK_GROW(((oparg & 1) ? 1 : 0));
stack_pointer[-1] = res;
if (oparg & 1) { stack_pointer[-(1 + ((oparg & 1) ? 1 : 0))] = res2; }
@@ -3539,7 +3647,7 @@
PyObject *res;
uint32_t type_version = read_u32(&next_instr[1].cache);
PyObject *descr = read_obj(&next_instr[5].cache);
- #line 2489 "Python/bytecodes.c"
+ #line 2508 "Python/bytecodes.c"
PyTypeObject *self_cls = Py_TYPE(self);
DEOPT_IF(self_cls->tp_version_tag != type_version, LOAD_ATTR);
Py_ssize_t dictoffset = self_cls->tp_dictoffset;
@@ -3553,7 +3661,7 @@
res2 = Py_NewRef(descr);
res = self;
assert(oparg & 1);
- #line 3557 "Python/generated_cases.c.h"
+ #line 3665 "Python/generated_cases.c.h"
STACK_GROW(((oparg & 1) ? 1 : 0));
stack_pointer[-1] = res;
if (oparg & 1) { stack_pointer[-(1 + ((oparg & 1) ? 1 : 0))] = res2; }
@@ -3562,16 +3670,16 @@
}
TARGET(KW_NAMES) {
- #line 2505 "Python/bytecodes.c"
+ #line 2524 "Python/bytecodes.c"
assert(kwnames == NULL);
assert(oparg < PyTuple_GET_SIZE(frame->f_code->co_consts));
kwnames = GETITEM(frame->f_code->co_consts, oparg);
- #line 3570 "Python/generated_cases.c.h"
+ #line 3678 "Python/generated_cases.c.h"
DISPATCH();
}
TARGET(INSTRUMENTED_CALL) {
- #line 2511 "Python/bytecodes.c"
+ #line 2530 "Python/bytecodes.c"
int is_meth = PEEK(oparg+2) != NULL;
int total_args = oparg + is_meth;
PyObject *function = PEEK(total_args + 1);
@@ -3584,7 +3692,7 @@
_PyCallCache *cache = (_PyCallCache *)next_instr;
INCREMENT_ADAPTIVE_COUNTER(cache->counter);
GO_TO_INSTRUCTION(CALL);
- #line 3588 "Python/generated_cases.c.h"
+ #line 3696 "Python/generated_cases.c.h"
}
TARGET(CALL) {
@@ -3594,7 +3702,7 @@
PyObject *callable = stack_pointer[-(1 + oparg)];
PyObject *method = stack_pointer[-(2 + oparg)];
PyObject *res;
- #line 2556 "Python/bytecodes.c"
+ #line 2575 "Python/bytecodes.c"
int is_meth = method != NULL;
int total_args = oparg;
if (is_meth) {
@@ -3676,7 +3784,7 @@
Py_DECREF(args[i]);
}
if (res == NULL) { STACK_SHRINK(oparg); goto pop_2_error; }
- #line 3680 "Python/generated_cases.c.h"
+ #line 3788 "Python/generated_cases.c.h"
STACK_SHRINK(oparg);
STACK_SHRINK(1);
stack_pointer[-1] = res;
@@ -3688,7 +3796,7 @@
TARGET(CALL_BOUND_METHOD_EXACT_ARGS) {
PyObject *callable = stack_pointer[-(1 + oparg)];
PyObject *method = stack_pointer[-(2 + oparg)];
- #line 2644 "Python/bytecodes.c"
+ #line 2663 "Python/bytecodes.c"
DEOPT_IF(method != NULL, CALL);
DEOPT_IF(Py_TYPE(callable) != &PyMethod_Type, CALL);
STAT_INC(CALL, hit);
@@ -3698,7 +3806,7 @@
PEEK(oparg + 2) = Py_NewRef(meth); // method
Py_DECREF(callable);
GO_TO_INSTRUCTION(CALL_PY_EXACT_ARGS);
- #line 3702 "Python/generated_cases.c.h"
+ #line 3810 "Python/generated_cases.c.h"
}
TARGET(CALL_PY_EXACT_ARGS) {
@@ -3707,7 +3815,7 @@
PyObject *callable = stack_pointer[-(1 + oparg)];
PyObject *method = stack_pointer[-(2 + oparg)];
uint32_t func_version = read_u32(&next_instr[1].cache);
- #line 2656 "Python/bytecodes.c"
+ #line 2675 "Python/bytecodes.c"
assert(kwnames == NULL);
DEOPT_IF(tstate->interp->eval_frame, CALL);
int is_meth = method != NULL;
@@ -3733,7 +3841,7 @@
JUMPBY(INLINE_CACHE_ENTRIES_CALL);
frame->return_offset = 0;
DISPATCH_INLINED(new_frame);
- #line 3737 "Python/generated_cases.c.h"
+ #line 3845 "Python/generated_cases.c.h"
}
TARGET(CALL_PY_WITH_DEFAULTS) {
@@ -3741,7 +3849,7 @@
PyObject *callable = stack_pointer[-(1 + oparg)];
PyObject *method = stack_pointer[-(2 + oparg)];
uint32_t func_version = read_u32(&next_instr[1].cache);
- #line 2684 "Python/bytecodes.c"
+ #line 2703 "Python/bytecodes.c"
assert(kwnames == NULL);
DEOPT_IF(tstate->interp->eval_frame, CALL);
int is_meth = method != NULL;
@@ -3777,7 +3885,7 @@
JUMPBY(INLINE_CACHE_ENTRIES_CALL);
frame->return_offset = 0;
DISPATCH_INLINED(new_frame);
- #line 3781 "Python/generated_cases.c.h"
+ #line 3889 "Python/generated_cases.c.h"
}
TARGET(CALL_NO_KW_TYPE_1) {
@@ -3785,7 +3893,7 @@
PyObject *callable = stack_pointer[-(1 + oparg)];
PyObject *null = stack_pointer[-(2 + oparg)];
PyObject *res;
- #line 2722 "Python/bytecodes.c"
+ #line 2741 "Python/bytecodes.c"
assert(kwnames == NULL);
assert(oparg == 1);
DEOPT_IF(null != NULL, CALL);
@@ -3795,7 +3903,7 @@
res = Py_NewRef(Py_TYPE(obj));
Py_DECREF(obj);
Py_DECREF(&PyType_Type); // I.e., callable
- #line 3799 "Python/generated_cases.c.h"
+ #line 3907 "Python/generated_cases.c.h"
STACK_SHRINK(oparg);
STACK_SHRINK(1);
stack_pointer[-1] = res;
@@ -3808,7 +3916,7 @@
PyObject *callable = stack_pointer[-(1 + oparg)];
PyObject *null = stack_pointer[-(2 + oparg)];
PyObject *res;
- #line 2734 "Python/bytecodes.c"
+ #line 2753 "Python/bytecodes.c"
assert(kwnames == NULL);
assert(oparg == 1);
DEOPT_IF(null != NULL, CALL);
@@ -3819,7 +3927,7 @@
Py_DECREF(arg);
Py_DECREF(&PyUnicode_Type); // I.e., callable
if (res == NULL) { STACK_SHRINK(oparg); goto pop_2_error; }
- #line 3823 "Python/generated_cases.c.h"
+ #line 3931 "Python/generated_cases.c.h"
STACK_SHRINK(oparg);
STACK_SHRINK(1);
stack_pointer[-1] = res;
@@ -3833,7 +3941,7 @@
PyObject *callable = stack_pointer[-(1 + oparg)];
PyObject *null = stack_pointer[-(2 + oparg)];
PyObject *res;
- #line 2748 "Python/bytecodes.c"
+ #line 2767 "Python/bytecodes.c"
assert(kwnames == NULL);
assert(oparg == 1);
DEOPT_IF(null != NULL, CALL);
@@ -3844,7 +3952,7 @@
Py_DECREF(arg);
Py_DECREF(&PyTuple_Type); // I.e., tuple
if (res == NULL) { STACK_SHRINK(oparg); goto pop_2_error; }
- #line 3848 "Python/generated_cases.c.h"
+ #line 3956 "Python/generated_cases.c.h"
STACK_SHRINK(oparg);
STACK_SHRINK(1);
stack_pointer[-1] = res;
@@ -3858,7 +3966,7 @@
PyObject *callable = stack_pointer[-(1 + oparg)];
PyObject *method = stack_pointer[-(2 + oparg)];
PyObject *res;
- #line 2762 "Python/bytecodes.c"
+ #line 2781 "Python/bytecodes.c"
int is_meth = method != NULL;
int total_args = oparg;
if (is_meth) {
@@ -3880,7 +3988,7 @@
}
Py_DECREF(tp);
if (res == NULL) { STACK_SHRINK(oparg); goto pop_2_error; }
- #line 3884 "Python/generated_cases.c.h"
+ #line 3992 "Python/generated_cases.c.h"
STACK_SHRINK(oparg);
STACK_SHRINK(1);
stack_pointer[-1] = res;
@@ -3894,7 +4002,7 @@
PyObject *callable = stack_pointer[-(1 + oparg)];
PyObject *method = stack_pointer[-(2 + oparg)];
PyObject *res;
- #line 2787 "Python/bytecodes.c"
+ #line 2806 "Python/bytecodes.c"
/* Builtin METH_O functions */
assert(kwnames == NULL);
int is_meth = method != NULL;
@@ -3922,7 +4030,7 @@
Py_DECREF(arg);
Py_DECREF(callable);
if (res == NULL) { STACK_SHRINK(oparg); goto pop_2_error; }
- #line 3926 "Python/generated_cases.c.h"
+ #line 4034 "Python/generated_cases.c.h"
STACK_SHRINK(oparg);
STACK_SHRINK(1);
stack_pointer[-1] = res;
@@ -3936,7 +4044,7 @@
PyObject *callable = stack_pointer[-(1 + oparg)];
PyObject *method = stack_pointer[-(2 + oparg)];
PyObject *res;
- #line 2818 "Python/bytecodes.c"
+ #line 2837 "Python/bytecodes.c"
/* Builtin METH_FASTCALL functions, without keywords */
assert(kwnames == NULL);
int is_meth = method != NULL;
@@ -3968,7 +4076,7 @@
'invalid'). In those cases an exception is set, so we must
handle it.
*/
- #line 3972 "Python/generated_cases.c.h"
+ #line 4080 "Python/generated_cases.c.h"
STACK_SHRINK(oparg);
STACK_SHRINK(1);
stack_pointer[-1] = res;
@@ -3982,7 +4090,7 @@
PyObject *callable = stack_pointer[-(1 + oparg)];
PyObject *method = stack_pointer[-(2 + oparg)];
PyObject *res;
- #line 2853 "Python/bytecodes.c"
+ #line 2872 "Python/bytecodes.c"
/* Builtin METH_FASTCALL | METH_KEYWORDS functions */
int is_meth = method != NULL;
int total_args = oparg;
@@ -4014,7 +4122,7 @@
}
Py_DECREF(callable);
if (res == NULL) { STACK_SHRINK(oparg); goto pop_2_error; }
- #line 4018 "Python/generated_cases.c.h"
+ #line 4126 "Python/generated_cases.c.h"
STACK_SHRINK(oparg);
STACK_SHRINK(1);
stack_pointer[-1] = res;
@@ -4028,7 +4136,7 @@
PyObject *callable = stack_pointer[-(1 + oparg)];
PyObject *method = stack_pointer[-(2 + oparg)];
PyObject *res;
- #line 2888 "Python/bytecodes.c"
+ #line 2907 "Python/bytecodes.c"
assert(kwnames == NULL);
/* len(o) */
int is_meth = method != NULL;
@@ -4053,7 +4161,7 @@
Py_DECREF(callable);
Py_DECREF(arg);
if (res == NULL) { STACK_SHRINK(oparg); goto pop_2_error; }
- #line 4057 "Python/generated_cases.c.h"
+ #line 4165 "Python/generated_cases.c.h"
STACK_SHRINK(oparg);
STACK_SHRINK(1);
stack_pointer[-1] = res;
@@ -4066,7 +4174,7 @@
PyObject *callable = stack_pointer[-(1 + oparg)];
PyObject *method = stack_pointer[-(2 + oparg)];
PyObject *res;
- #line 2915 "Python/bytecodes.c"
+ #line 2934 "Python/bytecodes.c"
assert(kwnames == NULL);
/* isinstance(o, o2) */
int is_meth = method != NULL;
@@ -4093,7 +4201,7 @@
Py_DECREF(cls);
Py_DECREF(callable);
if (res == NULL) { STACK_SHRINK(oparg); goto pop_2_error; }
- #line 4097 "Python/generated_cases.c.h"
+ #line 4205 "Python/generated_cases.c.h"
STACK_SHRINK(oparg);
STACK_SHRINK(1);
stack_pointer[-1] = res;
@@ -4105,7 +4213,7 @@
PyObject **args = (stack_pointer - oparg);
PyObject *self = stack_pointer[-(1 + oparg)];
PyObject *method = stack_pointer[-(2 + oparg)];
- #line 2945 "Python/bytecodes.c"
+ #line 2964 "Python/bytecodes.c"
assert(kwnames == NULL);
assert(oparg == 1);
assert(method != NULL);
@@ -4123,14 +4231,14 @@
JUMPBY(INLINE_CACHE_ENTRIES_CALL + 1);
assert(next_instr[-1].op.code == POP_TOP);
DISPATCH();
- #line 4127 "Python/generated_cases.c.h"
+ #line 4235 "Python/generated_cases.c.h"
}
TARGET(CALL_NO_KW_METHOD_DESCRIPTOR_O) {
PyObject **args = (stack_pointer - oparg);
PyObject *method = stack_pointer[-(2 + oparg)];
PyObject *res;
- #line 2965 "Python/bytecodes.c"
+ #line 2984 "Python/bytecodes.c"
assert(kwnames == NULL);
int is_meth = method != NULL;
int total_args = oparg;
@@ -4161,7 +4269,7 @@
Py_DECREF(arg);
Py_DECREF(callable);
if (res == NULL) { STACK_SHRINK(oparg); goto pop_2_error; }
- #line 4165 "Python/generated_cases.c.h"
+ #line 4273 "Python/generated_cases.c.h"
STACK_SHRINK(oparg);
STACK_SHRINK(1);
stack_pointer[-1] = res;
@@ -4174,7 +4282,7 @@
PyObject **args = (stack_pointer - oparg);
PyObject *method = stack_pointer[-(2 + oparg)];
PyObject *res;
- #line 2999 "Python/bytecodes.c"
+ #line 3018 "Python/bytecodes.c"
int is_meth = method != NULL;
int total_args = oparg;
if (is_meth) {
@@ -4203,7 +4311,7 @@
}
Py_DECREF(callable);
if (res == NULL) { STACK_SHRINK(oparg); goto pop_2_error; }
- #line 4207 "Python/generated_cases.c.h"
+ #line 4315 "Python/generated_cases.c.h"
STACK_SHRINK(oparg);
STACK_SHRINK(1);
stack_pointer[-1] = res;
@@ -4216,7 +4324,7 @@
PyObject **args = (stack_pointer - oparg);
PyObject *method = stack_pointer[-(2 + oparg)];
PyObject *res;
- #line 3031 "Python/bytecodes.c"
+ #line 3050 "Python/bytecodes.c"
assert(kwnames == NULL);
assert(oparg == 0 || oparg == 1);
int is_meth = method != NULL;
@@ -4245,7 +4353,7 @@
Py_DECREF(self);
Py_DECREF(callable);
if (res == NULL) { STACK_SHRINK(oparg); goto pop_2_error; }
- #line 4249 "Python/generated_cases.c.h"
+ #line 4357 "Python/generated_cases.c.h"
STACK_SHRINK(oparg);
STACK_SHRINK(1);
stack_pointer[-1] = res;
@@ -4258,7 +4366,7 @@
PyObject **args = (stack_pointer - oparg);
PyObject *method = stack_pointer[-(2 + oparg)];
PyObject *res;
- #line 3063 "Python/bytecodes.c"
+ #line 3082 "Python/bytecodes.c"
assert(kwnames == NULL);
int is_meth = method != NULL;
int total_args = oparg;
@@ -4286,7 +4394,7 @@
}
Py_DECREF(callable);
if (res == NULL) { STACK_SHRINK(oparg); goto pop_2_error; }
- #line 4290 "Python/generated_cases.c.h"
+ #line 4398 "Python/generated_cases.c.h"
STACK_SHRINK(oparg);
STACK_SHRINK(1);
stack_pointer[-1] = res;
@@ -4296,9 +4404,9 @@
}
TARGET(INSTRUMENTED_CALL_FUNCTION_EX) {
- #line 3094 "Python/bytecodes.c"
+ #line 3113 "Python/bytecodes.c"
GO_TO_INSTRUCTION(CALL_FUNCTION_EX);
- #line 4302 "Python/generated_cases.c.h"
+ #line 4410 "Python/generated_cases.c.h"
}
TARGET(CALL_FUNCTION_EX) {
@@ -4307,7 +4415,7 @@
PyObject *callargs = stack_pointer[-(1 + ((oparg & 1) ? 1 : 0))];
PyObject *func = stack_pointer[-(2 + ((oparg & 1) ? 1 : 0))];
PyObject *result;
- #line 3098 "Python/bytecodes.c"
+ #line 3117 "Python/bytecodes.c"
// DICT_MERGE is called before this opcode if there are kwargs.
// It converts all dict subtypes in kwargs into regular dicts.
assert(kwargs == NULL || PyDict_CheckExact(kwargs));
@@ -4369,14 +4477,14 @@
}
result = PyObject_Call(func, callargs, kwargs);
}
- #line 4373 "Python/generated_cases.c.h"
+ #line 4481 "Python/generated_cases.c.h"
Py_DECREF(func);
Py_DECREF(callargs);
Py_XDECREF(kwargs);
- #line 3160 "Python/bytecodes.c"
+ #line 3179 "Python/bytecodes.c"
assert(PEEK(3 + (oparg & 1)) == NULL);
if (result == NULL) { STACK_SHRINK(((oparg & 1) ? 1 : 0)); goto pop_3_error; }
- #line 4380 "Python/generated_cases.c.h"
+ #line 4488 "Python/generated_cases.c.h"
STACK_SHRINK(((oparg & 1) ? 1 : 0));
STACK_SHRINK(2);
stack_pointer[-1] = result;
@@ -4391,7 +4499,7 @@
PyObject *kwdefaults = (oparg & 0x02) ? stack_pointer[-(1 + ((oparg & 0x08) ? 1 : 0) + ((oparg & 0x04) ? 1 : 0) + ((oparg & 0x02) ? 1 : 0))] : NULL;
PyObject *defaults = (oparg & 0x01) ? stack_pointer[-(1 + ((oparg & 0x08) ? 1 : 0) + ((oparg & 0x04) ? 1 : 0) + ((oparg & 0x02) ? 1 : 0) + ((oparg & 0x01) ? 1 : 0))] : NULL;
PyObject *func;
- #line 3170 "Python/bytecodes.c"
+ #line 3189 "Python/bytecodes.c"
PyFunctionObject *func_obj = (PyFunctionObject *)
PyFunction_New(codeobj, GLOBALS());
@@ -4420,14 +4528,14 @@
func_obj->func_version = ((PyCodeObject *)codeobj)->co_version;
func = (PyObject *)func_obj;
- #line 4424 "Python/generated_cases.c.h"
+ #line 4532 "Python/generated_cases.c.h"
STACK_SHRINK(((oparg & 0x01) ? 1 : 0) + ((oparg & 0x02) ? 1 : 0) + ((oparg & 0x04) ? 1 : 0) + ((oparg & 0x08) ? 1 : 0));
stack_pointer[-1] = func;
DISPATCH();
}
TARGET(RETURN_GENERATOR) {
- #line 3201 "Python/bytecodes.c"
+ #line 3220 "Python/bytecodes.c"
assert(PyFunction_Check(frame->f_funcobj));
PyFunctionObject *func = (PyFunctionObject *)frame->f_funcobj;
PyGenObject *gen = (PyGenObject *)_Py_MakeCoro(func);
@@ -4448,7 +4556,7 @@
frame = cframe.current_frame = prev;
_PyFrame_StackPush(frame, (PyObject *)gen);
goto resume_frame;
- #line 4452 "Python/generated_cases.c.h"
+ #line 4560 "Python/generated_cases.c.h"
}
TARGET(BUILD_SLICE) {
@@ -4456,15 +4564,15 @@
PyObject *stop = stack_pointer[-(1 + ((oparg == 3) ? 1 : 0))];
PyObject *start = stack_pointer[-(2 + ((oparg == 3) ? 1 : 0))];
PyObject *slice;
- #line 3224 "Python/bytecodes.c"
+ #line 3243 "Python/bytecodes.c"
slice = PySlice_New(start, stop, step);
- #line 4462 "Python/generated_cases.c.h"
+ #line 4570 "Python/generated_cases.c.h"
Py_DECREF(start);
Py_DECREF(stop);
Py_XDECREF(step);
- #line 3226 "Python/bytecodes.c"
+ #line 3245 "Python/bytecodes.c"
if (slice == NULL) { STACK_SHRINK(((oparg == 3) ? 1 : 0)); goto pop_2_error; }
- #line 4468 "Python/generated_cases.c.h"
+ #line 4576 "Python/generated_cases.c.h"
STACK_SHRINK(((oparg == 3) ? 1 : 0));
STACK_SHRINK(1);
stack_pointer[-1] = slice;
@@ -4475,7 +4583,7 @@
PyObject *fmt_spec = ((oparg & FVS_MASK) == FVS_HAVE_SPEC) ? stack_pointer[-((((oparg & FVS_MASK) == FVS_HAVE_SPEC) ? 1 : 0))] : NULL;
PyObject *value = stack_pointer[-(1 + (((oparg & FVS_MASK) == FVS_HAVE_SPEC) ? 1 : 0))];
PyObject *result;
- #line 3230 "Python/bytecodes.c"
+ #line 3249 "Python/bytecodes.c"
/* Handles f-string value formatting. */
PyObject *(*conv_fn)(PyObject *);
int which_conversion = oparg & FVC_MASK;
@@ -4510,7 +4618,7 @@
Py_DECREF(value);
Py_XDECREF(fmt_spec);
if (result == NULL) { STACK_SHRINK((((oparg & FVS_MASK) == FVS_HAVE_SPEC) ? 1 : 0)); goto pop_1_error; }
- #line 4514 "Python/generated_cases.c.h"
+ #line 4622 "Python/generated_cases.c.h"
STACK_SHRINK((((oparg & FVS_MASK) == FVS_HAVE_SPEC) ? 1 : 0));
stack_pointer[-1] = result;
DISPATCH();
@@ -4519,10 +4627,10 @@
TARGET(COPY) {
PyObject *bottom = stack_pointer[-(1 + (oparg-1))];
PyObject *top;
- #line 3267 "Python/bytecodes.c"
+ #line 3286 "Python/bytecodes.c"
assert(oparg > 0);
top = Py_NewRef(bottom);
- #line 4526 "Python/generated_cases.c.h"
+ #line 4634 "Python/generated_cases.c.h"
STACK_GROW(1);
stack_pointer[-1] = top;
DISPATCH();
@@ -4534,7 +4642,7 @@
PyObject *rhs = stack_pointer[-1];
PyObject *lhs = stack_pointer[-2];
PyObject *res;
- #line 3272 "Python/bytecodes.c"
+ #line 3291 "Python/bytecodes.c"
#if ENABLE_SPECIALIZATION
_PyBinaryOpCache *cache = (_PyBinaryOpCache *)next_instr;
if (ADAPTIVE_COUNTER_IS_ZERO(cache->counter)) {
@@ -4549,12 +4657,12 @@
assert((unsigned)oparg < Py_ARRAY_LENGTH(binary_ops));
assert(binary_ops[oparg]);
res = binary_ops[oparg](lhs, rhs);
- #line 4553 "Python/generated_cases.c.h"
+ #line 4661 "Python/generated_cases.c.h"
Py_DECREF(lhs);
Py_DECREF(rhs);
- #line 3287 "Python/bytecodes.c"
+ #line 3306 "Python/bytecodes.c"
if (res == NULL) goto pop_2_error;
- #line 4558 "Python/generated_cases.c.h"
+ #line 4666 "Python/generated_cases.c.h"
STACK_SHRINK(1);
stack_pointer[-1] = res;
next_instr += 1;
@@ -4564,16 +4672,16 @@
TARGET(SWAP) {
PyObject *top = stack_pointer[-1];
PyObject *bottom = stack_pointer[-(2 + (oparg-2))];
- #line 3292 "Python/bytecodes.c"
+ #line 3311 "Python/bytecodes.c"
assert(oparg >= 2);
- #line 4570 "Python/generated_cases.c.h"
+ #line 4678 "Python/generated_cases.c.h"
stack_pointer[-1] = bottom;
stack_pointer[-(2 + (oparg-2))] = top;
DISPATCH();
}
TARGET(INSTRUMENTED_INSTRUCTION) {
- #line 3296 "Python/bytecodes.c"
+ #line 3315 "Python/bytecodes.c"
int next_opcode = _Py_call_instrumentation_instruction(
tstate, frame, next_instr-1);
if (next_opcode < 0) goto error;
@@ -4585,26 +4693,26 @@
assert(next_opcode > 0 && next_opcode < 256);
opcode = next_opcode;
DISPATCH_GOTO();
- #line 4589 "Python/generated_cases.c.h"
+ #line 4697 "Python/generated_cases.c.h"
}
TARGET(INSTRUMENTED_JUMP_FORWARD) {
- #line 3310 "Python/bytecodes.c"
+ #line 3329 "Python/bytecodes.c"
INSTRUMENTED_JUMP(next_instr-1, next_instr+oparg, PY_MONITORING_EVENT_JUMP);
- #line 4595 "Python/generated_cases.c.h"
+ #line 4703 "Python/generated_cases.c.h"
DISPATCH();
}
TARGET(INSTRUMENTED_JUMP_BACKWARD) {
- #line 3314 "Python/bytecodes.c"
+ #line 3333 "Python/bytecodes.c"
INSTRUMENTED_JUMP(next_instr-1, next_instr-oparg, PY_MONITORING_EVENT_JUMP);
- #line 4602 "Python/generated_cases.c.h"
+ #line 4710 "Python/generated_cases.c.h"
CHECK_EVAL_BREAKER();
DISPATCH();
}
TARGET(INSTRUMENTED_POP_JUMP_IF_TRUE) {
- #line 3319 "Python/bytecodes.c"
+ #line 3338 "Python/bytecodes.c"
PyObject *cond = POP();
int err = PyObject_IsTrue(cond);
Py_DECREF(cond);
@@ -4613,12 +4721,12 @@
assert(err == 0 || err == 1);
int offset = err*oparg;
INSTRUMENTED_JUMP(here, next_instr + offset, PY_MONITORING_EVENT_BRANCH);
- #line 4617 "Python/generated_cases.c.h"
+ #line 4725 "Python/generated_cases.c.h"
DISPATCH();
}
TARGET(INSTRUMENTED_POP_JUMP_IF_FALSE) {
- #line 3330 "Python/bytecodes.c"
+ #line 3349 "Python/bytecodes.c"
PyObject *cond = POP();
int err = PyObject_IsTrue(cond);
Py_DECREF(cond);
@@ -4627,12 +4735,12 @@
assert(err == 0 || err == 1);
int offset = (1-err)*oparg;
INSTRUMENTED_JUMP(here, next_instr + offset, PY_MONITORING_EVENT_BRANCH);
- #line 4631 "Python/generated_cases.c.h"
+ #line 4739 "Python/generated_cases.c.h"
DISPATCH();
}
TARGET(INSTRUMENTED_POP_JUMP_IF_NONE) {
- #line 3341 "Python/bytecodes.c"
+ #line 3360 "Python/bytecodes.c"
PyObject *value = POP();
_Py_CODEUNIT *here = next_instr-1;
int offset;
@@ -4645,12 +4753,12 @@
offset = 0;
}
INSTRUMENTED_JUMP(here, next_instr + offset, PY_MONITORING_EVENT_BRANCH);
- #line 4649 "Python/generated_cases.c.h"
+ #line 4757 "Python/generated_cases.c.h"
DISPATCH();
}
TARGET(INSTRUMENTED_POP_JUMP_IF_NOT_NONE) {
- #line 3356 "Python/bytecodes.c"
+ #line 3375 "Python/bytecodes.c"
PyObject *value = POP();
_Py_CODEUNIT *here = next_instr-1;
int offset;
@@ -4663,30 +4771,30 @@
offset = oparg;
}
INSTRUMENTED_JUMP(here, next_instr + offset, PY_MONITORING_EVENT_BRANCH);
- #line 4667 "Python/generated_cases.c.h"
+ #line 4775 "Python/generated_cases.c.h"
DISPATCH();
}
TARGET(EXTENDED_ARG) {
- #line 3371 "Python/bytecodes.c"
+ #line 3390 "Python/bytecodes.c"
assert(oparg);
opcode = next_instr->op.code;
oparg = oparg << 8 | next_instr->op.arg;
PRE_DISPATCH_GOTO();
DISPATCH_GOTO();
- #line 4678 "Python/generated_cases.c.h"
+ #line 4786 "Python/generated_cases.c.h"
}
TARGET(CACHE) {
- #line 3379 "Python/bytecodes.c"
+ #line 3398 "Python/bytecodes.c"
assert(0 && "Executing a cache.");
Py_UNREACHABLE();
- #line 4685 "Python/generated_cases.c.h"
+ #line 4793 "Python/generated_cases.c.h"
}
TARGET(RESERVED) {
- #line 3384 "Python/bytecodes.c"
+ #line 3403 "Python/bytecodes.c"
assert(0 && "Executing RESERVED instruction.");
Py_UNREACHABLE();
- #line 4692 "Python/generated_cases.c.h"
+ #line 4800 "Python/generated_cases.c.h"
}
diff --git a/Python/intrinsics.c b/Python/intrinsics.c
index cca29d8..c6f5ac5 100644
--- a/Python/intrinsics.c
+++ b/Python/intrinsics.c
@@ -3,10 +3,12 @@
#include "Python.h"
#include "pycore_frame.h"
+#include "pycore_function.h"
#include "pycore_runtime.h"
#include "pycore_global_objects.h"
#include "pycore_intrinsics.h"
#include "pycore_pyerrors.h"
+#include "pycore_typevarobject.h"
/******** Unary functions ********/
@@ -199,6 +201,13 @@ list_to_tuple(PyThreadState* unused, PyObject *v)
return _PyTuple_FromArray(((PyListObject *)v)->ob_item, Py_SIZE(v));
}
+static PyObject *
+make_typevar(PyThreadState* Py_UNUSED(ignored), PyObject *v)
+{
+ assert(PyUnicode_Check(v));
+ return _Py_make_typevar(v, NULL, NULL);
+}
+
const instrinsic_func1
_PyIntrinsics_UnaryFunctions[] = {
[0] = no_intrinsic,
@@ -208,6 +217,11 @@ _PyIntrinsics_UnaryFunctions[] = {
[INTRINSIC_ASYNC_GEN_WRAP] = _PyAsyncGenValueWrapperNew,
[INTRINSIC_UNARY_POSITIVE] = unary_pos,
[INTRINSIC_LIST_TO_TUPLE] = list_to_tuple,
+ [INTRINSIC_TYPEVAR] = make_typevar,
+ [INTRINSIC_PARAMSPEC] = _Py_make_paramspec,
+ [INTRINSIC_TYPEVARTUPLE] = _Py_make_typevartuple,
+ [INTRINSIC_SUBSCRIPT_GENERIC] = _Py_subscript_generic,
+ [INTRINSIC_TYPEALIAS] = _Py_make_typealias,
};
@@ -221,8 +235,26 @@ prep_reraise_star(PyThreadState* unused, PyObject *orig, PyObject *excs)
return _PyExc_PrepReraiseStar(orig, excs);
}
+static PyObject *
+make_typevar_with_bound(PyThreadState* Py_UNUSED(ignored), PyObject *name,
+ PyObject *evaluate_bound)
+{
+ assert(PyUnicode_Check(name));
+ return _Py_make_typevar(name, evaluate_bound, NULL);
+}
+
+static PyObject *
+make_typevar_with_constraints(PyThreadState* Py_UNUSED(ignored), PyObject *name,
+ PyObject *evaluate_constraints)
+{
+ assert(PyUnicode_Check(name));
+ return _Py_make_typevar(name, NULL, evaluate_constraints);
+}
+
const instrinsic_func2
_PyIntrinsics_BinaryFunctions[] = {
[INTRINSIC_PREP_RERAISE_STAR] = prep_reraise_star,
+ [INTRINSIC_TYPEVAR_WITH_BOUND] = make_typevar_with_bound,
+ [INTRINSIC_TYPEVAR_WITH_CONSTRAINTS] = make_typevar_with_constraints,
+ [INTRINSIC_SET_FUNCTION_TYPE_PARAMS] = _Py_set_function_type_params,
};
-
diff --git a/Python/opcode_metadata.h b/Python/opcode_metadata.h
index ae68e04..601ad38 100644
--- a/Python/opcode_metadata.h
+++ b/Python/opcode_metadata.h
@@ -161,8 +161,12 @@ _PyOpcode_num_popped(int opcode, int oparg, bool jump) {
return 1;
case DELETE_GLOBAL:
return 0;
- case LOAD_NAME:
+ case LOAD_LOCALS:
return 0;
+ case LOAD_NAME:
+ return 0+1;
+ case LOAD_FROM_DICT_OR_GLOBALS:
+ return 1;
case LOAD_GLOBAL:
return 0;
case LOAD_GLOBAL_MODULE:
@@ -175,8 +179,8 @@ _PyOpcode_num_popped(int opcode, int oparg, bool jump) {
return 0;
case DELETE_DEREF:
return 0;
- case LOAD_CLASSDEREF:
- return 0;
+ case LOAD_FROM_DICT_OR_DEREF:
+ return 1;
case LOAD_DEREF:
return 0;
case STORE_DEREF:
@@ -551,7 +555,11 @@ _PyOpcode_num_pushed(int opcode, int oparg, bool jump) {
return 0;
case DELETE_GLOBAL:
return 0;
+ case LOAD_LOCALS:
+ return 1;
case LOAD_NAME:
+ return 1+1;
+ case LOAD_FROM_DICT_OR_GLOBALS:
return 1;
case LOAD_GLOBAL:
return ((oparg & 1) ? 1 : 0) + 1;
@@ -565,7 +573,7 @@ _PyOpcode_num_pushed(int opcode, int oparg, bool jump) {
return 0;
case DELETE_DEREF:
return 0;
- case LOAD_CLASSDEREF:
+ case LOAD_FROM_DICT_OR_DEREF:
return 1;
case LOAD_DEREF:
return 1;
@@ -869,14 +877,16 @@ const struct opcode_metadata _PyOpcode_opcode_metadata[256] = {
[DELETE_ATTR] = { true, INSTR_FMT_IB },
[STORE_GLOBAL] = { true, INSTR_FMT_IB },
[DELETE_GLOBAL] = { true, INSTR_FMT_IB },
+ [LOAD_LOCALS] = { true, INSTR_FMT_IB },
[LOAD_NAME] = { true, INSTR_FMT_IB },
+ [LOAD_FROM_DICT_OR_GLOBALS] = { true, INSTR_FMT_IB },
[LOAD_GLOBAL] = { true, INSTR_FMT_IBC000 },
[LOAD_GLOBAL_MODULE] = { true, INSTR_FMT_IBC000 },
[LOAD_GLOBAL_BUILTIN] = { true, INSTR_FMT_IBC000 },
[DELETE_FAST] = { true, INSTR_FMT_IB },
[MAKE_CELL] = { true, INSTR_FMT_IB },
[DELETE_DEREF] = { true, INSTR_FMT_IB },
- [LOAD_CLASSDEREF] = { true, INSTR_FMT_IB },
+ [LOAD_FROM_DICT_OR_DEREF] = { true, INSTR_FMT_IB },
[LOAD_DEREF] = { true, INSTR_FMT_IB },
[STORE_DEREF] = { true, INSTR_FMT_IB },
[COPY_FREE_VARS] = { true, INSTR_FMT_IB },
diff --git a/Python/opcode_targets.h b/Python/opcode_targets.h
index f2742f4..af05a33 100644
--- a/Python/opcode_targets.h
+++ b/Python/opcode_targets.h
@@ -86,8 +86,8 @@ static void *opcode_targets[256] = {
&&TARGET_LOAD_CONST__LOAD_FAST,
&&TARGET_SETUP_ANNOTATIONS,
&&TARGET_LOAD_FAST__LOAD_CONST,
+ &&TARGET_LOAD_LOCALS,
&&TARGET_LOAD_FAST__LOAD_FAST,
- &&TARGET_LOAD_GLOBAL_BUILTIN,
&&TARGET_POP_EXCEPT,
&&TARGET_STORE_NAME,
&&TARGET_DELETE_NAME,
@@ -110,9 +110,9 @@ static void *opcode_targets[256] = {
&&TARGET_IMPORT_NAME,
&&TARGET_IMPORT_FROM,
&&TARGET_JUMP_FORWARD,
+ &&TARGET_LOAD_GLOBAL_BUILTIN,
&&TARGET_LOAD_GLOBAL_MODULE,
&&TARGET_STORE_ATTR_INSTANCE_VALUE,
- &&TARGET_STORE_ATTR_SLOT,
&&TARGET_POP_JUMP_IF_FALSE,
&&TARGET_POP_JUMP_IF_TRUE,
&&TARGET_LOAD_GLOBAL,
@@ -147,7 +147,7 @@ static void *opcode_targets[256] = {
&&TARGET_LIST_APPEND,
&&TARGET_SET_ADD,
&&TARGET_MAP_ADD,
- &&TARGET_LOAD_CLASSDEREF,
+ &&TARGET_STORE_ATTR_SLOT,
&&TARGET_COPY_FREE_VARS,
&&TARGET_YIELD_VALUE,
&&TARGET_RESUME,
@@ -174,8 +174,8 @@ static void *opcode_targets[256] = {
&&TARGET_KW_NAMES,
&&TARGET_CALL_INTRINSIC_1,
&&TARGET_CALL_INTRINSIC_2,
- &&_unknown_opcode,
- &&_unknown_opcode,
+ &&TARGET_LOAD_FROM_DICT_OR_GLOBALS,
+ &&TARGET_LOAD_FROM_DICT_OR_DEREF,
&&_unknown_opcode,
&&_unknown_opcode,
&&_unknown_opcode,
diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c
index cb87f2c..740901f 100644
--- a/Python/pylifecycle.c
+++ b/Python/pylifecycle.c
@@ -26,6 +26,7 @@
#include "pycore_sysmodule.h" // _PySys_ClearAuditHooks()
#include "pycore_traceback.h" // _Py_DumpTracebackThreads()
#include "pycore_typeobject.h" // _PyTypes_InitTypes()
+#include "pycore_typevarobject.h" // _Py_clear_generic_types()
#include "pycore_unicodeobject.h" // _PyUnicode_InitTypes()
#include "opcode.h"
@@ -1698,6 +1699,7 @@ finalize_interp_clear(PyThreadState *tstate)
int is_main_interp = _Py_IsMainInterpreter(tstate->interp);
_PyExc_ClearExceptionGroupType(tstate->interp);
+ _Py_clear_generic_types(tstate->interp);
/* Clear interpreter state and all thread states */
_PyInterpreterState_Clear(tstate);
diff --git a/Python/symtable.c b/Python/symtable.c
index 2c29f60..3451f6c 100644
--- a/Python/symtable.c
+++ b/Python/symtable.c
@@ -47,6 +47,18 @@
#define ANNOTATION_NOT_ALLOWED \
"'%s' can not be used within an annotation"
+#define TYPEVAR_BOUND_NOT_ALLOWED \
+"'%s' can not be used within a TypeVar bound"
+
+#define TYPEALIAS_NOT_ALLOWED \
+"'%s' can not be used within a type alias"
+
+#define TYPEPARAM_NOT_ALLOWED \
+"'%s' can not be used within the definition of a generic"
+
+#define DUPLICATE_TYPE_PARAM \
+"duplicate type parameter '%U'"
+
#define LOCATION(x) \
(x)->lineno, (x)->col_offset, (x)->end_lineno, (x)->end_col_offset
@@ -95,7 +107,7 @@ ste_new(struct symtable *st, identifier name, _Py_block_ty block,
if (st->st_cur != NULL &&
(st->st_cur->ste_nested ||
- st->st_cur->ste_type == FunctionBlock))
+ _PyST_IsFunctionLike(st->st_cur)))
ste->ste_nested = 1;
ste->ste_child_free = 0;
ste->ste_generator = 0;
@@ -105,7 +117,9 @@ ste_new(struct symtable *st, identifier name, _Py_block_ty block,
ste->ste_needs_class_closure = 0;
ste->ste_comp_inlined = 0;
ste->ste_comp_iter_target = 0;
+ ste->ste_can_see_class_scope = 0;
ste->ste_comp_iter_expr = 0;
+ ste->ste_needs_classdict = 0;
ste->ste_symbols = PyDict_New();
ste->ste_varnames = PyList_New(0);
@@ -208,6 +222,7 @@ static int symtable_enter_block(struct symtable *st, identifier name,
static int symtable_exit_block(struct symtable *st);
static int symtable_visit_stmt(struct symtable *st, stmt_ty s);
static int symtable_visit_expr(struct symtable *st, expr_ty s);
+static int symtable_visit_typeparam(struct symtable *st, typeparam_ty s);
static int symtable_visit_genexp(struct symtable *st, expr_ty s);
static int symtable_visit_listcomp(struct symtable *st, expr_ty s);
static int symtable_visit_setcomp(struct symtable *st, expr_ty s);
@@ -403,6 +418,15 @@ _PyST_GetScope(PySTEntryObject *ste, PyObject *name)
return (symbol >> SCOPE_OFFSET) & SCOPE_MASK;
}
+int
+_PyST_IsFunctionLike(PySTEntryObject *ste)
+{
+ return ste->ste_type == FunctionBlock
+ || ste->ste_type == TypeVarBoundBlock
+ || ste->ste_type == TypeAliasBlock
+ || ste->ste_type == TypeParamBlock;
+}
+
static int
error_at_directive(PySTEntryObject *ste, PyObject *name)
{
@@ -495,7 +519,7 @@ error_at_directive(PySTEntryObject *ste, PyObject *name)
static int
analyze_name(PySTEntryObject *ste, PyObject *scopes, PyObject *name, long flags,
PyObject *bound, PyObject *local, PyObject *free,
- PyObject *global)
+ PyObject *global, PyObject *typeparams, PySTEntryObject *class_entry)
{
if (flags & DEF_GLOBAL) {
if (flags & DEF_NONLOCAL) {
@@ -524,6 +548,12 @@ analyze_name(PySTEntryObject *ste, PyObject *scopes, PyObject *name, long flags,
return error_at_directive(ste, name);
}
+ if (PySet_Contains(typeparams, name)) {
+ PyErr_Format(PyExc_SyntaxError,
+ "nonlocal binding not allowed for type parameter '%U'",
+ name);
+ return error_at_directive(ste, name);
+ }
SET_SCOPE(scopes, name, FREE);
ste->ste_free = 1;
return PySet_Add(free, name) >= 0;
@@ -534,8 +564,34 @@ analyze_name(PySTEntryObject *ste, PyObject *scopes, PyObject *name, long flags,
return 0;
if (PySet_Discard(global, name) < 0)
return 0;
+ if (flags & DEF_TYPE_PARAM) {
+ if (PySet_Add(typeparams, name) < 0)
+ return 0;
+ }
+ else {
+ if (PySet_Discard(typeparams, name) < 0)
+ return 0;
+ }
return 1;
}
+ // If we were passed class_entry (i.e., we're in an ste_can_see_class_scope scope)
+ // and the bound name is in that set, then the name is potentially bound both by
+ // the immediately enclosing class namespace, and also by an outer function namespace.
+ // In that case, we want the runtime name resolution to look at only the class
+ // namespace and the globals (not the namespace providing the bound).
+ // Similarly, if the name is explicitly global in the class namespace (through the
+ // global statement), we want to also treat it as a global in this scope.
+ if (class_entry != NULL) {
+ long class_flags = _PyST_GetSymbol(class_entry, name);
+ if (class_flags & DEF_GLOBAL) {
+ SET_SCOPE(scopes, name, GLOBAL_EXPLICIT);
+ return 1;
+ }
+ else if (class_flags & DEF_BOUND && !(class_flags & DEF_NONLOCAL)) {
+ SET_SCOPE(scopes, name, GLOBAL_IMPLICIT);
+ return 1;
+ }
+ }
/* If an enclosing block has a binding for this name, it
is a free variable rather than a global variable.
Note that having a non-NULL bound implies that the block
@@ -611,7 +667,7 @@ inline_comprehension(PySTEntryObject *ste, PySTEntryObject *comp,
if (PyLong_AsLong(existing) & DEF_BOUND) {
// cell vars in comprehension that are locals in outer scope
// must be promoted to cell so u_cellvars isn't wrong
- if (scope == CELL && ste->ste_type == FunctionBlock) {
+ if (scope == CELL && _PyST_IsFunctionLike(ste)) {
if (PySet_Add(promote_to_cell, k) < 0) {
return 0;
}
@@ -682,6 +738,11 @@ drop_class_free(PySTEntryObject *ste, PyObject *free)
return 0;
if (res)
ste->ste_needs_class_closure = 1;
+ res = PySet_Discard(free, &_Py_ID(__classdict__));
+ if (res < 0)
+ return 0;
+ if (res)
+ ste->ste_needs_classdict = 1;
return 1;
}
@@ -799,11 +860,13 @@ error:
static int
analyze_child_block(PySTEntryObject *entry, PyObject *bound, PyObject *free,
- PyObject *global, PyObject **child_free);
+ PyObject *global, PyObject *typeparams,
+ PySTEntryObject *class_entry, PyObject **child_free);
static int
analyze_block(PySTEntryObject *ste, PyObject *bound, PyObject *free,
- PyObject *global)
+ PyObject *global, PyObject *typeparams,
+ PySTEntryObject *class_entry)
{
PyObject *name, *v, *local = NULL, *scopes = NULL, *newbound = NULL;
PyObject *newglobal = NULL, *newfree = NULL, *promote_to_cell = NULL;
@@ -865,14 +928,14 @@ analyze_block(PySTEntryObject *ste, PyObject *bound, PyObject *free,
while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
long flags = PyLong_AS_LONG(v);
if (!analyze_name(ste, scopes, name, flags,
- bound, local, free, global))
+ bound, local, free, global, typeparams, class_entry))
goto error;
}
/* Populate global and bound sets to be passed to children. */
if (ste->ste_type != ClassBlock) {
/* Add function locals to bound set */
- if (ste->ste_type == FunctionBlock) {
+ if (_PyST_IsFunctionLike(ste)) {
temp = PyNumber_InPlaceOr(newbound, local);
if (!temp)
goto error;
@@ -892,9 +955,11 @@ analyze_block(PySTEntryObject *ste, PyObject *bound, PyObject *free,
Py_DECREF(temp);
}
else {
- /* Special-case __class__ */
+ /* Special-case __class__ and __classdict__ */
if (PySet_Add(newbound, &_Py_ID(__class__)) < 0)
goto error;
+ if (PySet_Add(newbound, &_Py_ID(__classdict__)) < 0)
+ goto error;
}
/* Recursively call analyze_child_block() on each child block.
@@ -910,13 +975,23 @@ analyze_block(PySTEntryObject *ste, PyObject *bound, PyObject *free,
assert(c && PySTEntry_Check(c));
entry = (PySTEntryObject*)c;
+ PySTEntryObject *new_class_entry = NULL;
+ if (entry->ste_can_see_class_scope) {
+ if (ste->ste_type == ClassBlock) {
+ new_class_entry = ste;
+ }
+ else if (class_entry) {
+ new_class_entry = class_entry;
+ }
+ }
+
// we inline all non-generator-expression comprehensions
int inline_comp =
entry->ste_comprehension &&
!entry->ste_generator;
if (!analyze_child_block(entry, newbound, newfree, newglobal,
- &child_free))
+ typeparams, new_class_entry, &child_free))
{
goto error;
}
@@ -952,7 +1027,7 @@ analyze_block(PySTEntryObject *ste, PyObject *bound, PyObject *free,
}
/* Check if any local variables must be converted to cell variables */
- if (ste->ste_type == FunctionBlock && !analyze_cells(scopes, newfree, promote_to_cell))
+ if (_PyST_IsFunctionLike(ste) && !analyze_cells(scopes, newfree, promote_to_cell))
goto error;
else if (ste->ste_type == ClassBlock && !drop_class_free(ste, newfree))
goto error;
@@ -980,9 +1055,11 @@ analyze_block(PySTEntryObject *ste, PyObject *bound, PyObject *free,
static int
analyze_child_block(PySTEntryObject *entry, PyObject *bound, PyObject *free,
- PyObject *global, PyObject** child_free)
+ PyObject *global, PyObject *typeparams,
+ PySTEntryObject *class_entry, PyObject** child_free)
{
PyObject *temp_bound = NULL, *temp_global = NULL, *temp_free = NULL;
+ PyObject *temp_typeparams = NULL;
/* Copy the bound/global/free sets.
@@ -1000,24 +1077,30 @@ analyze_child_block(PySTEntryObject *entry, PyObject *bound, PyObject *free,
temp_global = PySet_New(global);
if (!temp_global)
goto error;
+ temp_typeparams = PySet_New(typeparams);
+ if (!temp_typeparams)
+ goto error;
- if (!analyze_block(entry, temp_bound, temp_free, temp_global))
+ if (!analyze_block(entry, temp_bound, temp_free, temp_global,
+ temp_typeparams, class_entry))
goto error;
*child_free = temp_free;
Py_DECREF(temp_bound);
Py_DECREF(temp_global);
+ Py_DECREF(temp_typeparams);
return 1;
error:
Py_XDECREF(temp_bound);
Py_XDECREF(temp_free);
Py_XDECREF(temp_global);
+ Py_XDECREF(temp_typeparams);
return 0;
}
static int
symtable_analyze(struct symtable *st)
{
- PyObject *free, *global;
+ PyObject *free, *global, *typeparams;
int r;
free = PySet_New(NULL);
@@ -1028,9 +1111,16 @@ symtable_analyze(struct symtable *st)
Py_DECREF(free);
return 0;
}
- r = analyze_block(st->st_top, NULL, free, global);
+ typeparams = PySet_New(NULL);
+ if (!typeparams) {
+ Py_DECREF(free);
+ Py_DECREF(global);
+ return 0;
+ }
+ r = analyze_block(st->st_top, NULL, free, global, typeparams, NULL);
Py_DECREF(free);
Py_DECREF(global);
+ Py_DECREF(typeparams);
return r;
}
@@ -1133,6 +1223,13 @@ symtable_add_def_helper(struct symtable *st, PyObject *name, int flag, struct _s
end_lineno, end_col_offset + 1);
goto error;
}
+ if ((flag & DEF_TYPE_PARAM) && (val & DEF_TYPE_PARAM)) {
+ PyErr_Format(PyExc_SyntaxError, DUPLICATE_TYPE_PARAM, name);
+ PyErr_RangedSyntaxLocationObject(st->st_filename,
+ lineno, col_offset + 1,
+ end_lineno, end_col_offset + 1);
+ goto error;
+ }
val |= flag;
}
else if (PyErr_Occurred()) {
@@ -1204,6 +1301,65 @@ symtable_add_def(struct symtable *st, PyObject *name, int flag,
lineno, col_offset, end_lineno, end_col_offset);
}
+static int
+symtable_enter_typeparam_block(struct symtable *st, identifier name,
+ void *ast, int has_defaults, int has_kwdefaults,
+ enum _stmt_kind kind,
+ int lineno, int col_offset,
+ int end_lineno, int end_col_offset)
+{
+ _Py_block_ty current_type = st->st_cur->ste_type;
+ if(!symtable_enter_block(st, name, TypeParamBlock, ast, lineno,
+ col_offset, end_lineno, end_col_offset)) {
+ return 0;
+ }
+ if (current_type == ClassBlock) {
+ st->st_cur->ste_can_see_class_scope = 1;
+ if (!symtable_add_def(st, &_Py_ID(__classdict__), USE, lineno, col_offset, end_lineno, end_col_offset)) {
+ return 0;
+ }
+ }
+ if (kind == ClassDef_kind) {
+ _Py_DECLARE_STR(type_params, ".type_params");
+ // It gets "set" when we create the type params tuple and
+ // "used" when we build up the bases.
+ if (!symtable_add_def(st, &_Py_STR(type_params), DEF_LOCAL,
+ lineno, col_offset, end_lineno, end_col_offset)) {
+ return 0;
+ }
+ if (!symtable_add_def(st, &_Py_STR(type_params), USE,
+ lineno, col_offset, end_lineno, end_col_offset)) {
+ return 0;
+ }
+ st->st_private = name;
+ // This is used for setting the generic base
+ _Py_DECLARE_STR(generic_base, ".generic_base");
+ if (!symtable_add_def(st, &_Py_STR(generic_base), DEF_LOCAL,
+ lineno, col_offset, end_lineno, end_col_offset)) {
+ return 0;
+ }
+ if (!symtable_add_def(st, &_Py_STR(generic_base), USE,
+ lineno, col_offset, end_lineno, end_col_offset)) {
+ return 0;
+ }
+ }
+ if (has_defaults) {
+ _Py_DECLARE_STR(defaults, ".defaults");
+ if (!symtable_add_def(st, &_Py_STR(defaults), DEF_PARAM,
+ lineno, col_offset, end_lineno, end_col_offset)) {
+ return 0;
+ }
+ }
+ if (has_kwdefaults) {
+ _Py_DECLARE_STR(kwdefaults, ".kwdefaults");
+ if (!symtable_add_def(st, &_Py_STR(kwdefaults), DEF_PARAM,
+ lineno, col_offset, end_lineno, end_col_offset)) {
+ return 0;
+ }
+ }
+ return 1;
+}
+
/* VISIT, VISIT_SEQ and VIST_SEQ_TAIL take an ASDL type as their second argument.
They use the ASDL name to synthesize the name of the C type and the visit
function.
@@ -1275,6 +1431,17 @@ symtable_record_directive(struct symtable *st, identifier name, int lineno,
return res == 0;
}
+static int
+has_kwonlydefaults(asdl_arg_seq *kwonlyargs, asdl_expr_seq *kw_defaults)
+{
+ for (int i = 0; i < asdl_seq_LEN(kwonlyargs); i++) {
+ expr_ty default_ = asdl_seq_GET(kw_defaults, i);
+ if (default_) {
+ return 1;
+ }
+ }
+ return 0;
+}
static int
symtable_visit_stmt(struct symtable *st, stmt_ty s)
@@ -1292,11 +1459,24 @@ symtable_visit_stmt(struct symtable *st, stmt_ty s)
VISIT_SEQ(st, expr, s->v.FunctionDef.args->defaults);
if (s->v.FunctionDef.args->kw_defaults)
VISIT_SEQ_WITH_NULL(st, expr, s->v.FunctionDef.args->kw_defaults);
+ if (s->v.FunctionDef.decorator_list)
+ VISIT_SEQ(st, expr, s->v.FunctionDef.decorator_list);
+ if (asdl_seq_LEN(s->v.FunctionDef.typeparams) > 0) {
+ if (!symtable_enter_typeparam_block(
+ st, s->v.FunctionDef.name,
+ (void *)s->v.FunctionDef.typeparams,
+ s->v.FunctionDef.args->defaults != NULL,
+ has_kwonlydefaults(s->v.FunctionDef.args->kwonlyargs,
+ s->v.FunctionDef.args->kw_defaults),
+ s->kind,
+ LOCATION(s))) {
+ VISIT_QUIT(st, 0);
+ }
+ VISIT_SEQ(st, typeparam, s->v.FunctionDef.typeparams);
+ }
if (!symtable_visit_annotations(st, s, s->v.FunctionDef.args,
s->v.FunctionDef.returns))
VISIT_QUIT(st, 0);
- if (s->v.FunctionDef.decorator_list)
- VISIT_SEQ(st, expr, s->v.FunctionDef.decorator_list);
if (!symtable_enter_block(st, s->v.FunctionDef.name,
FunctionBlock, (void *)s,
LOCATION(s)))
@@ -1305,25 +1485,85 @@ symtable_visit_stmt(struct symtable *st, stmt_ty s)
VISIT_SEQ(st, stmt, s->v.FunctionDef.body);
if (!symtable_exit_block(st))
VISIT_QUIT(st, 0);
+ if (asdl_seq_LEN(s->v.FunctionDef.typeparams) > 0) {
+ if (!symtable_exit_block(st))
+ VISIT_QUIT(st, 0);
+ }
break;
case ClassDef_kind: {
PyObject *tmp;
if (!symtable_add_def(st, s->v.ClassDef.name, DEF_LOCAL, LOCATION(s)))
VISIT_QUIT(st, 0);
- VISIT_SEQ(st, expr, s->v.ClassDef.bases);
- VISIT_SEQ(st, keyword, s->v.ClassDef.keywords);
if (s->v.ClassDef.decorator_list)
VISIT_SEQ(st, expr, s->v.ClassDef.decorator_list);
+ if (asdl_seq_LEN(s->v.ClassDef.typeparams) > 0) {
+ if (!symtable_enter_typeparam_block(st, s->v.ClassDef.name,
+ (void *)s->v.ClassDef.typeparams,
+ false, false, s->kind,
+ LOCATION(s))) {
+ VISIT_QUIT(st, 0);
+ }
+ VISIT_SEQ(st, typeparam, s->v.ClassDef.typeparams);
+ }
+ VISIT_SEQ(st, expr, s->v.ClassDef.bases);
+ VISIT_SEQ(st, keyword, s->v.ClassDef.keywords);
if (!symtable_enter_block(st, s->v.ClassDef.name, ClassBlock,
(void *)s, s->lineno, s->col_offset,
s->end_lineno, s->end_col_offset))
VISIT_QUIT(st, 0);
tmp = st->st_private;
st->st_private = s->v.ClassDef.name;
+ if (asdl_seq_LEN(s->v.ClassDef.typeparams) > 0) {
+ if (!symtable_add_def(st, &_Py_ID(__type_params__),
+ DEF_LOCAL, LOCATION(s))) {
+ VISIT_QUIT(st, 0);
+ }
+ _Py_DECLARE_STR(type_params, ".type_params");
+ if (!symtable_add_def(st, &_Py_STR(type_params),
+ USE, LOCATION(s))) {
+ VISIT_QUIT(st, 0);
+ }
+ }
VISIT_SEQ(st, stmt, s->v.ClassDef.body);
st->st_private = tmp;
if (!symtable_exit_block(st))
VISIT_QUIT(st, 0);
+ if (asdl_seq_LEN(s->v.ClassDef.typeparams) > 0) {
+ if (!symtable_exit_block(st))
+ VISIT_QUIT(st, 0);
+ }
+ break;
+ }
+ case TypeAlias_kind: {
+ VISIT(st, expr, s->v.TypeAlias.name);
+ assert(s->v.TypeAlias.name->kind == Name_kind);
+ PyObject *name = s->v.TypeAlias.name->v.Name.id;
+ int is_in_class = st->st_cur->ste_type == ClassBlock;
+ int is_generic = asdl_seq_LEN(s->v.TypeAlias.typeparams) > 0;
+ if (is_generic) {
+ if (!symtable_enter_typeparam_block(
+ st, name,
+ (void *)s->v.TypeAlias.typeparams,
+ false, false, s->kind,
+ LOCATION(s))) {
+ VISIT_QUIT(st, 0);
+ }
+ VISIT_SEQ(st, typeparam, s->v.TypeAlias.typeparams);
+ }
+ if (!symtable_enter_block(st, name, TypeAliasBlock,
+ (void *)s, LOCATION(s)))
+ VISIT_QUIT(st, 0);
+ st->st_cur->ste_can_see_class_scope = is_in_class;
+ if (is_in_class && !symtable_add_def(st, &_Py_ID(__classdict__), USE, LOCATION(s->v.TypeAlias.value))) {
+ VISIT_QUIT(st, 0);
+ }
+ VISIT(st, expr, s->v.TypeAlias.value);
+ if (!symtable_exit_block(st))
+ VISIT_QUIT(st, 0);
+ if (is_generic) {
+ if (!symtable_exit_block(st))
+ VISIT_QUIT(st, 0);
+ }
break;
}
case Return_kind:
@@ -1532,11 +1772,24 @@ symtable_visit_stmt(struct symtable *st, stmt_ty s)
if (s->v.AsyncFunctionDef.args->kw_defaults)
VISIT_SEQ_WITH_NULL(st, expr,
s->v.AsyncFunctionDef.args->kw_defaults);
+ if (s->v.AsyncFunctionDef.decorator_list)
+ VISIT_SEQ(st, expr, s->v.AsyncFunctionDef.decorator_list);
+ if (asdl_seq_LEN(s->v.AsyncFunctionDef.typeparams) > 0) {
+ if (!symtable_enter_typeparam_block(
+ st, s->v.AsyncFunctionDef.name,
+ (void *)s->v.AsyncFunctionDef.typeparams,
+ s->v.AsyncFunctionDef.args->defaults != NULL,
+ has_kwonlydefaults(s->v.AsyncFunctionDef.args->kwonlyargs,
+ s->v.AsyncFunctionDef.args->kw_defaults),
+ s->kind,
+ LOCATION(s))) {
+ VISIT_QUIT(st, 0);
+ }
+ VISIT_SEQ(st, typeparam, s->v.AsyncFunctionDef.typeparams);
+ }
if (!symtable_visit_annotations(st, s, s->v.AsyncFunctionDef.args,
s->v.AsyncFunctionDef.returns))
VISIT_QUIT(st, 0);
- if (s->v.AsyncFunctionDef.decorator_list)
- VISIT_SEQ(st, expr, s->v.AsyncFunctionDef.decorator_list);
if (!symtable_enter_block(st, s->v.AsyncFunctionDef.name,
FunctionBlock, (void *)s,
s->lineno, s->col_offset,
@@ -1547,6 +1800,10 @@ symtable_visit_stmt(struct symtable *st, stmt_ty s)
VISIT_SEQ(st, stmt, s->v.AsyncFunctionDef.body);
if (!symtable_exit_block(st))
VISIT_QUIT(st, 0);
+ if (asdl_seq_LEN(s->v.AsyncFunctionDef.typeparams) > 0) {
+ if (!symtable_exit_block(st))
+ VISIT_QUIT(st, 0);
+ }
break;
case AsyncWith_kind:
VISIT_SEQ(st, withitem, s->v.AsyncWith.items);
@@ -1598,7 +1855,7 @@ symtable_extend_namedexpr_scope(struct symtable *st, expr_ty e)
}
/* If we find a FunctionBlock entry, add as GLOBAL/LOCAL or NONLOCAL/LOCAL */
- if (ste->ste_type == FunctionBlock) {
+ if (_PyST_IsFunctionLike(ste)) {
long target_in_scope = _PyST_GetSymbol(ste, target_name);
if (target_in_scope & DEF_GLOBAL) {
if (!symtable_add_def(st, target_name, DEF_GLOBAL, LOCATION(e)))
@@ -1633,7 +1890,7 @@ symtable_extend_namedexpr_scope(struct symtable *st, expr_ty e)
}
}
- /* We should always find either a FunctionBlock, ModuleBlock or ClassBlock
+ /* We should always find either a function-like block, ModuleBlock or ClassBlock
and should never fall to this case
*/
Py_UNREACHABLE();
@@ -1806,7 +2063,7 @@ symtable_visit_expr(struct symtable *st, expr_ty e)
VISIT_QUIT(st, 0);
/* Special-case super: it counts as a use of __class__ */
if (e->v.Name.ctx == Load &&
- st->st_cur->ste_type == FunctionBlock &&
+ _PyST_IsFunctionLike(st->st_cur) &&
_PyUnicode_EqualToASCIIString(e->v.Name.id, "super")) {
if (!symtable_add_def(st, &_Py_ID(__class__), USE, LOCATION(e)))
VISIT_QUIT(st, 0);
@@ -1824,6 +2081,45 @@ symtable_visit_expr(struct symtable *st, expr_ty e)
}
static int
+symtable_visit_typeparam(struct symtable *st, typeparam_ty tp)
+{
+ if (++st->recursion_depth > st->recursion_limit) {
+ PyErr_SetString(PyExc_RecursionError,
+ "maximum recursion depth exceeded during compilation");
+ VISIT_QUIT(st, 0);
+ }
+ switch(tp->kind) {
+ case TypeVar_kind:
+ if (!symtable_add_def(st, tp->v.TypeVar.name, DEF_TYPE_PARAM | DEF_LOCAL, LOCATION(tp)))
+ VISIT_QUIT(st, 0);
+ if (tp->v.TypeVar.bound) {
+ int is_in_class = st->st_cur->ste_can_see_class_scope;
+ if (!symtable_enter_block(st, tp->v.TypeVar.name,
+ TypeVarBoundBlock, (void *)tp,
+ LOCATION(tp)))
+ VISIT_QUIT(st, 0);
+ st->st_cur->ste_can_see_class_scope = is_in_class;
+ if (is_in_class && !symtable_add_def(st, &_Py_ID(__classdict__), USE, LOCATION(tp->v.TypeVar.bound))) {
+ VISIT_QUIT(st, 0);
+ }
+ VISIT(st, expr, tp->v.TypeVar.bound);
+ if (!symtable_exit_block(st))
+ VISIT_QUIT(st, 0);
+ }
+ break;
+ case TypeVarTuple_kind:
+ if (!symtable_add_def(st, tp->v.TypeVarTuple.name, DEF_TYPE_PARAM | DEF_LOCAL, LOCATION(tp)))
+ VISIT_QUIT(st, 0);
+ break;
+ case ParamSpec_kind:
+ if (!symtable_add_def(st, tp->v.ParamSpec.name, DEF_TYPE_PARAM | DEF_LOCAL, LOCATION(tp)))
+ VISIT_QUIT(st, 0);
+ break;
+ }
+ VISIT_QUIT(st, 1);
+}
+
+static int
symtable_visit_pattern(struct symtable *st, pattern_ty p)
{
if (++st->recursion_depth > st->recursion_limit) {
@@ -2194,11 +2490,18 @@ symtable_visit_dictcomp(struct symtable *st, expr_ty e)
static int
symtable_raise_if_annotation_block(struct symtable *st, const char *name, expr_ty e)
{
- if (st->st_cur->ste_type != AnnotationBlock) {
+ enum _block_type type = st->st_cur->ste_type;
+ if (type == AnnotationBlock)
+ PyErr_Format(PyExc_SyntaxError, ANNOTATION_NOT_ALLOWED, name);
+ else if (type == TypeVarBoundBlock)
+ PyErr_Format(PyExc_SyntaxError, TYPEVAR_BOUND_NOT_ALLOWED, name);
+ else if (type == TypeAliasBlock)
+ PyErr_Format(PyExc_SyntaxError, TYPEALIAS_NOT_ALLOWED, name);
+ else if (type == TypeParamBlock)
+ PyErr_Format(PyExc_SyntaxError, TYPEPARAM_NOT_ALLOWED, name);
+ else
return 1;
- }
- PyErr_Format(PyExc_SyntaxError, ANNOTATION_NOT_ALLOWED, name);
PyErr_RangedSyntaxLocationObject(st->st_filename,
e->lineno,
e->col_offset + 1,