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