mirror of
https://github.com/python/cpython.git
synced 2025-08-31 05:58:33 +00:00
Fix SF bug #765624.
This commit is contained in:
parent
ee6c9b8613
commit
bf57a14522
1 changed files with 12 additions and 5 deletions
|
@ -48,7 +48,7 @@ static void call_trace_protected(Py_tracefunc, PyObject *,
|
||||||
PyFrameObject *, int);
|
PyFrameObject *, int);
|
||||||
static void call_exc_trace(Py_tracefunc, PyObject *, PyFrameObject *);
|
static void call_exc_trace(Py_tracefunc, PyObject *, PyFrameObject *);
|
||||||
static int maybe_call_line_trace(Py_tracefunc, PyObject *,
|
static int maybe_call_line_trace(Py_tracefunc, PyObject *,
|
||||||
PyFrameObject *, int *, int *);
|
PyFrameObject *, int *, int *, int *);
|
||||||
|
|
||||||
static PyObject *apply_slice(PyObject *, PyObject *, PyObject *);
|
static PyObject *apply_slice(PyObject *, PyObject *, PyObject *);
|
||||||
static int assign_slice(PyObject *, PyObject *,
|
static int assign_slice(PyObject *, PyObject *,
|
||||||
|
@ -602,7 +602,7 @@ eval_frame(PyFrameObject *f)
|
||||||
is true when the line being executed has changed. The
|
is true when the line being executed has changed. The
|
||||||
initial values are such as to make this false the first
|
initial values are such as to make this false the first
|
||||||
time it is tested. */
|
time it is tested. */
|
||||||
int instr_ub = -1, instr_lb = 0;
|
int instr_ub = -1, instr_lb = 0, instr_prev = -1;
|
||||||
|
|
||||||
unsigned char *first_instr;
|
unsigned char *first_instr;
|
||||||
PyObject *names;
|
PyObject *names;
|
||||||
|
@ -846,7 +846,8 @@ eval_frame(PyFrameObject *f)
|
||||||
|
|
||||||
err = maybe_call_line_trace(tstate->c_tracefunc,
|
err = maybe_call_line_trace(tstate->c_tracefunc,
|
||||||
tstate->c_traceobj,
|
tstate->c_traceobj,
|
||||||
f, &instr_lb, &instr_ub);
|
f, &instr_lb, &instr_ub,
|
||||||
|
&instr_prev);
|
||||||
/* Reload possibly changed frame fields */
|
/* Reload possibly changed frame fields */
|
||||||
JUMPTO(f->f_lasti);
|
JUMPTO(f->f_lasti);
|
||||||
if (f->f_stacktop != NULL) {
|
if (f->f_stacktop != NULL) {
|
||||||
|
@ -3085,7 +3086,8 @@ _PyEval_CallTracing(PyObject *func, PyObject *args)
|
||||||
|
|
||||||
static int
|
static int
|
||||||
maybe_call_line_trace(Py_tracefunc func, PyObject *obj,
|
maybe_call_line_trace(Py_tracefunc func, PyObject *obj,
|
||||||
PyFrameObject *frame, int *instr_lb, int *instr_ub)
|
PyFrameObject *frame, int *instr_lb, int *instr_ub,
|
||||||
|
int *instr_prev)
|
||||||
{
|
{
|
||||||
/* The theory of SET_LINENO-less tracing.
|
/* The theory of SET_LINENO-less tracing.
|
||||||
|
|
||||||
|
@ -3209,7 +3211,12 @@ maybe_call_line_trace(Py_tracefunc func, PyObject *obj,
|
||||||
*instr_ub = INT_MAX;
|
*instr_ub = INT_MAX;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (frame->f_lasti <= *instr_prev) {
|
||||||
|
/* jumping back in the same line forces a trace event */
|
||||||
|
result = call_trace(func, obj, frame,
|
||||||
|
PyTrace_LINE, Py_None);
|
||||||
|
}
|
||||||
|
*instr_prev = frame->f_lasti;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue