diff options
Diffstat (limited to 'Python/compile.c')
-rw-r--r-- | Python/compile.c | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/Python/compile.c b/Python/compile.c index 11958d3841..45a8c573a5 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -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 */ { |