This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
e9a4f75f2a2245259ad419f29d834103ac4939f9
[perl5.git] / pp_ctl.c
1 /*    pp_ctl.c
2  *
3  *    Copyright (c) 1991-1999, Larry Wall
4  *
5  *    You may distribute under the terms of either the GNU General Public
6  *    License or the Artistic License, as specified in the README file.
7  *
8  */
9
10 /*
11  * Now far ahead the Road has gone,
12  * And I must follow, if I can,
13  * Pursuing it with eager feet,
14  * Until it joins some larger way
15  * Where many paths and errands meet.
16  * And whither then?  I cannot say.
17  */
18
19 #include "EXTERN.h"
20 #define PERL_IN_PP_CTL_C
21 #include "perl.h"
22
23 #ifndef WORD_ALIGN
24 #define WORD_ALIGN sizeof(U16)
25 #endif
26
27 #define DOCATCH(o) ((CATCH_GET == TRUE) ? docatch(o) : (o))
28
29 static I32 sortcv(pTHXo_ SV *a, SV *b);
30 static I32 sv_ncmp(pTHXo_ SV *a, SV *b);
31 static I32 sv_i_ncmp(pTHXo_ SV *a, SV *b);
32 static I32 amagic_ncmp(pTHXo_ SV *a, SV *b);
33 static I32 amagic_i_ncmp(pTHXo_ SV *a, SV *b);
34 static I32 amagic_cmp(pTHXo_ SV *a, SV *b);
35 static I32 amagic_cmp_locale(pTHXo_ SV *a, SV *b);
36 static I32 run_user_filter(pTHXo_ int idx, SV *buf_sv, int maxlen);
37
38 #ifdef PERL_OBJECT
39 static I32 sv_cmp_static(pTHXo_ SV *a, SV *b);
40 static I32 sv_cmp_locale_static(pTHXo_ SV *a, SV *b);
41 #else
42 #define sv_cmp_static Perl_sv_cmp
43 #define sv_cmp_locale_static Perl_sv_cmp_locale
44 #endif
45
46 PP(pp_wantarray)
47 {
48     djSP;
49     I32 cxix;
50     EXTEND(SP, 1);
51
52     cxix = dopoptosub(cxstack_ix);
53     if (cxix < 0)
54         RETPUSHUNDEF;
55
56     switch (cxstack[cxix].blk_gimme) {
57     case G_ARRAY:
58         RETPUSHYES;
59     case G_SCALAR:
60         RETPUSHNO;
61     default:
62         RETPUSHUNDEF;
63     }
64 }
65
66 PP(pp_regcmaybe)
67 {
68     return NORMAL;
69 }
70
71 PP(pp_regcreset)
72 {
73     /* XXXX Should store the old value to allow for tie/overload - and
74        restore in regcomp, where marked with XXXX. */
75     PL_reginterp_cnt = 0;
76     return NORMAL;
77 }
78
79 PP(pp_regcomp)
80 {
81     djSP;
82     register PMOP *pm = (PMOP*)cLOGOP->op_other;
83     register char *t;
84     SV *tmpstr;
85     STRLEN len;
86     MAGIC *mg = Null(MAGIC*);
87
88     tmpstr = POPs;
89     if (SvROK(tmpstr)) {
90         SV *sv = SvRV(tmpstr);
91         if(SvMAGICAL(sv))
92             mg = mg_find(sv, 'r');
93     }
94     if (mg) {
95         regexp *re = (regexp *)mg->mg_obj;
96         ReREFCNT_dec(pm->op_pmregexp);
97         pm->op_pmregexp = ReREFCNT_inc(re);
98     }
99     else {
100         t = SvPV(tmpstr, len);
101
102         /* Check against the last compiled regexp. */
103         if (!pm->op_pmregexp || !pm->op_pmregexp->precomp ||
104             pm->op_pmregexp->prelen != len ||
105             memNE(pm->op_pmregexp->precomp, t, len))
106         {
107             if (pm->op_pmregexp) {
108                 ReREFCNT_dec(pm->op_pmregexp);
109                 pm->op_pmregexp = Null(REGEXP*);        /* crucial if regcomp aborts */
110             }
111             if (PL_op->op_flags & OPf_SPECIAL)
112                 PL_reginterp_cnt = I32_MAX; /* Mark as safe.  */
113
114             pm->op_pmflags = pm->op_pmpermflags;        /* reset case sensitivity */
115             pm->op_pmregexp = CALLREGCOMP(aTHX_ t, t + len, pm);
116             PL_reginterp_cnt = 0;               /* XXXX Be extra paranoid - needed
117                                            inside tie/overload accessors.  */
118         }
119     }
120
121 #ifndef INCOMPLETE_TAINTS
122     if (PL_tainting) {
123         if (PL_tainted)
124             pm->op_pmdynflags |= PMdf_TAINTED;
125         else
126             pm->op_pmdynflags &= ~PMdf_TAINTED;
127     }
128 #endif
129
130     if (!pm->op_pmregexp->prelen && PL_curpm)
131         pm = PL_curpm;
132     else if (strEQ("\\s+", pm->op_pmregexp->precomp))
133         pm->op_pmflags |= PMf_WHITE;
134
135     if (pm->op_pmflags & PMf_KEEP) {
136         pm->op_private &= ~OPpRUNTIME;  /* no point compiling again */
137         cLOGOP->op_first->op_next = PL_op->op_next;
138     }
139     RETURN;
140 }
141
142 PP(pp_substcont)
143 {
144     djSP;
145     register PMOP *pm = (PMOP*) cLOGOP->op_other;
146     register PERL_CONTEXT *cx = &cxstack[cxstack_ix];
147     register SV *dstr = cx->sb_dstr;
148     register char *s = cx->sb_s;
149     register char *m = cx->sb_m;
150     char *orig = cx->sb_orig;
151     register REGEXP *rx = cx->sb_rx;
152
153     rxres_restore(&cx->sb_rxres, rx);
154
155     if (cx->sb_iters++) {
156         if (cx->sb_iters > cx->sb_maxiters)
157             DIE(aTHX_ "Substitution loop");
158
159         if (!(cx->sb_rxtainted & 2) && SvTAINTED(TOPs))
160             cx->sb_rxtainted |= 2;
161         sv_catsv(dstr, POPs);
162
163         /* Are we done */
164         if (cx->sb_once || !CALLREGEXEC(aTHX_ rx, s, cx->sb_strend, orig,
165                                      s == m, cx->sb_targ, NULL,
166                                      ((cx->sb_rflags & REXEC_COPY_STR)
167                                       ? (REXEC_IGNOREPOS|REXEC_NOT_FIRST)
168                                       : (REXEC_COPY_STR|REXEC_IGNOREPOS|REXEC_NOT_FIRST))))
169         {
170             SV *targ = cx->sb_targ;
171             sv_catpvn(dstr, s, cx->sb_strend - s);
172
173             cx->sb_rxtainted |= RX_MATCH_TAINTED(rx);
174
175             (void)SvOOK_off(targ);
176             Safefree(SvPVX(targ));
177             SvPVX(targ) = SvPVX(dstr);
178             SvCUR_set(targ, SvCUR(dstr));
179             SvLEN_set(targ, SvLEN(dstr));
180             SvPVX(dstr) = 0;
181             sv_free(dstr);
182
183             TAINT_IF(cx->sb_rxtainted & 1);
184             PUSHs(sv_2mortal(newSViv((I32)cx->sb_iters - 1)));
185
186             (void)SvPOK_only(targ);
187             TAINT_IF(cx->sb_rxtainted);
188             SvSETMAGIC(targ);
189             SvTAINT(targ);
190
191             LEAVE_SCOPE(cx->sb_oldsave);
192             POPSUBST(cx);
193             RETURNOP(pm->op_next);
194         }
195     }
196     if (RX_MATCH_COPIED(rx) && rx->subbeg != orig) {
197         m = s;
198         s = orig;
199         cx->sb_orig = orig = rx->subbeg;
200         s = orig + (m - s);
201         cx->sb_strend = s + (cx->sb_strend - m);
202     }
203     cx->sb_m = m = rx->startp[0] + orig;
204     sv_catpvn(dstr, s, m-s);
205     cx->sb_s = rx->endp[0] + orig;
206     cx->sb_rxtainted |= RX_MATCH_TAINTED(rx);
207     rxres_save(&cx->sb_rxres, rx);
208     RETURNOP(pm->op_pmreplstart);
209 }
210
211 void
212 Perl_rxres_save(pTHX_ void **rsp, REGEXP *rx)
213 {
214     UV *p = (UV*)*rsp;
215     U32 i;
216
217     if (!p || p[1] < rx->nparens) {
218         i = 6 + rx->nparens * 2;
219         if (!p)
220             New(501, p, i, UV);
221         else
222             Renew(p, i, UV);
223         *rsp = (void*)p;
224     }
225
226     *p++ = PTR2UV(RX_MATCH_COPIED(rx) ? rx->subbeg : Nullch);
227     RX_MATCH_COPIED_off(rx);
228
229     *p++ = rx->nparens;
230
231     *p++ = PTR2UV(rx->subbeg);
232     *p++ = (UV)rx->sublen;
233     for (i = 0; i <= rx->nparens; ++i) {
234         *p++ = (UV)rx->startp[i];
235         *p++ = (UV)rx->endp[i];
236     }
237 }
238
239 void
240 Perl_rxres_restore(pTHX_ void **rsp, REGEXP *rx)
241 {
242     UV *p = (UV*)*rsp;
243     U32 i;
244
245     if (RX_MATCH_COPIED(rx))
246         Safefree(rx->subbeg);
247     RX_MATCH_COPIED_set(rx, *p);
248     *p++ = 0;
249
250     rx->nparens = *p++;
251
252     rx->subbeg = INT2PTR(char*,*p++);
253     rx->sublen = (I32)(*p++);
254     for (i = 0; i <= rx->nparens; ++i) {
255         rx->startp[i] = (I32)(*p++);
256         rx->endp[i] = (I32)(*p++);
257     }
258 }
259
260 void
261 Perl_rxres_free(pTHX_ void **rsp)
262 {
263     UV *p = (UV*)*rsp;
264
265     if (p) {
266         Safefree(INT2PTR(char*,*p));
267         Safefree(p);
268         *rsp = Null(void*);
269     }
270 }
271
272 PP(pp_formline)
273 {
274     djSP; dMARK; dORIGMARK;
275     register SV *tmpForm = *++MARK;
276     register U16 *fpc;
277     register char *t;
278     register char *f;
279     register char *s;
280     register char *send;
281     register I32 arg;
282     register SV *sv;
283     char *item;
284     I32 itemsize;
285     I32 fieldsize;
286     I32 lines = 0;
287     bool chopspace = (strchr(PL_chopset, ' ') != Nullch);
288     char *chophere;
289     char *linemark;
290     NV value;
291     bool gotsome;
292     STRLEN len;
293     STRLEN fudge = SvCUR(tmpForm) * (IN_UTF8 ? 3 : 1) + 1;
294
295     if (!SvMAGICAL(tmpForm) || !SvCOMPILED(tmpForm)) {
296         SvREADONLY_off(tmpForm);
297         doparseform(tmpForm);
298     }
299
300     SvPV_force(PL_formtarget, len);
301     t = SvGROW(PL_formtarget, len + fudge + 1);  /* XXX SvCUR bad */
302     t += len;
303     f = SvPV(tmpForm, len);
304     /* need to jump to the next word */
305     s = f + len + WORD_ALIGN - SvCUR(tmpForm) % WORD_ALIGN;
306
307     fpc = (U16*)s;
308
309     for (;;) {
310         DEBUG_f( {
311             char *name = "???";
312             arg = -1;
313             switch (*fpc) {
314             case FF_LITERAL:    arg = fpc[1]; name = "LITERAL"; break;
315             case FF_BLANK:      arg = fpc[1]; name = "BLANK";   break;
316             case FF_SKIP:       arg = fpc[1]; name = "SKIP";    break;
317             case FF_FETCH:      arg = fpc[1]; name = "FETCH";   break;
318             case FF_DECIMAL:    arg = fpc[1]; name = "DECIMAL"; break;
319
320             case FF_CHECKNL:    name = "CHECKNL";       break;
321             case FF_CHECKCHOP:  name = "CHECKCHOP";     break;
322             case FF_SPACE:      name = "SPACE";         break;
323             case FF_HALFSPACE:  name = "HALFSPACE";     break;
324             case FF_ITEM:       name = "ITEM";          break;
325             case FF_CHOP:       name = "CHOP";          break;
326             case FF_LINEGLOB:   name = "LINEGLOB";      break;
327             case FF_NEWLINE:    name = "NEWLINE";       break;
328             case FF_MORE:       name = "MORE";          break;
329             case FF_LINEMARK:   name = "LINEMARK";      break;
330             case FF_END:        name = "END";           break;
331             }
332             if (arg >= 0)
333                 PerlIO_printf(Perl_debug_log, "%-16s%ld\n", name, (long) arg);
334             else
335                 PerlIO_printf(Perl_debug_log, "%-16s\n", name);
336         } )
337         switch (*fpc++) {
338         case FF_LINEMARK:
339             linemark = t;
340             lines++;
341             gotsome = FALSE;
342             break;
343
344         case FF_LITERAL:
345             arg = *fpc++;
346             while (arg--)
347                 *t++ = *f++;
348             break;
349
350         case FF_SKIP:
351             f += *fpc++;
352             break;
353
354         case FF_FETCH:
355             arg = *fpc++;
356             f += arg;
357             fieldsize = arg;
358
359             if (MARK < SP)
360                 sv = *++MARK;
361             else {
362                 sv = &PL_sv_no;
363                 if (ckWARN(WARN_SYNTAX))
364                     Perl_warner(aTHX_ WARN_SYNTAX, "Not enough format arguments");
365             }
366             break;
367
368         case FF_CHECKNL:
369             item = s = SvPV(sv, len);
370             itemsize = len;
371             if (IN_UTF8) {
372                 itemsize = sv_len_utf8(sv);
373                 if (itemsize != len) {
374                     I32 itembytes;
375                     if (itemsize > fieldsize) {
376                         itemsize = fieldsize;
377                         itembytes = itemsize;
378                         sv_pos_u2b(sv, &itembytes, 0);
379                     }
380                     else
381                         itembytes = len;
382                     send = chophere = s + itembytes;
383                     while (s < send) {
384                         if (*s & ~31)
385                             gotsome = TRUE;
386                         else if (*s == '\n')
387                             break;
388                         s++;
389                     }
390                     itemsize = s - item;
391                     sv_pos_b2u(sv, &itemsize);
392                     break;
393                 }
394             }
395             if (itemsize > fieldsize)
396                 itemsize = fieldsize;
397             send = chophere = s + itemsize;
398             while (s < send) {
399                 if (*s & ~31)
400                     gotsome = TRUE;
401                 else if (*s == '\n')
402                     break;
403                 s++;
404             }
405             itemsize = s - item;
406             break;
407
408         case FF_CHECKCHOP:
409             item = s = SvPV(sv, len);
410             itemsize = len;
411             if (IN_UTF8) {
412                 itemsize = sv_len_utf8(sv);
413                 if (itemsize != len) {
414                     I32 itembytes;
415                     if (itemsize <= fieldsize) {
416                         send = chophere = s + itemsize;
417                         while (s < send) {
418                             if (*s == '\r') {
419                                 itemsize = s - item;
420                                 break;
421                             }
422                             if (*s++ & ~31)
423                                 gotsome = TRUE;
424                         }
425                     }
426                     else {
427                         itemsize = fieldsize;
428                         itembytes = itemsize;
429                         sv_pos_u2b(sv, &itembytes, 0);
430                         send = chophere = s + itembytes;
431                         while (s < send || (s == send && isSPACE(*s))) {
432                             if (isSPACE(*s)) {
433                                 if (chopspace)
434                                     chophere = s;
435                                 if (*s == '\r')
436                                     break;
437                             }
438                             else {
439                                 if (*s & ~31)
440                                     gotsome = TRUE;
441                                 if (strchr(PL_chopset, *s))
442                                     chophere = s + 1;
443                             }
444                             s++;
445                         }
446                         itemsize = chophere - item;
447                         sv_pos_b2u(sv, &itemsize);
448                     }
449                     break;
450                 }
451             }
452             if (itemsize <= fieldsize) {
453                 send = chophere = s + itemsize;
454                 while (s < send) {
455                     if (*s == '\r') {
456                         itemsize = s - item;
457                         break;
458                     }
459                     if (*s++ & ~31)
460                         gotsome = TRUE;
461                 }
462             }
463             else {
464                 itemsize = fieldsize;
465                 send = chophere = s + itemsize;
466                 while (s < send || (s == send && isSPACE(*s))) {
467                     if (isSPACE(*s)) {
468                         if (chopspace)
469                             chophere = s;
470                         if (*s == '\r')
471                             break;
472                     }
473                     else {
474                         if (*s & ~31)
475                             gotsome = TRUE;
476                         if (strchr(PL_chopset, *s))
477                             chophere = s + 1;
478                     }
479                     s++;
480                 }
481                 itemsize = chophere - item;
482             }
483             break;
484
485         case FF_SPACE:
486             arg = fieldsize - itemsize;
487             if (arg) {
488                 fieldsize -= arg;
489                 while (arg-- > 0)
490                     *t++ = ' ';
491             }
492             break;
493
494         case FF_HALFSPACE:
495             arg = fieldsize - itemsize;
496             if (arg) {
497                 arg /= 2;
498                 fieldsize -= arg;
499                 while (arg-- > 0)
500                     *t++ = ' ';
501             }
502             break;
503
504         case FF_ITEM:
505             arg = itemsize;
506             s = item;
507             if (IN_UTF8) {
508                 while (arg--) {
509                     if (*s & 0x80) {
510                         switch (UTF8SKIP(s)) {
511                         case 7: *t++ = *s++;
512                         case 6: *t++ = *s++;
513                         case 5: *t++ = *s++;
514                         case 4: *t++ = *s++;
515                         case 3: *t++ = *s++;
516                         case 2: *t++ = *s++;
517                         case 1: *t++ = *s++;
518                         }
519                     }
520                     else {
521                         if ( !((*t++ = *s++) & ~31) )
522                             t[-1] = ' ';
523                     }
524                 }
525                 break;
526             }
527             while (arg--) {
528 #ifdef EBCDIC
529                 int ch = *t++ = *s++;
530                 if (iscntrl(ch))
531 #else
532                 if ( !((*t++ = *s++) & ~31) )
533 #endif
534                     t[-1] = ' ';
535             }
536             break;
537
538         case FF_CHOP:
539             s = chophere;
540             if (chopspace) {
541                 while (*s && isSPACE(*s))
542                     s++;
543             }
544             sv_chop(sv,s);
545             break;
546
547         case FF_LINEGLOB:
548             item = s = SvPV(sv, len);
549             itemsize = len;
550             if (itemsize) {
551                 gotsome = TRUE;
552                 send = s + itemsize;
553                 while (s < send) {
554                     if (*s++ == '\n') {
555                         if (s == send)
556                             itemsize--;
557                         else
558                             lines++;
559                     }
560                 }
561                 SvCUR_set(PL_formtarget, t - SvPVX(PL_formtarget));
562                 sv_catpvn(PL_formtarget, item, itemsize);
563                 SvGROW(PL_formtarget, SvCUR(PL_formtarget) + fudge + 1);
564                 t = SvPVX(PL_formtarget) + SvCUR(PL_formtarget);
565             }
566             break;
567
568         case FF_DECIMAL:
569             /* If the field is marked with ^ and the value is undefined,
570                blank it out. */
571             arg = *fpc++;
572             if ((arg & 512) && !SvOK(sv)) {
573                 arg = fieldsize;
574                 while (arg--)
575                     *t++ = ' ';
576                 break;
577             }
578             gotsome = TRUE;
579             value = SvNV(sv);
580             /* Formats aren't yet marked for locales, so assume "yes". */
581             {
582                 RESTORE_NUMERIC_LOCAL();
583 #if defined(USE_LONG_DOUBLE)
584                 if (arg & 256) {
585                     sprintf(t, "%#*.*" PERL_PRIfldbl,
586                             (int) fieldsize, (int) arg & 255, value);
587                 } else {
588                     sprintf(t, "%*.0" PERL_PRIfldbl, (int) fieldsize, value);
589                 }
590 #else
591                 if (arg & 256) {
592                     sprintf(t, "%#*.*f",
593                             (int) fieldsize, (int) arg & 255, value);
594                 } else {
595                     sprintf(t, "%*.0f",
596                             (int) fieldsize, value);
597                 }
598 #endif
599                 RESTORE_NUMERIC_STANDARD();
600             }
601             t += fieldsize;
602             break;
603
604         case FF_NEWLINE:
605             f++;
606             while (t-- > linemark && *t == ' ') ;
607             t++;
608             *t++ = '\n';
609             break;
610
611         case FF_BLANK:
612             arg = *fpc++;
613             if (gotsome) {
614                 if (arg) {              /* repeat until fields exhausted? */
615                     *t = '\0';
616                     SvCUR_set(PL_formtarget, t - SvPVX(PL_formtarget));
617                     lines += FmLINES(PL_formtarget);
618                     if (lines == 200) {
619                         arg = t - linemark;
620                         if (strnEQ(linemark, linemark - arg, arg))
621                             DIE(aTHX_ "Runaway format");
622                     }
623                     FmLINES(PL_formtarget) = lines;
624                     SP = ORIGMARK;
625                     RETURNOP(cLISTOP->op_first);
626                 }
627             }
628             else {
629                 t = linemark;
630                 lines--;
631             }
632             break;
633
634         case FF_MORE:
635             s = chophere;
636             send = item + len;
637             if (chopspace) {
638                 while (*s && isSPACE(*s) && s < send)
639                     s++;
640             }
641             if (s < send) {
642                 arg = fieldsize - itemsize;
643                 if (arg) {
644                     fieldsize -= arg;
645                     while (arg-- > 0)
646                         *t++ = ' ';
647                 }
648                 s = t - 3;
649                 if (strnEQ(s,"   ",3)) {
650                     while (s > SvPVX(PL_formtarget) && isSPACE(s[-1]))
651                         s--;
652                 }
653                 *s++ = '.';
654                 *s++ = '.';
655                 *s++ = '.';
656             }
657             break;
658
659         case FF_END:
660             *t = '\0';
661             SvCUR_set(PL_formtarget, t - SvPVX(PL_formtarget));
662             FmLINES(PL_formtarget) += lines;
663             SP = ORIGMARK;
664             RETPUSHYES;
665         }
666     }
667 }
668
669 PP(pp_grepstart)
670 {
671     djSP;
672     SV *src;
673
674     if (PL_stack_base + *PL_markstack_ptr == SP) {
675         (void)POPMARK;
676         if (GIMME_V == G_SCALAR)
677             XPUSHs(sv_2mortal(newSViv(0)));
678         RETURNOP(PL_op->op_next->op_next);
679     }
680     PL_stack_sp = PL_stack_base + *PL_markstack_ptr + 1;
681     pp_pushmark();                              /* push dst */
682     pp_pushmark();                              /* push src */
683     ENTER;                                      /* enter outer scope */
684
685     SAVETMPS;
686     /* SAVE_DEFSV does *not* suffice here for USE_THREADS */
687     SAVESPTR(DEFSV);
688     ENTER;                                      /* enter inner scope */
689     SAVESPTR(PL_curpm);
690
691     src = PL_stack_base[*PL_markstack_ptr];
692     SvTEMP_off(src);
693     DEFSV = src;
694
695     PUTBACK;
696     if (PL_op->op_type == OP_MAPSTART)
697         pp_pushmark();                  /* push top */
698     return ((LOGOP*)PL_op->op_next)->op_other;
699 }
700
701 PP(pp_mapstart)
702 {
703     DIE(aTHX_ "panic: mapstart");       /* uses grepstart */
704 }
705
706 PP(pp_mapwhile)
707 {
708     djSP;
709     I32 diff = (SP - PL_stack_base) - *PL_markstack_ptr;
710     I32 count;
711     I32 shift;
712     SV** src;
713     SV** dst; 
714
715     ++PL_markstack_ptr[-1];
716     if (diff) {
717         if (diff > PL_markstack_ptr[-1] - PL_markstack_ptr[-2]) {
718             shift = diff - (PL_markstack_ptr[-1] - PL_markstack_ptr[-2]);
719             count = (SP - PL_stack_base) - PL_markstack_ptr[-1] + 2;
720             
721             EXTEND(SP,shift);
722             src = SP;
723             dst = (SP += shift);
724             PL_markstack_ptr[-1] += shift;
725             *PL_markstack_ptr += shift;
726             while (--count)
727                 *dst-- = *src--;
728         }
729         dst = PL_stack_base + (PL_markstack_ptr[-2] += diff) - 1; 
730         ++diff;
731         while (--diff)
732             *dst-- = SvTEMP(TOPs) ? POPs : sv_mortalcopy(POPs); 
733     }
734     LEAVE;                                      /* exit inner scope */
735
736     /* All done yet? */
737     if (PL_markstack_ptr[-1] > *PL_markstack_ptr) {
738         I32 items;
739         I32 gimme = GIMME_V;
740
741         (void)POPMARK;                          /* pop top */
742         LEAVE;                                  /* exit outer scope */
743         (void)POPMARK;                          /* pop src */
744         items = --*PL_markstack_ptr - PL_markstack_ptr[-1];
745         (void)POPMARK;                          /* pop dst */
746         SP = PL_stack_base + POPMARK;           /* pop original mark */
747         if (gimme == G_SCALAR) {
748             dTARGET;
749             XPUSHi(items);
750         }
751         else if (gimme == G_ARRAY)
752             SP += items;
753         RETURN;
754     }
755     else {
756         SV *src;
757
758         ENTER;                                  /* enter inner scope */
759         SAVESPTR(PL_curpm);
760
761         src = PL_stack_base[PL_markstack_ptr[-1]];
762         SvTEMP_off(src);
763         DEFSV = src;
764
765         RETURNOP(cLOGOP->op_other);
766     }
767 }
768
769 PP(pp_sort)
770 {
771     djSP; dMARK; dORIGMARK;
772     register SV **up;
773     SV **myorigmark = ORIGMARK;
774     register I32 max;
775     HV *stash;
776     GV *gv;
777     CV *cv;
778     I32 gimme = GIMME;
779     OP* nextop = PL_op->op_next;
780     I32 overloading = 0;
781
782     if (gimme != G_ARRAY) {
783         SP = MARK;
784         RETPUSHUNDEF;
785     }
786
787     ENTER;
788     SAVEPPTR(PL_sortcop);
789     if (PL_op->op_flags & OPf_STACKED) {
790         if (PL_op->op_flags & OPf_SPECIAL) {
791             OP *kid = cLISTOP->op_first->op_sibling;    /* pass pushmark */
792             kid = kUNOP->op_first;                      /* pass rv2gv */
793             kid = kUNOP->op_first;                      /* pass leave */
794             PL_sortcop = kid->op_next;
795             stash = PL_curcop->cop_stash;
796         }
797         else {
798             cv = sv_2cv(*++MARK, &stash, &gv, 0);
799             if (!(cv && CvROOT(cv))) {
800                 if (gv) {
801                     SV *tmpstr = sv_newmortal();
802                     gv_efullname3(tmpstr, gv, Nullch);
803                     if (cv && CvXSUB(cv))
804                         DIE(aTHX_ "Xsub \"%s\" called in sort", SvPVX(tmpstr));
805                     DIE(aTHX_ "Undefined sort subroutine \"%s\" called",
806                         SvPVX(tmpstr));
807                 }
808                 if (cv) {
809                     if (CvXSUB(cv))
810                         DIE(aTHX_ "Xsub called in sort");
811                     DIE(aTHX_ "Undefined subroutine in sort");
812                 }
813                 DIE(aTHX_ "Not a CODE reference in sort");
814             }
815             PL_sortcop = CvSTART(cv);
816             SAVESPTR(CvROOT(cv)->op_ppaddr);
817             CvROOT(cv)->op_ppaddr = PL_ppaddr[OP_NULL];
818
819             SAVESPTR(PL_curpad);
820             PL_curpad = AvARRAY((AV*)AvARRAY(CvPADLIST(cv))[1]);
821         }
822     }
823     else {
824         PL_sortcop = Nullop;
825         stash = PL_curcop->cop_stash;
826     }
827
828     up = myorigmark + 1;
829     while (MARK < SP) { /* This may or may not shift down one here. */
830         /*SUPPRESS 560*/
831         if (*up = *++MARK) {                    /* Weed out nulls. */
832             SvTEMP_off(*up);
833             if (!PL_sortcop && !SvPOK(*up)) {
834                 STRLEN n_a;
835                 if (SvAMAGIC(*up))
836                     overloading = 1;
837                 else
838                     (void)sv_2pv(*up, &n_a);
839             }
840             up++;
841         }
842     }
843     max = --up - myorigmark;
844     if (PL_sortcop) {
845         if (max > 1) {
846             PERL_CONTEXT *cx;
847             SV** newsp;
848             bool oldcatch = CATCH_GET;
849
850             SAVETMPS;
851             SAVEOP();
852
853             CATCH_SET(TRUE);
854             PUSHSTACKi(PERLSI_SORT);
855             if (PL_sortstash != stash) {
856                 PL_firstgv = gv_fetchpv("a", TRUE, SVt_PV);
857                 PL_secondgv = gv_fetchpv("b", TRUE, SVt_PV);
858                 PL_sortstash = stash;
859             }
860
861             SAVESPTR(GvSV(PL_firstgv));
862             SAVESPTR(GvSV(PL_secondgv));
863
864             PUSHBLOCK(cx, CXt_NULL, PL_stack_base);
865             if (!(PL_op->op_flags & OPf_SPECIAL)) {
866                 bool hasargs = FALSE;
867                 cx->cx_type = CXt_SUB;
868                 cx->blk_gimme = G_SCALAR;
869                 PUSHSUB(cx);
870                 if (!CvDEPTH(cv))
871                     (void)SvREFCNT_inc(cv); /* in preparation for POPSUB */
872             }
873             PL_sortcxix = cxstack_ix;
874             qsortsv((myorigmark+1), max, sortcv);
875
876             POPBLOCK(cx,PL_curpm);
877             PL_stack_sp = newsp;
878             POPSTACK;
879             CATCH_SET(oldcatch);
880         }
881     }
882     else {
883         if (max > 1) {
884             MEXTEND(SP, 20);    /* Can't afford stack realloc on signal. */
885             qsortsv(ORIGMARK+1, max,
886                     (PL_op->op_private & OPpSORT_NUMERIC)
887                         ? ( (PL_op->op_private & OPpSORT_INTEGER)
888                             ? ( overloading ? amagic_i_ncmp : sv_i_ncmp)
889                             : ( overloading ? amagic_ncmp : sv_ncmp))
890                         : ( (PL_op->op_private & OPpLOCALE)
891                             ? ( overloading
892                                 ? amagic_cmp_locale
893                                 : sv_cmp_locale_static)
894                             : ( overloading ? amagic_cmp : sv_cmp_static)));
895             if (PL_op->op_private & OPpSORT_REVERSE) {
896                 SV **p = ORIGMARK+1;
897                 SV **q = ORIGMARK+max;
898                 while (p < q) {
899                     SV *tmp = *p;
900                     *p++ = *q;
901                     *q-- = tmp;
902                 }
903             }
904         }
905     }
906     LEAVE;
907     PL_stack_sp = ORIGMARK + max;
908     return nextop;
909 }
910
911 /* Range stuff. */
912
913 PP(pp_range)
914 {
915     if (GIMME == G_ARRAY)
916         return NORMAL;
917     if (SvTRUEx(PAD_SV(PL_op->op_targ)))
918         return cLOGOP->op_other;
919     else
920         return NORMAL;
921 }
922
923 PP(pp_flip)
924 {
925     djSP;
926
927     if (GIMME == G_ARRAY) {
928         RETURNOP(((LOGOP*)cUNOP->op_first)->op_other);
929     }
930     else {
931         dTOPss;
932         SV *targ = PAD_SV(PL_op->op_targ);
933
934         if ((PL_op->op_private & OPpFLIP_LINENUM)
935           ? (PL_last_in_gv && SvIV(sv) == (IV)IoLINES(GvIOp(PL_last_in_gv)))
936           : SvTRUE(sv) ) {
937             sv_setiv(PAD_SV(cUNOP->op_first->op_targ), 1);
938             if (PL_op->op_flags & OPf_SPECIAL) {
939                 sv_setiv(targ, 1);
940                 SETs(targ);
941                 RETURN;
942             }
943             else {
944                 sv_setiv(targ, 0);
945                 SP--;
946                 RETURNOP(((LOGOP*)cUNOP->op_first)->op_other);
947             }
948         }
949         sv_setpv(TARG, "");
950         SETs(targ);
951         RETURN;
952     }
953 }
954
955 PP(pp_flop)
956 {
957     djSP;
958
959     if (GIMME == G_ARRAY) {
960         dPOPPOPssrl;
961         register I32 i, j;
962         register SV *sv;
963         I32 max;
964
965         if (SvGMAGICAL(left))
966             mg_get(left);
967         if (SvGMAGICAL(right))
968             mg_get(right);
969
970         if (SvNIOKp(left) || !SvPOKp(left) ||
971           (looks_like_number(left) && *SvPVX(left) != '0') )
972         {
973             if (SvNV(left) < IV_MIN || SvNV(right) > IV_MAX)
974                 DIE(aTHX_ "Range iterator outside integer range");
975             i = SvIV(left);
976             max = SvIV(right);
977             if (max >= i) {
978                 j = max - i + 1;
979                 EXTEND_MORTAL(j);
980                 EXTEND(SP, j);
981             }
982             else
983                 j = 0;
984             while (j--) {
985                 sv = sv_2mortal(newSViv(i++));
986                 PUSHs(sv);
987             }
988         }
989         else {
990             SV *final = sv_mortalcopy(right);
991             STRLEN len, n_a;
992             char *tmps = SvPV(final, len);
993
994             sv = sv_mortalcopy(left);
995             SvPV_force(sv,n_a);
996             while (!SvNIOKp(sv) && SvCUR(sv) <= len) {
997                 XPUSHs(sv);
998                 if (strEQ(SvPVX(sv),tmps))
999                     break;
1000                 sv = sv_2mortal(newSVsv(sv));
1001                 sv_inc(sv);
1002             }
1003         }
1004     }
1005     else {
1006         dTOPss;
1007         SV *targ = PAD_SV(cUNOP->op_first->op_targ);
1008         sv_inc(targ);
1009         if ((PL_op->op_private & OPpFLIP_LINENUM)
1010           ? (PL_last_in_gv && SvIV(sv) == (IV)IoLINES(GvIOp(PL_last_in_gv)))
1011           : SvTRUE(sv) ) {
1012             sv_setiv(PAD_SV(((UNOP*)cUNOP->op_first)->op_first->op_targ), 0);
1013             sv_catpv(targ, "E0");
1014         }
1015         SETs(targ);
1016     }
1017
1018     RETURN;
1019 }
1020
1021 /* Control. */
1022
1023 STATIC I32
1024 S_dopoptolabel(pTHX_ char *label)
1025 {
1026     dTHR;
1027     register I32 i;
1028     register PERL_CONTEXT *cx;
1029
1030     for (i = cxstack_ix; i >= 0; i--) {
1031         cx = &cxstack[i];
1032         switch (CxTYPE(cx)) {
1033         case CXt_SUBST:
1034             if (ckWARN(WARN_UNSAFE))
1035                 Perl_warner(aTHX_ WARN_UNSAFE, "Exiting substitution via %s", 
1036                         PL_op_name[PL_op->op_type]);
1037             break;
1038         case CXt_SUB:
1039             if (ckWARN(WARN_UNSAFE))
1040                 Perl_warner(aTHX_ WARN_UNSAFE, "Exiting subroutine via %s", 
1041                         PL_op_name[PL_op->op_type]);
1042             break;
1043         case CXt_EVAL:
1044             if (ckWARN(WARN_UNSAFE))
1045                 Perl_warner(aTHX_ WARN_UNSAFE, "Exiting eval via %s", 
1046                         PL_op_name[PL_op->op_type]);
1047             break;
1048         case CXt_NULL:
1049             if (ckWARN(WARN_UNSAFE))
1050                 Perl_warner(aTHX_ WARN_UNSAFE, "Exiting pseudo-block via %s", 
1051                         PL_op_name[PL_op->op_type]);
1052             return -1;
1053         case CXt_LOOP:
1054             if (!cx->blk_loop.label ||
1055               strNE(label, cx->blk_loop.label) ) {
1056                 DEBUG_l(Perl_deb(aTHX_ "(Skipping label #%ld %s)\n",
1057                         (long)i, cx->blk_loop.label));
1058                 continue;
1059             }
1060             DEBUG_l( Perl_deb(aTHX_ "(Found label #%ld %s)\n", (long)i, label));
1061             return i;
1062         }
1063     }
1064     return i;
1065 }
1066
1067 I32
1068 Perl_dowantarray(pTHX)
1069 {
1070     I32 gimme = block_gimme();
1071     return (gimme == G_VOID) ? G_SCALAR : gimme;
1072 }
1073
1074 I32
1075 Perl_block_gimme(pTHX)
1076 {
1077     dTHR;
1078     I32 cxix;
1079
1080     cxix = dopoptosub(cxstack_ix);
1081     if (cxix < 0)
1082         return G_VOID;
1083
1084     switch (cxstack[cxix].blk_gimme) {
1085     case G_VOID:
1086         return G_VOID;
1087     case G_SCALAR:
1088         return G_SCALAR;
1089     case G_ARRAY:
1090         return G_ARRAY;
1091     default:
1092         Perl_croak(aTHX_ "panic: bad gimme: %d\n", cxstack[cxix].blk_gimme);
1093         /* NOTREACHED */
1094         return 0;
1095     }
1096 }
1097
1098 STATIC I32
1099 S_dopoptosub(pTHX_ I32 startingblock)
1100 {
1101     dTHR;
1102     return dopoptosub_at(cxstack, startingblock);
1103 }
1104
1105 STATIC I32
1106 S_dopoptosub_at(pTHX_ PERL_CONTEXT *cxstk, I32 startingblock)
1107 {
1108     dTHR;
1109     I32 i;
1110     register PERL_CONTEXT *cx;
1111     for (i = startingblock; i >= 0; i--) {
1112         cx = &cxstk[i];
1113         switch (CxTYPE(cx)) {
1114         default:
1115             continue;
1116         case CXt_EVAL:
1117         case CXt_SUB:
1118             DEBUG_l( Perl_deb(aTHX_ "(Found sub #%ld)\n", (long)i));
1119             return i;
1120         }
1121     }
1122     return i;
1123 }
1124
1125 STATIC I32
1126 S_dopoptoeval(pTHX_ I32 startingblock)
1127 {
1128     dTHR;
1129     I32 i;
1130     register PERL_CONTEXT *cx;
1131     for (i = startingblock; i >= 0; i--) {
1132         cx = &cxstack[i];
1133         switch (CxTYPE(cx)) {
1134         default:
1135             continue;
1136         case CXt_EVAL:
1137             DEBUG_l( Perl_deb(aTHX_ "(Found eval #%ld)\n", (long)i));
1138             return i;
1139         }
1140     }
1141     return i;
1142 }
1143
1144 STATIC I32
1145 S_dopoptoloop(pTHX_ I32 startingblock)
1146 {
1147     dTHR;
1148     I32 i;
1149     register PERL_CONTEXT *cx;
1150     for (i = startingblock; i >= 0; i--) {
1151         cx = &cxstack[i];
1152         switch (CxTYPE(cx)) {
1153         case CXt_SUBST:
1154             if (ckWARN(WARN_UNSAFE))
1155                 Perl_warner(aTHX_ WARN_UNSAFE, "Exiting substitution via %s", 
1156                         PL_op_name[PL_op->op_type]);
1157             break;
1158         case CXt_SUB:
1159             if (ckWARN(WARN_UNSAFE))
1160                 Perl_warner(aTHX_ WARN_UNSAFE, "Exiting subroutine via %s", 
1161                         PL_op_name[PL_op->op_type]);
1162             break;
1163         case CXt_EVAL:
1164             if (ckWARN(WARN_UNSAFE))
1165                 Perl_warner(aTHX_ WARN_UNSAFE, "Exiting eval via %s", 
1166                         PL_op_name[PL_op->op_type]);
1167             break;
1168         case CXt_NULL:
1169             if (ckWARN(WARN_UNSAFE))
1170                 Perl_warner(aTHX_ WARN_UNSAFE, "Exiting pseudo-block via %s", 
1171                         PL_op_name[PL_op->op_type]);
1172             return -1;
1173         case CXt_LOOP:
1174             DEBUG_l( Perl_deb(aTHX_ "(Found loop #%ld)\n", (long)i));
1175             return i;
1176         }
1177     }
1178     return i;
1179 }
1180
1181 void
1182 Perl_dounwind(pTHX_ I32 cxix)
1183 {
1184     dTHR;
1185     register PERL_CONTEXT *cx;
1186     SV **newsp;
1187     I32 optype;
1188
1189     while (cxstack_ix > cxix) {
1190         SV *sv;
1191         cx = &cxstack[cxstack_ix];
1192         DEBUG_l(PerlIO_printf(Perl_debug_log, "Unwinding block %ld, type %s\n",
1193                               (long) cxstack_ix, PL_block_type[CxTYPE(cx)]));
1194         /* Note: we don't need to restore the base context info till the end. */
1195         switch (CxTYPE(cx)) {
1196         case CXt_SUBST:
1197             POPSUBST(cx);
1198             continue;  /* not break */
1199         case CXt_SUB:
1200             POPSUB(cx,sv);
1201             LEAVESUB(sv);
1202             break;
1203         case CXt_EVAL:
1204             POPEVAL(cx);
1205             break;
1206         case CXt_LOOP:
1207             POPLOOP(cx);
1208             break;
1209         case CXt_NULL:
1210             break;
1211         }
1212         cxstack_ix--;
1213     }
1214 }
1215
1216 /*
1217  * Closures mentioned at top level of eval cannot be referenced
1218  * again, and their presence indirectly causes a memory leak.
1219  * (Note that the fact that compcv and friends are still set here
1220  * is, AFAIK, an accident.)  --Chip
1221  *
1222  * XXX need to get comppad et al from eval's cv rather than
1223  * relying on the incidental global values.
1224  */
1225 STATIC void
1226 S_free_closures(pTHX)
1227 {
1228     dTHR;
1229     SV **svp = AvARRAY(PL_comppad_name);
1230     I32 ix;
1231     for (ix = AvFILLp(PL_comppad_name); ix >= 0; ix--) {
1232         SV *sv = svp[ix];
1233         if (sv && sv != &PL_sv_undef && *SvPVX(sv) == '&') {
1234             SvREFCNT_dec(sv);
1235             svp[ix] = &PL_sv_undef;
1236
1237             sv = PL_curpad[ix];
1238             if (CvCLONE(sv)) {
1239                 SvREFCNT_dec(CvOUTSIDE(sv));
1240                 CvOUTSIDE(sv) = Nullcv;
1241             }
1242             else {
1243                 SvREFCNT_dec(sv);
1244                 sv = NEWSV(0,0);
1245                 SvPADTMP_on(sv);
1246                 PL_curpad[ix] = sv;
1247             }
1248         }
1249     }
1250 }
1251
1252 void
1253 Perl_qerror(pTHX_ SV *err)
1254 {
1255     if (PL_in_eval)
1256         sv_catsv(ERRSV, err);
1257     else if (PL_errors)
1258         sv_catsv(PL_errors, err);
1259     else
1260         Perl_warn(aTHX_ "%_", err);
1261     ++PL_error_count;
1262 }
1263
1264 OP *
1265 Perl_die_where(pTHX_ char *message, STRLEN msglen)
1266 {
1267     dSP;
1268     STRLEN n_a;
1269     if (PL_in_eval) {
1270         I32 cxix;
1271         register PERL_CONTEXT *cx;
1272         I32 gimme;
1273         SV **newsp;
1274
1275         if (message) {
1276             if (PL_in_eval & EVAL_KEEPERR) {
1277                 static char prefix[] = "\t(in cleanup) ";
1278                 SV *err = ERRSV;
1279                 char *e = Nullch;
1280                 if (!SvPOK(err))
1281                     sv_setpv(err,"");
1282                 else if (SvCUR(err) >= sizeof(prefix)+msglen-1) {
1283                     e = SvPV(err, n_a);
1284                     e += n_a - msglen;
1285                     if (*e != *message || strNE(e,message))
1286                         e = Nullch;
1287                 }
1288                 if (!e) {
1289                     SvGROW(err, SvCUR(err)+sizeof(prefix)+msglen);
1290                     sv_catpvn(err, prefix, sizeof(prefix)-1);
1291                     sv_catpvn(err, message, msglen);
1292                     if (ckWARN(WARN_UNSAFE)) {
1293                         STRLEN start = SvCUR(err)-msglen-sizeof(prefix)+1;
1294                         Perl_warner(aTHX_ WARN_UNSAFE, SvPVX(err)+start);
1295                     }
1296                 }
1297             }
1298             else
1299                 sv_setpvn(ERRSV, message, msglen);
1300         }
1301         else
1302             message = SvPVx(ERRSV, msglen);
1303
1304         while ((cxix = dopoptoeval(cxstack_ix)) < 0
1305                && PL_curstackinfo->si_prev)
1306         {
1307             dounwind(-1);
1308             POPSTACK;
1309         }
1310
1311         if (cxix >= 0) {
1312             I32 optype;
1313
1314             if (cxix < cxstack_ix)
1315                 dounwind(cxix);
1316
1317             POPBLOCK(cx,PL_curpm);
1318             if (CxTYPE(cx) != CXt_EVAL) {
1319                 PerlIO_write(Perl_error_log, "panic: die ", 11);
1320                 PerlIO_write(Perl_error_log, message, msglen);
1321                 my_exit(1);
1322             }
1323             POPEVAL(cx);
1324
1325             if (gimme == G_SCALAR)
1326                 *++newsp = &PL_sv_undef;
1327             PL_stack_sp = newsp;
1328
1329             LEAVE;
1330
1331             if (optype == OP_REQUIRE) {
1332                 char* msg = SvPVx(ERRSV, n_a);
1333                 DIE(aTHX_ "%sCompilation failed in require",
1334                     *msg ? msg : "Unknown error\n");
1335             }
1336             return pop_return();
1337         }
1338     }
1339     if (!message)
1340         message = SvPVx(ERRSV, msglen);
1341     {
1342 #ifdef USE_SFIO
1343         /* SFIO can really mess with your errno */
1344         int e = errno;
1345 #endif
1346         PerlIO *serr = Perl_error_log;
1347
1348         PerlIO_write(serr, message, msglen);
1349         (void)PerlIO_flush(serr);
1350 #ifdef USE_SFIO
1351         errno = e;
1352 #endif
1353     }
1354     my_failure_exit();
1355     /* NOTREACHED */
1356     return 0;
1357 }
1358
1359 PP(pp_xor)
1360 {
1361     djSP; dPOPTOPssrl;
1362     if (SvTRUE(left) != SvTRUE(right))
1363         RETSETYES;
1364     else
1365         RETSETNO;
1366 }
1367
1368 PP(pp_andassign)
1369 {
1370     djSP;
1371     if (!SvTRUE(TOPs))
1372         RETURN;
1373     else
1374         RETURNOP(cLOGOP->op_other);
1375 }
1376
1377 PP(pp_orassign)
1378 {
1379     djSP;
1380     if (SvTRUE(TOPs))
1381         RETURN;
1382     else
1383         RETURNOP(cLOGOP->op_other);
1384 }
1385         
1386 PP(pp_caller)
1387 {
1388     djSP;
1389     register I32 cxix = dopoptosub(cxstack_ix);
1390     register PERL_CONTEXT *cx;
1391     register PERL_CONTEXT *ccstack = cxstack;
1392     PERL_SI *top_si = PL_curstackinfo;
1393     I32 dbcxix;
1394     I32 gimme;
1395     HV *hv;
1396     SV *sv;
1397     I32 count = 0;
1398
1399     if (MAXARG)
1400         count = POPi;
1401     EXTEND(SP, 7);
1402     for (;;) {
1403         /* we may be in a higher stacklevel, so dig down deeper */
1404         while (cxix < 0 && top_si->si_type != PERLSI_MAIN) {
1405             top_si = top_si->si_prev;
1406             ccstack = top_si->si_cxstack;
1407             cxix = dopoptosub_at(ccstack, top_si->si_cxix);
1408         }
1409         if (cxix < 0) {
1410             if (GIMME != G_ARRAY)
1411                 RETPUSHUNDEF;
1412             RETURN;
1413         }
1414         if (PL_DBsub && cxix >= 0 &&
1415                 ccstack[cxix].blk_sub.cv == GvCV(PL_DBsub))
1416             count++;
1417         if (!count--)
1418             break;
1419         cxix = dopoptosub_at(ccstack, cxix - 1);
1420     }
1421
1422     cx = &ccstack[cxix];
1423     if (CxTYPE(cx) == CXt_SUB) {
1424         dbcxix = dopoptosub_at(ccstack, cxix - 1);
1425         /* We expect that ccstack[dbcxix] is CXt_SUB, anyway, the
1426            field below is defined for any cx. */
1427         if (PL_DBsub && dbcxix >= 0 && ccstack[dbcxix].blk_sub.cv == GvCV(PL_DBsub))
1428             cx = &ccstack[dbcxix];
1429     }
1430
1431     if (GIMME != G_ARRAY) {
1432         hv = cx->blk_oldcop->cop_stash;
1433         if (!hv)
1434             PUSHs(&PL_sv_undef);
1435         else {
1436             dTARGET;
1437             sv_setpv(TARG, HvNAME(hv));
1438             PUSHs(TARG);
1439         }
1440         RETURN;
1441     }
1442
1443     hv = cx->blk_oldcop->cop_stash;
1444     if (!hv)
1445         PUSHs(&PL_sv_undef);
1446     else
1447         PUSHs(sv_2mortal(newSVpv(HvNAME(hv), 0)));
1448     PUSHs(sv_2mortal(newSVpvn(SvPVX(GvSV(cx->blk_oldcop->cop_filegv)),
1449                               SvCUR(GvSV(cx->blk_oldcop->cop_filegv)))));
1450     PUSHs(sv_2mortal(newSViv((I32)cx->blk_oldcop->cop_line)));
1451     if (!MAXARG)
1452         RETURN;
1453     if (CxTYPE(cx) == CXt_SUB) { /* So is ccstack[dbcxix]. */
1454         sv = NEWSV(49, 0);
1455         gv_efullname3(sv, CvGV(ccstack[cxix].blk_sub.cv), Nullch);
1456         PUSHs(sv_2mortal(sv));
1457         PUSHs(sv_2mortal(newSViv((I32)cx->blk_sub.hasargs)));
1458     }
1459     else {
1460         PUSHs(sv_2mortal(newSVpvn("(eval)",6)));
1461         PUSHs(sv_2mortal(newSViv(0)));
1462     }
1463     gimme = (I32)cx->blk_gimme;
1464     if (gimme == G_VOID)
1465         PUSHs(&PL_sv_undef);
1466     else
1467         PUSHs(sv_2mortal(newSViv(gimme & G_ARRAY)));
1468     if (CxTYPE(cx) == CXt_EVAL) {
1469         if (cx->blk_eval.old_op_type == OP_ENTEREVAL) {
1470             PUSHs(cx->blk_eval.cur_text);
1471             PUSHs(&PL_sv_no);
1472         } 
1473         else if (cx->blk_eval.old_name) { /* Try blocks have old_name == 0. */
1474             /* Require, put the name. */
1475             PUSHs(sv_2mortal(newSVpv(cx->blk_eval.old_name, 0)));
1476             PUSHs(&PL_sv_yes);
1477         }
1478     }
1479     else {
1480         PUSHs(&PL_sv_undef);
1481         PUSHs(&PL_sv_undef);
1482     }
1483     if (CxTYPE(cx) == CXt_SUB && cx->blk_sub.hasargs
1484         && PL_curcop->cop_stash == PL_debstash)
1485     {
1486         AV *ary = cx->blk_sub.argarray;
1487         int off = AvARRAY(ary) - AvALLOC(ary);
1488
1489         if (!PL_dbargs) {
1490             GV* tmpgv;
1491             PL_dbargs = GvAV(gv_AVadd(tmpgv = gv_fetchpv("DB::args", TRUE,
1492                                 SVt_PVAV)));
1493             GvMULTI_on(tmpgv);
1494             AvREAL_off(PL_dbargs);              /* XXX Should be REIFY */
1495         }
1496
1497         if (AvMAX(PL_dbargs) < AvFILLp(ary) + off)
1498             av_extend(PL_dbargs, AvFILLp(ary) + off);
1499         Copy(AvALLOC(ary), AvARRAY(PL_dbargs), AvFILLp(ary) + 1 + off, SV*);
1500         AvFILLp(PL_dbargs) = AvFILLp(ary) + off;
1501     }
1502     /* XXX only hints propagated via op_private are currently
1503      * visible (others are not easily accessible, since they
1504      * use the global PL_hints) */
1505     PUSHs(sv_2mortal(newSViv((I32)cx->blk_oldcop->op_private &
1506                              HINT_PRIVATE_MASK)));
1507     RETURN;
1508 }
1509
1510 PP(pp_reset)
1511 {
1512     djSP;
1513     char *tmps;
1514     STRLEN n_a;
1515
1516     if (MAXARG < 1)
1517         tmps = "";
1518     else
1519         tmps = POPpx;
1520     sv_reset(tmps, PL_curcop->cop_stash);
1521     PUSHs(&PL_sv_yes);
1522     RETURN;
1523 }
1524
1525 PP(pp_lineseq)
1526 {
1527     return NORMAL;
1528 }
1529
1530 PP(pp_dbstate)
1531 {
1532     PL_curcop = (COP*)PL_op;
1533     TAINT_NOT;          /* Each statement is presumed innocent */
1534     PL_stack_sp = PL_stack_base + cxstack[cxstack_ix].blk_oldsp;
1535     FREETMPS;
1536
1537     if (PL_op->op_private || SvIV(PL_DBsingle) || SvIV(PL_DBsignal) || SvIV(PL_DBtrace))
1538     {
1539         djSP;
1540         register CV *cv;
1541         register PERL_CONTEXT *cx;
1542         I32 gimme = G_ARRAY;
1543         I32 hasargs;
1544         GV *gv;
1545
1546         gv = PL_DBgv;
1547         cv = GvCV(gv);
1548         if (!cv)
1549             DIE(aTHX_ "No DB::DB routine defined");
1550
1551         if (CvDEPTH(cv) >= 1 && !(PL_debug & (1<<30))) /* don't do recursive DB::DB call */
1552             return NORMAL;
1553
1554         ENTER;
1555         SAVETMPS;
1556
1557         SAVEI32(PL_debug);
1558         SAVESTACK_POS();
1559         PL_debug = 0;
1560         hasargs = 0;
1561         SPAGAIN;
1562
1563         push_return(PL_op->op_next);
1564         PUSHBLOCK(cx, CXt_SUB, SP);
1565         PUSHSUB(cx);
1566         CvDEPTH(cv)++;
1567         (void)SvREFCNT_inc(cv);
1568         SAVESPTR(PL_curpad);
1569         PL_curpad = AvARRAY((AV*)*av_fetch(CvPADLIST(cv),1,FALSE));
1570         RETURNOP(CvSTART(cv));
1571     }
1572     else
1573         return NORMAL;
1574 }
1575
1576 PP(pp_scope)
1577 {
1578     return NORMAL;
1579 }
1580
1581 PP(pp_enteriter)
1582 {
1583     djSP; dMARK;
1584     register PERL_CONTEXT *cx;
1585     I32 gimme = GIMME_V;
1586     SV **svp;
1587
1588     ENTER;
1589     SAVETMPS;
1590
1591 #ifdef USE_THREADS
1592     if (PL_op->op_flags & OPf_SPECIAL) {
1593         dTHR;
1594         svp = &THREADSV(PL_op->op_targ);        /* per-thread variable */
1595         SAVEGENERICSV(*svp);
1596         *svp = NEWSV(0,0);
1597     }
1598     else
1599 #endif /* USE_THREADS */
1600     if (PL_op->op_targ) {
1601         svp = &PL_curpad[PL_op->op_targ];               /* "my" variable */
1602         SAVESPTR(*svp);
1603     }
1604     else {
1605         svp = &GvSV((GV*)POPs);                 /* symbol table variable */
1606         SAVEGENERICSV(*svp);
1607         *svp = NEWSV(0,0);
1608     }
1609
1610     ENTER;
1611
1612     PUSHBLOCK(cx, CXt_LOOP, SP);
1613     PUSHLOOP(cx, svp, MARK);
1614     if (PL_op->op_flags & OPf_STACKED) {
1615         cx->blk_loop.iterary = (AV*)SvREFCNT_inc(POPs);
1616         if (SvTYPE(cx->blk_loop.iterary) != SVt_PVAV) {
1617             dPOPss;
1618             if (SvNIOKp(sv) || !SvPOKp(sv) ||
1619                 (looks_like_number(sv) && *SvPVX(sv) != '0')) {
1620                  if (SvNV(sv) < IV_MIN ||
1621                      SvNV((SV*)cx->blk_loop.iterary) >= IV_MAX)
1622                      DIE(aTHX_ "Range iterator outside integer range");
1623                  cx->blk_loop.iterix = SvIV(sv);
1624                  cx->blk_loop.itermax = SvIV((SV*)cx->blk_loop.iterary);
1625             }
1626             else
1627                 cx->blk_loop.iterlval = newSVsv(sv);
1628         }
1629     }
1630     else {
1631         cx->blk_loop.iterary = PL_curstack;
1632         AvFILLp(PL_curstack) = SP - PL_stack_base;
1633         cx->blk_loop.iterix = MARK - PL_stack_base;
1634     }
1635
1636     RETURN;
1637 }
1638
1639 PP(pp_enterloop)
1640 {
1641     djSP;
1642     register PERL_CONTEXT *cx;
1643     I32 gimme = GIMME_V;
1644
1645     ENTER;
1646     SAVETMPS;
1647     ENTER;
1648
1649     PUSHBLOCK(cx, CXt_LOOP, SP);
1650     PUSHLOOP(cx, 0, SP);
1651
1652     RETURN;
1653 }
1654
1655 PP(pp_leaveloop)
1656 {
1657     djSP;
1658     register PERL_CONTEXT *cx;
1659     I32 gimme;
1660     SV **newsp;
1661     PMOP *newpm;
1662     SV **mark;
1663
1664     POPBLOCK(cx,newpm);
1665     mark = newsp;
1666     newsp = PL_stack_base + cx->blk_loop.resetsp;
1667
1668     TAINT_NOT;
1669     if (gimme == G_VOID)
1670         ; /* do nothing */
1671     else if (gimme == G_SCALAR) {
1672         if (mark < SP)
1673             *++newsp = sv_mortalcopy(*SP);
1674         else
1675             *++newsp = &PL_sv_undef;
1676     }
1677     else {
1678         while (mark < SP) {
1679             *++newsp = sv_mortalcopy(*++mark);
1680             TAINT_NOT;          /* Each item is independent */
1681         }
1682     }
1683     SP = newsp;
1684     PUTBACK;
1685
1686     POPLOOP(cx);        /* Stack values are safe: release loop vars ... */
1687     PL_curpm = newpm;   /* ... and pop $1 et al */
1688
1689     LEAVE;
1690     LEAVE;
1691
1692     return NORMAL;
1693 }
1694
1695 PP(pp_return)
1696 {
1697     djSP; dMARK;
1698     I32 cxix;
1699     register PERL_CONTEXT *cx;
1700     bool popsub2 = FALSE;
1701     I32 gimme;
1702     SV **newsp;
1703     PMOP *newpm;
1704     I32 optype = 0;
1705     SV *sv;
1706
1707     if (PL_curstackinfo->si_type == PERLSI_SORT) {
1708         if (cxstack_ix == PL_sortcxix || dopoptosub(cxstack_ix) <= PL_sortcxix) {
1709             if (cxstack_ix > PL_sortcxix)
1710                 dounwind(PL_sortcxix);
1711             AvARRAY(PL_curstack)[1] = *SP;
1712             PL_stack_sp = PL_stack_base + 1;
1713             return 0;
1714         }
1715     }
1716
1717     cxix = dopoptosub(cxstack_ix);
1718     if (cxix < 0)
1719         DIE(aTHX_ "Can't return outside a subroutine");
1720     if (cxix < cxstack_ix)
1721         dounwind(cxix);
1722
1723     POPBLOCK(cx,newpm);
1724     switch (CxTYPE(cx)) {
1725     case CXt_SUB:
1726         popsub2 = TRUE;
1727         break;
1728     case CXt_EVAL:
1729         POPEVAL(cx);
1730         if (AvFILLp(PL_comppad_name) >= 0)
1731             free_closures();
1732         lex_end();
1733         if (optype == OP_REQUIRE &&
1734             (MARK == SP || (gimme == G_SCALAR && !SvTRUE(*SP))) )
1735         {
1736             /* Unassume the success we assumed earlier. */
1737             char *name = cx->blk_eval.old_name;
1738             (void)hv_delete(GvHVn(PL_incgv), name, strlen(name), G_DISCARD);
1739             DIE(aTHX_ "%s did not return a true value", name);
1740         }
1741         break;
1742     default:
1743         DIE(aTHX_ "panic: return");
1744     }
1745
1746     TAINT_NOT;
1747     if (gimme == G_SCALAR) {
1748         if (MARK < SP) {
1749             if (popsub2) {
1750                 if (cx->blk_sub.cv && CvDEPTH(cx->blk_sub.cv) > 1) {
1751                     if (SvTEMP(TOPs)) {
1752                         *++newsp = SvREFCNT_inc(*SP);
1753                         FREETMPS;
1754                         sv_2mortal(*newsp);
1755                     } else {
1756                         FREETMPS;
1757                         *++newsp = sv_mortalcopy(*SP);
1758                     }
1759                 } else
1760                     *++newsp = (SvTEMP(*SP)) ? *SP : sv_mortalcopy(*SP);
1761             } else
1762                 *++newsp = sv_mortalcopy(*SP);
1763         } else
1764             *++newsp = &PL_sv_undef;
1765     }
1766     else if (gimme == G_ARRAY) {
1767         while (++MARK <= SP) {
1768             *++newsp = (popsub2 && SvTEMP(*MARK))
1769                         ? *MARK : sv_mortalcopy(*MARK);
1770             TAINT_NOT;          /* Each item is independent */
1771         }
1772     }
1773     PL_stack_sp = newsp;
1774
1775     /* Stack values are safe: */
1776     if (popsub2) {
1777         POPSUB(cx,sv);  /* release CV and @_ ... */
1778     }
1779     else
1780         sv = Nullsv;
1781     PL_curpm = newpm;   /* ... and pop $1 et al */
1782
1783     LEAVE;
1784     LEAVESUB(sv);
1785     return pop_return();
1786 }
1787
1788 PP(pp_last)
1789 {
1790     djSP;
1791     I32 cxix;
1792     register PERL_CONTEXT *cx;
1793     I32 pop2 = 0;
1794     I32 gimme;
1795     I32 optype;
1796     OP *nextop;
1797     SV **newsp;
1798     PMOP *newpm;
1799     SV **mark;
1800     SV *sv = Nullsv;
1801
1802     if (PL_op->op_flags & OPf_SPECIAL) {
1803         cxix = dopoptoloop(cxstack_ix);
1804         if (cxix < 0)
1805             DIE(aTHX_ "Can't \"last\" outside a block");
1806     }
1807     else {
1808         cxix = dopoptolabel(cPVOP->op_pv);
1809         if (cxix < 0)
1810             DIE(aTHX_ "Label not found for \"last %s\"", cPVOP->op_pv);
1811     }
1812     if (cxix < cxstack_ix)
1813         dounwind(cxix);
1814
1815     POPBLOCK(cx,newpm);
1816     mark = newsp;
1817     switch (CxTYPE(cx)) {
1818     case CXt_LOOP:
1819         pop2 = CXt_LOOP;
1820         newsp = PL_stack_base + cx->blk_loop.resetsp;
1821         nextop = cx->blk_loop.last_op->op_next;
1822         break;
1823     case CXt_SUB:
1824         pop2 = CXt_SUB;
1825         nextop = pop_return();
1826         break;
1827     case CXt_EVAL:
1828         POPEVAL(cx);
1829         nextop = pop_return();
1830         break;
1831     default:
1832         DIE(aTHX_ "panic: last");
1833     }
1834
1835     TAINT_NOT;
1836     if (gimme == G_SCALAR) {
1837         if (MARK < SP)
1838             *++newsp = ((pop2 == CXt_SUB) && SvTEMP(*SP))
1839                         ? *SP : sv_mortalcopy(*SP);
1840         else
1841             *++newsp = &PL_sv_undef;
1842     }
1843     else if (gimme == G_ARRAY) {
1844         while (++MARK <= SP) {
1845             *++newsp = ((pop2 == CXt_SUB) && SvTEMP(*MARK))
1846                         ? *MARK : sv_mortalcopy(*MARK);
1847             TAINT_NOT;          /* Each item is independent */
1848         }
1849     }
1850     SP = newsp;
1851     PUTBACK;
1852
1853     /* Stack values are safe: */
1854     switch (pop2) {
1855     case CXt_LOOP:
1856         POPLOOP(cx);    /* release loop vars ... */
1857         LEAVE;
1858         break;
1859     case CXt_SUB:
1860         POPSUB(cx,sv);  /* release CV and @_ ... */
1861         break;
1862     }
1863     PL_curpm = newpm;   /* ... and pop $1 et al */
1864
1865     LEAVE;
1866     LEAVESUB(sv);
1867     return nextop;
1868 }
1869
1870 PP(pp_next)
1871 {
1872     I32 cxix;
1873     register PERL_CONTEXT *cx;
1874     I32 oldsave;
1875
1876     if (PL_op->op_flags & OPf_SPECIAL) {
1877         cxix = dopoptoloop(cxstack_ix);
1878         if (cxix < 0)
1879             DIE(aTHX_ "Can't \"next\" outside a block");
1880     }
1881     else {
1882         cxix = dopoptolabel(cPVOP->op_pv);
1883         if (cxix < 0)
1884             DIE(aTHX_ "Label not found for \"next %s\"", cPVOP->op_pv);
1885     }
1886     if (cxix < cxstack_ix)
1887         dounwind(cxix);
1888
1889     TOPBLOCK(cx);
1890     oldsave = PL_scopestack[PL_scopestack_ix - 1];
1891     LEAVE_SCOPE(oldsave);
1892     return cx->blk_loop.next_op;
1893 }
1894
1895 PP(pp_redo)
1896 {
1897     I32 cxix;
1898     register PERL_CONTEXT *cx;
1899     I32 oldsave;
1900
1901     if (PL_op->op_flags & OPf_SPECIAL) {
1902         cxix = dopoptoloop(cxstack_ix);
1903         if (cxix < 0)
1904             DIE(aTHX_ "Can't \"redo\" outside a block");
1905     }
1906     else {
1907         cxix = dopoptolabel(cPVOP->op_pv);
1908         if (cxix < 0)
1909             DIE(aTHX_ "Label not found for \"redo %s\"", cPVOP->op_pv);
1910     }
1911     if (cxix < cxstack_ix)
1912         dounwind(cxix);
1913
1914     TOPBLOCK(cx);
1915     oldsave = PL_scopestack[PL_scopestack_ix - 1];
1916     LEAVE_SCOPE(oldsave);
1917     return cx->blk_loop.redo_op;
1918 }
1919
1920 STATIC OP *
1921 S_dofindlabel(pTHX_ OP *o, char *label, OP **opstack, OP **oplimit)
1922 {
1923     OP *kid;
1924     OP **ops = opstack;
1925     static char too_deep[] = "Target of goto is too deeply nested";
1926
1927     if (ops >= oplimit)
1928         Perl_croak(aTHX_ too_deep);
1929     if (o->op_type == OP_LEAVE ||
1930         o->op_type == OP_SCOPE ||
1931         o->op_type == OP_LEAVELOOP ||
1932         o->op_type == OP_LEAVETRY)
1933     {
1934         *ops++ = cUNOPo->op_first;
1935         if (ops >= oplimit)
1936             Perl_croak(aTHX_ too_deep);
1937     }
1938     *ops = 0;
1939     if (o->op_flags & OPf_KIDS) {
1940         dTHR;
1941         /* First try all the kids at this level, since that's likeliest. */
1942         for (kid = cUNOPo->op_first; kid; kid = kid->op_sibling) {
1943             if ((kid->op_type == OP_NEXTSTATE || kid->op_type == OP_DBSTATE) &&
1944                     kCOP->cop_label && strEQ(kCOP->cop_label, label))
1945                 return kid;
1946         }
1947         for (kid = cUNOPo->op_first; kid; kid = kid->op_sibling) {
1948             if (kid == PL_lastgotoprobe)
1949                 continue;
1950             if ((kid->op_type == OP_NEXTSTATE || kid->op_type == OP_DBSTATE) &&
1951                 (ops == opstack ||
1952                  (ops[-1]->op_type != OP_NEXTSTATE &&
1953                   ops[-1]->op_type != OP_DBSTATE)))
1954                 *ops++ = kid;
1955             if (o = dofindlabel(kid, label, ops, oplimit))
1956                 return o;
1957         }
1958     }
1959     *ops = 0;
1960     return 0;
1961 }
1962
1963 PP(pp_dump)
1964 {
1965     return pp_goto();
1966     /*NOTREACHED*/
1967 }
1968
1969 PP(pp_goto)
1970 {
1971     djSP;
1972     OP *retop = 0;
1973     I32 ix;
1974     register PERL_CONTEXT *cx;
1975 #define GOTO_DEPTH 64
1976     OP *enterops[GOTO_DEPTH];
1977     char *label;
1978     int do_dump = (PL_op->op_type == OP_DUMP);
1979     static char must_have_label[] = "goto must have label";
1980
1981     label = 0;
1982     if (PL_op->op_flags & OPf_STACKED) {
1983         SV *sv = POPs;
1984         STRLEN n_a;
1985
1986         /* This egregious kludge implements goto &subroutine */
1987         if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVCV) {
1988             I32 cxix;
1989             register PERL_CONTEXT *cx;
1990             CV* cv = (CV*)SvRV(sv);
1991             SV** mark;
1992             I32 items = 0;
1993             I32 oldsave;
1994
1995         retry:
1996             if (!CvROOT(cv) && !CvXSUB(cv)) {
1997                 GV *gv = CvGV(cv);
1998                 GV *autogv;
1999                 if (gv) {
2000                     SV *tmpstr;
2001                     /* autoloaded stub? */
2002                     if (cv != GvCV(gv) && (cv = GvCV(gv)))
2003                         goto retry;
2004                     autogv = gv_autoload4(GvSTASH(gv), GvNAME(gv),
2005                                           GvNAMELEN(gv), FALSE);
2006                     if (autogv && (cv = GvCV(autogv)))
2007                         goto retry;
2008                     tmpstr = sv_newmortal();
2009                     gv_efullname3(tmpstr, gv, Nullch);
2010                     DIE(aTHX_ "Goto undefined subroutine &%s",SvPVX(tmpstr));
2011                 }
2012                 DIE(aTHX_ "Goto undefined subroutine");
2013             }
2014
2015             /* First do some returnish stuff. */
2016             cxix = dopoptosub(cxstack_ix);
2017             if (cxix < 0)
2018                 DIE(aTHX_ "Can't goto subroutine outside a subroutine");
2019             if (cxix < cxstack_ix)
2020                 dounwind(cxix);
2021             TOPBLOCK(cx);
2022             if (CxTYPE(cx) == CXt_EVAL && cx->blk_eval.old_op_type == OP_ENTEREVAL) 
2023                 DIE(aTHX_ "Can't goto subroutine from an eval-string");
2024             mark = PL_stack_sp;
2025             if (CxTYPE(cx) == CXt_SUB && cx->blk_sub.hasargs) {
2026                 /* put @_ back onto stack */
2027                 AV* av = cx->blk_sub.argarray;
2028                 
2029                 items = AvFILLp(av) + 1;
2030                 PL_stack_sp++;
2031                 EXTEND(PL_stack_sp, items); /* @_ could have been extended. */
2032                 Copy(AvARRAY(av), PL_stack_sp, items, SV*);
2033                 PL_stack_sp += items;
2034 #ifndef USE_THREADS
2035                 SvREFCNT_dec(GvAV(PL_defgv));
2036                 GvAV(PL_defgv) = cx->blk_sub.savearray;
2037 #endif /* USE_THREADS */
2038                 /* abandon @_ if it got reified */
2039                 if (AvREAL(av)) {
2040                     (void)sv_2mortal((SV*)av);  /* delay until return */
2041                     av = newAV();
2042                     av_extend(av, items-1);
2043                     AvFLAGS(av) = AVf_REIFY;
2044                     PL_curpad[0] = (SV*)(cx->blk_sub.argarray = av);
2045                 }
2046             }
2047             else if (CvXSUB(cv)) {      /* put GvAV(defgv) back onto stack */
2048                 AV* av;
2049                 int i;
2050 #ifdef USE_THREADS
2051                 av = (AV*)PL_curpad[0];
2052 #else
2053                 av = GvAV(PL_defgv);
2054 #endif
2055                 items = AvFILLp(av) + 1;
2056                 PL_stack_sp++;
2057                 EXTEND(PL_stack_sp, items); /* @_ could have been extended. */
2058                 Copy(AvARRAY(av), PL_stack_sp, items, SV*);
2059                 PL_stack_sp += items;
2060             }
2061             if (CxTYPE(cx) == CXt_SUB &&
2062                 !(CvDEPTH(cx->blk_sub.cv) = cx->blk_sub.olddepth))
2063                 SvREFCNT_dec(cx->blk_sub.cv);
2064             oldsave = PL_scopestack[PL_scopestack_ix - 1];
2065             LEAVE_SCOPE(oldsave);
2066
2067             /* Now do some callish stuff. */
2068             SAVETMPS;
2069             if (CvXSUB(cv)) {
2070 #ifdef PERL_XSUB_OLDSTYLE
2071                 if (CvOLDSTYLE(cv)) {
2072                     I32 (*fp3)(int,int,int);
2073                     while (SP > mark) {
2074                         SP[1] = SP[0];
2075                         SP--;
2076                     }
2077                     fp3 = (I32(*)(int,int,int)))CvXSUB(cv;
2078                     items = (*fp3)(CvXSUBANY(cv).any_i32,
2079                                    mark - PL_stack_base + 1,
2080                                    items);
2081                     SP = PL_stack_base + items;
2082                 }
2083                 else
2084 #endif /* PERL_XSUB_OLDSTYLE */
2085                 {
2086                     SV **newsp;
2087                     I32 gimme;
2088
2089                     PL_stack_sp--;              /* There is no cv arg. */
2090                     /* Push a mark for the start of arglist */
2091                     PUSHMARK(mark); 
2092                     (void)(*CvXSUB(cv))(aTHXo_ cv);
2093                     /* Pop the current context like a decent sub should */
2094                     POPBLOCK(cx, PL_curpm);
2095                     /* Do _not_ use PUTBACK, keep the XSUB's return stack! */
2096                 }
2097                 LEAVE;
2098                 return pop_return();
2099             }
2100             else {
2101                 AV* padlist = CvPADLIST(cv);
2102                 SV** svp = AvARRAY(padlist);
2103                 if (CxTYPE(cx) == CXt_EVAL) {
2104                     PL_in_eval = cx->blk_eval.old_in_eval;
2105                     PL_eval_root = cx->blk_eval.old_eval_root;
2106                     cx->cx_type = CXt_SUB;
2107                     cx->blk_sub.hasargs = 0;
2108                 }
2109                 cx->blk_sub.cv = cv;
2110                 cx->blk_sub.olddepth = CvDEPTH(cv);
2111                 CvDEPTH(cv)++;
2112                 if (CvDEPTH(cv) < 2)
2113                     (void)SvREFCNT_inc(cv);
2114                 else {  /* save temporaries on recursion? */
2115 #ifdef MACOS_TRADITIONAL
2116                     MacStackAttack();
2117 #endif
2118                     if (CvDEPTH(cv) == 100 && ckWARN(WARN_RECURSION))
2119                         sub_crush_depth(cv);
2120                     if (CvDEPTH(cv) > AvFILLp(padlist)) {
2121                         AV *newpad = newAV();
2122                         SV **oldpad = AvARRAY(svp[CvDEPTH(cv)-1]);
2123                         I32 ix = AvFILLp((AV*)svp[1]);
2124                         svp = AvARRAY(svp[0]);
2125                         for ( ;ix > 0; ix--) {
2126                             if (svp[ix] != &PL_sv_undef) {
2127                                 char *name = SvPVX(svp[ix]);
2128                                 if ((SvFLAGS(svp[ix]) & SVf_FAKE)
2129                                     || *name == '&')
2130                                 {
2131                                     /* outer lexical or anon code */
2132                                     av_store(newpad, ix,
2133                                         SvREFCNT_inc(oldpad[ix]) );
2134                                 }
2135                                 else {          /* our own lexical */
2136                                     if (*name == '@')
2137                                         av_store(newpad, ix, sv = (SV*)newAV());
2138                                     else if (*name == '%')
2139                                         av_store(newpad, ix, sv = (SV*)newHV());
2140                                     else
2141                                         av_store(newpad, ix, sv = NEWSV(0,0));
2142                                     SvPADMY_on(sv);
2143                                 }
2144                             }
2145                             else {
2146                                 av_store(newpad, ix, sv = NEWSV(0,0));
2147                                 SvPADTMP_on(sv);
2148                             }
2149                         }
2150                         if (cx->blk_sub.hasargs) {
2151                             AV* av = newAV();
2152                             av_extend(av, 0);
2153                             av_store(newpad, 0, (SV*)av);
2154                             AvFLAGS(av) = AVf_REIFY;
2155                         }
2156                         av_store(padlist, CvDEPTH(cv), (SV*)newpad);
2157                         AvFILLp(padlist) = CvDEPTH(cv);
2158                         svp = AvARRAY(padlist);
2159                     }
2160                 }
2161 #ifdef USE_THREADS
2162                 if (!cx->blk_sub.hasargs) {
2163                     AV* av = (AV*)PL_curpad[0];
2164                     
2165                     items = AvFILLp(av) + 1;
2166                     if (items) {
2167                         /* Mark is at the end of the stack. */
2168                         EXTEND(SP, items);
2169                         Copy(AvARRAY(av), SP + 1, items, SV*);
2170                         SP += items;
2171                         PUTBACK ;                   
2172                     }
2173                 }
2174 #endif /* USE_THREADS */                
2175                 SAVESPTR(PL_curpad);
2176                 PL_curpad = AvARRAY((AV*)svp[CvDEPTH(cv)]);
2177 #ifndef USE_THREADS
2178                 if (cx->blk_sub.hasargs)
2179 #endif /* USE_THREADS */
2180                 {
2181                     AV* av = (AV*)PL_curpad[0];
2182                     SV** ary;
2183
2184 #ifndef USE_THREADS
2185                     cx->blk_sub.savearray = GvAV(PL_defgv);
2186                     GvAV(PL_defgv) = (AV*)SvREFCNT_inc(av);
2187 #endif /* USE_THREADS */
2188                     cx->blk_sub.argarray = av;
2189                     ++mark;
2190
2191                     if (items >= AvMAX(av) + 1) {
2192                         ary = AvALLOC(av);
2193                         if (AvARRAY(av) != ary) {
2194                             AvMAX(av) += AvARRAY(av) - AvALLOC(av);
2195                             SvPVX(av) = (char*)ary;
2196                         }
2197                         if (items >= AvMAX(av) + 1) {
2198                             AvMAX(av) = items - 1;
2199                             Renew(ary,items+1,SV*);
2200                             AvALLOC(av) = ary;
2201                             SvPVX(av) = (char*)ary;
2202                         }
2203                     }
2204                     Copy(mark,AvARRAY(av),items,SV*);
2205                     AvFILLp(av) = items - 1;
2206                     assert(!AvREAL(av));
2207                     while (items--) {
2208                         if (*mark)
2209                             SvTEMP_off(*mark);
2210                         mark++;
2211                     }
2212                 }
2213                 if (PERLDB_SUB) {       /* Checking curstash breaks DProf. */
2214                     /*
2215                      * We do not care about using sv to call CV;
2216                      * it's for informational purposes only.
2217                      */
2218                     SV *sv = GvSV(PL_DBsub);
2219                     CV *gotocv;
2220                     
2221                     if (PERLDB_SUB_NN) {
2222                         SvIVX(sv) = PTR2IV(cv); /* Already upgraded, saved */
2223                     } else {
2224                         save_item(sv);
2225                         gv_efullname3(sv, CvGV(cv), Nullch);
2226                     }
2227                     if (  PERLDB_GOTO
2228                           && (gotocv = get_cv("DB::goto", FALSE)) ) {
2229                         PUSHMARK( PL_stack_sp );
2230                         call_sv((SV*)gotocv, G_SCALAR | G_NODEBUG);
2231                         PL_stack_sp--;
2232                     }
2233                 }
2234                 RETURNOP(CvSTART(cv));
2235             }
2236         }
2237         else {
2238             label = SvPV(sv,n_a);
2239             if (!(do_dump || *label))
2240                 DIE(aTHX_ must_have_label);
2241         }
2242     }
2243     else if (PL_op->op_flags & OPf_SPECIAL) {
2244         if (! do_dump)
2245             DIE(aTHX_ must_have_label);
2246     }
2247     else
2248         label = cPVOP->op_pv;
2249
2250     if (label && *label) {
2251         OP *gotoprobe = 0;
2252
2253         /* find label */
2254
2255         PL_lastgotoprobe = 0;
2256         *enterops = 0;
2257         for (ix = cxstack_ix; ix >= 0; ix--) {
2258             cx = &cxstack[ix];
2259             switch (CxTYPE(cx)) {
2260             case CXt_EVAL:
2261                 gotoprobe = PL_eval_root; /* XXX not good for nested eval */
2262                 break;
2263             case CXt_LOOP:
2264                 gotoprobe = cx->blk_oldcop->op_sibling;
2265                 break;
2266             case CXt_SUBST:
2267                 continue;
2268             case CXt_BLOCK:
2269                 if (ix)
2270                     gotoprobe = cx->blk_oldcop->op_sibling;
2271                 else
2272                     gotoprobe = PL_main_root;
2273                 break;
2274             case CXt_SUB:
2275                 if (CvDEPTH(cx->blk_sub.cv)) {
2276                     gotoprobe = CvROOT(cx->blk_sub.cv);
2277                     break;
2278                 }
2279                 /* FALL THROUGH */
2280             case CXt_NULL:
2281                 DIE(aTHX_ "Can't \"goto\" outside a block");
2282             default:
2283                 if (ix)
2284                     DIE(aTHX_ "panic: goto");
2285                 gotoprobe = PL_main_root;
2286                 break;
2287             }
2288             retop = dofindlabel(gotoprobe, label,
2289                                 enterops, enterops + GOTO_DEPTH);
2290             if (retop)
2291                 break;
2292             PL_lastgotoprobe = gotoprobe;
2293         }
2294         if (!retop)
2295             DIE(aTHX_ "Can't find label %s", label);
2296
2297         /* pop unwanted frames */
2298
2299         if (ix < cxstack_ix) {
2300             I32 oldsave;
2301
2302             if (ix < 0)
2303                 ix = 0;
2304             dounwind(ix);
2305             TOPBLOCK(cx);
2306             oldsave = PL_scopestack[PL_scopestack_ix];
2307             LEAVE_SCOPE(oldsave);
2308         }
2309
2310         /* push wanted frames */
2311
2312         if (*enterops && enterops[1]) {
2313             OP *oldop = PL_op;
2314             for (ix = 1; enterops[ix]; ix++) {
2315                 PL_op = enterops[ix];
2316                 /* Eventually we may want to stack the needed arguments
2317                  * for each op.  For now, we punt on the hard ones. */
2318                 if (PL_op->op_type == OP_ENTERITER)
2319                     DIE(aTHX_ "Can't \"goto\" into the middle of a foreach loop",
2320                         label);
2321                 CALL_FPTR(PL_op->op_ppaddr)(aTHX);
2322             }
2323             PL_op = oldop;
2324         }
2325     }
2326
2327     if (do_dump) {
2328 #ifdef VMS
2329         if (!retop) retop = PL_main_start;
2330 #endif
2331         PL_restartop = retop;
2332         PL_do_undump = TRUE;
2333
2334         my_unexec();
2335
2336         PL_restartop = 0;               /* hmm, must be GNU unexec().. */
2337         PL_do_undump = FALSE;
2338     }
2339
2340     RETURNOP(retop);
2341 }
2342
2343 PP(pp_exit)
2344 {
2345     djSP;
2346     I32 anum;
2347
2348     if (MAXARG < 1)
2349         anum = 0;
2350     else {
2351         anum = SvIVx(POPs);
2352 #ifdef VMSISH_EXIT
2353         if (anum == 1 && VMSISH_EXIT)
2354             anum = 0;
2355 #endif
2356     }
2357     my_exit(anum);
2358     PUSHs(&PL_sv_undef);
2359     RETURN;
2360 }
2361
2362 #ifdef NOTYET
2363 PP(pp_nswitch)
2364 {
2365     djSP;
2366     NV value = SvNVx(GvSV(cCOP->cop_gv));
2367     register I32 match = I_32(value);
2368
2369     if (value < 0.0) {
2370         if (((NV)match) > value)
2371             --match;            /* was fractional--truncate other way */
2372     }
2373     match -= cCOP->uop.scop.scop_offset;
2374     if (match < 0)
2375         match = 0;
2376     else if (match > cCOP->uop.scop.scop_max)
2377         match = cCOP->uop.scop.scop_max;
2378     PL_op = cCOP->uop.scop.scop_next[match];
2379     RETURNOP(PL_op);
2380 }
2381
2382 PP(pp_cswitch)
2383 {
2384     djSP;
2385     register I32 match;
2386
2387     if (PL_multiline)
2388         PL_op = PL_op->op_next;                 /* can't assume anything */
2389     else {
2390         STRLEN n_a;
2391         match = *(SvPVx(GvSV(cCOP->cop_gv), n_a)) & 255;
2392         match -= cCOP->uop.scop.scop_offset;
2393         if (match < 0)
2394             match = 0;
2395         else if (match > cCOP->uop.scop.scop_max)
2396             match = cCOP->uop.scop.scop_max;
2397         PL_op = cCOP->uop.scop.scop_next[match];
2398     }
2399     RETURNOP(PL_op);
2400 }
2401 #endif
2402
2403 /* Eval. */
2404
2405 STATIC void
2406 S_save_lines(pTHX_ AV *array, SV *sv)
2407 {
2408     register char *s = SvPVX(sv);
2409     register char *send = SvPVX(sv) + SvCUR(sv);
2410     register char *t;
2411     register I32 line = 1;
2412
2413     while (s && s < send) {
2414         SV *tmpstr = NEWSV(85,0);
2415
2416         sv_upgrade(tmpstr, SVt_PVMG);
2417         t = strchr(s, '\n');
2418         if (t)
2419             t++;
2420         else
2421             t = send;
2422
2423         sv_setpvn(tmpstr, s, t - s);
2424         av_store(array, line++, tmpstr);
2425         s = t;
2426     }
2427 }
2428
2429 STATIC void *
2430 S_docatch_body(pTHX_ va_list args)
2431 {
2432     CALLRUNOPS(aTHX);
2433     return NULL;
2434 }
2435
2436 STATIC OP *
2437 S_docatch(pTHX_ OP *o)
2438 {
2439     dTHR;
2440     int ret;
2441     OP *oldop = PL_op;
2442     volatile PERL_SI *cursi = PL_curstackinfo;
2443     dJMPENV;
2444
2445 #ifdef DEBUGGING
2446     assert(CATCH_GET == TRUE);
2447 #endif
2448     PL_op = o;
2449  redo_body:
2450     CALLPROTECT(aTHX_ pcur_env, &ret, MEMBER_TO_FPTR(S_docatch_body));
2451     switch (ret) {
2452     case 0:
2453         break;
2454     case 3:
2455         if (PL_restartop && cursi == PL_curstackinfo) {
2456             PL_op = PL_restartop;
2457             PL_restartop = 0;
2458             goto redo_body;
2459         }
2460         /* FALL THROUGH */
2461     default:
2462         PL_op = oldop;
2463         JMPENV_JUMP(ret);
2464         /* NOTREACHED */
2465     }
2466     PL_op = oldop;
2467     return Nullop;
2468 }
2469
2470 OP *
2471 Perl_sv_compile_2op(pTHX_ SV *sv, OP** startop, char *code, AV** avp)
2472 /* sv Text to convert to OP tree. */
2473 /* startop op_free() this to undo. */
2474 /* code Short string id of the caller. */
2475 {
2476     dSP;                                /* Make POPBLOCK work. */
2477     PERL_CONTEXT *cx;
2478     SV **newsp;
2479     I32 gimme = 0;   /* SUSPECT - INITIALZE TO WHAT?  NI-S */
2480     I32 optype;
2481     OP dummy;
2482     OP *oop = PL_op, *rop;
2483     char tmpbuf[TYPE_DIGITS(long) + 12 + 10];
2484     char *safestr;
2485
2486     ENTER;
2487     lex_start(sv);
2488     SAVETMPS;
2489     /* switch to eval mode */
2490
2491     if (PL_curcop == &PL_compiling) {
2492         SAVESPTR(PL_compiling.cop_stash);
2493         PL_compiling.cop_stash = PL_curstash;
2494     }
2495     SAVESPTR(PL_compiling.cop_filegv);
2496     SAVEI16(PL_compiling.cop_line);
2497     sprintf(tmpbuf, "_<(%.10s_eval %lu)", code, (unsigned long)++PL_evalseq);
2498     PL_compiling.cop_filegv = gv_fetchfile(tmpbuf+2);
2499     PL_compiling.cop_line = 1;
2500     /* XXX For C<eval "...">s within BEGIN {} blocks, this ends up
2501        deleting the eval's FILEGV from the stash before gv_check() runs
2502        (i.e. before run-time proper). To work around the coredump that
2503        ensues, we always turn GvMULTI_on for any globals that were
2504        introduced within evals. See force_ident(). GSAR 96-10-12 */
2505     safestr = savepv(tmpbuf);
2506     SAVEDELETE(PL_defstash, safestr, strlen(safestr));
2507     SAVEHINTS();
2508 #ifdef OP_IN_REGISTER
2509     PL_opsave = op;
2510 #else
2511     SAVEPPTR(PL_op);
2512 #endif
2513     PL_hints = 0;
2514
2515     PL_op = &dummy;
2516     PL_op->op_type = OP_ENTEREVAL;
2517     PL_op->op_flags = 0;                        /* Avoid uninit warning. */
2518     PUSHBLOCK(cx, CXt_EVAL, SP);
2519     PUSHEVAL(cx, 0, PL_compiling.cop_filegv);
2520     rop = doeval(G_SCALAR, startop);
2521     POPBLOCK(cx,PL_curpm);
2522     POPEVAL(cx);
2523
2524     (*startop)->op_type = OP_NULL;
2525     (*startop)->op_ppaddr = PL_ppaddr[OP_NULL];
2526     lex_end();
2527     *avp = (AV*)SvREFCNT_inc(PL_comppad);
2528     LEAVE;
2529     if (PL_curcop == &PL_compiling)
2530         PL_compiling.op_private = PL_hints;
2531 #ifdef OP_IN_REGISTER
2532     op = PL_opsave;
2533 #endif
2534     return rop;
2535 }
2536
2537 /* With USE_THREADS, eval_owner must be held on entry to doeval */
2538 STATIC OP *
2539 S_doeval(pTHX_ int gimme, OP** startop)
2540 {
2541     dSP;
2542     OP *saveop = PL_op;
2543     HV *newstash;
2544     CV *caller;
2545     AV* comppadlist;
2546     I32 i;
2547
2548     PL_in_eval = EVAL_INEVAL;
2549
2550     PUSHMARK(SP);
2551
2552     /* set up a scratch pad */
2553
2554     SAVEI32(PL_padix);
2555     SAVESPTR(PL_curpad);
2556     SAVESPTR(PL_comppad);
2557     SAVESPTR(PL_comppad_name);
2558     SAVEI32(PL_comppad_name_fill);
2559     SAVEI32(PL_min_intro_pending);
2560     SAVEI32(PL_max_intro_pending);
2561
2562     caller = PL_compcv;
2563     for (i = cxstack_ix - 1; i >= 0; i--) {
2564         PERL_CONTEXT *cx = &cxstack[i];
2565         if (CxTYPE(cx) == CXt_EVAL)
2566             break;
2567         else if (CxTYPE(cx) == CXt_SUB) {
2568             caller = cx->blk_sub.cv;
2569             break;
2570         }
2571     }
2572
2573     SAVESPTR(PL_compcv);
2574     PL_compcv = (CV*)NEWSV(1104,0);
2575     sv_upgrade((SV *)PL_compcv, SVt_PVCV);
2576     CvEVAL_on(PL_compcv);
2577 #ifdef USE_THREADS
2578     CvOWNER(PL_compcv) = 0;
2579     New(666, CvMUTEXP(PL_compcv), 1, perl_mutex);
2580     MUTEX_INIT(CvMUTEXP(PL_compcv));
2581 #endif /* USE_THREADS */
2582
2583     PL_comppad = newAV();
2584     av_push(PL_comppad, Nullsv);
2585     PL_curpad = AvARRAY(PL_comppad);
2586     PL_comppad_name = newAV();
2587     PL_comppad_name_fill = 0;
2588     PL_min_intro_pending = 0;
2589     PL_padix = 0;
2590 #ifdef USE_THREADS
2591     av_store(PL_comppad_name, 0, newSVpvn("@_", 2));
2592     PL_curpad[0] = (SV*)newAV();
2593     SvPADMY_on(PL_curpad[0]);   /* XXX Needed? */
2594 #endif /* USE_THREADS */
2595
2596     comppadlist = newAV();
2597     AvREAL_off(comppadlist);
2598     av_store(comppadlist, 0, (SV*)PL_comppad_name);
2599     av_store(comppadlist, 1, (SV*)PL_comppad);
2600     CvPADLIST(PL_compcv) = comppadlist;
2601
2602     if (!saveop || saveop->op_type != OP_REQUIRE)
2603         CvOUTSIDE(PL_compcv) = (CV*)SvREFCNT_inc(caller);
2604
2605     SAVEFREESV(PL_compcv);
2606
2607     /* make sure we compile in the right package */
2608
2609     newstash = PL_curcop->cop_stash;
2610     if (PL_curstash != newstash) {
2611         SAVESPTR(PL_curstash);
2612         PL_curstash = newstash;
2613     }
2614     SAVESPTR(PL_beginav);
2615     PL_beginav = newAV();
2616     SAVEFREESV(PL_beginav);
2617
2618     /* try to compile it */
2619
2620     PL_eval_root = Nullop;
2621     PL_error_count = 0;
2622     PL_curcop = &PL_compiling;
2623     PL_curcop->cop_arybase = 0;
2624     SvREFCNT_dec(PL_rs);
2625     PL_rs = newSVpvn("\n", 1);
2626     if (saveop && saveop->op_flags & OPf_SPECIAL)
2627         PL_in_eval |= EVAL_KEEPERR;
2628     else
2629         sv_setpv(ERRSV,"");
2630     if (yyparse() || PL_error_count || !PL_eval_root) {
2631         SV **newsp;
2632         I32 gimme;
2633         PERL_CONTEXT *cx;
2634         I32 optype = 0;                 /* Might be reset by POPEVAL. */
2635         STRLEN n_a;
2636         
2637         PL_op = saveop;
2638         if (PL_eval_root) {
2639             op_free(PL_eval_root);
2640             PL_eval_root = Nullop;
2641         }
2642         SP = PL_stack_base + POPMARK;           /* pop original mark */
2643         if (!startop) {
2644             POPBLOCK(cx,PL_curpm);
2645             POPEVAL(cx);
2646             pop_return();
2647         }
2648         lex_end();
2649         LEAVE;
2650         if (optype == OP_REQUIRE) {
2651             char* msg = SvPVx(ERRSV, n_a);
2652             DIE(aTHX_ "%sCompilation failed in require",
2653                 *msg ? msg : "Unknown error\n");
2654         }
2655         else if (startop) {
2656             char* msg = SvPVx(ERRSV, n_a);
2657
2658             POPBLOCK(cx,PL_curpm);
2659             POPEVAL(cx);
2660             Perl_croak(aTHX_ "%sCompilation failed in regexp",
2661                        (*msg ? msg : "Unknown error\n"));
2662         }
2663         SvREFCNT_dec(PL_rs);
2664         PL_rs = SvREFCNT_inc(PL_nrs);
2665 #ifdef USE_THREADS
2666         MUTEX_LOCK(&PL_eval_mutex);
2667         PL_eval_owner = 0;
2668         COND_SIGNAL(&PL_eval_cond);
2669         MUTEX_UNLOCK(&PL_eval_mutex);
2670 #endif /* USE_THREADS */
2671         RETPUSHUNDEF;
2672     }
2673     SvREFCNT_dec(PL_rs);
2674     PL_rs = SvREFCNT_inc(PL_nrs);
2675     PL_compiling.cop_line = 0;
2676     if (startop) {
2677         *startop = PL_eval_root;
2678         SvREFCNT_dec(CvOUTSIDE(PL_compcv));
2679         CvOUTSIDE(PL_compcv) = Nullcv;
2680     } else
2681         SAVEFREEOP(PL_eval_root);
2682     if (gimme & G_VOID)
2683         scalarvoid(PL_eval_root);
2684     else if (gimme & G_ARRAY)
2685         list(PL_eval_root);
2686     else
2687         scalar(PL_eval_root);
2688
2689     DEBUG_x(dump_eval());
2690
2691     /* Register with debugger: */
2692     if (PERLDB_INTER && saveop->op_type == OP_REQUIRE) {
2693         CV *cv = get_cv("DB::postponed", FALSE);
2694         if (cv) {
2695             dSP;
2696             PUSHMARK(SP);
2697             XPUSHs((SV*)PL_compiling.cop_filegv);
2698             PUTBACK;
2699             call_sv((SV*)cv, G_DISCARD);
2700         }
2701     }
2702
2703     /* compiled okay, so do it */
2704
2705     CvDEPTH(PL_compcv) = 1;
2706     SP = PL_stack_base + POPMARK;               /* pop original mark */
2707     PL_op = saveop;                     /* The caller may need it. */
2708 #ifdef USE_THREADS
2709     MUTEX_LOCK(&PL_eval_mutex);
2710     PL_eval_owner = 0;
2711     COND_SIGNAL(&PL_eval_cond);
2712     MUTEX_UNLOCK(&PL_eval_mutex);
2713 #endif /* USE_THREADS */
2714
2715     RETURNOP(PL_eval_start);
2716 }
2717
2718 STATIC PerlIO *
2719 S_doopen_pmc(pTHX_ const char *name, const char *mode)
2720 {
2721     STRLEN namelen = strlen(name);
2722     PerlIO *fp;
2723
2724     if (namelen > 3 && strEQ(name + namelen - 3, ".pm")) {
2725         SV *pmcsv = Perl_newSVpvf(aTHX_ "%s%c", name, 'c');
2726         char *pmc = SvPV_nolen(pmcsv);
2727         Stat_t pmstat;
2728         Stat_t pmcstat;
2729         if (PerlLIO_stat(pmc, &pmcstat) < 0) {
2730             fp = PerlIO_open(name, mode);
2731         }
2732         else {
2733             if (PerlLIO_stat(name, &pmstat) < 0 ||
2734                 pmstat.st_mtime < pmcstat.st_mtime)
2735             {
2736                 fp = PerlIO_open(pmc, mode);
2737             }
2738             else {
2739                 fp = PerlIO_open(name, mode);
2740             }
2741         }
2742         SvREFCNT_dec(pmcsv);
2743     }
2744     else {
2745         fp = PerlIO_open(name, mode);
2746     }
2747     return fp;
2748 }
2749
2750 PP(pp_require)
2751 {
2752     djSP;
2753     register PERL_CONTEXT *cx;
2754     SV *sv;
2755     char *name;
2756     STRLEN len;
2757     char *tryname;
2758     SV *namesv = Nullsv;
2759     SV** svp;
2760     I32 gimme = G_SCALAR;
2761     PerlIO *tryrsfp = 0;
2762     STRLEN n_a;
2763     int filter_has_file = 0;
2764     GV *filter_child_proc = 0;
2765     SV *filter_state = 0;
2766     SV *filter_sub = 0;
2767
2768     sv = POPs;
2769     if (SvNIOKp(sv) && !SvPOKp(sv)) {
2770         if (Atof(PL_patchlevel) + 0.00000999 < SvNV(sv))
2771             DIE(aTHX_ "Perl %s required--this is only version %s, stopped",
2772                 SvPV(sv,n_a),PL_patchlevel);
2773         RETPUSHYES;
2774     }
2775     name = SvPV(sv, len);
2776     if (!(name && len > 0 && *name))
2777         DIE(aTHX_ "Null filename used");
2778     TAINT_PROPER("require");
2779     if (PL_op->op_type == OP_REQUIRE &&
2780       (svp = hv_fetch(GvHVn(PL_incgv), name, len, 0)) &&
2781       *svp != &PL_sv_undef)
2782         RETPUSHYES;
2783
2784     /* prepare to compile file */
2785
2786 #ifdef MACOS_TRADITIONAL
2787     if (strchr(name, ':')
2788 #else
2789     if (*name == '/' ||
2790         (*name == '.' && 
2791             (name[1] == '/' ||
2792              (name[1] == '.' && name[2] == '/')))
2793 #ifdef DOSISH
2794       || (name[0] && name[1] == ':')
2795 #endif
2796 #ifdef WIN32
2797       || (name[0] == '\\' && name[1] == '\\')   /* UNC path */
2798 #endif
2799 #ifdef VMS
2800         || (strchr(name,':')  || ((*name == '[' || *name == '<') &&
2801             (isALNUM(name[1]) || strchr("$-_]>",name[1]))))
2802 #endif
2803 #endif
2804     )
2805     {
2806         tryname = name;
2807         tryrsfp = doopen_pmc(name,PERL_SCRIPT_MODE);
2808 #ifdef MACOS_TRADITIONAL
2809         /* We consider paths of the form :a:b ambiguous and interpret them first
2810            as global then as local
2811         */
2812     if (name[0] == ':' && !tryrsfp && name[1] != ':' && strchr(name+2, ':'))
2813         goto trylocal;
2814 #endif
2815     }
2816 #ifdef MACOS_TRADITIONAL
2817     else 
2818 trylocal: {
2819 #else
2820     else {
2821 #endif
2822         AV *ar = GvAVn(PL_incgv);
2823         I32 i;
2824 #ifdef VMS
2825         char *unixname;
2826         if ((unixname = tounixspec(name, Nullch)) != Nullch)
2827 #endif
2828         {
2829             namesv = NEWSV(806, 0);
2830             for (i = 0; i <= AvFILL(ar); i++) {
2831                 SV *dirsv = *av_fetch(ar, i, TRUE);
2832
2833                 if (SvROK(dirsv)) {
2834                     int count;
2835                     SV *loader = dirsv;
2836
2837                     if (SvTYPE(SvRV(loader)) == SVt_PVAV) {
2838                         loader = *av_fetch((AV *)SvRV(loader), 0, TRUE);
2839                     }
2840
2841                     Perl_sv_setpvf(aTHX_ namesv, "/loader/0x%"UVxf"/%s",
2842                                    PTR2UV(SvANY(loader)), name);
2843                     tryname = SvPVX(namesv);
2844                     tryrsfp = 0;
2845
2846                     ENTER;
2847                     SAVETMPS;
2848                     EXTEND(SP, 2);
2849
2850                     PUSHMARK(SP);
2851                     PUSHs(dirsv);
2852                     PUSHs(sv);
2853                     PUTBACK;
2854                     count = call_sv(loader, G_ARRAY);
2855                     SPAGAIN;
2856
2857                     if (count > 0) {
2858                         int i = 0;
2859                         SV *arg;
2860
2861                         SP -= count - 1;
2862                         arg = SP[i++];
2863
2864                         if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVGV) {
2865                             arg = SvRV(arg);
2866                         }
2867
2868                         if (SvTYPE(arg) == SVt_PVGV) {
2869                             IO *io = GvIO((GV *)arg);
2870
2871                             ++filter_has_file;
2872
2873                             if (io) {
2874                                 tryrsfp = IoIFP(io);
2875                                 if (IoTYPE(io) == '|') {
2876                                     /* reading from a child process doesn't
2877                                        nest -- when returning from reading
2878                                        the inner module, the outer one is
2879                                        unreadable (closed?)  I've tried to
2880                                        save the gv to manage the lifespan of
2881                                        the pipe, but this didn't help. XXX */
2882                                     filter_child_proc = (GV *)arg;
2883                                     (void)SvREFCNT_inc(filter_child_proc);
2884                                 }
2885                                 else {
2886                                     if (IoOFP(io) && IoOFP(io) != IoIFP(io)) {
2887                                         PerlIO_close(IoOFP(io));
2888                                     }
2889                                     IoIFP(io) = Nullfp;
2890                                     IoOFP(io) = Nullfp;
2891                                 }
2892                             }
2893
2894                             if (i < count) {
2895                                 arg = SP[i++];
2896                             }
2897                         }
2898
2899                         if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVCV) {
2900                             filter_sub = arg;
2901                             (void)SvREFCNT_inc(filter_sub);
2902
2903                             if (i < count) {
2904                                 filter_state = SP[i];
2905                                 (void)SvREFCNT_inc(filter_state);
2906                             }
2907
2908                             if (tryrsfp == 0) {
2909                                 tryrsfp = PerlIO_open("/dev/null",
2910                                                       PERL_SCRIPT_MODE);
2911                             }
2912                         }
2913                     }
2914
2915                     PUTBACK;
2916                     FREETMPS;
2917                     LEAVE;
2918
2919                     if (tryrsfp) {
2920                         break;
2921                     }
2922
2923                     filter_has_file = 0;
2924                     if (filter_child_proc) {
2925                         SvREFCNT_dec(filter_child_proc);
2926                         filter_child_proc = 0;
2927                     }
2928                     if (filter_state) {
2929                         SvREFCNT_dec(filter_state);
2930                         filter_state = 0;
2931                     }
2932                     if (filter_sub) {
2933                         SvREFCNT_dec(filter_sub);
2934                         filter_sub = 0;
2935                     }
2936                 }
2937                 else {
2938                     char *dir = SvPVx(dirsv, n_a);
2939 #ifdef MACOS_TRADITIONAL
2940                     /* We have ensured in incpush that library ends with ':' */
2941                     int   dirlen = strlen(dir);
2942                     char *colon  = strchr(dir, ':') ? "" : ":";
2943                     int   colons = (dir[dirlen-1] == ':') + (*name == ':');
2944                 
2945                     switch (colons) {
2946                     case 2:
2947                         sv_setpvfaTHX_ (namesv, "%s%s%s", colon, dir, name+1);
2948                         break;
2949                     case 1:
2950                         sv_setpvf(aTHX_ namesv, "%s%s%s", colon, dir, name);
2951                         break;
2952                     case 0: 
2953                         sv_setpvf(aTHX_ namesv, "%s%s:%s", colon, dir, name);
2954                         break;
2955                     }
2956 #else
2957 #ifdef VMS
2958                     char *unixdir;
2959                     if ((unixdir = tounixpath(dir, Nullch)) == Nullch)
2960                         continue;
2961                     sv_setpv(namesv, unixdir);
2962                     sv_catpv(namesv, unixname);
2963 #else
2964                     Perl_sv_setpvf(aTHX_ namesv, "%s/%s", dir, name);
2965 #endif
2966 #endif
2967                     TAINT_PROPER("require");
2968                     tryname = SvPVX(namesv);
2969 #ifdef MACOS_TRADITIONAL
2970                 for (colon = tryname+dirlen; colon = strchr(colon, '/'); )
2971                     *colon++ = ':';
2972 #endif
2973                     tryrsfp = doopen_pmc(tryname, PERL_SCRIPT_MODE);
2974                     if (tryrsfp) {
2975                         if (tryname[0] == '.' && tryname[1] == '/')
2976                             tryname += 2;
2977                         break;
2978                     }
2979                 }
2980             }
2981         }
2982     }
2983     SAVESPTR(PL_compiling.cop_filegv);
2984     PL_compiling.cop_filegv = gv_fetchfile(tryrsfp ? tryname : name);
2985     SvREFCNT_dec(namesv);
2986     if (!tryrsfp) {
2987         if (PL_op->op_type == OP_REQUIRE) {
2988             char *msgstr = name;
2989             if (namesv) {                       /* did we lookup @INC? */
2990                 SV *msg = sv_2mortal(newSVpv(msgstr,0));
2991                 SV *dirmsgsv = NEWSV(0, 0);
2992                 AV *ar = GvAVn(PL_incgv);
2993                 I32 i;
2994                 sv_catpvn(msg, " in @INC", 8);
2995                 if (instr(SvPVX(msg), ".h "))
2996                     sv_catpv(msg, " (change .h to .ph maybe?)");
2997                 if (instr(SvPVX(msg), ".ph "))
2998                     sv_catpv(msg, " (did you run h2ph?)");
2999                 sv_catpv(msg, " (@INC contains:");
3000                 for (i = 0; i <= AvFILL(ar); i++) {
3001                     char *dir = SvPVx(*av_fetch(ar, i, TRUE), n_a);
3002                     Perl_sv_setpvf(aTHX_ dirmsgsv, " %s", dir);
3003                     sv_catsv(msg, dirmsgsv);
3004                 }
3005                 sv_catpvn(msg, ")", 1);
3006                 SvREFCNT_dec(dirmsgsv);
3007                 msgstr = SvPV_nolen(msg);
3008             }
3009             DIE(aTHX_ "Can't locate %s", msgstr);
3010         }
3011
3012         RETPUSHUNDEF;
3013     }
3014     else
3015         SETERRNO(0, SS$_NORMAL);
3016
3017     /* Assume success here to prevent recursive requirement. */
3018     (void)hv_store(GvHVn(PL_incgv), name, strlen(name),
3019         newSVsv(GvSV(PL_compiling.cop_filegv)), 0 );
3020
3021     ENTER;
3022     SAVETMPS;
3023     lex_start(sv_2mortal(newSVpvn("",0)));
3024     SAVEGENERICSV(PL_rsfp_filters);
3025     PL_rsfp_filters = Nullav;
3026
3027     PL_rsfp = tryrsfp;
3028     name = savepv(name);
3029     SAVEFREEPV(name);
3030     SAVEHINTS();
3031     PL_hints = 0;
3032     SAVEPPTR(PL_compiling.cop_warnings);
3033     if (PL_dowarn & G_WARN_ALL_ON)
3034         PL_compiling.cop_warnings = WARN_ALL ;
3035     else if (PL_dowarn & G_WARN_ALL_OFF)
3036         PL_compiling.cop_warnings = WARN_NONE ;
3037     else 
3038         PL_compiling.cop_warnings = WARN_STD ;
3039
3040     if (filter_sub || filter_child_proc) {
3041         SV *datasv = filter_add(run_user_filter, Nullsv);
3042         IoLINES(datasv) = filter_has_file;
3043         IoFMT_GV(datasv) = (GV *)filter_child_proc;
3044         IoTOP_GV(datasv) = (GV *)filter_state;
3045         IoBOTTOM_GV(datasv) = (GV *)filter_sub;
3046     }
3047
3048     /* switch to eval mode */
3049     push_return(PL_op->op_next);
3050     PUSHBLOCK(cx, CXt_EVAL, SP);
3051     PUSHEVAL(cx, name, PL_compiling.cop_filegv);
3052
3053     SAVEI16(PL_compiling.cop_line);
3054     PL_compiling.cop_line = 0;
3055
3056     PUTBACK;
3057 #ifdef USE_THREADS
3058     MUTEX_LOCK(&PL_eval_mutex);
3059     if (PL_eval_owner && PL_eval_owner != thr)
3060         while (PL_eval_owner)
3061             COND_WAIT(&PL_eval_cond, &PL_eval_mutex);
3062     PL_eval_owner = thr;
3063     MUTEX_UNLOCK(&PL_eval_mutex);
3064 #endif /* USE_THREADS */
3065     return DOCATCH(doeval(G_SCALAR, NULL));
3066 }
3067
3068 PP(pp_dofile)
3069 {
3070     return pp_require();
3071 }
3072
3073 PP(pp_entereval)
3074 {
3075     djSP;
3076     register PERL_CONTEXT *cx;
3077     dPOPss;
3078     I32 gimme = GIMME_V, was = PL_sub_generation;
3079     char tmpbuf[TYPE_DIGITS(long) + 12];
3080     char *safestr;
3081     STRLEN len;
3082     OP *ret;
3083
3084     if (!SvPV(sv,len) || !len)
3085         RETPUSHUNDEF;
3086     TAINT_PROPER("eval");
3087
3088     ENTER;
3089     lex_start(sv);
3090     SAVETMPS;
3091  
3092     /* switch to eval mode */
3093
3094     SAVESPTR(PL_compiling.cop_filegv);
3095     sprintf(tmpbuf, "_<(eval %lu)", (unsigned long)++PL_evalseq);
3096     PL_compiling.cop_filegv = gv_fetchfile(tmpbuf+2);
3097     PL_compiling.cop_line = 1;
3098     /* XXX For C<eval "...">s within BEGIN {} blocks, this ends up
3099        deleting the eval's FILEGV from the stash before gv_check() runs
3100        (i.e. before run-time proper). To work around the coredump that
3101        ensues, we always turn GvMULTI_on for any globals that were
3102        introduced within evals. See force_ident(). GSAR 96-10-12 */
3103     safestr = savepv(tmpbuf);
3104     SAVEDELETE(PL_defstash, safestr, strlen(safestr));
3105     SAVEHINTS();
3106     PL_hints = PL_op->op_targ;
3107     SAVEPPTR(PL_compiling.cop_warnings);
3108     if (!specialWARN(PL_compiling.cop_warnings)) {
3109         PL_compiling.cop_warnings = newSVsv(PL_compiling.cop_warnings) ;
3110         SAVEFREESV(PL_compiling.cop_warnings) ;
3111     }
3112
3113     push_return(PL_op->op_next);
3114     PUSHBLOCK(cx, (CXt_EVAL|CXp_REAL), SP);
3115     PUSHEVAL(cx, 0, PL_compiling.cop_filegv);
3116
3117     /* prepare to compile string */
3118
3119     if (PERLDB_LINE && PL_curstash != PL_debstash)
3120         save_lines(GvAV(PL_compiling.cop_filegv), PL_linestr);
3121     PUTBACK;
3122 #ifdef USE_THREADS
3123     MUTEX_LOCK(&PL_eval_mutex);
3124     if (PL_eval_owner && PL_eval_owner != thr)
3125         while (PL_eval_owner)
3126             COND_WAIT(&PL_eval_cond, &PL_eval_mutex);
3127     PL_eval_owner = thr;
3128     MUTEX_UNLOCK(&PL_eval_mutex);
3129 #endif /* USE_THREADS */
3130     ret = doeval(gimme, NULL);
3131     if (PERLDB_INTER && was != PL_sub_generation /* Some subs defined here. */
3132         && ret != PL_op->op_next) {     /* Successive compilation. */
3133         strcpy(safestr, "_<(eval )");   /* Anything fake and short. */
3134     }
3135     return DOCATCH(ret);
3136 }
3137
3138 PP(pp_leaveeval)
3139 {
3140     djSP;
3141     register SV **mark;
3142     SV **newsp;
3143     PMOP *newpm;
3144     I32 gimme;
3145     register PERL_CONTEXT *cx;
3146     OP *retop;
3147     U8 save_flags = PL_op -> op_flags;
3148     I32 optype;
3149
3150     POPBLOCK(cx,newpm);
3151     POPEVAL(cx);
3152     retop = pop_return();
3153
3154     TAINT_NOT;
3155     if (gimme == G_VOID)
3156         MARK = newsp;
3157     else if (gimme == G_SCALAR) {
3158         MARK = newsp + 1;
3159         if (MARK <= SP) {
3160             if (SvFLAGS(TOPs) & SVs_TEMP)
3161                 *MARK = TOPs;
3162             else
3163                 *MARK = sv_mortalcopy(TOPs);
3164         }
3165         else {
3166             MEXTEND(mark,0);
3167             *MARK = &PL_sv_undef;
3168         }
3169         SP = MARK;
3170     }
3171     else {
3172         /* in case LEAVE wipes old return values */
3173         for (mark = newsp + 1; mark <= SP; mark++) {
3174             if (!(SvFLAGS(*mark) & SVs_TEMP)) {
3175                 *mark = sv_mortalcopy(*mark);
3176                 TAINT_NOT;      /* Each item is independent */
3177             }
3178         }
3179     }
3180     PL_curpm = newpm;   /* Don't pop $1 et al till now */
3181
3182     if (AvFILLp(PL_comppad_name) >= 0)
3183         free_closures();
3184
3185 #ifdef DEBUGGING
3186     assert(CvDEPTH(PL_compcv) == 1);
3187 #endif
3188     CvDEPTH(PL_compcv) = 0;
3189     lex_end();
3190
3191     if (optype == OP_REQUIRE &&
3192         !(gimme == G_SCALAR ? SvTRUE(*SP) : SP > newsp))
3193     {
3194         /* Unassume the success we assumed earlier. */
3195         char *name = cx->blk_eval.old_name;
3196         (void)hv_delete(GvHVn(PL_incgv), name, strlen(name), G_DISCARD);
3197         retop = Perl_die(aTHX_ "%s did not return a true value", name);
3198         /* die_where() did LEAVE, or we won't be here */
3199     }
3200     else {
3201         LEAVE;
3202         if (!(save_flags & OPf_SPECIAL))
3203             sv_setpv(ERRSV,"");
3204     }
3205
3206     RETURNOP(retop);
3207 }
3208
3209 PP(pp_entertry)
3210 {
3211     djSP;
3212     register PERL_CONTEXT *cx;
3213     I32 gimme = GIMME_V;
3214
3215     ENTER;
3216     SAVETMPS;
3217
3218     push_return(cLOGOP->op_other->op_next);
3219     PUSHBLOCK(cx, CXt_EVAL, SP);
3220     PUSHEVAL(cx, 0, 0);
3221     PL_eval_root = PL_op;               /* Only needed so that goto works right. */
3222
3223     PL_in_eval = EVAL_INEVAL;
3224     sv_setpv(ERRSV,"");
3225     PUTBACK;
3226     return DOCATCH(PL_op->op_next);
3227 }
3228
3229 PP(pp_leavetry)
3230 {
3231     djSP;
3232     register SV **mark;
3233     SV **newsp;
3234     PMOP *newpm;
3235     I32 gimme;
3236     register PERL_CONTEXT *cx;
3237     I32 optype;
3238
3239     POPBLOCK(cx,newpm);
3240     POPEVAL(cx);
3241     pop_return();
3242
3243     TAINT_NOT;
3244     if (gimme == G_VOID)
3245         SP = newsp;
3246     else if (gimme == G_SCALAR) {
3247         MARK = newsp + 1;
3248         if (MARK <= SP) {
3249             if (SvFLAGS(TOPs) & (SVs_PADTMP|SVs_TEMP))
3250                 *MARK = TOPs;
3251             else
3252                 *MARK = sv_mortalcopy(TOPs);
3253         }
3254         else {
3255             MEXTEND(mark,0);
3256             *MARK = &PL_sv_undef;
3257         }
3258         SP = MARK;
3259     }
3260     else {
3261         /* in case LEAVE wipes old return values */
3262         for (mark = newsp + 1; mark <= SP; mark++) {
3263             if (!(SvFLAGS(*mark) & (SVs_PADTMP|SVs_TEMP))) {
3264                 *mark = sv_mortalcopy(*mark);
3265                 TAINT_NOT;      /* Each item is independent */
3266             }
3267         }
3268     }
3269     PL_curpm = newpm;   /* Don't pop $1 et al till now */
3270
3271     LEAVE;
3272     sv_setpv(ERRSV,"");
3273     RETURN;
3274 }
3275
3276 STATIC void
3277 S_doparseform(pTHX_ SV *sv)
3278 {
3279     STRLEN len;
3280     register char *s = SvPV_force(sv, len);
3281     register char *send = s + len;
3282     register char *base;
3283     register I32 skipspaces = 0;
3284     bool noblank;
3285     bool repeat;
3286     bool postspace = FALSE;
3287     U16 *fops;
3288     register U16 *fpc;
3289     U16 *linepc;
3290     register I32 arg;
3291     bool ischop;
3292
3293     if (len == 0)
3294         Perl_croak(aTHX_ "Null picture in formline");
3295     
3296     New(804, fops, (send - s)*3+10, U16);    /* Almost certainly too long... */
3297     fpc = fops;
3298
3299     if (s < send) {
3300         linepc = fpc;
3301         *fpc++ = FF_LINEMARK;
3302         noblank = repeat = FALSE;
3303         base = s;
3304     }
3305
3306     while (s <= send) {
3307         switch (*s++) {
3308         default:
3309             skipspaces = 0;
3310             continue;
3311
3312         case '~':
3313             if (*s == '~') {
3314                 repeat = TRUE;
3315                 *s = ' ';
3316             }
3317             noblank = TRUE;
3318             s[-1] = ' ';
3319             /* FALL THROUGH */
3320         case ' ': case '\t':
3321             skipspaces++;
3322             continue;
3323             
3324         case '\n': case 0:
3325             arg = s - base;
3326             skipspaces++;
3327             arg -= skipspaces;
3328             if (arg) {
3329                 if (postspace)
3330                     *fpc++ = FF_SPACE;
3331                 *fpc++ = FF_LITERAL;
3332                 *fpc++ = arg;
3333             }
3334             postspace = FALSE;
3335             if (s <= send)
3336                 skipspaces--;
3337             if (skipspaces) {
3338                 *fpc++ = FF_SKIP;
3339                 *fpc++ = skipspaces;
3340             }
3341             skipspaces = 0;
3342             if (s <= send)
3343                 *fpc++ = FF_NEWLINE;
3344             if (noblank) {
3345                 *fpc++ = FF_BLANK;
3346                 if (repeat)
3347                     arg = fpc - linepc + 1;
3348                 else
3349                     arg = 0;
3350                 *fpc++ = arg;
3351             }
3352             if (s < send) {
3353                 linepc = fpc;
3354                 *fpc++ = FF_LINEMARK;
3355                 noblank = repeat = FALSE;
3356                 base = s;
3357             }
3358             else
3359                 s++;
3360             continue;
3361
3362         case '@':
3363         case '^':
3364             ischop = s[-1] == '^';
3365
3366             if (postspace) {
3367                 *fpc++ = FF_SPACE;
3368                 postspace = FALSE;
3369             }
3370             arg = (s - base) - 1;
3371             if (arg) {
3372                 *fpc++ = FF_LITERAL;
3373                 *fpc++ = arg;
3374             }
3375
3376             base = s - 1;
3377             *fpc++ = FF_FETCH;
3378             if (*s == '*') {
3379                 s++;
3380                 *fpc++ = 0;
3381                 *fpc++ = FF_LINEGLOB;
3382             }
3383             else if (*s == '#' || (*s == '.' && s[1] == '#')) {
3384                 arg = ischop ? 512 : 0;
3385                 base = s - 1;
3386                 while (*s == '#')
3387                     s++;
3388                 if (*s == '.') {
3389                     char *f;
3390                     s++;
3391                     f = s;
3392                     while (*s == '#')
3393                         s++;
3394                     arg |= 256 + (s - f);
3395                 }
3396                 *fpc++ = s - base;              /* fieldsize for FETCH */
3397                 *fpc++ = FF_DECIMAL;
3398                 *fpc++ = arg;
3399             }
3400             else {
3401                 I32 prespace = 0;
3402                 bool ismore = FALSE;
3403
3404                 if (*s == '>') {
3405                     while (*++s == '>') ;
3406                     prespace = FF_SPACE;
3407                 }
3408                 else if (*s == '|') {
3409                     while (*++s == '|') ;
3410                     prespace = FF_HALFSPACE;
3411                     postspace = TRUE;
3412                 }
3413                 else {
3414                     if (*s == '<')
3415                         while (*++s == '<') ;
3416                     postspace = TRUE;
3417                 }
3418                 if (*s == '.' && s[1] == '.' && s[2] == '.') {
3419                     s += 3;
3420                     ismore = TRUE;
3421                 }
3422                 *fpc++ = s - base;              /* fieldsize for FETCH */
3423
3424                 *fpc++ = ischop ? FF_CHECKCHOP : FF_CHECKNL;
3425
3426                 if (prespace)
3427                     *fpc++ = prespace;
3428                 *fpc++ = FF_ITEM;
3429                 if (ismore)
3430                     *fpc++ = FF_MORE;
3431                 if (ischop)
3432                     *fpc++ = FF_CHOP;
3433             }
3434             base = s;
3435             skipspaces = 0;
3436             continue;
3437         }
3438     }
3439     *fpc++ = FF_END;
3440
3441     arg = fpc - fops;
3442     { /* need to jump to the next word */
3443         int z;
3444         z = WORD_ALIGN - SvCUR(sv) % WORD_ALIGN;
3445         SvGROW(sv, SvCUR(sv) + z + arg * sizeof(U16) + 4);
3446         s = SvPVX(sv) + SvCUR(sv) + z;
3447     }
3448     Copy(fops, s, arg, U16);
3449     Safefree(fops);
3450     sv_magic(sv, Nullsv, 'f', Nullch, 0);
3451     SvCOMPILED_on(sv);
3452 }
3453
3454 /*
3455  * The rest of this file was derived from source code contributed
3456  * by Tom Horsley.
3457  *
3458  * NOTE: this code was derived from Tom Horsley's qsort replacement
3459  * and should not be confused with the original code.
3460  */
3461
3462 /* Copyright (C) Tom Horsley, 1997. All rights reserved.
3463
3464    Permission granted to distribute under the same terms as perl which are
3465    (briefly):
3466
3467     This program is free software; you can redistribute it and/or modify
3468     it under the terms of either:
3469
3470         a) the GNU General Public License as published by the Free
3471         Software Foundation; either version 1, or (at your option) any
3472         later version, or
3473
3474         b) the "Artistic License" which comes with this Kit.
3475
3476    Details on the perl license can be found in the perl source code which
3477    may be located via the www.perl.com web page.
3478
3479    This is the most wonderfulest possible qsort I can come up with (and
3480    still be mostly portable) My (limited) tests indicate it consistently
3481    does about 20% fewer calls to compare than does the qsort in the Visual
3482    C++ library, other vendors may vary.
3483
3484    Some of the ideas in here can be found in "Algorithms" by Sedgewick,
3485    others I invented myself (or more likely re-invented since they seemed
3486    pretty obvious once I watched the algorithm operate for a while).
3487
3488    Most of this code was written while watching the Marlins sweep the Giants
3489    in the 1997 National League Playoffs - no Braves fans allowed to use this
3490    code (just kidding :-).
3491
3492    I realize that if I wanted to be true to the perl tradition, the only
3493    comment in this file would be something like:
3494
3495    ...they shuffled back towards the rear of the line. 'No, not at the
3496    rear!'  the slave-driver shouted. 'Three files up. And stay there...
3497
3498    However, I really needed to violate that tradition just so I could keep
3499    track of what happens myself, not to mention some poor fool trying to
3500    understand this years from now :-).
3501 */
3502
3503 /* ********************************************************** Configuration */
3504
3505 #ifndef QSORT_ORDER_GUESS
3506 #define QSORT_ORDER_GUESS 2     /* Select doubling version of the netBSD trick */
3507 #endif
3508
3509 /* QSORT_MAX_STACK is the largest number of partitions that can be stacked up for
3510    future processing - a good max upper bound is log base 2 of memory size
3511    (32 on 32 bit machines, 64 on 64 bit machines, etc). In reality can
3512    safely be smaller than that since the program is taking up some space and
3513    most operating systems only let you grab some subset of contiguous
3514    memory (not to mention that you are normally sorting data larger than
3515    1 byte element size :-).
3516 */
3517 #ifndef QSORT_MAX_STACK
3518 #define QSORT_MAX_STACK 32
3519 #endif
3520
3521 /* QSORT_BREAK_EVEN is the size of the largest partition we should insertion sort.
3522    Anything bigger and we use qsort. If you make this too small, the qsort
3523    will probably break (or become less efficient), because it doesn't expect
3524    the middle element of a partition to be the same as the right or left -
3525    you have been warned).
3526 */
3527 #ifndef QSORT_BREAK_EVEN
3528 #define QSORT_BREAK_EVEN 6
3529 #endif
3530
3531 /* ************************************************************* Data Types */
3532
3533 /* hold left and right index values of a partition waiting to be sorted (the
3534    partition includes both left and right - right is NOT one past the end or
3535    anything like that).
3536 */
3537 struct partition_stack_entry {
3538    int left;
3539    int right;
3540 #ifdef QSORT_ORDER_GUESS
3541    int qsort_break_even;
3542 #endif
3543 };
3544
3545 /* ******************************************************* Shorthand Macros */
3546
3547 /* Note that these macros will be used from inside the qsort function where
3548    we happen to know that the variable 'elt_size' contains the size of an
3549    array element and the variable 'temp' points to enough space to hold a
3550    temp element and the variable 'array' points to the array being sorted
3551    and 'compare' is the pointer to the compare routine.
3552
3553    Also note that there are very many highly architecture specific ways
3554    these might be sped up, but this is simply the most generally portable
3555    code I could think of.
3556 */
3557
3558 /* Return < 0 == 0 or > 0 as the value of elt1 is < elt2, == elt2, > elt2
3559 */
3560 #define qsort_cmp(elt1, elt2) \
3561    ((*compare)(aTHXo_ array[elt1], array[elt2]))
3562
3563 #ifdef QSORT_ORDER_GUESS
3564 #define QSORT_NOTICE_SWAP swapped++;
3565 #else
3566 #define QSORT_NOTICE_SWAP
3567 #endif
3568
3569 /* swaps contents of array elements elt1, elt2.
3570 */
3571 #define qsort_swap(elt1, elt2) \
3572    STMT_START { \
3573       QSORT_NOTICE_SWAP \
3574       temp = array[elt1]; \
3575       array[elt1] = array[elt2]; \
3576       array[elt2] = temp; \
3577    } STMT_END
3578
3579 /* rotate contents of elt1, elt2, elt3 such that elt1 gets elt2, elt2 gets
3580    elt3 and elt3 gets elt1.
3581 */
3582 #define qsort_rotate(elt1, elt2, elt3) \
3583    STMT_START { \
3584       QSORT_NOTICE_SWAP \
3585       temp = array[elt1]; \
3586       array[elt1] = array[elt2]; \
3587       array[elt2] = array[elt3]; \
3588       array[elt3] = temp; \
3589    } STMT_END
3590
3591 /* ************************************************************ Debug stuff */
3592
3593 #ifdef QSORT_DEBUG
3594
3595 static void
3596 break_here()
3597 {
3598    return; /* good place to set a breakpoint */
3599 }
3600
3601 #define qsort_assert(t) (void)( (t) || (break_here(), 0) )
3602
3603 static void
3604 doqsort_all_asserts(
3605    void * array,
3606    size_t num_elts,
3607    size_t elt_size,
3608    int (*compare)(const void * elt1, const void * elt2),
3609    int pc_left, int pc_right, int u_left, int u_right)
3610 {
3611    int i;
3612
3613    qsort_assert(pc_left <= pc_right);
3614    qsort_assert(u_right < pc_left);
3615    qsort_assert(pc_right < u_left);
3616    for (i = u_right + 1; i < pc_left; ++i) {
3617       qsort_assert(qsort_cmp(i, pc_left) < 0);
3618    }
3619    for (i = pc_left; i < pc_right; ++i) {
3620       qsort_assert(qsort_cmp(i, pc_right) == 0);
3621    }
3622    for (i = pc_right + 1; i < u_left; ++i) {
3623       qsort_assert(qsort_cmp(pc_right, i) < 0);
3624    }
3625 }
3626
3627 #define qsort_all_asserts(PC_LEFT, PC_RIGHT, U_LEFT, U_RIGHT) \
3628    doqsort_all_asserts(array, num_elts, elt_size, compare, \
3629                  PC_LEFT, PC_RIGHT, U_LEFT, U_RIGHT)
3630
3631 #else
3632
3633 #define qsort_assert(t) ((void)0)
3634
3635 #define qsort_all_asserts(PC_LEFT, PC_RIGHT, U_LEFT, U_RIGHT) ((void)0)
3636
3637 #endif
3638
3639 /* ****************************************************************** qsort */
3640
3641 STATIC void
3642 S_qsortsv(pTHX_ SV ** array, size_t num_elts, SVCOMPARE_t compare)
3643 {
3644    register SV * temp;
3645
3646    struct partition_stack_entry partition_stack[QSORT_MAX_STACK];
3647    int next_stack_entry = 0;
3648
3649    int part_left;
3650    int part_right;
3651 #ifdef QSORT_ORDER_GUESS
3652    int qsort_break_even;
3653    int swapped;
3654 #endif
3655
3656    /* Make sure we actually have work to do.
3657    */
3658    if (num_elts <= 1) {
3659       return;
3660    }
3661
3662    /* Setup the initial partition definition and fall into the sorting loop
3663    */
3664    part_left = 0;
3665    part_right = (int)(num_elts - 1);
3666 #ifdef QSORT_ORDER_GUESS
3667    qsort_break_even = QSORT_BREAK_EVEN;
3668 #else
3669 #define qsort_break_even QSORT_BREAK_EVEN
3670 #endif
3671    for ( ; ; ) {
3672       if ((part_right - part_left) >= qsort_break_even) {
3673          /* OK, this is gonna get hairy, so lets try to document all the
3674             concepts and abbreviations and variables and what they keep
3675             track of:
3676
3677             pc: pivot chunk - the set of array elements we accumulate in the
3678                 middle of the partition, all equal in value to the original
3679                 pivot element selected. The pc is defined by:
3680
3681                 pc_left - the leftmost array index of the pc
3682                 pc_right - the rightmost array index of the pc
3683
3684                 we start with pc_left == pc_right and only one element
3685                 in the pivot chunk (but it can grow during the scan).
3686
3687             u:  uncompared elements - the set of elements in the partition
3688                 we have not yet compared to the pivot value. There are two
3689                 uncompared sets during the scan - one to the left of the pc
3690                 and one to the right.
3691
3692                 u_right - the rightmost index of the left side's uncompared set
3693                 u_left - the leftmost index of the right side's uncompared set
3694
3695                 The leftmost index of the left sides's uncompared set
3696                 doesn't need its own variable because it is always defined
3697                 by the leftmost edge of the whole partition (part_left). The
3698                 same goes for the rightmost edge of the right partition
3699                 (part_right).
3700
3701                 We know there are no uncompared elements on the left once we
3702                 get u_right < part_left and no uncompared elements on the
3703                 right once u_left > part_right. When both these conditions
3704                 are met, we have completed the scan of the partition.
3705
3706                 Any elements which are between the pivot chunk and the
3707                 uncompared elements should be less than the pivot value on
3708                 the left side and greater than the pivot value on the right
3709                 side (in fact, the goal of the whole algorithm is to arrange
3710                 for that to be true and make the groups of less-than and
3711                 greater-then elements into new partitions to sort again).
3712
3713             As you marvel at the complexity of the code and wonder why it
3714             has to be so confusing. Consider some of the things this level
3715             of confusion brings:
3716
3717             Once I do a compare, I squeeze every ounce of juice out of it. I
3718             never do compare calls I don't have to do, and I certainly never
3719             do redundant calls.
3720
3721             I also never swap any elements unless I can prove there is a
3722             good reason. Many sort algorithms will swap a known value with
3723             an uncompared value just to get things in the right place (or
3724             avoid complexity :-), but that uncompared value, once it gets
3725             compared, may then have to be swapped again. A lot of the
3726             complexity of this code is due to the fact that it never swaps
3727             anything except compared values, and it only swaps them when the
3728             compare shows they are out of position.
3729          */
3730          int pc_left, pc_right;
3731          int u_right, u_left;
3732
3733          int s;
3734
3735          pc_left = ((part_left + part_right) / 2);
3736          pc_right = pc_left;
3737          u_right = pc_left - 1;
3738          u_left = pc_right + 1;
3739
3740          /* Qsort works best when the pivot value is also the median value
3741             in the partition (unfortunately you can't find the median value
3742             without first sorting :-), so to give the algorithm a helping
3743             hand, we pick 3 elements and sort them and use the median value
3744             of that tiny set as the pivot value.
3745
3746             Some versions of qsort like to use the left middle and right as
3747             the 3 elements to sort so they can insure the ends of the
3748             partition will contain values which will stop the scan in the
3749             compare loop, but when you have to call an arbitrarily complex
3750             routine to do a compare, its really better to just keep track of
3751             array index values to know when you hit the edge of the
3752             partition and avoid the extra compare. An even better reason to
3753             avoid using a compare call is the fact that you can drop off the
3754             edge of the array if someone foolishly provides you with an
3755             unstable compare function that doesn't always provide consistent
3756             results.
3757
3758             So, since it is simpler for us to compare the three adjacent
3759             elements in the middle of the partition, those are the ones we
3760             pick here (conveniently pointed at by u_right, pc_left, and
3761             u_left). The values of the left, center, and right elements
3762             are refered to as l c and r in the following comments.
3763          */
3764
3765 #ifdef QSORT_ORDER_GUESS
3766          swapped = 0;
3767 #endif
3768          s = qsort_cmp(u_right, pc_left);
3769          if (s < 0) {
3770             /* l < c */
3771             s = qsort_cmp(pc_left, u_left);
3772             /* if l < c, c < r - already in order - nothing to do */
3773             if (s == 0) {
3774                /* l < c, c == r - already in order, pc grows */
3775                ++pc_right;
3776                qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
3777             } else if (s > 0) {
3778                /* l < c, c > r - need to know more */
3779                s = qsort_cmp(u_right, u_left);
3780                if (s < 0) {
3781                   /* l < c, c > r, l < r - swap c & r to get ordered */
3782                   qsort_swap(pc_left, u_left);
3783                   qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
3784                } else if (s == 0) {
3785                   /* l < c, c > r, l == r - swap c&r, grow pc */
3786                   qsort_swap(pc_left, u_left);
3787                   --pc_left;
3788                   qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
3789                } else {
3790                   /* l < c, c > r, l > r - make lcr into rlc to get ordered */
3791                   qsort_rotate(pc_left, u_right, u_left);
3792                   qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
3793                }
3794             }
3795          } else if (s == 0) {
3796             /* l == c */
3797             s = qsort_cmp(pc_left, u_left);
3798             if (s < 0) {
3799                /* l == c, c < r - already in order, grow pc */
3800                --pc_left;
3801                qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
3802             } else if (s == 0) {
3803                /* l == c, c == r - already in order, grow pc both ways */
3804                --pc_left;
3805                ++pc_right;
3806                qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
3807             } else {
3808                /* l == c, c > r - swap l & r, grow pc */
3809                qsort_swap(u_right, u_left);
3810                ++pc_right;
3811                qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
3812             }
3813          } else {
3814             /* l > c */
3815             s = qsort_cmp(pc_left, u_left);
3816             if (s < 0) {
3817                /* l > c, c < r - need to know more */
3818                s = qsort_cmp(u_right, u_left);
3819                if (s < 0) {
3820                   /* l > c, c < r, l < r - swap l & c to get ordered */
3821                   qsort_swap(u_right, pc_left);
3822                   qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
3823                } else if (s == 0) {
3824                   /* l > c, c < r, l == r - swap l & c, grow pc */
3825                   qsort_swap(u_right, pc_left);
3826                   ++pc_right;
3827                   qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
3828                } else {
3829                   /* l > c, c < r, l > r - rotate lcr into crl to order */
3830                   qsort_rotate(u_right, pc_left, u_left);
3831                   qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
3832                }
3833             } else if (s == 0) {
3834                /* l > c, c == r - swap ends, grow pc */
3835                qsort_swap(u_right, u_left);
3836                --pc_left;
3837                qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
3838             } else {
3839                /* l > c, c > r - swap ends to get in order */
3840                qsort_swap(u_right, u_left);
3841                qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
3842             }
3843          }
3844          /* We now know the 3 middle elements have been compared and
3845             arranged in the desired order, so we can shrink the uncompared
3846             sets on both sides
3847          */
3848          --u_right;
3849          ++u_left;
3850          qsort_all_asserts(pc_left, pc_right, u_left, u_right);
3851
3852          /* The above massive nested if was the simple part :-). We now have
3853             the middle 3 elements ordered and we need to scan through the
3854             uncompared sets on either side, swapping elements that are on
3855             the wrong side or simply shuffling equal elements around to get
3856             all equal elements into the pivot chunk.
3857          */
3858
3859          for ( ; ; ) {
3860             int still_work_on_left;
3861             int still_work_on_right;
3862
3863             /* Scan the uncompared values on the left. If I find a value
3864                equal to the pivot value, move it over so it is adjacent to
3865                the pivot chunk and expand the pivot chunk. If I find a value
3866                less than the pivot value, then just leave it - its already
3867                on the correct side of the partition. If I find a greater
3868                value, then stop the scan.
3869             */
3870             while (still_work_on_left = (u_right >= part_left)) {
3871                s = qsort_cmp(u_right, pc_left);
3872                if (s < 0) {
3873                   --u_right;
3874                } else if (s == 0) {
3875                   --pc_left;
3876                   if (pc_left != u_right) {
3877                      qsort_swap(u_right, pc_left);
3878                   }
3879                   --u_right;
3880                } else {
3881                   break;
3882                }
3883                qsort_assert(u_right < pc_left);
3884                qsort_assert(pc_left <= pc_right);
3885                qsort_assert(qsort_cmp(u_right + 1, pc_left) <= 0);
3886                qsort_assert(qsort_cmp(pc_left, pc_right) == 0);
3887             }
3888
3889             /* Do a mirror image scan of uncompared values on the right
3890             */
3891             while (still_work_on_right = (u_left <= part_right)) {
3892                s = qsort_cmp(pc_right, u_left);
3893                if (s < 0) {
3894                   ++u_left;
3895                } else if (s == 0) {
3896                   ++pc_right;
3897                   if (pc_right != u_left) {
3898                      qsort_swap(pc_right, u_left);
3899                   }
3900                   ++u_left;
3901                } else {
3902                   break;
3903                }
3904                qsort_assert(u_left > pc_right);
3905                qsort_assert(pc_left <= pc_right);
3906                qsort_assert(qsort_cmp(pc_right, u_left - 1) <= 0);
3907                qsort_assert(qsort_cmp(pc_left, pc_right) == 0);
3908             }
3909
3910             if (still_work_on_left) {
3911                /* I know I have a value on the left side which needs to be
3912                   on the right side, but I need to know more to decide
3913                   exactly the best thing to do with it.
3914                */
3915                if (still_work_on_right) {
3916                   /* I know I have values on both side which are out of
3917                      position. This is a big win because I kill two birds
3918                      with one swap (so to speak). I can advance the
3919                      uncompared pointers on both sides after swapping both
3920                      of them into the right place.
3921                   */
3922                   qsort_swap(u_right, u_left);
3923                   --u_right;
3924                   ++u_left;
3925                   qsort_all_asserts(pc_left, pc_right, u_left, u_right);
3926                } else {
3927                   /* I have an out of position value on the left, but the
3928                      right is fully scanned, so I "slide" the pivot chunk
3929                      and any less-than values left one to make room for the
3930                      greater value over on the right. If the out of position
3931                      value is immediately adjacent to the pivot chunk (there
3932                      are no less-than values), I can do that with a swap,
3933                      otherwise, I have to rotate one of the less than values
3934                      into the former position of the out of position value
3935                      and the right end of the pivot chunk into the left end
3936                      (got all that?).
3937                   */
3938                   --pc_left;
3939                   if (pc_left == u_right) {
3940                      qsort_swap(u_right, pc_right);
3941                      qsort_all_asserts(pc_left, pc_right-1, u_left, u_right-1);
3942                   } else {
3943                      qsort_rotate(u_right, pc_left, pc_right);
3944                      qsort_all_asserts(pc_left, pc_right-1, u_left, u_right-1);
3945                   }
3946                   --pc_right;
3947                   --u_right;
3948                }
3949             } else if (still_work_on_right) {
3950                /* Mirror image of complex case above: I have an out of
3951                   position value on the right, but the left is fully
3952                   scanned, so I need to shuffle things around to make room
3953                   for the right value on the left.
3954                */
3955                ++pc_right;
3956                if (pc_right == u_left) {
3957                   qsort_swap(u_left, pc_left);
3958                   qsort_all_asserts(pc_left+1, pc_right, u_left+1, u_right);
3959                } else {
3960                   qsort_rotate(pc_right, pc_left, u_left);
3961                   qsort_all_asserts(pc_left+1, pc_right, u_left+1, u_right);
3962                }
3963                ++pc_left;
3964                ++u_left;
3965             } else {
3966                /* No more scanning required on either side of partition,
3967                   break out of loop and figure out next set of partitions
3968                */
3969                break;
3970             }
3971          }
3972
3973          /* The elements in the pivot chunk are now in the right place. They
3974             will never move or be compared again. All I have to do is decide
3975             what to do with the stuff to the left and right of the pivot
3976             chunk.
3977
3978             Notes on the QSORT_ORDER_GUESS ifdef code:
3979
3980             1. If I just built these partitions without swapping any (or
3981                very many) elements, there is a chance that the elements are
3982                already ordered properly (being properly ordered will
3983                certainly result in no swapping, but the converse can't be
3984                proved :-).
3985
3986             2. A (properly written) insertion sort will run faster on
3987                already ordered data than qsort will.
3988
3989             3. Perhaps there is some way to make a good guess about
3990                switching to an insertion sort earlier than partition size 6
3991                (for instance - we could save the partition size on the stack
3992                and increase the size each time we find we didn't swap, thus
3993                switching to insertion sort earlier for partitions with a
3994                history of not swapping).
3995
3996             4. Naturally, if I just switch right away, it will make
3997                artificial benchmarks with pure ascending (or descending)
3998                data look really good, but is that a good reason in general?
3999                Hard to say...
4000          */
4001
4002 #ifdef QSORT_ORDER_GUESS
4003          if (swapped < 3) {
4004 #if QSORT_ORDER_GUESS == 1
4005             qsort_break_even = (part_right - part_left) + 1;
4006 #endif
4007 #if QSORT_ORDER_GUESS == 2
4008             qsort_break_even *= 2;
4009 #endif
4010 #if QSORT_ORDER_GUESS == 3
4011             int prev_break = qsort_break_even;
4012             qsort_break_even *= qsort_break_even;
4013             if (qsort_break_even < prev_break) {
4014                qsort_break_even = (part_right - part_left) + 1;
4015             }
4016 #endif
4017          } else {
4018             qsort_break_even = QSORT_BREAK_EVEN;
4019          }
4020 #endif
4021
4022          if (part_left < pc_left) {
4023             /* There are elements on the left which need more processing.
4024                Check the right as well before deciding what to do.
4025             */
4026             if (pc_right < part_right) {
4027                /* We have two partitions to be sorted. Stack the biggest one
4028                   and process the smallest one on the next iteration. This
4029                   minimizes the stack height by insuring that any additional
4030                   stack entries must come from the smallest partition which
4031                   (because it is smallest) will have the fewest
4032                   opportunities to generate additional stack entries.
4033                */
4034                if ((part_right - pc_right) > (pc_left - part_left)) {
4035                   /* stack the right partition, process the left */
4036                   partition_stack[next_stack_entry].left = pc_right + 1;
4037                   partition_stack[next_stack_entry].right = part_right;
4038 #ifdef QSORT_ORDER_GUESS
4039                   partition_stack[next_stack_entry].qsort_break_even = qsort_break_even;
4040 #endif
4041                   part_right = pc_left - 1;
4042                } else {
4043                   /* stack the left partition, process the right */
4044                   partition_stack[next_stack_entry].left = part_left;
4045                   partition_stack[next_stack_entry].right = pc_left - 1;
4046 #ifdef QSORT_ORDER_GUESS
4047                   partition_stack[next_stack_entry].qsort_break_even = qsort_break_even;
4048 #endif
4049                   part_left = pc_right + 1;
4050                }
4051                qsort_assert(next_stack_entry < QSORT_MAX_STACK);
4052                ++next_stack_entry;
4053             } else {
4054                /* The elements on the left are the only remaining elements
4055                   that need sorting, arrange for them to be processed as the
4056                   next partition.
4057                */
4058                part_right = pc_left - 1;
4059             }
4060          } else if (pc_right < part_right) {
4061             /* There is only one chunk on the right to be sorted, make it
4062                the new partition and loop back around.
4063             */
4064             part_left = pc_right + 1;
4065          } else {
4066             /* This whole partition wound up in the pivot chunk, so
4067                we need to get a new partition off the stack.
4068             */
4069             if (next_stack_entry == 0) {
4070                /* the stack is empty - we are done */
4071                break;
4072             }
4073             --next_stack_entry;
4074             part_left = partition_stack[next_stack_entry].left;
4075             part_right = partition_stack[next_stack_entry].right;
4076 #ifdef QSORT_ORDER_GUESS
4077             qsort_break_even = partition_stack[next_stack_entry].qsort_break_even;
4078 #endif
4079          }
4080       } else {
4081          /* This partition is too small to fool with qsort complexity, just
4082             do an ordinary insertion sort to minimize overhead.
4083          */
4084          int i;
4085          /* Assume 1st element is in right place already, and start checking
4086             at 2nd element to see where it should be inserted.
4087          */
4088          for (i = part_left + 1; i <= part_right; ++i) {
4089             int j;
4090             /* Scan (backwards - just in case 'i' is already in right place)
4091                through the elements already sorted to see if the ith element
4092                belongs ahead of one of them.
4093             */
4094             for (j = i - 1; j >= part_left; --j) {
4095                if (qsort_cmp(i, j) >= 0) {
4096                   /* i belongs right after j
4097                   */
4098                   break;
4099                }
4100             }
4101             ++j;
4102             if (j != i) {
4103                /* Looks like we really need to move some things
4104                */
4105                int k;
4106                temp = array[i];
4107                for (k = i - 1; k >= j; --k)
4108                   array[k + 1] = array[k];
4109                array[j] = temp;
4110             }
4111          }
4112
4113          /* That partition is now sorted, grab the next one, or get out
4114             of the loop if there aren't any more.
4115          */
4116
4117          if (next_stack_entry == 0) {
4118             /* the stack is empty - we are done */
4119             break;
4120          }
4121          --next_stack_entry;
4122          part_left = partition_stack[next_stack_entry].left;
4123          part_right = partition_stack[next_stack_entry].right;
4124 #ifdef QSORT_ORDER_GUESS
4125          qsort_break_even = partition_stack[next_stack_entry].qsort_break_even;
4126 #endif
4127       }
4128    }
4129
4130    /* Believe it or not, the array is sorted at this point! */
4131 }
4132
4133
4134 #ifdef PERL_OBJECT
4135 #define NO_XSLOCKS
4136 #undef this
4137 #define this pPerl
4138 #include "XSUB.h"
4139 #endif
4140
4141
4142 static I32
4143 sortcv(pTHXo_ SV *a, SV *b)
4144 {
4145     dTHR;
4146     I32 oldsaveix = PL_savestack_ix;
4147     I32 oldscopeix = PL_scopestack_ix;
4148     I32 result;
4149     GvSV(PL_firstgv) = a;
4150     GvSV(PL_secondgv) = b;
4151     PL_stack_sp = PL_stack_base;
4152     PL_op = PL_sortcop;
4153     CALLRUNOPS(aTHX);
4154     if (PL_stack_sp != PL_stack_base + 1)
4155         Perl_croak(aTHX_ "Sort subroutine didn't return single value");
4156     if (!SvNIOKp(*PL_stack_sp))
4157         Perl_croak(aTHX_ "Sort subroutine didn't return a numeric value");
4158     result = SvIV(*PL_stack_sp);
4159     while (PL_scopestack_ix > oldscopeix) {
4160         LEAVE;
4161     }
4162     leave_scope(oldsaveix);
4163     return result;
4164 }
4165
4166
4167 static I32
4168 sv_ncmp(pTHXo_ SV *a, SV *b)
4169 {
4170     NV nv1 = SvNV(a);
4171     NV nv2 = SvNV(b);
4172     return nv1 < nv2 ? -1 : nv1 > nv2 ? 1 : 0;
4173 }
4174
4175 static I32
4176 sv_i_ncmp(pTHXo_ SV *a, SV *b)
4177 {
4178     IV iv1 = SvIV(a);
4179     IV iv2 = SvIV(b);
4180     return iv1 < iv2 ? -1 : iv1 > iv2 ? 1 : 0;
4181 }
4182 #define tryCALL_AMAGICbin(left,right,meth,svp) STMT_START { \
4183           *svp = Nullsv;                                \
4184           if (PL_amagic_generation) { \
4185             if (SvAMAGIC(left)||SvAMAGIC(right))\
4186                 *svp = amagic_call(left, \
4187                                    right, \
4188                                    CAT2(meth,_amg), \
4189                                    0); \
4190           } \
4191         } STMT_END
4192
4193 static I32
4194 amagic_ncmp(pTHXo_ register SV *a, register SV *b)
4195 {
4196     SV *tmpsv;
4197     tryCALL_AMAGICbin(a,b,ncmp,&tmpsv);
4198     if (tmpsv) {
4199         NV d;
4200         
4201         if (SvIOK(tmpsv)) {
4202             I32 i = SvIVX(tmpsv);
4203             if (i > 0)
4204                return 1;
4205             return i? -1 : 0;
4206         }
4207         d = SvNV(tmpsv);
4208         if (d > 0)
4209            return 1;
4210         return d? -1 : 0;
4211      }
4212      return sv_ncmp(aTHXo_ a, b);
4213 }
4214
4215 static I32
4216 amagic_i_ncmp(pTHXo_ register SV *a, register SV *b)
4217 {
4218     SV *tmpsv;
4219     tryCALL_AMAGICbin(a,b,ncmp,&tmpsv);
4220     if (tmpsv) {
4221         NV d;
4222         
4223         if (SvIOK(tmpsv)) {
4224             I32 i = SvIVX(tmpsv);
4225             if (i > 0)
4226                return 1;
4227             return i? -1 : 0;
4228         }
4229         d = SvNV(tmpsv);
4230         if (d > 0)
4231            return 1;
4232         return d? -1 : 0;
4233     }
4234     return sv_i_ncmp(aTHXo_ a, b);
4235 }
4236
4237 static I32
4238 amagic_cmp(pTHXo_ register SV *str1, register SV *str2)
4239 {
4240     SV *tmpsv;
4241     tryCALL_AMAGICbin(str1,str2,scmp,&tmpsv);
4242     if (tmpsv) {
4243         NV d;
4244         
4245         if (SvIOK(tmpsv)) {
4246             I32 i = SvIVX(tmpsv);
4247             if (i > 0)
4248                return 1;
4249             return i? -1 : 0;
4250         }
4251         d = SvNV(tmpsv);
4252         if (d > 0)
4253            return 1;
4254         return d? -1 : 0;
4255     }
4256     return sv_cmp(str1, str2);
4257 }
4258
4259 static I32
4260 amagic_cmp_locale(pTHXo_ register SV *str1, register SV *str2)
4261 {
4262     SV *tmpsv;
4263     tryCALL_AMAGICbin(str1,str2,scmp,&tmpsv);
4264     if (tmpsv) {
4265         NV d;
4266         
4267         if (SvIOK(tmpsv)) {
4268             I32 i = SvIVX(tmpsv);
4269             if (i > 0)
4270                return 1;
4271             return i? -1 : 0;
4272         }
4273         d = SvNV(tmpsv);
4274         if (d > 0)
4275            return 1;
4276         return d? -1 : 0;
4277     }
4278     return sv_cmp_locale(str1, str2);
4279 }
4280
4281 static I32
4282 run_user_filter(pTHXo_ int idx, SV *buf_sv, int maxlen)
4283 {
4284     SV *datasv = FILTER_DATA(idx);
4285     int filter_has_file = IoLINES(datasv);
4286     GV *filter_child_proc = (GV *)IoFMT_GV(datasv);
4287     SV *filter_state = (SV *)IoTOP_GV(datasv);
4288     SV *filter_sub = (SV *)IoBOTTOM_GV(datasv);
4289     int len = 0;
4290
4291     /* I was having segfault trouble under Linux 2.2.5 after a
4292        parse error occured.  (Had to hack around it with a test
4293        for PL_error_count == 0.)  Solaris doesn't segfault --
4294        not sure where the trouble is yet.  XXX */
4295
4296     if (filter_has_file) {
4297         len = FILTER_READ(idx+1, buf_sv, maxlen);
4298     }
4299
4300     if (filter_sub && len >= 0) {
4301         djSP;
4302         int count;
4303
4304         ENTER;
4305         SAVE_DEFSV;
4306         SAVETMPS;
4307         EXTEND(SP, 2);
4308
4309         DEFSV = buf_sv;
4310         PUSHMARK(SP);
4311         PUSHs(sv_2mortal(newSViv(maxlen)));
4312         if (filter_state) {
4313             PUSHs(filter_state);
4314         }
4315         PUTBACK;
4316         count = call_sv(filter_sub, G_SCALAR);
4317         SPAGAIN;
4318
4319         if (count > 0) {
4320             SV *out = POPs;
4321             if (SvOK(out)) {
4322                 len = SvIV(out);
4323             }
4324         }
4325
4326         PUTBACK;
4327         FREETMPS;
4328         LEAVE;
4329     }
4330
4331     if (len <= 0) {
4332         IoLINES(datasv) = 0;
4333         if (filter_child_proc) {
4334             SvREFCNT_dec(filter_child_proc);
4335             IoFMT_GV(datasv) = Nullgv;
4336         }
4337         if (filter_state) {
4338             SvREFCNT_dec(filter_state);
4339             IoTOP_GV(datasv) = Nullgv;
4340         }
4341         if (filter_sub) {
4342             SvREFCNT_dec(filter_sub);
4343             IoBOTTOM_GV(datasv) = Nullgv;
4344         }
4345         filter_del(run_user_filter);
4346     }
4347
4348     return len;
4349 }
4350
4351 #ifdef PERL_OBJECT
4352
4353 static I32
4354 sv_cmp_locale_static(pTHXo_ register SV *str1, register SV *str2)
4355 {
4356     return sv_cmp_locale(str1, str2);
4357 }
4358
4359 static I32
4360 sv_cmp_static(pTHXo_ register SV *str1, register SV *str2)
4361 {
4362     return sv_cmp(str1, str2);
4363 }
4364
4365 #endif /* PERL_OBJECT */