Make rvalue substr call overloading once on utf8 str
authorFather Chrysostomos <sprout@cpan.org>
Sun, 30 Sep 2012 06:56:56 +0000 (23:56 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Mon, 1 Oct 2012 19:51:57 +0000 (12:51 -0700)
pp.c
t/op/substr.t

index e91db87..24837a0 100644 (file)
--- a/pp.c
+++ b/pp.c
@@ -3075,7 +3075,7 @@ PP(pp_substr)
     }
     else tmps = SvPV_const(sv, curlen);
     if (DO_UTF8(sv)) {
-        utf8_curlen = sv_len_utf8_nomg(sv);
+        utf8_curlen = sv_or_pv_len_utf8(sv, tmps, curlen);
        if (utf8_curlen == curlen)
            utf8_curlen = 0;
        else
@@ -3093,7 +3093,7 @@ PP(pp_substr)
 
        byte_len = len;
        byte_pos = utf8_curlen
-           ? sv_pos_u2b_flags(sv, pos, &byte_len, SV_CONST_RETURN) : pos;
+           ? sv_or_pv_pos_u2b(sv, tmps, pos, &byte_len) : pos;
 
        tmps += byte_pos;
 
index a2b24af..fd4f5d2 100644 (file)
@@ -23,7 +23,7 @@ $SIG{__WARN__} = sub {
 
 BEGIN { require './test.pl'; }
 
-plan(385);
+plan(386);
 
 run_tests() unless caller;
 
@@ -850,3 +850,8 @@ $refee = bless ["foo"], o::;
 $o::count = 0;
 substr $refee, 0, 0, "";
 is $o::count, 1, '4-arg substr calls overloading once on the target';
+$refee = bless ["\x{100}"], o::;
+() = "$refee"; # turn UTF8 flag on
+$o::count = 0;
+() = substr $refee, 0;
+is $o::count, 1, 'rvalue substr calls overloading once on utf8 target';