This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Correct err msg when calling stub w/no autoload fb
authorFather Chrysostomos <sprout@cpan.org>
Sun, 8 Jul 2012 06:39:07 +0000 (23:39 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Sun, 8 Jul 2012 07:24:11 +0000 (00:24 -0700)
If an AUTOLOAD subroutine loads a sub by assigning to the glob, there
may be code elsewhere that has a reference to a stub, that is now
assigned over.  To cope with this situation, calls to undefined sub-
routines will fall back to whatever sub is in the subroutine‚Äôs owner
typeglob.  This has been the case since Perl 5.000.

But the error message that occurs if the typeglob happens to have no
sub in it is wrong:

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

as opposed to this:

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

They should both produce the same error message, because $foosub is a
code reference, albeit without a body.

MANIFEST
pp_hot.c
t/lib/croak/pp_hot [new file with mode: 0644]

index 7a5d0c0..1396660 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -5034,6 +5034,7 @@ t/lib/compmod.pl          Helper for 1_compile.t
 t/lib/croak/mg                 Test croak calls from mg.c
 t/lib/croak/op                 Test croak calls from op.c
 t/lib/croak/pp_ctl             Test croak calls from pp_ctl.c
+t/lib/croak/pp_hot             Test croak calls from pp_hot.c
 t/lib/croak.t                  Test calls to Perl_croak() in the C source.
 t/lib/croak/toke               Test croak calls from toke.c
 t/lib/cygwin.t                 Builtin cygwin function tests
index 77b707c..38c49a0 100644 (file)
--- a/pp_hot.c
+++ b/pp_hot.c
@@ -2648,15 +2648,15 @@ try_autoload:
            {
                cv = GvCV(autogv);
            }
-           /* sorry */
            else {
+              sorry:
                sub_name = sv_newmortal();
                gv_efullname3(sub_name, gv, NULL);
                DIE(aTHX_ "Undefined subroutine &%"SVf" called", SVfARG(sub_name));
            }
        }
        if (!cv)
-           DIE(aTHX_ "Not a CODE reference");
+           goto sorry;
        goto retry;
     }
 
diff --git a/t/lib/croak/pp_hot b/t/lib/croak/pp_hot
new file mode 100644 (file)
index 0000000..1e12fbb
--- /dev/null
@@ -0,0 +1,13 @@
+__END__
+# NAME calling undef sub belonging to undef GV
+   my $foosub = \&foo;
+   undef *foo;
+   &$foosub;
+EXPECT
+Undefined subroutine &main::foo called at - line 3.
+########
+# NAME calling undef sub resident in its GV
+   my $foosub = \&foo;
+   &$foosub;
+EXPECT
+Undefined subroutine &main::foo called at - line 2.