Fix cv-to-gv assignment to use CvPROTO
authorFather Chrysostomos <sprout@cpan.org>
Mon, 10 Oct 2011 21:36:53 +0000 (14:36 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Mon, 10 Oct 2011 21:36:53 +0000 (14:36 -0700)
The SvPVX field of a XS AUTOLOAD sub can contain both the prototype
and the name of an AUTOLOADed sub.  The CvPROTO macro knows where in
the buffer to find the prototype.  All code that reads the prototype
should use it.  When I introduced it with commit 8fa6a4095, one code
path was missed: *regular_prototyped_sub = \&prototyped_XS_AUTOLOAD
was using the sub name of the rhs, instead of the prototype, in the
prototype check.

ext/XS-APItest/t/autoload.t
sv.c

index 4656407..756618b 100644 (file)
@@ -7,7 +7,7 @@
 use strict;
 use warnings;
 
-use Test::More tests => 14;
+use Test::More tests => 15;
 
 use XS::APItest;
 
@@ -58,4 +58,8 @@ is join(" ", eval 'a "b", "c"'), '$',
     eval 'sub a($){}';
     like $w, qr/^Prototype mismatch: sub main::a \(\*\$\) vs \(\$\)/m,
         'proto warnings respect AUTOLOAD prototypes';
+    undef $w;
+    *a = \&AUTOLOAD;
+    like $w, qr/^Prototype mismatch: sub main::a \(\$\) vs \(\*\$\)/m,
+        'GV assignment proto warnings respect AUTOLOAD prototypes';
 }
diff --git a/sv.c b/sv.c
index 88b93c6..8368ebf 100644 (file)
--- a/sv.c
+++ b/sv.c
@@ -3859,8 +3859,8 @@ S_glob_assign_ref(pTHX_ SV *const dstr, SV *const sstr)
                    }
                if (!intro)
                    cv_ckproto_len_flags(cv, (const GV *)dstr,
-                                  SvPOK(sref) ? SvPVX_const(sref) : NULL,
-                                  SvPOK(sref) ? SvCUR(sref)  : 0,
+                                  SvPOK(sref) ? CvPROTO(sref) : NULL,
+                                  SvPOK(sref) ? CvPROTOLEN(sref) : 0,
                                    SvPOK(sref) ? SvUTF8(sref) : 0);
            }
            GvCVGEN(dstr) = 0; /* Switch off cacheness. */