summaryrefslogtreecommitdiff
path: root/dump.c
diff options
context:
space:
mode:
authorDavid Mitchell <davem@iabyn.com>2010-05-25 11:38:35 +0100
committerDavid Mitchell <davem@iabyn.com>2010-05-25 12:44:16 +0100
commit0824d66743a706cd268ace8fc9df03d7374c6886 (patch)
tree7900aed8090cd6e812a8b8ee3156edf8e364bb81 /dump.c
parentbb1bc619ea68d9703fbd3fe5bc65ae000f90151f (diff)
downloadperl-0824d66743a706cd268ace8fc9df03d7374c6886.tar.gz
add OPpDEREFed flag to avoid double mg_get()
The previous commit made various ops such as rv2av unconditionally do an SvGETMAGIC(). Under some circumstances this could cause a double mg_get() (and hence double FETCH etc). In particular, when the proceeding op was something like aelem with OPpDEREF, the aelem would call vivify_ref(), which would call magic. So in peep(), mark OP_RV2[SAH]V ops with the new OPpDEREFed flag if the preceding op was OPpDEREF. Then use this flag to avoid a second dose of magic. Note that RV2GV probably needs this flag too, but there weren't any spare private flag bits left for that op (I think).
Diffstat (limited to 'dump.c')
-rw-r--r--dump.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/dump.c b/dump.c
index 631f37cbb2..46af01a8db 100644
--- a/dump.c
+++ b/dump.c
@@ -928,6 +928,11 @@ Perl_do_op_dump(pTHX_ I32 level, PerlIO *file, const OP *o)
if (o->op_private & OPpMAYBE_LVSUB)
sv_catpv(tmpsv, ",MAYBE_LVSUB");
}
+
+ if ((optype==OP_RV2SV || optype==OP_RV2AV || optype==OP_RV2HV)
+ && (o->op_private & OPpDEREFed))
+ sv_catpv(tmpsv, ",DEREFed");
+
if (optype == OP_AELEM || optype == OP_HELEM) {
if (o->op_private & OPpLVAL_DEFER)
sv_catpv(tmpsv, ",LVAL_DEFER");