mirror of
https://github.com/python/cpython.git
synced 2025-07-16 07:45:20 +00:00
gh-119180: Add evaluate functions for type params and type aliases (#122212)
This commit is contained in:
parent
cbac8a3888
commit
ae192262ad
11 changed files with 385 additions and 159 deletions
|
@ -1978,8 +1978,9 @@ compiler_type_param_bound_or_default(struct compiler *c, expr_ty e,
|
|||
identifier name, void *key,
|
||||
bool allow_starred)
|
||||
{
|
||||
if (compiler_enter_scope(c, name, COMPILER_SCOPE_ANNOTATIONS,
|
||||
key, e->lineno, NULL) == -1) {
|
||||
PyObject *defaults = PyTuple_Pack(1, _PyLong_GetOne());
|
||||
ADDOP_LOAD_CONST_NEW(c, LOC(e), defaults);
|
||||
if (compiler_setup_annotations_scope(c, LOC(e), key, name) == -1) {
|
||||
return ERROR;
|
||||
}
|
||||
if (allow_starred && e->kind == Starred_kind) {
|
||||
|
@ -1995,7 +1996,7 @@ compiler_type_param_bound_or_default(struct compiler *c, expr_ty e,
|
|||
if (co == NULL) {
|
||||
return ERROR;
|
||||
}
|
||||
if (compiler_make_closure(c, LOC(e), co, 0) < 0) {
|
||||
if (compiler_make_closure(c, LOC(e), co, MAKE_FUNCTION_DEFAULTS) < 0) {
|
||||
Py_DECREF(co);
|
||||
return ERROR;
|
||||
}
|
||||
|
@ -2566,8 +2567,10 @@ compiler_typealias_body(struct compiler *c, stmt_ty s)
|
|||
{
|
||||
location loc = LOC(s);
|
||||
PyObject *name = s->v.TypeAlias.name->v.Name.id;
|
||||
PyObject *defaults = PyTuple_Pack(1, _PyLong_GetOne());
|
||||
ADDOP_LOAD_CONST_NEW(c, loc, defaults);
|
||||
RETURN_IF_ERROR(
|
||||
compiler_enter_scope(c, name, COMPILER_SCOPE_FUNCTION, s, loc.lineno, NULL));
|
||||
compiler_setup_annotations_scope(c, LOC(s), s, name));
|
||||
/* Make None the first constant, so the evaluate function can't have a
|
||||
docstring. */
|
||||
RETURN_IF_ERROR(compiler_add_const(c, Py_None));
|
||||
|
@ -2578,7 +2581,7 @@ compiler_typealias_body(struct compiler *c, stmt_ty s)
|
|||
if (co == NULL) {
|
||||
return ERROR;
|
||||
}
|
||||
if (compiler_make_closure(c, loc, co, 0) < 0) {
|
||||
if (compiler_make_closure(c, loc, co, MAKE_FUNCTION_DEFAULTS) < 0) {
|
||||
Py_DECREF(co);
|
||||
return ERROR;
|
||||
}
|
||||
|
|
|
@ -260,6 +260,7 @@ static int symtable_visit_pattern(struct symtable *st, pattern_ty s);
|
|||
static int symtable_raise_if_annotation_block(struct symtable *st, const char *, expr_ty);
|
||||
static int symtable_raise_if_not_coroutine(struct symtable *st, const char *msg, _Py_SourceLocation loc);
|
||||
static int symtable_raise_if_comprehension_block(struct symtable *st, expr_ty);
|
||||
static int symtable_add_def(struct symtable *st, PyObject *name, int flag, _Py_SourceLocation loc);
|
||||
|
||||
/* For debugging purposes only */
|
||||
#if _PY_DUMP_SYMTABLE
|
||||
|
@ -1388,6 +1389,16 @@ symtable_enter_block(struct symtable *st, identifier name, _Py_block_ty block,
|
|||
return 0;
|
||||
int result = symtable_enter_existing_block(st, ste);
|
||||
Py_DECREF(ste);
|
||||
if (block == AnnotationBlock || block == TypeVariableBlock || block == TypeAliasBlock) {
|
||||
_Py_DECLARE_STR(format, ".format");
|
||||
// We need to insert code that reads this "parameter" to the function.
|
||||
if (!symtable_add_def(st, &_Py_STR(format), DEF_PARAM, loc)) {
|
||||
return 0;
|
||||
}
|
||||
if (!symtable_add_def(st, &_Py_STR(format), USE, loc)) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
@ -2630,18 +2641,6 @@ symtable_visit_annotation(struct symtable *st, expr_ty annotation, void *key)
|
|||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
_Py_DECLARE_STR(format, ".format");
|
||||
// The generated __annotate__ function takes a single parameter with the
|
||||
// internal name ".format".
|
||||
if (!symtable_add_def(st, &_Py_STR(format), DEF_PARAM,
|
||||
LOCATION(annotation))) {
|
||||
return 0;
|
||||
}
|
||||
if (!symtable_add_def(st, &_Py_STR(format), USE,
|
||||
LOCATION(annotation))) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (!symtable_enter_existing_block(st, parent_ste->ste_annotation_block)) {
|
||||
|
@ -2690,14 +2689,6 @@ symtable_visit_annotations(struct symtable *st, stmt_ty o, arguments_ty a, expr_
|
|||
return 0;
|
||||
}
|
||||
}
|
||||
_Py_DECLARE_STR(format, ".format");
|
||||
// We need to insert code that reads this "parameter" to the function.
|
||||
if (!symtable_add_def(st, &_Py_STR(format), DEF_PARAM, LOCATION(o))) {
|
||||
return 0;
|
||||
}
|
||||
if (!symtable_add_def(st, &_Py_STR(format), USE, LOCATION(o))) {
|
||||
return 0;
|
||||
}
|
||||
if (a->posonlyargs && !symtable_visit_argannotations(st, a->posonlyargs))
|
||||
return 0;
|
||||
if (a->args && !symtable_visit_argannotations(st, a->args))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue