Make the :bytes conditional on PerlIO.
[p5sagit/p5-mst-13.2.git] / op.c
diff --git a/op.c b/op.c
index fd853ae..54de5de 100644 (file)
--- a/op.c
+++ b/op.c
@@ -1,6 +1,6 @@
 /*    op.c
  *
- *    Copyright (c) 1991-2002, Larry Wall
+ *    Copyright (c) 1991-2003, Larry Wall
  *
  *    You may distribute under the terms of either the GNU General Public
  *    License or the Artistic License, as specified in the README file.
@@ -299,6 +299,18 @@ Perl_op_clear(pTHX_ OP *o)
     case OP_CONST:
        SvREFCNT_dec(cSVOPo->op_sv);
        cSVOPo->op_sv = Nullsv;
+#ifdef USE_ITHREADS
+       /** Bug #15654
+         Even if op_clear does a pad_free for the target of the op,
+         pad_free doesn't actually remove the sv that exists in the bad
+         instead it lives on. This results in that it could be reused as 
+         a target later on when the pad was reallocated.
+       **/
+        if(o->op_targ) {
+          pad_swipe(o->op_targ,1);
+          o->op_targ = 0;
+        }
+#endif
        break;
     case OP_GOTO:
     case OP_NEXT:
@@ -1053,8 +1065,6 @@ Perl_mod(pTHX_ OP *o, I32 type)
 
     case OP_RV2AV:
     case OP_RV2HV:
-       if (!type && cUNOPo->op_first->op_type != OP_GV)
-           Perl_croak(aTHX_ "Can't localize through a reference");
        if (type == OP_REFGEN && o->op_flags & OPf_PARENS) {
            PL_modcount = RETURN_UNLIMITED_NUMBER;
            return o;           /* Treat \(@foo) like ordinary list. */
@@ -1076,8 +1086,6 @@ Perl_mod(pTHX_ OP *o, I32 type)
        PL_modcount = RETURN_UNLIMITED_NUMBER;
        break;
     case OP_RV2SV:
-       if (!type && cUNOPo->op_first->op_type != OP_GV)
-           Perl_croak(aTHX_ "Can't localize through a reference");
        ref(cUNOPo->op_first, o->op_type);
        /* FALL THROUGH */
     case OP_GV:
@@ -2634,7 +2642,7 @@ Perl_pmruntime(pTHX_ OP *o, OP *expr, OP *repl)
                    if (curop->op_type == OP_GV) {
                        GV *gv = cGVOPx_gv(curop);
                        repl_has_vars = 1;
-                       if (strchr("&`'123456789+", *GvENAME(gv)))
+                       if (strchr("&`'123456789+-\016\022", *GvENAME(gv)))
                            break;
                    }
                    else if (curop->op_type == OP_RV2CV)
@@ -4710,10 +4718,9 @@ Perl_ck_eval(pTHX_ OP *o)
            o->op_flags &= ~OPf_KIDS;
            op_null(o);
        }
-       else if (kid->op_type == OP_LINESEQ) {
+       else if (kid->op_type == OP_LINESEQ || kid->op_type == OP_STUB) {
            LOGOP *enter;
 
-           kid->op_next = o->op_next;
            cUNOPo->op_first = 0;
            op_free(o);
 
@@ -5806,7 +5813,13 @@ Perl_ck_subr(pTHX_ OP *o)
                        if (PERLDB_ASSERTION && PL_curstash != PL_debstash)
                            o->op_private |= OPpENTERSUB_DB;
                    }
-                   else delete=1;
+                   else {
+                       delete=1;
+                       if (ckWARN(WARN_ASSERTIONS) && !(PL_hints & HINT_ASSERTIONSSEEN)) {
+                           Perl_warner(aTHX_ packWARN(WARN_ASSERTIONS),
+                                       "Impossible to activate assertion call");
+                       }
+                   }
                }
            }
        }