This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
remove double stringify-overload from $ovld .= foo
authorDavid Mitchell <davem@iabyn.com>
Fri, 2 Jul 2010 20:33:01 +0000 (21:33 +0100)
committerDavid Mitchell <davem@iabyn.com>
Sat, 3 Jul 2010 15:25:58 +0000 (16:25 +0100)
There was a piece of code in pp_concat who's job it was to determine the
UT8ness of the LHS, and it did it in a heavy-handed way to cope with the
special case of a regexp (which is an RV pointing to REGEXP which might
be UTF8)

lib/overload.t
pp_hot.c

index c1d4eaf..9860732 100644 (file)
@@ -1722,17 +1722,9 @@ foreach my $op (qw(<=> == != < <= > >=)) {
            #   SCALAR FETCH: initial, sub=,  sub+=, eval-return,
            #          STORE: copy, mutator
            # for fallback, we just stringify, so eval-return and copy skipped
-           #
-           # XXX TODO concat LH overload with fallback calls "" and FETCH
-           # too often
-           if ($_ eq '.') {
-               push @tests, [ 18, $e, "(=)($_=)", '("")("")',
-                       [ 3, 4, 2,     2, 4, 1 ], 1 ];
-           }
-           else {
-               push @tests, [ 18, $e, "(=)($_=)", '("")',
-                       [ 3, 4, 2,     2, 3, 1 ], 1 ];
-           }
+
+           push @tests, [ 18, $e, "(=)($_=)", '("")',
+                           [ 3, 4, 2,     2, 3, 1 ], 1 ];
 
            $subs{$_} =
                "do { my \$arg = %s; \$_[2] ? (3 $op \$arg) : (\$arg $op 3) }";
index 29928d7..0e52921 100644 (file)
--- a/pp_hot.c
+++ b/pp_hot.c
@@ -255,14 +255,13 @@ PP(pp_concat)
            SvUTF8_off(TARG);
     }
     else { /* TARG == left */
-        STRLEN llen;
        if (!SvOK(TARG)) {
            if (left == right && ckWARN(WARN_UNINITIALIZED))
                report_uninit(right);
            sv_setpvs(left, "");
        }
-       (void)SvPV_nomg_const(left, llen);    /* Needed to set UTF8 flag */
-       lbyte = !DO_UTF8(left);
+       lbyte = (SvROK(left) && SvTYPE(SvRV(left)) == SVt_REGEXP)
+                   ?  !DO_UTF8(SvRV(left)) : !DO_UTF8(left);
        if (IN_BYTES)
            SvUTF8_off(TARG);
     }