Re: [PATCH] concat interacts badly with magic
Robin Houston [Tue, 22 Nov 2005 14:07:27 +0000 (14:07 +0000)]
Message-ID: <20051122140727.GA29861@rpc142.cs.man.ac.uk>

(new version of patch for bug #37722)

p4raw-id: //depot/perl@26192

pp_hot.c
t/lib/warnings/9uninit
t/lib/warnings/pp_hot
t/op/tie.t

index 813b606..312eef7 100644 (file)
--- a/pp_hot.c
+++ b/pp_hot.c
@@ -148,11 +148,14 @@ PP(pp_concat)
     dPOPTOPssrl;
     bool lbyte;
     STRLEN rlen;
-    const char *rpv = SvPV_const(right, rlen); /* mg_get(right) happens here */
-    const bool rbyte = !DO_UTF8(right);
+    const char *rpv;
+    bool rbyte;
     bool rcopied = FALSE;
 
     if (TARG == right && right != left) {
+       /* mg_get(right) may happen here ... */
+       rpv = SvPV_const(right, rlen);
+       rbyte = !DO_UTF8(right);
        right = sv_2mortal(newSVpvn(rpv, rlen));
        rpv = SvPV_const(right, rlen);  /* no point setting UTF-8 here */
        rcopied = TRUE;
@@ -171,14 +174,22 @@ PP(pp_concat)
     else { /* TARG == left */
         STRLEN llen;
        SvGETMAGIC(left);               /* or mg_get(left) may happen here */
-       if (!SvOK(TARG))
+       if (!SvOK(TARG)) {
+           if (left == right && ckWARN(WARN_UNINITIALIZED))
+               report_uninit(right);
            sv_setpvn(left, "", 0);
+       }
        (void)SvPV_nomg_const(left, llen);    /* Needed to set UTF8 flag */
        lbyte = !DO_UTF8(left);
        if (IN_BYTES)
            SvUTF8_off(TARG);
     }
 
+    /* or mg_get(right) may happen here */
+    if (!rcopied) {
+       rpv = SvPV_const(right, rlen);
+       rbyte = !DO_UTF8(right);
+    }
     if (lbyte != rbyte) {
        if (lbyte)
            sv_utf8_upgrade_nomg(TARG);
index 023f857..07fffa8 100644 (file)
@@ -625,8 +625,8 @@ Use of uninitialized value $m1 in glob elem at - line 5.
 Use of uninitialized value $g1 in subroutine prototype at - line 6.
 Use of uninitialized value $g1 in bless at - line 7.
 Use of uninitialized value $m1 in quoted execution (``, qx) at - line 8.
-Use of uninitialized value $g1 in concatenation (.) or string at - line 10.
 Use of uninitialized value $m1 in concatenation (.) or string at - line 10.
+Use of uninitialized value $g1 in concatenation (.) or string at - line 10.
 ########
 use warnings 'uninitialized';
 my ($m1);
index 070aaf0..a0b9b10 100644 (file)
@@ -267,8 +267,8 @@ $x .= $y;   # should warn once
 $y .= $y;      # should warn once
 EXPECT
 Use of uninitialized value $x in concatenation (.) or string at - line 5.
-Use of uninitialized value $y in concatenation (.) or string at - line 6.
 Use of uninitialized value $x in concatenation (.) or string at - line 6.
+Use of uninitialized value $y in concatenation (.) or string at - line 6.
 Use of uninitialized value $y in concatenation (.) or string at - line 7.
 Use of uninitialized value $y in concatenation (.) or string at - line 8.
 ########
index 1fe37e1..8cb4539 100755 (executable)
@@ -578,3 +578,10 @@ tie $h, "main";
 print $h,"\n";
 EXPECT
 3.3
+########
+sub TIESCALAR { bless {} }
+sub FETCH { shift()->{i} ++ }
+tie $h, "main";
+print $h.$h;
+EXPECT
+01