develooper Front page | perl.perl5.porters | Postings from November 2010

Re: [perl #79908] my $x; sub(){$x} makes a constant even if$xchanges

Thread Previous | Thread Next
From:
Abigail
Date:
November 30, 2010 15:23
Subject:
Re: [perl #79908] my $x; sub(){$x} makes a constant even if$xchanges
Message ID:
20101130232426.GB24461@almanda
On Tue, Nov 30, 2010 at 10:34:36PM +0100, Dr.Ruud wrote:
> On 2010-11-29 10:22, Dave Mitchell wrote:
>> On Sun, Nov 28, 2010 at 05:16:28PM -0800, Father Chrysostomos wrote:
>
>>> I know this is what constant.pm used to use, but it causes a bug:
>>
>> What do you think is the bug? It seems to be behaving the way I expect.
>>
>>> $ perl -MO=Deparse -e' BEGIN{my $x = 5; *foo = sub(){$x}; $x=6} print foo'
>>> sub BEGIN {
>>>      my $x = 5;
>>>      *foo = sub () {
>>>          $x;
>>>      }
>>>      ;
>>>      $x = 6;
>>> }
>>> print 5;
>
> The compiler should patch the constsub at the '$x = 6' line.


If the compiler can detect that afterwards $x won't change - but you
need to be able to solve the halting problem to do that in general.
For instance, 

  BEGIN {
     my $x = 5;
     *foo = sub () {$x};
     *bar = sub {$x = shift};
  }

the compiler could only patch the constsub if it knows bar() won't
be called.



Abigail

Thread Previous | Thread Next


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About