mirror of
https://github.com/python/cpython.git
synced 2025-07-16 07:45:20 +00:00
bpo-42823: Fix frame lineno when frame.f_trace is set (GH-24099)
* Add test for frame.f_lineno with/without tracing. * Make sure that frame.f_lineno is correct regardless of whether frame.f_trace is set. * Update importlib * Add NEWS
This commit is contained in:
parent
e40e2a2cc9
commit
ee9f98d9f4
8 changed files with 1182 additions and 1159 deletions
|
@ -4993,27 +4993,28 @@ maybe_call_line_trace(Py_tracefunc func, PyObject *obj,
|
|||
PyCodeAddressRange *bounds, int *instr_prev)
|
||||
{
|
||||
int result = 0;
|
||||
int line = frame->f_lineno;
|
||||
|
||||
/* If the last instruction executed isn't in the current
|
||||
instruction window, reset the window.
|
||||
*/
|
||||
line = _PyCode_CheckLineNumber(frame->f_lasti, bounds);
|
||||
/* If the last instruction falls at the start of a line or if it
|
||||
represents a jump backwards, update the frame's line number and
|
||||
then call the trace function if we're tracing source lines.
|
||||
*/
|
||||
if ((line != frame->f_lineno || frame->f_lasti < *instr_prev)) {
|
||||
if (line != -1) {
|
||||
int lastline = bounds->ar_line;
|
||||
int line = _PyCode_CheckLineNumber(frame->f_lasti, bounds);
|
||||
if (line != -1 && frame->f_trace_lines) {
|
||||
/* Trace backward edges or first instruction of a new line */
|
||||
if (frame->f_lasti < *instr_prev ||
|
||||
(line != lastline && frame->f_lasti == bounds->ar_start))
|
||||
{
|
||||
frame->f_lineno = line;
|
||||
if (frame->f_trace_lines) {
|
||||
result = call_trace(func, obj, tstate, frame, PyTrace_LINE, Py_None);
|
||||
}
|
||||
result = call_trace(func, obj, tstate, frame, PyTrace_LINE, Py_None);
|
||||
frame->f_lineno = 0;
|
||||
}
|
||||
}
|
||||
/* Always emit an opcode event if we're tracing all opcodes. */
|
||||
if (frame->f_trace_opcodes) {
|
||||
frame->f_lineno = _PyCode_CheckLineNumber(frame->f_lasti, bounds);
|
||||
result = call_trace(func, obj, tstate, frame, PyTrace_OPCODE, Py_None);
|
||||
frame->f_lineno = 0;
|
||||
}
|
||||
*instr_prev = frame->f_lasti;
|
||||
return result;
|
||||
|
|
|
@ -6558,6 +6558,12 @@ ensure_exits_have_lineno(struct compiler *c)
|
|||
if (is_exit_without_lineno(entry)) {
|
||||
entry->b_instr[0].i_lineno = c->u->u_firstlineno;
|
||||
}
|
||||
/* Eliminate empty blocks */
|
||||
for (basicblock *b = c->u->u_blocks; b != NULL; b = b->b_list) {
|
||||
while (b->b_next && b->b_next->b_iused == 0) {
|
||||
b->b_next = b->b_next->b_next;
|
||||
}
|
||||
}
|
||||
/* Any remaining reachable exit blocks without line number can only be reached by
|
||||
* fall through, and thus can only have a single predecessor */
|
||||
for (basicblock *b = c->u->u_blocks; b != NULL; b = b->b_list) {
|
||||
|
|
2270
Python/importlib_external.h
generated
2270
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