mirror of
https://github.com/python/cpython.git
synced 2025-08-30 13:38:43 +00:00
bpo-34876: Change the lineno of the AST for decorated function and class. (GH-9731)
It was overridden by the lineno of the first decorator. Now it is the lineno of 'def' or 'class'.
This commit is contained in:
parent
b83d917faf
commit
95b6acf951
7 changed files with 2561 additions and 2492 deletions
|
@ -1659,12 +1659,6 @@ ast_for_decorated(struct compiling *c, const node *n)
|
|||
} else if (TYPE(CHILD(n, 1)) == async_funcdef) {
|
||||
thing = ast_for_async_funcdef(c, CHILD(n, 1), decorator_seq);
|
||||
}
|
||||
/* we count the decorators in when talking about the class' or
|
||||
* function's line number */
|
||||
if (thing) {
|
||||
thing->lineno = LINENO(n);
|
||||
thing->col_offset = n->n_col_offset;
|
||||
}
|
||||
return thing;
|
||||
}
|
||||
|
||||
|
|
|
@ -1950,6 +1950,7 @@ compiler_function(struct compiler *c, stmt_ty s, int is_async)
|
|||
Py_ssize_t i, funcflags;
|
||||
int annotations;
|
||||
int scope_type;
|
||||
int firstlineno;
|
||||
|
||||
if (is_async) {
|
||||
assert(s->kind == AsyncFunctionDef_kind);
|
||||
|
@ -1976,6 +1977,11 @@ compiler_function(struct compiler *c, stmt_ty s, int is_async)
|
|||
if (!compiler_decorators(c, decos))
|
||||
return 0;
|
||||
|
||||
firstlineno = s->lineno;
|
||||
if (asdl_seq_LEN(decos)) {
|
||||
firstlineno = ((expr_ty)asdl_seq_GET(decos, 0))->lineno;
|
||||
}
|
||||
|
||||
funcflags = compiler_default_arguments(c, args);
|
||||
if (funcflags == -1) {
|
||||
return 0;
|
||||
|
@ -1989,7 +1995,7 @@ compiler_function(struct compiler *c, stmt_ty s, int is_async)
|
|||
funcflags |= 0x04;
|
||||
}
|
||||
|
||||
if (!compiler_enter_scope(c, name, scope_type, (void *)s, s->lineno)) {
|
||||
if (!compiler_enter_scope(c, name, scope_type, (void *)s, firstlineno)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -2032,12 +2038,17 @@ compiler_class(struct compiler *c, stmt_ty s)
|
|||
{
|
||||
PyCodeObject *co;
|
||||
PyObject *str;
|
||||
int i;
|
||||
int i, firstlineno;
|
||||
asdl_seq* decos = s->v.ClassDef.decorator_list;
|
||||
|
||||
if (!compiler_decorators(c, decos))
|
||||
return 0;
|
||||
|
||||
firstlineno = s->lineno;
|
||||
if (asdl_seq_LEN(decos)) {
|
||||
firstlineno = ((expr_ty)asdl_seq_GET(decos, 0))->lineno;
|
||||
}
|
||||
|
||||
/* ultimately generate code for:
|
||||
<name> = __build_class__(<func>, <name>, *<bases>, **<keywords>)
|
||||
where:
|
||||
|
@ -2052,7 +2063,7 @@ compiler_class(struct compiler *c, stmt_ty s)
|
|||
|
||||
/* 1. compile the class body into a code object */
|
||||
if (!compiler_enter_scope(c, s->v.ClassDef.name,
|
||||
COMPILER_SCOPE_CLASS, (void *)s, s->lineno))
|
||||
COMPILER_SCOPE_CLASS, (void *)s, firstlineno))
|
||||
return 0;
|
||||
/* this block represents what we do in the new scope */
|
||||
{
|
||||
|
|
2103
Python/importlib.h
generated
2103
Python/importlib.h
generated
File diff suppressed because it is too large
Load diff
2861
Python/importlib_external.h
generated
2861
Python/importlib_external.h
generated
File diff suppressed because it is too large
Load diff
Loading…
Add table
Add a link
Reference in a new issue