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