From: Chip Salzenberg Date: Wed, 12 Nov 2008 15:45:04 +0000 (-0800) Subject: Re: [perl #60360] [PATCH] UPDATED: local $SIG{FOO} = sub {...}; sets signal handler... X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=af7df2578e5aff079dd90eeab57a2a48fb1a43c0;p=p5sagit%2Fp5-mst-13.2.git Re: [perl #60360] [PATCH] UPDATED: local $SIG{FOO} = sub {...}; sets signal handler to SIG_DFL Message-ID: <20081112234504.GI2062@tytlal.topaz.cx> Updated patch to retain source compatibility. Plus using the correct PERL_ARGS_ASSERT_SAVE_HELEM_FLAGS macro and running make regen. p4raw-id: //depot/perl@34829 --- diff --git a/embed.fnc b/embed.fnc index 67fd70f..7d0f681 100644 --- a/embed.fnc +++ b/embed.fnc @@ -518,7 +518,7 @@ Apd |void |sortsv_flags |NULLOK SV** array|size_t num_elts|NN SVCOMPARE_t cmp|U3 Apd |int |mg_clear |NN SV* sv Apd |int |mg_copy |NN SV *sv|NN SV *nsv|NULLOK const char *key \ |I32 klen -pd |void |mg_localize |NN SV* sv|NN SV* nsv|I32 empty +pd |void |mg_localize |NN SV* sv|NN SV* nsv|bool setmagic ApdR |MAGIC* |mg_find |NULLOK const SV* sv|int type Apd |int |mg_free |NN SV* sv Apd |int |mg_get |NN SV* sv @@ -790,7 +790,8 @@ Ap |void |save_generic_pvref|NN char** str Ap |void |save_shared_pvref|NN char** str Ap |void |save_gp |NN GV* gv|I32 empty Ap |HV* |save_hash |NN GV* gv -Ap |void |save_helem |NN HV *hv|NN SV *key|NN SV **sptr|I32 empty +Amp |void |save_helem |NN HV *hv|NN SV *key|NN SV **sptr +Ap |void |save_helem_flags|NN HV *hv|NN SV *key|NN SV **sptr|const U32 flags Ap |void |save_hptr |NN HV** hptr Ap |void |save_I16 |NN I16* intp Ap |void |save_I32 |NN I32* intp @@ -1550,7 +1551,7 @@ s |SV* |pm_description |NN const PMOP *pm #endif #if defined(PERL_IN_SCOPE_C) || defined(PERL_DECL_PROT) -s |SV* |save_scalar_at |NN SV **sptr|I32 empty +s |SV* |save_scalar_at |NN SV **sptr|const U32 flags #endif #if defined(PERL_IN_GV_C) || defined(PERL_IN_SV_C) || defined(PERL_IN_PAD_C) || defined(PERL_DECL_PROT) diff --git a/embed.h b/embed.h index b7b3dbd..d246290 100644 --- a/embed.h +++ b/embed.h @@ -770,7 +770,7 @@ #define save_shared_pvref Perl_save_shared_pvref #define save_gp Perl_save_gp #define save_hash Perl_save_hash -#define save_helem Perl_save_helem +#define save_helem_flags Perl_save_helem_flags #define save_hptr Perl_save_hptr #define save_I16 Perl_save_I16 #define save_I32 Perl_save_I32 @@ -3086,7 +3086,7 @@ #define save_shared_pvref(a) Perl_save_shared_pvref(aTHX_ a) #define save_gp(a,b) Perl_save_gp(aTHX_ a,b) #define save_hash(a) Perl_save_hash(aTHX_ a) -#define save_helem(a,b,c,d) Perl_save_helem(aTHX_ a,b,c,d) +#define save_helem_flags(a,b,c,d) Perl_save_helem_flags(aTHX_ a,b,c,d) #define save_hptr(a) Perl_save_hptr(aTHX_ a) #define save_I16(a) Perl_save_I16(aTHX_ a) #define save_I32(a) Perl_save_I32(aTHX_ a) diff --git a/global.sym b/global.sym index 5e18194..90f9102 100644 --- a/global.sym +++ b/global.sym @@ -450,7 +450,7 @@ Perl_save_generic_pvref Perl_save_shared_pvref Perl_save_gp Perl_save_hash -Perl_save_helem +Perl_save_helem_flags Perl_save_hptr Perl_save_I16 Perl_save_I32 diff --git a/mg.c b/mg.c index 22f8c99..a9cffbf 100644 --- a/mg.c +++ b/mg.c @@ -467,7 +467,7 @@ Copy some of the magic from an existing SV to new localized version of that SV. Container magic (eg %ENV, $1, tie) gets copied, value magic doesn't (eg taint, pos). -If empty is false then no set magic will be called on the new (empty) SV. +If setmagic is false then no set magic will be called on the new (empty) SV. This typically means that assignment will soon follow (e.g. 'local $x = $y'), and that will handle the magic. @@ -475,7 +475,7 @@ and that will handle the magic. */ void -Perl_mg_localize(pTHX_ SV *sv, SV *nsv, I32 empty) +Perl_mg_localize(pTHX_ SV *sv, SV *nsv, bool setmagic) { dVAR; MAGIC *mg; @@ -499,7 +499,7 @@ Perl_mg_localize(pTHX_ SV *sv, SV *nsv, I32 empty) if (SvTYPE(nsv) >= SVt_PVMG && SvMAGIC(nsv)) { SvFLAGS(nsv) |= SvMAGICAL(sv); - if (empty) { + if (setmagic) { PL_localizing = 1; SvSETMAGIC(nsv); PL_localizing = 0; diff --git a/pod/perlintern.pod b/pod/perlintern.pod index cae0cd4..f0d8e12 100644 --- a/pod/perlintern.pod +++ b/pod/perlintern.pod @@ -464,11 +464,11 @@ Copy some of the magic from an existing SV to new localized version of that SV. Container magic (eg %ENV, $1, tie) gets copied, value magic doesn't (eg taint, pos). -If empty is false then no set magic will be called on the new (empty) SV. +If setmagic is false then no set magic will be called on the new (empty) SV. This typically means that assignment will soon follow (e.g. 'local $x = $y'), and that will handle the magic. - void mg_localize(SV* sv, SV* nsv, I32 empty) + void mg_localize(SV* sv, SV* nsv, bool setmagic) =for hackers Found in file mg.c diff --git a/pp.c b/pp.c index 304e42d..739a457 100644 --- a/pp.c +++ b/pp.c @@ -4185,7 +4185,8 @@ PP(pp_hslice) save_gp(MUTABLE_GV(*svp), !(PL_op->op_flags & OPf_SPECIAL)); else { if (preeminent) - save_helem(hv, keysv, svp, !(PL_op->op_flags & OPf_SPECIAL)); + save_helem_flags(hv, keysv, svp, + (PL_op->op_flags & OPf_SPECIAL) ? 0 : SAVEf_SETMAGIC); else { STRLEN keylen; const char * const key = SvPV_const(keysv, keylen); diff --git a/pp_hot.c b/pp_hot.c index 4624fbb..e22502f 100644 --- a/pp_hot.c +++ b/pp_hot.c @@ -1828,7 +1828,8 @@ PP(pp_helem) SAVEDELETE(hv, savepvn(key,keylen), SvUTF8(keysv) ? -(I32)keylen : (I32)keylen); } else - save_helem(hv, keysv, svp, !(PL_op->op_flags & OPf_SPECIAL)); + save_helem_flags(hv, keysv, svp, + (PL_op->op_flags & OPf_SPECIAL) ? 0 : SAVEf_SETMAGIC); } } else if (PL_op->op_private & OPpDEREF) diff --git a/proto.h b/proto.h index f1f8dce..c8e7f6f 100644 --- a/proto.h +++ b/proto.h @@ -1848,7 +1848,7 @@ PERL_CALLCONV int Perl_mg_copy(pTHX_ SV *sv, SV *nsv, const char *key, I32 klen) #define PERL_ARGS_ASSERT_MG_COPY \ assert(sv); assert(nsv) -PERL_CALLCONV void Perl_mg_localize(pTHX_ SV* sv, SV* nsv, I32 empty) +PERL_CALLCONV void Perl_mg_localize(pTHX_ SV* sv, SV* nsv, bool setmagic) __attribute__nonnull__(pTHX_1) __attribute__nonnull__(pTHX_2); #define PERL_ARGS_ASSERT_MG_LOCALIZE \ @@ -2830,13 +2830,20 @@ PERL_CALLCONV HV* Perl_save_hash(pTHX_ GV* gv) #define PERL_ARGS_ASSERT_SAVE_HASH \ assert(gv) -PERL_CALLCONV void Perl_save_helem(pTHX_ HV *hv, SV *key, SV **sptr, I32 empty) +/* PERL_CALLCONV void Perl_save_helem(pTHX_ HV *hv, SV *key, SV **sptr) __attribute__nonnull__(pTHX_1) __attribute__nonnull__(pTHX_2) - __attribute__nonnull__(pTHX_3); + __attribute__nonnull__(pTHX_3); */ #define PERL_ARGS_ASSERT_SAVE_HELEM \ assert(hv); assert(key); assert(sptr) +PERL_CALLCONV void Perl_save_helem_flags(pTHX_ HV *hv, SV *key, SV **sptr, const U32 flags) + __attribute__nonnull__(pTHX_1) + __attribute__nonnull__(pTHX_2) + __attribute__nonnull__(pTHX_3); +#define PERL_ARGS_ASSERT_SAVE_HELEM_FLAGS \ + assert(hv); assert(key); assert(sptr) + PERL_CALLCONV void Perl_save_hptr(pTHX_ HV** hptr) __attribute__nonnull__(pTHX_1); #define PERL_ARGS_ASSERT_SAVE_HPTR \ @@ -5498,7 +5505,7 @@ STATIC SV* S_pm_description(pTHX_ const PMOP *pm) #endif #if defined(PERL_IN_SCOPE_C) || defined(PERL_DECL_PROT) -STATIC SV* S_save_scalar_at(pTHX_ SV **sptr, I32 empty) +STATIC SV* S_save_scalar_at(pTHX_ SV **sptr, const U32 flags) __attribute__nonnull__(pTHX_1); #define PERL_ARGS_ASSERT_SAVE_SCALAR_AT \ assert(sptr) diff --git a/scope.c b/scope.c index 83e8a7b..24c5111 100644 --- a/scope.c +++ b/scope.c @@ -164,7 +164,7 @@ Perl_free_tmps(pTHX) } STATIC SV * -S_save_scalar_at(pTHX_ SV **sptr, I32 empty) +S_save_scalar_at(pTHX_ SV **sptr, const U32 flags) { dVAR; SV * const osv = *sptr; @@ -179,7 +179,7 @@ S_save_scalar_at(pTHX_ SV **sptr, I32 empty) (SVp_IOK|SVp_NOK|SVp_POK)) >> PRIVSHIFT; PL_tainted = oldtainted; } - mg_localize(osv, sv, empty); + mg_localize(osv, sv, (flags & SAVEf_SETMAGIC) != 0); } return sv; } @@ -199,7 +199,7 @@ Perl_save_scalar(pTHX_ GV *gv) SSPUSHPTR(SvREFCNT_inc_simple(gv)); SSPUSHPTR(SvREFCNT_inc(*sptr)); SSPUSHINT(SAVEt_SV); - return save_scalar_at(sptr, TRUE); /* XXX - FIXME - see #60360 */ + return save_scalar_at(sptr, SAVEf_SETMAGIC); /* XXX - FIXME - see #60360 */ } /* Like save_sptr(), but also SvREFCNT_dec()s the new value. Can be used to @@ -611,7 +611,7 @@ Perl_save_aelem(pTHX_ AV *av, I32 idx, SV **sptr) /* if it gets reified later, the restore will have the wrong refcnt */ if (!AvREAL(av) && AvREIFY(av)) SvREFCNT_inc_void(*sptr); - save_scalar_at(sptr, TRUE); /* XXX - FIXME - see #60360 */ + save_scalar_at(sptr, SAVEf_SETMAGIC); /* XXX - FIXME - see #60360 */ sv = *sptr; /* If we're localizing a tied array element, this new sv * won't actually be stored in the array - so it won't get @@ -622,12 +622,12 @@ Perl_save_aelem(pTHX_ AV *av, I32 idx, SV **sptr) } void -Perl_save_helem(pTHX_ HV *hv, SV *key, SV **sptr, I32 empty) +Perl_save_helem_flags(pTHX_ HV *hv, SV *key, SV **sptr, const U32 flags) { dVAR; SV *sv; - PERL_ARGS_ASSERT_SAVE_HELEM; + PERL_ARGS_ASSERT_SAVE_HELEM_FLAGS; SvGETMAGIC(*sptr); SSCHECK(4); @@ -635,7 +635,7 @@ Perl_save_helem(pTHX_ HV *hv, SV *key, SV **sptr, I32 empty) SSPUSHPTR(newSVsv(key)); SSPUSHPTR(SvREFCNT_inc(*sptr)); SSPUSHINT(SAVEt_HELEM); - save_scalar_at(sptr, empty); + save_scalar_at(sptr, flags); sv = *sptr; /* If we're localizing a tied hash element, this new sv * won't actually be stored in the hash - so it won't get @@ -657,7 +657,7 @@ Perl_save_svref(pTHX_ SV **sptr) SSPUSHPTR(sptr); SSPUSHPTR(SvREFCNT_inc(*sptr)); SSPUSHINT(SAVEt_SVREF); - return save_scalar_at(sptr, TRUE); /* XXX - FIXME - see #60360 */ + return save_scalar_at(sptr, SAVEf_SETMAGIC); /* XXX - FIXME - see #60360 */ } void diff --git a/scope.h b/scope.h index 25ccbf6..c1fa4f9 100644 --- a/scope.h +++ b/scope.h @@ -55,6 +55,10 @@ #define SAVEt_STACK_CXPOS 44 #define SAVEt_PARSER 45 +#define SAVEf_SETMAGIC 1 + +#define save_helem(hv,key,sptr) save_helem_flags(hv,key,sptr,SAVEf_SETMAGIC) + #ifndef SCOPE_SAVES_SIGNAL_MASK #define SCOPE_SAVES_SIGNAL_MASK 0 #endif