Make magic_setsubstr check UTF8 flag after stringification
authorFather Chrysostomos <sprout@cpan.org>
Fri, 28 Sep 2012 12:52:53 +0000 (05:52 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Mon, 1 Oct 2012 19:51:54 +0000 (12:51 -0700)
commitcc02ebe5373ef9dc4ac786b90cb5db113958408e
tree11ff06e1d83186312a2bf211f7ebc725b4920fcc
parent4ddea69a03520899f0beb1187b9ae3c69f278179
Make magic_setsubstr check UTF8 flag after stringification

By checking it before, it can end up treating a UTF8 string as bytes
when calculating offsets if the UTF8 flag is not turned on until
the target is stringified.  This can happen with overloading and
typeglobs.

This is a regression from 5.14.  5.14 itself was buggy, too, but one
would have to modify the target after creating the substr lvalue but
before assigning to it; and that because of another bug fixed by
83f78d1a27, which was cancelling out this one.

package o {
    use overload '""' => sub { $_[0][0] }
}
my $refee = bless ["\x{100}a"], o::;
my $substr = \substr $refee, -2;
$$substr = "b";
warn $refee;

That prints:

Wide character in warn at - line 7.
Āb at - line 7.

In 5.14 it prints:

b at - line 7.
mg.c
t/op/substr.t