hook phase debugging must traverse to find line number

igotimac at gmail.com igotimac at gmail.com
Mon Nov 3 17:59:57 UTC 2008


Reviewers: djabberd,

Description:
Extra logging was added in:

http://code.sixapart.com/trac/djabberd/changeset/799

This new logging makes calls to B::svref_2object, which is apparently
some part of the perl compile that allows you to traverse the call stack
and figure out who called you.

Example debug output:

For phase [PresenceCheck] invoking hook 1 of 2 defined at:
lib/DJabberd/PresenceChecker.pm:26

There seems to be a problem however in some cases.  I'm not exactly sure
why.  But in some case:

$cv->ROOT->first->line

returns the correct line number

while:

$cv->ROOT->first->first->line

causes an error: (Can't locate object method "first" via package
"B::COP")

Example callback of this case:

For phase [AlterPresenceAvailable] invoking hook 3 of 3 defined at:
lib/DJabberd/VHost.pm:201


So, it seems that instead of blindly calling
'$cv->ROOT->first->first->line', the code needs to traverse these
B::LISTOP objects to the proper depth to find a B::COP object from which
we can get the line number.

Please review this at http://codereview.appspot.com/7732

Affected files:
   lib/DJabberd/VHost.pm


Index: lib/DJabberd/VHost.pm
===================================================================
--- lib/DJabberd/VHost.pm	(revision 819)
+++ lib/DJabberd/VHost.pm	(working copy)
@@ -259,9 +259,13 @@
              # the filename. This gives us both the filename and line  
number it's defined
              # on, giving the user a very clear pointer to which subref  
will be invoked --kane
              my $cv = B::svref_2object($hk);
+            my $bcop = $cv->ROOT->first;
+            while(! $bcop->isa("B::COP")){
+              $bcop = $bcop->first;
+            }
              $logger->debug(
                  "For phase [@$phase] invoking hook $depth of $hook_count  
defined at: ".
-                $cv->FILE .':'. $cv->ROOT->first->first->line
+                $cv->FILE .':'. $bcop->line
              );
          }





More information about the Djabberd mailing list