Perl 5.8.3 patches from the BS2000 port - part 2
[p5sagit/p5-mst-13.2.git] / op.c
diff --git a/op.c b/op.c
index 5823974..806c07f 100644 (file)
--- a/op.c
+++ b/op.c
@@ -1823,6 +1823,7 @@ Perl_newPROG(pTHX_ OP *o)
        if (o->op_type == OP_STUB) {
            PL_comppad_name = 0;
            PL_compcv = 0;
+           FreeOp(o);
            return;
        }
        PL_main_root = scope(sawparens(scalarvoid(o)));
@@ -4714,7 +4715,8 @@ OP *
 Perl_ck_concat(pTHX_ OP *o)
 {
     OP *kid = cUNOPo->op_first;
-    if (kid->op_type == OP_CONCAT && !(kUNOP->op_first->op_flags & OPf_MOD))
+    if (kid->op_type == OP_CONCAT && !(kid->op_private & OPpTARGET_MY) &&
+           !(kUNOP->op_first->op_flags & OPf_MOD))
         o->op_flags |= OPf_STACKED;
     return o;
 }
@@ -5235,8 +5237,7 @@ Perl_ck_fun(pTHX_ OP *o)
                                           
                                      }
                                      if (tmpstr) {
-                                          name = savepv(SvPVX(tmpstr));
-                                          len = strlen(name);
+                                          name = SvPV(tmpstr, len);
                                           sv_2mortal(tmpstr);
                                      }
                                 }
@@ -6264,6 +6265,23 @@ Perl_peep(pTHX_ register OP *o)
            o->op_seq = PL_op_seqmax++;
            break;
 
+       case OP_CONCAT:
+           if (o->op_next && o->op_next->op_type == OP_STRINGIFY) {
+               if (o->op_next->op_private & OPpTARGET_MY) {
+                   if (o->op_flags & OPf_STACKED) /* chained concats */
+                       goto ignore_optimization;
+                   else {
+                       /* assert(PL_opargs[o->op_type] & OA_TARGLEX); */
+                       o->op_targ = o->op_next->op_targ;
+                       o->op_next->op_targ = 0;
+                       o->op_private |= OPpTARGET_MY;
+                   }
+               }
+               op_null(o->op_next);
+           }
+         ignore_optimization:
+           o->op_seq = PL_op_seqmax++;
+           break;
        case OP_STUB:
            if ((o->op_flags & OPf_WANT) != OPf_WANT_LIST) {
                o->op_seq = PL_op_seqmax++;