Peter Otten <[EMAIL PROTECTED]> wrote: >> Which version of Python, and what happens when you try it? >> >> It works fine for me with Python 2.5 on Windows: >> >> C:\Temp>\python25\python -m pdb t.py >>> c:\temp\t.py(3)<module>() >> -> a = 1 >> (Pdb) s >>> c:\temp\t.py(4)<module>() >> -> b = 2 >> (Pdb) j 3 >>> c:\temp\t.py(3)<module>() >> -> a = 1 >> (Pdb) > > It looks like you successfully jumped to the first line, but it will be > skipped if you try to execute it: >
That's why I asked what actually happened. Yes, you and the OP seem to be correct, jumping to the first executable line in a module appears not to execute the line. I verified (with a print statement in pdb) that assigning to self.curframe.f_lineno sets self.curframe.f_lineno and sel.curframe.f_lasti incorrectly: C:\Temp>\python25\python -m pdb t.py > c:\temp\t.py(3)<module>() -> a = 1 (Pdb) s > c:\temp\t.py(4)<module>() -> b = 2 (Pdb) s > c:\temp\t.py(5)<module>() -> a = 3 (Pdb) l 1 #!/usr/bin/env python 2 3 a = 1 4 b = 2 5 -> a = 3 6 c = a + b 7 import dis, sys 8 dis.dis(sys._getframe().f_code) 9 print c [EOF] (Pdb) j 4 f_lineno 4 f_lasti 6 > c:\temp\t.py(4)<module>() -> b = 2 (Pdb) j 3 f_lineno 4 f_lasti 6 > c:\temp\t.py(3)<module>() -> a = 1 (Pdb) j 5 f_lineno 5 f_lasti 12 > c:\temp\t.py(5)<module>() -> a = 3 (Pdb) j 3 f_lineno 4 f_lasti 6 > c:\temp\t.py(3)<module>() -> a = 1 (Pdb) The problem looks to be in frameobject.c: addr = 0; line = f->f_code->co_firstlineno; new_lasti = -1; for (offset = 0; offset < lnotab_len; offset += 2) { addr += lnotab[offset]; line += lnotab[offset+1]; if (line >= new_lineno) { new_lasti = addr; new_lineno = line; break; } } The first bytes in lnotab are the length and line increment for line 3 (i.e. 6, 1). If line==f->f_code->co_firstlineno it should set new_lasti= 0, new_lineno=line but the loop still executes once which increments new_lasti and new_lineno to the next line (6, 4). -- http://mail.python.org/mailman/listinfo/python-list