http://qs321.pair.com?node_id=1225867


in reply to Re^7: B::Xref buggy?
in thread B::Xref buggy?

> Concise doesn't track line numbers,

I'm confused ...did you look at the output I provided?

This looks pretty much like the lexical order in the source which is needed to track variables and subs.

and the line numbers are available:

# 6: print "@row"; #: +line 6 - <;> ex-nextstate(main 7 tst_b_xref2.pl:6) v:*,&,x +*,x&,x$,$

The -src option dumps the original source line just before every nextstate OP and the line number is available in tst_b_xref2.pl:6

Could you please provide an example code where this behaviour is broken in the B::Concise output and information is lost?

Probably I'm unaware of some Perl temporal magic ? ? ?

Cheers Rolf
(addicted to the Perl Programming Language :)
Wikisyntax for the Monastery FootballPerl is like chess, only without the dice

Replies are listed 'Best First'.
Re^9: B::Xref buggy?
by dave_the_m (Monsignor) on Nov 15, 2018 at 17:25 UTC
    This looks pretty much like the lexical order in the source which is needed to track variables and subs
    I think that is the heart of your misapprehension. Concise doesn't output ops in source lexical order, apart from happenstance. As a trivial counterexample, this source:
    unless ($var1) { $var2++; } else { $var3++; }
    gives:
    perl -MO=Concise,-exec /tmp/p | grep var 3 <#> gvsv[*var1] s 7 <#> gvsv[*var3] s d <#> gvsv[*var2] s
    Note that var3 comes before var2.

    Dave.

      Thanks, Dave.

      I was aware that OPs do kind of gotos to next-OPs (the ->label at the end of each line).

      But it didn't seem logical that the -src option could be offered if B::Concise wasn't respecting the order.*

      The solution is that the source lines they are not in order, but the line numbers are still reliable:

      D:\tmp>type tst_b_xref3.pl unless ($var1) { $var2++; } else { $var3++; }
      (Win Activestate 5.24)
      D:\tmp>perl -MO=Concise,-src tst_b_xref3.pl|find "var" tst_b_xref3.pl syntax OK # 1: unless ($var1) { 3 <#> gvsv[*var1] s ->4 # 5: $var3++; 7 <#> gvsv[*var3] s ->8 # 2: $var2++; d <#> gvsv[*var2] s ->e

      So strictly speaking it's still possible to use B::Concise to emulate B::Xref on line number level.

      Cheers Rolf
      (addicted to the Perl Programming Language :)
      Wikisyntax for the Monastery FootballPerl is like chess, only without the dice

      *) Interestingly this also depends on the Perl version. Here the vars appear in order: (Ubuntu 5.18)

      $ perl -MO=Concise,-src tst_b_xref3.pl|grep var tst_b_xref3.pl syntax OK # 1: unless ($var1) { 3 <#> gvsv[*var1] s ->4 # 2: $var2++; 8 <#> gvsv[*var2] s ->9 # 5: $var3++; e <#> gvsv[*var3] s ->f

      update

      and that's the reason why, 5.24 is optimizing the negation away by swapping the branches:

      D:\tmp>perl -MO=Deparse tst_b_xref3.pl tst_b_xref3.pl syntax OK if ($var1) { ++$var3; } else { ++$var2; }
        The solution is that the source lines they are not in order, but the line numbers are still reliable:
        (Cough)
        $ cat /tmp/p for ( $var1++; $var2++; $var3++ ) { $var4++; } $ perl -MO=Concise,-src /tmp/p | grep var /tmp/p syntax OK 3 <#> gvsv[*var1] s ->4 f <#> gvsv[*var2] s ->g # 6: $var4++; 9 <#> gvsv[*var4] s ->a c <#> gvsv[*var3] s ->d

        Dave.