op.c: Don’t reallocate a temp for lvalue funcs
authorFather Chrysostomos <sprout@cpan.org>
Fri, 14 Jun 2013 07:19:30 +0000 (00:19 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Sat, 15 Jun 2013 01:10:33 +0000 (18:10 -0700)
There is no reason why keys, substr, pos and vec that can occur in
lvalue context need to reliquish ownership of the scalar in the
scratchpad used to return the value in rvalue context (the TARG) and
then have a new one allocated.

Also, the new TARG was marked PADMY, so, if the lvalue op got freed
(e.g., if it was inside if(0){...}), then its pad slot would remain
unusable by code subsequently compiled in the same sub, since pad_free
only turns off the PADTMP flag, not the PADMY flag, and it would hence
appear to pad_alloc to be still in use.  So it would waste a small
amount of memory in rare cases.  (Based on reading code, not on a
gdb session.)

op.c

index 64a6441..7519f73 100644 (file)
--- a/op.c
+++ b/op.c
@@ -2169,9 +2169,6 @@ Perl_op_lvalue_flags(pTHX_ OP *o, I32 type, U32 flags)
       lvalue_func:
        if (type == OP_LEAVESUBLV)
            o->op_private |= OPpMAYBE_LVSUB;
-       pad_free(o->op_targ);
-       o->op_targ = pad_alloc(o->op_type, SVs_PADMY);
-       assert(SvTYPE(PAD_SV(o->op_targ)) == SVt_NULL);
        if (o->op_flags & OPf_KIDS)
            op_lvalue(cBINOPo->op_first->op_sibling, type);
        break;