diff options
-rw-r--r-- | pp.c | 9 | ||||
-rwxr-xr-x | t/op/substr.t | 7 |
2 files changed, 10 insertions, 6 deletions
@@ -1076,10 +1076,10 @@ PP(pp_repeat) SP -= items; } else { /* Note: mark already snarfed by pp_list */ - SV *tmpstr; + SV *tmpstr = POPs; STRLEN len; + bool isutf = SvUTF8(tmpstr) ? TRUE : FALSE; - tmpstr = POPs; SvSetSV(TARG, tmpstr); SvPV_force(TARG, len); if (count != 1) { @@ -1092,7 +1092,10 @@ PP(pp_repeat) } *SvEND(TARG) = '\0'; } - (void)SvPOK_only(TARG); + if (isutf) + (void)SvPOK_only_UTF8(TARG); + else + (void)SvPOK_only(TARG); PUSHTARG; } RETURN; diff --git a/t/op/substr.t b/t/op/substr.t index 6180acc402..a67eae56ac 100755 --- a/t/op/substr.t +++ b/t/op/substr.t @@ -275,8 +275,9 @@ ok 125, $a eq 'xxxxefgh'; ok 126, length($x) eq 3; $x = substr($x,1,1); ok 127, $x eq "\x{263a}"; - ok 128, length($x) eq 1; + $x = $x x 2; + ok 128, length($x) eq 2; substr($x,0,1) = "abcd"; - ok 129, $x eq "abcd"; - ok 130, length($x) eq 4; + ok 129, $x eq "abcd\x{263a}"; + ok 130, length($x) eq 5; } |