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