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