This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Make undef &foo remove call checkers
authorFather Chrysostomos <sprout@cpan.org>
Sun, 29 Jul 2012 20:14:40 +0000 (13:14 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Sun, 29 Jul 2012 20:14:40 +0000 (13:14 -0700)
The fact that the call checker is stored in magic is an implementation
detail.  cv_undef does not free magic, so the call checker lives on.

If we were to move the parameter prototype into magic internally, we
would not want undef to stop clearing it.  To me, the current situa-
tion with call checkers is similar.

ext/XS-APItest/t/call_checker.t
pad.c

index 429cea6..b01323a 100644 (file)
@@ -1,6 +1,6 @@
 use warnings;
 use strict;
-use Test::More tests => 67;
+use Test::More tests => 70;
 
 use XS::APItest;
 
@@ -169,4 +169,13 @@ is $@, "";
 is_deeply $foo_got, [ qw(a b), qw(a b c) ];
 is $foo_ret, "z";
 
+cv_set_call_checker_lists(\&foo);
+undef &foo;
+$foo_got = undef;
+eval 'sub foo($@) { $foo_got = [ @_ ]; return "z"; }
+      $foo_ret = foo(@b, @c);';
+is $@, "";
+is_deeply $foo_got, [ 2, qw(a b c) ], 'undef clears call checkers';
+is $foo_ret, "z";
+
 1;
diff --git a/pad.c b/pad.c
index 352c5f9..71d5296 100644 (file)
--- a/pad.c
+++ b/pad.c
@@ -375,6 +375,7 @@ Perl_cv_undef(pTHX_ CV *cv)
     else if (slabbed) Perl_warn(aTHX_ "Slab leaked from cv %p", cv);
 #endif
     SvPOK_off(MUTABLE_SV(cv));         /* forget prototype */
+    sv_unmagic((SV *)cv, PERL_MAGIC_checkcall);
     CvGV_set(cv, NULL);
 
     /* This statement and the subsequence if block was pad_undef().  */