[Python-Dev] seeing off SET_LINENO

Michael Hudson mwh@python.net
30 Jul 2002 11:27:11 +0100


I've submitted a(nother) patch to sf that removes SET_LINENO:

    http://www.python.org/sf/587993

It supports tracing by digging around in the c_lnotab[*] to see when
execution moves onto a different line.

I think it's more or less sound but any changes to the interpreter
main loop are going to be subtle, so I have a few points to raise
here.  In no particular order:

1) this is a change I'd like to see anyway:  
   the use of f->f_lasti in the main loop is confusing.  let's just set
   it at the start of opcode dispatch and leave it the hell alone.

   there's actually what is probably a very old bug in the
   implementation of SET_LINENO.  It does more or less this:

     f->f_lasti = INSTR_OFFSET();
     /* call the trace function */

   It should do this:

     f->f_lasti = INSTR_OFFSET() - 3;
     /* call the trace function */

   The field is called f_LASTi, after all...

2) As I say in the patch, I will buy anyone a beer who can explain
   (without using LLTRACE or reading a lot of dis.py output) why we
   don't call the trace function on POP_TOP opcodes.

3) The patch changes behaviour -- for the better!  You're now rather
   less likely to get the trace function called several times per
   line.

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).

5) We've already bumped the MAGIC for 2.3a0, so we probably don't need
   to do that again.

6) Someone should teach dis.py how to find line breaks from the
   c_lnotab.  I can do this, but not right now....

7) The changes tickle what may be a very old bug in freeze:

    http://www.python.org/sf/588452

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).

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.

Comments welcome!

Cheers,
M.

[*] I've cheated with my sigmonster:
-- 
34. The string is a stark data structure and everywhere it is
    passed there is much duplication of process.  It is a perfect
    vehicle for hiding information.
  -- Alan Perlis, http://www.cs.yale.edu/homes/perlis-alan/quotes.html