Create perl571delta and seed it off with the perldelta changes
[p5sagit/p5-mst-13.2.git] / pp_ctl.c
index 46e7ef0..3cda644 100644 (file)
--- a/pp_ctl.c
+++ b/pp_ctl.c
@@ -551,7 +551,13 @@ PP(pp_formline)
            if (item_is_utf) {
                while (arg--) {
                    if (UTF8_IS_CONTINUED(*s)) {
-                       switch (UTF8SKIP(s)) {
+                       STRLEN skip = UTF8SKIP(s);
+                       switch (skip) {
+                       default:
+                           Move(s,t,skip,char);
+                           s += skip;
+                           t += skip;
+                           break;
                        case 7: *t++ = *s++;
                        case 6: *t++ = *s++;
                        case 5: *t++ = *s++;
@@ -2223,7 +2229,7 @@ PP(pp_goto)
            if (cxix < cxstack_ix)
                dounwind(cxix);
            TOPBLOCK(cx);
-           if (CxTYPE(cx) == CXt_EVAL && cx->blk_eval.old_op_type == OP_ENTEREVAL)
+           if (CxREALEVAL(cx))
                DIE(aTHX_ "Can't goto subroutine from an eval-string");
            mark = PL_stack_sp;
            if (CxTYPE(cx) == CXt_SUB && cx->blk_sub.hasargs) {
@@ -2454,6 +2460,8 @@ PP(pp_goto)
 
     if (label && *label) {
        OP *gotoprobe = 0;
+       bool leaving_eval = FALSE;
+        PERL_CONTEXT *last_eval_cx = 0;
 
        /* find label */
 
@@ -2463,8 +2471,12 @@ PP(pp_goto)
            cx = &cxstack[ix];
            switch (CxTYPE(cx)) {
            case CXt_EVAL:
+               leaving_eval = TRUE;
                 if (CxREALEVAL(cx)) {
-                   gotoprobe = PL_eval_root; /* XXX not good for nested eval */
+                   gotoprobe = (last_eval_cx ?
+                               last_eval_cx->blk_eval.old_eval_root :
+                               PL_eval_root);
+                   last_eval_cx = cx;
                    break;
                 }
                 /* else fall through */
@@ -2505,6 +2517,17 @@ PP(pp_goto)
        if (!retop)
            DIE(aTHX_ "Can't find label %s", label);
 
+       /* if we're leaving an eval, check before we pop any frames
+           that we're not going to punt, otherwise the error
+          won't be caught */
+
+       if (leaving_eval && *enterops && enterops[1]) {
+           I32 i;
+            for (i = 1; enterops[i]; i++)
+                if (enterops[i]->op_type == OP_ENTERITER)
+                    DIE(aTHX_ "Can't \"goto\" into the middle of a foreach loop");
+       }
+
        /* pop unwanted frames */
 
        if (ix < cxstack_ix) {
@@ -2843,7 +2866,7 @@ S_doeval(pTHX_ int gimme, OP** startop)
        CvOUTSIDE(PL_compcv) = (CV*)SvREFCNT_inc(caller);
     }
 
-    SAVEFREESV(PL_compcv);
+    SAVEMORTALIZESV(PL_compcv);        /* must remain until end of current statement */
 
     /* make sure we compile in the right package */
 
@@ -2999,7 +3022,7 @@ PP(pp_require)
     char *tryname;
     SV *namesv = Nullsv;
     SV** svp;
-    I32 gimme = G_SCALAR;
+    I32 gimme = GIMME_V;
     PerlIO *tryrsfp = 0;
     STRLEN n_a;
     int filter_has_file = 0;
@@ -3337,7 +3360,7 @@ trylocal: {
     PL_eval_owner = thr;
     MUTEX_UNLOCK(&PL_eval_mutex);
 #endif /* USE_THREADS */
-    return DOCATCH(doeval(G_SCALAR, NULL));
+    return DOCATCH(doeval(gimme, NULL));
 }
 
 PP(pp_dofile)