[perl #71154] undef &$coderef consistency
authorFather Chrysostomos <sprout@cpan.org>
Thu, 25 Aug 2011 05:16:07 +0000 (22:16 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Thu, 25 Aug 2011 05:16:07 +0000 (22:16 -0700)
$ perl -le' undef &{$x=sub{}}; $x->()'
Not a CODE reference at -e line 1.

undeffing an anonymous subroutine used to turn the ANON flag off,
causing it to bypass the condition apparently written for this situa-
tion in pp_entersub.

This commit stops cv_undef from turning off that flag, so now we get:

$ ./perl -le' undef &{$x=sub{}}; $x->()'
Undefined subroutine called at -e line 1.

pad.c
t/op/anonsub.t

diff --git a/pad.c b/pad.c
index eb88afc..4036ddf 100644 (file)
--- a/pad.c
+++ b/pad.c
@@ -463,8 +463,9 @@ Perl_cv_undef(pTHX_ CV *cv)
        CvXSUB(cv) = NULL;
     }
     /* delete all flags except WEAKOUTSIDE and CVGV_RC, which indicate the
-     * ref status of CvOUTSIDE and CvGV */
-    CvFLAGS(cv) &= (CVf_WEAKOUTSIDE|CVf_CVGV_RC);
+     * ref status of CvOUTSIDE and CvGV, and ANON, which pp_entersub uses
+     * to choose an error message */
+    CvFLAGS(cv) &= (CVf_WEAKOUTSIDE|CVf_CVGV_RC|CVf_ANON);
 }
 
 /*
index 949334b..b83e4af 100644 (file)
@@ -84,3 +84,9 @@ ok 1
 print sub { return "ok 1\n" } -> ();
 EXPECT
 ok 1
+########
+# [perl #71154] undef &$code makes $code->() die with: Not a CODE reference
+undef &{$x=sub{}};
+$x->();
+EXPECT
+Undefined subroutine called at - line 3.