From e56d54e447694c6ced2093d2273c3e3d60b36b6f Mon Sep 17 00:00:00 2001 From: Mark Shannon Date: Fri, 15 Jan 2021 13:52:00 +0000 Subject: Mark instructions at end of class scope as artificial. (GH-24222) --- Lib/test/test_sys_settrace.py | 18 ++++++++++++++++++ Python/compile.c | 2 ++ 2 files changed, 20 insertions(+) diff --git a/Lib/test/test_sys_settrace.py b/Lib/test/test_sys_settrace.py index 4298986..49e8928 100644 --- a/Lib/test/test_sys_settrace.py +++ b/Lib/test/test_sys_settrace.py @@ -956,6 +956,24 @@ class TraceTestCase(unittest.TestCase): (2, 'line'), (2, 'return')]) + def test_implicit_return_in_class(self): + + def func(): + class A: + if 3 < 9: + a = 1 + else: + a = 2 + + self.run_and_compare(func, + [(0, 'call'), + (1, 'line'), + (1, 'call'), + (1, 'line'), + (2, 'line'), + (3, 'line'), + (3, 'return'), + (1, 'return')]) class SkipLineEventsTraceTestCase(TraceTestCase): """Repeat the trace tests, but with per-line events skipped""" diff --git a/Python/compile.c b/Python/compile.c index d373d8a..6aa74cc 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -2371,6 +2371,8 @@ compiler_class(struct compiler *c, stmt_ty s) compiler_exit_scope(c); return 0; } + /* The following code is artificial */ + c->u->u_lineno = -1; /* 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 */ -- cgit v0.12