mirror of
https://github.com/python/cpython.git
synced 2025-10-07 15:42:02 +00:00
gh-104686: Fix tracing for decorated classes (#104708)
This commit is contained in:
parent
64d1b44a54
commit
cd9748409a
2 changed files with 50 additions and 0 deletions
|
@ -1524,6 +1524,52 @@ class TraceTestCase(unittest.TestCase):
|
||||||
(3, 'return'),
|
(3, 'return'),
|
||||||
(1, 'return')])
|
(1, 'return')])
|
||||||
|
|
||||||
|
def test_class_creation_with_decorator(self):
|
||||||
|
def func():
|
||||||
|
def decorator(arg):
|
||||||
|
def _dec(c):
|
||||||
|
return c
|
||||||
|
return _dec
|
||||||
|
|
||||||
|
@decorator(6)
|
||||||
|
@decorator(
|
||||||
|
len([8]),
|
||||||
|
)
|
||||||
|
class MyObject:
|
||||||
|
pass
|
||||||
|
|
||||||
|
self.run_and_compare(func, [
|
||||||
|
(0, 'call'),
|
||||||
|
(1, 'line'),
|
||||||
|
(6, 'line'),
|
||||||
|
(1, 'call'),
|
||||||
|
(2, 'line'),
|
||||||
|
(4, 'line'),
|
||||||
|
(4, 'return'),
|
||||||
|
(7, 'line'),
|
||||||
|
(8, 'line'),
|
||||||
|
(7, 'line'),
|
||||||
|
(1, 'call'),
|
||||||
|
(2, 'line'),
|
||||||
|
(4, 'line'),
|
||||||
|
(4, 'return'),
|
||||||
|
(10, 'line'),
|
||||||
|
(6, 'call'),
|
||||||
|
(6, 'line'),
|
||||||
|
(11, 'line'),
|
||||||
|
(11, 'return'),
|
||||||
|
(7, 'line'),
|
||||||
|
(2, 'call'),
|
||||||
|
(3, 'line'),
|
||||||
|
(3, 'return'),
|
||||||
|
(6, 'line'),
|
||||||
|
(2, 'call'),
|
||||||
|
(3, 'line'),
|
||||||
|
(3, 'return'),
|
||||||
|
(10, 'line'),
|
||||||
|
(10, 'return'),
|
||||||
|
])
|
||||||
|
|
||||||
@support.cpython_only
|
@support.cpython_only
|
||||||
def test_no_line_event_after_creating_generator(self):
|
def test_no_line_event_after_creating_generator(self):
|
||||||
# Spurious line events before call events only show up with C tracer
|
# Spurious line events before call events only show up with C tracer
|
||||||
|
|
|
@ -2486,6 +2486,10 @@ compiler_class_body(struct compiler *c, stmt_ty s, int firstlineno)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 2. load the 'build_class' function */
|
/* 2. load the 'build_class' function */
|
||||||
|
|
||||||
|
// these instructions should be attributed to the class line,
|
||||||
|
// not a decorator line
|
||||||
|
loc = LOC(s);
|
||||||
ADDOP(c, loc, PUSH_NULL);
|
ADDOP(c, loc, PUSH_NULL);
|
||||||
ADDOP(c, loc, LOAD_BUILD_CLASS);
|
ADDOP(c, loc, LOAD_BUILD_CLASS);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue