summaryrefslogtreecommitdiff
path: root/pp_hot.c
diff options
context:
space:
mode:
authorRobin Houston <robin@cpan.org>2005-11-22 14:07:27 +0000
committerRafael Garcia-Suarez <rgarciasuarez@gmail.com>2005-11-22 15:54:16 +0000
commitc75ab21a94d99a03945b25b8b1543b7a345f7e80 (patch)
tree6d58ca9816d59a91e54e35110557bccdf9da16c6 /pp_hot.c
parent5c6165b15bb6ff9e401a0d7426d3bf14fafaf5e2 (diff)
downloadperl-c75ab21a94d99a03945b25b8b1543b7a345f7e80.tar.gz
Re: [PATCH] concat interacts badly with magic
Message-ID: <20051122140727.GA29861@rpc142.cs.man.ac.uk> (new version of patch for bug #37722) p4raw-id: //depot/perl@26192
Diffstat (limited to 'pp_hot.c')
-rw-r--r--pp_hot.c17
1 files changed, 14 insertions, 3 deletions
diff --git a/pp_hot.c b/pp_hot.c
index 813b606b0b..312eef7854 100644
--- 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);