diff options
author | Robin Houston <robin@cpan.org> | 2005-11-22 14:07:27 +0000 |
---|---|---|
committer | Rafael Garcia-Suarez <rgarciasuarez@gmail.com> | 2005-11-22 15:54:16 +0000 |
commit | c75ab21a94d99a03945b25b8b1543b7a345f7e80 (patch) | |
tree | 6d58ca9816d59a91e54e35110557bccdf9da16c6 /pp_hot.c | |
parent | 5c6165b15bb6ff9e401a0d7426d3bf14fafaf5e2 (diff) | |
download | perl-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.c | 17 |
1 files changed, 14 insertions, 3 deletions
@@ -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); |