This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
pp_subtr: preserve UTF8 flag in rare cases
authorDavid Mitchell <davem@iabyn.com>
Sat, 5 Feb 2011 13:32:24 +0000 (13:32 +0000)
committerDavid Mitchell <davem@iabyn.com>
Sun, 6 Feb 2011 21:34:43 +0000 (21:34 +0000)
There are two main branches in pp_subtr(): the 'in-place' and the other,
depending on whether the replacement string is short enough to be inserted
directly. Commit 80b498e0aacf413fb7460d6882a74c68c1f9df48 back in 2000
changed a SvPOK_only() to a SvPOK_only_UTF8() to preserve the UTF8 bit,
but only on *one* branch. Add the change to the other branch too. This
will only make a difference in rare cases involving 'use bytes' (where it's
arguably broken  and generating malformed utf8 anyway); but the main
reason for doing it is to allow soon for some identical code in the two
branches to be de-duplicated.

pp_hot.c
t/op/bop.t

index 494c50f..88d42a5 100644 (file)
--- a/pp_hot.c
+++ b/pp_hot.c
@@ -2405,7 +2405,7 @@ PP(pp_subst)
        else
            mPUSHi((I32)iters);
 
-       (void)SvPOK_only(TARG);
+       (void)SvPOK_only_UTF8(TARG);
        if (doutf8)
            SvUTF8_on(TARG);
        TAINT_IF(rxtainted);
index fdcded1..238d272 100644 (file)
@@ -15,7 +15,7 @@ BEGIN {
 # If you find tests are failing, please try adding names to tests to track
 # down where the failure is, and supply your new names as a patch.
 # (Just-in-time test naming)
-plan tests => 170 + (10*13*2) + 4;
+plan tests => 171 + (10*13*2) + 4;
 
 # numerics
 ok ((0xdead & 0xbeef) == 0x9ead);
@@ -441,6 +441,16 @@ SKIP: {
   # it's really bogus that (~~malformed) is \0.
   my $ref = "\x{10000}\0";
   is(~~$str, $ref);
+
+  # same test, but this time with a longer replacement string that
+  # exercises a different branch in pp_subsr()
+
+  $str = "\x{10000}\x{800}";
+  { use bytes; $str =~ s/\C\C\z/\0\0\0/; }
+
+  # it's also bogus that (~~malformed) is \0\0\0\0.
+  my $ref = "\x{10000}\0\0\0\0";
+  is(~~$str, $ref, "use bytes with long replacement");
 }
 
 # ref tests