Beefy Boxes and Bandwidth Generously Provided by pair Networks
No such thing as a small change
 
PerlMonks  

Re^2: Contents of @_ using subroutine signatures with default values (flag)

by LanX (Sage)
on Jul 14, 2020 at 09:07 UTC ( #11119287=note: print w/replies, xml ) Need Help??


in reply to Re: Contents of @_ using subroutine signatures with default values
in thread Contents of @_ using subroutine signatures with default values

> @_ probably wont be populated within signatured subroutines

This desire seems to originate from the performance impact of populating @_.

But this will break some compatibility to older code and make migration harder.

May I suggest a compromise to scan the functions body for the use of @_ and to dynamically decide then?

Attaching a flag to the code-ref which is evaluated by the signature code once the parser encounters @_ shouldn't be too difficult.

I hope you all have in mind that goto &sub relies on @_.

So does the debugger via @DB:_ for call stack traces.

As a side note: JS has a "arguments" array analog to @_ and performance is not JS' problem.

Cheers Rolf
(addicted to the Perl Programming Language :)
Wikisyntax for the Monastery

Replies are listed 'Best First'.
Re^3: Contents of @_ using subroutine signatures with default values (flag)
by dave_the_m (Monsignor) on Jul 14, 2020 at 09:44 UTC
    The simplified answer: no, it's not that simple. If @_ isn't populated, then the signature code gets its arguments directly from the stack. If @_ gets populated, then the stack and @_ can get out of sync, e.g. by code within the signature which manipulates @_. So in that case the code must get its args from @_ rather than from the stack. So there have to be two code paths for everything.

    See this p5p post for more details.

    Dave.

      > See this p5p post for more details.

      Thanks Dave, I will.

      ... this will be a longer read this evening. OO

      On a side note: I was fascinated to learn (rediscover ?), that a call &sub without arguments has full access to the callers @_.

      use strict; use warnings; use Data::Dump qw/pp dd/; sub foo { warn pp \@_; push @_,@_+1 } sub tst { &foo; &foo; &foo; warn pp \@_; } tst(1);

      -*- mode: compilation; default-directory: "d:/exp/" -*- Compilation started at Tue Jul 14 12:21:10 C:/Perl_524/bin\perl.exe -w d:/exp/access_@_.pl [1] at d:/exp/access_@_.pl line 7. [1, 2] at d:/exp/access_@_.pl line 7. [1, 2, 3] at d:/exp/access_@_.pl line 7. [1 .. 4] at d:/exp/access_@_.pl line 15. Compilation finished at Tue Jul 14 12:21:10

      Cheers Rolf
      (addicted to the Perl Programming Language :)
      Wikisyntax for the Monastery

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://11119287]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others drinking their drinks and smoking their pipes about the Monastery: (6)
As of 2021-10-25 22:13 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    My first memorable Perl project was:







    Results (90 votes). Check out past polls.

    Notices?