summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pp.c9
-rwxr-xr-xt/op/substr.t7
2 files changed, 10 insertions, 6 deletions
diff --git a/pp.c b/pp.c
index d2a8c64af4..03ced37ca9 100644
--- a/pp.c
+++ b/pp.c
@@ -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;
}