From: Vincent Pit Date: Wed, 12 Mar 2008 17:37:40 +0000 (+0100) Subject: Re: [perl #51636] segmentation fault with array ties X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=90630e3c741716305d7f1da4df5eab5c1bee42cc;p=p5sagit%2Fp5-mst-13.2.git Re: [perl #51636] segmentation fault with array ties From: "Vincent Pit" Message-ID: <56287.147.210.17.175.1205339860.squirrel@147.210.17.175> p4raw-id: //depot/perl@33778 --- diff --git a/pp_hot.c b/pp_hot.c index efd3bc4..64b5fc5 100644 --- a/pp_hot.c +++ b/pp_hot.c @@ -1020,8 +1020,14 @@ PP(pp_aassign) *(relem++) = sv; didstore = av_store(ary,i++,sv); if (magic) { - if (SvSMAGICAL(sv)) + if (SvSMAGICAL(sv)) { + /* More magic can happen in the mg_set callback, so we + * backup the delaymagic for now. */ + U16 dmbak = PL_delaymagic; + PL_delaymagic = 0; mg_set(sv); + PL_delaymagic = dmbak; + } if (!didstore) sv_2mortal(sv); } @@ -1051,8 +1057,12 @@ PP(pp_aassign) duplicates += 2; didstore = hv_store_ent(hash,sv,tmpstr,0); if (magic) { - if (SvSMAGICAL(tmpstr)) + if (SvSMAGICAL(tmpstr)) { + U16 dmbak = PL_delaymagic; + PL_delaymagic = 0; mg_set(tmpstr); + PL_delaymagic = dmbak; + } if (!didstore) sv_2mortal(tmpstr); } @@ -1076,7 +1086,13 @@ PP(pp_aassign) } else sv_setsv(sv, &PL_sv_undef); - SvSETMAGIC(sv); + + if (SvSMAGICAL(sv)) { + U16 dmbak = PL_delaymagic; + PL_delaymagic = 0; + mg_set(sv); + PL_delaymagic = dmbak; + } break; } }