From: Robin Houston Date: Mon, 21 Nov 2005 17:03:39 +0000 (+0000) Subject: concat interacts badly with magic X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=91cec4fb3b9ce703dab10db05e717127b2a9ed44;p=p5sagit%2Fp5-mst-13.2.git concat interacts badly with magic Message-ID: <20051121170339.GA8214@rpc142.cs.man.ac.uk> p4raw-id: //depot/perl@26185 --- diff --git a/pp_hot.c b/pp_hot.c index 813b606..8502c1c 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; @@ -179,6 +182,11 @@ PP(pp_concat) 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); diff --git a/t/op/tie.t b/t/op/tie.t index 1fe37e1..8cb4539 100755 --- a/t/op/tie.t +++ b/t/op/tie.t @@ -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