Call overloading once for utf8 ovld→substr assignment
authorFather Chrysostomos <sprout@cpan.org>
Mon, 1 Oct 2012 06:28:12 +0000 (23:28 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Mon, 1 Oct 2012 19:51:58 +0000 (12:51 -0700)
mg.c
t/op/substr.t

index 5ea262b..2f8c81c 100644 (file)
--- a/mg.c
+++ b/mg.c
@@ -2194,7 +2194,7 @@ Perl_magic_setsubstr(pTHX_ SV *sv, MAGIC *mg)
        sv_utf8_upgrade_nomg(lsv);
        lvoff = sv_pos_u2b_flags(lsv, lvoff, &lvlen, SV_CONST_RETURN);
        sv_insert_flags(lsv, lvoff, lvlen, tmps, len, 0);
-       newtarglen = sv_len_utf8(sv);
+       newtarglen = sv_or_pv_len_utf8(sv, tmps, len);
        SvUTF8_on(lsv);
     }
     else if (SvUTF8(lsv)) {
index 4fb4f96..1b7cf31 100644 (file)
@@ -23,7 +23,7 @@ $SIG{__WARN__} = sub {
 
 BEGIN { require './test.pl'; }
 
-plan(386);
+plan(387);
 
 run_tests() unless caller;
 
@@ -855,6 +855,10 @@ $refee = bless ["\x{100}"], o::;
 $o::count = 0;
 () = substr $refee, 0;
 is $o::count, 1, 'rvalue substr calls overloading once on utf8 target';
+$o::count = 0;
+$refee = "";
+${\substr $refee, 0} = bless ["\x{100}"], o::;
+is $o::count, 1, 'assigning utf8 overload to substr lvalue calls ovld 1ce';
 
 # [perl #7678] core dump with substr reference and localisation
 {$b="abcde"; local $k; *k=\substr($b, 2, 1);}