Change 33778 by rgs@scipion on 2008/05/02 11:44:25
Subject: Re: [perl #51636] segmentation fault with array ties
From: "Vincent Pit" <perl@profvince.com>
Date: Wed, 12 Mar 2008 17:37:40 +0100 (CET)
Message-ID: <56287.147.210.17.175.1205339860.squirrel@147.210.17.175>
Affected files ...
... //depot/perl/pp_hot.c#576 edit
Differences ...
==== //depot/perl/pp_hot.c#576 (text) ====
Index: perl/pp_hot.c
--- perl/pp_hot.c#575~33702~ 2008-04-17 00:58:29.000000000 -0700
+++ perl/pp_hot.c 2008-05-02 04:44:25.000000000 -0700
@@ -1020,8 +1020,14 @@
*(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 @@
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 @@
}
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;
}
}
End of Patch.