Stop SvPVutf8 from forcing the POK flag
authorFather Chrysostomos <sprout@cpan.org>
Wed, 1 Feb 2012 04:40:14 +0000 (20:40 -0800)
committerFather Chrysostomos <sprout@cpan.org>
Wed, 1 Feb 2012 04:40:14 +0000 (20:40 -0800)
It was setting this even on magical variables, causing stringification
not to bother calling FETCH, because the POK flag means ‘yes, I’m a
bonified [sic] string, with nothing funny going on’.

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

index 2212774..c57257e 100644 (file)
@@ -1,6 +1,6 @@
 #!perl -w
 
-use Test::More tests => 9;
+use Test::More tests => 10;
 
 BEGIN {
     use_ok('XS::APItest')
@@ -46,3 +46,5 @@ undef $f;
 is SvPVutf8($t), "\xc3\xbf",
   'SvPVutf8 works with get-magic downgrading the SV';
 is $f, 1, 'SvPVutf8 calls get-magic once';
+()="$t";
+is $f, 2, 'SvPVutf8 does not stop stringification from calling FETCH';
diff --git a/sv.c b/sv.c
index f53ad12..03c1874 100644 (file)
--- a/sv.c
+++ b/sv.c
@@ -3062,7 +3062,9 @@ Perl_sv_2pvutf8(pTHX_ register SV *sv, STRLEN *const lp)
     if ((SvTHINKFIRST(sv) && !SvIsCOW(sv)) || isGV_with_GP(sv))
        sv = sv_mortalcopy(sv);
     sv_utf8_upgrade(sv);
-    return lp ? SvPV(sv,*lp) : SvPV_nolen(sv);
+    if (SvGMAGICAL(sv)) SvFLAGS(sv) &= ~SVf_POK;
+    assert(SvPOKp(sv));
+    return lp ? SvPV_nomg(sv,*lp) : SvPV_nomg_nolen(sv);
 }