3 * Copyright (c) 1991-2001, Larry Wall
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.
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.
20 #define PERL_IN_PP_CTL_C
24 #define WORD_ALIGN sizeof(U16)
27 #define DOCATCH(o) ((CATCH_GET == TRUE) ? docatch(o) : (o))
29 static I32 sortcv(pTHXo_ SV *a, SV *b);
30 static I32 sortcv_stacked(pTHXo_ SV *a, SV *b);
31 static I32 sortcv_xsub(pTHXo_ SV *a, SV *b);
32 static I32 sv_ncmp(pTHXo_ SV *a, SV *b);
33 static I32 sv_i_ncmp(pTHXo_ SV *a, SV *b);
34 static I32 amagic_ncmp(pTHXo_ SV *a, SV *b);
35 static I32 amagic_i_ncmp(pTHXo_ SV *a, SV *b);
36 static I32 amagic_cmp(pTHXo_ SV *a, SV *b);
37 static I32 amagic_cmp_locale(pTHXo_ SV *a, SV *b);
38 static I32 run_user_filter(pTHXo_ int idx, SV *buf_sv, int maxlen);
41 static I32 sv_cmp_static(pTHXo_ SV *a, SV *b);
42 static I32 sv_cmp_locale_static(pTHXo_ SV *a, SV *b);
44 #define sv_cmp_static Perl_sv_cmp
45 #define sv_cmp_locale_static Perl_sv_cmp_locale
54 cxix = dopoptosub(cxstack_ix);
58 switch (cxstack[cxix].blk_gimme) {
75 /* XXXX Should store the old value to allow for tie/overload - and
76 restore in regcomp, where marked with XXXX. */
84 register PMOP *pm = (PMOP*)cLOGOP->op_other;
88 MAGIC *mg = Null(MAGIC*);
90 Change 10771 by jhi@alpha on 2001/06/21 12:10:29
92 Subject: [PATCH] Make /o work under i?threads
93 From: Richard Soderberg <rs@crystalflame.net>
94 Date: Thu, 21 Jun 2001 05:21:43 -0700 (PDT)
95 Message-ID: <Pine.LNX.4.21.0106210518210.2479-100000@oregonnet.com>
99 ... //depot/perl/pp_ctl.c#267 edit
103 ==== //depot/perl/pp_ctl.c#267 (text) ====
105 --- perl/pp_ctl.c.~1~ Sun Jun 24 22:31:38 2001
106 +++ perl/pp_ctl.c Sun Jun 24 22:31:38 2001
108 MAGIC *mg = Null(MAGIC*);
112 /* prevent recompiling under /o and ithreads. */
113 #if defined(USE_ITHREADS) || defined(USE_THREADS)
114 if (pm->op_pmflags & PMf_KEEP && PM_GETRE(pm))
120 SV *sv = SvRV(tmpstr);
122 mg = mg_find(sv, PERL_MAGIC_qr);
125 regexp *re = (regexp *)mg->mg_obj;
126 ReREFCNT_dec(PM_GETRE(pm));
127 PM_SETRE(pm, ReREFCNT_inc(re));
130 t = SvPV(tmpstr, len);
132 /* Check against the last compiled regexp. */
133 if (!PM_GETRE(pm) || !PM_GETRE(pm)->precomp ||
134 PM_GETRE(pm)->prelen != len ||
135 memNE(PM_GETRE(pm)->precomp, t, len))
138 ReREFCNT_dec(PM_GETRE(pm));
139 PM_SETRE(pm, Null(REGEXP*)); /* crucial if regcomp aborts */
141 if (PL_op->op_flags & OPf_SPECIAL)
142 PL_reginterp_cnt = I32_MAX; /* Mark as safe. */
144 pm->op_pmflags = pm->op_pmpermflags; /* reset case sensitivity */
146 pm->op_pmdynflags |= PMdf_DYN_UTF8;
148 pm->op_pmdynflags &= ~PMdf_DYN_UTF8;
149 if (pm->op_pmdynflags & PMdf_UTF8)
150 t = (char*)bytes_to_utf8((U8*)t, &len);
152 PM_SETRE(pm, CALLREGCOMP(aTHX_ t, t + len, pm));
153 if (!DO_UTF8(tmpstr) && (pm->op_pmdynflags & PMdf_UTF8))
155 PL_reginterp_cnt = 0; /* XXXX Be extra paranoid - needed
156 inside tie/overload accessors. */
160 #ifndef INCOMPLETE_TAINTS
163 pm->op_pmdynflags |= PMdf_TAINTED;
165 pm->op_pmdynflags &= ~PMdf_TAINTED;
169 if (!PM_GETRE(pm)->prelen && PL_curpm)
171 else if (strEQ("\\s+", PM_GETRE(pm)->precomp))
172 pm->op_pmflags |= PMf_WHITE;
174 /* XXX runtime compiled output needs to move to the pad */
175 if (pm->op_pmflags & PMf_KEEP) {
176 pm->op_private &= ~OPpRUNTIME; /* no point compiling again */
177 #if !defined(USE_ITHREADS) && !defined(USE_THREADS)
178 /* XXX can't change the optree at runtime either */
179 cLOGOP->op_first->op_next = PL_op->op_next;
188 register PMOP *pm = (PMOP*) cLOGOP->op_other;
189 register PERL_CONTEXT *cx = &cxstack[cxstack_ix];
190 register SV *dstr = cx->sb_dstr;
191 register char *s = cx->sb_s;
192 register char *m = cx->sb_m;
193 char *orig = cx->sb_orig;
194 register REGEXP *rx = cx->sb_rx;
196 rxres_restore(&cx->sb_rxres, rx);
198 if (cx->sb_iters++) {
199 if (cx->sb_iters > cx->sb_maxiters)
200 DIE(aTHX_ "Substitution loop");
202 if (!(cx->sb_rxtainted & 2) && SvTAINTED(TOPs))
203 cx->sb_rxtainted |= 2;
204 sv_catsv(dstr, POPs);
207 if (cx->sb_once || !CALLREGEXEC(aTHX_ rx, s, cx->sb_strend, orig,
208 s == m, cx->sb_targ, NULL,
209 ((cx->sb_rflags & REXEC_COPY_STR)
210 ? (REXEC_IGNOREPOS|REXEC_NOT_FIRST)
211 : (REXEC_COPY_STR|REXEC_IGNOREPOS|REXEC_NOT_FIRST))))
213 SV *targ = cx->sb_targ;
215 sv_catpvn(dstr, s, cx->sb_strend - s);
216 cx->sb_rxtainted |= RX_MATCH_TAINTED(rx);
218 (void)SvOOK_off(targ);
219 Safefree(SvPVX(targ));
220 SvPVX(targ) = SvPVX(dstr);
221 SvCUR_set(targ, SvCUR(dstr));
222 SvLEN_set(targ, SvLEN(dstr));
228 TAINT_IF(cx->sb_rxtainted & 1);
229 PUSHs(sv_2mortal(newSViv((I32)cx->sb_iters - 1)));
231 (void)SvPOK_only_UTF8(targ);
232 TAINT_IF(cx->sb_rxtainted);
236 LEAVE_SCOPE(cx->sb_oldsave);
238 RETURNOP(pm->op_next);
241 if (RX_MATCH_COPIED(rx) && rx->subbeg != orig) {
244 cx->sb_orig = orig = rx->subbeg;
246 cx->sb_strend = s + (cx->sb_strend - m);
248 cx->sb_m = m = rx->startp[0] + orig;
250 sv_catpvn(dstr, s, m-s);
251 cx->sb_s = rx->endp[0] + orig;
252 { /* Update the pos() information. */
253 SV *sv = cx->sb_targ;
256 if (SvTYPE(sv) < SVt_PVMG)
257 (void)SvUPGRADE(sv, SVt_PVMG);
258 if (!(mg = mg_find(sv, PERL_MAGIC_regex_global))) {
259 sv_magic(sv, Nullsv, PERL_MAGIC_regex_global, Nullch, 0);
260 mg = mg_find(sv, PERL_MAGIC_regex_global);
267 cx->sb_rxtainted |= RX_MATCH_TAINTED(rx);
268 rxres_save(&cx->sb_rxres, rx);
269 RETURNOP(pm->op_pmreplstart);
273 Perl_rxres_save(pTHX_ void **rsp, REGEXP *rx)
278 if (!p || p[1] < rx->nparens) {
279 i = 6 + rx->nparens * 2;
287 *p++ = PTR2UV(RX_MATCH_COPIED(rx) ? rx->subbeg : Nullch);
288 RX_MATCH_COPIED_off(rx);
292 *p++ = PTR2UV(rx->subbeg);
293 *p++ = (UV)rx->sublen;
294 for (i = 0; i <= rx->nparens; ++i) {
295 *p++ = (UV)rx->startp[i];
296 *p++ = (UV)rx->endp[i];
301 Perl_rxres_restore(pTHX_ void **rsp, REGEXP *rx)
306 if (RX_MATCH_COPIED(rx))
307 Safefree(rx->subbeg);
308 RX_MATCH_COPIED_set(rx, *p);
313 rx->subbeg = INT2PTR(char*,*p++);
314 rx->sublen = (I32)(*p++);
315 for (i = 0; i <= rx->nparens; ++i) {
316 rx->startp[i] = (I32)(*p++);
317 rx->endp[i] = (I32)(*p++);
322 Perl_rxres_free(pTHX_ void **rsp)
327 Safefree(INT2PTR(char*,*p));
335 dSP; dMARK; dORIGMARK;
336 register SV *tmpForm = *++MARK;
343 register SV *sv = Nullsv;
348 bool chopspace = (strchr(PL_chopset, ' ') != Nullch);
349 char *chophere = Nullch;
350 char *linemark = Nullch;
352 bool gotsome = FALSE;
354 STRLEN fudge = SvCUR(tmpForm) * (IN_BYTES ? 1 : 3) + 1;
355 bool item_is_utf = FALSE;
357 if (!SvMAGICAL(tmpForm) || !SvCOMPILED(tmpForm)) {
358 if (SvREADONLY(tmpForm)) {
359 SvREADONLY_off(tmpForm);
360 doparseform(tmpForm);
361 SvREADONLY_on(tmpForm);
364 doparseform(tmpForm);
367 SvPV_force(PL_formtarget, len);
368 t = SvGROW(PL_formtarget, len + fudge + 1); /* XXX SvCUR bad */
370 f = SvPV(tmpForm, len);
371 /* need to jump to the next word */
372 s = f + len + WORD_ALIGN - SvCUR(tmpForm) % WORD_ALIGN;
381 case FF_LITERAL: arg = fpc[1]; name = "LITERAL"; break;
382 case FF_BLANK: arg = fpc[1]; name = "BLANK"; break;
383 case FF_SKIP: arg = fpc[1]; name = "SKIP"; break;
384 case FF_FETCH: arg = fpc[1]; name = "FETCH"; break;
385 case FF_DECIMAL: arg = fpc[1]; name = "DECIMAL"; break;
387 case FF_CHECKNL: name = "CHECKNL"; break;
388 case FF_CHECKCHOP: name = "CHECKCHOP"; break;
389 case FF_SPACE: name = "SPACE"; break;
390 case FF_HALFSPACE: name = "HALFSPACE"; break;
391 case FF_ITEM: name = "ITEM"; break;
392 case FF_CHOP: name = "CHOP"; break;
393 case FF_LINEGLOB: name = "LINEGLOB"; break;
394 case FF_NEWLINE: name = "NEWLINE"; break;
395 case FF_MORE: name = "MORE"; break;
396 case FF_LINEMARK: name = "LINEMARK"; break;
397 case FF_END: name = "END"; break;
398 case FF_0DECIMAL: name = "0DECIMAL"; break;
401 PerlIO_printf(Perl_debug_log, "%-16s%ld\n", name, (long) arg);
403 PerlIO_printf(Perl_debug_log, "%-16s\n", name);
431 if (ckWARN(WARN_SYNTAX))
432 Perl_warner(aTHX_ WARN_SYNTAX, "Not enough format arguments");
437 item = s = SvPV(sv, len);
440 itemsize = sv_len_utf8(sv);
441 if (itemsize != len) {
443 if (itemsize > fieldsize) {
444 itemsize = fieldsize;
445 itembytes = itemsize;
446 sv_pos_u2b(sv, &itembytes, 0);
450 send = chophere = s + itembytes;
460 sv_pos_b2u(sv, &itemsize);
465 if (itemsize > fieldsize)
466 itemsize = fieldsize;
467 send = chophere = s + itemsize;
479 item = s = SvPV(sv, len);
482 itemsize = sv_len_utf8(sv);
483 if (itemsize != len) {
485 if (itemsize <= fieldsize) {
486 send = chophere = s + itemsize;
497 itemsize = fieldsize;
498 itembytes = itemsize;
499 sv_pos_u2b(sv, &itembytes, 0);
500 send = chophere = s + itembytes;
501 while (s < send || (s == send && isSPACE(*s))) {
511 if (strchr(PL_chopset, *s))
516 itemsize = chophere - item;
517 sv_pos_b2u(sv, &itemsize);
524 if (itemsize <= fieldsize) {
525 send = chophere = s + itemsize;
536 itemsize = fieldsize;
537 send = chophere = s + itemsize;
538 while (s < send || (s == send && isSPACE(*s))) {
548 if (strchr(PL_chopset, *s))
553 itemsize = chophere - item;
558 arg = fieldsize - itemsize;
567 arg = fieldsize - itemsize;
581 if (UTF8_IS_CONTINUED(*s)) {
582 STRLEN skip = UTF8SKIP(s);
599 if ( !((*t++ = *s++) & ~31) )
607 int ch = *t++ = *s++;
610 if ( !((*t++ = *s++) & ~31) )
619 while (*s && isSPACE(*s))
626 item = s = SvPV(sv, len);
628 item_is_utf = FALSE; /* XXX is this correct? */
640 SvCUR_set(PL_formtarget, t - SvPVX(PL_formtarget));
641 sv_catpvn(PL_formtarget, item, itemsize);
642 SvGROW(PL_formtarget, SvCUR(PL_formtarget) + fudge + 1);
643 t = SvPVX(PL_formtarget) + SvCUR(PL_formtarget);
648 /* If the field is marked with ^ and the value is undefined,
651 if ((arg & 512) && !SvOK(sv)) {
659 /* Formats aren't yet marked for locales, so assume "yes". */
661 STORE_NUMERIC_STANDARD_SET_LOCAL();
662 #if defined(USE_LONG_DOUBLE)
664 sprintf(t, "%#*.*" PERL_PRIfldbl,
665 (int) fieldsize, (int) arg & 255, value);
667 sprintf(t, "%*.0" PERL_PRIfldbl, (int) fieldsize, value);
672 (int) fieldsize, (int) arg & 255, value);
675 (int) fieldsize, value);
678 RESTORE_NUMERIC_STANDARD();
684 /* If the field is marked with ^ and the value is undefined,
687 if ((arg & 512) && !SvOK(sv)) {
695 /* Formats aren't yet marked for locales, so assume "yes". */
697 STORE_NUMERIC_STANDARD_SET_LOCAL();
698 #if defined(USE_LONG_DOUBLE)
700 sprintf(t, "%#0*.*" PERL_PRIfldbl,
701 (int) fieldsize, (int) arg & 255, value);
702 /* is this legal? I don't have long doubles */
704 sprintf(t, "%0*.0" PERL_PRIfldbl, (int) fieldsize, value);
708 sprintf(t, "%#0*.*f",
709 (int) fieldsize, (int) arg & 255, value);
712 (int) fieldsize, value);
715 RESTORE_NUMERIC_STANDARD();
722 while (t-- > linemark && *t == ' ') ;
730 if (arg) { /* repeat until fields exhausted? */
732 SvCUR_set(PL_formtarget, t - SvPVX(PL_formtarget));
733 lines += FmLINES(PL_formtarget);
736 if (strnEQ(linemark, linemark - arg, arg))
737 DIE(aTHX_ "Runaway format");
739 FmLINES(PL_formtarget) = lines;
741 RETURNOP(cLISTOP->op_first);
754 while (*s && isSPACE(*s) && s < send)
758 arg = fieldsize - itemsize;
765 if (strnEQ(s," ",3)) {
766 while (s > SvPVX(PL_formtarget) && isSPACE(s[-1]))
777 SvCUR_set(PL_formtarget, t - SvPVX(PL_formtarget));
778 FmLINES(PL_formtarget) += lines;
790 if (PL_stack_base + *PL_markstack_ptr == SP) {
792 if (GIMME_V == G_SCALAR)
793 XPUSHs(sv_2mortal(newSViv(0)));
794 RETURNOP(PL_op->op_next->op_next);
796 PL_stack_sp = PL_stack_base + *PL_markstack_ptr + 1;
797 pp_pushmark(); /* push dst */
798 pp_pushmark(); /* push src */
799 ENTER; /* enter outer scope */
802 /* SAVE_DEFSV does *not* suffice here for USE_THREADS */
804 ENTER; /* enter inner scope */
807 src = PL_stack_base[*PL_markstack_ptr];
812 if (PL_op->op_type == OP_MAPSTART)
813 pp_pushmark(); /* push top */
814 return ((LOGOP*)PL_op->op_next)->op_other;
819 DIE(aTHX_ "panic: mapstart"); /* uses grepstart */
825 I32 items = (SP - PL_stack_base) - *PL_markstack_ptr; /* how many new items */
831 /* first, move source pointer to the next item in the source list */
832 ++PL_markstack_ptr[-1];
834 /* if there are new items, push them into the destination list */
836 /* might need to make room back there first */
837 if (items > PL_markstack_ptr[-1] - PL_markstack_ptr[-2]) {
838 /* XXX this implementation is very pessimal because the stack
839 * is repeatedly extended for every set of items. Is possible
840 * to do this without any stack extension or copying at all
841 * by maintaining a separate list over which the map iterates
842 * (like foreach does). --gsar */
844 /* everything in the stack after the destination list moves
845 * towards the end the stack by the amount of room needed */
846 shift = items - (PL_markstack_ptr[-1] - PL_markstack_ptr[-2]);
848 /* items to shift up (accounting for the moved source pointer) */
849 count = (SP - PL_stack_base) - (PL_markstack_ptr[-1] - 1);
851 /* This optimization is by Ben Tilly and it does
852 * things differently from what Sarathy (gsar)
853 * is describing. The downside of this optimization is
854 * that leaves "holes" (uninitialized and hopefully unused areas)
855 * to the Perl stack, but on the other hand this
856 * shouldn't be a problem. If Sarathy's idea gets
857 * implemented, this optimization should become
858 * irrelevant. --jhi */
860 shift = count; /* Avoid shifting too often --Ben Tilly */
865 PL_markstack_ptr[-1] += shift;
866 *PL_markstack_ptr += shift;
870 /* copy the new items down to the destination list */
871 dst = PL_stack_base + (PL_markstack_ptr[-2] += items) - 1;
873 *dst-- = SvTEMP(TOPs) ? POPs : sv_mortalcopy(POPs);
875 LEAVE; /* exit inner scope */
878 if (PL_markstack_ptr[-1] > *PL_markstack_ptr) {
881 (void)POPMARK; /* pop top */
882 LEAVE; /* exit outer scope */
883 (void)POPMARK; /* pop src */
884 items = --*PL_markstack_ptr - PL_markstack_ptr[-1];
885 (void)POPMARK; /* pop dst */
886 SP = PL_stack_base + POPMARK; /* pop original mark */
887 if (gimme == G_SCALAR) {
891 else if (gimme == G_ARRAY)
898 ENTER; /* enter inner scope */
901 /* set $_ to the new source item */
902 src = PL_stack_base[PL_markstack_ptr[-1]];
906 RETURNOP(cLOGOP->op_other);
912 dSP; dMARK; dORIGMARK;
914 SV **myorigmark = ORIGMARK;
920 OP* nextop = PL_op->op_next;
922 bool hasargs = FALSE;
925 if (gimme != G_ARRAY) {
931 SAVEVPTR(PL_sortcop);
932 if (PL_op->op_flags & OPf_STACKED) {
933 if (PL_op->op_flags & OPf_SPECIAL) {
934 OP *kid = cLISTOP->op_first->op_sibling; /* pass pushmark */
935 kid = kUNOP->op_first; /* pass rv2gv */
936 kid = kUNOP->op_first; /* pass leave */
937 PL_sortcop = kid->op_next;
938 stash = CopSTASH(PL_curcop);
941 cv = sv_2cv(*++MARK, &stash, &gv, 0);
942 if (cv && SvPOK(cv)) {
944 char *proto = SvPV((SV*)cv, n_a);
945 if (proto && strEQ(proto, "$$")) {
949 if (!(cv && CvROOT(cv))) {
950 if (cv && CvXSUB(cv)) {
954 SV *tmpstr = sv_newmortal();
955 gv_efullname3(tmpstr, gv, Nullch);
956 DIE(aTHX_ "Undefined sort subroutine \"%s\" called",
960 DIE(aTHX_ "Undefined subroutine in sort");
965 PL_sortcop = (OP*)cv;
967 PL_sortcop = CvSTART(cv);
968 SAVEVPTR(CvROOT(cv)->op_ppaddr);
969 CvROOT(cv)->op_ppaddr = PL_ppaddr[OP_NULL];
972 PL_curpad = AvARRAY((AV*)AvARRAY(CvPADLIST(cv))[1]);
978 stash = CopSTASH(PL_curcop);
982 while (MARK < SP) { /* This may or may not shift down one here. */
984 if ((*up = *++MARK)) { /* Weed out nulls. */
986 if (!PL_sortcop && !SvPOK(*up)) {
991 (void)sv_2pv(*up, &n_a);
996 max = --up - myorigmark;
1001 bool oldcatch = CATCH_GET;
1007 PUSHSTACKi(PERLSI_SORT);
1008 if (!hasargs && !is_xsub) {
1009 if (PL_sortstash != stash || !PL_firstgv || !PL_secondgv) {
1010 SAVESPTR(PL_firstgv);
1011 SAVESPTR(PL_secondgv);
1012 PL_firstgv = gv_fetchpv("a", TRUE, SVt_PV);
1013 PL_secondgv = gv_fetchpv("b", TRUE, SVt_PV);
1014 PL_sortstash = stash;
1017 sv_lock((SV *)PL_firstgv);
1018 sv_lock((SV *)PL_secondgv);
1020 SAVESPTR(GvSV(PL_firstgv));
1021 SAVESPTR(GvSV(PL_secondgv));
1024 PUSHBLOCK(cx, CXt_NULL, PL_stack_base);
1025 if (!(PL_op->op_flags & OPf_SPECIAL)) {
1026 cx->cx_type = CXt_SUB;
1027 cx->blk_gimme = G_SCALAR;
1030 (void)SvREFCNT_inc(cv); /* in preparation for POPSUB */
1032 PL_sortcxix = cxstack_ix;
1034 if (hasargs && !is_xsub) {
1035 /* This is mostly copied from pp_entersub */
1036 AV *av = (AV*)PL_curpad[0];
1039 cx->blk_sub.savearray = GvAV(PL_defgv);
1040 GvAV(PL_defgv) = (AV*)SvREFCNT_inc(av);
1041 #endif /* USE_THREADS */
1042 cx->blk_sub.oldcurpad = PL_curpad;
1043 cx->blk_sub.argarray = av;
1045 qsortsv((myorigmark+1), max,
1046 is_xsub ? sortcv_xsub : hasargs ? sortcv_stacked : sortcv);
1048 POPBLOCK(cx,PL_curpm);
1049 PL_stack_sp = newsp;
1051 CATCH_SET(oldcatch);
1056 MEXTEND(SP, 20); /* Can't afford stack realloc on signal. */
1057 qsortsv(ORIGMARK+1, max,
1058 (PL_op->op_private & OPpSORT_NUMERIC)
1059 ? ( (PL_op->op_private & OPpSORT_INTEGER)
1060 ? ( overloading ? amagic_i_ncmp : sv_i_ncmp)
1061 : ( overloading ? amagic_ncmp : sv_ncmp))
1062 : ( IN_LOCALE_RUNTIME
1065 : sv_cmp_locale_static)
1066 : ( overloading ? amagic_cmp : sv_cmp_static)));
1067 if (PL_op->op_private & OPpSORT_REVERSE) {
1068 SV **p = ORIGMARK+1;
1069 SV **q = ORIGMARK+max;
1079 PL_stack_sp = ORIGMARK + max;
1087 if (GIMME == G_ARRAY)
1089 if (SvTRUEx(PAD_SV(PL_op->op_targ)))
1090 return cLOGOP->op_other;
1099 if (GIMME == G_ARRAY) {
1100 RETURNOP(((LOGOP*)cUNOP->op_first)->op_other);
1104 SV *targ = PAD_SV(PL_op->op_targ);
1107 if (PL_op->op_private & OPpFLIP_LINENUM) {
1109 flip = PL_last_in_gv
1110 && (gp_io = GvIO(PL_last_in_gv))
1111 && SvIV(sv) == (IV)IoLINES(gp_io);
1116 sv_setiv(PAD_SV(cUNOP->op_first->op_targ), 1);
1117 if (PL_op->op_flags & OPf_SPECIAL) {
1125 RETURNOP(((LOGOP*)cUNOP->op_first)->op_other);
1138 if (GIMME == G_ARRAY) {
1144 if (SvGMAGICAL(left))
1146 if (SvGMAGICAL(right))
1149 if (SvNIOKp(left) || !SvPOKp(left) ||
1150 SvNIOKp(right) || !SvPOKp(right) ||
1151 (looks_like_number(left) && *SvPVX(left) != '0' &&
1152 looks_like_number(right) && *SvPVX(right) != '0'))
1154 if (SvNV(left) < IV_MIN || SvNV(right) > IV_MAX)
1155 DIE(aTHX_ "Range iterator outside integer range");
1166 sv = sv_2mortal(newSViv(i++));
1171 SV *final = sv_mortalcopy(right);
1173 char *tmps = SvPV(final, len);
1175 sv = sv_mortalcopy(left);
1177 while (!SvNIOKp(sv) && SvCUR(sv) <= len) {
1179 if (strEQ(SvPVX(sv),tmps))
1181 sv = sv_2mortal(newSVsv(sv));
1188 SV *targ = PAD_SV(cUNOP->op_first->op_targ);
1190 if ((PL_op->op_private & OPpFLIP_LINENUM)
1191 ? (GvIO(PL_last_in_gv)
1192 && SvIV(sv) == (IV)IoLINES(GvIOp(PL_last_in_gv)))
1194 sv_setiv(PAD_SV(((UNOP*)cUNOP->op_first)->op_first->op_targ), 0);
1195 sv_catpv(targ, "E0");
1206 S_dopoptolabel(pTHX_ char *label)
1209 register PERL_CONTEXT *cx;
1211 for (i = cxstack_ix; i >= 0; i--) {
1213 switch (CxTYPE(cx)) {
1215 if (ckWARN(WARN_EXITING))
1216 Perl_warner(aTHX_ WARN_EXITING, "Exiting substitution via %s",
1217 PL_op_name[PL_op->op_type]);
1220 if (ckWARN(WARN_EXITING))
1221 Perl_warner(aTHX_ WARN_EXITING, "Exiting subroutine via %s",
1222 PL_op_name[PL_op->op_type]);
1225 if (ckWARN(WARN_EXITING))
1226 Perl_warner(aTHX_ WARN_EXITING, "Exiting format via %s",
1227 PL_op_name[PL_op->op_type]);
1230 if (ckWARN(WARN_EXITING))
1231 Perl_warner(aTHX_ WARN_EXITING, "Exiting eval via %s",
1232 PL_op_name[PL_op->op_type]);
1235 if (ckWARN(WARN_EXITING))
1236 Perl_warner(aTHX_ WARN_EXITING, "Exiting pseudo-block via %s",
1237 PL_op_name[PL_op->op_type]);
1240 if (!cx->blk_loop.label ||
1241 strNE(label, cx->blk_loop.label) ) {
1242 DEBUG_l(Perl_deb(aTHX_ "(Skipping label #%ld %s)\n",
1243 (long)i, cx->blk_loop.label));
1246 DEBUG_l( Perl_deb(aTHX_ "(Found label #%ld %s)\n", (long)i, label));
1254 Perl_dowantarray(pTHX)
1256 I32 gimme = block_gimme();
1257 return (gimme == G_VOID) ? G_SCALAR : gimme;
1261 Perl_block_gimme(pTHX)
1265 cxix = dopoptosub(cxstack_ix);
1269 switch (cxstack[cxix].blk_gimme) {
1277 Perl_croak(aTHX_ "panic: bad gimme: %d\n", cxstack[cxix].blk_gimme);
1284 Perl_is_lvalue_sub(pTHX)
1288 cxix = dopoptosub(cxstack_ix);
1289 assert(cxix >= 0); /* We should only be called from inside subs */
1291 if (cxstack[cxix].blk_sub.lval && CvLVALUE(cxstack[cxix].blk_sub.cv))
1292 return cxstack[cxix].blk_sub.lval;
1298 S_dopoptosub(pTHX_ I32 startingblock)
1300 return dopoptosub_at(cxstack, startingblock);
1304 S_dopoptosub_at(pTHX_ PERL_CONTEXT *cxstk, I32 startingblock)
1307 register PERL_CONTEXT *cx;
1308 for (i = startingblock; i >= 0; i--) {
1310 switch (CxTYPE(cx)) {
1316 DEBUG_l( Perl_deb(aTHX_ "(Found sub #%ld)\n", (long)i));
1324 S_dopoptoeval(pTHX_ I32 startingblock)
1327 register PERL_CONTEXT *cx;
1328 for (i = startingblock; i >= 0; i--) {
1330 switch (CxTYPE(cx)) {
1334 DEBUG_l( Perl_deb(aTHX_ "(Found eval #%ld)\n", (long)i));
1342 S_dopoptoloop(pTHX_ I32 startingblock)
1345 register PERL_CONTEXT *cx;
1346 for (i = startingblock; i >= 0; i--) {
1348 switch (CxTYPE(cx)) {
1350 if (ckWARN(WARN_EXITING))
1351 Perl_warner(aTHX_ WARN_EXITING, "Exiting substitution via %s",
1352 PL_op_name[PL_op->op_type]);
1355 if (ckWARN(WARN_EXITING))
1356 Perl_warner(aTHX_ WARN_EXITING, "Exiting subroutine via %s",
1357 PL_op_name[PL_op->op_type]);
1360 if (ckWARN(WARN_EXITING))
1361 Perl_warner(aTHX_ WARN_EXITING, "Exiting format via %s",
1362 PL_op_name[PL_op->op_type]);
1365 if (ckWARN(WARN_EXITING))
1366 Perl_warner(aTHX_ WARN_EXITING, "Exiting eval via %s",
1367 PL_op_name[PL_op->op_type]);
1370 if (ckWARN(WARN_EXITING))
1371 Perl_warner(aTHX_ WARN_EXITING, "Exiting pseudo-block via %s",
1372 PL_op_name[PL_op->op_type]);
1375 DEBUG_l( Perl_deb(aTHX_ "(Found loop #%ld)\n", (long)i));
1383 Perl_dounwind(pTHX_ I32 cxix)
1385 register PERL_CONTEXT *cx;
1388 while (cxstack_ix > cxix) {
1390 cx = &cxstack[cxstack_ix];
1391 DEBUG_l(PerlIO_printf(Perl_debug_log, "Unwinding block %ld, type %s\n",
1392 (long) cxstack_ix, PL_block_type[CxTYPE(cx)]));
1393 /* Note: we don't need to restore the base context info till the end. */
1394 switch (CxTYPE(cx)) {
1397 continue; /* not break */
1419 Perl_qerror(pTHX_ SV *err)
1422 sv_catsv(ERRSV, err);
1424 sv_catsv(PL_errors, err);
1426 Perl_warn(aTHX_ "%"SVf, err);
1431 Perl_die_where(pTHX_ char *message, STRLEN msglen)
1436 register PERL_CONTEXT *cx;
1441 if (PL_in_eval & EVAL_KEEPERR) {
1442 static char prefix[] = "\t(in cleanup) ";
1447 else if (SvCUR(err) >= sizeof(prefix)+msglen-1) {
1450 if (*e != *message || strNE(e,message))
1454 SvGROW(err, SvCUR(err)+sizeof(prefix)+msglen);
1455 sv_catpvn(err, prefix, sizeof(prefix)-1);
1456 sv_catpvn(err, message, msglen);
1457 if (ckWARN(WARN_MISC)) {
1458 STRLEN start = SvCUR(err)-msglen-sizeof(prefix)+1;
1459 Perl_warner(aTHX_ WARN_MISC, SvPVX(err)+start);
1464 sv_setpvn(ERRSV, message, msglen);
1468 message = SvPVx(ERRSV, msglen);
1470 while ((cxix = dopoptoeval(cxstack_ix)) < 0
1471 && PL_curstackinfo->si_prev)
1480 if (cxix < cxstack_ix)
1483 POPBLOCK(cx,PL_curpm);
1484 if (CxTYPE(cx) != CXt_EVAL) {
1485 PerlIO_write(Perl_error_log, "panic: die ", 11);
1486 PerlIO_write(Perl_error_log, message, msglen);
1491 if (gimme == G_SCALAR)
1492 *++newsp = &PL_sv_undef;
1493 PL_stack_sp = newsp;
1497 /* LEAVE could clobber PL_curcop (see save_re_context())
1498 * XXX it might be better to find a way to avoid messing with
1499 * PL_curcop in save_re_context() instead, but this is a more
1500 * minimal fix --GSAR */
1501 PL_curcop = cx->blk_oldcop;
1503 if (optype == OP_REQUIRE) {
1504 char* msg = SvPVx(ERRSV, n_a);
1505 DIE(aTHX_ "%sCompilation failed in require",
1506 *msg ? msg : "Unknown error\n");
1508 return pop_return();
1512 message = SvPVx(ERRSV, msglen);
1515 /* SFIO can really mess with your errno */
1518 PerlIO *serr = Perl_error_log;
1520 PerlIO_write(serr, message, msglen);
1521 (void)PerlIO_flush(serr);
1534 if (SvTRUE(left) != SvTRUE(right))
1546 RETURNOP(cLOGOP->op_other);
1555 RETURNOP(cLOGOP->op_other);
1561 register I32 cxix = dopoptosub(cxstack_ix);
1562 register PERL_CONTEXT *cx;
1563 register PERL_CONTEXT *ccstack = cxstack;
1564 PERL_SI *top_si = PL_curstackinfo;
1575 /* we may be in a higher stacklevel, so dig down deeper */
1576 while (cxix < 0 && top_si->si_type != PERLSI_MAIN) {
1577 top_si = top_si->si_prev;
1578 ccstack = top_si->si_cxstack;
1579 cxix = dopoptosub_at(ccstack, top_si->si_cxix);
1582 if (GIMME != G_ARRAY)
1586 if (PL_DBsub && cxix >= 0 &&
1587 ccstack[cxix].blk_sub.cv == GvCV(PL_DBsub))
1591 cxix = dopoptosub_at(ccstack, cxix - 1);
1594 cx = &ccstack[cxix];
1595 if (CxTYPE(cx) == CXt_SUB || CxTYPE(cx) == CXt_FORMAT) {
1596 dbcxix = dopoptosub_at(ccstack, cxix - 1);
1597 /* We expect that ccstack[dbcxix] is CXt_SUB, anyway, the
1598 field below is defined for any cx. */
1599 if (PL_DBsub && dbcxix >= 0 && ccstack[dbcxix].blk_sub.cv == GvCV(PL_DBsub))
1600 cx = &ccstack[dbcxix];
1603 stashname = CopSTASHPV(cx->blk_oldcop);
1604 if (GIMME != G_ARRAY) {
1606 PUSHs(&PL_sv_undef);
1609 sv_setpv(TARG, stashname);
1616 PUSHs(&PL_sv_undef);
1618 PUSHs(sv_2mortal(newSVpv(stashname, 0)));
1619 PUSHs(sv_2mortal(newSVpv(CopFILE(cx->blk_oldcop), 0)));
1620 PUSHs(sv_2mortal(newSViv((I32)CopLINE(cx->blk_oldcop))));
1623 if (CxTYPE(cx) == CXt_SUB || CxTYPE(cx) == CXt_FORMAT) {
1624 /* So is ccstack[dbcxix]. */
1626 gv_efullname3(sv, CvGV(ccstack[cxix].blk_sub.cv), Nullch);
1627 PUSHs(sv_2mortal(sv));
1628 PUSHs(sv_2mortal(newSViv((I32)cx->blk_sub.hasargs)));
1631 PUSHs(sv_2mortal(newSVpvn("(eval)",6)));
1632 PUSHs(sv_2mortal(newSViv(0)));
1634 gimme = (I32)cx->blk_gimme;
1635 if (gimme == G_VOID)
1636 PUSHs(&PL_sv_undef);
1638 PUSHs(sv_2mortal(newSViv(gimme & G_ARRAY)));
1639 if (CxTYPE(cx) == CXt_EVAL) {
1641 if (cx->blk_eval.old_op_type == OP_ENTEREVAL) {
1642 PUSHs(cx->blk_eval.cur_text);
1646 else if (cx->blk_eval.old_namesv) {
1647 PUSHs(sv_2mortal(newSVsv(cx->blk_eval.old_namesv)));
1650 /* eval BLOCK (try blocks have old_namesv == 0) */
1652 PUSHs(&PL_sv_undef);
1653 PUSHs(&PL_sv_undef);
1657 PUSHs(&PL_sv_undef);
1658 PUSHs(&PL_sv_undef);
1660 if (CxTYPE(cx) == CXt_SUB && cx->blk_sub.hasargs
1661 && CopSTASH_eq(PL_curcop, PL_debstash))
1663 AV *ary = cx->blk_sub.argarray;
1664 int off = AvARRAY(ary) - AvALLOC(ary);
1668 PL_dbargs = GvAV(gv_AVadd(tmpgv = gv_fetchpv("DB::args", TRUE,
1671 AvREAL_off(PL_dbargs); /* XXX should be REIFY (see av.h) */
1674 if (AvMAX(PL_dbargs) < AvFILLp(ary) + off)
1675 av_extend(PL_dbargs, AvFILLp(ary) + off);
1676 Copy(AvALLOC(ary), AvARRAY(PL_dbargs), AvFILLp(ary) + 1 + off, SV*);
1677 AvFILLp(PL_dbargs) = AvFILLp(ary) + off;
1679 /* XXX only hints propagated via op_private are currently
1680 * visible (others are not easily accessible, since they
1681 * use the global PL_hints) */
1682 PUSHs(sv_2mortal(newSViv((I32)cx->blk_oldcop->op_private &
1683 HINT_PRIVATE_MASK)));
1686 SV * old_warnings = cx->blk_oldcop->cop_warnings ;
1688 if (old_warnings == pWARN_NONE ||
1689 (old_warnings == pWARN_STD && (PL_dowarn & G_WARN_ON) == 0))
1690 mask = newSVpvn(WARN_NONEstring, WARNsize) ;
1691 else if (old_warnings == pWARN_ALL ||
1692 (old_warnings == pWARN_STD && PL_dowarn & G_WARN_ON))
1693 mask = newSVpvn(WARN_ALLstring, WARNsize) ;
1695 mask = newSVsv(old_warnings);
1696 PUSHs(sv_2mortal(mask));
1711 sv_reset(tmps, CopSTASH(PL_curcop));
1723 PL_curcop = (COP*)PL_op;
1724 TAINT_NOT; /* Each statement is presumed innocent */
1725 PL_stack_sp = PL_stack_base + cxstack[cxstack_ix].blk_oldsp;
1728 if (PL_op->op_private || SvIV(PL_DBsingle) || SvIV(PL_DBsignal) || SvIV(PL_DBtrace))
1732 register PERL_CONTEXT *cx;
1733 I32 gimme = G_ARRAY;
1740 DIE(aTHX_ "No DB::DB routine defined");
1742 if (CvDEPTH(cv) >= 1 && !(PL_debug & DEBUG_DB_RECURSE_FLAG))
1743 /* don't do recursive DB::DB call */
1755 push_return(PL_op->op_next);
1756 PUSHBLOCK(cx, CXt_SUB, SP);
1759 (void)SvREFCNT_inc(cv);
1760 SAVEVPTR(PL_curpad);
1761 PL_curpad = AvARRAY((AV*)*av_fetch(CvPADLIST(cv),1,FALSE));
1762 RETURNOP(CvSTART(cv));
1776 register PERL_CONTEXT *cx;
1777 I32 gimme = GIMME_V;
1779 U32 cxtype = CXt_LOOP;
1788 if (PL_op->op_flags & OPf_SPECIAL) {
1789 svp = &THREADSV(PL_op->op_targ); /* per-thread variable */
1790 SAVEGENERICSV(*svp);
1794 #endif /* USE_THREADS */
1795 if (PL_op->op_targ) {
1796 #ifndef USE_ITHREADS
1797 svp = &PL_curpad[PL_op->op_targ]; /* "my" variable */
1800 SAVEPADSV(PL_op->op_targ);
1801 iterdata = (void*)PL_op->op_targ;
1802 cxtype |= CXp_PADVAR;
1807 svp = &GvSV(gv); /* symbol table variable */
1808 SAVEGENERICSV(*svp);
1811 iterdata = (void*)gv;
1817 PUSHBLOCK(cx, cxtype, SP);
1819 PUSHLOOP(cx, iterdata, MARK);
1821 PUSHLOOP(cx, svp, MARK);
1823 if (PL_op->op_flags & OPf_STACKED) {
1824 cx->blk_loop.iterary = (AV*)SvREFCNT_inc(POPs);
1825 if (SvTYPE(cx->blk_loop.iterary) != SVt_PVAV) {
1827 if (SvNIOKp(sv) || !SvPOKp(sv) ||
1828 SvNIOKp(cx->blk_loop.iterary) || !SvPOKp(cx->blk_loop.iterary) ||
1829 (looks_like_number(sv) && *SvPVX(sv) != '0' &&
1830 looks_like_number((SV*)cx->blk_loop.iterary) &&
1831 *SvPVX(cx->blk_loop.iterary) != '0'))
1833 if (SvNV(sv) < IV_MIN ||
1834 SvNV((SV*)cx->blk_loop.iterary) >= IV_MAX)
1835 DIE(aTHX_ "Range iterator outside integer range");
1836 cx->blk_loop.iterix = SvIV(sv);
1837 cx->blk_loop.itermax = SvIV((SV*)cx->blk_loop.iterary);
1840 cx->blk_loop.iterlval = newSVsv(sv);
1844 cx->blk_loop.iterary = PL_curstack;
1845 AvFILLp(PL_curstack) = SP - PL_stack_base;
1846 cx->blk_loop.iterix = MARK - PL_stack_base;
1855 register PERL_CONTEXT *cx;
1856 I32 gimme = GIMME_V;
1862 PUSHBLOCK(cx, CXt_LOOP, SP);
1863 PUSHLOOP(cx, 0, SP);
1871 register PERL_CONTEXT *cx;
1879 newsp = PL_stack_base + cx->blk_loop.resetsp;
1882 if (gimme == G_VOID)
1884 else if (gimme == G_SCALAR) {
1886 *++newsp = sv_mortalcopy(*SP);
1888 *++newsp = &PL_sv_undef;
1892 *++newsp = sv_mortalcopy(*++mark);
1893 TAINT_NOT; /* Each item is independent */
1899 POPLOOP(cx); /* Stack values are safe: release loop vars ... */
1900 PL_curpm = newpm; /* ... and pop $1 et al */
1912 register PERL_CONTEXT *cx;
1913 bool popsub2 = FALSE;
1914 bool clear_errsv = FALSE;
1921 if (PL_curstackinfo->si_type == PERLSI_SORT) {
1922 if (cxstack_ix == PL_sortcxix
1923 || dopoptosub(cxstack_ix) <= PL_sortcxix)
1925 if (cxstack_ix > PL_sortcxix)
1926 dounwind(PL_sortcxix);
1927 AvARRAY(PL_curstack)[1] = *SP;
1928 PL_stack_sp = PL_stack_base + 1;
1933 cxix = dopoptosub(cxstack_ix);
1935 DIE(aTHX_ "Can't return outside a subroutine");
1936 if (cxix < cxstack_ix)
1940 switch (CxTYPE(cx)) {
1945 if (!(PL_in_eval & EVAL_KEEPERR))
1951 if (optype == OP_REQUIRE &&
1952 (MARK == SP || (gimme == G_SCALAR && !SvTRUE(*SP))) )
1954 /* Unassume the success we assumed earlier. */
1955 SV *nsv = cx->blk_eval.old_namesv;
1956 (void)hv_delete(GvHVn(PL_incgv), SvPVX(nsv), SvCUR(nsv), G_DISCARD);
1957 DIE(aTHX_ "%s did not return a true value", SvPVX(nsv));
1964 DIE(aTHX_ "panic: return");
1968 if (gimme == G_SCALAR) {
1971 if (cx->blk_sub.cv && CvDEPTH(cx->blk_sub.cv) > 1) {
1973 *++newsp = SvREFCNT_inc(*SP);
1978 sv = SvREFCNT_inc(*SP); /* FREETMPS could clobber it */
1980 *++newsp = sv_mortalcopy(sv);
1985 *++newsp = (SvTEMP(*SP)) ? *SP : sv_mortalcopy(*SP);
1988 *++newsp = sv_mortalcopy(*SP);
1991 *++newsp = &PL_sv_undef;
1993 else if (gimme == G_ARRAY) {
1994 while (++MARK <= SP) {
1995 *++newsp = (popsub2 && SvTEMP(*MARK))
1996 ? *MARK : sv_mortalcopy(*MARK);
1997 TAINT_NOT; /* Each item is independent */
2000 PL_stack_sp = newsp;
2002 /* Stack values are safe: */
2004 POPSUB(cx,sv); /* release CV and @_ ... */
2008 PL_curpm = newpm; /* ... and pop $1 et al */
2014 return pop_return();
2021 register PERL_CONTEXT *cx;
2031 if (PL_op->op_flags & OPf_SPECIAL) {
2032 cxix = dopoptoloop(cxstack_ix);
2034 DIE(aTHX_ "Can't \"last\" outside a loop block");
2037 cxix = dopoptolabel(cPVOP->op_pv);
2039 DIE(aTHX_ "Label not found for \"last %s\"", cPVOP->op_pv);
2041 if (cxix < cxstack_ix)
2046 switch (CxTYPE(cx)) {
2049 newsp = PL_stack_base + cx->blk_loop.resetsp;
2050 nextop = cx->blk_loop.last_op->op_next;
2054 nextop = pop_return();
2058 nextop = pop_return();
2062 nextop = pop_return();
2065 DIE(aTHX_ "panic: last");
2069 if (gimme == G_SCALAR) {
2071 *++newsp = ((pop2 == CXt_SUB) && SvTEMP(*SP))
2072 ? *SP : sv_mortalcopy(*SP);
2074 *++newsp = &PL_sv_undef;
2076 else if (gimme == G_ARRAY) {
2077 while (++MARK <= SP) {
2078 *++newsp = ((pop2 == CXt_SUB) && SvTEMP(*MARK))
2079 ? *MARK : sv_mortalcopy(*MARK);
2080 TAINT_NOT; /* Each item is independent */
2086 /* Stack values are safe: */
2089 POPLOOP(cx); /* release loop vars ... */
2093 POPSUB(cx,sv); /* release CV and @_ ... */
2096 PL_curpm = newpm; /* ... and pop $1 et al */
2106 register PERL_CONTEXT *cx;
2109 if (PL_op->op_flags & OPf_SPECIAL) {
2110 cxix = dopoptoloop(cxstack_ix);
2112 DIE(aTHX_ "Can't \"next\" outside a loop block");
2115 cxix = dopoptolabel(cPVOP->op_pv);
2117 DIE(aTHX_ "Label not found for \"next %s\"", cPVOP->op_pv);
2119 if (cxix < cxstack_ix)
2122 /* clear off anything above the scope we're re-entering, but
2123 * save the rest until after a possible continue block */
2124 inner = PL_scopestack_ix;
2126 if (PL_scopestack_ix < inner)
2127 leave_scope(PL_scopestack[PL_scopestack_ix]);
2128 return cx->blk_loop.next_op;
2134 register PERL_CONTEXT *cx;
2137 if (PL_op->op_flags & OPf_SPECIAL) {
2138 cxix = dopoptoloop(cxstack_ix);
2140 DIE(aTHX_ "Can't \"redo\" outside a loop block");
2143 cxix = dopoptolabel(cPVOP->op_pv);
2145 DIE(aTHX_ "Label not found for \"redo %s\"", cPVOP->op_pv);
2147 if (cxix < cxstack_ix)
2151 oldsave = PL_scopestack[PL_scopestack_ix - 1];
2152 LEAVE_SCOPE(oldsave);
2153 return cx->blk_loop.redo_op;
2157 S_dofindlabel(pTHX_ OP *o, char *label, OP **opstack, OP **oplimit)
2161 static char too_deep[] = "Target of goto is too deeply nested";
2164 Perl_croak(aTHX_ too_deep);
2165 if (o->op_type == OP_LEAVE ||
2166 o->op_type == OP_SCOPE ||
2167 o->op_type == OP_LEAVELOOP ||
2168 o->op_type == OP_LEAVETRY)
2170 *ops++ = cUNOPo->op_first;
2172 Perl_croak(aTHX_ too_deep);
2175 if (o->op_flags & OPf_KIDS) {
2176 /* First try all the kids at this level, since that's likeliest. */
2177 for (kid = cUNOPo->op_first; kid; kid = kid->op_sibling) {
2178 if ((kid->op_type == OP_NEXTSTATE || kid->op_type == OP_DBSTATE) &&
2179 kCOP->cop_label && strEQ(kCOP->cop_label, label))
2182 for (kid = cUNOPo->op_first; kid; kid = kid->op_sibling) {
2183 if (kid == PL_lastgotoprobe)
2185 if ((kid->op_type == OP_NEXTSTATE || kid->op_type == OP_DBSTATE) &&
2187 (ops[-1]->op_type != OP_NEXTSTATE &&
2188 ops[-1]->op_type != OP_DBSTATE)))
2190 if ((o = dofindlabel(kid, label, ops, oplimit)))
2209 register PERL_CONTEXT *cx;
2210 #define GOTO_DEPTH 64
2211 OP *enterops[GOTO_DEPTH];
2213 int do_dump = (PL_op->op_type == OP_DUMP);
2214 static char must_have_label[] = "goto must have label";
2217 if (PL_op->op_flags & OPf_STACKED) {
2221 /* This egregious kludge implements goto &subroutine */
2222 if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVCV) {
2224 register PERL_CONTEXT *cx;
2225 CV* cv = (CV*)SvRV(sv);
2231 if (!CvROOT(cv) && !CvXSUB(cv)) {
2236 /* autoloaded stub? */
2237 if (cv != GvCV(gv) && (cv = GvCV(gv)))
2239 autogv = gv_autoload4(GvSTASH(gv), GvNAME(gv),
2240 GvNAMELEN(gv), FALSE);
2241 if (autogv && (cv = GvCV(autogv)))
2243 tmpstr = sv_newmortal();
2244 gv_efullname3(tmpstr, gv, Nullch);
2245 DIE(aTHX_ "Goto undefined subroutine &%s",SvPVX(tmpstr));
2247 DIE(aTHX_ "Goto undefined subroutine");
2250 /* First do some returnish stuff. */
2251 cxix = dopoptosub(cxstack_ix);
2253 DIE(aTHX_ "Can't goto subroutine outside a subroutine");
2254 if (cxix < cxstack_ix)
2258 DIE(aTHX_ "Can't goto subroutine from an eval-string");
2260 if (CxTYPE(cx) == CXt_SUB && cx->blk_sub.hasargs) {
2261 /* put @_ back onto stack */
2262 AV* av = cx->blk_sub.argarray;
2264 items = AvFILLp(av) + 1;
2266 EXTEND(PL_stack_sp, items); /* @_ could have been extended. */
2267 Copy(AvARRAY(av), PL_stack_sp, items, SV*);
2268 PL_stack_sp += items;
2270 SvREFCNT_dec(GvAV(PL_defgv));
2271 GvAV(PL_defgv) = cx->blk_sub.savearray;
2272 #endif /* USE_THREADS */
2273 /* abandon @_ if it got reified */
2275 (void)sv_2mortal((SV*)av); /* delay until return */
2277 av_extend(av, items-1);
2278 AvFLAGS(av) = AVf_REIFY;
2279 PL_curpad[0] = (SV*)(cx->blk_sub.argarray = av);
2282 else if (CvXSUB(cv)) { /* put GvAV(defgv) back onto stack */
2285 av = (AV*)PL_curpad[0];
2287 av = GvAV(PL_defgv);
2289 items = AvFILLp(av) + 1;
2291 EXTEND(PL_stack_sp, items); /* @_ could have been extended. */
2292 Copy(AvARRAY(av), PL_stack_sp, items, SV*);
2293 PL_stack_sp += items;
2295 if (CxTYPE(cx) == CXt_SUB &&
2296 !(CvDEPTH(cx->blk_sub.cv) = cx->blk_sub.olddepth))
2297 SvREFCNT_dec(cx->blk_sub.cv);
2298 oldsave = PL_scopestack[PL_scopestack_ix - 1];
2299 LEAVE_SCOPE(oldsave);
2301 /* Now do some callish stuff. */
2304 #ifdef PERL_XSUB_OLDSTYLE
2305 if (CvOLDSTYLE(cv)) {
2306 I32 (*fp3)(int,int,int);
2311 fp3 = (I32(*)(int,int,int))CvXSUB(cv);
2312 items = (*fp3)(CvXSUBANY(cv).any_i32,
2313 mark - PL_stack_base + 1,
2315 SP = PL_stack_base + items;
2318 #endif /* PERL_XSUB_OLDSTYLE */
2323 PL_stack_sp--; /* There is no cv arg. */
2324 /* Push a mark for the start of arglist */
2326 (void)(*CvXSUB(cv))(aTHXo_ cv);
2327 /* Pop the current context like a decent sub should */
2328 POPBLOCK(cx, PL_curpm);
2329 /* Do _not_ use PUTBACK, keep the XSUB's return stack! */
2332 return pop_return();
2335 AV* padlist = CvPADLIST(cv);
2336 SV** svp = AvARRAY(padlist);
2337 if (CxTYPE(cx) == CXt_EVAL) {
2338 PL_in_eval = cx->blk_eval.old_in_eval;
2339 PL_eval_root = cx->blk_eval.old_eval_root;
2340 cx->cx_type = CXt_SUB;
2341 cx->blk_sub.hasargs = 0;
2343 cx->blk_sub.cv = cv;
2344 cx->blk_sub.olddepth = CvDEPTH(cv);
2346 if (CvDEPTH(cv) < 2)
2347 (void)SvREFCNT_inc(cv);
2348 else { /* save temporaries on recursion? */
2349 if (CvDEPTH(cv) == 100 && ckWARN(WARN_RECURSION))
2350 sub_crush_depth(cv);
2351 if (CvDEPTH(cv) > AvFILLp(padlist)) {
2352 AV *newpad = newAV();
2353 SV **oldpad = AvARRAY(svp[CvDEPTH(cv)-1]);
2354 I32 ix = AvFILLp((AV*)svp[1]);
2355 I32 names_fill = AvFILLp((AV*)svp[0]);
2356 svp = AvARRAY(svp[0]);
2357 for ( ;ix > 0; ix--) {
2358 if (names_fill >= ix && svp[ix] != &PL_sv_undef) {
2359 char *name = SvPVX(svp[ix]);
2360 if ((SvFLAGS(svp[ix]) & SVf_FAKE)
2363 /* outer lexical or anon code */
2364 av_store(newpad, ix,
2365 SvREFCNT_inc(oldpad[ix]) );
2367 else { /* our own lexical */
2369 av_store(newpad, ix, sv = (SV*)newAV());
2370 else if (*name == '%')
2371 av_store(newpad, ix, sv = (SV*)newHV());
2373 av_store(newpad, ix, sv = NEWSV(0,0));
2377 else if (IS_PADGV(oldpad[ix]) || IS_PADCONST(oldpad[ix])) {
2378 av_store(newpad, ix, sv = SvREFCNT_inc(oldpad[ix]));
2381 av_store(newpad, ix, sv = NEWSV(0,0));
2385 if (cx->blk_sub.hasargs) {
2388 av_store(newpad, 0, (SV*)av);
2389 AvFLAGS(av) = AVf_REIFY;
2391 av_store(padlist, CvDEPTH(cv), (SV*)newpad);
2392 AvFILLp(padlist) = CvDEPTH(cv);
2393 svp = AvARRAY(padlist);
2397 if (!cx->blk_sub.hasargs) {
2398 AV* av = (AV*)PL_curpad[0];
2400 items = AvFILLp(av) + 1;
2402 /* Mark is at the end of the stack. */
2404 Copy(AvARRAY(av), SP + 1, items, SV*);
2409 #endif /* USE_THREADS */
2410 SAVEVPTR(PL_curpad);
2411 PL_curpad = AvARRAY((AV*)svp[CvDEPTH(cv)]);
2413 if (cx->blk_sub.hasargs)
2414 #endif /* USE_THREADS */
2416 AV* av = (AV*)PL_curpad[0];
2420 cx->blk_sub.savearray = GvAV(PL_defgv);
2421 GvAV(PL_defgv) = (AV*)SvREFCNT_inc(av);
2422 #endif /* USE_THREADS */
2423 cx->blk_sub.oldcurpad = PL_curpad;
2424 cx->blk_sub.argarray = av;
2427 if (items >= AvMAX(av) + 1) {
2429 if (AvARRAY(av) != ary) {
2430 AvMAX(av) += AvARRAY(av) - AvALLOC(av);
2431 SvPVX(av) = (char*)ary;
2433 if (items >= AvMAX(av) + 1) {
2434 AvMAX(av) = items - 1;
2435 Renew(ary,items+1,SV*);
2437 SvPVX(av) = (char*)ary;
2440 Copy(mark,AvARRAY(av),items,SV*);
2441 AvFILLp(av) = items - 1;
2442 assert(!AvREAL(av));
2449 if (PERLDB_SUB) { /* Checking curstash breaks DProf. */
2451 * We do not care about using sv to call CV;
2452 * it's for informational purposes only.
2454 SV *sv = GvSV(PL_DBsub);
2457 if (PERLDB_SUB_NN) {
2458 SvIVX(sv) = PTR2IV(cv); /* Already upgraded, saved */
2461 gv_efullname3(sv, CvGV(cv), Nullch);
2464 && (gotocv = get_cv("DB::goto", FALSE)) ) {
2465 PUSHMARK( PL_stack_sp );
2466 call_sv((SV*)gotocv, G_SCALAR | G_NODEBUG);
2470 RETURNOP(CvSTART(cv));
2474 label = SvPV(sv,n_a);
2475 if (!(do_dump || *label))
2476 DIE(aTHX_ must_have_label);
2479 else if (PL_op->op_flags & OPf_SPECIAL) {
2481 DIE(aTHX_ must_have_label);
2484 label = cPVOP->op_pv;
2486 if (label && *label) {
2488 bool leaving_eval = FALSE;
2489 PERL_CONTEXT *last_eval_cx = 0;
2493 PL_lastgotoprobe = 0;
2495 for (ix = cxstack_ix; ix >= 0; ix--) {
2497 switch (CxTYPE(cx)) {
2499 leaving_eval = TRUE;
2500 if (CxREALEVAL(cx)) {
2501 gotoprobe = (last_eval_cx ?
2502 last_eval_cx->blk_eval.old_eval_root :
2507 /* else fall through */
2509 gotoprobe = cx->blk_oldcop->op_sibling;
2515 gotoprobe = cx->blk_oldcop->op_sibling;
2517 gotoprobe = PL_main_root;
2520 if (CvDEPTH(cx->blk_sub.cv)) {
2521 gotoprobe = CvROOT(cx->blk_sub.cv);
2527 DIE(aTHX_ "Can't \"goto\" out of a pseudo block");
2530 DIE(aTHX_ "panic: goto");
2531 gotoprobe = PL_main_root;
2535 retop = dofindlabel(gotoprobe, label,
2536 enterops, enterops + GOTO_DEPTH);
2540 PL_lastgotoprobe = gotoprobe;
2543 DIE(aTHX_ "Can't find label %s", label);
2545 /* if we're leaving an eval, check before we pop any frames
2546 that we're not going to punt, otherwise the error
2549 if (leaving_eval && *enterops && enterops[1]) {
2551 for (i = 1; enterops[i]; i++)
2552 if (enterops[i]->op_type == OP_ENTERITER)
2553 DIE(aTHX_ "Can't \"goto\" into the middle of a foreach loop");
2556 /* pop unwanted frames */
2558 if (ix < cxstack_ix) {
2565 oldsave = PL_scopestack[PL_scopestack_ix];
2566 LEAVE_SCOPE(oldsave);
2569 /* push wanted frames */
2571 if (*enterops && enterops[1]) {
2573 for (ix = 1; enterops[ix]; ix++) {
2574 PL_op = enterops[ix];
2575 /* Eventually we may want to stack the needed arguments
2576 * for each op. For now, we punt on the hard ones. */
2577 if (PL_op->op_type == OP_ENTERITER)
2578 DIE(aTHX_ "Can't \"goto\" into the middle of a foreach loop");
2579 CALL_FPTR(PL_op->op_ppaddr)(aTHX);
2587 if (!retop) retop = PL_main_start;
2589 PL_restartop = retop;
2590 PL_do_undump = TRUE;
2594 PL_restartop = 0; /* hmm, must be GNU unexec().. */
2595 PL_do_undump = FALSE;
2611 if (anum == 1 && (PL_op->op_private & OPpEXIT_VMSISH))
2615 PL_exit_flags |= PERL_EXIT_EXPECTED;
2617 PUSHs(&PL_sv_undef);
2625 NV value = SvNVx(GvSV(cCOP->cop_gv));
2626 register I32 match = I_32(value);
2629 if (((NV)match) > value)
2630 --match; /* was fractional--truncate other way */
2632 match -= cCOP->uop.scop.scop_offset;
2635 else if (match > cCOP->uop.scop.scop_max)
2636 match = cCOP->uop.scop.scop_max;
2637 PL_op = cCOP->uop.scop.scop_next[match];
2647 PL_op = PL_op->op_next; /* can't assume anything */
2650 match = *(SvPVx(GvSV(cCOP->cop_gv), n_a)) & 255;
2651 match -= cCOP->uop.scop.scop_offset;
2654 else if (match > cCOP->uop.scop.scop_max)
2655 match = cCOP->uop.scop.scop_max;
2656 PL_op = cCOP->uop.scop.scop_next[match];
2665 S_save_lines(pTHX_ AV *array, SV *sv)
2667 register char *s = SvPVX(sv);
2668 register char *send = SvPVX(sv) + SvCUR(sv);
2670 register I32 line = 1;
2672 while (s && s < send) {
2673 SV *tmpstr = NEWSV(85,0);
2675 sv_upgrade(tmpstr, SVt_PVMG);
2676 t = strchr(s, '\n');
2682 sv_setpvn(tmpstr, s, t - s);
2683 av_store(array, line++, tmpstr);
2688 #ifdef PERL_FLEXIBLE_EXCEPTIONS
2690 S_docatch_body(pTHX_ va_list args)
2692 return docatch_body();
2697 S_docatch_body(pTHX)
2704 S_docatch(pTHX_ OP *o)
2708 volatile PERL_SI *cursi = PL_curstackinfo;
2712 assert(CATCH_GET == TRUE);
2715 #ifdef PERL_FLEXIBLE_EXCEPTIONS
2717 CALLPROTECT(aTHX_ pcur_env, &ret, MEMBER_TO_FPTR(S_docatch_body));
2723 #ifndef PERL_FLEXIBLE_EXCEPTIONS
2729 if (PL_restartop && cursi == PL_curstackinfo) {
2730 PL_op = PL_restartop;
2747 Perl_sv_compile_2op(pTHX_ SV *sv, OP** startop, char *code, AV** avp)
2748 /* sv Text to convert to OP tree. */
2749 /* startop op_free() this to undo. */
2750 /* code Short string id of the caller. */
2752 dSP; /* Make POPBLOCK work. */
2755 I32 gimme = 0; /* SUSPECT - INITIALZE TO WHAT? NI-S */
2759 char tbuf[TYPE_DIGITS(long) + 12 + 10];
2760 char *tmpbuf = tbuf;
2766 /* switch to eval mode */
2768 if (PL_curcop == &PL_compiling) {
2769 SAVECOPSTASH_FREE(&PL_compiling);
2770 CopSTASH_set(&PL_compiling, PL_curstash);
2772 if (PERLDB_NAMEEVAL && CopLINE(PL_curcop)) {
2773 SV *sv = sv_newmortal();
2774 Perl_sv_setpvf(aTHX_ sv, "_<(%.10seval %lu)[%s:%"IVdf"]",
2775 code, (unsigned long)++PL_evalseq,
2776 CopFILE(PL_curcop), (IV)CopLINE(PL_curcop));
2780 sprintf(tmpbuf, "_<(%.10s_eval %lu)", code, (unsigned long)++PL_evalseq);
2781 SAVECOPFILE_FREE(&PL_compiling);
2782 CopFILE_set(&PL_compiling, tmpbuf+2);
2783 SAVECOPLINE(&PL_compiling);
2784 CopLINE_set(&PL_compiling, 1);
2785 /* XXX For C<eval "...">s within BEGIN {} blocks, this ends up
2786 deleting the eval's FILEGV from the stash before gv_check() runs
2787 (i.e. before run-time proper). To work around the coredump that
2788 ensues, we always turn GvMULTI_on for any globals that were
2789 introduced within evals. See force_ident(). GSAR 96-10-12 */
2790 safestr = savepv(tmpbuf);
2791 SAVEDELETE(PL_defstash, safestr, strlen(safestr));
2793 #ifdef OP_IN_REGISTER
2798 PL_hints &= HINT_UTF8;
2801 PL_op->op_type = OP_ENTEREVAL;
2802 PL_op->op_flags = 0; /* Avoid uninit warning. */
2803 PUSHBLOCK(cx, CXt_EVAL|(PL_curcop == &PL_compiling ? 0 : CXp_REAL), SP);
2804 PUSHEVAL(cx, 0, Nullgv);
2805 rop = doeval(G_SCALAR, startop);
2806 POPBLOCK(cx,PL_curpm);
2809 (*startop)->op_type = OP_NULL;
2810 (*startop)->op_ppaddr = PL_ppaddr[OP_NULL];
2812 *avp = (AV*)SvREFCNT_inc(PL_comppad);
2814 if (PL_curcop == &PL_compiling)
2815 PL_compiling.op_private = PL_hints;
2816 #ifdef OP_IN_REGISTER
2822 /* With USE_THREADS, eval_owner must be held on entry to doeval */
2824 S_doeval(pTHX_ int gimme, OP** startop)
2832 PL_in_eval = ((saveop && saveop->op_type == OP_REQUIRE)
2833 ? (EVAL_INREQUIRE | (PL_in_eval & EVAL_INEVAL))
2838 /* set up a scratch pad */
2841 SAVEVPTR(PL_curpad);
2842 SAVESPTR(PL_comppad);
2843 SAVESPTR(PL_comppad_name);
2844 SAVEI32(PL_comppad_name_fill);
2845 SAVEI32(PL_min_intro_pending);
2846 SAVEI32(PL_max_intro_pending);
2849 for (i = cxstack_ix - 1; i >= 0; i--) {
2850 PERL_CONTEXT *cx = &cxstack[i];
2851 if (CxTYPE(cx) == CXt_EVAL)
2853 else if (CxTYPE(cx) == CXt_SUB || CxTYPE(cx) == CXt_FORMAT) {
2854 caller = cx->blk_sub.cv;
2859 SAVESPTR(PL_compcv);
2860 PL_compcv = (CV*)NEWSV(1104,0);
2861 sv_upgrade((SV *)PL_compcv, SVt_PVCV);
2862 CvEVAL_on(PL_compcv);
2863 assert(CxTYPE(&cxstack[cxstack_ix]) == CXt_EVAL);
2864 cxstack[cxstack_ix].blk_eval.cv = PL_compcv;
2867 CvOWNER(PL_compcv) = 0;
2868 New(666, CvMUTEXP(PL_compcv), 1, perl_mutex);
2869 MUTEX_INIT(CvMUTEXP(PL_compcv));
2870 #endif /* USE_THREADS */
2872 PL_comppad = newAV();
2873 av_push(PL_comppad, Nullsv);
2874 PL_curpad = AvARRAY(PL_comppad);
2875 PL_comppad_name = newAV();
2876 PL_comppad_name_fill = 0;
2877 PL_min_intro_pending = 0;
2880 av_store(PL_comppad_name, 0, newSVpvn("@_", 2));
2881 PL_curpad[0] = (SV*)newAV();
2882 SvPADMY_on(PL_curpad[0]); /* XXX Needed? */
2883 #endif /* USE_THREADS */
2885 comppadlist = newAV();
2886 AvREAL_off(comppadlist);
2887 av_store(comppadlist, 0, (SV*)PL_comppad_name);
2888 av_store(comppadlist, 1, (SV*)PL_comppad);
2889 CvPADLIST(PL_compcv) = comppadlist;
2892 (saveop->op_type != OP_REQUIRE && saveop->op_type != OP_DOFILE))
2894 CvOUTSIDE(PL_compcv) = (CV*)SvREFCNT_inc(caller);
2897 SAVEMORTALIZESV(PL_compcv); /* must remain until end of current statement */
2899 /* make sure we compile in the right package */
2901 if (CopSTASH_ne(PL_curcop, PL_curstash)) {
2902 SAVESPTR(PL_curstash);
2903 PL_curstash = CopSTASH(PL_curcop);
2905 SAVESPTR(PL_beginav);
2906 PL_beginav = newAV();
2907 SAVEFREESV(PL_beginav);
2908 SAVEI32(PL_error_count);
2910 /* try to compile it */
2912 PL_eval_root = Nullop;
2914 PL_curcop = &PL_compiling;
2915 PL_curcop->cop_arybase = 0;
2916 SvREFCNT_dec(PL_rs);
2917 PL_rs = newSVpvn("\n", 1);
2918 if (saveop && saveop->op_flags & OPf_SPECIAL)
2919 PL_in_eval |= EVAL_KEEPERR;
2922 if (yyparse() || PL_error_count || !PL_eval_root) {
2926 I32 optype = 0; /* Might be reset by POPEVAL. */
2931 op_free(PL_eval_root);
2932 PL_eval_root = Nullop;
2934 SP = PL_stack_base + POPMARK; /* pop original mark */
2936 POPBLOCK(cx,PL_curpm);
2942 if (optype == OP_REQUIRE) {
2943 char* msg = SvPVx(ERRSV, n_a);
2944 DIE(aTHX_ "%sCompilation failed in require",
2945 *msg ? msg : "Unknown error\n");
2948 char* msg = SvPVx(ERRSV, n_a);
2950 POPBLOCK(cx,PL_curpm);
2952 Perl_croak(aTHX_ "%sCompilation failed in regexp",
2953 (*msg ? msg : "Unknown error\n"));
2955 SvREFCNT_dec(PL_rs);
2956 PL_rs = SvREFCNT_inc(PL_nrs);
2958 MUTEX_LOCK(&PL_eval_mutex);
2960 COND_SIGNAL(&PL_eval_cond);
2961 MUTEX_UNLOCK(&PL_eval_mutex);
2962 #endif /* USE_THREADS */
2965 SvREFCNT_dec(PL_rs);
2966 PL_rs = SvREFCNT_inc(PL_nrs);
2967 CopLINE_set(&PL_compiling, 0);
2969 *startop = PL_eval_root;
2970 SvREFCNT_dec(CvOUTSIDE(PL_compcv));
2971 CvOUTSIDE(PL_compcv) = Nullcv;
2973 SAVEFREEOP(PL_eval_root);
2975 scalarvoid(PL_eval_root);
2976 else if (gimme & G_ARRAY)
2979 scalar(PL_eval_root);
2981 DEBUG_x(dump_eval());
2983 /* Register with debugger: */
2984 if (PERLDB_INTER && saveop->op_type == OP_REQUIRE) {
2985 CV *cv = get_cv("DB::postponed", FALSE);
2989 XPUSHs((SV*)CopFILEGV(&PL_compiling));
2991 call_sv((SV*)cv, G_DISCARD);
2995 /* compiled okay, so do it */
2997 CvDEPTH(PL_compcv) = 1;
2998 SP = PL_stack_base + POPMARK; /* pop original mark */
2999 PL_op = saveop; /* The caller may need it. */
3000 PL_lex_state = LEX_NOTPARSING; /* $^S needs this. */
3002 MUTEX_LOCK(&PL_eval_mutex);
3004 COND_SIGNAL(&PL_eval_cond);
3005 MUTEX_UNLOCK(&PL_eval_mutex);
3006 #endif /* USE_THREADS */
3008 RETURNOP(PL_eval_start);
3012 S_doopen_pmc(pTHX_ const char *name, const char *mode)
3014 STRLEN namelen = strlen(name);
3017 if (namelen > 3 && strEQ(name + namelen - 3, ".pm")) {
3018 SV *pmcsv = Perl_newSVpvf(aTHX_ "%s%c", name, 'c');
3019 char *pmc = SvPV_nolen(pmcsv);
3022 if (PerlLIO_stat(pmc, &pmcstat) < 0) {
3023 fp = PerlIO_open(name, mode);
3026 if (PerlLIO_stat(name, &pmstat) < 0 ||
3027 pmstat.st_mtime < pmcstat.st_mtime)
3029 fp = PerlIO_open(pmc, mode);
3032 fp = PerlIO_open(name, mode);
3035 SvREFCNT_dec(pmcsv);
3038 fp = PerlIO_open(name, mode);
3046 register PERL_CONTEXT *cx;
3050 char *tryname = Nullch;
3051 SV *namesv = Nullsv;
3053 I32 gimme = GIMME_V;
3054 PerlIO *tryrsfp = 0;
3056 int filter_has_file = 0;
3057 GV *filter_child_proc = 0;
3058 SV *filter_state = 0;
3063 if (SvPOK(sv) && SvNOK(sv) && SvNV(sv)) { /* require v5.6.1 */
3064 UV rev = 0, ver = 0, sver = 0;
3066 U8 *s = (U8*)SvPVX(sv);
3067 U8 *end = (U8*)SvPVX(sv) + SvCUR(sv);
3069 rev = utf8n_to_uvchr(s, end - s, &len, 0);
3072 ver = utf8n_to_uvchr(s, end - s, &len, 0);
3075 sver = utf8n_to_uvchr(s, end - s, &len, 0);
3078 if (PERL_REVISION < rev
3079 || (PERL_REVISION == rev
3080 && (PERL_VERSION < ver
3081 || (PERL_VERSION == ver
3082 && PERL_SUBVERSION < sver))))
3084 DIE(aTHX_ "Perl v%"UVuf".%"UVuf".%"UVuf" required--this is only "
3085 "v%d.%d.%d, stopped", rev, ver, sver, PERL_REVISION,
3086 PERL_VERSION, PERL_SUBVERSION);
3090 else if (!SvPOKp(sv)) { /* require 5.005_03 */
3091 if ((NV)PERL_REVISION + ((NV)PERL_VERSION/(NV)1000)
3092 + ((NV)PERL_SUBVERSION/(NV)1000000)
3093 + 0.00000099 < SvNV(sv))
3097 NV nver = (nrev - rev) * 1000;
3098 UV ver = (UV)(nver + 0.0009);
3099 NV nsver = (nver - ver) * 1000;
3100 UV sver = (UV)(nsver + 0.0009);
3102 /* help out with the "use 5.6" confusion */
3103 if (sver == 0 && (rev > 5 || (rev == 5 && ver >= 100))) {
3104 DIE(aTHX_ "Perl v%"UVuf".%"UVuf".%"UVuf" required--"
3105 "this is only v%d.%d.%d, stopped"
3106 " (did you mean v%"UVuf".%"UVuf".0?)",
3107 rev, ver, sver, PERL_REVISION, PERL_VERSION,
3108 PERL_SUBVERSION, rev, ver/100);
3111 DIE(aTHX_ "Perl v%"UVuf".%"UVuf".%"UVuf" required--"
3112 "this is only v%d.%d.%d, stopped",
3113 rev, ver, sver, PERL_REVISION, PERL_VERSION,
3120 name = SvPV(sv, len);
3121 if (!(name && len > 0 && *name))
3122 DIE(aTHX_ "Null filename used");
3123 TAINT_PROPER("require");
3124 if (PL_op->op_type == OP_REQUIRE &&
3125 (svp = hv_fetch(GvHVn(PL_incgv), name, len, 0)) &&
3126 *svp != &PL_sv_undef)
3129 /* prepare to compile file */
3131 #ifdef MACOS_TRADITIONAL
3132 if (PERL_FILE_IS_ABSOLUTE(name)
3133 || (*name == ':' && name[1] != ':' && strchr(name+2, ':')))
3136 tryrsfp = doopen_pmc(name,PERL_SCRIPT_MODE);
3137 /* We consider paths of the form :a:b ambiguous and interpret them first
3138 as global then as local
3140 if (!tryrsfp && *name == ':' && name[1] != ':' && strchr(name+2, ':'))
3146 if (PERL_FILE_IS_ABSOLUTE(name)
3147 || (*name == '.' && (name[1] == '/' ||
3148 (name[1] == '.' && name[2] == '/'))))
3151 tryrsfp = doopen_pmc(name,PERL_SCRIPT_MODE);
3155 AV *ar = GvAVn(PL_incgv);
3159 if ((unixname = tounixspec(name, Nullch)) != Nullch)
3162 namesv = NEWSV(806, 0);
3163 for (i = 0; i <= AvFILL(ar); i++) {
3164 SV *dirsv = *av_fetch(ar, i, TRUE);
3170 if (SvTYPE(SvRV(loader)) == SVt_PVAV) {
3171 loader = *av_fetch((AV *)SvRV(loader), 0, TRUE);
3174 Perl_sv_setpvf(aTHX_ namesv, "/loader/0x%"UVxf"/%s",
3175 PTR2UV(SvANY(loader)), name);
3176 tryname = SvPVX(namesv);
3187 if (sv_isobject(loader))
3188 count = call_method("INC", G_ARRAY);
3190 count = call_sv(loader, G_ARRAY);
3200 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVGV) {
3204 if (SvTYPE(arg) == SVt_PVGV) {
3205 IO *io = GvIO((GV *)arg);
3210 tryrsfp = IoIFP(io);
3211 if (IoTYPE(io) == IoTYPE_PIPE) {
3212 /* reading from a child process doesn't
3213 nest -- when returning from reading
3214 the inner module, the outer one is
3215 unreadable (closed?) I've tried to
3216 save the gv to manage the lifespan of
3217 the pipe, but this didn't help. XXX */
3218 filter_child_proc = (GV *)arg;
3219 (void)SvREFCNT_inc(filter_child_proc);
3222 if (IoOFP(io) && IoOFP(io) != IoIFP(io)) {
3223 PerlIO_close(IoOFP(io));
3235 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVCV) {
3237 (void)SvREFCNT_inc(filter_sub);
3240 filter_state = SP[i];
3241 (void)SvREFCNT_inc(filter_state);
3245 tryrsfp = PerlIO_open("/dev/null",
3259 filter_has_file = 0;
3260 if (filter_child_proc) {
3261 SvREFCNT_dec(filter_child_proc);
3262 filter_child_proc = 0;
3265 SvREFCNT_dec(filter_state);
3269 SvREFCNT_dec(filter_sub);
3274 char *dir = SvPVx(dirsv, n_a);
3275 #ifdef MACOS_TRADITIONAL
3277 Perl_sv_setpvf(aTHX_ namesv, "%s%s", MacPerl_CanonDir(dir, buf), name+(name[0] == ':'));
3281 if ((unixdir = tounixpath(dir, Nullch)) == Nullch)
3283 sv_setpv(namesv, unixdir);
3284 sv_catpv(namesv, unixname);
3286 Perl_sv_setpvf(aTHX_ namesv, "%s/%s", dir, name);
3289 TAINT_PROPER("require");
3290 tryname = SvPVX(namesv);
3291 #ifdef MACOS_TRADITIONAL
3293 /* Convert slashes in the name part, but not the directory part, to colons */
3295 for (colon = tryname+strlen(dir); colon = strchr(colon, '/'); )
3299 tryrsfp = doopen_pmc(tryname, PERL_SCRIPT_MODE);
3301 if (tryname[0] == '.' && tryname[1] == '/')
3309 SAVECOPFILE_FREE(&PL_compiling);
3310 CopFILE_set(&PL_compiling, tryrsfp ? tryname : name);
3311 SvREFCNT_dec(namesv);
3313 if (PL_op->op_type == OP_REQUIRE) {
3314 char *msgstr = name;
3315 if (namesv) { /* did we lookup @INC? */
3316 SV *msg = sv_2mortal(newSVpv(msgstr,0));
3317 SV *dirmsgsv = NEWSV(0, 0);
3318 AV *ar = GvAVn(PL_incgv);
3320 sv_catpvn(msg, " in @INC", 8);
3321 if (instr(SvPVX(msg), ".h "))
3322 sv_catpv(msg, " (change .h to .ph maybe?)");
3323 if (instr(SvPVX(msg), ".ph "))
3324 sv_catpv(msg, " (did you run h2ph?)");
3325 sv_catpv(msg, " (@INC contains:");
3326 for (i = 0; i <= AvFILL(ar); i++) {
3327 char *dir = SvPVx(*av_fetch(ar, i, TRUE), n_a);
3328 Perl_sv_setpvf(aTHX_ dirmsgsv, " %s", dir);
3329 sv_catsv(msg, dirmsgsv);
3331 sv_catpvn(msg, ")", 1);
3332 SvREFCNT_dec(dirmsgsv);
3333 msgstr = SvPV_nolen(msg);
3335 DIE(aTHX_ "Can't locate %s", msgstr);
3341 SETERRNO(0, SS$_NORMAL);
3343 /* Assume success here to prevent recursive requirement. */
3344 (void)hv_store(GvHVn(PL_incgv), name, strlen(name),
3345 newSVpv(CopFILE(&PL_compiling), 0), 0 );
3349 lex_start(sv_2mortal(newSVpvn("",0)));
3350 SAVEGENERICSV(PL_rsfp_filters);
3351 PL_rsfp_filters = Nullav;
3356 SAVESPTR(PL_compiling.cop_warnings);
3357 if (PL_dowarn & G_WARN_ALL_ON)
3358 PL_compiling.cop_warnings = pWARN_ALL ;
3359 else if (PL_dowarn & G_WARN_ALL_OFF)
3360 PL_compiling.cop_warnings = pWARN_NONE ;
3362 PL_compiling.cop_warnings = pWARN_STD ;
3363 SAVESPTR(PL_compiling.cop_io);
3364 PL_compiling.cop_io = Nullsv;
3366 if (filter_sub || filter_child_proc) {
3367 SV *datasv = filter_add(run_user_filter, Nullsv);
3368 IoLINES(datasv) = filter_has_file;
3369 IoFMT_GV(datasv) = (GV *)filter_child_proc;
3370 IoTOP_GV(datasv) = (GV *)filter_state;
3371 IoBOTTOM_GV(datasv) = (GV *)filter_sub;
3374 /* switch to eval mode */
3375 push_return(PL_op->op_next);
3376 PUSHBLOCK(cx, CXt_EVAL, SP);
3377 PUSHEVAL(cx, name, Nullgv);
3379 SAVECOPLINE(&PL_compiling);
3380 CopLINE_set(&PL_compiling, 0);
3384 MUTEX_LOCK(&PL_eval_mutex);
3385 if (PL_eval_owner && PL_eval_owner != thr)
3386 while (PL_eval_owner)
3387 COND_WAIT(&PL_eval_cond, &PL_eval_mutex);
3388 PL_eval_owner = thr;
3389 MUTEX_UNLOCK(&PL_eval_mutex);
3390 #endif /* USE_THREADS */
3391 return DOCATCH(doeval(gimme, NULL));
3396 return pp_require();
3402 register PERL_CONTEXT *cx;
3404 I32 gimme = GIMME_V, was = PL_sub_generation;
3405 char tbuf[TYPE_DIGITS(long) + 12];
3406 char *tmpbuf = tbuf;
3411 if (!SvPV(sv,len) || !len)
3413 TAINT_PROPER("eval");
3419 /* switch to eval mode */
3421 if (PERLDB_NAMEEVAL && CopLINE(PL_curcop)) {
3422 SV *sv = sv_newmortal();
3423 Perl_sv_setpvf(aTHX_ sv, "_<(eval %lu)[%s:%"IVdf"]",
3424 (unsigned long)++PL_evalseq,
3425 CopFILE(PL_curcop), (IV)CopLINE(PL_curcop));
3429 sprintf(tmpbuf, "_<(eval %lu)", (unsigned long)++PL_evalseq);
3430 SAVECOPFILE_FREE(&PL_compiling);
3431 CopFILE_set(&PL_compiling, tmpbuf+2);
3432 SAVECOPLINE(&PL_compiling);
3433 CopLINE_set(&PL_compiling, 1);
3434 /* XXX For C<eval "...">s within BEGIN {} blocks, this ends up
3435 deleting the eval's FILEGV from the stash before gv_check() runs
3436 (i.e. before run-time proper). To work around the coredump that
3437 ensues, we always turn GvMULTI_on for any globals that were
3438 introduced within evals. See force_ident(). GSAR 96-10-12 */
3439 safestr = savepv(tmpbuf);
3440 SAVEDELETE(PL_defstash, safestr, strlen(safestr));
3442 PL_hints = PL_op->op_targ;
3443 SAVESPTR(PL_compiling.cop_warnings);
3444 if (specialWARN(PL_curcop->cop_warnings))
3445 PL_compiling.cop_warnings = PL_curcop->cop_warnings;
3447 PL_compiling.cop_warnings = newSVsv(PL_curcop->cop_warnings);
3448 SAVEFREESV(PL_compiling.cop_warnings);
3450 SAVESPTR(PL_compiling.cop_io);
3451 if (specialCopIO(PL_curcop->cop_io))
3452 PL_compiling.cop_io = PL_curcop->cop_io;
3454 PL_compiling.cop_io = newSVsv(PL_curcop->cop_io);
3455 SAVEFREESV(PL_compiling.cop_io);
3458 push_return(PL_op->op_next);
3459 PUSHBLOCK(cx, (CXt_EVAL|CXp_REAL), SP);
3460 PUSHEVAL(cx, 0, Nullgv);
3462 /* prepare to compile string */
3464 if (PERLDB_LINE && PL_curstash != PL_debstash)
3465 save_lines(CopFILEAV(&PL_compiling), PL_linestr);
3468 MUTEX_LOCK(&PL_eval_mutex);
3469 if (PL_eval_owner && PL_eval_owner != thr)
3470 while (PL_eval_owner)
3471 COND_WAIT(&PL_eval_cond, &PL_eval_mutex);
3472 PL_eval_owner = thr;
3473 MUTEX_UNLOCK(&PL_eval_mutex);
3474 #endif /* USE_THREADS */
3475 ret = doeval(gimme, NULL);
3476 if (PERLDB_INTER && was != PL_sub_generation /* Some subs defined here. */
3477 && ret != PL_op->op_next) { /* Successive compilation. */
3478 strcpy(safestr, "_<(eval )"); /* Anything fake and short. */
3480 return DOCATCH(ret);
3490 register PERL_CONTEXT *cx;
3492 U8 save_flags = PL_op -> op_flags;
3497 retop = pop_return();
3500 if (gimme == G_VOID)
3502 else if (gimme == G_SCALAR) {
3505 if (SvFLAGS(TOPs) & SVs_TEMP)
3508 *MARK = sv_mortalcopy(TOPs);
3512 *MARK = &PL_sv_undef;
3517 /* in case LEAVE wipes old return values */
3518 for (mark = newsp + 1; mark <= SP; mark++) {
3519 if (!(SvFLAGS(*mark) & SVs_TEMP)) {
3520 *mark = sv_mortalcopy(*mark);
3521 TAINT_NOT; /* Each item is independent */
3525 PL_curpm = newpm; /* Don't pop $1 et al till now */
3528 assert(CvDEPTH(PL_compcv) == 1);
3530 CvDEPTH(PL_compcv) = 0;
3533 if (optype == OP_REQUIRE &&
3534 !(gimme == G_SCALAR ? SvTRUE(*SP) : SP > newsp))
3536 /* Unassume the success we assumed earlier. */
3537 SV *nsv = cx->blk_eval.old_namesv;
3538 (void)hv_delete(GvHVn(PL_incgv), SvPVX(nsv), SvCUR(nsv), G_DISCARD);
3539 retop = Perl_die(aTHX_ "%s did not return a true value", SvPVX(nsv));
3540 /* die_where() did LEAVE, or we won't be here */
3544 if (!(save_flags & OPf_SPECIAL))
3554 register PERL_CONTEXT *cx;
3555 I32 gimme = GIMME_V;
3560 push_return(cLOGOP->op_other->op_next);
3561 PUSHBLOCK(cx, (CXt_EVAL|CXp_TRYBLOCK), SP);
3564 PL_in_eval = EVAL_INEVAL;
3567 return DOCATCH(PL_op->op_next);
3577 register PERL_CONTEXT *cx;
3585 if (gimme == G_VOID)
3587 else if (gimme == G_SCALAR) {
3590 if (SvFLAGS(TOPs) & (SVs_PADTMP|SVs_TEMP))
3593 *MARK = sv_mortalcopy(TOPs);
3597 *MARK = &PL_sv_undef;
3602 /* in case LEAVE wipes old return values */
3603 for (mark = newsp + 1; mark <= SP; mark++) {
3604 if (!(SvFLAGS(*mark) & (SVs_PADTMP|SVs_TEMP))) {
3605 *mark = sv_mortalcopy(*mark);
3606 TAINT_NOT; /* Each item is independent */
3610 PL_curpm = newpm; /* Don't pop $1 et al till now */
3618 S_doparseform(pTHX_ SV *sv)
3621 register char *s = SvPV_force(sv, len);
3622 register char *send = s + len;
3623 register char *base = Nullch;
3624 register I32 skipspaces = 0;
3625 bool noblank = FALSE;
3626 bool repeat = FALSE;
3627 bool postspace = FALSE;
3635 Perl_croak(aTHX_ "Null picture in formline");
3637 New(804, fops, (send - s)*3+10, U16); /* Almost certainly too long... */
3642 *fpc++ = FF_LINEMARK;
3643 noblank = repeat = FALSE;
3661 case ' ': case '\t':
3672 *fpc++ = FF_LITERAL;
3680 *fpc++ = skipspaces;
3684 *fpc++ = FF_NEWLINE;
3688 arg = fpc - linepc + 1;
3695 *fpc++ = FF_LINEMARK;
3696 noblank = repeat = FALSE;
3705 ischop = s[-1] == '^';
3711 arg = (s - base) - 1;
3713 *fpc++ = FF_LITERAL;
3722 *fpc++ = FF_LINEGLOB;
3724 else if (*s == '#' || (*s == '.' && s[1] == '#')) {
3725 arg = ischop ? 512 : 0;
3735 arg |= 256 + (s - f);
3737 *fpc++ = s - base; /* fieldsize for FETCH */
3738 *fpc++ = FF_DECIMAL;
3741 else if (*s == '0' && s[1] == '#') { /* Zero padded decimals */
3742 arg = ischop ? 512 : 0;
3744 s++; /* skip the '0' first */
3753 arg |= 256 + (s - f);
3755 *fpc++ = s - base; /* fieldsize for FETCH */
3756 *fpc++ = FF_0DECIMAL;
3761 bool ismore = FALSE;
3764 while (*++s == '>') ;
3765 prespace = FF_SPACE;
3767 else if (*s == '|') {
3768 while (*++s == '|') ;
3769 prespace = FF_HALFSPACE;
3774 while (*++s == '<') ;
3777 if (*s == '.' && s[1] == '.' && s[2] == '.') {
3781 *fpc++ = s - base; /* fieldsize for FETCH */
3783 *fpc++ = ischop ? FF_CHECKCHOP : FF_CHECKNL;
3801 { /* need to jump to the next word */
3803 z = WORD_ALIGN - SvCUR(sv) % WORD_ALIGN;
3804 SvGROW(sv, SvCUR(sv) + z + arg * sizeof(U16) + 4);
3805 s = SvPVX(sv) + SvCUR(sv) + z;
3807 Copy(fops, s, arg, U16);
3809 sv_magic(sv, Nullsv, PERL_MAGIC_fm, Nullch, 0);
3814 * The mergesort implementation is by Peter M. Mcilroy <pmcilroy@lucent.com>.
3816 * The original code was written in conjunction with BSD Computer Software
3817 * Research Group at University of California, Berkeley.
3819 * See also: "Optimistic Merge Sort" (SODA '92)
3821 * The integration to Perl is by John P. Linderman <jpl@research.att.com>.
3823 * The code can be distributed under the same terms as Perl itself.
3828 #include <sys/types.h>
3833 #define New(ID,VAR,N,TYPE) VAR=(TYPE *)malloc((N)*sizeof(TYPE))
3834 #define Safefree(VAR) free(VAR)
3835 typedef int (*SVCOMPARE_t) (pTHXo_ SV*, SV*);
3836 #endif /* TESTHARNESS */
3838 typedef char * aptr; /* pointer for arithmetic on sizes */
3839 typedef SV * gptr; /* pointers in our lists */
3841 /* Binary merge internal sort, with a few special mods
3842 ** for the special perl environment it now finds itself in.
3844 ** Things that were once options have been hotwired
3845 ** to values suitable for this use. In particular, we'll always
3846 ** initialize looking for natural runs, we'll always produce stable
3847 ** output, and we'll always do Peter McIlroy's binary merge.
3850 /* Pointer types for arithmetic and storage and convenience casts */
3852 #define APTR(P) ((aptr)(P))
3853 #define GPTP(P) ((gptr *)(P))
3854 #define GPPP(P) ((gptr **)(P))
3857 /* byte offset from pointer P to (larger) pointer Q */
3858 #define BYTEOFF(P, Q) (APTR(Q) - APTR(P))
3860 #define PSIZE sizeof(gptr)
3862 /* If PSIZE is power of 2, make PSHIFT that power, if that helps */
3865 #define PNELEM(P, Q) (BYTEOFF(P,Q) >> (PSHIFT))
3866 #define PNBYTE(N) ((N) << (PSHIFT))
3867 #define PINDEX(P, N) (GPTP(APTR(P) + PNBYTE(N)))
3869 /* Leave optimization to compiler */
3870 #define PNELEM(P, Q) (GPTP(Q) - GPTP(P))
3871 #define PNBYTE(N) ((N) * (PSIZE))
3872 #define PINDEX(P, N) (GPTP(P) + (N))
3875 /* Pointer into other corresponding to pointer into this */
3876 #define POTHER(P, THIS, OTHER) GPTP(APTR(OTHER) + BYTEOFF(THIS,P))
3878 #define FROMTOUPTO(src, dst, lim) do *dst++ = *src++; while(src<lim)
3881 /* Runs are identified by a pointer in the auxilliary list.
3882 ** The pointer is at the start of the list,
3883 ** and it points to the start of the next list.
3884 ** NEXT is used as an lvalue, too.
3887 #define NEXT(P) (*GPPP(P))
3890 /* PTHRESH is the minimum number of pairs with the same sense to justify
3891 ** checking for a run and extending it. Note that PTHRESH counts PAIRS,
3892 ** not just elements, so PTHRESH == 8 means a run of 16.
3897 /* RTHRESH is the number of elements in a run that must compare low
3898 ** to the low element from the opposing run before we justify
3899 ** doing a binary rampup instead of single stepping.
3900 ** In random input, N in a row low should only happen with
3901 ** probability 2^(1-N), so we can risk that we are dealing
3902 ** with orderly input without paying much when we aren't.
3909 ** Overview of algorithm and variables.
3910 ** The array of elements at list1 will be organized into runs of length 2,
3911 ** or runs of length >= 2 * PTHRESH. We only try to form long runs when
3912 ** PTHRESH adjacent pairs compare in the same way, suggesting overall order.
3914 ** Unless otherwise specified, pair pointers address the first of two elements.
3916 ** b and b+1 are a pair that compare with sense ``sense''.
3917 ** b is the ``bottom'' of adjacent pairs that might form a longer run.
3919 ** p2 parallels b in the list2 array, where runs are defined by
3922 ** t represents the ``top'' of the adjacent pairs that might extend
3923 ** the run beginning at b. Usually, t addresses a pair
3924 ** that compares with opposite sense from (b,b+1).
3925 ** However, it may also address a singleton element at the end of list1,
3926 ** or it may be equal to ``last'', the first element beyond list1.
3928 ** r addresses the Nth pair following b. If this would be beyond t,
3929 ** we back it off to t. Only when r is less than t do we consider the
3930 ** run long enough to consider checking.
3932 ** q addresses a pair such that the pairs at b through q already form a run.
3933 ** Often, q will equal b, indicating we only are sure of the pair itself.
3934 ** However, a search on the previous cycle may have revealed a longer run,
3935 ** so q may be greater than b.
3937 ** p is used to work back from a candidate r, trying to reach q,
3938 ** which would mean b through r would be a run. If we discover such a run,
3939 ** we start q at r and try to push it further towards t.
3940 ** If b through r is NOT a run, we detect the wrong order at (p-1,p).
3941 ** In any event, after the check (if any), we have two main cases.
3943 ** 1) Short run. b <= q < p <= r <= t.
3944 ** b through q is a run (perhaps trivial)
3945 ** q through p are uninteresting pairs
3946 ** p through r is a run
3948 ** 2) Long run. b < r <= q < t.
3949 ** b through q is a run (of length >= 2 * PTHRESH)
3951 ** Note that degenerate cases are not only possible, but likely.
3952 ** For example, if the pair following b compares with opposite sense,
3953 ** then b == q < p == r == t.
3958 dynprep(pTHX_ gptr *list1, gptr *list2, size_t nmemb, SVCOMPARE_t cmp)
3961 register gptr *b, *p, *q, *t, *p2;
3962 register gptr c, *last, *r;
3966 last = PINDEX(b, nmemb);
3967 sense = (cmp(aTHX_ *b, *(b+1)) > 0);
3968 for (p2 = list2; b < last; ) {
3969 /* We just started, or just reversed sense.
3970 ** Set t at end of pairs with the prevailing sense.
3972 for (p = b+2, t = p; ++p < last; t = ++p) {
3973 if ((cmp(aTHX_ *t, *p) > 0) != sense) break;
3976 /* Having laid out the playing field, look for long runs */
3978 p = r = b + (2 * PTHRESH);
3979 if (r >= t) p = r = t; /* too short to care about */
3981 while (((cmp(aTHX_ *(p-1), *p) > 0) == sense) &&
3984 /* b through r is a (long) run.
3985 ** Extend it as far as possible.
3988 while (((p += 2) < t) &&
3989 ((cmp(aTHX_ *(p-1), *p) > 0) == sense)) q = p;
3990 r = p = q + 2; /* no simple pairs, no after-run */
3993 if (q > b) { /* run of greater than 2 at b */
3996 /* pick up singleton, if possible */
3998 ((t + 1) == last) &&
3999 ((cmp(aTHX_ *(p-1), *p) > 0) == sense))
4000 savep = r = p = q = last;
4001 p2 = NEXT(p2) = p2 + (p - b);
4002 if (sense) while (b < --p) {
4009 while (q < p) { /* simple pairs */
4010 p2 = NEXT(p2) = p2 + 2;
4017 if (((b = p) == t) && ((t+1) == last)) {
4029 /* Overview of bmerge variables:
4031 ** list1 and list2 address the main and auxiliary arrays.
4032 ** They swap identities after each merge pass.
4033 ** Base points to the original list1, so we can tell if
4034 ** the pointers ended up where they belonged (or must be copied).
4036 ** When we are merging two lists, f1 and f2 are the next elements
4037 ** on the respective lists. l1 and l2 mark the end of the lists.
4038 ** tp2 is the current location in the merged list.
4040 ** p1 records where f1 started.
4041 ** After the merge, a new descriptor is built there.
4043 ** p2 is a ``parallel'' pointer in (what starts as) descriptor space.
4044 ** It is used to identify and delimit the runs.
4046 ** In the heat of determining where q, the greater of the f1/f2 elements,
4047 ** belongs in the other list, b, t and p, represent bottom, top and probe
4048 ** locations, respectively, in the other list.
4049 ** They make convenient temporary pointers in other places.
4053 S_qsortsv(pTHX_ gptr *list1, size_t nmemb, SVCOMPARE_t cmp)
4057 register gptr *f1, *f2, *t, *b, *p, *tp2, *l1, *l2, *q;
4058 gptr *aux, *list2, *p2, *last;
4062 if (nmemb <= 1) return; /* sorted trivially */
4063 New(799,list2,nmemb,gptr); /* allocate auxilliary array */
4065 dynprep(aTHX_ list1, list2, nmemb, cmp);
4066 last = PINDEX(list2, nmemb);
4067 while (NEXT(list2) != last) {
4068 /* More than one run remains. Do some merging to reduce runs. */
4070 for (tp2 = p2 = list2; p2 != last;) {
4071 /* The new first run begins where the old second list ended.
4072 ** Use the p2 ``parallel'' pointer to identify the end of the run.
4076 f2 = l1 = POTHER(t, list2, list1);
4077 if (t != last) t = NEXT(t);
4078 l2 = POTHER(t, list2, list1);
4080 while (f1 < l1 && f2 < l2) {
4081 /* If head 1 is larger than head 2, find ALL the elements
4082 ** in list 2 strictly less than head1, write them all,
4083 ** then head 1. Then compare the new heads, and repeat,
4084 ** until one or both lists are exhausted.
4086 ** In all comparisons (after establishing
4087 ** which head to merge) the item to merge
4088 ** (at pointer q) is the first operand of
4089 ** the comparison. When we want to know
4090 ** if ``q is strictly less than the other'',
4092 ** cmp(q, other) < 0
4093 ** because stability demands that we treat equality
4094 ** as high when q comes from l2, and as low when
4095 ** q was from l1. So we ask the question by doing
4096 ** cmp(q, other) <= sense
4097 ** and make sense == 0 when equality should look low,
4098 ** and -1 when equality should look high.
4102 if (cmp(aTHX_ *f1, *f2) <= 0) {
4103 q = f2; b = f1; t = l1;
4106 q = f1; b = f2; t = l2;
4113 ** Leave t at something strictly
4114 ** greater than q (or at the end of the list),
4115 ** and b at something strictly less than q.
4117 for (i = 1, run = 0 ;;) {
4118 if ((p = PINDEX(b, i)) >= t) {
4120 if (((p = PINDEX(t, -1)) > b) &&
4121 (cmp(aTHX_ *q, *p) <= sense))
4125 } else if (cmp(aTHX_ *q, *p) <= sense) {
4129 if (++run >= RTHRESH) i += i;
4133 /* q is known to follow b and must be inserted before t.
4134 ** Increment b, so the range of possibilities is [b,t).
4135 ** Round binary split down, to favor early appearance.
4136 ** Adjust b and t until q belongs just before t.
4141 p = PINDEX(b, (PNELEM(b, t) - 1) / 2);
4142 if (cmp(aTHX_ *q, *p) <= sense) {
4148 /* Copy all the strictly low elements */
4151 FROMTOUPTO(f2, tp2, t);
4154 FROMTOUPTO(f1, tp2, t);
4160 /* Run out remaining list */
4162 if (f2 < l2) FROMTOUPTO(f2, tp2, l2);
4163 } else FROMTOUPTO(f1, tp2, l1);
4164 p1 = NEXT(p1) = POTHER(tp2, list2, list1);
4169 last = PINDEX(list2, nmemb);
4171 if (base == list2) {
4172 last = PINDEX(list1, nmemb);
4173 FROMTOUPTO(list1, list2, last);
4188 sortcv(pTHXo_ SV *a, SV *b)
4190 I32 oldsaveix = PL_savestack_ix;
4191 I32 oldscopeix = PL_scopestack_ix;
4193 GvSV(PL_firstgv) = a;
4194 GvSV(PL_secondgv) = b;
4195 PL_stack_sp = PL_stack_base;
4198 if (PL_stack_sp != PL_stack_base + 1)
4199 Perl_croak(aTHX_ "Sort subroutine didn't return single value");
4200 if (!SvNIOKp(*PL_stack_sp))
4201 Perl_croak(aTHX_ "Sort subroutine didn't return a numeric value");
4202 result = SvIV(*PL_stack_sp);
4203 while (PL_scopestack_ix > oldscopeix) {
4206 leave_scope(oldsaveix);
4211 sortcv_stacked(pTHXo_ SV *a, SV *b)
4213 I32 oldsaveix = PL_savestack_ix;
4214 I32 oldscopeix = PL_scopestack_ix;
4219 av = (AV*)PL_curpad[0];
4221 av = GvAV(PL_defgv);
4224 if (AvMAX(av) < 1) {
4225 SV** ary = AvALLOC(av);
4226 if (AvARRAY(av) != ary) {
4227 AvMAX(av) += AvARRAY(av) - AvALLOC(av);
4228 SvPVX(av) = (char*)ary;
4230 if (AvMAX(av) < 1) {
4233 SvPVX(av) = (char*)ary;
4240 PL_stack_sp = PL_stack_base;
4243 if (PL_stack_sp != PL_stack_base + 1)
4244 Perl_croak(aTHX_ "Sort subroutine didn't return single value");
4245 if (!SvNIOKp(*PL_stack_sp))
4246 Perl_croak(aTHX_ "Sort subroutine didn't return a numeric value");
4247 result = SvIV(*PL_stack_sp);
4248 while (PL_scopestack_ix > oldscopeix) {
4251 leave_scope(oldsaveix);
4256 sortcv_xsub(pTHXo_ SV *a, SV *b)
4259 I32 oldsaveix = PL_savestack_ix;
4260 I32 oldscopeix = PL_scopestack_ix;
4262 CV *cv=(CV*)PL_sortcop;
4270 (void)(*CvXSUB(cv))(aTHXo_ cv);
4271 if (PL_stack_sp != PL_stack_base + 1)
4272 Perl_croak(aTHX_ "Sort subroutine didn't return single value");
4273 if (!SvNIOKp(*PL_stack_sp))
4274 Perl_croak(aTHX_ "Sort subroutine didn't return a numeric value");
4275 result = SvIV(*PL_stack_sp);
4276 while (PL_scopestack_ix > oldscopeix) {
4279 leave_scope(oldsaveix);
4285 sv_ncmp(pTHXo_ SV *a, SV *b)
4289 return nv1 < nv2 ? -1 : nv1 > nv2 ? 1 : 0;
4293 sv_i_ncmp(pTHXo_ SV *a, SV *b)
4297 return iv1 < iv2 ? -1 : iv1 > iv2 ? 1 : 0;
4299 #define tryCALL_AMAGICbin(left,right,meth,svp) STMT_START { \
4301 if (PL_amagic_generation) { \
4302 if (SvAMAGIC(left)||SvAMAGIC(right))\
4303 *svp = amagic_call(left, \
4311 amagic_ncmp(pTHXo_ register SV *a, register SV *b)
4314 tryCALL_AMAGICbin(a,b,ncmp,&tmpsv);
4319 I32 i = SvIVX(tmpsv);
4329 return sv_ncmp(aTHXo_ a, b);
4333 amagic_i_ncmp(pTHXo_ register SV *a, register SV *b)
4336 tryCALL_AMAGICbin(a,b,ncmp,&tmpsv);
4341 I32 i = SvIVX(tmpsv);
4351 return sv_i_ncmp(aTHXo_ a, b);
4355 amagic_cmp(pTHXo_ register SV *str1, register SV *str2)
4358 tryCALL_AMAGICbin(str1,str2,scmp,&tmpsv);
4363 I32 i = SvIVX(tmpsv);
4373 return sv_cmp(str1, str2);
4377 amagic_cmp_locale(pTHXo_ register SV *str1, register SV *str2)
4380 tryCALL_AMAGICbin(str1,str2,scmp,&tmpsv);
4385 I32 i = SvIVX(tmpsv);
4395 return sv_cmp_locale(str1, str2);
4399 run_user_filter(pTHXo_ int idx, SV *buf_sv, int maxlen)
4401 SV *datasv = FILTER_DATA(idx);
4402 int filter_has_file = IoLINES(datasv);
4403 GV *filter_child_proc = (GV *)IoFMT_GV(datasv);
4404 SV *filter_state = (SV *)IoTOP_GV(datasv);
4405 SV *filter_sub = (SV *)IoBOTTOM_GV(datasv);
4408 /* I was having segfault trouble under Linux 2.2.5 after a
4409 parse error occured. (Had to hack around it with a test
4410 for PL_error_count == 0.) Solaris doesn't segfault --
4411 not sure where the trouble is yet. XXX */
4413 if (filter_has_file) {
4414 len = FILTER_READ(idx+1, buf_sv, maxlen);
4417 if (filter_sub && len >= 0) {
4428 PUSHs(sv_2mortal(newSViv(maxlen)));
4430 PUSHs(filter_state);
4433 count = call_sv(filter_sub, G_SCALAR);
4449 IoLINES(datasv) = 0;
4450 if (filter_child_proc) {
4451 SvREFCNT_dec(filter_child_proc);
4452 IoFMT_GV(datasv) = Nullgv;
4455 SvREFCNT_dec(filter_state);
4456 IoTOP_GV(datasv) = Nullgv;
4459 SvREFCNT_dec(filter_sub);
4460 IoBOTTOM_GV(datasv) = Nullgv;
4462 filter_del(run_user_filter);
4471 sv_cmp_locale_static(pTHXo_ register SV *str1, register SV *str2)
4473 return sv_cmp_locale(str1, str2);
4477 sv_cmp_static(pTHXo_ register SV *str1, register SV *str2)
4479 return sv_cmp(str1, str2);
4482 #endif /* PERL_OBJECT */