save old PL_curcop value in parser struct
[p5sagit/p5-mst-13.2.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 = SvOK(tmpstr) ? 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, tmpstr, pm_flags));
155                 else
156                 PM_SETRE(pm, CALLREGCOMP(tmpstr, 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, NULL, FALSE);
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     SAVEI8(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_parser->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, tryrsfp, TRUE);
3381
3382     SAVEHINTS();
3383     PL_hints = 0;
3384     SAVECOMPILEWARNINGS();
3385     if (PL_dowarn & G_WARN_ALL_ON)
3386         PL_compiling.cop_warnings = pWARN_ALL ;
3387     else if (PL_dowarn & G_WARN_ALL_OFF)
3388         PL_compiling.cop_warnings = pWARN_NONE ;
3389     else
3390         PL_compiling.cop_warnings = pWARN_STD ;
3391
3392     if (filter_sub || filter_cache) {
3393         SV * const datasv = filter_add(S_run_user_filter, NULL);
3394         IoLINES(datasv) = filter_has_file;
3395         IoTOP_GV(datasv) = (GV *)filter_state;
3396         IoBOTTOM_GV(datasv) = (GV *)filter_sub;
3397         IoFMT_GV(datasv) = (GV *)filter_cache;
3398     }
3399
3400     /* switch to eval mode */
3401     PUSHBLOCK(cx, CXt_EVAL, SP);
3402     PUSHEVAL(cx, name, NULL);
3403     cx->blk_eval.retop = PL_op->op_next;
3404
3405     SAVECOPLINE(&PL_compiling);
3406     CopLINE_set(&PL_compiling, 0);
3407
3408     PUTBACK;
3409
3410     /* Store and reset encoding. */
3411     encoding = PL_encoding;
3412     PL_encoding = NULL;
3413
3414     op = DOCATCH(doeval(gimme, NULL, NULL, PL_curcop->cop_seq));
3415
3416     /* Restore encoding. */
3417     PL_encoding = encoding;
3418
3419     return op;
3420 }
3421
3422 PP(pp_entereval)
3423 {
3424     dVAR; dSP;
3425     register PERL_CONTEXT *cx;
3426     SV *sv;
3427     const I32 gimme = GIMME_V;
3428     const I32 was = PL_sub_generation;
3429     char tbuf[TYPE_DIGITS(long) + 12];
3430     char *tmpbuf = tbuf;
3431     char *safestr;
3432     STRLEN len;
3433     OP *ret;
3434     CV* runcv;
3435     U32 seq;
3436     HV *saved_hh = NULL;
3437     const char * const fakestr = "_<(eval )";
3438     const int fakelen = 9 + 1;
3439     
3440     if (PL_op->op_private & OPpEVAL_HAS_HH) {
3441         saved_hh = (HV*) SvREFCNT_inc(POPs);
3442     }
3443     sv = POPs;
3444
3445     TAINT_IF(SvTAINTED(sv));
3446     TAINT_PROPER("eval");
3447
3448     ENTER;
3449     lex_start(sv, NULL, FALSE);
3450     SAVETMPS;
3451
3452     /* switch to eval mode */
3453
3454     if (PERLDB_NAMEEVAL && CopLINE(PL_curcop)) {
3455         SV * const temp_sv = sv_newmortal();
3456         Perl_sv_setpvf(aTHX_ temp_sv, "_<(eval %lu)[%s:%"IVdf"]",
3457                        (unsigned long)++PL_evalseq,
3458                        CopFILE(PL_curcop), (IV)CopLINE(PL_curcop));
3459         tmpbuf = SvPVX(temp_sv);
3460         len = SvCUR(temp_sv);
3461     }
3462     else
3463         len = my_snprintf(tmpbuf, sizeof(tbuf), "_<(eval %lu)", (unsigned long)++PL_evalseq);
3464     SAVECOPFILE_FREE(&PL_compiling);
3465     CopFILE_set(&PL_compiling, tmpbuf+2);
3466     SAVECOPLINE(&PL_compiling);
3467     CopLINE_set(&PL_compiling, 1);
3468     /* XXX For C<eval "...">s within BEGIN {} blocks, this ends up
3469        deleting the eval's FILEGV from the stash before gv_check() runs
3470        (i.e. before run-time proper). To work around the coredump that
3471        ensues, we always turn GvMULTI_on for any globals that were
3472        introduced within evals. See force_ident(). GSAR 96-10-12 */
3473     safestr = savepvn(tmpbuf, len);
3474     SAVEDELETE(PL_defstash, safestr, len);
3475     SAVEHINTS();
3476     PL_hints = PL_op->op_targ;
3477     if (saved_hh)
3478         GvHV(PL_hintgv) = saved_hh;
3479     SAVECOMPILEWARNINGS();
3480     PL_compiling.cop_warnings = DUP_WARNINGS(PL_curcop->cop_warnings);
3481     if (PL_compiling.cop_hints_hash) {
3482         Perl_refcounted_he_free(aTHX_ PL_compiling.cop_hints_hash);
3483     }
3484     PL_compiling.cop_hints_hash = PL_curcop->cop_hints_hash;
3485     if (PL_compiling.cop_hints_hash) {
3486         HINTS_REFCNT_LOCK;
3487         PL_compiling.cop_hints_hash->refcounted_he_refcnt++;
3488         HINTS_REFCNT_UNLOCK;
3489     }
3490     /* special case: an eval '' executed within the DB package gets lexically
3491      * placed in the first non-DB CV rather than the current CV - this
3492      * allows the debugger to execute code, find lexicals etc, in the
3493      * scope of the code being debugged. Passing &seq gets find_runcv
3494      * to do the dirty work for us */
3495     runcv = find_runcv(&seq);
3496
3497     PUSHBLOCK(cx, (CXt_EVAL|CXp_REAL), SP);
3498     PUSHEVAL(cx, 0, NULL);
3499     cx->blk_eval.retop = PL_op->op_next;
3500
3501     /* prepare to compile string */
3502
3503     if (PERLDB_LINE && PL_curstash != PL_debstash)
3504         save_lines(CopFILEAV(&PL_compiling), PL_parser->linestr);
3505     PUTBACK;
3506     ret = doeval(gimme, NULL, runcv, seq);
3507     if (PERLDB_INTER && was != (I32)PL_sub_generation /* Some subs defined here. */
3508         && ret != PL_op->op_next) {     /* Successive compilation. */
3509         /* Copy in anything fake and short. */
3510         my_strlcpy(safestr, fakestr, fakelen);
3511     }
3512     return DOCATCH(ret);
3513 }
3514
3515 PP(pp_leaveeval)
3516 {
3517     dVAR; dSP;
3518     register SV **mark;
3519     SV **newsp;
3520     PMOP *newpm;
3521     I32 gimme;
3522     register PERL_CONTEXT *cx;
3523     OP *retop;
3524     const U8 save_flags = PL_op -> op_flags;
3525     I32 optype;
3526
3527     POPBLOCK(cx,newpm);
3528     POPEVAL(cx);
3529     retop = cx->blk_eval.retop;
3530
3531     TAINT_NOT;
3532     if (gimme == G_VOID)
3533         MARK = newsp;
3534     else if (gimme == G_SCALAR) {
3535         MARK = newsp + 1;
3536         if (MARK <= SP) {
3537             if (SvFLAGS(TOPs) & SVs_TEMP)
3538                 *MARK = TOPs;
3539             else
3540                 *MARK = sv_mortalcopy(TOPs);
3541         }
3542         else {
3543             MEXTEND(mark,0);
3544             *MARK = &PL_sv_undef;
3545         }
3546         SP = MARK;
3547     }
3548     else {
3549         /* in case LEAVE wipes old return values */
3550         for (mark = newsp + 1; mark <= SP; mark++) {
3551             if (!(SvFLAGS(*mark) & SVs_TEMP)) {
3552                 *mark = sv_mortalcopy(*mark);
3553                 TAINT_NOT;      /* Each item is independent */
3554             }
3555         }
3556     }
3557     PL_curpm = newpm;   /* Don't pop $1 et al till now */
3558
3559 #ifdef DEBUGGING
3560     assert(CvDEPTH(PL_compcv) == 1);
3561 #endif
3562     CvDEPTH(PL_compcv) = 0;
3563     lex_end();
3564
3565     if (optype == OP_REQUIRE &&
3566         !(gimme == G_SCALAR ? SvTRUE(*SP) : SP > newsp))
3567     {
3568         /* Unassume the success we assumed earlier. */
3569         SV * const nsv = cx->blk_eval.old_namesv;
3570         (void)hv_delete(GvHVn(PL_incgv), SvPVX_const(nsv), SvCUR(nsv), G_DISCARD);
3571         retop = Perl_die(aTHX_ "%"SVf" did not return a true value", SVfARG(nsv));
3572         /* die_where() did LEAVE, or we won't be here */
3573     }
3574     else {
3575         LEAVE;
3576         if (!(save_flags & OPf_SPECIAL))
3577             sv_setpvn(ERRSV,"",0);
3578     }
3579
3580     RETURNOP(retop);
3581 }
3582
3583 /* Common code for Perl_call_sv and Perl_fold_constants, put here to keep it
3584    close to the related Perl_create_eval_scope.  */
3585 void
3586 Perl_delete_eval_scope(pTHX)
3587 {
3588     SV **newsp;
3589     PMOP *newpm;
3590     I32 gimme;
3591     register PERL_CONTEXT *cx;
3592     I32 optype;
3593         
3594     POPBLOCK(cx,newpm);
3595     POPEVAL(cx);
3596     PL_curpm = newpm;
3597     LEAVE;
3598     PERL_UNUSED_VAR(newsp);
3599     PERL_UNUSED_VAR(gimme);
3600     PERL_UNUSED_VAR(optype);
3601 }
3602
3603 /* Common-ish code salvaged from Perl_call_sv and pp_entertry, because it was
3604    also needed by Perl_fold_constants.  */
3605 PERL_CONTEXT *
3606 Perl_create_eval_scope(pTHX_ U32 flags)
3607 {
3608     PERL_CONTEXT *cx;
3609     const I32 gimme = GIMME_V;
3610         
3611     ENTER;
3612     SAVETMPS;
3613
3614     PUSHBLOCK(cx, (CXt_EVAL|CXp_TRYBLOCK), PL_stack_sp);
3615     PUSHEVAL(cx, 0, 0);
3616
3617     PL_in_eval = EVAL_INEVAL;
3618     if (flags & G_KEEPERR)
3619         PL_in_eval |= EVAL_KEEPERR;
3620     else
3621         sv_setpvn(ERRSV,"",0);
3622     if (flags & G_FAKINGEVAL) {
3623         PL_eval_root = PL_op; /* Only needed so that goto works right. */
3624     }
3625     return cx;
3626 }
3627     
3628 PP(pp_entertry)
3629 {
3630     dVAR;
3631     PERL_CONTEXT * const cx = create_eval_scope(0);
3632     cx->blk_eval.retop = cLOGOP->op_other->op_next;
3633     return DOCATCH(PL_op->op_next);
3634 }
3635
3636 PP(pp_leavetry)
3637 {
3638     dVAR; dSP;
3639     SV **newsp;
3640     PMOP *newpm;
3641     I32 gimme;
3642     register PERL_CONTEXT *cx;
3643     I32 optype;
3644
3645     POPBLOCK(cx,newpm);
3646     POPEVAL(cx);
3647     PERL_UNUSED_VAR(optype);
3648
3649     TAINT_NOT;
3650     if (gimme == G_VOID)
3651         SP = newsp;
3652     else if (gimme == G_SCALAR) {
3653         register SV **mark;
3654         MARK = newsp + 1;
3655         if (MARK <= SP) {
3656             if (SvFLAGS(TOPs) & (SVs_PADTMP|SVs_TEMP))
3657                 *MARK = TOPs;
3658             else
3659                 *MARK = sv_mortalcopy(TOPs);
3660         }
3661         else {
3662             MEXTEND(mark,0);
3663             *MARK = &PL_sv_undef;
3664         }
3665         SP = MARK;
3666     }
3667     else {
3668         /* in case LEAVE wipes old return values */
3669         register SV **mark;
3670         for (mark = newsp + 1; mark <= SP; mark++) {
3671             if (!(SvFLAGS(*mark) & (SVs_PADTMP|SVs_TEMP))) {
3672                 *mark = sv_mortalcopy(*mark);
3673                 TAINT_NOT;      /* Each item is independent */
3674             }
3675         }
3676     }
3677     PL_curpm = newpm;   /* Don't pop $1 et al till now */
3678
3679     LEAVE;
3680     sv_setpvn(ERRSV,"",0);
3681     RETURN;
3682 }
3683
3684 PP(pp_entergiven)
3685 {
3686     dVAR; dSP;
3687     register PERL_CONTEXT *cx;
3688     const I32 gimme = GIMME_V;
3689     
3690     ENTER;
3691     SAVETMPS;
3692
3693     if (PL_op->op_targ == 0) {
3694         SV ** const defsv_p = &GvSV(PL_defgv);
3695         *defsv_p = newSVsv(POPs);
3696         SAVECLEARSV(*defsv_p);
3697     }
3698     else
3699         sv_setsv(PAD_SV(PL_op->op_targ), POPs);
3700
3701     PUSHBLOCK(cx, CXt_GIVEN, SP);
3702     PUSHGIVEN(cx);
3703
3704     RETURN;
3705 }
3706
3707 PP(pp_leavegiven)
3708 {
3709     dVAR; dSP;
3710     register PERL_CONTEXT *cx;
3711     I32 gimme;
3712     SV **newsp;
3713     PMOP *newpm;
3714     PERL_UNUSED_CONTEXT;
3715
3716     POPBLOCK(cx,newpm);
3717     assert(CxTYPE(cx) == CXt_GIVEN);
3718
3719     SP = newsp;
3720     PUTBACK;
3721
3722     PL_curpm = newpm;   /* pop $1 et al */
3723
3724     LEAVE;
3725
3726     return NORMAL;
3727 }
3728
3729 /* Helper routines used by pp_smartmatch */
3730 STATIC PMOP *
3731 S_make_matcher(pTHX_ regexp *re)
3732 {
3733     dVAR;
3734     PMOP *matcher = (PMOP *) newPMOP(OP_MATCH, OPf_WANT_SCALAR | OPf_STACKED);
3735     PM_SETRE(matcher, ReREFCNT_inc(re));
3736     
3737     SAVEFREEOP((OP *) matcher);
3738     ENTER; SAVETMPS;
3739     SAVEOP();
3740     return matcher;
3741 }
3742
3743 STATIC bool
3744 S_matcher_matches_sv(pTHX_ PMOP *matcher, SV *sv)
3745 {
3746     dVAR;
3747     dSP;
3748     
3749     PL_op = (OP *) matcher;
3750     XPUSHs(sv);
3751     PUTBACK;
3752     (void) pp_match();
3753     SPAGAIN;
3754     return (SvTRUEx(POPs));
3755 }
3756
3757 STATIC void
3758 S_destroy_matcher(pTHX_ PMOP *matcher)
3759 {
3760     dVAR;
3761     PERL_UNUSED_ARG(matcher);
3762     FREETMPS;
3763     LEAVE;
3764 }
3765
3766 /* Do a smart match */
3767 PP(pp_smartmatch)
3768 {
3769     return do_smartmatch(NULL, NULL);
3770 }
3771
3772 /* This version of do_smartmatch() implements the
3773  * table of smart matches that is found in perlsyn.
3774  */
3775 STATIC OP *
3776 S_do_smartmatch(pTHX_ HV *seen_this, HV *seen_other)
3777 {
3778     dVAR;
3779     dSP;
3780     
3781     SV *e = TOPs;       /* e is for 'expression' */
3782     SV *d = TOPm1s;     /* d is for 'default', as in PL_defgv */
3783     SV *This, *Other;   /* 'This' (and Other to match) to play with C++ */
3784     MAGIC *mg;
3785     regexp *this_regex, *other_regex;
3786
3787 #   define NOT_EMPTY_PROTO(cv) (!SvPOK(cv) || SvCUR(cv) == 0)
3788
3789 #   define SM_REF(type) ( \
3790            (SvROK(d) && (SvTYPE(This = SvRV(d)) == SVt_##type) && (Other = e)) \
3791         || (SvROK(e) && (SvTYPE(This = SvRV(e)) == SVt_##type) && (Other = d)))
3792
3793 #   define SM_CV_NEP   /* Find a code ref without an empty prototype */ \
3794         ((SvROK(d) && (SvTYPE(This = SvRV(d)) == SVt_PVCV)              \
3795             && NOT_EMPTY_PROTO(This) && (Other = e))                    \
3796         || (SvROK(e) && (SvTYPE(This = SvRV(e)) == SVt_PVCV)            \
3797             && NOT_EMPTY_PROTO(This) && (Other = d)))
3798
3799 #   define SM_REGEX ( \
3800            (SvROK(d) && SvMAGICAL(This = SvRV(d))                       \
3801         && (mg = mg_find(This, PERL_MAGIC_qr))                          \
3802         && (this_regex = (regexp *)mg->mg_obj)                          \
3803         && (Other = e))                                                 \
3804     ||                                                                  \
3805            (SvROK(e) && SvMAGICAL(This = SvRV(e))                       \
3806         && (mg = mg_find(This, PERL_MAGIC_qr))                          \
3807         && (this_regex = (regexp *)mg->mg_obj)                          \
3808         && (Other = d)) )
3809         
3810
3811 #   define SM_OTHER_REF(type) \
3812         (SvROK(Other) && SvTYPE(SvRV(Other)) == SVt_##type)
3813
3814 #   define SM_OTHER_REGEX (SvROK(Other) && SvMAGICAL(SvRV(Other))       \
3815         && (mg = mg_find(SvRV(Other), PERL_MAGIC_qr))                   \
3816         && (other_regex = (regexp *)mg->mg_obj))
3817         
3818
3819 #   define SM_SEEN_THIS(sv) hv_exists_ent(seen_this, \
3820         sv_2mortal(newSViv(PTR2IV(sv))), 0)
3821
3822 #   define SM_SEEN_OTHER(sv) hv_exists_ent(seen_other, \
3823         sv_2mortal(newSViv(PTR2IV(sv))), 0)
3824
3825     tryAMAGICbinSET(smart, 0);
3826     
3827     SP -= 2;    /* Pop the values */
3828
3829     /* Take care only to invoke mg_get() once for each argument. 
3830      * Currently we do this by copying the SV if it's magical. */
3831     if (d) {
3832         if (SvGMAGICAL(d))
3833             d = sv_mortalcopy(d);
3834     }
3835     else
3836         d = &PL_sv_undef;
3837
3838     assert(e);
3839     if (SvGMAGICAL(e))
3840         e = sv_mortalcopy(e);
3841
3842     if (SM_CV_NEP) {
3843         I32 c;
3844         
3845         if ( SM_OTHER_REF(PVCV) && NOT_EMPTY_PROTO(SvRV(Other)) )
3846         {
3847             if (This == SvRV(Other))
3848                 RETPUSHYES;
3849             else
3850                 RETPUSHNO;
3851         }
3852         
3853         ENTER;
3854         SAVETMPS;
3855         PUSHMARK(SP);
3856         PUSHs(Other);
3857         PUTBACK;
3858         c = call_sv(This, G_SCALAR);
3859         SPAGAIN;
3860         if (c == 0)
3861             PUSHs(&PL_sv_no);
3862         else if (SvTEMP(TOPs))
3863             SvREFCNT_inc_void(TOPs);
3864         FREETMPS;
3865         LEAVE;
3866         RETURN;
3867     }
3868     else if (SM_REF(PVHV)) {
3869         if (SM_OTHER_REF(PVHV)) {
3870             /* Check that the key-sets are identical */
3871             HE *he;
3872             HV *other_hv = (HV *) SvRV(Other);
3873             bool tied = FALSE;
3874             bool other_tied = FALSE;
3875             U32 this_key_count  = 0,
3876                 other_key_count = 0;
3877             
3878             /* Tied hashes don't know how many keys they have. */
3879             if (SvTIED_mg(This, PERL_MAGIC_tied)) {
3880                 tied = TRUE;
3881             }
3882             else if (SvTIED_mg((SV *) other_hv, PERL_MAGIC_tied)) {
3883                 HV * const temp = other_hv;
3884                 other_hv = (HV *) This;
3885                 This  = (SV *) temp;
3886                 tied = TRUE;
3887             }
3888             if (SvTIED_mg((SV *) other_hv, PERL_MAGIC_tied))
3889                 other_tied = TRUE;
3890             
3891             if (!tied && HvUSEDKEYS((HV *) This) != HvUSEDKEYS(other_hv))
3892                 RETPUSHNO;
3893
3894             /* The hashes have the same number of keys, so it suffices
3895                to check that one is a subset of the other. */
3896             (void) hv_iterinit((HV *) This);
3897             while ( (he = hv_iternext((HV *) This)) ) {
3898                 I32 key_len;
3899                 char * const key = hv_iterkey(he, &key_len);
3900                 
3901                 ++ this_key_count;
3902                 
3903                 if(!hv_exists(other_hv, key, key_len)) {
3904                     (void) hv_iterinit((HV *) This);    /* reset iterator */
3905                     RETPUSHNO;
3906                 }
3907             }
3908             
3909             if (other_tied) {
3910                 (void) hv_iterinit(other_hv);
3911                 while ( hv_iternext(other_hv) )
3912                     ++other_key_count;
3913             }
3914             else
3915                 other_key_count = HvUSEDKEYS(other_hv);
3916             
3917             if (this_key_count != other_key_count)
3918                 RETPUSHNO;
3919             else
3920                 RETPUSHYES;
3921         }
3922         else if (SM_OTHER_REF(PVAV)) {
3923             AV * const other_av = (AV *) SvRV(Other);
3924             const I32 other_len = av_len(other_av) + 1;
3925             I32 i;
3926             
3927             if (HvUSEDKEYS((HV *) This) != other_len)
3928                 RETPUSHNO;
3929             
3930             for(i = 0; i < other_len; ++i) {
3931                 SV ** const svp = av_fetch(other_av, i, FALSE);
3932                 char *key;
3933                 STRLEN key_len;
3934
3935                 if (!svp)       /* ??? When can this happen? */
3936                     RETPUSHNO;
3937
3938                 key = SvPV(*svp, key_len);
3939                 if(!hv_exists((HV *) This, key, key_len))
3940                     RETPUSHNO;
3941             }
3942             RETPUSHYES;
3943         }
3944         else if (SM_OTHER_REGEX) {
3945             PMOP * const matcher = make_matcher(other_regex);
3946             HE *he;
3947
3948             (void) hv_iterinit((HV *) This);
3949             while ( (he = hv_iternext((HV *) This)) ) {
3950                 if (matcher_matches_sv(matcher, hv_iterkeysv(he))) {
3951                     (void) hv_iterinit((HV *) This);
3952                     destroy_matcher(matcher);
3953                     RETPUSHYES;
3954                 }
3955             }
3956             destroy_matcher(matcher);
3957             RETPUSHNO;
3958         }
3959         else {
3960             if (hv_exists_ent((HV *) This, Other, 0))
3961                 RETPUSHYES;
3962             else
3963                 RETPUSHNO;
3964         }
3965     }
3966     else if (SM_REF(PVAV)) {
3967         if (SM_OTHER_REF(PVAV)) {
3968             AV *other_av = (AV *) SvRV(Other);
3969             if (av_len((AV *) This) != av_len(other_av))
3970                 RETPUSHNO;
3971             else {
3972                 I32 i;
3973                 const I32 other_len = av_len(other_av);
3974
3975                 if (NULL == seen_this) {
3976                     seen_this = newHV();
3977                     (void) sv_2mortal((SV *) seen_this);
3978                 }
3979                 if (NULL == seen_other) {
3980                     seen_this = newHV();
3981                     (void) sv_2mortal((SV *) seen_other);
3982                 }
3983                 for(i = 0; i <= other_len; ++i) {
3984                     SV * const * const this_elem = av_fetch((AV *)This, i, FALSE);
3985                     SV * const * const other_elem = av_fetch(other_av, i, FALSE);
3986
3987                     if (!this_elem || !other_elem) {
3988                         if (this_elem || other_elem)
3989                             RETPUSHNO;
3990                     }
3991                     else if (SM_SEEN_THIS(*this_elem)
3992                          || SM_SEEN_OTHER(*other_elem))
3993                     {
3994                         if (*this_elem != *other_elem)
3995                             RETPUSHNO;
3996                     }
3997                     else {
3998                         hv_store_ent(seen_this,
3999                             sv_2mortal(newSViv(PTR2IV(*this_elem))),
4000                             &PL_sv_undef, 0);
4001                         hv_store_ent(seen_other,
4002                             sv_2mortal(newSViv(PTR2IV(*other_elem))),
4003                             &PL_sv_undef, 0);
4004                         PUSHs(*this_elem);
4005                         PUSHs(*other_elem);
4006                         
4007                         PUTBACK;
4008                         (void) do_smartmatch(seen_this, seen_other);
4009                         SPAGAIN;
4010                         
4011                         if (!SvTRUEx(POPs))
4012                             RETPUSHNO;
4013                     }
4014                 }
4015                 RETPUSHYES;
4016             }
4017         }
4018         else if (SM_OTHER_REGEX) {
4019             PMOP * const matcher = make_matcher(other_regex);
4020             const I32 this_len = av_len((AV *) This);
4021             I32 i;
4022
4023             for(i = 0; i <= this_len; ++i) {
4024                 SV * const * const svp = av_fetch((AV *)This, i, FALSE);
4025                 if (svp && matcher_matches_sv(matcher, *svp)) {
4026                     destroy_matcher(matcher);
4027                     RETPUSHYES;
4028                 }
4029             }
4030             destroy_matcher(matcher);
4031             RETPUSHNO;
4032         }
4033         else if (SvIOK(Other) || SvNOK(Other)) {
4034             I32 i;
4035
4036             for(i = 0; i <= AvFILL((AV *) This); ++i) {
4037                 SV * const * const svp = av_fetch((AV *)This, i, FALSE);
4038                 if (!svp)
4039                     continue;
4040                 
4041                 PUSHs(Other);
4042                 PUSHs(*svp);
4043                 PUTBACK;
4044                 if (CopHINTS_get(PL_curcop) & HINT_INTEGER)
4045                     (void) pp_i_eq();
4046                 else
4047                     (void) pp_eq();
4048                 SPAGAIN;
4049                 if (SvTRUEx(POPs))
4050                     RETPUSHYES;
4051             }
4052             RETPUSHNO;
4053         }
4054         else if (SvPOK(Other)) {
4055             const I32 this_len = av_len((AV *) This);
4056             I32 i;
4057
4058             for(i = 0; i <= this_len; ++i) {
4059                 SV * const * const svp = av_fetch((AV *)This, i, FALSE);
4060                 if (!svp)
4061                     continue;
4062                 
4063                 PUSHs(Other);
4064                 PUSHs(*svp);
4065                 PUTBACK;
4066                 (void) pp_seq();
4067                 SPAGAIN;
4068                 if (SvTRUEx(POPs))
4069                     RETPUSHYES;
4070             }
4071             RETPUSHNO;
4072         }
4073     }
4074     else if (!SvOK(d) || !SvOK(e)) {
4075         if (!SvOK(d) && !SvOK(e))
4076             RETPUSHYES;
4077         else
4078             RETPUSHNO;
4079     }
4080     else if (SM_REGEX) {
4081         PMOP * const matcher = make_matcher(this_regex);
4082
4083         PUTBACK;
4084         PUSHs(matcher_matches_sv(matcher, Other)
4085             ? &PL_sv_yes
4086             : &PL_sv_no);
4087         destroy_matcher(matcher);
4088         RETURN;
4089     }
4090     else if (SM_REF(PVCV)) {
4091         I32 c;
4092         /* This must be a null-prototyped sub, because we
4093            already checked for the other kind. */
4094         
4095         ENTER;
4096         SAVETMPS;
4097         PUSHMARK(SP);
4098         PUTBACK;
4099         c = call_sv(This, G_SCALAR);
4100         SPAGAIN;
4101         if (c == 0)
4102             PUSHs(&PL_sv_undef);
4103         else if (SvTEMP(TOPs))
4104             SvREFCNT_inc_void(TOPs);
4105
4106         if (SM_OTHER_REF(PVCV)) {
4107             /* This one has to be null-proto'd too.
4108                Call both of 'em, and compare the results */
4109             PUSHMARK(SP);
4110             c = call_sv(SvRV(Other), G_SCALAR);
4111             SPAGAIN;
4112             if (c == 0)
4113                 PUSHs(&PL_sv_undef);
4114             else if (SvTEMP(TOPs))
4115                 SvREFCNT_inc_void(TOPs);
4116             FREETMPS;
4117             LEAVE;
4118             PUTBACK;
4119             return pp_eq();
4120         }
4121         
4122         FREETMPS;
4123         LEAVE;
4124         RETURN;
4125     }
4126     else if ( ((SvIOK(d) || SvNOK(d)) && (This = d) && (Other = e))
4127          ||   ((SvIOK(e) || SvNOK(e)) && (This = e) && (Other = d)) )
4128     {
4129         if (SvPOK(Other) && !looks_like_number(Other)) {
4130             /* String comparison */
4131             PUSHs(d); PUSHs(e);
4132             PUTBACK;
4133             return pp_seq();
4134         }
4135         /* Otherwise, numeric comparison */
4136         PUSHs(d); PUSHs(e);
4137         PUTBACK;
4138         if (CopHINTS_get(PL_curcop) & HINT_INTEGER)
4139             (void) pp_i_eq();
4140         else
4141             (void) pp_eq();
4142         SPAGAIN;
4143         if (SvTRUEx(POPs))
4144             RETPUSHYES;
4145         else
4146             RETPUSHNO;
4147     }
4148     
4149     /* As a last resort, use string comparison */
4150     PUSHs(d); PUSHs(e);
4151     PUTBACK;
4152     return pp_seq();
4153 }
4154
4155 PP(pp_enterwhen)
4156 {
4157     dVAR; dSP;
4158     register PERL_CONTEXT *cx;
4159     const I32 gimme = GIMME_V;
4160
4161     /* This is essentially an optimization: if the match
4162        fails, we don't want to push a context and then
4163        pop it again right away, so we skip straight
4164        to the op that follows the leavewhen.
4165     */
4166     if ((0 == (PL_op->op_flags & OPf_SPECIAL)) && !SvTRUEx(POPs))
4167         return cLOGOP->op_other->op_next;
4168
4169     ENTER;
4170     SAVETMPS;
4171
4172     PUSHBLOCK(cx, CXt_WHEN, SP);
4173     PUSHWHEN(cx);
4174
4175     RETURN;
4176 }
4177
4178 PP(pp_leavewhen)
4179 {
4180     dVAR; dSP;
4181     register PERL_CONTEXT *cx;
4182     I32 gimme;
4183     SV **newsp;
4184     PMOP *newpm;
4185
4186     POPBLOCK(cx,newpm);
4187     assert(CxTYPE(cx) == CXt_WHEN);
4188
4189     SP = newsp;
4190     PUTBACK;
4191
4192     PL_curpm = newpm;   /* pop $1 et al */
4193
4194     LEAVE;
4195     return NORMAL;
4196 }
4197
4198 PP(pp_continue)
4199 {
4200     dVAR;   
4201     I32 cxix;
4202     register PERL_CONTEXT *cx;
4203     I32 inner;
4204     
4205     cxix = dopoptowhen(cxstack_ix); 
4206     if (cxix < 0)   
4207         DIE(aTHX_ "Can't \"continue\" outside a when block");
4208     if (cxix < cxstack_ix)
4209         dounwind(cxix);
4210     
4211     /* clear off anything above the scope we're re-entering */
4212     inner = PL_scopestack_ix;
4213     TOPBLOCK(cx);
4214     if (PL_scopestack_ix < inner)
4215         leave_scope(PL_scopestack[PL_scopestack_ix]);
4216     PL_curcop = cx->blk_oldcop;
4217     return cx->blk_givwhen.leave_op;
4218 }
4219
4220 PP(pp_break)
4221 {
4222     dVAR;   
4223     I32 cxix;
4224     register PERL_CONTEXT *cx;
4225     I32 inner;
4226     
4227     cxix = dopoptogiven(cxstack_ix); 
4228     if (cxix < 0) {
4229         if (PL_op->op_flags & OPf_SPECIAL)
4230             DIE(aTHX_ "Can't use when() outside a topicalizer");
4231         else
4232             DIE(aTHX_ "Can't \"break\" outside a given block");
4233     }
4234     if (CxFOREACH(&cxstack[cxix]) && (0 == (PL_op->op_flags & OPf_SPECIAL)))
4235         DIE(aTHX_ "Can't \"break\" in a loop topicalizer");
4236
4237     if (cxix < cxstack_ix)
4238         dounwind(cxix);
4239     
4240     /* clear off anything above the scope we're re-entering */
4241     inner = PL_scopestack_ix;
4242     TOPBLOCK(cx);
4243     if (PL_scopestack_ix < inner)
4244         leave_scope(PL_scopestack[PL_scopestack_ix]);
4245     PL_curcop = cx->blk_oldcop;
4246
4247     if (CxFOREACH(cx))
4248         return CX_LOOP_NEXTOP_GET(cx);
4249     else
4250         return cx->blk_givwhen.leave_op;
4251 }
4252
4253 STATIC OP *
4254 S_doparseform(pTHX_ SV *sv)
4255 {
4256     STRLEN len;
4257     register char *s = SvPV_force(sv, len);
4258     register char * const send = s + len;
4259     register char *base = NULL;
4260     register I32 skipspaces = 0;
4261     bool noblank   = FALSE;
4262     bool repeat    = FALSE;
4263     bool postspace = FALSE;
4264     U32 *fops;
4265     register U32 *fpc;
4266     U32 *linepc = NULL;
4267     register I32 arg;
4268     bool ischop;
4269     bool unchopnum = FALSE;
4270     int maxops = 12; /* FF_LINEMARK + FF_END + 10 (\0 without preceding \n) */
4271
4272     if (len == 0)
4273         Perl_croak(aTHX_ "Null picture in formline");
4274
4275     /* estimate the buffer size needed */
4276     for (base = s; s <= send; s++) {
4277         if (*s == '\n' || *s == '@' || *s == '^')
4278             maxops += 10;
4279     }
4280     s = base;
4281     base = NULL;
4282
4283     Newx(fops, maxops, U32);
4284     fpc = fops;
4285
4286     if (s < send) {
4287         linepc = fpc;
4288         *fpc++ = FF_LINEMARK;
4289         noblank = repeat = FALSE;
4290         base = s;
4291     }
4292
4293     while (s <= send) {
4294         switch (*s++) {
4295         default:
4296             skipspaces = 0;
4297             continue;
4298
4299         case '~':
4300             if (*s == '~') {
4301                 repeat = TRUE;
4302                 *s = ' ';
4303             }
4304             noblank = TRUE;
4305             s[-1] = ' ';
4306             /* FALL THROUGH */
4307         case ' ': case '\t':
4308             skipspaces++;
4309             continue;
4310         case 0:
4311             if (s < send) {
4312                 skipspaces = 0;
4313                 continue;
4314             } /* else FALL THROUGH */
4315         case '\n':
4316             arg = s - base;
4317             skipspaces++;
4318             arg -= skipspaces;
4319             if (arg) {
4320                 if (postspace)
4321                     *fpc++ = FF_SPACE;
4322                 *fpc++ = FF_LITERAL;
4323                 *fpc++ = (U16)arg;
4324             }
4325             postspace = FALSE;
4326             if (s <= send)
4327                 skipspaces--;
4328             if (skipspaces) {
4329                 *fpc++ = FF_SKIP;
4330                 *fpc++ = (U16)skipspaces;
4331             }
4332             skipspaces = 0;
4333             if (s <= send)
4334                 *fpc++ = FF_NEWLINE;
4335             if (noblank) {
4336                 *fpc++ = FF_BLANK;
4337                 if (repeat)
4338                     arg = fpc - linepc + 1;
4339                 else
4340                     arg = 0;
4341                 *fpc++ = (U16)arg;
4342             }
4343             if (s < send) {
4344                 linepc = fpc;
4345                 *fpc++ = FF_LINEMARK;
4346                 noblank = repeat = FALSE;
4347                 base = s;
4348             }
4349             else
4350                 s++;
4351             continue;
4352
4353         case '@':
4354         case '^':
4355             ischop = s[-1] == '^';
4356
4357             if (postspace) {
4358                 *fpc++ = FF_SPACE;
4359                 postspace = FALSE;
4360             }
4361             arg = (s - base) - 1;
4362             if (arg) {
4363                 *fpc++ = FF_LITERAL;
4364                 *fpc++ = (U16)arg;
4365             }
4366
4367             base = s - 1;
4368             *fpc++ = FF_FETCH;
4369             if (*s == '*') {
4370                 s++;
4371                 *fpc++ = 2;  /* skip the @* or ^* */
4372                 if (ischop) {
4373                     *fpc++ = FF_LINESNGL;
4374                     *fpc++ = FF_CHOP;
4375                 } else
4376                     *fpc++ = FF_LINEGLOB;
4377             }
4378             else if (*s == '#' || (*s == '.' && s[1] == '#')) {
4379                 arg = ischop ? 512 : 0;
4380                 base = s - 1;
4381                 while (*s == '#')
4382                     s++;
4383                 if (*s == '.') {
4384                     const char * const f = ++s;
4385                     while (*s == '#')
4386                         s++;
4387                     arg |= 256 + (s - f);
4388                 }
4389                 *fpc++ = s - base;              /* fieldsize for FETCH */
4390                 *fpc++ = FF_DECIMAL;
4391                 *fpc++ = (U16)arg;
4392                 unchopnum |= ! ischop;
4393             }
4394             else if (*s == '0' && s[1] == '#') {  /* Zero padded decimals */
4395                 arg = ischop ? 512 : 0;
4396                 base = s - 1;
4397                 s++;                                /* skip the '0' first */
4398                 while (*s == '#')
4399                     s++;
4400                 if (*s == '.') {
4401                     const char * const f = ++s;
4402                     while (*s == '#')
4403                         s++;
4404                     arg |= 256 + (s - f);
4405                 }
4406                 *fpc++ = s - base;                /* fieldsize for FETCH */
4407                 *fpc++ = FF_0DECIMAL;
4408                 *fpc++ = (U16)arg;
4409                 unchopnum |= ! ischop;
4410             }
4411             else {
4412                 I32 prespace = 0;
4413                 bool ismore = FALSE;
4414
4415                 if (*s == '>') {
4416                     while (*++s == '>') ;
4417                     prespace = FF_SPACE;
4418                 }
4419                 else if (*s == '|') {
4420                     while (*++s == '|') ;
4421                     prespace = FF_HALFSPACE;
4422                     postspace = TRUE;
4423                 }
4424                 else {
4425                     if (*s == '<')
4426                         while (*++s == '<') ;
4427                     postspace = TRUE;
4428                 }
4429                 if (*s == '.' && s[1] == '.' && s[2] == '.') {
4430                     s += 3;
4431                     ismore = TRUE;
4432                 }
4433                 *fpc++ = s - base;              /* fieldsize for FETCH */
4434
4435                 *fpc++ = ischop ? FF_CHECKCHOP : FF_CHECKNL;
4436
4437                 if (prespace)
4438                     *fpc++ = (U16)prespace;
4439                 *fpc++ = FF_ITEM;
4440                 if (ismore)
4441                     *fpc++ = FF_MORE;
4442                 if (ischop)
4443                     *fpc++ = FF_CHOP;
4444             }
4445             base = s;
4446             skipspaces = 0;
4447             continue;
4448         }
4449     }
4450     *fpc++ = FF_END;
4451
4452     assert (fpc <= fops + maxops); /* ensure our buffer estimate was valid */
4453     arg = fpc - fops;
4454     { /* need to jump to the next word */
4455         int z;
4456         z = WORD_ALIGN - SvCUR(sv) % WORD_ALIGN;
4457         SvGROW(sv, SvCUR(sv) + z + arg * sizeof(U32) + 4);
4458         s = SvPVX(sv) + SvCUR(sv) + z;
4459     }
4460     Copy(fops, s, arg, U32);
4461     Safefree(fops);
4462     sv_magic(sv, NULL, PERL_MAGIC_fm, NULL, 0);
4463     SvCOMPILED_on(sv);
4464
4465     if (unchopnum && repeat)
4466         DIE(aTHX_ "Repeated format line will never terminate (~~ and @#)");
4467     return 0;
4468 }
4469
4470
4471 STATIC bool
4472 S_num_overflow(NV value, I32 fldsize, I32 frcsize)
4473 {
4474     /* Can value be printed in fldsize chars, using %*.*f ? */
4475     NV pwr = 1;
4476     NV eps = 0.5;
4477     bool res = FALSE;
4478     int intsize = fldsize - (value < 0 ? 1 : 0);
4479
4480     if (frcsize & 256)
4481         intsize--;
4482     frcsize &= 255;
4483     intsize -= frcsize;
4484
4485     while (intsize--) pwr *= 10.0;
4486     while (frcsize--) eps /= 10.0;
4487
4488     if( value >= 0 ){
4489         if (value + eps >= pwr)
4490             res = TRUE;
4491     } else {
4492         if (value - eps <= -pwr)
4493             res = TRUE;
4494     }
4495     return res;
4496 }
4497
4498 static I32
4499 S_run_user_filter(pTHX_ int idx, SV *buf_sv, int maxlen)
4500 {
4501     dVAR;
4502     SV * const datasv = FILTER_DATA(idx);
4503     const int filter_has_file = IoLINES(datasv);
4504     SV * const filter_state = (SV *)IoTOP_GV(datasv);
4505     SV * const filter_sub = (SV *)IoBOTTOM_GV(datasv);
4506     int status = 0;
4507     SV *upstream;
4508     STRLEN got_len;
4509     const char *got_p = NULL;
4510     const char *prune_from = NULL;
4511     bool read_from_cache = FALSE;
4512     STRLEN umaxlen;
4513
4514     assert(maxlen >= 0);
4515     umaxlen = maxlen;
4516
4517     /* I was having segfault trouble under Linux 2.2.5 after a
4518        parse error occured.  (Had to hack around it with a test
4519        for PL_error_count == 0.)  Solaris doesn't segfault --
4520        not sure where the trouble is yet.  XXX */
4521
4522     if (IoFMT_GV(datasv)) {
4523         SV *const cache = (SV *)IoFMT_GV(datasv);
4524         if (SvOK(cache)) {
4525             STRLEN cache_len;
4526             const char *cache_p = SvPV(cache, cache_len);
4527             STRLEN take = 0;
4528
4529             if (umaxlen) {
4530                 /* Running in block mode and we have some cached data already.
4531                  */
4532                 if (cache_len >= umaxlen) {
4533                     /* In fact, so much data we don't even need to call
4534                        filter_read.  */
4535                     take = umaxlen;
4536                 }
4537             } else {
4538                 const char *const first_nl =
4539                     (const char *)memchr(cache_p, '\n', cache_len);
4540                 if (first_nl) {
4541                     take = first_nl + 1 - cache_p;
4542                 }
4543             }
4544             if (take) {
4545                 sv_catpvn(buf_sv, cache_p, take);
4546                 sv_chop(cache, cache_p + take);
4547                 /* Definately not EOF  */
4548                 return 1;
4549             }
4550
4551             sv_catsv(buf_sv, cache);
4552             if (umaxlen) {
4553                 umaxlen -= cache_len;
4554             }
4555             SvOK_off(cache);
4556             read_from_cache = TRUE;
4557         }
4558     }
4559
4560     /* Filter API says that the filter appends to the contents of the buffer.
4561        Usually the buffer is "", so the details don't matter. But if it's not,
4562        then clearly what it contains is already filtered by this filter, so we
4563        don't want to pass it in a second time.
4564        I'm going to use a mortal in case the upstream filter croaks.  */
4565     upstream = ((SvOK(buf_sv) && sv_len(buf_sv)) || SvGMAGICAL(buf_sv))
4566         ? sv_newmortal() : buf_sv;
4567     SvUPGRADE(upstream, SVt_PV);
4568         
4569     if (filter_has_file) {
4570         status = FILTER_READ(idx+1, upstream, 0);
4571     }
4572
4573     if (filter_sub && status >= 0) {
4574         dSP;
4575         int count;
4576
4577         ENTER;
4578         SAVE_DEFSV;
4579         SAVETMPS;
4580         EXTEND(SP, 2);
4581
4582         DEFSV = upstream;
4583         PUSHMARK(SP);
4584         PUSHs(sv_2mortal(newSViv(0)));
4585         if (filter_state) {
4586             PUSHs(filter_state);
4587         }
4588         PUTBACK;
4589         count = call_sv(filter_sub, G_SCALAR);
4590         SPAGAIN;
4591
4592         if (count > 0) {
4593             SV *out = POPs;
4594             if (SvOK(out)) {
4595                 status = SvIV(out);
4596             }
4597         }
4598
4599         PUTBACK;
4600         FREETMPS;
4601         LEAVE;
4602     }
4603
4604     if(SvOK(upstream)) {
4605         got_p = SvPV(upstream, got_len);
4606         if (umaxlen) {
4607             if (got_len > umaxlen) {
4608                 prune_from = got_p + umaxlen;
4609             }
4610         } else {
4611             const char *const first_nl =
4612                 (const char *)memchr(got_p, '\n', got_len);
4613             if (first_nl && first_nl + 1 < got_p + got_len) {
4614                 /* There's a second line here... */
4615                 prune_from = first_nl + 1;
4616             }
4617         }
4618     }
4619     if (prune_from) {
4620         /* Oh. Too long. Stuff some in our cache.  */
4621         STRLEN cached_len = got_p + got_len - prune_from;
4622         SV *cache = (SV *)IoFMT_GV(datasv);
4623
4624         if (!cache) {
4625             IoFMT_GV(datasv) = (GV*) (cache = newSV(got_len - umaxlen));
4626         } else if (SvOK(cache)) {
4627             /* Cache should be empty.  */
4628             assert(!SvCUR(cache));
4629         }
4630
4631         sv_setpvn(cache, prune_from, cached_len);
4632         /* If you ask for block mode, you may well split UTF-8 characters.
4633            "If it breaks, you get to keep both parts"
4634            (Your code is broken if you  don't put them back together again
4635            before something notices.) */
4636         if (SvUTF8(upstream)) {
4637             SvUTF8_on(cache);
4638         }
4639         SvCUR_set(upstream, got_len - cached_len);
4640         /* Can't yet be EOF  */
4641         if (status == 0)
4642             status = 1;
4643     }
4644
4645     /* If they are at EOF but buf_sv has something in it, then they may never
4646        have touched the SV upstream, so it may be undefined.  If we naively
4647        concatenate it then we get a warning about use of uninitialised value.
4648     */
4649     if (upstream != buf_sv && (SvOK(upstream) || SvGMAGICAL(upstream))) {
4650         sv_catsv(buf_sv, upstream);
4651     }
4652
4653     if (status <= 0) {
4654         IoLINES(datasv) = 0;
4655         SvREFCNT_dec(IoFMT_GV(datasv));
4656         if (filter_state) {
4657             SvREFCNT_dec(filter_state);
4658             IoTOP_GV(datasv) = NULL;
4659         }
4660         if (filter_sub) {
4661             SvREFCNT_dec(filter_sub);
4662             IoBOTTOM_GV(datasv) = NULL;
4663         }
4664         filter_del(S_run_user_filter);
4665     }
4666     if (status == 0 && read_from_cache) {
4667         /* If we read some data from the cache (and by getting here it implies
4668            that we emptied the cache) then we aren't yet at EOF, and mustn't
4669            report that to our caller.  */
4670         return 1;
4671     }
4672     return status;
4673 }
4674
4675 /* perhaps someone can come up with a better name for
4676    this?  it is not really "absolute", per se ... */
4677 static bool
4678 S_path_is_absolute(const char *name)
4679 {
4680     if (PERL_FILE_IS_ABSOLUTE(name)
4681 #ifdef MACOS_TRADITIONAL
4682         || (*name == ':')
4683 #else
4684         || (*name == '.' && (name[1] == '/' ||
4685                              (name[1] == '.' && name[2] == '/')))
4686 #endif
4687          )
4688     {
4689         return TRUE;
4690     }
4691     else
4692         return FALSE;
4693 }
4694
4695 /*
4696  * Local variables:
4697  * c-indentation-style: bsd
4698  * c-basic-offset: 4
4699  * indent-tabs-mode: t
4700  * End:
4701  *
4702  * ex: set ts=8 sts=4 sw=4 noet:
4703  */