rt #72398 - get magic before downgrading in SvPVbyte()
authorTony Cook <tony@develop-help.com>
Mon, 25 Oct 2010 11:59:59 +0000 (22:59 +1100)
committerTony Cook <tony@develop-help.com>
Mon, 25 Oct 2010 11:59:59 +0000 (22:59 +1100)
ext/XS-APItest/t/svpv_magic.t
sv.c
sv.h

index dd2af8c41954ec58a1b67ac68f7a4fec1591b349..8be18d40205a0232743616a02dd04580a1d3a1ed 100644 (file)
@@ -25,8 +25,5 @@ is(XS::APItest::first_byte("$1"), 0303,
 $a =~ s/(.)/$1/;      # $1 now has the utf8 flag set too
 $b =~ /(.)/;          # $1 shouldn't have the utf8 flag anymore
 
-TODO: {
-local $TODO = "SvPVbyte should handle get magic before checking the utf8 flag";
 is(eval { XS::APItest::first_byte($1) } || $@, 0303,
     "utf8 flag fetched correctly without stringification");
-}
diff --git a/sv.c b/sv.c
index fa6b8fb1e8e1152ecfb8a579f7a33787e46af233..14b8b3997d9bf97aaaeae3a3bd3aeb0181ab49c0 100644 (file)
--- a/sv.c
+++ b/sv.c
@@ -3028,8 +3028,9 @@ Perl_sv_2pvbyte(pTHX_ register SV *const sv, STRLEN *const lp)
 {
     PERL_ARGS_ASSERT_SV_2PVBYTE;
 
+    SvGETMAGIC(sv);
     sv_utf8_downgrade(sv,0);
-    return lp ? SvPV(sv,*lp) : SvPV_nolen(sv);
+    return lp ? SvPV_nomg(sv,*lp) : SvPV_nomg_nolen(sv);
 }
 
 /*
diff --git a/sv.h b/sv.h
index 3be9559242f336be7b1bd04fc72860fde65546dd..92f5edd74a8d56e0413ab11ae543ef84429bf13b 100644 (file)
--- a/sv.h
+++ b/sv.h
@@ -1421,6 +1421,9 @@ Returns a pointer to the string in the SV, or a stringified form of
 the SV if the SV does not contain a string.  The SV may cache the
 stringified form becoming C<SvPOK>.  Handles 'get' magic.
 
+=for apidoc Am|char*|SvPV_nomg_nolen|SV* sv
+Like C<SvPV_nolen> but doesn't process magic.
+
 =for apidoc Am|IV|SvIV|SV* sv
 Coerces the given SV to an integer and returns it. See C<SvIVx> for a
 version which guarantees to evaluate sv only once.
@@ -1586,6 +1589,10 @@ Like sv_utf8_upgrade, but doesn't do magic on C<sv>
     ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
      ? SvPVX(sv) : sv_2pv_flags(sv, 0, SV_GMAGIC))
 
+#define SvPV_nomg_nolen(sv) \
+    ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
+     ? SvPVX(sv) : sv_2pv_flags(sv, 0, 0))
+
 #define SvPV_nolen_const(sv) \
     ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
      ? SvPVX_const(sv) : sv_2pv_flags(sv, 0, SV_GMAGIC|SV_CONST_RETURN))