Make 4-arg substr check SvUTF8(target) after stringfying
authorFather Chrysostomos <sprout@cpan.org>
Sat, 29 Sep 2012 18:27:35 +0000 (11:27 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Mon, 1 Oct 2012 19:51:56 +0000 (12:51 -0700)
commit6582db62b4fd96c49eac4d2a93589be8f4c17da3
tree189426bc0a0ca1f27640df1f5fc83a32e2807015
parent9bb29b6866a80dfaa3765b219ca04942676a2fae
Make 4-arg substr check SvUTF8(target) after stringfying

If it checks the UTF8 flag first, it might be looking at a stale flag,
resulting in malformed UTF8.  Both tests added produced malformed utf8
strings before this commit.

Simply moving this:

    if (!DO_UTF8(sv))
sv_utf8_upgrade(sv);

after the stringification is not enough to fix this, as the string
retrieved will be out of date after we do an upgrade.  To avoid
stringifying twice, we use SvPV_force if there is a replacement.  This
means rearranging if() blocks a little.

The use of SvPV_force also means that string overloading is no longer
called twice on the target scalar.  This rearrangement also means
that targets upgraded to utf8 are no longer exempt from the refer-
ence warning.  (Oh, and the test for that warning was not testing any-
thing in its no warnings test, because the target was no longer a ref-
erence; so I corrected the test.)
pp.c
t/lib/warnings/pp
t/op/substr.t