In perl.git, the branch blead has been updated <http://perl5.git.perl.org/perl.git/commitdiff/93d7320bf7eac5942274854396d4ccc6268106c7?hp=2cf724d498600d69eef0cc9013134e35fd9eff6d>
- Log ----------------------------------------------------------------- commit 93d7320bf7eac5942274854396d4ccc6268106c7 Author: David Mitchell <[email protected]> Date: Thu Dec 16 16:14:06 2010 +0000 only call amagic_deref_call() if we have to ----------------------------------------------------------------------- Summary of changes: pp.c | 13 ++++++++----- pp_hot.c | 13 ++++++++----- sv.c | 3 ++- 3 files changed, 18 insertions(+), 11 deletions(-) diff --git a/pp.c b/pp.c index b5e93a2..112f4f5 100644 --- a/pp.c +++ b/pp.c @@ -142,9 +142,10 @@ PP(pp_rv2gv) if (!isGV(sv) || SvFAKE(sv)) SvGETMAGIC(sv); if (SvROK(sv)) { wasref: - sv = amagic_deref_call(sv, to_gv_amg); - SPAGAIN; - + if (SvAMAGIC(sv)) { + sv = amagic_deref_call(sv, to_gv_amg); + SPAGAIN; + } sv = SvRV(sv); if (SvTYPE(sv) == SVt_PVIO) { GV * const gv = MUTABLE_GV(sv_newmortal()); @@ -284,8 +285,10 @@ PP(pp_rv2sv) if (!(PL_op->op_private & OPpDEREFed)) SvGETMAGIC(sv); if (SvROK(sv)) { - sv = amagic_deref_call(sv, to_sv_amg); - SPAGAIN; + if (SvAMAGIC(sv)) { + sv = amagic_deref_call(sv, to_sv_amg); + SPAGAIN; + } sv = SvRV(sv); switch (SvTYPE(sv)) { diff --git a/pp_hot.c b/pp_hot.c index c1d0103..9bc7eae 100644 --- a/pp_hot.c +++ b/pp_hot.c @@ -827,9 +827,10 @@ PP(pp_rv2av) if (!(PL_op->op_private & OPpDEREFed)) SvGETMAGIC(sv); if (SvROK(sv)) { - sv = amagic_deref_call(sv, is_pp_rv2av ? to_av_amg : to_hv_amg); - SPAGAIN; - + if (SvAMAGIC(sv)) { + sv = amagic_deref_call(sv, is_pp_rv2av ? to_av_amg : to_hv_amg); + SPAGAIN; + } sv = SvRV(sv); if (SvTYPE(sv) != type) DIE(aTHX_ "Not %s reference", is_pp_rv2av ? an_array : a_hash); @@ -2794,8 +2795,10 @@ PP(pp_entersub) } SvGETMAGIC(sv); if (SvROK(sv)) { - sv = amagic_deref_call(sv, to_cv_amg); - /* Don't SPAGAIN here. */ + if (SvAMAGIC(sv)) { + sv = amagic_deref_call(sv, to_cv_amg); + /* Don't SPAGAIN here. */ + } } else { const char *sym; diff --git a/sv.c b/sv.c index 2cabf7b..4371375 100644 --- a/sv.c +++ b/sv.c @@ -8812,7 +8812,8 @@ Perl_sv_2cv(pTHX_ SV *sv, HV **const st, GV **const gvp, const I32 lref) default: if (SvROK(sv)) { SvGETMAGIC(sv); - sv = amagic_deref_call(sv, to_cv_amg); + if (SvAMAGIC(sv)) + sv = amagic_deref_call(sv, to_cv_amg); /* At this point I'd like to do SPAGAIN, but really I need to force it upon my callers. Hmmm. This is a mess... */ -- Perl5 Master Repository
