[Python-Dev] seeing off SET_LINENO
Michael Hudson
mwh@python.net
01 Aug 2002 16:56:49 +0100
Guido van Rossum <guido@python.org> writes:
> > After my patch there are no SET_LINENO opcodes, so execution is
> > never on the def line[*], so no 'line' trace event is generated for
> > the def line, so a debugger that only listens to the 'line' events and
> > ignores the 'call' events will not stop on that line.
>
> If the argument list contains embedded tuples, there's code executed
> to unpack those before the first line of the function.
Well, if there's code there, then the debugger stops. I know it's
confusing to have intuitive behaviour in this area...
> Example:
>
> >>> def f(a, (b, c), d):
> ... print a, b, c, d
> ...
> >>> f(1, (2, 3), 4)
> 1 2 3 4
> >>> f(1, 2, 3)
> Traceback (most recent call last):
> File "<stdin>", line 1, in ?
> File "<stdin>", line 1, in f
> TypeError: unpack non-sequence
> >>>
>
> I hope the debugger will stop *before* this unpacking happens! It
> does now:
>
> >>> import pdb
> >>> pdb.run("f(1, 2, 3)")
> > <string>(0)?()
> (Pdb) s
> > <string>(1)?()
> (Pdb)
> > <stdin>(1)f()
> (Pdb)
> TypeError: 'unpack non-sequence'
> > <stdin>(1)f()
> (Pdb) q
> >>>
Still does:
$ cat t.py
def f(a, (b, c), d):
print a, b, c, d
$ ./python
Python 2.3a0 (#14, Aug 1 2002, 16:48:20)
[GCC 2.96 20000731 (Red Hat Linux 7.2 2.96-108.7.2)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import pdb, t
>>> pdb.run("t.f(1, 2, 3)")
> <string>(1)?()
(Pdb) s
> /home/mwh/src/sf/python/dist/src/build/t.py(1)f()
-> def f(a, (b, c), d):
(Pdb)
TypeError: 'unpack non-sequence'
> /home/mwh/src/sf/python/dist/src/build/t.py(1)f()
-> def f(a, (b, c), d):
(Pdb) q
Anyway, I think I'm done now (as you maybe able to tell from the pile
of patch notification emails than just landed in your inbox :).
These issues from my original mail in this thread still haven't be
addressed:
4) The patch installs a descriptor for f_lineno so that there is no
incompatibility for Python code. The question is what to do with
the f_lineno field in the C struct? Remove it? That would
(probably) mean bumping PY_API_VERSION. Leave it in? Then its
contents would usually be meaningless (keeping it up to date would
rather defeat the point of this patch).
I think leaving f_lineno there but useless is the way to go. If we
actually make incompatible changes for other reasons, then it can
disappear.
8) I haven't measured the performance impact of the changes to code
that is tracing or code that isn't. There's a possible
optimization mentioned in the patch for traced code. For not
traced code it MAY be worthwhile putting the tracing support code
in a static function somewhere so there's less code to jump over in
the main loop (for i-caches and such).
Still haven't done this.
9) This patch stops LLTRACE telling you when execution moves onto a
different line. This could be restored, but
a) I expect I'm the only persion to have used LLTRACE recently
(debugging this patch).
b) This will cause obfuscation, so I'd prefer to do it last.
No change here either.
Cheers,
M.
--
The gripping hand is really that there are morons everywhere, it's
just that the Americon morons are funnier than average.
-- Pim van Riezen, alt.sysadmin.recovery