Ray.Allen <ysj....@gmail.com> added the comment:

It's not a bug. What happens is like this:

1, You set trace function using sys.settrace(tracer).
2, When the following func() is called, tracer is called with a "call" event, 
so the trace function in PyThreadState is set to NULL since 
"sys.settrace(None)" is execute, but since the return value is a valid local 
trace function, the frame of called function("func()") has its local trace 
function.
3, The called function("func()") executes, though its frame has a local trace 
function, but it will not be executed since PyThreadState->c_tracefunc is NULL. 
When you get f_lineno from frame, you get the not refreshed f_lineno value but 
not the dynamically computed lineno, as the f_lineno's getter function said:
    if(f->f_trace)
        return f->f_lineno;
    else
        return PyCode_Addr2Line(f->f_code, f->f_lasti);

   Here because your frame's local trace function is not executed, the f_lineno 
is not refreshed.

4, When the second time func() calls, there is no global trace function. Each 
time you get the f_lineno, it uses PyCode_Addr2Line() to get the dynamically 
computed line number.


I think this situation is so rarely that the doc saying "f_lineno is 
the current line number of the frame" is correct.

----------
nosy: +ysj.ray

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue7238>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to