This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
861e8a5a1592f39d5e86b134c3974439c22c879d
[perl5.git] / pp_ctl.c
1 /*    pp_ctl.c
2  *
3  *    Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
4  *    2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 by Larry Wall and others
5  *
6  *    You may distribute under the terms of either the GNU General Public
7  *    License or the Artistic License, as specified in the README file.
8  *
9  */
10
11 /*
12  * Now far ahead the Road has gone,
13  * And I must follow, if I can,
14  * Pursuing it with eager feet,
15  * Until it joins some larger way
16  * Where many paths and errands meet.
17  * And whither then?  I cannot say.
18  */
19
20 /* This file contains control-oriented pp ("push/pop") functions that
21  * execute the opcodes that make up a perl program. A typical pp function
22  * expects to find its arguments on the stack, and usually pushes its
23  * results onto the stack, hence the 'pp' terminology. Each OP structure
24  * contains a pointer to the relevant pp_foo() function.
25  *
26  * Control-oriented means things like pp_enteriter() and pp_next(), which
27  * alter the flow of control of the program.
28  */
29
30
31 #include "EXTERN.h"
32 #define PERL_IN_PP_CTL_C
33 #include "perl.h"
34
35 #ifndef WORD_ALIGN
36 #define WORD_ALIGN sizeof(U32)
37 #endif
38
39 #define DOCATCH(o) ((CATCH_GET == TRUE) ? docatch(o) : (o))
40
41 PP(pp_wantarray)
42 {
43     dVAR;
44     dSP;
45     I32 cxix;
46     EXTEND(SP, 1);
47
48     cxix = dopoptosub(cxstack_ix);
49     if (cxix < 0)
50         RETPUSHUNDEF;
51
52     switch (cxstack[cxix].blk_gimme) {
53     case G_ARRAY:
54         RETPUSHYES;
55     case G_SCALAR:
56         RETPUSHNO;
57     default:
58         RETPUSHUNDEF;
59     }
60 }
61
62 PP(pp_regcreset)
63 {
64     dVAR;
65     /* XXXX Should store the old value to allow for tie/overload - and
66        restore in regcomp, where marked with XXXX. */
67     PL_reginterp_cnt = 0;
68     TAINT_NOT;
69     return NORMAL;
70 }
71
72 PP(pp_regcomp)
73 {
74     dVAR;
75     dSP;
76     register PMOP *pm = (PMOP*)cLOGOP->op_other;
77     SV *tmpstr;
78     MAGIC *mg = NULL;
79     regexp * re;
80
81     /* prevent recompiling under /o and ithreads. */
82 #if defined(USE_ITHREADS)
83     if (pm->op_pmflags & PMf_KEEP && PM_GETRE(pm)) {
84         if (PL_op->op_flags & OPf_STACKED) {
85             dMARK;
86             SP = MARK;
87         }
88         else
89             (void)POPs;
90         RETURN;
91     }
92 #endif
93     if (PL_op->op_flags & OPf_STACKED) {
94         /* multiple args; concatentate them */
95         dMARK; dORIGMARK;
96         tmpstr = PAD_SV(ARGTARG);
97         sv_setpvn(tmpstr, "", 0);
98         while (++MARK <= SP) {
99             if (PL_amagic_generation) {
100                 SV *sv;
101                 if ((SvAMAGIC(tmpstr) || SvAMAGIC(*MARK)) &&
102                     (sv = amagic_call(tmpstr, *MARK, concat_amg, AMGf_assign)))
103                 {
104                    sv_setsv(tmpstr, sv);
105                    continue;
106                 }
107             }
108             sv_catsv(tmpstr, *MARK);
109         }
110         SvSETMAGIC(tmpstr);
111         SP = ORIGMARK;
112     }
113     else
114         tmpstr = POPs;
115
116     if (SvROK(tmpstr)) {
117         SV * const sv = SvRV(tmpstr);
118         if(SvMAGICAL(sv))
119             mg = mg_find(sv, PERL_MAGIC_qr);
120     }
121     if (mg) {
122         regexp * const re = reg_temp_copy((regexp *)mg->mg_obj);
123         ReREFCNT_dec(PM_GETRE(pm));
124         PM_SETRE(pm, re);
125     }
126     else {
127         STRLEN len;
128         const char *t = SvPV_const(tmpstr, len);
129         re = PM_GETRE(pm);
130
131         /* Check against the last compiled regexp. */
132         if (!re || !re->precomp || re->prelen != (I32)len ||
133             memNE(re->precomp, t, len))
134         {
135             const regexp_engine *eng = re ? re->engine : NULL;
136             U32 pm_flags = pm->op_pmflags & PMf_COMPILETIME;
137             if (re) {
138                 ReREFCNT_dec(re);
139                 PM_SETRE(pm, NULL);     /* crucial if regcomp aborts */
140             } else if (PL_curcop->cop_hints_hash) {
141                 SV *ptr = Perl_refcounted_he_fetch(aTHX_ PL_curcop->cop_hints_hash, 0,
142                                        "regcomp", 7, 0, 0);
143                 if (ptr && SvIOK(ptr) && SvIV(ptr))
144                     eng = INT2PTR(regexp_engine*,SvIV(ptr));
145             }
146
147             if (PL_op->op_flags & OPf_SPECIAL)
148                 PL_reginterp_cnt = I32_MAX; /* Mark as safe.  */
149
150             if (DO_UTF8(tmpstr))
151                 pm_flags |= RXf_UTF8;
152
153             if (eng) 
154                 PM_SETRE(pm, CALLREGCOMP_ENG(eng,(char *)t, (char *)t + len, pm_flags));
155             else
156                 PM_SETRE(pm, CALLREGCOMP((char *)t, (char *)t + len, pm_flags));
157
158             PL_reginterp_cnt = 0;       /* XXXX Be extra paranoid - needed
159                                            inside tie/overload accessors.  */
160         }
161     }
162     
163     re = PM_GETRE(pm);
164
165 #ifndef INCOMPLETE_TAINTS
166     if (PL_tainting) {
167         if (PL_tainted)
168             re->extflags |= RXf_TAINTED;
169         else
170             re->extflags &= ~RXf_TAINTED;
171     }
172 #endif
173
174     if (!PM_GETRE(pm)->prelen && PL_curpm)
175         pm = PL_curpm;
176
177
178 #if !defined(USE_ITHREADS)
179     /* can't change the optree at runtime either */
180     /* PMf_KEEP is handled differently under threads to avoid these problems */
181     if (pm->op_pmflags & PMf_KEEP) {
182         pm->op_private &= ~OPpRUNTIME;  /* no point compiling again */
183         cLOGOP->op_first->op_next = PL_op->op_next;
184     }
185 #endif
186     RETURN;
187 }
188
189 PP(pp_substcont)
190 {
191     dVAR;
192     dSP;
193     register PERL_CONTEXT *cx = &cxstack[cxstack_ix];
194     register PMOP * const pm = (PMOP*) cLOGOP->op_other;
195     register SV * const dstr = cx->sb_dstr;
196     register char *s = cx->sb_s;
197     register char *m = cx->sb_m;
198     char *orig = cx->sb_orig;
199     register REGEXP * const rx = cx->sb_rx;
200     SV *nsv = NULL;
201     REGEXP *old = PM_GETRE(pm);
202     if(old != rx) {
203         if(old)
204             ReREFCNT_dec(old);
205         PM_SETRE(pm,ReREFCNT_inc(rx));
206     }
207
208     rxres_restore(&cx->sb_rxres, rx);
209     RX_MATCH_UTF8_set(rx, DO_UTF8(cx->sb_targ));
210
211     if (cx->sb_iters++) {
212         const I32 saviters = cx->sb_iters;
213         if (cx->sb_iters > cx->sb_maxiters)
214             DIE(aTHX_ "Substitution loop");
215
216         if (!(cx->sb_rxtainted & 2) && SvTAINTED(TOPs))
217             cx->sb_rxtainted |= 2;
218         sv_catsv(dstr, POPs);
219         FREETMPS; /* Prevent excess tmp stack */
220
221         /* Are we done */
222         if (cx->sb_once || !CALLREGEXEC(rx, s, cx->sb_strend, orig,
223                                      s == m, cx->sb_targ, NULL,
224                                      ((cx->sb_rflags & REXEC_COPY_STR)
225                                       ? (REXEC_IGNOREPOS|REXEC_NOT_FIRST)
226                                       : (REXEC_COPY_STR|REXEC_IGNOREPOS|REXEC_NOT_FIRST))))
227         {
228             SV * const targ = cx->sb_targ;
229
230             assert(cx->sb_strend >= s);
231             if(cx->sb_strend > s) {
232                  if (DO_UTF8(dstr) && !SvUTF8(targ))
233                       sv_catpvn_utf8_upgrade(dstr, s, cx->sb_strend - s, nsv);
234                  else
235                       sv_catpvn(dstr, s, cx->sb_strend - s);
236             }
237             cx->sb_rxtainted |= RX_MATCH_TAINTED(rx);
238
239 #ifdef PERL_OLD_COPY_ON_WRITE
240             if (SvIsCOW(targ)) {
241                 sv_force_normal_flags(targ, SV_COW_DROP_PV);
242             } else
243 #endif
244             {
245                 SvPV_free(targ);
246             }
247             SvPV_set(targ, SvPVX(dstr));
248             SvCUR_set(targ, SvCUR(dstr));
249             SvLEN_set(targ, SvLEN(dstr));
250             if (DO_UTF8(dstr))
251                 SvUTF8_on(targ);
252             SvPV_set(dstr, NULL);
253
254             TAINT_IF(cx->sb_rxtainted & 1);
255             PUSHs(sv_2mortal(newSViv(saviters - 1)));
256
257             (void)SvPOK_only_UTF8(targ);
258             TAINT_IF(cx->sb_rxtainted);
259             SvSETMAGIC(targ);
260             SvTAINT(targ);
261
262             LEAVE_SCOPE(cx->sb_oldsave);
263             POPSUBST(cx);
264             RETURNOP(pm->op_next);
265         }
266         cx->sb_iters = saviters;
267     }
268     if (RX_MATCH_COPIED(rx) && rx->subbeg != orig) {
269         m = s;
270         s = orig;
271         cx->sb_orig = orig = rx->subbeg;
272         s = orig + (m - s);
273         cx->sb_strend = s + (cx->sb_strend - m);
274     }
275     cx->sb_m = m = rx->offs[0].start + orig;
276     if (m > s) {
277         if (DO_UTF8(dstr) && !SvUTF8(cx->sb_targ))
278             sv_catpvn_utf8_upgrade(dstr, s, m - s, nsv);
279         else
280             sv_catpvn(dstr, s, m-s);
281     }
282     cx->sb_s = rx->offs[0].end + orig;
283     { /* Update the pos() information. */
284         SV * const sv = cx->sb_targ;
285         MAGIC *mg;
286         I32 i;
287         SvUPGRADE(sv, SVt_PVMG);
288         if (!(mg = mg_find(sv, PERL_MAGIC_regex_global))) {
289 #ifdef PERL_OLD_COPY_ON_WRITE
290             if (SvIsCOW(sv))
291                 sv_force_normal_flags(sv, 0);
292 #endif
293             mg = sv_magicext(sv, NULL, PERL_MAGIC_regex_global, &PL_vtbl_mglob,
294                              NULL, 0);
295         }
296         i = m - orig;
297         if (DO_UTF8(sv))
298             sv_pos_b2u(sv, &i);
299         mg->mg_len = i;
300     }
301     if (old != rx)
302         (void)ReREFCNT_inc(rx);
303     cx->sb_rxtainted |= RX_MATCH_TAINTED(rx);
304     rxres_save(&cx->sb_rxres, rx);
305     RETURNOP(pm->op_pmstashstartu.op_pmreplstart);
306 }
307
308 void
309 Perl_rxres_save(pTHX_ void **rsp, REGEXP *rx)
310 {
311     UV *p = (UV*)*rsp;
312     U32 i;
313     PERL_UNUSED_CONTEXT;
314
315     if (!p || p[1] < rx->nparens) {
316 #ifdef PERL_OLD_COPY_ON_WRITE
317         i = 7 + rx->nparens * 2;
318 #else
319         i = 6 + rx->nparens * 2;
320 #endif
321         if (!p)
322             Newx(p, i, UV);
323         else
324             Renew(p, i, UV);
325         *rsp = (void*)p;
326     }
327
328     *p++ = PTR2UV(RX_MATCH_COPIED(rx) ? rx->subbeg : NULL);
329     RX_MATCH_COPIED_off(rx);
330
331 #ifdef PERL_OLD_COPY_ON_WRITE
332     *p++ = PTR2UV(rx->saved_copy);
333     rx->saved_copy = NULL;
334 #endif
335
336     *p++ = rx->nparens;
337
338     *p++ = PTR2UV(rx->subbeg);
339     *p++ = (UV)rx->sublen;
340     for (i = 0; i <= rx->nparens; ++i) {
341         *p++ = (UV)rx->offs[i].start;
342         *p++ = (UV)rx->offs[i].end;
343     }
344 }
345
346 void
347 Perl_rxres_restore(pTHX_ void **rsp, REGEXP *rx)
348 {
349     UV *p = (UV*)*rsp;
350     U32 i;
351     PERL_UNUSED_CONTEXT;
352
353     RX_MATCH_COPY_FREE(rx);
354     RX_MATCH_COPIED_set(rx, *p);
355     *p++ = 0;
356
357 #ifdef PERL_OLD_COPY_ON_WRITE
358     if (rx->saved_copy)
359         SvREFCNT_dec (rx->saved_copy);
360     rx->saved_copy = INT2PTR(SV*,*p);
361     *p++ = 0;
362 #endif
363
364     rx->nparens = *p++;
365
366     rx->subbeg = INT2PTR(char*,*p++);
367     rx->sublen = (I32)(*p++);
368     for (i = 0; i <= rx->nparens; ++i) {
369         rx->offs[i].start = (I32)(*p++);
370         rx->offs[i].end = (I32)(*p++);
371     }
372 }
373
374 void
375 Perl_rxres_free(pTHX_ void **rsp)
376 {
377     UV * const p = (UV*)*rsp;
378     PERL_UNUSED_CONTEXT;
379
380     if (p) {
381 #ifdef PERL_POISON
382         void *tmp = INT2PTR(char*,*p);
383         Safefree(tmp);
384         if (*p)
385             PoisonFree(*p, 1, sizeof(*p));
386 #else
387         Safefree(INT2PTR(char*,*p));
388 #endif
389 #ifdef PERL_OLD_COPY_ON_WRITE
390         if (p[1]) {
391             SvREFCNT_dec (INT2PTR(SV*,p[1]));
392         }
393 #endif
394         Safefree(p);
395         *rsp = NULL;
396     }
397 }
398
399 PP(pp_formline)
400 {
401     dVAR; dSP; dMARK; dORIGMARK;
402     register SV * const tmpForm = *++MARK;
403     register U32 *fpc;
404     register char *t;
405     const char *f;
406     register I32 arg;
407     register SV *sv = NULL;
408     const char *item = NULL;
409     I32 itemsize  = 0;
410     I32 fieldsize = 0;
411     I32 lines = 0;
412     bool chopspace = (strchr(PL_chopset, ' ') != NULL);
413     const char *chophere = NULL;
414     char *linemark = NULL;
415     NV value;
416     bool gotsome = FALSE;
417     STRLEN len;
418     const STRLEN fudge = SvPOK(tmpForm)
419                         ? (SvCUR(tmpForm) * (IN_BYTES ? 1 : 3) + 1) : 0;
420     bool item_is_utf8 = FALSE;
421     bool targ_is_utf8 = FALSE;
422     SV * nsv = NULL;
423     OP * parseres = NULL;
424     const char *fmt;
425     bool oneline;
426
427     if (!SvMAGICAL(tmpForm) || !SvCOMPILED(tmpForm)) {
428         if (SvREADONLY(tmpForm)) {
429             SvREADONLY_off(tmpForm);
430             parseres = doparseform(tmpForm);
431             SvREADONLY_on(tmpForm);
432         }
433         else
434             parseres = doparseform(tmpForm);
435         if (parseres)
436             return parseres;
437     }
438     SvPV_force(PL_formtarget, len);
439     if (DO_UTF8(PL_formtarget))
440         targ_is_utf8 = TRUE;
441     t = SvGROW(PL_formtarget, len + fudge + 1);  /* XXX SvCUR bad */
442     t += len;
443     f = SvPV_const(tmpForm, len);
444     /* need to jump to the next word */
445     fpc = (U32*)(f + len + WORD_ALIGN - SvCUR(tmpForm) % WORD_ALIGN);
446
447     for (;;) {
448         DEBUG_f( {
449             const char *name = "???";
450             arg = -1;
451             switch (*fpc) {
452             case FF_LITERAL:    arg = fpc[1]; name = "LITERAL"; break;
453             case FF_BLANK:      arg = fpc[1]; name = "BLANK";   break;
454             case FF_SKIP:       arg = fpc[1]; name = "SKIP";    break;
455             case FF_FETCH:      arg = fpc[1]; name = "FETCH";   break;
456             case FF_DECIMAL:    arg = fpc[1]; name = "DECIMAL"; break;
457
458             case FF_CHECKNL:    name = "CHECKNL";       break;
459             case FF_CHECKCHOP:  name = "CHECKCHOP";     break;
460             case FF_SPACE:      name = "SPACE";         break;
461             case FF_HALFSPACE:  name = "HALFSPACE";     break;
462             case FF_ITEM:       name = "ITEM";          break;
463             case FF_CHOP:       name = "CHOP";          break;
464             case FF_LINEGLOB:   name = "LINEGLOB";      break;
465             case FF_NEWLINE:    name = "NEWLINE";       break;
466             case FF_MORE:       name = "MORE";          break;
467             case FF_LINEMARK:   name = "LINEMARK";      break;
468             case FF_END:        name = "END";           break;
469             case FF_0DECIMAL:   name = "0DECIMAL";      break;
470             case FF_LINESNGL:   name = "LINESNGL";      break;
471             }
472             if (arg >= 0)
473                 PerlIO_printf(Perl_debug_log, "%-16s%ld\n", name, (long) arg);
474             else
475                 PerlIO_printf(Perl_debug_log, "%-16s\n", name);
476         } );
477         switch (*fpc++) {
478         case FF_LINEMARK:
479             linemark = t;
480             lines++;
481             gotsome = FALSE;
482             break;
483
484         case FF_LITERAL:
485             arg = *fpc++;
486             if (targ_is_utf8 && !SvUTF8(tmpForm)) {
487                 SvCUR_set(PL_formtarget, t - SvPVX_const(PL_formtarget));
488                 *t = '\0';
489                 sv_catpvn_utf8_upgrade(PL_formtarget, f, arg, nsv);
490                 t = SvEND(PL_formtarget);
491                 break;
492             }
493             if (!targ_is_utf8 && DO_UTF8(tmpForm)) {
494                 SvCUR_set(PL_formtarget, t - SvPVX_const(PL_formtarget));
495                 *t = '\0';
496                 sv_utf8_upgrade(PL_formtarget);
497                 SvGROW(PL_formtarget, SvCUR(PL_formtarget) + fudge + 1);
498                 t = SvEND(PL_formtarget);
499                 targ_is_utf8 = TRUE;
500             }
501             while (arg--)
502                 *t++ = *f++;
503             break;
504
505         case FF_SKIP:
506             f += *fpc++;
507             break;
508
509         case FF_FETCH:
510             arg = *fpc++;
511             f += arg;
512             fieldsize = arg;
513
514             if (MARK < SP)
515                 sv = *++MARK;
516             else {
517                 sv = &PL_sv_no;
518                 if (ckWARN(WARN_SYNTAX))
519                     Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "Not enough format arguments");
520             }
521             break;
522
523         case FF_CHECKNL:
524             {
525                 const char *send;
526                 const char *s = item = SvPV_const(sv, len);
527                 itemsize = len;
528                 if (DO_UTF8(sv)) {
529                     itemsize = sv_len_utf8(sv);
530                     if (itemsize != (I32)len) {
531                         I32 itembytes;
532                         if (itemsize > fieldsize) {
533                             itemsize = fieldsize;
534                             itembytes = itemsize;
535                             sv_pos_u2b(sv, &itembytes, 0);
536                         }
537                         else
538                             itembytes = len;
539                         send = chophere = s + itembytes;
540                         while (s < send) {
541                             if (*s & ~31)
542                                 gotsome = TRUE;
543                             else if (*s == '\n')
544                                 break;
545                             s++;
546                         }
547                         item_is_utf8 = TRUE;
548                         itemsize = s - item;
549                         sv_pos_b2u(sv, &itemsize);
550                         break;
551                     }
552                 }
553                 item_is_utf8 = FALSE;
554                 if (itemsize > fieldsize)
555                     itemsize = fieldsize;
556                 send = chophere = s + itemsize;
557                 while (s < send) {
558                     if (*s & ~31)
559                         gotsome = TRUE;
560                     else if (*s == '\n')
561                         break;
562                     s++;
563                 }
564                 itemsize = s - item;
565                 break;
566             }
567
568         case FF_CHECKCHOP:
569             {
570                 const char *s = item = SvPV_const(sv, len);
571                 itemsize = len;
572                 if (DO_UTF8(sv)) {
573                     itemsize = sv_len_utf8(sv);
574                     if (itemsize != (I32)len) {
575                         I32 itembytes;
576                         if (itemsize <= fieldsize) {
577                             const char *send = chophere = s + itemsize;
578                             while (s < send) {
579                                 if (*s == '\r') {
580                                     itemsize = s - item;
581                                     chophere = s;
582                                     break;
583                                 }
584                                 if (*s++ & ~31)
585                                     gotsome = TRUE;
586                             }
587                         }
588                         else {
589                             const char *send;
590                             itemsize = fieldsize;
591                             itembytes = itemsize;
592                             sv_pos_u2b(sv, &itembytes, 0);
593                             send = chophere = s + itembytes;
594                             while (s < send || (s == send && isSPACE(*s))) {
595                                 if (isSPACE(*s)) {
596                                     if (chopspace)
597                                         chophere = s;
598                                     if (*s == '\r')
599                                         break;
600                                 }
601                                 else {
602                                     if (*s & ~31)
603                                         gotsome = TRUE;
604                                     if (strchr(PL_chopset, *s))
605                                         chophere = s + 1;
606                                 }
607                                 s++;
608                             }
609                             itemsize = chophere - item;
610                             sv_pos_b2u(sv, &itemsize);
611                         }
612                         item_is_utf8 = TRUE;
613                         break;
614                     }
615                 }
616                 item_is_utf8 = FALSE;
617                 if (itemsize <= fieldsize) {
618                     const char *const send = chophere = s + itemsize;
619                     while (s < send) {
620                         if (*s == '\r') {
621                             itemsize = s - item;
622                             chophere = s;
623                             break;
624                         }
625                         if (*s++ & ~31)
626                             gotsome = TRUE;
627                     }
628                 }
629                 else {
630                     const char *send;
631                     itemsize = fieldsize;
632                     send = chophere = s + itemsize;
633                     while (s < send || (s == send && isSPACE(*s))) {
634                         if (isSPACE(*s)) {
635                             if (chopspace)
636                                 chophere = s;
637                             if (*s == '\r')
638                                 break;
639                         }
640                         else {
641                             if (*s & ~31)
642                                 gotsome = TRUE;
643                             if (strchr(PL_chopset, *s))
644                                 chophere = s + 1;
645                         }
646                         s++;
647                     }
648                     itemsize = chophere - item;
649                 }
650                 break;
651             }
652
653         case FF_SPACE:
654             arg = fieldsize - itemsize;
655             if (arg) {
656                 fieldsize -= arg;
657                 while (arg-- > 0)
658                     *t++ = ' ';
659             }
660             break;
661
662         case FF_HALFSPACE:
663             arg = fieldsize - itemsize;
664             if (arg) {
665                 arg /= 2;
666                 fieldsize -= arg;
667                 while (arg-- > 0)
668                     *t++ = ' ';
669             }
670             break;
671
672         case FF_ITEM:
673             {
674                 const char *s = item;
675                 arg = itemsize;
676                 if (item_is_utf8) {
677                     if (!targ_is_utf8) {
678                         SvCUR_set(PL_formtarget, t - SvPVX_const(PL_formtarget));
679                         *t = '\0';
680                         sv_utf8_upgrade(PL_formtarget);
681                         SvGROW(PL_formtarget, SvCUR(PL_formtarget) + fudge + 1);
682                         t = SvEND(PL_formtarget);
683                         targ_is_utf8 = TRUE;
684                     }
685                     while (arg--) {
686                         if (UTF8_IS_CONTINUED(*s)) {
687                             STRLEN skip = UTF8SKIP(s);
688                             switch (skip) {
689                             default:
690                                 Move(s,t,skip,char);
691                                 s += skip;
692                                 t += skip;
693                                 break;
694                             case 7: *t++ = *s++;
695                             case 6: *t++ = *s++;
696                             case 5: *t++ = *s++;
697                             case 4: *t++ = *s++;
698                             case 3: *t++ = *s++;
699                             case 2: *t++ = *s++;
700                             case 1: *t++ = *s++;
701                             }
702                         }
703                         else {
704                             if ( !((*t++ = *s++) & ~31) )
705                                 t[-1] = ' ';
706                         }
707                     }
708                     break;
709                 }
710                 if (targ_is_utf8 && !item_is_utf8) {
711                     SvCUR_set(PL_formtarget, t - SvPVX_const(PL_formtarget));
712                     *t = '\0';
713                     sv_catpvn_utf8_upgrade(PL_formtarget, s, arg, nsv);
714                     for (; t < SvEND(PL_formtarget); t++) {
715 #ifdef EBCDIC
716                         const int ch = *t;
717                         if (iscntrl(ch))
718 #else
719                             if (!(*t & ~31))
720 #endif
721                                 *t = ' ';
722                     }
723                     break;
724                 }
725                 while (arg--) {
726 #ifdef EBCDIC
727                     const int ch = *t++ = *s++;
728                     if (iscntrl(ch))
729 #else
730                         if ( !((*t++ = *s++) & ~31) )
731 #endif
732                             t[-1] = ' ';
733                 }
734                 break;
735             }
736
737         case FF_CHOP:
738             {
739                 const char *s = chophere;
740                 if (chopspace) {
741                     while (isSPACE(*s))
742                         s++;
743                 }
744                 sv_chop(sv,s);
745                 SvSETMAGIC(sv);
746                 break;
747             }
748
749         case FF_LINESNGL:
750             chopspace = 0;
751             oneline = TRUE;
752             goto ff_line;
753         case FF_LINEGLOB:
754             oneline = FALSE;
755         ff_line:
756             {
757                 const char *s = item = SvPV_const(sv, len);
758                 itemsize = len;
759                 if ((item_is_utf8 = DO_UTF8(sv)))
760                     itemsize = sv_len_utf8(sv);
761                 if (itemsize) {
762                     bool chopped = FALSE;
763                     const char *const send = s + len;
764                     gotsome = TRUE;
765                     chophere = s + itemsize;
766                     while (s < send) {
767                         if (*s++ == '\n') {
768                             if (oneline) {
769                                 chopped = TRUE;
770                                 chophere = s;
771                                 break;
772                             } else {
773                                 if (s == send) {
774                                     itemsize--;
775                                     chopped = TRUE;
776                                 } else
777                                     lines++;
778                             }
779                         }
780                     }
781                     SvCUR_set(PL_formtarget, t - SvPVX_const(PL_formtarget));
782                     if (targ_is_utf8)
783                         SvUTF8_on(PL_formtarget);
784                     if (oneline) {
785                         SvCUR_set(sv, chophere - item);
786                         sv_catsv(PL_formtarget, sv);
787                         SvCUR_set(sv, itemsize);
788                     } else
789                         sv_catsv(PL_formtarget, sv);
790                     if (chopped)
791                         SvCUR_set(PL_formtarget, SvCUR(PL_formtarget) - 1);
792                     SvGROW(PL_formtarget, SvCUR(PL_formtarget) + fudge + 1);
793                     t = SvPVX(PL_formtarget) + SvCUR(PL_formtarget);
794                     if (item_is_utf8)
795                         targ_is_utf8 = TRUE;
796                 }
797                 break;
798             }
799
800         case FF_0DECIMAL:
801             arg = *fpc++;
802 #if defined(USE_LONG_DOUBLE)
803             fmt = (const char *)
804                 ((arg & 256) ?
805                  "%#0*.*" PERL_PRIfldbl : "%0*.*" PERL_PRIfldbl);
806 #else
807             fmt = (const char *)
808                 ((arg & 256) ?
809                  "%#0*.*f"              : "%0*.*f");
810 #endif
811             goto ff_dec;
812         case FF_DECIMAL:
813             arg = *fpc++;
814 #if defined(USE_LONG_DOUBLE)
815             fmt = (const char *)
816                 ((arg & 256) ? "%#*.*" PERL_PRIfldbl : "%*.*" PERL_PRIfldbl);
817 #else
818             fmt = (const char *)
819                 ((arg & 256) ? "%#*.*f"              : "%*.*f");
820 #endif
821         ff_dec:
822             /* If the field is marked with ^ and the value is undefined,
823                blank it out. */
824             if ((arg & 512) && !SvOK(sv)) {
825                 arg = fieldsize;
826                 while (arg--)
827                     *t++ = ' ';
828                 break;
829             }
830             gotsome = TRUE;
831             value = SvNV(sv);
832             /* overflow evidence */
833             if (num_overflow(value, fieldsize, arg)) {
834                 arg = fieldsize;
835                 while (arg--)
836                     *t++ = '#';
837                 break;
838             }
839             /* Formats aren't yet marked for locales, so assume "yes". */
840             {
841                 STORE_NUMERIC_STANDARD_SET_LOCAL();
842                 my_snprintf(t, SvLEN(PL_formtarget) - (t - SvPVX(PL_formtarget)), fmt, (int) fieldsize, (int) arg & 255, value);
843                 RESTORE_NUMERIC_STANDARD();
844             }
845             t += fieldsize;
846             break;
847
848         case FF_NEWLINE:
849             f++;
850             while (t-- > linemark && *t == ' ') ;
851             t++;
852             *t++ = '\n';
853             break;
854
855         case FF_BLANK:
856             arg = *fpc++;
857             if (gotsome) {
858                 if (arg) {              /* repeat until fields exhausted? */
859                     *t = '\0';
860                     SvCUR_set(PL_formtarget, t - SvPVX_const(PL_formtarget));
861                     lines += FmLINES(PL_formtarget);
862                     if (lines == 200) {
863                         arg = t - linemark;
864                         if (strnEQ(linemark, linemark - arg, arg))
865                             DIE(aTHX_ "Runaway format");
866                     }
867                     if (targ_is_utf8)
868                         SvUTF8_on(PL_formtarget);
869                     FmLINES(PL_formtarget) = lines;
870                     SP = ORIGMARK;
871                     RETURNOP(cLISTOP->op_first);
872                 }
873             }
874             else {
875                 t = linemark;
876                 lines--;
877             }
878             break;
879
880         case FF_MORE:
881             {
882                 const char *s = chophere;
883                 const char *send = item + len;
884                 if (chopspace) {
885                     while (isSPACE(*s) && (s < send))
886                         s++;
887                 }
888                 if (s < send) {
889                     char *s1;
890                     arg = fieldsize - itemsize;
891                     if (arg) {
892                         fieldsize -= arg;
893                         while (arg-- > 0)
894                             *t++ = ' ';
895                     }
896                     s1 = t - 3;
897                     if (strnEQ(s1,"   ",3)) {
898                         while (s1 > SvPVX_const(PL_formtarget) && isSPACE(s1[-1]))
899                             s1--;
900                     }
901                     *s1++ = '.';
902                     *s1++ = '.';
903                     *s1++ = '.';
904                 }
905                 break;
906             }
907         case FF_END:
908             *t = '\0';
909             SvCUR_set(PL_formtarget, t - SvPVX_const(PL_formtarget));
910             if (targ_is_utf8)
911                 SvUTF8_on(PL_formtarget);
912             FmLINES(PL_formtarget) += lines;
913             SP = ORIGMARK;
914             RETPUSHYES;
915         }
916     }
917 }
918
919 PP(pp_grepstart)
920 {
921     dVAR; dSP;
922     SV *src;
923
924     if (PL_stack_base + *PL_markstack_ptr == SP) {
925         (void)POPMARK;
926         if (GIMME_V == G_SCALAR)
927             XPUSHs(sv_2mortal(newSViv(0)));
928         RETURNOP(PL_op->op_next->op_next);
929     }
930     PL_stack_sp = PL_stack_base + *PL_markstack_ptr + 1;
931     pp_pushmark();                              /* push dst */
932     pp_pushmark();                              /* push src */
933     ENTER;                                      /* enter outer scope */
934
935     SAVETMPS;
936     if (PL_op->op_private & OPpGREP_LEX)
937         SAVESPTR(PAD_SVl(PL_op->op_targ));
938     else
939         SAVE_DEFSV;
940     ENTER;                                      /* enter inner scope */
941     SAVEVPTR(PL_curpm);
942
943     src = PL_stack_base[*PL_markstack_ptr];
944     SvTEMP_off(src);
945     if (PL_op->op_private & OPpGREP_LEX)
946         PAD_SVl(PL_op->op_targ) = src;
947     else
948         DEFSV = src;
949
950     PUTBACK;
951     if (PL_op->op_type == OP_MAPSTART)
952         pp_pushmark();                  /* push top */
953     return ((LOGOP*)PL_op->op_next)->op_other;
954 }
955
956 PP(pp_mapwhile)
957 {
958     dVAR; dSP;
959     const I32 gimme = GIMME_V;
960     I32 items = (SP - PL_stack_base) - *PL_markstack_ptr; /* how many new items */
961     I32 count;
962     I32 shift;
963     SV** src;
964     SV** dst;
965
966     /* first, move source pointer to the next item in the source list */
967     ++PL_markstack_ptr[-1];
968
969     /* if there are new items, push them into the destination list */
970     if (items && gimme != G_VOID) {
971         /* might need to make room back there first */
972         if (items > PL_markstack_ptr[-1] - PL_markstack_ptr[-2]) {
973             /* XXX this implementation is very pessimal because the stack
974              * is repeatedly extended for every set of items.  Is possible
975              * to do this without any stack extension or copying at all
976              * by maintaining a separate list over which the map iterates
977              * (like foreach does). --gsar */
978
979             /* everything in the stack after the destination list moves
980              * towards the end the stack by the amount of room needed */
981             shift = items - (PL_markstack_ptr[-1] - PL_markstack_ptr[-2]);
982
983             /* items to shift up (accounting for the moved source pointer) */
984             count = (SP - PL_stack_base) - (PL_markstack_ptr[-1] - 1);
985
986             /* This optimization is by Ben Tilly and it does
987              * things differently from what Sarathy (gsar)
988              * is describing.  The downside of this optimization is
989              * that leaves "holes" (uninitialized and hopefully unused areas)
990              * to the Perl stack, but on the other hand this
991              * shouldn't be a problem.  If Sarathy's idea gets
992              * implemented, this optimization should become
993              * irrelevant.  --jhi */
994             if (shift < count)
995                 shift = count; /* Avoid shifting too often --Ben Tilly */
996
997             EXTEND(SP,shift);
998             src = SP;
999             dst = (SP += shift);
1000             PL_markstack_ptr[-1] += shift;
1001             *PL_markstack_ptr += shift;
1002             while (count--)
1003                 *dst-- = *src--;
1004         }
1005         /* copy the new items down to the destination list */
1006         dst = PL_stack_base + (PL_markstack_ptr[-2] += items) - 1;
1007         if (gimme == G_ARRAY) {
1008             while (items-- > 0)
1009                 *dst-- = SvTEMP(TOPs) ? POPs : sv_mortalcopy(POPs);
1010         }
1011         else {
1012             /* scalar context: we don't care about which values map returns
1013              * (we use undef here). And so we certainly don't want to do mortal
1014              * copies of meaningless values. */
1015             while (items-- > 0) {
1016                 (void)POPs;
1017                 *dst-- = &PL_sv_undef;
1018             }
1019         }
1020     }
1021     LEAVE;                                      /* exit inner scope */
1022
1023     /* All done yet? */
1024     if (PL_markstack_ptr[-1] > *PL_markstack_ptr) {
1025
1026         (void)POPMARK;                          /* pop top */
1027         LEAVE;                                  /* exit outer scope */
1028         (void)POPMARK;                          /* pop src */
1029         items = --*PL_markstack_ptr - PL_markstack_ptr[-1];
1030         (void)POPMARK;                          /* pop dst */
1031         SP = PL_stack_base + POPMARK;           /* pop original mark */
1032         if (gimme == G_SCALAR) {
1033             if (PL_op->op_private & OPpGREP_LEX) {
1034                 SV* sv = sv_newmortal();
1035                 sv_setiv(sv, items);
1036                 PUSHs(sv);
1037             }
1038             else {
1039                 dTARGET;
1040                 XPUSHi(items);
1041             }
1042         }
1043         else if (gimme == G_ARRAY)
1044             SP += items;
1045         RETURN;
1046     }
1047     else {
1048         SV *src;
1049
1050         ENTER;                                  /* enter inner scope */
1051         SAVEVPTR(PL_curpm);
1052
1053         /* set $_ to the new source item */
1054         src = PL_stack_base[PL_markstack_ptr[-1]];
1055         SvTEMP_off(src);
1056         if (PL_op->op_private & OPpGREP_LEX)
1057             PAD_SVl(PL_op->op_targ) = src;
1058         else
1059             DEFSV = src;
1060
1061         RETURNOP(cLOGOP->op_other);
1062     }
1063 }
1064
1065 /* Range stuff. */
1066
1067 PP(pp_range)
1068 {
1069     dVAR;
1070     if (GIMME == G_ARRAY)
1071         return NORMAL;
1072     if (SvTRUEx(PAD_SV(PL_op->op_targ)))
1073         return cLOGOP->op_other;
1074     else
1075         return NORMAL;
1076 }
1077
1078 PP(pp_flip)
1079 {
1080     dVAR;
1081     dSP;
1082
1083     if (GIMME == G_ARRAY) {
1084         RETURNOP(((LOGOP*)cUNOP->op_first)->op_other);
1085     }
1086     else {
1087         dTOPss;
1088         SV * const targ = PAD_SV(PL_op->op_targ);
1089         int flip = 0;
1090
1091         if (PL_op->op_private & OPpFLIP_LINENUM) {
1092             if (GvIO(PL_last_in_gv)) {
1093                 flip = SvIV(sv) == (IV)IoLINES(GvIOp(PL_last_in_gv));
1094             }
1095             else {
1096                 GV * const gv = gv_fetchpvs(".", GV_ADD|GV_NOTQUAL, SVt_PV);
1097                 if (gv && GvSV(gv))
1098                     flip = SvIV(sv) == SvIV(GvSV(gv));
1099             }
1100         } else {
1101             flip = SvTRUE(sv);
1102         }
1103         if (flip) {
1104             sv_setiv(PAD_SV(cUNOP->op_first->op_targ), 1);
1105             if (PL_op->op_flags & OPf_SPECIAL) {
1106                 sv_setiv(targ, 1);
1107                 SETs(targ);
1108                 RETURN;
1109             }
1110             else {
1111                 sv_setiv(targ, 0);
1112                 SP--;
1113                 RETURNOP(((LOGOP*)cUNOP->op_first)->op_other);
1114             }
1115         }
1116         sv_setpvn(TARG, "", 0);
1117         SETs(targ);
1118         RETURN;
1119     }
1120 }
1121
1122 /* This code tries to decide if "$left .. $right" should use the
1123    magical string increment, or if the range is numeric (we make
1124    an exception for .."0" [#18165]). AMS 20021031. */
1125
1126 #define RANGE_IS_NUMERIC(left,right) ( \
1127         SvNIOKp(left)  || (SvOK(left)  && !SvPOKp(left))  || \
1128         SvNIOKp(right) || (SvOK(right) && !SvPOKp(right)) || \
1129         (((!SvOK(left) && SvOK(right)) || ((!SvOK(left) || \
1130           looks_like_number(left)) && SvPOKp(left) && *SvPVX_const(left) != '0')) \
1131          && (!SvOK(right) || looks_like_number(right))))
1132
1133 PP(pp_flop)
1134 {
1135     dVAR; dSP;
1136
1137     if (GIMME == G_ARRAY) {
1138         dPOPPOPssrl;
1139
1140         SvGETMAGIC(left);
1141         SvGETMAGIC(right);
1142
1143         if (RANGE_IS_NUMERIC(left,right)) {
1144             register IV i, j;
1145             IV max;
1146             if ((SvOK(left) && SvNV(left) < IV_MIN) ||
1147                 (SvOK(right) && SvNV(right) > IV_MAX))
1148                 DIE(aTHX_ "Range iterator outside integer range");
1149             i = SvIV(left);
1150             max = SvIV(right);
1151             if (max >= i) {
1152                 j = max - i + 1;
1153                 EXTEND_MORTAL(j);
1154                 EXTEND(SP, j);
1155             }
1156             else
1157                 j = 0;
1158             while (j--) {
1159                 SV * const sv = sv_2mortal(newSViv(i++));
1160                 PUSHs(sv);
1161             }
1162         }
1163         else {
1164             SV * const final = sv_mortalcopy(right);
1165             STRLEN len;
1166             const char * const tmps = SvPV_const(final, len);
1167
1168             SV *sv = sv_mortalcopy(left);
1169             SvPV_force_nolen(sv);
1170             while (!SvNIOKp(sv) && SvCUR(sv) <= len) {
1171                 XPUSHs(sv);
1172                 if (strEQ(SvPVX_const(sv),tmps))
1173                     break;
1174                 sv = sv_2mortal(newSVsv(sv));
1175                 sv_inc(sv);
1176             }
1177         }
1178     }
1179     else {
1180         dTOPss;
1181         SV * const targ = PAD_SV(cUNOP->op_first->op_targ);
1182         int flop = 0;
1183         sv_inc(targ);
1184
1185         if (PL_op->op_private & OPpFLIP_LINENUM) {
1186             if (GvIO(PL_last_in_gv)) {
1187                 flop = SvIV(sv) == (IV)IoLINES(GvIOp(PL_last_in_gv));
1188             }
1189             else {
1190                 GV * const gv = gv_fetchpvs(".", GV_ADD|GV_NOTQUAL, SVt_PV);
1191                 if (gv && GvSV(gv)) flop = SvIV(sv) == SvIV(GvSV(gv));
1192             }
1193         }
1194         else {
1195             flop = SvTRUE(sv);
1196         }
1197
1198         if (flop) {
1199             sv_setiv(PAD_SV(((UNOP*)cUNOP->op_first)->op_first->op_targ), 0);
1200             sv_catpvs(targ, "E0");
1201         }
1202         SETs(targ);
1203     }
1204
1205     RETURN;
1206 }
1207
1208 /* Control. */
1209
1210 static const char * const context_name[] = {
1211     "pseudo-block",
1212     "subroutine",
1213     "eval",
1214     "loop",
1215     "substitution",
1216     "block",
1217     "format",
1218     "given",
1219     "when"
1220 };
1221
1222 STATIC I32
1223 S_dopoptolabel(pTHX_ const char *label)
1224 {
1225     dVAR;
1226     register I32 i;
1227
1228     for (i = cxstack_ix; i >= 0; i--) {
1229         register const PERL_CONTEXT * const cx = &cxstack[i];
1230         switch (CxTYPE(cx)) {
1231         case CXt_SUBST:
1232         case CXt_SUB:
1233         case CXt_FORMAT:
1234         case CXt_EVAL:
1235         case CXt_NULL:
1236         case CXt_GIVEN:
1237         case CXt_WHEN:
1238             if (ckWARN(WARN_EXITING))
1239                 Perl_warner(aTHX_ packWARN(WARN_EXITING), "Exiting %s via %s",
1240                         context_name[CxTYPE(cx)], OP_NAME(PL_op));
1241             if (CxTYPE(cx) == CXt_NULL)
1242                 return -1;
1243             break;
1244         case CXt_LOOP:
1245             if ( !cx->blk_loop.label || strNE(label, cx->blk_loop.label) ) {
1246                 DEBUG_l(Perl_deb(aTHX_ "(Skipping label #%ld %s)\n",
1247                         (long)i, cx->blk_loop.label));
1248                 continue;
1249             }
1250             DEBUG_l( Perl_deb(aTHX_ "(Found label #%ld %s)\n", (long)i, label));
1251             return i;
1252         }
1253     }
1254     return i;
1255 }
1256
1257
1258
1259 I32
1260 Perl_dowantarray(pTHX)
1261 {
1262     dVAR;
1263     const I32 gimme = block_gimme();
1264     return (gimme == G_VOID) ? G_SCALAR : gimme;
1265 }
1266
1267 I32
1268 Perl_block_gimme(pTHX)
1269 {
1270     dVAR;
1271     const I32 cxix = dopoptosub(cxstack_ix);
1272     if (cxix < 0)
1273         return G_VOID;
1274
1275     switch (cxstack[cxix].blk_gimme) {
1276     case G_VOID:
1277         return G_VOID;
1278     case G_SCALAR:
1279         return G_SCALAR;
1280     case G_ARRAY:
1281         return G_ARRAY;
1282     default:
1283         Perl_croak(aTHX_ "panic: bad gimme: %d\n", cxstack[cxix].blk_gimme);
1284         /* NOTREACHED */
1285         return 0;
1286     }
1287 }
1288
1289 I32
1290 Perl_is_lvalue_sub(pTHX)
1291 {
1292     dVAR;
1293     const I32 cxix = dopoptosub(cxstack_ix);
1294     assert(cxix >= 0);  /* We should only be called from inside subs */
1295
1296     if (cxstack[cxix].blk_sub.lval && CvLVALUE(cxstack[cxix].blk_sub.cv))
1297         return cxstack[cxix].blk_sub.lval;
1298     else
1299         return 0;
1300 }
1301
1302 STATIC I32
1303 S_dopoptosub(pTHX_ I32 startingblock)
1304 {
1305     dVAR;
1306     return dopoptosub_at(cxstack, startingblock);
1307 }
1308
1309 STATIC I32
1310 S_dopoptosub_at(pTHX_ const PERL_CONTEXT *cxstk, I32 startingblock)
1311 {
1312     dVAR;
1313     I32 i;
1314     for (i = startingblock; i >= 0; i--) {
1315         register const PERL_CONTEXT * const cx = &cxstk[i];
1316         switch (CxTYPE(cx)) {
1317         default:
1318             continue;
1319         case CXt_EVAL:
1320         case CXt_SUB:
1321         case CXt_FORMAT:
1322             DEBUG_l( Perl_deb(aTHX_ "(Found sub #%ld)\n", (long)i));
1323             return i;
1324         }
1325     }
1326     return i;
1327 }
1328
1329 STATIC I32
1330 S_dopoptoeval(pTHX_ I32 startingblock)
1331 {
1332     dVAR;
1333     I32 i;
1334     for (i = startingblock; i >= 0; i--) {
1335         register const PERL_CONTEXT *cx = &cxstack[i];
1336         switch (CxTYPE(cx)) {
1337         default:
1338             continue;
1339         case CXt_EVAL:
1340             DEBUG_l( Perl_deb(aTHX_ "(Found eval #%ld)\n", (long)i));
1341             return i;
1342         }
1343     }
1344     return i;
1345 }
1346
1347 STATIC I32
1348 S_dopoptoloop(pTHX_ I32 startingblock)
1349 {
1350     dVAR;
1351     I32 i;
1352     for (i = startingblock; i >= 0; i--) {
1353         register const PERL_CONTEXT * const cx = &cxstack[i];
1354         switch (CxTYPE(cx)) {
1355         case CXt_SUBST:
1356         case CXt_SUB:
1357         case CXt_FORMAT:
1358         case CXt_EVAL:
1359         case CXt_NULL:
1360             if (ckWARN(WARN_EXITING))
1361                 Perl_warner(aTHX_ packWARN(WARN_EXITING), "Exiting %s via %s",
1362                         context_name[CxTYPE(cx)], OP_NAME(PL_op));
1363             if ((CxTYPE(cx)) == CXt_NULL)
1364                 return -1;
1365             break;
1366         case CXt_LOOP:
1367             DEBUG_l( Perl_deb(aTHX_ "(Found loop #%ld)\n", (long)i));
1368             return i;
1369         }
1370     }
1371     return i;
1372 }
1373
1374 STATIC I32
1375 S_dopoptogiven(pTHX_ I32 startingblock)
1376 {
1377     dVAR;
1378     I32 i;
1379     for (i = startingblock; i >= 0; i--) {
1380         register const PERL_CONTEXT *cx = &cxstack[i];
1381         switch (CxTYPE(cx)) {
1382         default:
1383             continue;
1384         case CXt_GIVEN:
1385             DEBUG_l( Perl_deb(aTHX_ "(Found given #%ld)\n", (long)i));
1386             return i;
1387         case CXt_LOOP:
1388             if (CxFOREACHDEF(cx)) {
1389                 DEBUG_l( Perl_deb(aTHX_ "(Found foreach #%ld)\n", (long)i));
1390                 return i;
1391             }
1392         }
1393     }
1394     return i;
1395 }
1396
1397 STATIC I32
1398 S_dopoptowhen(pTHX_ I32 startingblock)
1399 {
1400     dVAR;
1401     I32 i;
1402     for (i = startingblock; i >= 0; i--) {
1403         register const PERL_CONTEXT *cx = &cxstack[i];
1404         switch (CxTYPE(cx)) {
1405         default:
1406             continue;
1407         case CXt_WHEN:
1408             DEBUG_l( Perl_deb(aTHX_ "(Found when #%ld)\n", (long)i));
1409             return i;
1410         }
1411     }
1412     return i;
1413 }
1414
1415 void
1416 Perl_dounwind(pTHX_ I32 cxix)
1417 {
1418     dVAR;
1419     I32 optype;
1420
1421     while (cxstack_ix > cxix) {
1422         SV *sv;
1423         register PERL_CONTEXT *cx = &cxstack[cxstack_ix];
1424         DEBUG_l(PerlIO_printf(Perl_debug_log, "Unwinding block %ld, type %s\n",
1425                               (long) cxstack_ix, PL_block_type[CxTYPE(cx)]));
1426         /* Note: we don't need to restore the base context info till the end. */
1427         switch (CxTYPE(cx)) {
1428         case CXt_SUBST:
1429             POPSUBST(cx);
1430             continue;  /* not break */
1431         case CXt_SUB:
1432             POPSUB(cx,sv);
1433             LEAVESUB(sv);
1434             break;
1435         case CXt_EVAL:
1436             POPEVAL(cx);
1437             break;
1438         case CXt_LOOP:
1439             POPLOOP(cx);
1440             break;
1441         case CXt_NULL:
1442             break;
1443         case CXt_FORMAT:
1444             POPFORMAT(cx);
1445             break;
1446         }
1447         cxstack_ix--;
1448     }
1449     PERL_UNUSED_VAR(optype);
1450 }
1451
1452 void
1453 Perl_qerror(pTHX_ SV *err)
1454 {
1455     dVAR;
1456     if (PL_in_eval)
1457         sv_catsv(ERRSV, err);
1458     else if (PL_errors)
1459         sv_catsv(PL_errors, err);
1460     else
1461         Perl_warn(aTHX_ "%"SVf, SVfARG(err));
1462     ++PL_error_count;
1463 }
1464
1465 OP *
1466 Perl_die_where(pTHX_ const char *message, STRLEN msglen)
1467 {
1468     dVAR;
1469
1470     if (PL_in_eval) {
1471         I32 cxix;
1472         I32 gimme;
1473
1474         if (message) {
1475             if (PL_in_eval & EVAL_KEEPERR) {
1476                 static const char prefix[] = "\t(in cleanup) ";
1477                 SV * const err = ERRSV;
1478                 const char *e = NULL;
1479                 if (!SvPOK(err))
1480                     sv_setpvn(err,"",0);
1481                 else if (SvCUR(err) >= sizeof(prefix)+msglen-1) {
1482                     STRLEN len;
1483                     e = SvPV_const(err, len);
1484                     e += len - msglen;
1485                     if (*e != *message || strNE(e,message))
1486                         e = NULL;
1487                 }
1488                 if (!e) {
1489                     SvGROW(err, SvCUR(err)+sizeof(prefix)+msglen);
1490                     sv_catpvn(err, prefix, sizeof(prefix)-1);
1491                     sv_catpvn(err, message, msglen);
1492                     if (ckWARN(WARN_MISC)) {
1493                         const STRLEN start = SvCUR(err)-msglen-sizeof(prefix)+1;
1494                         Perl_warner(aTHX_ packWARN(WARN_MISC), SvPVX_const(err)+start);
1495                     }
1496                 }
1497             }
1498             else {
1499                 sv_setpvn(ERRSV, message, msglen);
1500             }
1501         }
1502
1503         while ((cxix = dopoptoeval(cxstack_ix)) < 0
1504                && PL_curstackinfo->si_prev)
1505         {
1506             dounwind(-1);
1507             POPSTACK;
1508         }
1509
1510         if (cxix >= 0) {
1511             I32 optype;
1512             register PERL_CONTEXT *cx;
1513             SV **newsp;
1514
1515             if (cxix < cxstack_ix)
1516                 dounwind(cxix);
1517
1518             POPBLOCK(cx,PL_curpm);
1519             if (CxTYPE(cx) != CXt_EVAL) {
1520                 if (!message)
1521                     message = SvPVx_const(ERRSV, msglen);
1522                 PerlIO_write(Perl_error_log, (const char *)"panic: die ", 11);
1523                 PerlIO_write(Perl_error_log, message, msglen);
1524                 my_exit(1);
1525             }
1526             POPEVAL(cx);
1527
1528             if (gimme == G_SCALAR)
1529                 *++newsp = &PL_sv_undef;
1530             PL_stack_sp = newsp;
1531
1532             LEAVE;
1533
1534             /* LEAVE could clobber PL_curcop (see save_re_context())
1535              * XXX it might be better to find a way to avoid messing with
1536              * PL_curcop in save_re_context() instead, but this is a more
1537              * minimal fix --GSAR */
1538             PL_curcop = cx->blk_oldcop;
1539
1540             if (optype == OP_REQUIRE) {
1541                 const char* const msg = SvPVx_nolen_const(ERRSV);
1542                 SV * const nsv = cx->blk_eval.old_namesv;
1543                 (void)hv_store(GvHVn(PL_incgv), SvPVX_const(nsv), SvCUR(nsv),
1544                                &PL_sv_undef, 0);
1545                 DIE(aTHX_ "%sCompilation failed in require",
1546                     *msg ? msg : "Unknown error\n");
1547             }
1548             assert(CxTYPE(cx) == CXt_EVAL);
1549             return cx->blk_eval.retop;
1550         }
1551     }
1552     if (!message)
1553         message = SvPVx_const(ERRSV, msglen);
1554
1555     write_to_stderr(message, msglen);
1556     my_failure_exit();
1557     /* NOTREACHED */
1558     return 0;
1559 }
1560
1561 PP(pp_xor)
1562 {
1563     dVAR; dSP; dPOPTOPssrl;
1564     if (SvTRUE(left) != SvTRUE(right))
1565         RETSETYES;
1566     else
1567         RETSETNO;
1568 }
1569
1570 PP(pp_caller)
1571 {
1572     dVAR;
1573     dSP;
1574     register I32 cxix = dopoptosub(cxstack_ix);
1575     register const PERL_CONTEXT *cx;
1576     register const PERL_CONTEXT *ccstack = cxstack;
1577     const PERL_SI *top_si = PL_curstackinfo;
1578     I32 gimme;
1579     const char *stashname;
1580     I32 count = 0;
1581
1582     if (MAXARG)
1583         count = POPi;
1584
1585     for (;;) {
1586         /* we may be in a higher stacklevel, so dig down deeper */
1587         while (cxix < 0 && top_si->si_type != PERLSI_MAIN) {
1588             top_si = top_si->si_prev;
1589             ccstack = top_si->si_cxstack;
1590             cxix = dopoptosub_at(ccstack, top_si->si_cxix);
1591         }
1592         if (cxix < 0) {
1593             if (GIMME != G_ARRAY) {
1594                 EXTEND(SP, 1);
1595                 RETPUSHUNDEF;
1596             }
1597             RETURN;
1598         }
1599         /* caller() should not report the automatic calls to &DB::sub */
1600         if (PL_DBsub && GvCV(PL_DBsub) && cxix >= 0 &&
1601                 ccstack[cxix].blk_sub.cv == GvCV(PL_DBsub))
1602             count++;
1603         if (!count--)
1604             break;
1605         cxix = dopoptosub_at(ccstack, cxix - 1);
1606     }
1607
1608     cx = &ccstack[cxix];
1609     if (CxTYPE(cx) == CXt_SUB || CxTYPE(cx) == CXt_FORMAT) {
1610         const I32 dbcxix = dopoptosub_at(ccstack, cxix - 1);
1611         /* We expect that ccstack[dbcxix] is CXt_SUB, anyway, the
1612            field below is defined for any cx. */
1613         /* caller() should not report the automatic calls to &DB::sub */
1614         if (PL_DBsub && GvCV(PL_DBsub) && dbcxix >= 0 && ccstack[dbcxix].blk_sub.cv == GvCV(PL_DBsub))
1615             cx = &ccstack[dbcxix];
1616     }
1617
1618     stashname = CopSTASHPV(cx->blk_oldcop);
1619     if (GIMME != G_ARRAY) {
1620         EXTEND(SP, 1);
1621         if (!stashname)
1622             PUSHs(&PL_sv_undef);
1623         else {
1624             dTARGET;
1625             sv_setpv(TARG, stashname);
1626             PUSHs(TARG);
1627         }
1628         RETURN;
1629     }
1630
1631     EXTEND(SP, 11);
1632
1633     if (!stashname)
1634         PUSHs(&PL_sv_undef);
1635     else
1636         PUSHs(sv_2mortal(newSVpv(stashname, 0)));
1637     PUSHs(sv_2mortal(newSVpv(OutCopFILE(cx->blk_oldcop), 0)));
1638     PUSHs(sv_2mortal(newSViv((I32)CopLINE(cx->blk_oldcop))));
1639     if (!MAXARG)
1640         RETURN;
1641     if (CxTYPE(cx) == CXt_SUB || CxTYPE(cx) == CXt_FORMAT) {
1642         GV * const cvgv = CvGV(ccstack[cxix].blk_sub.cv);
1643         /* So is ccstack[dbcxix]. */
1644         if (isGV(cvgv)) {
1645             SV * const sv = newSV(0);
1646             gv_efullname3(sv, cvgv, NULL);
1647             PUSHs(sv_2mortal(sv));
1648             PUSHs(sv_2mortal(newSViv((I32)cx->blk_sub.hasargs)));
1649         }
1650         else {
1651             PUSHs(sv_2mortal(newSVpvs("(unknown)")));
1652             PUSHs(sv_2mortal(newSViv((I32)cx->blk_sub.hasargs)));
1653         }
1654     }
1655     else {
1656         PUSHs(sv_2mortal(newSVpvs("(eval)")));
1657         PUSHs(sv_2mortal(newSViv(0)));
1658     }
1659     gimme = (I32)cx->blk_gimme;
1660     if (gimme == G_VOID)
1661         PUSHs(&PL_sv_undef);
1662     else
1663         PUSHs(sv_2mortal(newSViv(gimme & G_ARRAY)));
1664     if (CxTYPE(cx) == CXt_EVAL) {
1665         /* eval STRING */
1666         if (cx->blk_eval.old_op_type == OP_ENTEREVAL) {
1667             PUSHs(cx->blk_eval.cur_text);
1668             PUSHs(&PL_sv_no);
1669         }
1670         /* require */
1671         else if (cx->blk_eval.old_namesv) {
1672             PUSHs(sv_2mortal(newSVsv(cx->blk_eval.old_namesv)));
1673             PUSHs(&PL_sv_yes);
1674         }
1675         /* eval BLOCK (try blocks have old_namesv == 0) */
1676         else {
1677             PUSHs(&PL_sv_undef);
1678             PUSHs(&PL_sv_undef);
1679         }
1680     }
1681     else {
1682         PUSHs(&PL_sv_undef);
1683         PUSHs(&PL_sv_undef);
1684     }
1685     if (CxTYPE(cx) == CXt_SUB && cx->blk_sub.hasargs
1686         && CopSTASH_eq(PL_curcop, PL_debstash))
1687     {
1688         AV * const ary = cx->blk_sub.argarray;
1689         const int off = AvARRAY(ary) - AvALLOC(ary);
1690
1691         if (!PL_dbargs) {
1692             GV* const tmpgv = gv_fetchpvs("DB::args", GV_ADD, SVt_PVAV);
1693             PL_dbargs = GvAV(gv_AVadd(tmpgv));
1694             GvMULTI_on(tmpgv);
1695             AvREAL_off(PL_dbargs);      /* XXX should be REIFY (see av.h) */
1696         }
1697
1698         if (AvMAX(PL_dbargs) < AvFILLp(ary) + off)
1699             av_extend(PL_dbargs, AvFILLp(ary) + off);
1700         Copy(AvALLOC(ary), AvARRAY(PL_dbargs), AvFILLp(ary) + 1 + off, SV*);
1701         AvFILLp(PL_dbargs) = AvFILLp(ary) + off;
1702     }
1703     /* XXX only hints propagated via op_private are currently
1704      * visible (others are not easily accessible, since they
1705      * use the global PL_hints) */
1706     PUSHs(sv_2mortal(newSViv(CopHINTS_get(cx->blk_oldcop))));
1707     {
1708         SV * mask ;
1709         STRLEN * const old_warnings = cx->blk_oldcop->cop_warnings ;
1710
1711         if  (old_warnings == pWARN_NONE ||
1712                 (old_warnings == pWARN_STD && (PL_dowarn & G_WARN_ON) == 0))
1713             mask = newSVpvn(WARN_NONEstring, WARNsize) ;
1714         else if (old_warnings == pWARN_ALL ||
1715                   (old_warnings == pWARN_STD && PL_dowarn & G_WARN_ON)) {
1716             /* Get the bit mask for $warnings::Bits{all}, because
1717              * it could have been extended by warnings::register */
1718             SV **bits_all;
1719             HV * const bits = get_hv("warnings::Bits", FALSE);
1720             if (bits && (bits_all=hv_fetchs(bits, "all", FALSE))) {
1721                 mask = newSVsv(*bits_all);
1722             }
1723             else {
1724                 mask = newSVpvn(WARN_ALLstring, WARNsize) ;
1725             }
1726         }
1727         else
1728             mask = newSVpvn((char *) (old_warnings + 1), old_warnings[0]);
1729         PUSHs(sv_2mortal(mask));
1730     }
1731
1732     PUSHs(cx->blk_oldcop->cop_hints_hash ?
1733           sv_2mortal(newRV_noinc(
1734             (SV*)Perl_refcounted_he_chain_2hv(aTHX_
1735                                               cx->blk_oldcop->cop_hints_hash)))
1736           : &PL_sv_undef);
1737     RETURN;
1738 }
1739
1740 PP(pp_reset)
1741 {
1742     dVAR;
1743     dSP;
1744     const char * const tmps = (MAXARG < 1) ? (const char *)"" : POPpconstx;
1745     sv_reset(tmps, CopSTASH(PL_curcop));
1746     PUSHs(&PL_sv_yes);
1747     RETURN;
1748 }
1749
1750 /* like pp_nextstate, but used instead when the debugger is active */
1751
1752 PP(pp_dbstate)
1753 {
1754     dVAR;
1755     PL_curcop = (COP*)PL_op;
1756     TAINT_NOT;          /* Each statement is presumed innocent */
1757     PL_stack_sp = PL_stack_base + cxstack[cxstack_ix].blk_oldsp;
1758     FREETMPS;
1759
1760     if (PL_op->op_flags & OPf_SPECIAL /* breakpoint */
1761             || SvIV(PL_DBsingle) || SvIV(PL_DBsignal) || SvIV(PL_DBtrace))
1762     {
1763         dSP;
1764         register PERL_CONTEXT *cx;
1765         const I32 gimme = G_ARRAY;
1766         U8 hasargs;
1767         GV * const gv = PL_DBgv;
1768         register CV * const cv = GvCV(gv);
1769
1770         if (!cv)
1771             DIE(aTHX_ "No DB::DB routine defined");
1772
1773         if (CvDEPTH(cv) >= 1 && !(PL_debug & DEBUG_DB_RECURSE_FLAG))
1774             /* don't do recursive DB::DB call */
1775             return NORMAL;
1776
1777         ENTER;
1778         SAVETMPS;
1779
1780         SAVEI32(PL_debug);
1781         SAVESTACK_POS();
1782         PL_debug = 0;
1783         hasargs = 0;
1784         SPAGAIN;
1785
1786         if (CvISXSUB(cv)) {
1787             CvDEPTH(cv)++;
1788             PUSHMARK(SP);
1789             (void)(*CvXSUB(cv))(aTHX_ cv);
1790             CvDEPTH(cv)--;
1791             FREETMPS;
1792             LEAVE;
1793             return NORMAL;
1794         }
1795         else {
1796             PUSHBLOCK(cx, CXt_SUB, SP);
1797             PUSHSUB_DB(cx);
1798             cx->blk_sub.retop = PL_op->op_next;
1799             CvDEPTH(cv)++;
1800             SAVECOMPPAD();
1801             PAD_SET_CUR_NOSAVE(CvPADLIST(cv), 1);
1802             RETURNOP(CvSTART(cv));
1803         }
1804     }
1805     else
1806         return NORMAL;
1807 }
1808
1809 PP(pp_enteriter)
1810 {
1811     dVAR; dSP; dMARK;
1812     register PERL_CONTEXT *cx;
1813     const I32 gimme = GIMME_V;
1814     SV **svp;
1815     U16 cxtype = CXt_LOOP | CXp_FOREACH;
1816 #ifdef USE_ITHREADS
1817     void *iterdata;
1818 #endif
1819
1820     ENTER;
1821     SAVETMPS;
1822
1823     if (PL_op->op_targ) {
1824         if (PL_op->op_private & OPpLVAL_INTRO) { /* for my $x (...) */
1825             SvPADSTALE_off(PAD_SVl(PL_op->op_targ));
1826             SAVESETSVFLAGS(PAD_SVl(PL_op->op_targ),
1827                     SVs_PADSTALE, SVs_PADSTALE);
1828         }
1829 #ifndef USE_ITHREADS
1830         svp = &PAD_SVl(PL_op->op_targ);         /* "my" variable */
1831         SAVESPTR(*svp);
1832 #else
1833         SAVEPADSV(PL_op->op_targ);
1834         iterdata = INT2PTR(void*, PL_op->op_targ);
1835         cxtype |= CXp_PADVAR;
1836 #endif
1837     }
1838     else {
1839         GV * const gv = (GV*)POPs;
1840         svp = &GvSV(gv);                        /* symbol table variable */
1841         SAVEGENERICSV(*svp);
1842         *svp = newSV(0);
1843 #ifdef USE_ITHREADS
1844         iterdata = (void*)gv;
1845 #endif
1846     }
1847
1848     if (PL_op->op_private & OPpITER_DEF)
1849         cxtype |= CXp_FOR_DEF;
1850
1851     ENTER;
1852
1853     PUSHBLOCK(cx, cxtype, SP);
1854 #ifdef USE_ITHREADS
1855     PUSHLOOP(cx, iterdata, MARK);
1856 #else
1857     PUSHLOOP(cx, svp, MARK);
1858 #endif
1859     if (PL_op->op_flags & OPf_STACKED) {
1860         cx->blk_loop.iterary = (AV*)SvREFCNT_inc(POPs);
1861         if (SvTYPE(cx->blk_loop.iterary) != SVt_PVAV) {
1862             dPOPss;
1863             SV * const right = (SV*)cx->blk_loop.iterary;
1864             SvGETMAGIC(sv);
1865             SvGETMAGIC(right);
1866             if (RANGE_IS_NUMERIC(sv,right)) {
1867                 if ((SvOK(sv) && SvNV(sv) < IV_MIN) ||
1868                     (SvOK(right) && SvNV(right) >= IV_MAX))
1869                     DIE(aTHX_ "Range iterator outside integer range");
1870                 cx->blk_loop.iterix = SvIV(sv);
1871                 cx->blk_loop.itermax = SvIV(right);
1872 #ifdef DEBUGGING
1873                 /* for correct -Dstv display */
1874                 cx->blk_oldsp = sp - PL_stack_base;
1875 #endif
1876             }
1877             else {
1878                 cx->blk_loop.iterlval = newSVsv(sv);
1879                 (void) SvPV_force_nolen(cx->blk_loop.iterlval);
1880                 (void) SvPV_nolen_const(right);
1881             }
1882         }
1883         else if (PL_op->op_private & OPpITER_REVERSED) {
1884             cx->blk_loop.itermax = 0;
1885             cx->blk_loop.iterix = AvFILL(cx->blk_loop.iterary) + 1;
1886
1887         }
1888     }
1889     else {
1890         cx->blk_loop.iterary = PL_curstack;
1891         AvFILLp(PL_curstack) = SP - PL_stack_base;
1892         if (PL_op->op_private & OPpITER_REVERSED) {
1893             cx->blk_loop.itermax = MARK - PL_stack_base + 1;
1894             cx->blk_loop.iterix = cx->blk_oldsp + 1;
1895         }
1896         else {
1897             cx->blk_loop.iterix = MARK - PL_stack_base;
1898         }
1899     }
1900
1901     RETURN;
1902 }
1903
1904 PP(pp_enterloop)
1905 {
1906     dVAR; dSP;
1907     register PERL_CONTEXT *cx;
1908     const I32 gimme = GIMME_V;
1909
1910     ENTER;
1911     SAVETMPS;
1912     ENTER;
1913
1914     PUSHBLOCK(cx, CXt_LOOP, SP);
1915     PUSHLOOP(cx, 0, SP);
1916
1917     RETURN;
1918 }
1919
1920 PP(pp_leaveloop)
1921 {
1922     dVAR; dSP;
1923     register PERL_CONTEXT *cx;
1924     I32 gimme;
1925     SV **newsp;
1926     PMOP *newpm;
1927     SV **mark;
1928
1929     POPBLOCK(cx,newpm);
1930     assert(CxTYPE(cx) == CXt_LOOP);
1931     mark = newsp;
1932     newsp = PL_stack_base + cx->blk_loop.resetsp;
1933
1934     TAINT_NOT;
1935     if (gimme == G_VOID)
1936         NOOP;
1937     else if (gimme == G_SCALAR) {
1938         if (mark < SP)
1939             *++newsp = sv_mortalcopy(*SP);
1940         else
1941             *++newsp = &PL_sv_undef;
1942     }
1943     else {
1944         while (mark < SP) {
1945             *++newsp = sv_mortalcopy(*++mark);
1946             TAINT_NOT;          /* Each item is independent */
1947         }
1948     }
1949     SP = newsp;
1950     PUTBACK;
1951
1952     POPLOOP(cx);        /* Stack values are safe: release loop vars ... */
1953     PL_curpm = newpm;   /* ... and pop $1 et al */
1954
1955     LEAVE;
1956     LEAVE;
1957
1958     return NORMAL;
1959 }
1960
1961 PP(pp_return)
1962 {
1963     dVAR; dSP; dMARK;
1964     register PERL_CONTEXT *cx;
1965     bool popsub2 = FALSE;
1966     bool clear_errsv = FALSE;
1967     I32 gimme;
1968     SV **newsp;
1969     PMOP *newpm;
1970     I32 optype = 0;
1971     SV *sv;
1972     OP *retop;
1973
1974     const I32 cxix = dopoptosub(cxstack_ix);
1975
1976     if (cxix < 0) {
1977         if (CxMULTICALL(cxstack)) { /* In this case we must be in a
1978                                      * sort block, which is a CXt_NULL
1979                                      * not a CXt_SUB */
1980             dounwind(0);
1981             PL_stack_base[1] = *PL_stack_sp;
1982             PL_stack_sp = PL_stack_base + 1;
1983             return 0;
1984         }
1985         else
1986             DIE(aTHX_ "Can't return outside a subroutine");
1987     }
1988     if (cxix < cxstack_ix)
1989         dounwind(cxix);
1990
1991     if (CxMULTICALL(&cxstack[cxix])) {
1992         gimme = cxstack[cxix].blk_gimme;
1993         if (gimme == G_VOID)
1994             PL_stack_sp = PL_stack_base;
1995         else if (gimme == G_SCALAR) {
1996             PL_stack_base[1] = *PL_stack_sp;
1997             PL_stack_sp = PL_stack_base + 1;
1998         }
1999         return 0;
2000     }
2001
2002     POPBLOCK(cx,newpm);
2003     switch (CxTYPE(cx)) {
2004     case CXt_SUB:
2005         popsub2 = TRUE;
2006         retop = cx->blk_sub.retop;
2007         cxstack_ix++; /* preserve cx entry on stack for use by POPSUB */
2008         break;
2009     case CXt_EVAL:
2010         if (!(PL_in_eval & EVAL_KEEPERR))
2011             clear_errsv = TRUE;
2012         POPEVAL(cx);
2013         retop = cx->blk_eval.retop;
2014         if (CxTRYBLOCK(cx))
2015             break;
2016         lex_end();
2017         if (optype == OP_REQUIRE &&
2018             (MARK == SP || (gimme == G_SCALAR && !SvTRUE(*SP))) )
2019         {
2020             /* Unassume the success we assumed earlier. */
2021             SV * const nsv = cx->blk_eval.old_namesv;
2022             (void)hv_delete(GvHVn(PL_incgv), SvPVX_const(nsv), SvCUR(nsv), G_DISCARD);
2023             DIE(aTHX_ "%"SVf" did not return a true value", SVfARG(nsv));
2024         }
2025         break;
2026     case CXt_FORMAT:
2027         POPFORMAT(cx);
2028         retop = cx->blk_sub.retop;
2029         break;
2030     default:
2031         DIE(aTHX_ "panic: return");
2032     }
2033
2034     TAINT_NOT;
2035     if (gimme == G_SCALAR) {
2036         if (MARK < SP) {
2037             if (popsub2) {
2038                 if (cx->blk_sub.cv && CvDEPTH(cx->blk_sub.cv) > 1) {
2039                     if (SvTEMP(TOPs)) {
2040                         *++newsp = SvREFCNT_inc(*SP);
2041                         FREETMPS;
2042                         sv_2mortal(*newsp);
2043                     }
2044                     else {
2045                         sv = SvREFCNT_inc(*SP); /* FREETMPS could clobber it */
2046                         FREETMPS;
2047                         *++newsp = sv_mortalcopy(sv);
2048                         SvREFCNT_dec(sv);
2049                     }
2050                 }
2051                 else
2052                     *++newsp = (SvTEMP(*SP)) ? *SP : sv_mortalcopy(*SP);
2053             }
2054             else
2055                 *++newsp = sv_mortalcopy(*SP);
2056         }
2057         else
2058             *++newsp = &PL_sv_undef;
2059     }
2060     else if (gimme == G_ARRAY) {
2061         while (++MARK <= SP) {
2062             *++newsp = (popsub2 && SvTEMP(*MARK))
2063                         ? *MARK : sv_mortalcopy(*MARK);
2064             TAINT_NOT;          /* Each item is independent */
2065         }
2066     }
2067     PL_stack_sp = newsp;
2068
2069     LEAVE;
2070     /* Stack values are safe: */
2071     if (popsub2) {
2072         cxstack_ix--;
2073         POPSUB(cx,sv);  /* release CV and @_ ... */
2074     }
2075     else
2076         sv = NULL;
2077     PL_curpm = newpm;   /* ... and pop $1 et al */
2078
2079     LEAVESUB(sv);
2080     if (clear_errsv)
2081         sv_setpvn(ERRSV,"",0);
2082     return retop;
2083 }
2084
2085 PP(pp_last)
2086 {
2087     dVAR; dSP;
2088     I32 cxix;
2089     register PERL_CONTEXT *cx;
2090     I32 pop2 = 0;
2091     I32 gimme;
2092     I32 optype;
2093     OP *nextop;
2094     SV **newsp;
2095     PMOP *newpm;
2096     SV **mark;
2097     SV *sv = NULL;
2098
2099
2100     if (PL_op->op_flags & OPf_SPECIAL) {
2101         cxix = dopoptoloop(cxstack_ix);
2102         if (cxix < 0)
2103             DIE(aTHX_ "Can't \"last\" outside a loop block");
2104     }
2105     else {
2106         cxix = dopoptolabel(cPVOP->op_pv);
2107         if (cxix < 0)
2108             DIE(aTHX_ "Label not found for \"last %s\"", cPVOP->op_pv);
2109     }
2110     if (cxix < cxstack_ix)
2111         dounwind(cxix);
2112
2113     POPBLOCK(cx,newpm);
2114     cxstack_ix++; /* temporarily protect top context */
2115     mark = newsp;
2116     switch (CxTYPE(cx)) {
2117     case CXt_LOOP:
2118         pop2 = CXt_LOOP;
2119         newsp = PL_stack_base + cx->blk_loop.resetsp;
2120         nextop = cx->blk_loop.my_op->op_lastop->op_next;
2121         break;
2122     case CXt_SUB:
2123         pop2 = CXt_SUB;
2124         nextop = cx->blk_sub.retop;
2125         break;
2126     case CXt_EVAL:
2127         POPEVAL(cx);
2128         nextop = cx->blk_eval.retop;
2129         break;
2130     case CXt_FORMAT:
2131         POPFORMAT(cx);
2132         nextop = cx->blk_sub.retop;
2133         break;
2134     default:
2135         DIE(aTHX_ "panic: last");
2136     }
2137
2138     TAINT_NOT;
2139     if (gimme == G_SCALAR) {
2140         if (MARK < SP)
2141             *++newsp = ((pop2 == CXt_SUB) && SvTEMP(*SP))
2142                         ? *SP : sv_mortalcopy(*SP);
2143         else
2144             *++newsp = &PL_sv_undef;
2145     }
2146     else if (gimme == G_ARRAY) {
2147         while (++MARK <= SP) {
2148             *++newsp = ((pop2 == CXt_SUB) && SvTEMP(*MARK))
2149                         ? *MARK : sv_mortalcopy(*MARK);
2150             TAINT_NOT;          /* Each item is independent */
2151         }
2152     }
2153     SP = newsp;
2154     PUTBACK;
2155
2156     LEAVE;
2157     cxstack_ix--;
2158     /* Stack values are safe: */
2159     switch (pop2) {
2160     case CXt_LOOP:
2161         POPLOOP(cx);    /* release loop vars ... */
2162         LEAVE;
2163         break;
2164     case CXt_SUB:
2165         POPSUB(cx,sv);  /* release CV and @_ ... */
2166         break;
2167     }
2168     PL_curpm = newpm;   /* ... and pop $1 et al */
2169
2170     LEAVESUB(sv);
2171     PERL_UNUSED_VAR(optype);
2172     PERL_UNUSED_VAR(gimme);
2173     return nextop;
2174 }
2175
2176 PP(pp_next)
2177 {
2178     dVAR;
2179     I32 cxix;
2180     register PERL_CONTEXT *cx;
2181     I32 inner;
2182
2183     if (PL_op->op_flags & OPf_SPECIAL) {
2184         cxix = dopoptoloop(cxstack_ix);
2185         if (cxix < 0)
2186             DIE(aTHX_ "Can't \"next\" outside a loop block");
2187     }
2188     else {
2189         cxix = dopoptolabel(cPVOP->op_pv);
2190         if (cxix < 0)
2191             DIE(aTHX_ "Label not found for \"next %s\"", cPVOP->op_pv);
2192     }
2193     if (cxix < cxstack_ix)
2194         dounwind(cxix);
2195
2196     /* clear off anything above the scope we're re-entering, but
2197      * save the rest until after a possible continue block */
2198     inner = PL_scopestack_ix;
2199     TOPBLOCK(cx);
2200     if (PL_scopestack_ix < inner)
2201         leave_scope(PL_scopestack[PL_scopestack_ix]);
2202     PL_curcop = cx->blk_oldcop;
2203     return CX_LOOP_NEXTOP_GET(cx);
2204 }
2205
2206 PP(pp_redo)
2207 {
2208     dVAR;
2209     I32 cxix;
2210     register PERL_CONTEXT *cx;
2211     I32 oldsave;
2212     OP* redo_op;
2213
2214     if (PL_op->op_flags & OPf_SPECIAL) {
2215         cxix = dopoptoloop(cxstack_ix);
2216         if (cxix < 0)
2217             DIE(aTHX_ "Can't \"redo\" outside a loop block");
2218     }
2219     else {
2220         cxix = dopoptolabel(cPVOP->op_pv);
2221         if (cxix < 0)
2222             DIE(aTHX_ "Label not found for \"redo %s\"", cPVOP->op_pv);
2223     }
2224     if (cxix < cxstack_ix)
2225         dounwind(cxix);
2226
2227     redo_op = cxstack[cxix].blk_loop.my_op->op_redoop;
2228     if (redo_op->op_type == OP_ENTER) {
2229         /* pop one less context to avoid $x being freed in while (my $x..) */
2230         cxstack_ix++;
2231         assert(CxTYPE(&cxstack[cxstack_ix]) == CXt_BLOCK);
2232         redo_op = redo_op->op_next;
2233     }
2234
2235     TOPBLOCK(cx);
2236     oldsave = PL_scopestack[PL_scopestack_ix - 1];
2237     LEAVE_SCOPE(oldsave);
2238     FREETMPS;
2239     PL_curcop = cx->blk_oldcop;
2240     return redo_op;
2241 }
2242
2243 STATIC OP *
2244 S_dofindlabel(pTHX_ OP *o, const char *label, OP **opstack, OP **oplimit)
2245 {
2246     dVAR;
2247     OP **ops = opstack;
2248     static const char too_deep[] = "Target of goto is too deeply nested";
2249
2250     if (ops >= oplimit)
2251         Perl_croak(aTHX_ too_deep);
2252     if (o->op_type == OP_LEAVE ||
2253         o->op_type == OP_SCOPE ||
2254         o->op_type == OP_LEAVELOOP ||
2255         o->op_type == OP_LEAVESUB ||
2256         o->op_type == OP_LEAVETRY)
2257     {
2258         *ops++ = cUNOPo->op_first;
2259         if (ops >= oplimit)
2260             Perl_croak(aTHX_ too_deep);
2261     }
2262     *ops = 0;
2263     if (o->op_flags & OPf_KIDS) {
2264         OP *kid;
2265         /* First try all the kids at this level, since that's likeliest. */
2266         for (kid = cUNOPo->op_first; kid; kid = kid->op_sibling) {
2267             if ((kid->op_type == OP_NEXTSTATE || kid->op_type == OP_DBSTATE) &&
2268                     kCOP->cop_label && strEQ(kCOP->cop_label, label))
2269                 return kid;
2270         }
2271         for (kid = cUNOPo->op_first; kid; kid = kid->op_sibling) {
2272             if (kid == PL_lastgotoprobe)
2273                 continue;
2274             if (kid->op_type == OP_NEXTSTATE || kid->op_type == OP_DBSTATE) {
2275                 if (ops == opstack)
2276                     *ops++ = kid;
2277                 else if (ops[-1]->op_type == OP_NEXTSTATE ||
2278                          ops[-1]->op_type == OP_DBSTATE)
2279                     ops[-1] = kid;
2280                 else
2281                     *ops++ = kid;
2282             }
2283             if ((o = dofindlabel(kid, label, ops, oplimit)))
2284                 return o;
2285         }
2286     }
2287     *ops = 0;
2288     return 0;
2289 }
2290
2291 PP(pp_goto)
2292 {
2293     dVAR; dSP;
2294     OP *retop = NULL;
2295     I32 ix;
2296     register PERL_CONTEXT *cx;
2297 #define GOTO_DEPTH 64
2298     OP *enterops[GOTO_DEPTH];
2299     const char *label = NULL;
2300     const bool do_dump = (PL_op->op_type == OP_DUMP);
2301     static const char must_have_label[] = "goto must have label";
2302
2303     if (PL_op->op_flags & OPf_STACKED) {
2304         SV * const sv = POPs;
2305
2306         /* This egregious kludge implements goto &subroutine */
2307         if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVCV) {
2308             I32 cxix;
2309             register PERL_CONTEXT *cx;
2310             CV* cv = (CV*)SvRV(sv);
2311             SV** mark;
2312             I32 items = 0;
2313             I32 oldsave;
2314             bool reified = 0;
2315
2316         retry:
2317             if (!CvROOT(cv) && !CvXSUB(cv)) {
2318                 const GV * const gv = CvGV(cv);
2319                 if (gv) {
2320                     GV *autogv;
2321                     SV *tmpstr;
2322                     /* autoloaded stub? */
2323                     if (cv != GvCV(gv) && (cv = GvCV(gv)))
2324                         goto retry;
2325                     autogv = gv_autoload4(GvSTASH(gv), GvNAME(gv),
2326                                           GvNAMELEN(gv), FALSE);
2327                     if (autogv && (cv = GvCV(autogv)))
2328                         goto retry;
2329                     tmpstr = sv_newmortal();
2330                     gv_efullname3(tmpstr, gv, NULL);
2331                     DIE(aTHX_ "Goto undefined subroutine &%"SVf"", SVfARG(tmpstr));
2332                 }
2333                 DIE(aTHX_ "Goto undefined subroutine");
2334             }
2335
2336             /* First do some returnish stuff. */
2337             SvREFCNT_inc_simple_void(cv); /* avoid premature free during unwind */
2338             FREETMPS;
2339             cxix = dopoptosub(cxstack_ix);
2340             if (cxix < 0)
2341                 DIE(aTHX_ "Can't goto subroutine outside a subroutine");
2342             if (cxix < cxstack_ix)
2343                 dounwind(cxix);
2344             TOPBLOCK(cx);
2345             SPAGAIN;
2346             /* ban goto in eval: see <20050521150056.GC20213@iabyn.com> */
2347             if (CxTYPE(cx) == CXt_EVAL) {
2348                 if (CxREALEVAL(cx))
2349                     DIE(aTHX_ "Can't goto subroutine from an eval-string");
2350                 else
2351                     DIE(aTHX_ "Can't goto subroutine from an eval-block");
2352             }
2353             else if (CxMULTICALL(cx))
2354                 DIE(aTHX_ "Can't goto subroutine from a sort sub (or similar callback)");
2355             if (CxTYPE(cx) == CXt_SUB && cx->blk_sub.hasargs) {
2356                 /* put @_ back onto stack */
2357                 AV* av = cx->blk_sub.argarray;
2358
2359                 items = AvFILLp(av) + 1;
2360                 EXTEND(SP, items+1); /* @_ could have been extended. */
2361                 Copy(AvARRAY(av), SP + 1, items, SV*);
2362                 SvREFCNT_dec(GvAV(PL_defgv));
2363                 GvAV(PL_defgv) = cx->blk_sub.savearray;
2364                 CLEAR_ARGARRAY(av);
2365                 /* abandon @_ if it got reified */
2366                 if (AvREAL(av)) {
2367                     reified = 1;
2368                     SvREFCNT_dec(av);
2369                     av = newAV();
2370                     av_extend(av, items-1);
2371                     AvREIFY_only(av);
2372                     PAD_SVl(0) = (SV*)(cx->blk_sub.argarray = av);
2373                 }
2374             }
2375             else if (CvISXSUB(cv)) {    /* put GvAV(defgv) back onto stack */
2376                 AV* const av = GvAV(PL_defgv);
2377                 items = AvFILLp(av) + 1;
2378                 EXTEND(SP, items+1); /* @_ could have been extended. */
2379                 Copy(AvARRAY(av), SP + 1, items, SV*);
2380             }
2381             mark = SP;
2382             SP += items;
2383             if (CxTYPE(cx) == CXt_SUB &&
2384                 !(CvDEPTH(cx->blk_sub.cv) = cx->blk_sub.olddepth))
2385                 SvREFCNT_dec(cx->blk_sub.cv);
2386             oldsave = PL_scopestack[PL_scopestack_ix - 1];
2387             LEAVE_SCOPE(oldsave);
2388
2389             /* Now do some callish stuff. */
2390             SAVETMPS;
2391             SAVEFREESV(cv); /* later, undo the 'avoid premature free' hack */
2392             if (CvISXSUB(cv)) {
2393                 OP* const retop = cx->blk_sub.retop;
2394                 SV **newsp;
2395                 I32 gimme;
2396                 if (reified) {
2397                     I32 index;
2398                     for (index=0; index<items; index++)
2399                         sv_2mortal(SP[-index]);
2400                 }
2401
2402                 /* XS subs don't have a CxSUB, so pop it */
2403                 POPBLOCK(cx, PL_curpm);
2404                 /* Push a mark for the start of arglist */
2405                 PUSHMARK(mark);
2406                 PUTBACK;
2407                 (void)(*CvXSUB(cv))(aTHX_ cv);
2408                 LEAVE;
2409                 return retop;
2410             }
2411             else {
2412                 AV* const padlist = CvPADLIST(cv);
2413                 if (CxTYPE(cx) == CXt_EVAL) {
2414                     PL_in_eval = cx->blk_eval.old_in_eval;
2415                     PL_eval_root = cx->blk_eval.old_eval_root;
2416                     cx->cx_type = CXt_SUB;
2417                     cx->blk_sub.hasargs = 0;
2418                 }
2419                 cx->blk_sub.cv = cv;
2420                 cx->blk_sub.olddepth = CvDEPTH(cv);
2421
2422                 CvDEPTH(cv)++;
2423                 if (CvDEPTH(cv) < 2)
2424                     SvREFCNT_inc_simple_void_NN(cv);
2425                 else {
2426                     if (CvDEPTH(cv) == 100 && ckWARN(WARN_RECURSION))
2427                         sub_crush_depth(cv);
2428                     pad_push(padlist, CvDEPTH(cv));
2429                 }
2430                 SAVECOMPPAD();
2431                 PAD_SET_CUR_NOSAVE(padlist, CvDEPTH(cv));
2432                 if (cx->blk_sub.hasargs)
2433                 {
2434                     AV* const av = (AV*)PAD_SVl(0);
2435
2436                     cx->blk_sub.savearray = GvAV(PL_defgv);
2437                     GvAV(PL_defgv) = (AV*)SvREFCNT_inc_simple(av);
2438                     CX_CURPAD_SAVE(cx->blk_sub);
2439                     cx->blk_sub.argarray = av;
2440
2441                     if (items >= AvMAX(av) + 1) {
2442                         SV **ary = AvALLOC(av);
2443                         if (AvARRAY(av) != ary) {
2444                             AvMAX(av) += AvARRAY(av) - AvALLOC(av);
2445                             AvARRAY(av) = ary;
2446                         }
2447                         if (items >= AvMAX(av) + 1) {
2448                             AvMAX(av) = items - 1;
2449                             Renew(ary,items+1,SV*);
2450                             AvALLOC(av) = ary;
2451                             AvARRAY(av) = ary;
2452                         }
2453                     }
2454                     ++mark;
2455                     Copy(mark,AvARRAY(av),items,SV*);
2456                     AvFILLp(av) = items - 1;
2457                     assert(!AvREAL(av));
2458                     if (reified) {
2459                         /* transfer 'ownership' of refcnts to new @_ */
2460                         AvREAL_on(av);
2461                         AvREIFY_off(av);
2462                     }
2463                     while (items--) {
2464                         if (*mark)
2465                             SvTEMP_off(*mark);
2466                         mark++;
2467                     }
2468                 }
2469                 if (PERLDB_SUB) {       /* Checking curstash breaks DProf. */
2470                     Perl_get_db_sub(aTHX_ NULL, cv);
2471                     if (PERLDB_GOTO) {
2472                         CV * const gotocv = get_cv("DB::goto", FALSE);
2473                         if (gotocv) {
2474                             PUSHMARK( PL_stack_sp );
2475                             call_sv((SV*)gotocv, G_SCALAR | G_NODEBUG);
2476                             PL_stack_sp--;
2477                         }
2478                     }
2479                 }
2480                 RETURNOP(CvSTART(cv));
2481             }
2482         }
2483         else {
2484             label = SvPV_nolen_const(sv);
2485             if (!(do_dump || *label))
2486                 DIE(aTHX_ must_have_label);
2487         }
2488     }
2489     else if (PL_op->op_flags & OPf_SPECIAL) {
2490         if (! do_dump)
2491             DIE(aTHX_ must_have_label);
2492     }
2493     else
2494         label = cPVOP->op_pv;
2495
2496     if (label && *label) {
2497         OP *gotoprobe = NULL;
2498         bool leaving_eval = FALSE;
2499         bool in_block = FALSE;
2500         PERL_CONTEXT *last_eval_cx = NULL;
2501
2502         /* find label */
2503
2504         PL_lastgotoprobe = NULL;
2505         *enterops = 0;
2506         for (ix = cxstack_ix; ix >= 0; ix--) {
2507             cx = &cxstack[ix];
2508             switch (CxTYPE(cx)) {
2509             case CXt_EVAL:
2510                 leaving_eval = TRUE;
2511                 if (!CxTRYBLOCK(cx)) {
2512                     gotoprobe = (last_eval_cx ?
2513                                 last_eval_cx->blk_eval.old_eval_root :
2514                                 PL_eval_root);
2515                     last_eval_cx = cx;
2516                     break;
2517                 }
2518                 /* else fall through */
2519             case CXt_LOOP:
2520                 gotoprobe = cx->blk_oldcop->op_sibling;
2521                 break;
2522             case CXt_SUBST:
2523                 continue;
2524             case CXt_BLOCK:
2525                 if (ix) {
2526                     gotoprobe = cx->blk_oldcop->op_sibling;
2527                     in_block = TRUE;
2528                 } else
2529                     gotoprobe = PL_main_root;
2530                 break;
2531             case CXt_SUB:
2532                 if (CvDEPTH(cx->blk_sub.cv) && !CxMULTICALL(cx)) {
2533                     gotoprobe = CvROOT(cx->blk_sub.cv);
2534                     break;
2535                 }
2536                 /* FALL THROUGH */
2537             case CXt_FORMAT:
2538             case CXt_NULL:
2539                 DIE(aTHX_ "Can't \"goto\" out of a pseudo block");
2540             default:
2541                 if (ix)
2542                     DIE(aTHX_ "panic: goto");
2543                 gotoprobe = PL_main_root;
2544                 break;
2545             }
2546             if (gotoprobe) {
2547                 retop = dofindlabel(gotoprobe, label,
2548                                     enterops, enterops + GOTO_DEPTH);
2549                 if (retop)
2550                     break;
2551             }
2552             PL_lastgotoprobe = gotoprobe;
2553         }
2554         if (!retop)
2555             DIE(aTHX_ "Can't find label %s", label);
2556
2557         /* if we're leaving an eval, check before we pop any frames
2558            that we're not going to punt, otherwise the error
2559            won't be caught */
2560
2561         if (leaving_eval && *enterops && enterops[1]) {
2562             I32 i;
2563             for (i = 1; enterops[i]; i++)
2564                 if (enterops[i]->op_type == OP_ENTERITER)
2565                     DIE(aTHX_ "Can't \"goto\" into the middle of a foreach loop");
2566         }
2567
2568         /* pop unwanted frames */
2569
2570         if (ix < cxstack_ix) {
2571             I32 oldsave;
2572
2573             if (ix < 0)
2574                 ix = 0;
2575             dounwind(ix);
2576             TOPBLOCK(cx);
2577             oldsave = PL_scopestack[PL_scopestack_ix];
2578             LEAVE_SCOPE(oldsave);
2579         }
2580
2581         /* push wanted frames */
2582
2583         if (*enterops && enterops[1]) {
2584             OP * const oldop = PL_op;
2585             ix = enterops[1]->op_type == OP_ENTER && in_block ? 2 : 1;
2586             for (; enterops[ix]; ix++) {
2587                 PL_op = enterops[ix];
2588                 /* Eventually we may want to stack the needed arguments
2589                  * for each op.  For now, we punt on the hard ones. */
2590                 if (PL_op->op_type == OP_ENTERITER)
2591                     DIE(aTHX_ "Can't \"goto\" into the middle of a foreach loop");
2592                 CALL_FPTR(PL_op->op_ppaddr)(aTHX);
2593             }
2594             PL_op = oldop;
2595         }
2596     }
2597
2598     if (do_dump) {
2599 #ifdef VMS
2600         if (!retop) retop = PL_main_start;
2601 #endif
2602         PL_restartop = retop;
2603         PL_do_undump = TRUE;
2604
2605         my_unexec();
2606
2607         PL_restartop = 0;               /* hmm, must be GNU unexec().. */
2608         PL_do_undump = FALSE;
2609     }
2610
2611     RETURNOP(retop);
2612 }
2613
2614 PP(pp_exit)
2615 {
2616     dVAR;
2617     dSP;
2618     I32 anum;
2619
2620     if (MAXARG < 1)
2621         anum = 0;
2622     else {
2623         anum = SvIVx(POPs);
2624 #ifdef VMS
2625         if (anum == 1 && (PL_op->op_private & OPpEXIT_VMSISH))
2626             anum = 0;
2627         VMSISH_HUSHED  = VMSISH_HUSHED || (PL_op->op_private & OPpHUSH_VMSISH);
2628 #endif
2629     }
2630     PL_exit_flags |= PERL_EXIT_EXPECTED;
2631 #ifdef PERL_MAD
2632     /* KLUDGE: disable exit 0 in BEGIN blocks when we're just compiling */
2633     if (anum || !(PL_minus_c && PL_madskills))
2634         my_exit(anum);
2635 #else
2636     my_exit(anum);
2637 #endif
2638     PUSHs(&PL_sv_undef);
2639     RETURN;
2640 }
2641
2642 /* Eval. */
2643
2644 STATIC void
2645 S_save_lines(pTHX_ AV *array, SV *sv)
2646 {
2647     const char *s = SvPVX_const(sv);
2648     const char * const send = SvPVX_const(sv) + SvCUR(sv);
2649     I32 line = 1;
2650
2651     while (s && s < send) {
2652         const char *t;
2653         SV * const tmpstr = newSV_type(SVt_PVMG);
2654
2655         t = strchr(s, '\n');
2656         if (t)
2657             t++;
2658         else
2659             t = send;
2660
2661         sv_setpvn(tmpstr, s, t - s);
2662         av_store(array, line++, tmpstr);
2663         s = t;
2664     }
2665 }
2666
2667 STATIC void
2668 S_docatch_body(pTHX)
2669 {
2670     dVAR;
2671     CALLRUNOPS(aTHX);
2672     return;
2673 }
2674
2675 STATIC OP *
2676 S_docatch(pTHX_ OP *o)
2677 {
2678     dVAR;
2679     int ret;
2680     OP * const oldop = PL_op;
2681     dJMPENV;
2682
2683 #ifdef DEBUGGING
2684     assert(CATCH_GET == TRUE);
2685 #endif
2686     PL_op = o;
2687
2688     JMPENV_PUSH(ret);
2689     switch (ret) {
2690     case 0:
2691         assert(cxstack_ix >= 0);
2692         assert(CxTYPE(&cxstack[cxstack_ix]) == CXt_EVAL);
2693         cxstack[cxstack_ix].blk_eval.cur_top_env = PL_top_env;
2694  redo_body:
2695         docatch_body();
2696         break;
2697     case 3:
2698         /* die caught by an inner eval - continue inner loop */
2699
2700         /* NB XXX we rely on the old popped CxEVAL still being at the top
2701          * of the stack; the way die_where() currently works, this
2702          * assumption is valid. In theory The cur_top_env value should be
2703          * returned in another global, the way retop (aka PL_restartop)
2704          * is. */
2705         assert(CxTYPE(&cxstack[cxstack_ix+1]) == CXt_EVAL);
2706
2707         if (PL_restartop
2708             && cxstack[cxstack_ix+1].blk_eval.cur_top_env == PL_top_env)
2709         {
2710             PL_op = PL_restartop;
2711             PL_restartop = 0;
2712             goto redo_body;
2713         }
2714         /* FALL THROUGH */
2715     default:
2716         JMPENV_POP;
2717         PL_op = oldop;
2718         JMPENV_JUMP(ret);
2719         /* NOTREACHED */
2720     }
2721     JMPENV_POP;
2722     PL_op = oldop;
2723     return NULL;
2724 }
2725
2726 OP *
2727 Perl_sv_compile_2op(pTHX_ SV *sv, OP** startop, const char *code, PAD** padp)
2728 /* sv Text to convert to OP tree. */
2729 /* startop op_free() this to undo. */
2730 /* code Short string id of the caller. */
2731 {
2732     /* FIXME - how much of this code is common with pp_entereval?  */
2733     dVAR; dSP;                          /* Make POPBLOCK work. */
2734     PERL_CONTEXT *cx;
2735     SV **newsp;
2736     I32 gimme = G_VOID;
2737     I32 optype;
2738     OP dummy;
2739     OP *rop;
2740     char tbuf[TYPE_DIGITS(long) + 12 + 10];
2741     char *tmpbuf = tbuf;
2742     char *safestr;
2743     int runtime;
2744     CV* runcv = NULL;   /* initialise to avoid compiler warnings */
2745     STRLEN len;
2746
2747     ENTER;
2748     lex_start(sv);
2749     SAVETMPS;
2750     /* switch to eval mode */
2751
2752     if (IN_PERL_COMPILETIME) {
2753         SAVECOPSTASH_FREE(&PL_compiling);
2754         CopSTASH_set(&PL_compiling, PL_curstash);
2755     }
2756     if (PERLDB_NAMEEVAL && CopLINE(PL_curcop)) {
2757         SV * const sv = sv_newmortal();
2758         Perl_sv_setpvf(aTHX_ sv, "_<(%.10seval %lu)[%s:%"IVdf"]",
2759                        code, (unsigned long)++PL_evalseq,
2760                        CopFILE(PL_curcop), (IV)CopLINE(PL_curcop));
2761         tmpbuf = SvPVX(sv);
2762         len = SvCUR(sv);
2763     }
2764     else
2765         len = my_snprintf(tmpbuf, sizeof(tbuf), "_<(%.10s_eval %lu)", code,
2766                           (unsigned long)++PL_evalseq);
2767     SAVECOPFILE_FREE(&PL_compiling);
2768     CopFILE_set(&PL_compiling, tmpbuf+2);
2769     SAVECOPLINE(&PL_compiling);
2770     CopLINE_set(&PL_compiling, 1);
2771     /* XXX For C<eval "...">s within BEGIN {} blocks, this ends up
2772        deleting the eval's FILEGV from the stash before gv_check() runs
2773        (i.e. before run-time proper). To work around the coredump that
2774        ensues, we always turn GvMULTI_on for any globals that were
2775        introduced within evals. See force_ident(). GSAR 96-10-12 */
2776     safestr = savepvn(tmpbuf, len);
2777     SAVEDELETE(PL_defstash, safestr, len);
2778     SAVEHINTS();
2779 #ifdef OP_IN_REGISTER
2780     PL_opsave = op;
2781 #else
2782     SAVEVPTR(PL_op);
2783 #endif
2784
2785     /* we get here either during compilation, or via pp_regcomp at runtime */
2786     runtime = IN_PERL_RUNTIME;
2787     if (runtime)
2788         runcv = find_runcv(NULL);
2789
2790     PL_op = &dummy;
2791     PL_op->op_type = OP_ENTEREVAL;
2792     PL_op->op_flags = 0;                        /* Avoid uninit warning. */
2793     PUSHBLOCK(cx, CXt_EVAL|(IN_PERL_COMPILETIME ? 0 : CXp_REAL), SP);
2794     PUSHEVAL(cx, 0, NULL);
2795
2796     if (runtime)
2797         rop = doeval(G_SCALAR, startop, runcv, PL_curcop->cop_seq);
2798     else
2799         rop = doeval(G_SCALAR, startop, PL_compcv, PL_cop_seqmax);
2800     POPBLOCK(cx,PL_curpm);
2801     POPEVAL(cx);
2802
2803     (*startop)->op_type = OP_NULL;
2804     (*startop)->op_ppaddr = PL_ppaddr[OP_NULL];
2805     lex_end();
2806     /* XXX DAPM do this properly one year */
2807     *padp = (AV*)SvREFCNT_inc_simple(PL_comppad);
2808     LEAVE;
2809     if (IN_PERL_COMPILETIME)
2810         CopHINTS_set(&PL_compiling, PL_hints);
2811 #ifdef OP_IN_REGISTER
2812     op = PL_opsave;
2813 #endif
2814     PERL_UNUSED_VAR(newsp);
2815     PERL_UNUSED_VAR(optype);
2816
2817     return rop;
2818 }
2819
2820
2821 /*
2822 =for apidoc find_runcv
2823
2824 Locate the CV corresponding to the currently executing sub or eval.
2825 If db_seqp is non_null, skip CVs that are in the DB package and populate
2826 *db_seqp with the cop sequence number at the point that the DB:: code was
2827 entered. (allows debuggers to eval in the scope of the breakpoint rather
2828 than in the scope of the debugger itself).
2829
2830 =cut
2831 */
2832
2833 CV*
2834 Perl_find_runcv(pTHX_ U32 *db_seqp)
2835 {
2836     dVAR;
2837     PERL_SI      *si;
2838
2839     if (db_seqp)
2840         *db_seqp = PL_curcop->cop_seq;
2841     for (si = PL_curstackinfo; si; si = si->si_prev) {
2842         I32 ix;
2843         for (ix = si->si_cxix; ix >= 0; ix--) {
2844             const PERL_CONTEXT *cx = &(si->si_cxstack[ix]);
2845             if (CxTYPE(cx) == CXt_SUB || CxTYPE(cx) == CXt_FORMAT) {
2846                 CV * const cv = cx->blk_sub.cv;
2847                 /* skip DB:: code */
2848                 if (db_seqp && PL_debstash && CvSTASH(cv) == PL_debstash) {
2849                     *db_seqp = cx->blk_oldcop->cop_seq;
2850                     continue;
2851                 }
2852                 return cv;
2853             }
2854             else if (CxTYPE(cx) == CXt_EVAL && !CxTRYBLOCK(cx))
2855                 return PL_compcv;
2856         }
2857     }
2858     return PL_main_cv;
2859 }
2860
2861
2862 /* Compile a require/do, an eval '', or a /(?{...})/.
2863  * In the last case, startop is non-null, and contains the address of
2864  * a pointer that should be set to the just-compiled code.
2865  * outside is the lexically enclosing CV (if any) that invoked us.
2866  */
2867
2868 STATIC OP *
2869 S_doeval(pTHX_ int gimme, OP** startop, CV* outside, U32 seq)
2870 {
2871     dVAR; dSP;
2872     OP * const saveop = PL_op;
2873
2874     PL_in_eval = ((saveop && saveop->op_type == OP_REQUIRE)
2875                   ? (EVAL_INREQUIRE | (PL_in_eval & EVAL_INEVAL))
2876                   : EVAL_INEVAL);
2877
2878     PUSHMARK(SP);
2879
2880     SAVESPTR(PL_compcv);
2881     PL_compcv = (CV*)newSV_type(SVt_PVCV);
2882     CvEVAL_on(PL_compcv);
2883     assert(CxTYPE(&cxstack[cxstack_ix]) == CXt_EVAL);
2884     cxstack[cxstack_ix].blk_eval.cv = PL_compcv;
2885
2886     CvOUTSIDE_SEQ(PL_compcv) = seq;
2887     CvOUTSIDE(PL_compcv) = (CV*)SvREFCNT_inc_simple(outside);
2888
2889     /* set up a scratch pad */
2890
2891     CvPADLIST(PL_compcv) = pad_new(padnew_SAVE);
2892     PL_op = NULL; /* avoid PL_op and PL_curpad referring to different CVs */
2893
2894
2895     if (!PL_madskills)
2896         SAVEMORTALIZESV(PL_compcv);     /* must remain until end of current statement */
2897
2898     /* make sure we compile in the right package */
2899
2900     if (CopSTASH_ne(PL_curcop, PL_curstash)) {
2901         SAVESPTR(PL_curstash);
2902         PL_curstash = CopSTASH(PL_curcop);
2903     }
2904     /* XXX:ajgo do we really need to alloc an AV for begin/checkunit */
2905     SAVESPTR(PL_beginav);
2906     PL_beginav = newAV();
2907     SAVEFREESV(PL_beginav);
2908     SAVESPTR(PL_unitcheckav);
2909     PL_unitcheckav = newAV();
2910     SAVEFREESV(PL_unitcheckav);
2911     SAVEI32(PL_error_count);
2912
2913 #ifdef PERL_MAD
2914     SAVEBOOL(PL_madskills);
2915     PL_madskills = 0;
2916 #endif
2917
2918     /* try to compile it */
2919
2920     PL_eval_root = NULL;
2921     PL_error_count = 0;
2922     PL_curcop = &PL_compiling;
2923     CopARYBASE_set(PL_curcop, 0);
2924     if (saveop && (saveop->op_type != OP_REQUIRE) && (saveop->op_flags & OPf_SPECIAL))
2925         PL_in_eval |= EVAL_KEEPERR;
2926     else
2927         sv_setpvn(ERRSV,"",0);
2928     if (yyparse() || PL_error_count || !PL_eval_root) {
2929         SV **newsp;                     /* Used by POPBLOCK. */
2930         PERL_CONTEXT *cx = &cxstack[cxstack_ix];
2931         I32 optype = 0;                 /* Might be reset by POPEVAL. */
2932         const char *msg;
2933
2934         PL_op = saveop;
2935         if (PL_eval_root) {
2936             op_free(PL_eval_root);
2937             PL_eval_root = NULL;
2938         }
2939         SP = PL_stack_base + POPMARK;           /* pop original mark */
2940         if (!startop) {
2941             POPBLOCK(cx,PL_curpm);
2942             POPEVAL(cx);
2943         }
2944         lex_end();
2945         LEAVE;
2946
2947         msg = SvPVx_nolen_const(ERRSV);
2948         if (optype == OP_REQUIRE) {
2949             const SV * const nsv = cx->blk_eval.old_namesv;
2950             (void)hv_store(GvHVn(PL_incgv), SvPVX_const(nsv), SvCUR(nsv),
2951                           &PL_sv_undef, 0);
2952             DIE(aTHX_ "%sCompilation failed in require",
2953                 *msg ? msg : "Unknown error\n");
2954         }
2955         else if (startop) {
2956             POPBLOCK(cx,PL_curpm);
2957             POPEVAL(cx);
2958             Perl_croak(aTHX_ "%sCompilation failed in regexp",
2959                        (*msg ? msg : "Unknown error\n"));
2960         }
2961         else {
2962             if (!*msg) {
2963                 sv_setpvs(ERRSV, "Compilation error");
2964             }
2965         }
2966         PERL_UNUSED_VAR(newsp);
2967         RETPUSHUNDEF;
2968     }
2969     CopLINE_set(&PL_compiling, 0);
2970     if (startop) {
2971         *startop = PL_eval_root;
2972     } else
2973         SAVEFREEOP(PL_eval_root);
2974
2975     /* Set the context for this new optree.
2976      * If the last op is an OP_REQUIRE, force scalar context.
2977      * Otherwise, propagate the context from the eval(). */
2978     if (PL_eval_root->op_type == OP_LEAVEEVAL
2979             && cUNOPx(PL_eval_root)->op_first->op_type == OP_LINESEQ
2980             && cLISTOPx(cUNOPx(PL_eval_root)->op_first)->op_last->op_type
2981             == OP_REQUIRE)
2982         scalar(PL_eval_root);
2983     else if (gimme & G_VOID)
2984         scalarvoid(PL_eval_root);
2985     else if (gimme & G_ARRAY)
2986         list(PL_eval_root);
2987     else
2988         scalar(PL_eval_root);
2989
2990     DEBUG_x(dump_eval());
2991
2992     /* Register with debugger: */
2993     if (PERLDB_INTER && saveop && saveop->op_type == OP_REQUIRE) {
2994         CV * const cv = get_cv("DB::postponed", FALSE);
2995         if (cv) {
2996             dSP;
2997             PUSHMARK(SP);
2998             XPUSHs((SV*)CopFILEGV(&PL_compiling));
2999             PUTBACK;
3000             call_sv((SV*)cv, G_DISCARD);
3001         }
3002     }
3003
3004     if (PL_unitcheckav)
3005         call_list(PL_scopestack_ix, PL_unitcheckav);
3006
3007     /* compiled okay, so do it */
3008
3009     CvDEPTH(PL_compcv) = 1;
3010     SP = PL_stack_base + POPMARK;               /* pop original mark */
3011     PL_op = saveop;                     /* The caller may need it. */
3012     PL_lex_state = LEX_NOTPARSING;      /* $^S needs this. */
3013
3014     RETURNOP(PL_eval_start);
3015 }
3016
3017 STATIC PerlIO *
3018 S_check_type_and_open(pTHX_ const char *name, const char *mode)
3019 {
3020     Stat_t st;
3021     const int st_rc = PerlLIO_stat(name, &st);
3022
3023     if (st_rc < 0 || S_ISDIR(st.st_mode) || S_ISBLK(st.st_mode)) {
3024         return NULL;
3025     }
3026
3027     return PerlIO_open(name, mode);
3028 }
3029
3030 STATIC PerlIO *
3031 S_doopen_pm(pTHX_ const char *name, const char *mode)
3032 {
3033 #ifndef PERL_DISABLE_PMC
3034     const STRLEN namelen = strlen(name);
3035     PerlIO *fp;
3036
3037     if (namelen > 3 && strEQ(name + namelen - 3, ".pm")) {
3038         SV * const pmcsv = Perl_newSVpvf(aTHX_ "%s%c", name, 'c');
3039         const char * const pmc = SvPV_nolen_const(pmcsv);
3040         Stat_t pmcstat;
3041         if (PerlLIO_stat(pmc, &pmcstat) < 0) {
3042             fp = check_type_and_open(name, mode);
3043         }
3044         else {
3045             fp = check_type_and_open(pmc, mode);
3046         }
3047         SvREFCNT_dec(pmcsv);
3048     }
3049     else {
3050         fp = check_type_and_open(name, mode);
3051     }
3052     return fp;
3053 #else
3054     return check_type_and_open(name, mode);
3055 #endif /* !PERL_DISABLE_PMC */
3056 }
3057
3058 PP(pp_require)
3059 {
3060     dVAR; dSP;
3061     register PERL_CONTEXT *cx;
3062     SV *sv;
3063     const char *name;
3064     STRLEN len;
3065     const char *tryname = NULL;
3066     SV *namesv = NULL;
3067     const I32 gimme = GIMME_V;
3068     int filter_has_file = 0;
3069     PerlIO *tryrsfp = NULL;
3070     SV *filter_cache = NULL;
3071     SV *filter_state = NULL;
3072     SV *filter_sub = NULL;
3073     SV *hook_sv = NULL;
3074     SV *encoding;
3075     OP *op;
3076
3077     sv = POPs;
3078     if ( (SvNIOKp(sv) || SvVOK(sv)) && PL_op->op_type != OP_DOFILE) {
3079         if ( SvVOK(sv) && ckWARN(WARN_PORTABLE) )       /* require v5.6.1 */
3080                 Perl_warner(aTHX_ packWARN(WARN_PORTABLE),
3081                         "v-string in use/require non-portable");
3082
3083         sv = new_version(sv);
3084         if (!sv_derived_from(PL_patchlevel, "version"))
3085             upg_version(PL_patchlevel, TRUE);
3086         if (cUNOP->op_first->op_type == OP_CONST && cUNOP->op_first->op_private & OPpCONST_NOVER) {
3087             if ( vcmp(sv,PL_patchlevel) <= 0 )
3088                 DIE(aTHX_ "Perls since %"SVf" too modern--this is %"SVf", stopped",
3089                     SVfARG(vnormal(sv)), SVfARG(vnormal(PL_patchlevel)));
3090         }
3091         else {
3092             if ( vcmp(sv,PL_patchlevel) > 0 )
3093                 DIE(aTHX_ "Perl %"SVf" required--this is only %"SVf", stopped",
3094                     SVfARG(vnormal(sv)), SVfARG(vnormal(PL_patchlevel)));
3095         }
3096
3097         /* If we request a version >= 5.9.5, load feature.pm with the
3098          * feature bundle that corresponds to the required version.
3099          * We do this only with use, not require. */
3100         if (PL_compcv && vcmp(sv, sv_2mortal(upg_version(newSVnv(5.009005), FALSE))) >= 0) {
3101             SV *const importsv = vnormal(sv);
3102             *SvPVX_mutable(importsv) = ':';
3103             ENTER;
3104             Perl_load_module(aTHX_ 0, newSVpvs("feature"), NULL, importsv, NULL);
3105             LEAVE;
3106         }
3107
3108         RETPUSHYES;
3109     }
3110     name = SvPV_const(sv, len);
3111     if (!(name && len > 0 && *name))
3112         DIE(aTHX_ "Null filename used");
3113     TAINT_PROPER("require");
3114     if (PL_op->op_type == OP_REQUIRE) {
3115         SV * const * const svp = hv_fetch(GvHVn(PL_incgv), name, len, 0);
3116         if ( svp ) {
3117             if (*svp != &PL_sv_undef)
3118                 RETPUSHYES;
3119             else
3120                 DIE(aTHX_ "Compilation failed in require");
3121         }
3122     }
3123
3124     /* prepare to compile file */
3125
3126     if (path_is_absolute(name)) {
3127         tryname = name;
3128         tryrsfp = doopen_pm(name,PERL_SCRIPT_MODE);
3129     }
3130 #ifdef MACOS_TRADITIONAL
3131     if (!tryrsfp) {
3132         char newname[256];
3133
3134         MacPerl_CanonDir(name, newname, 1);
3135         if (path_is_absolute(newname)) {
3136             tryname = newname;
3137             tryrsfp = doopen_pm(newname,PERL_SCRIPT_MODE);
3138         }
3139     }
3140 #endif
3141     if (!tryrsfp) {
3142         AV * const ar = GvAVn(PL_incgv);
3143         I32 i;
3144 #ifdef VMS
3145         char *unixname;
3146         if ((unixname = tounixspec(name, NULL)) != NULL)
3147 #endif
3148         {
3149             namesv = newSV(0);
3150             for (i = 0; i <= AvFILL(ar); i++) {
3151                 SV * const dirsv = *av_fetch(ar, i, TRUE);
3152
3153                 if (SvTIED_mg((SV*)ar, PERL_MAGIC_tied))
3154                     mg_get(dirsv);
3155                 if (SvROK(dirsv)) {
3156                     int count;
3157                     SV **svp;
3158                     SV *loader = dirsv;
3159
3160                     if (SvTYPE(SvRV(loader)) == SVt_PVAV
3161                         && !sv_isobject(loader))
3162                     {
3163                         loader = *av_fetch((AV *)SvRV(loader), 0, TRUE);
3164                     }
3165
3166                     Perl_sv_setpvf(aTHX_ namesv, "/loader/0x%"UVxf"/%s",
3167                                    PTR2UV(SvRV(dirsv)), name);
3168                     tryname = SvPVX_const(namesv);
3169                     tryrsfp = NULL;
3170
3171                     ENTER;
3172                     SAVETMPS;
3173                     EXTEND(SP, 2);
3174
3175                     PUSHMARK(SP);
3176                     PUSHs(dirsv);
3177                     PUSHs(sv);
3178                     PUTBACK;
3179                     if (sv_isobject(loader))
3180                         count = call_method("INC", G_ARRAY);
3181                     else
3182                         count = call_sv(loader, G_ARRAY);
3183                     SPAGAIN;
3184
3185                     /* Adjust file name if the hook has set an %INC entry */
3186                     svp = hv_fetch(GvHVn(PL_incgv), name, len, 0);
3187                     if (svp)
3188                         tryname = SvPVX_const(*svp);
3189
3190                     if (count > 0) {
3191                         int i = 0;
3192                         SV *arg;
3193
3194                         SP -= count - 1;
3195                         arg = SP[i++];
3196
3197                         if (SvROK(arg) && (SvTYPE(SvRV(arg)) <= SVt_PVLV)
3198                             && !isGV_with_GP(SvRV(arg))) {
3199                             filter_cache = SvRV(arg);
3200                             SvREFCNT_inc_simple_void_NN(filter_cache);
3201
3202                             if (i < count) {
3203                                 arg = SP[i++];
3204                             }
3205                         }
3206
3207                         if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVGV) {
3208                             arg = SvRV(arg);
3209                         }
3210
3211                         if (SvTYPE(arg) == SVt_PVGV) {
3212                             IO * const io = GvIO((GV *)arg);
3213
3214                             ++filter_has_file;
3215
3216                             if (io) {
3217                                 tryrsfp = IoIFP(io);
3218                                 if (IoOFP(io) && IoOFP(io) != IoIFP(io)) {
3219                                     PerlIO_close(IoOFP(io));
3220                                 }
3221                                 IoIFP(io) = NULL;
3222                                 IoOFP(io) = NULL;
3223                             }
3224
3225                             if (i < count) {
3226                                 arg = SP[i++];
3227                             }
3228                         }
3229
3230                         if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVCV) {
3231                             filter_sub = arg;
3232                             SvREFCNT_inc_simple_void_NN(filter_sub);
3233
3234                             if (i < count) {
3235                                 filter_state = SP[i];
3236                                 SvREFCNT_inc_simple_void(filter_state);
3237                             }
3238                         }
3239
3240                         if (!tryrsfp && (filter_cache || filter_sub)) {
3241                             tryrsfp = PerlIO_open(BIT_BUCKET,
3242                                                   PERL_SCRIPT_MODE);
3243                         }
3244                         SP--;
3245                     }
3246
3247                     PUTBACK;
3248                     FREETMPS;
3249                     LEAVE;
3250
3251                     if (tryrsfp) {
3252                         hook_sv = dirsv;
3253                         break;
3254                     }
3255
3256                     filter_has_file = 0;
3257                     if (filter_cache) {
3258                         SvREFCNT_dec(filter_cache);
3259                         filter_cache = NULL;
3260                     }
3261                     if (filter_state) {
3262                         SvREFCNT_dec(filter_state);
3263                         filter_state = NULL;
3264                     }
3265                     if (filter_sub) {
3266                         SvREFCNT_dec(filter_sub);
3267                         filter_sub = NULL;
3268                     }
3269                 }
3270                 else {
3271                   if (!path_is_absolute(name)
3272 #ifdef MACOS_TRADITIONAL
3273                         /* We consider paths of the form :a:b ambiguous and interpret them first
3274                            as global then as local
3275                         */
3276                         || (*name == ':' && name[1] != ':' && strchr(name+2, ':'))
3277 #endif
3278                   ) {
3279                     const char *dir = SvPV_nolen_const(dirsv);
3280 #ifdef MACOS_TRADITIONAL
3281                     char buf1[256];
3282                     char buf2[256];
3283
3284                     MacPerl_CanonDir(name, buf2, 1);
3285                     Perl_sv_setpvf(aTHX_ namesv, "%s%s", MacPerl_CanonDir(dir, buf1, 0), buf2+(buf2[0] == ':'));
3286 #else
3287 #  ifdef VMS
3288                     char *unixdir;
3289                     if ((unixdir = tounixpath(dir, NULL)) == NULL)
3290                         continue;
3291                     sv_setpv(namesv, unixdir);
3292                     sv_catpv(namesv, unixname);
3293 #  else
3294 #    ifdef __SYMBIAN32__
3295                     if (PL_origfilename[0] &&
3296                         PL_origfilename[1] == ':' &&
3297                         !(dir[0] && dir[1] == ':'))
3298                         Perl_sv_setpvf(aTHX_ namesv,
3299                                        "%c:%s\\%s",
3300                                        PL_origfilename[0],
3301                                        dir, name);
3302                     else
3303                         Perl_sv_setpvf(aTHX_ namesv,
3304                                        "%s\\%s",
3305                                        dir, name);
3306 #    else
3307                     Perl_sv_setpvf(aTHX_ namesv, "%s/%s", dir, name);
3308 #    endif
3309 #  endif
3310 #endif
3311                     TAINT_PROPER("require");
3312                     tryname = SvPVX_const(namesv);
3313                     tryrsfp = doopen_pm(tryname, PERL_SCRIPT_MODE);
3314                     if (tryrsfp) {
3315                         if (tryname[0] == '.' && tryname[1] == '/')
3316                             tryname += 2;
3317                         break;
3318                     }
3319                     else if (errno == EMFILE)
3320                         /* no point in trying other paths if out of handles */
3321                         break;
3322                   }
3323                 }
3324             }
3325         }
3326     }
3327     SAVECOPFILE_FREE(&PL_compiling);
3328     CopFILE_set(&PL_compiling, tryrsfp ? tryname : name);
3329     SvREFCNT_dec(namesv);
3330     if (!tryrsfp) {
3331         if (PL_op->op_type == OP_REQUIRE) {
3332             const char *msgstr = name;
3333             if(errno == EMFILE) {
3334                 SV * const msg
3335                     = sv_2mortal(Perl_newSVpvf(aTHX_ "%s:   %s", msgstr,
3336                                                Strerror(errno)));
3337                 msgstr = SvPV_nolen_const(msg);
3338             } else {
3339                 if (namesv) {                   /* did we lookup @INC? */
3340                     AV * const ar = GvAVn(PL_incgv);
3341                     I32 i;
3342                     SV * const msg = sv_2mortal(Perl_newSVpvf(aTHX_ 
3343                         "%s in @INC%s%s (@INC contains:",
3344                         msgstr,
3345                         (instr(msgstr, ".h ")
3346                          ? " (change .h to .ph maybe?)" : ""),
3347                         (instr(msgstr, ".ph ")
3348                          ? " (did you run h2ph?)" : "")
3349                                                               ));
3350                     
3351                     for (i = 0; i <= AvFILL(ar); i++) {
3352                         sv_catpvs(msg, " ");
3353                         sv_catsv(msg, *av_fetch(ar, i, TRUE));
3354                     }
3355                     sv_catpvs(msg, ")");
3356                     msgstr = SvPV_nolen_const(msg);
3357                 }    
3358             }
3359             DIE(aTHX_ "Can't locate %s", msgstr);
3360         }
3361
3362         RETPUSHUNDEF;
3363     }
3364     else
3365         SETERRNO(0, SS_NORMAL);
3366
3367     /* Assume success here to prevent recursive requirement. */
3368     /* name is never assigned to again, so len is still strlen(name)  */
3369     /* Check whether a hook in @INC has already filled %INC */
3370     if (!hook_sv) {
3371         (void)hv_store(GvHVn(PL_incgv), name, len, newSVpv(CopFILE(&PL_compiling),0),0);
3372     } else {
3373         SV** const svp = hv_fetch(GvHVn(PL_incgv), name, len, 0);
3374         if (!svp)
3375             (void)hv_store(GvHVn(PL_incgv), name, len, SvREFCNT_inc_simple(hook_sv), 0 );
3376     }
3377
3378     ENTER;
3379     SAVETMPS;
3380     lex_start(NULL);
3381     SAVEGENERICSV(PL_rsfp_filters);
3382     PL_rsfp_filters = NULL;
3383
3384     PL_rsfp = tryrsfp;
3385     SAVEHINTS();
3386     PL_hints = 0;
3387     SAVECOMPILEWARNINGS();
3388     if (PL_dowarn & G_WARN_ALL_ON)
3389         PL_compiling.cop_warnings = pWARN_ALL ;
3390     else if (PL_dowarn & G_WARN_ALL_OFF)
3391         PL_compiling.cop_warnings = pWARN_NONE ;
3392     else
3393         PL_compiling.cop_warnings = pWARN_STD ;
3394
3395     if (filter_sub || filter_cache) {
3396         SV * const datasv = filter_add(S_run_user_filter, NULL);
3397         IoLINES(datasv) = filter_has_file;
3398         IoTOP_GV(datasv) = (GV *)filter_state;
3399         IoBOTTOM_GV(datasv) = (GV *)filter_sub;
3400         IoFMT_GV(datasv) = (GV *)filter_cache;
3401     }
3402
3403     /* switch to eval mode */
3404     PUSHBLOCK(cx, CXt_EVAL, SP);
3405     PUSHEVAL(cx, name, NULL);
3406     cx->blk_eval.retop = PL_op->op_next;
3407
3408     SAVECOPLINE(&PL_compiling);
3409     CopLINE_set(&PL_compiling, 0);
3410
3411     PUTBACK;
3412
3413     /* Store and reset encoding. */
3414     encoding = PL_encoding;
3415     PL_encoding = NULL;
3416
3417     op = DOCATCH(doeval(gimme, NULL, NULL, PL_curcop->cop_seq));
3418
3419     /* Restore encoding. */
3420     PL_encoding = encoding;
3421
3422     return op;
3423 }
3424
3425 PP(pp_entereval)
3426 {
3427     dVAR; dSP;
3428     register PERL_CONTEXT *cx;
3429     SV *sv;
3430     const I32 gimme = GIMME_V;
3431     const I32 was = PL_sub_generation;
3432     char tbuf[TYPE_DIGITS(long) + 12];
3433     char *tmpbuf = tbuf;
3434     char *safestr;
3435     STRLEN len;
3436     OP *ret;
3437     CV* runcv;
3438     U32 seq;
3439     HV *saved_hh = NULL;
3440     const char * const fakestr = "_<(eval )";
3441     const int fakelen = 9 + 1;
3442     
3443     if (PL_op->op_private & OPpEVAL_HAS_HH) {
3444         saved_hh = (HV*) SvREFCNT_inc(POPs);
3445     }
3446     sv = POPs;
3447
3448     TAINT_IF(SvTAINTED(sv));
3449     TAINT_PROPER("eval");
3450
3451     ENTER;
3452     lex_start(sv);
3453     SAVETMPS;
3454
3455     /* switch to eval mode */
3456
3457     if (PERLDB_NAMEEVAL && CopLINE(PL_curcop)) {
3458         SV * const temp_sv = sv_newmortal();
3459         Perl_sv_setpvf(aTHX_ temp_sv, "_<(eval %lu)[%s:%"IVdf"]",
3460                        (unsigned long)++PL_evalseq,
3461                        CopFILE(PL_curcop), (IV)CopLINE(PL_curcop));
3462         tmpbuf = SvPVX(temp_sv);
3463         len = SvCUR(temp_sv);
3464     }
3465     else
3466         len = my_snprintf(tmpbuf, sizeof(tbuf), "_<(eval %lu)", (unsigned long)++PL_evalseq);
3467     SAVECOPFILE_FREE(&PL_compiling);
3468     CopFILE_set(&PL_compiling, tmpbuf+2);
3469     SAVECOPLINE(&PL_compiling);
3470     CopLINE_set(&PL_compiling, 1);
3471     /* XXX For C<eval "...">s within BEGIN {} blocks, this ends up
3472        deleting the eval's FILEGV from the stash before gv_check() runs
3473        (i.e. before run-time proper). To work around the coredump that
3474        ensues, we always turn GvMULTI_on for any globals that were
3475        introduced within evals. See force_ident(). GSAR 96-10-12 */
3476     safestr = savepvn(tmpbuf, len);
3477     SAVEDELETE(PL_defstash, safestr, len);
3478     SAVEHINTS();
3479     PL_hints = PL_op->op_targ;
3480     if (saved_hh)
3481         GvHV(PL_hintgv) = saved_hh;
3482     SAVECOMPILEWARNINGS();
3483     PL_compiling.cop_warnings = DUP_WARNINGS(PL_curcop->cop_warnings);
3484     if (PL_compiling.cop_hints_hash) {
3485         Perl_refcounted_he_free(aTHX_ PL_compiling.cop_hints_hash);
3486     }
3487     PL_compiling.cop_hints_hash = PL_curcop->cop_hints_hash;
3488     if (PL_compiling.cop_hints_hash) {
3489         HINTS_REFCNT_LOCK;
3490         PL_compiling.cop_hints_hash->refcounted_he_refcnt++;
3491         HINTS_REFCNT_UNLOCK;
3492     }
3493     /* special case: an eval '' executed within the DB package gets lexically
3494      * placed in the first non-DB CV rather than the current CV - this
3495      * allows the debugger to execute code, find lexicals etc, in the
3496      * scope of the code being debugged. Passing &seq gets find_runcv
3497      * to do the dirty work for us */
3498     runcv = find_runcv(&seq);
3499
3500     PUSHBLOCK(cx, (CXt_EVAL|CXp_REAL), SP);
3501     PUSHEVAL(cx, 0, NULL);
3502     cx->blk_eval.retop = PL_op->op_next;
3503
3504     /* prepare to compile string */
3505
3506     if (PERLDB_LINE && PL_curstash != PL_debstash)
3507         save_lines(CopFILEAV(&PL_compiling), PL_linestr);
3508     PUTBACK;
3509     ret = doeval(gimme, NULL, runcv, seq);
3510     if (PERLDB_INTER && was != (I32)PL_sub_generation /* Some subs defined here. */
3511         && ret != PL_op->op_next) {     /* Successive compilation. */
3512         /* Copy in anything fake and short. */
3513         my_strlcpy(safestr, fakestr, fakelen);
3514     }
3515     return DOCATCH(ret);
3516 }
3517
3518 PP(pp_leaveeval)
3519 {
3520     dVAR; dSP;
3521     register SV **mark;
3522     SV **newsp;
3523     PMOP *newpm;
3524     I32 gimme;
3525     register PERL_CONTEXT *cx;
3526     OP *retop;
3527     const U8 save_flags = PL_op -> op_flags;
3528     I32 optype;
3529
3530     POPBLOCK(cx,newpm);
3531     POPEVAL(cx);
3532     retop = cx->blk_eval.retop;
3533
3534     TAINT_NOT;
3535     if (gimme == G_VOID)
3536         MARK = newsp;
3537     else if (gimme == G_SCALAR) {
3538         MARK = newsp + 1;
3539         if (MARK <= SP) {
3540             if (SvFLAGS(TOPs) & SVs_TEMP)
3541                 *MARK = TOPs;
3542             else
3543                 *MARK = sv_mortalcopy(TOPs);
3544         }
3545         else {
3546             MEXTEND(mark,0);
3547             *MARK = &PL_sv_undef;
3548         }
3549         SP = MARK;
3550     }
3551     else {
3552         /* in case LEAVE wipes old return values */
3553         for (mark = newsp + 1; mark <= SP; mark++) {
3554             if (!(SvFLAGS(*mark) & SVs_TEMP)) {
3555                 *mark = sv_mortalcopy(*mark);
3556                 TAINT_NOT;      /* Each item is independent */
3557             }
3558         }
3559     }
3560     PL_curpm = newpm;   /* Don't pop $1 et al till now */
3561
3562 #ifdef DEBUGGING
3563     assert(CvDEPTH(PL_compcv) == 1);
3564 #endif
3565     CvDEPTH(PL_compcv) = 0;
3566     lex_end();
3567
3568     if (optype == OP_REQUIRE &&
3569         !(gimme == G_SCALAR ? SvTRUE(*SP) : SP > newsp))
3570     {
3571         /* Unassume the success we assumed earlier. */
3572         SV * const nsv = cx->blk_eval.old_namesv;
3573         (void)hv_delete(GvHVn(PL_incgv), SvPVX_const(nsv), SvCUR(nsv), G_DISCARD);
3574         retop = Perl_die(aTHX_ "%"SVf" did not return a true value", SVfARG(nsv));
3575         /* die_where() did LEAVE, or we won't be here */
3576     }
3577     else {
3578         LEAVE;
3579         if (!(save_flags & OPf_SPECIAL))
3580             sv_setpvn(ERRSV,"",0);
3581     }
3582
3583     RETURNOP(retop);
3584 }
3585
3586 /* Common code for Perl_call_sv and Perl_fold_constants, put here to keep it
3587    close to the related Perl_create_eval_scope.  */
3588 void
3589 Perl_delete_eval_scope(pTHX)
3590 {
3591     SV **newsp;
3592     PMOP *newpm;
3593     I32 gimme;
3594     register PERL_CONTEXT *cx;
3595     I32 optype;
3596         
3597     POPBLOCK(cx,newpm);
3598     POPEVAL(cx);
3599     PL_curpm = newpm;
3600     LEAVE;
3601     PERL_UNUSED_VAR(newsp);
3602     PERL_UNUSED_VAR(gimme);
3603     PERL_UNUSED_VAR(optype);
3604 }
3605
3606 /* Common-ish code salvaged from Perl_call_sv and pp_entertry, because it was
3607    also needed by Perl_fold_constants.  */
3608 PERL_CONTEXT *
3609 Perl_create_eval_scope(pTHX_ U32 flags)
3610 {
3611     PERL_CONTEXT *cx;
3612     const I32 gimme = GIMME_V;
3613         
3614     ENTER;
3615     SAVETMPS;
3616
3617     PUSHBLOCK(cx, (CXt_EVAL|CXp_TRYBLOCK), PL_stack_sp);
3618     PUSHEVAL(cx, 0, 0);
3619
3620     PL_in_eval = EVAL_INEVAL;
3621     if (flags & G_KEEPERR)
3622         PL_in_eval |= EVAL_KEEPERR;
3623     else
3624         sv_setpvn(ERRSV,"",0);
3625     if (flags & G_FAKINGEVAL) {
3626         PL_eval_root = PL_op; /* Only needed so that goto works right. */
3627     }
3628     return cx;
3629 }
3630     
3631 PP(pp_entertry)
3632 {
3633     dVAR;
3634     PERL_CONTEXT * const cx = create_eval_scope(0);
3635     cx->blk_eval.retop = cLOGOP->op_other->op_next;
3636     return DOCATCH(PL_op->op_next);
3637 }
3638
3639 PP(pp_leavetry)
3640 {
3641     dVAR; dSP;
3642     SV **newsp;
3643     PMOP *newpm;
3644     I32 gimme;
3645     register PERL_CONTEXT *cx;
3646     I32 optype;
3647
3648     POPBLOCK(cx,newpm);
3649     POPEVAL(cx);
3650     PERL_UNUSED_VAR(optype);
3651
3652     TAINT_NOT;
3653     if (gimme == G_VOID)
3654         SP = newsp;
3655     else if (gimme == G_SCALAR) {
3656         register SV **mark;
3657         MARK = newsp + 1;
3658         if (MARK <= SP) {
3659             if (SvFLAGS(TOPs) & (SVs_PADTMP|SVs_TEMP))
3660                 *MARK = TOPs;
3661             else
3662                 *MARK = sv_mortalcopy(TOPs);
3663         }
3664         else {
3665             MEXTEND(mark,0);
3666             *MARK = &PL_sv_undef;
3667         }
3668         SP = MARK;
3669     }
3670     else {
3671         /* in case LEAVE wipes old return values */
3672         register SV **mark;
3673         for (mark = newsp + 1; mark <= SP; mark++) {
3674             if (!(SvFLAGS(*mark) & (SVs_PADTMP|SVs_TEMP))) {
3675                 *mark = sv_mortalcopy(*mark);
3676                 TAINT_NOT;      /* Each item is independent */
3677             }
3678         }
3679     }
3680     PL_curpm = newpm;   /* Don't pop $1 et al till now */
3681
3682     LEAVE;
3683     sv_setpvn(ERRSV,"",0);
3684     RETURN;
3685 }
3686
3687 PP(pp_entergiven)
3688 {
3689     dVAR; dSP;
3690     register PERL_CONTEXT *cx;
3691     const I32 gimme = GIMME_V;
3692     
3693     ENTER;
3694     SAVETMPS;
3695
3696     if (PL_op->op_targ == 0) {
3697         SV ** const defsv_p = &GvSV(PL_defgv);
3698         *defsv_p = newSVsv(POPs);
3699         SAVECLEARSV(*defsv_p);
3700     }
3701     else
3702         sv_setsv(PAD_SV(PL_op->op_targ), POPs);
3703
3704     PUSHBLOCK(cx, CXt_GIVEN, SP);
3705     PUSHGIVEN(cx);
3706
3707     RETURN;
3708 }
3709
3710 PP(pp_leavegiven)
3711 {
3712     dVAR; dSP;
3713     register PERL_CONTEXT *cx;
3714     I32 gimme;
3715     SV **newsp;
3716     PMOP *newpm;
3717     PERL_UNUSED_CONTEXT;
3718
3719     POPBLOCK(cx,newpm);
3720     assert(CxTYPE(cx) == CXt_GIVEN);
3721
3722     SP = newsp;
3723     PUTBACK;
3724
3725     PL_curpm = newpm;   /* pop $1 et al */
3726
3727     LEAVE;
3728
3729     return NORMAL;
3730 }
3731
3732 /* Helper routines used by pp_smartmatch */
3733 STATIC PMOP *
3734 S_make_matcher(pTHX_ regexp *re)
3735 {
3736     dVAR;
3737     PMOP *matcher = (PMOP *) newPMOP(OP_MATCH, OPf_WANT_SCALAR | OPf_STACKED);
3738     PM_SETRE(matcher, ReREFCNT_inc(re));
3739     
3740     SAVEFREEOP((OP *) matcher);
3741     ENTER; SAVETMPS;
3742     SAVEOP();
3743     return matcher;
3744 }
3745
3746 STATIC bool
3747 S_matcher_matches_sv(pTHX_ PMOP *matcher, SV *sv)
3748 {
3749     dVAR;
3750     dSP;
3751     
3752     PL_op = (OP *) matcher;
3753     XPUSHs(sv);
3754     PUTBACK;
3755     (void) pp_match();
3756     SPAGAIN;
3757     return (SvTRUEx(POPs));
3758 }
3759
3760 STATIC void
3761 S_destroy_matcher(pTHX_ PMOP *matcher)
3762 {
3763     dVAR;
3764     PERL_UNUSED_ARG(matcher);
3765     FREETMPS;
3766     LEAVE;
3767 }
3768
3769 /* Do a smart match */
3770 PP(pp_smartmatch)
3771 {
3772     return do_smartmatch(NULL, NULL);
3773 }
3774
3775 /* This version of do_smartmatch() implements the
3776  * table of smart matches that is found in perlsyn.
3777  */
3778 STATIC OP *
3779 S_do_smartmatch(pTHX_ HV *seen_this, HV *seen_other)
3780 {
3781     dVAR;
3782     dSP;
3783     
3784     SV *e = TOPs;       /* e is for 'expression' */
3785     SV *d = TOPm1s;     /* d is for 'default', as in PL_defgv */
3786     SV *This, *Other;   /* 'This' (and Other to match) to play with C++ */
3787     MAGIC *mg;
3788     regexp *this_regex, *other_regex;
3789
3790 #   define NOT_EMPTY_PROTO(cv) (!SvPOK(cv) || SvCUR(cv) == 0)
3791
3792 #   define SM_REF(type) ( \
3793            (SvROK(d) && (SvTYPE(This = SvRV(d)) == SVt_##type) && (Other = e)) \
3794         || (SvROK(e) && (SvTYPE(This = SvRV(e)) == SVt_##type) && (Other = d)))
3795
3796 #   define SM_CV_NEP   /* Find a code ref without an empty prototype */ \
3797         ((SvROK(d) && (SvTYPE(This = SvRV(d)) == SVt_PVCV)              \
3798             && NOT_EMPTY_PROTO(This) && (Other = e))                    \
3799         || (SvROK(e) && (SvTYPE(This = SvRV(e)) == SVt_PVCV)            \
3800             && NOT_EMPTY_PROTO(This) && (Other = d)))
3801
3802 #   define SM_REGEX ( \
3803            (SvROK(d) && SvMAGICAL(This = SvRV(d))                       \
3804         && (mg = mg_find(This, PERL_MAGIC_qr))                          \
3805         && (this_regex = (regexp *)mg->mg_obj)                          \
3806         && (Other = e))                                                 \
3807     ||                                                                  \
3808            (SvROK(e) && SvMAGICAL(This = SvRV(e))                       \
3809         && (mg = mg_find(This, PERL_MAGIC_qr))                          \
3810         && (this_regex = (regexp *)mg->mg_obj)                          \
3811         && (Other = d)) )
3812         
3813
3814 #   define SM_OTHER_REF(type) \
3815         (SvROK(Other) && SvTYPE(SvRV(Other)) == SVt_##type)
3816
3817 #   define SM_OTHER_REGEX (SvROK(Other) && SvMAGICAL(SvRV(Other))       \
3818         && (mg = mg_find(SvRV(Other), PERL_MAGIC_qr))                   \
3819         && (other_regex = (regexp *)mg->mg_obj))
3820         
3821
3822 #   define SM_SEEN_THIS(sv) hv_exists_ent(seen_this, \
3823         sv_2mortal(newSViv(PTR2IV(sv))), 0)
3824
3825 #   define SM_SEEN_OTHER(sv) hv_exists_ent(seen_other, \
3826         sv_2mortal(newSViv(PTR2IV(sv))), 0)
3827
3828     tryAMAGICbinSET(smart, 0);
3829     
3830     SP -= 2;    /* Pop the values */
3831
3832     /* Take care only to invoke mg_get() once for each argument. 
3833      * Currently we do this by copying the SV if it's magical. */
3834     if (d) {
3835         if (SvGMAGICAL(d))
3836             d = sv_mortalcopy(d);
3837     }
3838     else
3839         d = &PL_sv_undef;
3840
3841     assert(e);
3842     if (SvGMAGICAL(e))
3843         e = sv_mortalcopy(e);
3844
3845     if (SM_CV_NEP) {
3846         I32 c;
3847         
3848         if ( SM_OTHER_REF(PVCV) && NOT_EMPTY_PROTO(SvRV(Other)) )
3849         {
3850             if (This == SvRV(Other))
3851                 RETPUSHYES;
3852             else
3853                 RETPUSHNO;
3854         }
3855         
3856         ENTER;
3857         SAVETMPS;
3858         PUSHMARK(SP);
3859         PUSHs(Other);
3860         PUTBACK;
3861         c = call_sv(This, G_SCALAR);
3862         SPAGAIN;
3863         if (c == 0)
3864             PUSHs(&PL_sv_no);
3865         else if (SvTEMP(TOPs))
3866             SvREFCNT_inc_void(TOPs);
3867         FREETMPS;
3868         LEAVE;
3869         RETURN;
3870     }
3871     else if (SM_REF(PVHV)) {
3872         if (SM_OTHER_REF(PVHV)) {
3873             /* Check that the key-sets are identical */
3874             HE *he;
3875             HV *other_hv = (HV *) SvRV(Other);
3876             bool tied = FALSE;
3877             bool other_tied = FALSE;
3878             U32 this_key_count  = 0,
3879                 other_key_count = 0;
3880             
3881             /* Tied hashes don't know how many keys they have. */
3882             if (SvTIED_mg(This, PERL_MAGIC_tied)) {
3883                 tied = TRUE;
3884             }
3885             else if (SvTIED_mg((SV *) other_hv, PERL_MAGIC_tied)) {
3886                 HV * const temp = other_hv;
3887                 other_hv = (HV *) This;
3888                 This  = (SV *) temp;
3889                 tied = TRUE;
3890             }
3891             if (SvTIED_mg((SV *) other_hv, PERL_MAGIC_tied))
3892                 other_tied = TRUE;
3893             
3894             if (!tied && HvUSEDKEYS((HV *) This) != HvUSEDKEYS(other_hv))
3895                 RETPUSHNO;
3896
3897             /* The hashes have the same number of keys, so it suffices
3898                to check that one is a subset of the other. */
3899             (void) hv_iterinit((HV *) This);
3900             while ( (he = hv_iternext((HV *) This)) ) {
3901                 I32 key_len;
3902                 char * const key = hv_iterkey(he, &key_len);
3903                 
3904                 ++ this_key_count;
3905                 
3906                 if(!hv_exists(other_hv, key, key_len)) {
3907                     (void) hv_iterinit((HV *) This);    /* reset iterator */
3908                     RETPUSHNO;
3909                 }
3910             }
3911             
3912             if (other_tied) {
3913                 (void) hv_iterinit(other_hv);
3914                 while ( hv_iternext(other_hv) )
3915                     ++other_key_count;
3916             }
3917             else
3918                 other_key_count = HvUSEDKEYS(other_hv);
3919             
3920             if (this_key_count != other_key_count)
3921                 RETPUSHNO;
3922             else
3923                 RETPUSHYES;
3924         }
3925         else if (SM_OTHER_REF(PVAV)) {
3926             AV * const other_av = (AV *) SvRV(Other);
3927             const I32 other_len = av_len(other_av) + 1;
3928             I32 i;
3929             
3930             if (HvUSEDKEYS((HV *) This) != other_len)
3931                 RETPUSHNO;
3932             
3933             for(i = 0; i < other_len; ++i) {
3934                 SV ** const svp = av_fetch(other_av, i, FALSE);
3935                 char *key;
3936                 STRLEN key_len;
3937
3938                 if (!svp)       /* ??? When can this happen? */
3939                     RETPUSHNO;
3940
3941                 key = SvPV(*svp, key_len);
3942                 if(!hv_exists((HV *) This, key, key_len))
3943                     RETPUSHNO;
3944             }
3945             RETPUSHYES;
3946         }
3947         else if (SM_OTHER_REGEX) {
3948             PMOP * const matcher = make_matcher(other_regex);
3949             HE *he;
3950
3951             (void) hv_iterinit((HV *) This);
3952             while ( (he = hv_iternext((HV *) This)) ) {
3953                 if (matcher_matches_sv(matcher, hv_iterkeysv(he))) {
3954                     (void) hv_iterinit((HV *) This);
3955                     destroy_matcher(matcher);
3956                     RETPUSHYES;
3957                 }
3958             }
3959             destroy_matcher(matcher);
3960             RETPUSHNO;
3961         }
3962         else {
3963             if (hv_exists_ent((HV *) This, Other, 0))
3964                 RETPUSHYES;
3965             else
3966                 RETPUSHNO;
3967         }
3968     }
3969     else if (SM_REF(PVAV)) {
3970         if (SM_OTHER_REF(PVAV)) {
3971             AV *other_av = (AV *) SvRV(Other);
3972             if (av_len((AV *) This) != av_len(other_av))
3973                 RETPUSHNO;
3974             else {
3975                 I32 i;
3976                 const I32 other_len = av_len(other_av);
3977
3978                 if (NULL == seen_this) {
3979                     seen_this = newHV();
3980                     (void) sv_2mortal((SV *) seen_this);
3981                 }
3982                 if (NULL == seen_other) {
3983                     seen_this = newHV();
3984                     (void) sv_2mortal((SV *) seen_other);
3985                 }
3986                 for(i = 0; i <= other_len; ++i) {
3987                     SV * const * const this_elem = av_fetch((AV *)This, i, FALSE);
3988                     SV * const * const other_elem = av_fetch(other_av, i, FALSE);
3989
3990                     if (!this_elem || !other_elem) {
3991                         if (this_elem || other_elem)
3992                             RETPUSHNO;
3993                     }
3994                     else if (SM_SEEN_THIS(*this_elem)
3995                          || SM_SEEN_OTHER(*other_elem))
3996                     {
3997                         if (*this_elem != *other_elem)
3998                             RETPUSHNO;
3999                     }
4000                     else {
4001                         hv_store_ent(seen_this,
4002                             sv_2mortal(newSViv(PTR2IV(*this_elem))),
4003                             &PL_sv_undef, 0);
4004                         hv_store_ent(seen_other,
4005                             sv_2mortal(newSViv(PTR2IV(*other_elem))),
4006                             &PL_sv_undef, 0);
4007                         PUSHs(*this_elem);
4008                         PUSHs(*other_elem);
4009                         
4010                         PUTBACK;
4011                         (void) do_smartmatch(seen_this, seen_other);
4012                         SPAGAIN;
4013                         
4014                         if (!SvTRUEx(POPs))
4015                             RETPUSHNO;
4016                     }
4017                 }
4018                 RETPUSHYES;
4019             }
4020         }
4021         else if (SM_OTHER_REGEX) {
4022             PMOP * const matcher = make_matcher(other_regex);
4023             const I32 this_len = av_len((AV *) This);
4024             I32 i;
4025
4026             for(i = 0; i <= this_len; ++i) {
4027                 SV * const * const svp = av_fetch((AV *)This, i, FALSE);
4028                 if (svp && matcher_matches_sv(matcher, *svp)) {
4029                     destroy_matcher(matcher);
4030                     RETPUSHYES;
4031                 }
4032             }
4033             destroy_matcher(matcher);
4034             RETPUSHNO;
4035         }
4036         else if (SvIOK(Other) || SvNOK(Other)) {
4037             I32 i;
4038
4039             for(i = 0; i <= AvFILL((AV *) This); ++i) {
4040                 SV * const * const svp = av_fetch((AV *)This, i, FALSE);
4041                 if (!svp)
4042                     continue;
4043                 
4044                 PUSHs(Other);
4045                 PUSHs(*svp);
4046                 PUTBACK;
4047                 if (CopHINTS_get(PL_curcop) & HINT_INTEGER)
4048                     (void) pp_i_eq();
4049                 else
4050                     (void) pp_eq();
4051                 SPAGAIN;
4052                 if (SvTRUEx(POPs))
4053                     RETPUSHYES;
4054             }
4055             RETPUSHNO;
4056         }
4057         else if (SvPOK(Other)) {
4058             const I32 this_len = av_len((AV *) This);
4059             I32 i;
4060
4061             for(i = 0; i <= this_len; ++i) {
4062                 SV * const * const svp = av_fetch((AV *)This, i, FALSE);
4063                 if (!svp)
4064                     continue;
4065                 
4066                 PUSHs(Other);
4067                 PUSHs(*svp);
4068                 PUTBACK;
4069                 (void) pp_seq();
4070                 SPAGAIN;
4071                 if (SvTRUEx(POPs))
4072                     RETPUSHYES;
4073             }
4074             RETPUSHNO;
4075         }
4076     }
4077     else if (!SvOK(d) || !SvOK(e)) {
4078         if (!SvOK(d) && !SvOK(e))
4079             RETPUSHYES;
4080         else
4081             RETPUSHNO;
4082     }
4083     else if (SM_REGEX) {
4084         PMOP * const matcher = make_matcher(this_regex);
4085
4086         PUTBACK;
4087         PUSHs(matcher_matches_sv(matcher, Other)
4088             ? &PL_sv_yes
4089             : &PL_sv_no);
4090         destroy_matcher(matcher);
4091         RETURN;
4092     }
4093     else if (SM_REF(PVCV)) {
4094         I32 c;
4095         /* This must be a null-prototyped sub, because we
4096            already checked for the other kind. */
4097         
4098         ENTER;
4099         SAVETMPS;
4100         PUSHMARK(SP);
4101         PUTBACK;
4102         c = call_sv(This, G_SCALAR);
4103         SPAGAIN;
4104         if (c == 0)
4105             PUSHs(&PL_sv_undef);
4106         else if (SvTEMP(TOPs))
4107             SvREFCNT_inc_void(TOPs);
4108
4109         if (SM_OTHER_REF(PVCV)) {
4110             /* This one has to be null-proto'd too.
4111                Call both of 'em, and compare the results */
4112             PUSHMARK(SP);
4113             c = call_sv(SvRV(Other), G_SCALAR);
4114             SPAGAIN;
4115             if (c == 0)
4116                 PUSHs(&PL_sv_undef);
4117             else if (SvTEMP(TOPs))
4118                 SvREFCNT_inc_void(TOPs);
4119             FREETMPS;
4120             LEAVE;
4121             PUTBACK;
4122             return pp_eq();
4123         }
4124         
4125         FREETMPS;
4126         LEAVE;
4127         RETURN;
4128     }
4129     else if ( ((SvIOK(d) || SvNOK(d)) && (This = d) && (Other = e))
4130          ||   ((SvIOK(e) || SvNOK(e)) && (This = e) && (Other = d)) )
4131     {
4132         if (SvPOK(Other) && !looks_like_number(Other)) {
4133             /* String comparison */
4134             PUSHs(d); PUSHs(e);
4135             PUTBACK;
4136             return pp_seq();
4137         }
4138         /* Otherwise, numeric comparison */
4139         PUSHs(d); PUSHs(e);
4140         PUTBACK;
4141         if (CopHINTS_get(PL_curcop) & HINT_INTEGER)
4142             (void) pp_i_eq();
4143         else
4144             (void) pp_eq();
4145         SPAGAIN;
4146         if (SvTRUEx(POPs))
4147             RETPUSHYES;
4148         else
4149             RETPUSHNO;
4150     }
4151     
4152     /* As a last resort, use string comparison */
4153     PUSHs(d); PUSHs(e);
4154     PUTBACK;
4155     return pp_seq();
4156 }
4157
4158 PP(pp_enterwhen)
4159 {
4160     dVAR; dSP;
4161     register PERL_CONTEXT *cx;
4162     const I32 gimme = GIMME_V;
4163
4164     /* This is essentially an optimization: if the match
4165        fails, we don't want to push a context and then
4166        pop it again right away, so we skip straight
4167        to the op that follows the leavewhen.
4168     */
4169     if ((0 == (PL_op->op_flags & OPf_SPECIAL)) && !SvTRUEx(POPs))
4170         return cLOGOP->op_other->op_next;
4171
4172     ENTER;
4173     SAVETMPS;
4174
4175     PUSHBLOCK(cx, CXt_WHEN, SP);
4176     PUSHWHEN(cx);
4177
4178     RETURN;
4179 }
4180
4181 PP(pp_leavewhen)
4182 {
4183     dVAR; dSP;
4184     register PERL_CONTEXT *cx;
4185     I32 gimme;
4186     SV **newsp;
4187     PMOP *newpm;
4188
4189     POPBLOCK(cx,newpm);
4190     assert(CxTYPE(cx) == CXt_WHEN);
4191
4192     SP = newsp;
4193     PUTBACK;
4194
4195     PL_curpm = newpm;   /* pop $1 et al */
4196
4197     LEAVE;
4198     return NORMAL;
4199 }
4200
4201 PP(pp_continue)
4202 {
4203     dVAR;   
4204     I32 cxix;
4205     register PERL_CONTEXT *cx;
4206     I32 inner;
4207     
4208     cxix = dopoptowhen(cxstack_ix); 
4209     if (cxix < 0)   
4210         DIE(aTHX_ "Can't \"continue\" outside a when block");
4211     if (cxix < cxstack_ix)
4212         dounwind(cxix);
4213     
4214     /* clear off anything above the scope we're re-entering */
4215     inner = PL_scopestack_ix;
4216     TOPBLOCK(cx);
4217     if (PL_scopestack_ix < inner)
4218         leave_scope(PL_scopestack[PL_scopestack_ix]);
4219     PL_curcop = cx->blk_oldcop;
4220     return cx->blk_givwhen.leave_op;
4221 }
4222
4223 PP(pp_break)
4224 {
4225     dVAR;   
4226     I32 cxix;
4227     register PERL_CONTEXT *cx;
4228     I32 inner;
4229     
4230     cxix = dopoptogiven(cxstack_ix); 
4231     if (cxix < 0) {
4232         if (PL_op->op_flags & OPf_SPECIAL)
4233             DIE(aTHX_ "Can't use when() outside a topicalizer");
4234         else
4235             DIE(aTHX_ "Can't \"break\" outside a given block");
4236     }
4237     if (CxFOREACH(&cxstack[cxix]) && (0 == (PL_op->op_flags & OPf_SPECIAL)))
4238         DIE(aTHX_ "Can't \"break\" in a loop topicalizer");
4239
4240     if (cxix < cxstack_ix)
4241         dounwind(cxix);
4242     
4243     /* clear off anything above the scope we're re-entering */
4244     inner = PL_scopestack_ix;
4245     TOPBLOCK(cx);
4246     if (PL_scopestack_ix < inner)
4247         leave_scope(PL_scopestack[PL_scopestack_ix]);
4248     PL_curcop = cx->blk_oldcop;
4249
4250     if (CxFOREACH(cx))
4251         return CX_LOOP_NEXTOP_GET(cx);
4252     else
4253         return cx->blk_givwhen.leave_op;
4254 }
4255
4256 STATIC OP *
4257 S_doparseform(pTHX_ SV *sv)
4258 {
4259     STRLEN len;
4260     register char *s = SvPV_force(sv, len);
4261     register char * const send = s + len;
4262     register char *base = NULL;
4263     register I32 skipspaces = 0;
4264     bool noblank   = FALSE;
4265     bool repeat    = FALSE;
4266     bool postspace = FALSE;
4267     U32 *fops;
4268     register U32 *fpc;
4269     U32 *linepc = NULL;
4270     register I32 arg;
4271     bool ischop;
4272     bool unchopnum = FALSE;
4273     int maxops = 12; /* FF_LINEMARK + FF_END + 10 (\0 without preceding \n) */
4274
4275     if (len == 0)
4276         Perl_croak(aTHX_ "Null picture in formline");
4277
4278     /* estimate the buffer size needed */
4279     for (base = s; s <= send; s++) {
4280         if (*s == '\n' || *s == '@' || *s == '^')
4281             maxops += 10;
4282     }
4283     s = base;
4284     base = NULL;
4285
4286     Newx(fops, maxops, U32);
4287     fpc = fops;
4288
4289     if (s < send) {
4290         linepc = fpc;
4291         *fpc++ = FF_LINEMARK;
4292         noblank = repeat = FALSE;
4293         base = s;
4294     }
4295
4296     while (s <= send) {
4297         switch (*s++) {
4298         default:
4299             skipspaces = 0;
4300             continue;
4301
4302         case '~':
4303             if (*s == '~') {
4304                 repeat = TRUE;
4305                 *s = ' ';
4306             }
4307             noblank = TRUE;
4308             s[-1] = ' ';
4309             /* FALL THROUGH */
4310         case ' ': case '\t':
4311             skipspaces++;
4312             continue;
4313         case 0:
4314             if (s < send) {
4315                 skipspaces = 0;
4316                 continue;
4317             } /* else FALL THROUGH */
4318         case '\n':
4319             arg = s - base;
4320             skipspaces++;
4321             arg -= skipspaces;
4322             if (arg) {
4323                 if (postspace)
4324                     *fpc++ = FF_SPACE;
4325                 *fpc++ = FF_LITERAL;
4326                 *fpc++ = (U16)arg;
4327             }
4328             postspace = FALSE;
4329             if (s <= send)
4330                 skipspaces--;
4331             if (skipspaces) {
4332                 *fpc++ = FF_SKIP;
4333                 *fpc++ = (U16)skipspaces;
4334             }
4335             skipspaces = 0;
4336             if (s <= send)
4337                 *fpc++ = FF_NEWLINE;
4338             if (noblank) {
4339                 *fpc++ = FF_BLANK;
4340                 if (repeat)
4341                     arg = fpc - linepc + 1;
4342                 else
4343                     arg = 0;
4344                 *fpc++ = (U16)arg;
4345             }
4346             if (s < send) {
4347                 linepc = fpc;
4348                 *fpc++ = FF_LINEMARK;
4349                 noblank = repeat = FALSE;
4350                 base = s;
4351             }
4352             else
4353                 s++;
4354             continue;
4355
4356         case '@':
4357         case '^':
4358             ischop = s[-1] == '^';
4359
4360             if (postspace) {
4361                 *fpc++ = FF_SPACE;
4362                 postspace = FALSE;
4363             }
4364             arg = (s - base) - 1;
4365             if (arg) {
4366                 *fpc++ = FF_LITERAL;
4367                 *fpc++ = (U16)arg;
4368             }
4369
4370             base = s - 1;
4371             *fpc++ = FF_FETCH;
4372             if (*s == '*') {
4373                 s++;
4374                 *fpc++ = 2;  /* skip the @* or ^* */
4375                 if (ischop) {
4376                     *fpc++ = FF_LINESNGL;
4377                     *fpc++ = FF_CHOP;
4378                 } else
4379                     *fpc++ = FF_LINEGLOB;
4380             }
4381             else if (*s == '#' || (*s == '.' && s[1] == '#')) {
4382                 arg = ischop ? 512 : 0;
4383                 base = s - 1;
4384                 while (*s == '#')
4385                     s++;
4386                 if (*s == '.') {
4387                     const char * const f = ++s;
4388                     while (*s == '#')
4389                         s++;
4390                     arg |= 256 + (s - f);
4391                 }
4392                 *fpc++ = s - base;              /* fieldsize for FETCH */
4393                 *fpc++ = FF_DECIMAL;
4394                 *fpc++ = (U16)arg;
4395                 unchopnum |= ! ischop;
4396             }
4397             else if (*s == '0' && s[1] == '#') {  /* Zero padded decimals */
4398                 arg = ischop ? 512 : 0;
4399                 base = s - 1;
4400                 s++;                                /* skip the '0' first */
4401                 while (*s == '#')
4402                     s++;
4403                 if (*s == '.') {
4404                     const char * const f = ++s;
4405                     while (*s == '#')
4406                         s++;
4407                     arg |= 256 + (s - f);
4408                 }
4409                 *fpc++ = s - base;                /* fieldsize for FETCH */
4410                 *fpc++ = FF_0DECIMAL;
4411                 *fpc++ = (U16)arg;
4412                 unchopnum |= ! ischop;
4413             }
4414             else {
4415                 I32 prespace = 0;
4416                 bool ismore = FALSE;
4417
4418                 if (*s == '>') {
4419                     while (*++s == '>') ;
4420                     prespace = FF_SPACE;
4421                 }
4422                 else if (*s == '|') {
4423                     while (*++s == '|') ;
4424                     prespace = FF_HALFSPACE;
4425                     postspace = TRUE;
4426                 }
4427                 else {
4428                     if (*s == '<')
4429                         while (*++s == '<') ;
4430                     postspace = TRUE;
4431                 }
4432                 if (*s == '.' && s[1] == '.' && s[2] == '.') {
4433                     s += 3;
4434                     ismore = TRUE;
4435                 }
4436                 *fpc++ = s - base;              /* fieldsize for FETCH */
4437
4438                 *fpc++ = ischop ? FF_CHECKCHOP : FF_CHECKNL;
4439
4440                 if (prespace)
4441                     *fpc++ = (U16)prespace;
4442                 *fpc++ = FF_ITEM;
4443                 if (ismore)
4444                     *fpc++ = FF_MORE;
4445                 if (ischop)
4446                     *fpc++ = FF_CHOP;
4447             }
4448             base = s;
4449             skipspaces = 0;
4450             continue;
4451         }
4452     }
4453     *fpc++ = FF_END;
4454
4455     assert (fpc <= fops + maxops); /* ensure our buffer estimate was valid */
4456     arg = fpc - fops;
4457     { /* need to jump to the next word */
4458         int z;
4459         z = WORD_ALIGN - SvCUR(sv) % WORD_ALIGN;
4460         SvGROW(sv, SvCUR(sv) + z + arg * sizeof(U32) + 4);
4461         s = SvPVX(sv) + SvCUR(sv) + z;
4462     }
4463     Copy(fops, s, arg, U32);
4464     Safefree(fops);
4465     sv_magic(sv, NULL, PERL_MAGIC_fm, NULL, 0);
4466     SvCOMPILED_on(sv);
4467
4468     if (unchopnum && repeat)
4469         DIE(aTHX_ "Repeated format line will never terminate (~~ and @#)");
4470     return 0;
4471 }
4472
4473
4474 STATIC bool
4475 S_num_overflow(NV value, I32 fldsize, I32 frcsize)
4476 {
4477     /* Can value be printed in fldsize chars, using %*.*f ? */
4478     NV pwr = 1;
4479     NV eps = 0.5;
4480     bool res = FALSE;
4481     int intsize = fldsize - (value < 0 ? 1 : 0);
4482
4483     if (frcsize & 256)
4484         intsize--;
4485     frcsize &= 255;
4486     intsize -= frcsize;
4487
4488     while (intsize--) pwr *= 10.0;
4489     while (frcsize--) eps /= 10.0;
4490
4491     if( value >= 0 ){
4492         if (value + eps >= pwr)
4493             res = TRUE;
4494     } else {
4495         if (value - eps <= -pwr)
4496             res = TRUE;
4497     }
4498     return res;
4499 }
4500
4501 static I32
4502 S_run_user_filter(pTHX_ int idx, SV *buf_sv, int maxlen)
4503 {
4504     dVAR;
4505     SV * const datasv = FILTER_DATA(idx);
4506     const int filter_has_file = IoLINES(datasv);
4507     SV * const filter_state = (SV *)IoTOP_GV(datasv);
4508     SV * const filter_sub = (SV *)IoBOTTOM_GV(datasv);
4509     int status = 0;
4510     SV *upstream;
4511     STRLEN got_len;
4512     const char *got_p = NULL;
4513     const char *prune_from = NULL;
4514     bool read_from_cache = FALSE;
4515     STRLEN umaxlen;
4516
4517     assert(maxlen >= 0);
4518     umaxlen = maxlen;
4519
4520     /* I was having segfault trouble under Linux 2.2.5 after a
4521        parse error occured.  (Had to hack around it with a test
4522        for PL_error_count == 0.)  Solaris doesn't segfault --
4523        not sure where the trouble is yet.  XXX */
4524
4525     if (IoFMT_GV(datasv)) {
4526         SV *const cache = (SV *)IoFMT_GV(datasv);
4527         if (SvOK(cache)) {
4528             STRLEN cache_len;
4529             const char *cache_p = SvPV(cache, cache_len);
4530             STRLEN take = 0;
4531
4532             if (umaxlen) {
4533                 /* Running in block mode and we have some cached data already.
4534                  */
4535                 if (cache_len >= umaxlen) {
4536                     /* In fact, so much data we don't even need to call
4537                        filter_read.  */
4538                     take = umaxlen;
4539                 }
4540             } else {
4541                 const char *const first_nl =
4542                     (const char *)memchr(cache_p, '\n', cache_len);