in reply to Re: Inlining a "lexically-scoped scalar which has no other references"
in thread Inlining a "lexically-scoped scalar which has no other references"

thx, ikegami these are pretty much all the tests I already ran. 8-|

I think it's an old optimization feature that got dropped/lost, without updating the docs.

If anyone has access to a fairly old perl5 version, it would be nice to know what these test produce... He doesn't need to use B::Concise, it's documented that redefining a "constant function" always has to give a warning!

so plz, just run this code, and check for a warning:

no warnings; my $lex = 4; # file scoped lexical #--- normal # inner scope sub with_proto () { my $lex } # outer scope { my $lex = 4; sub with_proto() { $lex } } # file scope sub with_proto() { $lex } #--- reference # inner scope sub with_proto() {\ my $lex } # outer scope { my $lex = 4; sub with_proto() {\ $lex } } # file scope sub with_proto() {\ $lex } #------ lvalue #--- normal # inner scope sub with_proto() :lvalue { my $lex } # outer scope { my $lex = 4; sub with_proto() :lvalue { $lex } } # file scope sub with_proto() :lvalue { $lex } #--- reference # lvalue references are not feasible, because of # "Can't modify single ref constructor in lvalue subroutine" #------ overriding constant function throws always a warning sub with_proto () {4} # uncommenting garanties a warning # sub with_proto () {5}

Cheers Rolf

  • Comment on Re^2: Inlining a "lexically-scoped scalar which has no other references"
  • Download Code

Replies are listed 'Best First'.
Re^3: Inlining a "lexically-scoped scalar which has no other references"
by ikegami (Patriarch) on Sep 28, 2009 at 02:00 UTC

    The oldest I have is 5.6.0, but it doesn't give a warning even when uncommenting the last line.

    Changing no warnings; to use warnings; shows that the following creates a constant in 5.6.0 and 5.6.1, but not in 5.8.0:

    sub with_proto () { my $lex }
    >c:\progs\perl560\bin\perl test.pl Use of uninitialized value at test.pl line 12. Constant subroutine with_proto redefined at test.pl line 12. Subroutine with_proto redefined at test.pl line 16. Subroutine with_proto redefined at test.pl line 20. Subroutine with_proto redefined at test.pl line 25. Subroutine with_proto redefined at test.pl line 29. Subroutine with_proto redefined at test.pl line 36. Subroutine with_proto redefined at test.pl line 41. Subroutine with_proto redefined at test.pl line 45. Subroutine with_proto redefined at test.pl line 55. Constant subroutine with_proto redefined at test.pl line 58. >c:\progs\perl561\bin\perl test.pl Use of uninitialized value at test.pl line 12. Constant subroutine with_proto redefined at test.pl line 12. Subroutine with_proto redefined at test.pl line 16. Subroutine with_proto redefined at test.pl line 20. Subroutine with_proto redefined at test.pl line 25. Subroutine with_proto redefined at test.pl line 29. Subroutine with_proto redefined at test.pl line 36. Subroutine with_proto redefined at test.pl line 41. Subroutine with_proto redefined at test.pl line 45. Subroutine with_proto redefined at test.pl line 55. Constant subroutine with_proto redefined at test.pl line 58. >c:\progs\perl580\bin\perl test.pl Subroutine with_proto redefined at test.pl line 12. Subroutine with_proto redefined at test.pl line 16. Subroutine with_proto redefined at test.pl line 20. Subroutine with_proto redefined at test.pl line 25. Subroutine with_proto redefined at test.pl line 29. Subroutine with_proto redefined at test.pl line 36. Subroutine with_proto redefined at test.pl line 41. Subroutine with_proto redefined at test.pl line 45. Subroutine with_proto redefined at test.pl line 55. Constant subroutine with_proto redefined at test.pl line 58.

    Update: I identified the wrong one. Fixed.

      How does one use that?!?!
        Well the question "what for" was the next after identfying "what is it"... (I hoped to find a new black magic gadget to play with ;-)

        I think the intended logic was "if optimization produces a constant return value, then the value will be inlined"!

        Is this a now bug or is it just deprecated and the docs are out of phase?

        Consequently: Do I have to start perlbug or do I have to send a mail to pod-people...?

        Cheers Rolf