develooper Front page | perl.perl5.porters | Postings from July 2012

[perl #71154] undef &$coderef consistency

From:
Father Chrysostomos via RT
Date:
July 8, 2012 00:27
Subject:
[perl #71154] undef &$coderef consistency
Message ID:
rt-3.6.HEAD-28836-1341732443-796.71154-15-0@perl.org
On Wed Dec 09 14:42:07 2009, nicholas wrote:
> $ ./perl -e '$a = sub {}; warn "Before: $a"; undef &$a; warn "After
>    $a"; $a->()'
> Before: CODE(0x100815848) at -e line 1.
> After CODE(0x100815848) at -e line 1.
> Not a CODE reference at -e line 1.
> 
> only it sure does look like a CODE reference.

I fixed that to produce a sensible error message in commit 2c3743704,
which is in 5.16.

What I did not realise was that the problem actually went further (and
my commit fixed this, too):

sub __ANON__ { warn 42 }
$x = sub {};
undef &$x;
$x->();

With 5.14.0:
42 at - line 1.

With 5.16.0:
Undefined subroutine called at - line 4.

So I have improved the test with commit 12f98b43fb8, which makes sure
__ANON__() is not called.

But the problem goes even deeper than that.  This ‘Not a CODE
reference’ error was occurring whenever an already-autoloaded subroutine
was looked for when calling a stub, if the GV had no CV in it.  Compare:

$ perl5.16.0 -e '
  my $foosub = \&foo;
  &$foosub;
'
Undefined subroutine &main::foo called at -e line 3.

$ perl5.16.0 -e '
  my $foosub = \&foo;
  undef *foo;
  &$foosub;
'
Not a CODE reference at -e line 4.

So I have just fixed that now with commit c220e1a11e.

-- 

Father Chrysostomos


---
via perlbug:  queue: perl5 status: resolved
https://rt.perl.org:443/rt3/Ticket/Display.html?id=71154



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