++ed by:

2 non-PAUSE users.

Rocky Bernstein

NAME

Perl Deparse plugin for Devel::Trepan via B::DeparseTree

SUMMARY

This adds deparse and deval commands to the Devel::Trepan debugger; deparse deparses Perl code; deval evaluates de-parsed Perl at the current point in the Perl program that you are stopped at.

DESCRIPTION

Perl reports location only at the granularity of a line number. Sometimes you would like better or more precise information. For example suppose I am stopped on this line taken from File::Basename::fileparse:

     if (grep { $type eq $_ } qw(MSDOS DOS MSWin32 Epoc)) {  # ...

In a debugger, there happen to be to distinct locations in the code that you might be stopped in. The first place is before the grep starts at all. Here, deparse will show:

      grep { $type eq $_; } 'MSDOS', 'DOS', 'MSWin32', 'Epoc'

But also you might be stopped inside grep. Here deparse will show:

    $ deparse
    grepwhile, pushmark B::OP=SCALAR(0x563a8ab1c268)
        at address 0x563a871c07d0:
    if (grep { $type eq $_ } 'MSDOS', 'DOS', 'MSWin32', 'Epoc') {
             |    # code to be run next...

The | indicates that a "pushmark" really doesn't have an exact correspondence in the source text, but roughly here it is about where you would just before stepping into the block. In partular variable $_ has not been set.

But notice that when we step athough we are on the same line, we are at a different position in the statement:

    $ step
    $ deparse

    (trepanpl): deparse
    not my, padsv B::OP=SCALAR(0x563a8abd51a8)
        at address 0x563a871c0a78:
    $type eq $_
    -----

So now we are actually inside the block, and so $_ is now set. If the above wasn't enough context to indicate where you are the -p option on deparse will show you parent levels in the tree:

(trepanpl): deparse -p 3

    00 not my:
    $type
     - - - - - - - - - - - - - - - - - - - -
    01 binary operator eq:
    $type eq $_
     - - - - - - - - - - - - - - - - - - - -
    02 statements:
     $type eq $_
     - - - - - - - - - - - - - - - - - - - -
    03 map grep block:
    grep { $type eq $_ } 'MSDOS', 'DOS', 'MSWin32', 'Epoc'
    (trepanpl): 00 not my:
    $type
     - - - - - - - - - - - - - - - - - - - -
    01 binary operator eq:
    $type eq $_
     - - - - - - - - - - - - - - - - - - - -
    02 statements:
    $type eq $_
     - - - - - - - - - - - - - - - - - - - -
    03 map grep block:
    grep { $type eq $_ } 'MSDOS', 'DOS', 'MSWin32', 'Epoc'
    (trepanpl):

See Exact Perl location with B::Deparse (and Devel::Callsite).

deparse

Deparses Perl from interpreter OPs. See deparse for more information and command syntax.

deval

This is somewhat like eval or eval? which evaluates the Perl code that is about to be run, but (when it works), it can be more reliable. Eval works on simple-minded string manipulation via regular expressions to pull out what to evaluate, whereas deval gets its information directly from the interpreter code.

See deval for more information and command syntax.

AUTHORS

Rocky Bernstein

COPYRIGHT

Copyright (C) 2015, 2018 Rocky Bernstein <rocky@cpan.org>

This program is distributed WITHOUT ANY WARRANTY, including but not limited to the implied warranties of merchantability or fitness for a particular purpose.

The program is free software. You may distribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation (either version 2 or any later version) and the Perl Artistic License as published by O'Reilly Media, Inc. Please open the files named gpl-2.0.txt and Artistic for a copy of these licenses.