3 * Copyright (c) 1991-1997, 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.
23 #define WORD_ALIGN sizeof(U16)
26 #define DOCATCH(o) ((CATCH_GET == TRUE) ? docatch(o) : (o))
29 #define CALLOP this->*PL_op
32 static OP *docatch _((OP *o));
33 static OP *dofindlabel _((OP *o, char *label, OP **opstack, OP **oplimit));
34 static void doparseform _((SV *sv));
35 static I32 dopoptoeval _((I32 startingblock));
36 static I32 dopoptolabel _((char *label));
37 static I32 dopoptoloop _((I32 startingblock));
38 static I32 dopoptosub _((I32 startingblock));
39 static I32 dopoptosub_at _((PERL_CONTEXT *cxstk, I32 startingblock));
40 static void save_lines _((AV *array, SV *sv));
41 static I32 sortcv _((SV *a, SV *b));
42 static void qsortsv _((SV **array, size_t num_elts, I32 (*fun)(SV *a, SV *b)));
43 static OP *doeval _((int gimme, OP** startop));
52 cxix = dopoptosub(cxstack_ix);
56 switch (cxstack[cxix].blk_gimme) {
73 /* XXXX Should store the old value to allow for tie/overload - and
74 restore in regcomp, where marked with XXXX. */
82 register PMOP *pm = (PMOP*)cLOGOP->op_other;
86 MAGIC *mg = Null(MAGIC*);
90 SV *sv = SvRV(tmpstr);
92 mg = mg_find(sv, 'r');
95 regexp *re = (regexp *)mg->mg_obj;
96 ReREFCNT_dec(pm->op_pmregexp);
97 pm->op_pmregexp = ReREFCNT_inc(re);
100 t = SvPV(tmpstr, len);
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))
107 if (pm->op_pmregexp) {
108 ReREFCNT_dec(pm->op_pmregexp);
109 pm->op_pmregexp = Null(REGEXP*); /* crucial if regcomp aborts */
111 if (PL_op->op_flags & OPf_SPECIAL)
112 PL_reginterp_cnt = I32_MAX; /* Mark as safe. */
114 pm->op_pmflags = pm->op_pmpermflags; /* reset case sensitivity */
115 pm->op_pmregexp = CALLREGCOMP(t, t + len, pm);
116 PL_reginterp_cnt = 0; /* XXXX Be extra paranoid - needed
117 inside tie/overload accessors. */
121 #ifndef INCOMPLETE_TAINTS
124 pm->op_pmdynflags |= PMdf_TAINTED;
126 pm->op_pmdynflags &= ~PMdf_TAINTED;
130 if (!pm->op_pmregexp->prelen && PL_curpm)
132 else if (strEQ("\\s+", pm->op_pmregexp->precomp))
133 pm->op_pmflags |= PMf_WHITE;
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;
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;
153 rxres_restore(&cx->sb_rxres, rx);
155 if (cx->sb_iters++) {
156 if (cx->sb_iters > cx->sb_maxiters)
157 DIE("Substitution loop");
159 if (!(cx->sb_rxtainted & 2) && SvTAINTED(TOPs))
160 cx->sb_rxtainted |= 2;
161 sv_catsv(dstr, POPs);
164 if (cx->sb_once || !CALLREGEXEC(rx, s, cx->sb_strend, orig,
165 s == m, Nullsv, NULL,
166 cx->sb_safebase ? 0 : REXEC_COPY_STR))
168 SV *targ = cx->sb_targ;
169 sv_catpvn(dstr, s, cx->sb_strend - s);
171 cx->sb_rxtainted |= RX_MATCH_TAINTED(rx);
173 (void)SvOOK_off(targ);
174 Safefree(SvPVX(targ));
175 SvPVX(targ) = SvPVX(dstr);
176 SvCUR_set(targ, SvCUR(dstr));
177 SvLEN_set(targ, SvLEN(dstr));
181 TAINT_IF(cx->sb_rxtainted & 1);
182 PUSHs(sv_2mortal(newSViv((I32)cx->sb_iters - 1)));
184 (void)SvPOK_only(targ);
185 TAINT_IF(cx->sb_rxtainted);
189 LEAVE_SCOPE(cx->sb_oldsave);
191 RETURNOP(pm->op_next);
194 if (rx->subbase && rx->subbase != orig) {
197 cx->sb_orig = orig = rx->subbase;
199 cx->sb_strend = s + (cx->sb_strend - m);
201 cx->sb_m = m = rx->startp[0];
202 sv_catpvn(dstr, s, m-s);
203 cx->sb_s = rx->endp[0];
204 cx->sb_rxtainted |= RX_MATCH_TAINTED(rx);
205 rxres_save(&cx->sb_rxres, rx);
206 RETURNOP(pm->op_pmreplstart);
210 rxres_save(void **rsp, REGEXP *rx)
215 if (!p || p[1] < rx->nparens) {
216 i = 6 + rx->nparens * 2;
224 *p++ = (UV)rx->subbase;
225 rx->subbase = Nullch;
229 *p++ = (UV)rx->subbeg;
230 *p++ = (UV)rx->subend;
231 for (i = 0; i <= rx->nparens; ++i) {
232 *p++ = (UV)rx->startp[i];
233 *p++ = (UV)rx->endp[i];
238 rxres_restore(void **rsp, REGEXP *rx)
243 Safefree(rx->subbase);
244 rx->subbase = (char*)(*p);
249 rx->subbeg = (char*)(*p++);
250 rx->subend = (char*)(*p++);
251 for (i = 0; i <= rx->nparens; ++i) {
252 rx->startp[i] = (char*)(*p++);
253 rx->endp[i] = (char*)(*p++);
258 rxres_free(void **rsp)
263 Safefree((char*)(*p));
271 djSP; dMARK; dORIGMARK;
272 register SV *tmpForm = *++MARK;
284 bool chopspace = (strchr(PL_chopset, ' ') != Nullch);
290 STRLEN fudge = SvCUR(tmpForm) * (IN_UTF8 ? 3 : 1) + 1;
292 if (!SvMAGICAL(tmpForm) || !SvCOMPILED(tmpForm)) {
293 SvREADONLY_off(tmpForm);
294 doparseform(tmpForm);
297 SvPV_force(PL_formtarget, len);
298 t = SvGROW(PL_formtarget, len + fudge + 1); /* XXX SvCUR bad */
300 f = SvPV(tmpForm, len);
301 /* need to jump to the next word */
302 s = f + len + WORD_ALIGN - SvCUR(tmpForm) % WORD_ALIGN;
311 case FF_LITERAL: arg = fpc[1]; name = "LITERAL"; break;
312 case FF_BLANK: arg = fpc[1]; name = "BLANK"; break;
313 case FF_SKIP: arg = fpc[1]; name = "SKIP"; break;
314 case FF_FETCH: arg = fpc[1]; name = "FETCH"; break;
315 case FF_DECIMAL: arg = fpc[1]; name = "DECIMAL"; break;
317 case FF_CHECKNL: name = "CHECKNL"; break;
318 case FF_CHECKCHOP: name = "CHECKCHOP"; break;
319 case FF_SPACE: name = "SPACE"; break;
320 case FF_HALFSPACE: name = "HALFSPACE"; break;
321 case FF_ITEM: name = "ITEM"; break;
322 case FF_CHOP: name = "CHOP"; break;
323 case FF_LINEGLOB: name = "LINEGLOB"; break;
324 case FF_NEWLINE: name = "NEWLINE"; break;
325 case FF_MORE: name = "MORE"; break;
326 case FF_LINEMARK: name = "LINEMARK"; break;
327 case FF_END: name = "END"; break;
330 PerlIO_printf(PerlIO_stderr(), "%-16s%ld\n", name, (long) arg);
332 PerlIO_printf(PerlIO_stderr(), "%-16s\n", name);
360 if (ckWARN(WARN_SYNTAX))
361 warner(WARN_SYNTAX, "Not enough format arguments");
366 item = s = SvPV(sv, len);
369 itemsize = sv_len_utf8(sv);
370 if (itemsize != len) {
372 if (itemsize > fieldsize) {
373 itemsize = fieldsize;
374 itembytes = itemsize;
375 sv_pos_u2b(sv, &itembytes, 0);
379 send = chophere = s + itembytes;
388 sv_pos_b2u(sv, &itemsize);
392 if (itemsize > fieldsize)
393 itemsize = fieldsize;
394 send = chophere = s + itemsize;
406 item = s = SvPV(sv, len);
409 itemsize = sv_len_utf8(sv);
410 if (itemsize != len) {
412 if (itemsize <= fieldsize) {
413 send = chophere = s + itemsize;
424 itemsize = fieldsize;
425 itembytes = itemsize;
426 sv_pos_u2b(sv, &itembytes, 0);
427 send = chophere = s + itembytes;
428 while (s < send || (s == send && isSPACE(*s))) {
438 if (strchr(PL_chopset, *s))
443 itemsize = chophere - item;
444 sv_pos_b2u(sv, &itemsize);
449 if (itemsize <= fieldsize) {
450 send = chophere = s + itemsize;
461 itemsize = fieldsize;
462 send = chophere = s + itemsize;
463 while (s < send || (s == send && isSPACE(*s))) {
473 if (strchr(PL_chopset, *s))
478 itemsize = chophere - item;
483 arg = fieldsize - itemsize;
492 arg = fieldsize - itemsize;
507 switch (UTF8SKIP(s)) {
518 if ( !((*t++ = *s++) & ~31) )
526 int ch = *t++ = *s++;
529 if ( !((*t++ = *s++) & ~31) )
538 while (*s && isSPACE(*s))
545 item = s = SvPV(sv, len);
558 SvCUR_set(PL_formtarget, t - SvPVX(PL_formtarget));
559 sv_catpvn(PL_formtarget, item, itemsize);
560 SvGROW(PL_formtarget, SvCUR(PL_formtarget) + fudge + 1);
561 t = SvPVX(PL_formtarget) + SvCUR(PL_formtarget);
566 /* If the field is marked with ^ and the value is undefined,
569 if ((arg & 512) && !SvOK(sv)) {
577 /* Formats aren't yet marked for locales, so assume "yes". */
580 sprintf(t, "%#*.*f", (int) fieldsize, (int) arg & 255, value);
582 sprintf(t, "%*.0f", (int) fieldsize, value);
589 while (t-- > linemark && *t == ' ') ;
597 if (arg) { /* repeat until fields exhausted? */
599 SvCUR_set(PL_formtarget, t - SvPVX(PL_formtarget));
600 lines += FmLINES(PL_formtarget);
603 if (strnEQ(linemark, linemark - arg, arg))
604 DIE("Runaway format");
606 FmLINES(PL_formtarget) = lines;
608 RETURNOP(cLISTOP->op_first);
619 arg = fieldsize - itemsize;
626 if (strnEQ(s," ",3)) {
627 while (s > SvPVX(PL_formtarget) && isSPACE(s[-1]))
638 SvCUR_set(PL_formtarget, t - SvPVX(PL_formtarget));
639 FmLINES(PL_formtarget) += lines;
651 if (PL_stack_base + *PL_markstack_ptr == SP) {
653 if (GIMME_V == G_SCALAR)
655 RETURNOP(PL_op->op_next->op_next);
657 PL_stack_sp = PL_stack_base + *PL_markstack_ptr + 1;
658 pp_pushmark(ARGS); /* push dst */
659 pp_pushmark(ARGS); /* push src */
660 ENTER; /* enter outer scope */
664 /* SAVE_DEFSV does *not* suffice here */
665 save_sptr(&THREADSV(0));
667 SAVESPTR(GvSV(PL_defgv));
668 #endif /* USE_THREADS */
669 ENTER; /* enter inner scope */
672 src = PL_stack_base[*PL_markstack_ptr];
677 if (PL_op->op_type == OP_MAPSTART)
678 pp_pushmark(ARGS); /* push top */
679 return ((LOGOP*)PL_op->op_next)->op_other;
684 DIE("panic: mapstart"); /* uses grepstart */
690 I32 diff = (SP - PL_stack_base) - *PL_markstack_ptr;
696 ++PL_markstack_ptr[-1];
698 if (diff > PL_markstack_ptr[-1] - PL_markstack_ptr[-2]) {
699 shift = diff - (PL_markstack_ptr[-1] - PL_markstack_ptr[-2]);
700 count = (SP - PL_stack_base) - PL_markstack_ptr[-1] + 2;
705 PL_markstack_ptr[-1] += shift;
706 *PL_markstack_ptr += shift;
710 dst = PL_stack_base + (PL_markstack_ptr[-2] += diff) - 1;
713 *dst-- = SvTEMP(TOPs) ? POPs : sv_mortalcopy(POPs);
715 LEAVE; /* exit inner scope */
718 if (PL_markstack_ptr[-1] > *PL_markstack_ptr) {
722 (void)POPMARK; /* pop top */
723 LEAVE; /* exit outer scope */
724 (void)POPMARK; /* pop src */
725 items = --*PL_markstack_ptr - PL_markstack_ptr[-1];
726 (void)POPMARK; /* pop dst */
727 SP = PL_stack_base + POPMARK; /* pop original mark */
728 if (gimme == G_SCALAR) {
732 else if (gimme == G_ARRAY)
739 ENTER; /* enter inner scope */
742 src = PL_stack_base[PL_markstack_ptr[-1]];
746 RETURNOP(cLOGOP->op_other);
752 djSP; dMARK; dORIGMARK;
754 SV **myorigmark = ORIGMARK;
760 OP* nextop = PL_op->op_next;
762 if (gimme != G_ARRAY) {
768 SAVEPPTR(PL_sortcop);
769 if (PL_op->op_flags & OPf_STACKED) {
770 if (PL_op->op_flags & OPf_SPECIAL) {
771 OP *kid = cLISTOP->op_first->op_sibling; /* pass pushmark */
772 kid = kUNOP->op_first; /* pass rv2gv */
773 kid = kUNOP->op_first; /* pass leave */
774 PL_sortcop = kid->op_next;
775 stash = PL_curcop->cop_stash;
778 cv = sv_2cv(*++MARK, &stash, &gv, 0);
779 if (!(cv && CvROOT(cv))) {
781 SV *tmpstr = sv_newmortal();
782 gv_efullname3(tmpstr, gv, Nullch);
783 if (cv && CvXSUB(cv))
784 DIE("Xsub \"%s\" called in sort", SvPVX(tmpstr));
785 DIE("Undefined sort subroutine \"%s\" called",
790 DIE("Xsub called in sort");
791 DIE("Undefined subroutine in sort");
793 DIE("Not a CODE reference in sort");
795 PL_sortcop = CvSTART(cv);
796 SAVESPTR(CvROOT(cv)->op_ppaddr);
797 CvROOT(cv)->op_ppaddr = ppaddr[OP_NULL];
800 PL_curpad = AvARRAY((AV*)AvARRAY(CvPADLIST(cv))[1]);
805 stash = PL_curcop->cop_stash;
809 while (MARK < SP) { /* This may or may not shift down one here. */
811 if (*up = *++MARK) { /* Weed out nulls. */
813 if (!PL_sortcop && !SvPOK(*up))
814 (void)sv_2pv(*up, &PL_na);
818 max = --up - myorigmark;
823 bool oldcatch = CATCH_GET;
829 PUSHSTACKi(PERLSI_SORT);
830 if (PL_sortstash != stash) {
831 PL_firstgv = gv_fetchpv("a", TRUE, SVt_PV);
832 PL_secondgv = gv_fetchpv("b", TRUE, SVt_PV);
833 PL_sortstash = stash;
836 SAVESPTR(GvSV(PL_firstgv));
837 SAVESPTR(GvSV(PL_secondgv));
839 PUSHBLOCK(cx, CXt_NULL, PL_stack_base);
840 if (!(PL_op->op_flags & OPf_SPECIAL)) {
841 bool hasargs = FALSE;
842 cx->cx_type = CXt_SUB;
843 cx->blk_gimme = G_SCALAR;
846 (void)SvREFCNT_inc(cv); /* in preparation for POPSUB */
848 PL_sortcxix = cxstack_ix;
849 qsortsv((myorigmark+1), max, FUNC_NAME_TO_PTR(sortcv));
851 POPBLOCK(cx,PL_curpm);
858 MEXTEND(SP, 20); /* Can't afford stack realloc on signal. */
859 qsortsv(ORIGMARK+1, max,
860 (PL_op->op_private & OPpLOCALE)
861 ? FUNC_NAME_TO_PTR(sv_cmp_locale)
862 : FUNC_NAME_TO_PTR(sv_cmp));
866 PL_stack_sp = ORIGMARK + max;
874 if (GIMME == G_ARRAY)
875 return cCONDOP->op_true;
876 return SvTRUEx(PAD_SV(PL_op->op_targ)) ? cCONDOP->op_false : cCONDOP->op_true;
883 if (GIMME == G_ARRAY) {
884 RETURNOP(((CONDOP*)cUNOP->op_first)->op_false);
888 SV *targ = PAD_SV(PL_op->op_targ);
890 if ((PL_op->op_private & OPpFLIP_LINENUM)
891 ? (PL_last_in_gv && SvIV(sv) == (IV)IoLINES(GvIOp(PL_last_in_gv)))
893 sv_setiv(PAD_SV(cUNOP->op_first->op_targ), 1);
894 if (PL_op->op_flags & OPf_SPECIAL) {
902 RETURNOP(((CONDOP*)cUNOP->op_first)->op_false);
915 if (GIMME == G_ARRAY) {
921 if (SvNIOKp(left) || !SvPOKp(left) ||
922 (looks_like_number(left) && *SvPVX(left) != '0') )
924 if (SvNV(left) < IV_MIN || SvNV(right) >= IV_MAX)
925 croak("Range iterator outside integer range");
929 EXTEND_MORTAL(max - i + 1);
930 EXTEND(SP, max - i + 1);
933 sv = sv_2mortal(newSViv(i++));
938 SV *final = sv_mortalcopy(right);
940 char *tmps = SvPV(final, len);
942 sv = sv_mortalcopy(left);
943 SvPV_force(sv,PL_na);
944 while (!SvNIOKp(sv) && SvCUR(sv) <= len) {
946 if (strEQ(SvPVX(sv),tmps))
948 sv = sv_2mortal(newSVsv(sv));
955 SV *targ = PAD_SV(cUNOP->op_first->op_targ);
957 if ((PL_op->op_private & OPpFLIP_LINENUM)
958 ? (PL_last_in_gv && SvIV(sv) == (IV)IoLINES(GvIOp(PL_last_in_gv)))
960 sv_setiv(PAD_SV(((UNOP*)cUNOP->op_first)->op_first->op_targ), 0);
961 sv_catpv(targ, "E0");
972 dopoptolabel(char *label)
976 register PERL_CONTEXT *cx;
978 for (i = cxstack_ix; i >= 0; i--) {
980 switch (CxTYPE(cx)) {
982 if (ckWARN(WARN_UNSAFE))
983 warner(WARN_UNSAFE, "Exiting substitution via %s",
984 op_name[PL_op->op_type]);
987 if (ckWARN(WARN_UNSAFE))
988 warner(WARN_UNSAFE, "Exiting subroutine via %s",
989 op_name[PL_op->op_type]);
992 if (ckWARN(WARN_UNSAFE))
993 warner(WARN_UNSAFE, "Exiting eval via %s",
994 op_name[PL_op->op_type]);
997 if (ckWARN(WARN_UNSAFE))
998 warner(WARN_UNSAFE, "Exiting pseudo-block via %s",
999 op_name[PL_op->op_type]);
1002 if (!cx->blk_loop.label ||
1003 strNE(label, cx->blk_loop.label) ) {
1004 DEBUG_l(deb("(Skipping label #%ld %s)\n",
1005 (long)i, cx->blk_loop.label));
1008 DEBUG_l( deb("(Found label #%ld %s)\n", (long)i, label));
1018 I32 gimme = block_gimme();
1019 return (gimme == G_VOID) ? G_SCALAR : gimme;
1028 cxix = dopoptosub(cxstack_ix);
1032 switch (cxstack[cxix].blk_gimme) {
1040 croak("panic: bad gimme: %d\n", cxstack[cxix].blk_gimme);
1047 dopoptosub(I32 startingblock)
1050 return dopoptosub_at(cxstack, startingblock);
1054 dopoptosub_at(PERL_CONTEXT *cxstk, I32 startingblock)
1058 register PERL_CONTEXT *cx;
1059 for (i = startingblock; i >= 0; i--) {
1061 switch (CxTYPE(cx)) {
1066 DEBUG_l( deb("(Found sub #%ld)\n", (long)i));
1074 dopoptoeval(I32 startingblock)
1078 register PERL_CONTEXT *cx;
1079 for (i = startingblock; i >= 0; i--) {
1081 switch (CxTYPE(cx)) {
1085 DEBUG_l( deb("(Found eval #%ld)\n", (long)i));
1093 dopoptoloop(I32 startingblock)
1097 register PERL_CONTEXT *cx;
1098 for (i = startingblock; i >= 0; i--) {
1100 switch (CxTYPE(cx)) {
1102 if (ckWARN(WARN_UNSAFE))
1103 warner(WARN_UNSAFE, "Exiting substitution via %s",
1104 op_name[PL_op->op_type]);
1107 if (ckWARN(WARN_UNSAFE))
1108 warner(WARN_UNSAFE, "Exiting subroutine via %s",
1109 op_name[PL_op->op_type]);
1112 if (ckWARN(WARN_UNSAFE))
1113 warner(WARN_UNSAFE, "Exiting eval via %s",
1114 op_name[PL_op->op_type]);
1117 if (ckWARN(WARN_UNSAFE))
1118 warner(WARN_UNSAFE, "Exiting pseudo-block via %s",
1119 op_name[PL_op->op_type]);
1122 DEBUG_l( deb("(Found loop #%ld)\n", (long)i));
1133 register PERL_CONTEXT *cx;
1137 while (cxstack_ix > cxix) {
1138 cx = &cxstack[cxstack_ix];
1139 DEBUG_l(PerlIO_printf(Perl_debug_log, "Unwinding block %ld, type %s\n",
1140 (long) cxstack_ix, block_type[CxTYPE(cx)]));
1141 /* Note: we don't need to restore the base context info till the end. */
1142 switch (CxTYPE(cx)) {
1145 continue; /* not break */
1163 die_where(char *message)
1168 register PERL_CONTEXT *cx;
1173 if (PL_in_eval & 4) {
1175 STRLEN klen = strlen(message);
1177 svp = hv_fetch(ERRHV, message, klen, TRUE);
1180 static char prefix[] = "\t(in cleanup) ";
1182 sv_upgrade(*svp, SVt_IV);
1183 (void)SvIOK_only(*svp);
1186 SvGROW(err, SvCUR(err)+sizeof(prefix)+klen);
1187 sv_catpvn(err, prefix, sizeof(prefix)-1);
1188 sv_catpvn(err, message, klen);
1194 sv_setpv(ERRSV, message);
1197 message = SvPVx(ERRSV, PL_na);
1199 while ((cxix = dopoptoeval(cxstack_ix)) < 0 && PL_curstackinfo->si_prev) {
1207 if (cxix < cxstack_ix)
1210 POPBLOCK(cx,PL_curpm);
1211 if (CxTYPE(cx) != CXt_EVAL) {
1212 PerlIO_printf(PerlIO_stderr(), "panic: die %s", message);
1217 if (gimme == G_SCALAR)
1218 *++newsp = &PL_sv_undef;
1219 PL_stack_sp = newsp;
1223 if (optype == OP_REQUIRE) {
1224 char* msg = SvPVx(ERRSV, PL_na);
1225 DIE("%s", *msg ? msg : "Compilation failed in require");
1227 return pop_return();
1231 message = SvPVx(ERRSV, PL_na);
1232 PerlIO_printf(PerlIO_stderr(), "%s",message);
1233 PerlIO_flush(PerlIO_stderr());
1242 if (SvTRUE(left) != SvTRUE(right))
1254 RETURNOP(cLOGOP->op_other);
1263 RETURNOP(cLOGOP->op_other);
1269 register I32 cxix = dopoptosub(cxstack_ix);
1270 register PERL_CONTEXT *cx;
1271 register PERL_CONTEXT *ccstack = cxstack;
1272 PERL_SI *top_si = PL_curstackinfo;
1283 /* we may be in a higher stacklevel, so dig down deeper */
1284 while (cxix < 0 && top_si->si_type != PERLSI_MAIN) {
1285 top_si = top_si->si_prev;
1286 ccstack = top_si->si_cxstack;
1287 cxix = dopoptosub_at(ccstack, top_si->si_cxix);
1290 if (GIMME != G_ARRAY)
1294 if (PL_DBsub && cxix >= 0 &&
1295 ccstack[cxix].blk_sub.cv == GvCV(PL_DBsub))
1299 cxix = dopoptosub_at(ccstack, cxix - 1);
1302 cx = &ccstack[cxix];
1303 if (CxTYPE(cx) == CXt_SUB) {
1304 dbcxix = dopoptosub_at(ccstack, cxix - 1);
1305 /* We expect that ccstack[dbcxix] is CXt_SUB, anyway, the
1306 field below is defined for any cx. */
1307 if (PL_DBsub && dbcxix >= 0 && ccstack[dbcxix].blk_sub.cv == GvCV(PL_DBsub))
1308 cx = &ccstack[dbcxix];
1311 if (GIMME != G_ARRAY) {
1312 hv = cx->blk_oldcop->cop_stash;
1314 PUSHs(&PL_sv_undef);
1317 sv_setpv(TARG, HvNAME(hv));
1323 hv = cx->blk_oldcop->cop_stash;
1325 PUSHs(&PL_sv_undef);
1327 PUSHs(sv_2mortal(newSVpv(HvNAME(hv), 0)));
1328 PUSHs(sv_2mortal(newSVpv(SvPVX(GvSV(cx->blk_oldcop->cop_filegv)), 0)));
1329 PUSHs(sv_2mortal(newSViv((I32)cx->blk_oldcop->cop_line)));
1332 if (CxTYPE(cx) == CXt_SUB) { /* So is ccstack[dbcxix]. */
1334 gv_efullname3(sv, CvGV(ccstack[cxix].blk_sub.cv), Nullch);
1335 PUSHs(sv_2mortal(sv));
1336 PUSHs(sv_2mortal(newSViv((I32)cx->blk_sub.hasargs)));
1339 PUSHs(sv_2mortal(newSVpv("(eval)",0)));
1340 PUSHs(sv_2mortal(newSViv(0)));
1342 gimme = (I32)cx->blk_gimme;
1343 if (gimme == G_VOID)
1344 PUSHs(&PL_sv_undef);
1346 PUSHs(sv_2mortal(newSViv(gimme & G_ARRAY)));
1347 if (CxTYPE(cx) == CXt_EVAL) {
1348 if (cx->blk_eval.old_op_type == OP_ENTEREVAL) {
1349 PUSHs(cx->blk_eval.cur_text);
1352 else if (cx->blk_eval.old_name) { /* Try blocks have old_name == 0. */
1353 /* Require, put the name. */
1354 PUSHs(sv_2mortal(newSVpv(cx->blk_eval.old_name, 0)));
1358 else if (CxTYPE(cx) == CXt_SUB &&
1359 cx->blk_sub.hasargs &&
1360 PL_curcop->cop_stash == PL_debstash)
1362 AV *ary = cx->blk_sub.argarray;
1363 int off = AvARRAY(ary) - AvALLOC(ary);
1367 PL_dbargs = GvAV(gv_AVadd(tmpgv = gv_fetchpv("DB::args", TRUE,
1370 AvREAL_off(PL_dbargs); /* XXX Should be REIFY */
1373 if (AvMAX(PL_dbargs) < AvFILLp(ary) + off)
1374 av_extend(PL_dbargs, AvFILLp(ary) + off);
1375 Copy(AvALLOC(ary), AvARRAY(PL_dbargs), AvFILLp(ary) + 1 + off, SV*);
1376 AvFILLp(PL_dbargs) = AvFILLp(ary) + off;
1382 sortcv(SV *a, SV *b)
1385 I32 oldsaveix = PL_savestack_ix;
1386 I32 oldscopeix = PL_scopestack_ix;
1388 GvSV(PL_firstgv) = a;
1389 GvSV(PL_secondgv) = b;
1390 PL_stack_sp = PL_stack_base;
1393 if (PL_stack_sp != PL_stack_base + 1)
1394 croak("Sort subroutine didn't return single value");
1395 if (!SvNIOKp(*PL_stack_sp))
1396 croak("Sort subroutine didn't return a numeric value");
1397 result = SvIV(*PL_stack_sp);
1398 while (PL_scopestack_ix > oldscopeix) {
1401 leave_scope(oldsaveix);
1414 sv_reset(tmps, PL_curcop->cop_stash);
1426 PL_curcop = (COP*)PL_op;
1427 TAINT_NOT; /* Each statement is presumed innocent */
1428 PL_stack_sp = PL_stack_base + cxstack[cxstack_ix].blk_oldsp;
1431 if (PL_op->op_private || SvIV(PL_DBsingle) || SvIV(PL_DBsignal) || SvIV(PL_DBtrace))
1435 register PERL_CONTEXT *cx;
1436 I32 gimme = G_ARRAY;
1443 DIE("No DB::DB routine defined");
1445 if (CvDEPTH(cv) >= 1 && !(PL_debug & (1<<30))) /* don't do recursive DB::DB call */
1457 push_return(PL_op->op_next);
1458 PUSHBLOCK(cx, CXt_SUB, SP);
1461 (void)SvREFCNT_inc(cv);
1462 SAVESPTR(PL_curpad);
1463 PL_curpad = AvARRAY((AV*)*av_fetch(CvPADLIST(cv),1,FALSE));
1464 RETURNOP(CvSTART(cv));
1478 register PERL_CONTEXT *cx;
1479 I32 gimme = GIMME_V;
1486 if (PL_op->op_flags & OPf_SPECIAL)
1487 svp = save_threadsv(PL_op->op_targ); /* per-thread variable */
1489 #endif /* USE_THREADS */
1490 if (PL_op->op_targ) {
1491 svp = &PL_curpad[PL_op->op_targ]; /* "my" variable */
1496 (void)save_scalar(gv);
1497 svp = &GvSV(gv); /* symbol table variable */
1502 PUSHBLOCK(cx, CXt_LOOP, SP);
1503 PUSHLOOP(cx, svp, MARK);
1504 if (PL_op->op_flags & OPf_STACKED) {
1505 cx->blk_loop.iterary = (AV*)SvREFCNT_inc(POPs);
1506 if (SvTYPE(cx->blk_loop.iterary) != SVt_PVAV) {
1508 if (SvNIOKp(sv) || !SvPOKp(sv) ||
1509 (looks_like_number(sv) && *SvPVX(sv) != '0')) {
1510 if (SvNV(sv) < IV_MIN ||
1511 SvNV((SV*)cx->blk_loop.iterary) >= IV_MAX)
1512 croak("Range iterator outside integer range");
1513 cx->blk_loop.iterix = SvIV(sv);
1514 cx->blk_loop.itermax = SvIV((SV*)cx->blk_loop.iterary);
1517 cx->blk_loop.iterlval = newSVsv(sv);
1521 cx->blk_loop.iterary = PL_curstack;
1522 AvFILLp(PL_curstack) = SP - PL_stack_base;
1523 cx->blk_loop.iterix = MARK - PL_stack_base;
1532 register PERL_CONTEXT *cx;
1533 I32 gimme = GIMME_V;
1539 PUSHBLOCK(cx, CXt_LOOP, SP);
1540 PUSHLOOP(cx, 0, SP);
1548 register PERL_CONTEXT *cx;
1549 struct block_loop cxloop;
1557 POPLOOP1(cx); /* Delay POPLOOP2 until stack values are safe */
1560 if (gimme == G_VOID)
1562 else if (gimme == G_SCALAR) {
1564 *++newsp = sv_mortalcopy(*SP);
1566 *++newsp = &PL_sv_undef;
1570 *++newsp = sv_mortalcopy(*++mark);
1571 TAINT_NOT; /* Each item is independent */
1577 POPLOOP2(); /* Stack values are safe: release loop vars ... */
1578 PL_curpm = newpm; /* ... and pop $1 et al */
1590 register PERL_CONTEXT *cx;
1591 struct block_sub cxsub;
1592 bool popsub2 = FALSE;
1598 if (PL_curstackinfo->si_type == PERLSI_SORT) {
1599 if (cxstack_ix == PL_sortcxix || dopoptosub(cxstack_ix) <= PL_sortcxix) {
1600 if (cxstack_ix > PL_sortcxix)
1601 dounwind(PL_sortcxix);
1602 AvARRAY(PL_curstack)[1] = *SP;
1603 PL_stack_sp = PL_stack_base + 1;
1608 cxix = dopoptosub(cxstack_ix);
1610 DIE("Can't return outside a subroutine");
1611 if (cxix < cxstack_ix)
1615 switch (CxTYPE(cx)) {
1617 POPSUB1(cx); /* Delay POPSUB2 until stack values are safe */
1622 if (optype == OP_REQUIRE &&
1623 (MARK == SP || (gimme == G_SCALAR && !SvTRUE(*SP))) )
1625 /* Unassume the success we assumed earlier. */
1626 char *name = cx->blk_eval.old_name;
1627 (void)hv_delete(GvHVn(PL_incgv), name, strlen(name), G_DISCARD);
1628 DIE("%s did not return a true value", name);
1632 DIE("panic: return");
1636 if (gimme == G_SCALAR) {
1639 if (cxsub.cv && CvDEPTH(cxsub.cv) > 1) {
1641 *++newsp = SvREFCNT_inc(*SP);
1646 *++newsp = sv_mortalcopy(*SP);
1649 *++newsp = (SvTEMP(*SP)) ? *SP : sv_mortalcopy(*SP);
1651 *++newsp = sv_mortalcopy(*SP);
1653 *++newsp = &PL_sv_undef;
1655 else if (gimme == G_ARRAY) {
1656 while (++MARK <= SP) {
1657 *++newsp = (popsub2 && SvTEMP(*MARK))
1658 ? *MARK : sv_mortalcopy(*MARK);
1659 TAINT_NOT; /* Each item is independent */
1662 PL_stack_sp = newsp;
1664 /* Stack values are safe: */
1666 POPSUB2(); /* release CV and @_ ... */
1668 PL_curpm = newpm; /* ... and pop $1 et al */
1671 return pop_return();
1678 register PERL_CONTEXT *cx;
1679 struct block_loop cxloop;
1680 struct block_sub cxsub;
1687 SV **mark = PL_stack_base + cxstack[cxstack_ix].blk_oldsp;
1689 if (PL_op->op_flags & OPf_SPECIAL) {
1690 cxix = dopoptoloop(cxstack_ix);
1692 DIE("Can't \"last\" outside a block");
1695 cxix = dopoptolabel(cPVOP->op_pv);
1697 DIE("Label not found for \"last %s\"", cPVOP->op_pv);
1699 if (cxix < cxstack_ix)
1703 switch (CxTYPE(cx)) {
1705 POPLOOP1(cx); /* Delay POPLOOP2 until stack values are safe */
1707 nextop = cxloop.last_op->op_next;
1710 POPSUB1(cx); /* Delay POPSUB2 until stack values are safe */
1712 nextop = pop_return();
1716 nextop = pop_return();
1723 if (gimme == G_SCALAR) {
1725 *++newsp = ((pop2 == CXt_SUB) && SvTEMP(*SP))
1726 ? *SP : sv_mortalcopy(*SP);
1728 *++newsp = &PL_sv_undef;
1730 else if (gimme == G_ARRAY) {
1731 while (++MARK <= SP) {
1732 *++newsp = ((pop2 == CXt_SUB) && SvTEMP(*MARK))
1733 ? *MARK : sv_mortalcopy(*MARK);
1734 TAINT_NOT; /* Each item is independent */
1740 /* Stack values are safe: */
1743 POPLOOP2(); /* release loop vars ... */
1747 POPSUB2(); /* release CV and @_ ... */
1750 PL_curpm = newpm; /* ... and pop $1 et al */
1759 register PERL_CONTEXT *cx;
1762 if (PL_op->op_flags & OPf_SPECIAL) {
1763 cxix = dopoptoloop(cxstack_ix);
1765 DIE("Can't \"next\" outside a block");
1768 cxix = dopoptolabel(cPVOP->op_pv);
1770 DIE("Label not found for \"next %s\"", cPVOP->op_pv);
1772 if (cxix < cxstack_ix)
1776 oldsave = PL_scopestack[PL_scopestack_ix - 1];
1777 LEAVE_SCOPE(oldsave);
1778 return cx->blk_loop.next_op;
1784 register PERL_CONTEXT *cx;
1787 if (PL_op->op_flags & OPf_SPECIAL) {
1788 cxix = dopoptoloop(cxstack_ix);
1790 DIE("Can't \"redo\" outside a block");
1793 cxix = dopoptolabel(cPVOP->op_pv);
1795 DIE("Label not found for \"redo %s\"", cPVOP->op_pv);
1797 if (cxix < cxstack_ix)
1801 oldsave = PL_scopestack[PL_scopestack_ix - 1];
1802 LEAVE_SCOPE(oldsave);
1803 return cx->blk_loop.redo_op;
1807 dofindlabel(OP *o, char *label, OP **opstack, OP **oplimit)
1811 static char too_deep[] = "Target of goto is too deeply nested";
1815 if (o->op_type == OP_LEAVE ||
1816 o->op_type == OP_SCOPE ||
1817 o->op_type == OP_LEAVELOOP ||
1818 o->op_type == OP_LEAVETRY)
1820 *ops++ = cUNOPo->op_first;
1825 if (o->op_flags & OPf_KIDS) {
1827 /* First try all the kids at this level, since that's likeliest. */
1828 for (kid = cUNOPo->op_first; kid; kid = kid->op_sibling) {
1829 if ((kid->op_type == OP_NEXTSTATE || kid->op_type == OP_DBSTATE) &&
1830 kCOP->cop_label && strEQ(kCOP->cop_label, label))
1833 for (kid = cUNOPo->op_first; kid; kid = kid->op_sibling) {
1834 if (kid == PL_lastgotoprobe)
1836 if ((kid->op_type == OP_NEXTSTATE || kid->op_type == OP_DBSTATE) &&
1838 (ops[-1]->op_type != OP_NEXTSTATE &&
1839 ops[-1]->op_type != OP_DBSTATE)))
1841 if (o = dofindlabel(kid, label, ops, oplimit))
1851 return pp_goto(ARGS);
1860 register PERL_CONTEXT *cx;
1861 #define GOTO_DEPTH 64
1862 OP *enterops[GOTO_DEPTH];
1864 int do_dump = (PL_op->op_type == OP_DUMP);
1867 if (PL_op->op_flags & OPf_STACKED) {
1870 /* This egregious kludge implements goto &subroutine */
1871 if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVCV) {
1873 register PERL_CONTEXT *cx;
1874 CV* cv = (CV*)SvRV(sv);
1878 int arg_was_real = 0;
1881 if (!CvROOT(cv) && !CvXSUB(cv)) {
1886 /* autoloaded stub? */
1887 if (cv != GvCV(gv) && (cv = GvCV(gv)))
1889 autogv = gv_autoload4(GvSTASH(gv), GvNAME(gv),
1890 GvNAMELEN(gv), FALSE);
1891 if (autogv && (cv = GvCV(autogv)))
1893 tmpstr = sv_newmortal();
1894 gv_efullname3(tmpstr, gv, Nullch);
1895 DIE("Goto undefined subroutine &%s",SvPVX(tmpstr));
1897 DIE("Goto undefined subroutine");
1900 /* First do some returnish stuff. */
1901 cxix = dopoptosub(cxstack_ix);
1903 DIE("Can't goto subroutine outside a subroutine");
1904 if (cxix < cxstack_ix)
1907 if (CxTYPE(cx) == CXt_EVAL && cx->blk_eval.old_op_type == OP_ENTEREVAL)
1908 DIE("Can't goto subroutine from an eval-string");
1910 if (CxTYPE(cx) == CXt_SUB &&
1911 cx->blk_sub.hasargs) { /* put @_ back onto stack */
1912 AV* av = cx->blk_sub.argarray;
1914 items = AvFILLp(av) + 1;
1916 EXTEND(PL_stack_sp, items); /* @_ could have been extended. */
1917 Copy(AvARRAY(av), PL_stack_sp, items, SV*);
1918 PL_stack_sp += items;
1920 SvREFCNT_dec(GvAV(PL_defgv));
1921 GvAV(PL_defgv) = cx->blk_sub.savearray;
1922 #endif /* USE_THREADS */
1925 AvREAL_off(av); /* so av_clear() won't clobber elts */
1929 else if (CvXSUB(cv)) { /* put GvAV(defgv) back onto stack */
1933 av = (AV*)PL_curpad[0];
1935 av = GvAV(PL_defgv);
1937 items = AvFILLp(av) + 1;
1939 EXTEND(PL_stack_sp, items); /* @_ could have been extended. */
1940 Copy(AvARRAY(av), PL_stack_sp, items, SV*);
1941 PL_stack_sp += items;
1943 if (CxTYPE(cx) == CXt_SUB &&
1944 !(CvDEPTH(cx->blk_sub.cv) = cx->blk_sub.olddepth))
1945 SvREFCNT_dec(cx->blk_sub.cv);
1946 oldsave = PL_scopestack[PL_scopestack_ix - 1];
1947 LEAVE_SCOPE(oldsave);
1949 /* Now do some callish stuff. */
1952 if (CvOLDSTYLE(cv)) {
1953 I32 (*fp3)_((int,int,int));
1958 fp3 = (I32(*)_((int,int,int)))CvXSUB(cv);
1959 items = (*fp3)(CvXSUBANY(cv).any_i32,
1960 mark - PL_stack_base + 1,
1962 SP = PL_stack_base + items;
1968 PL_stack_sp--; /* There is no cv arg. */
1969 /* Push a mark for the start of arglist */
1971 (void)(*CvXSUB(cv))(cv _PERL_OBJECT_THIS);
1972 /* Pop the current context like a decent sub should */
1973 POPBLOCK(cx, PL_curpm);
1974 /* Do _not_ use PUTBACK, keep the XSUB's return stack! */
1977 return pop_return();
1980 AV* padlist = CvPADLIST(cv);
1981 SV** svp = AvARRAY(padlist);
1982 if (CxTYPE(cx) == CXt_EVAL) {
1983 PL_in_eval = cx->blk_eval.old_in_eval;
1984 PL_eval_root = cx->blk_eval.old_eval_root;
1985 cx->cx_type = CXt_SUB;
1986 cx->blk_sub.hasargs = 0;
1988 cx->blk_sub.cv = cv;
1989 cx->blk_sub.olddepth = CvDEPTH(cv);
1991 if (CvDEPTH(cv) < 2)
1992 (void)SvREFCNT_inc(cv);
1993 else { /* save temporaries on recursion? */
1994 if (CvDEPTH(cv) == 100 && ckWARN(WARN_RECURSION))
1995 sub_crush_depth(cv);
1996 if (CvDEPTH(cv) > AvFILLp(padlist)) {
1997 AV *newpad = newAV();
1998 SV **oldpad = AvARRAY(svp[CvDEPTH(cv)-1]);
1999 I32 ix = AvFILLp((AV*)svp[1]);
2000 svp = AvARRAY(svp[0]);
2001 for ( ;ix > 0; ix--) {
2002 if (svp[ix] != &PL_sv_undef) {
2003 char *name = SvPVX(svp[ix]);
2004 if ((SvFLAGS(svp[ix]) & SVf_FAKE)
2007 /* outer lexical or anon code */
2008 av_store(newpad, ix,
2009 SvREFCNT_inc(oldpad[ix]) );
2011 else { /* our own lexical */
2013 av_store(newpad, ix, sv = (SV*)newAV());
2014 else if (*name == '%')
2015 av_store(newpad, ix, sv = (SV*)newHV());
2017 av_store(newpad, ix, sv = NEWSV(0,0));
2022 av_store(newpad, ix, sv = NEWSV(0,0));
2026 if (cx->blk_sub.hasargs) {
2029 av_store(newpad, 0, (SV*)av);
2030 AvFLAGS(av) = AVf_REIFY;
2032 av_store(padlist, CvDEPTH(cv), (SV*)newpad);
2033 AvFILLp(padlist) = CvDEPTH(cv);
2034 svp = AvARRAY(padlist);
2038 if (!cx->blk_sub.hasargs) {
2039 AV* av = (AV*)PL_curpad[0];
2041 items = AvFILLp(av) + 1;
2043 /* Mark is at the end of the stack. */
2045 Copy(AvARRAY(av), SP + 1, items, SV*);
2050 #endif /* USE_THREADS */
2051 SAVESPTR(PL_curpad);
2052 PL_curpad = AvARRAY((AV*)svp[CvDEPTH(cv)]);
2054 if (cx->blk_sub.hasargs)
2055 #endif /* USE_THREADS */
2057 AV* av = (AV*)PL_curpad[0];
2061 cx->blk_sub.savearray = GvAV(PL_defgv);
2062 GvAV(PL_defgv) = (AV*)SvREFCNT_inc(av);
2063 #endif /* USE_THREADS */
2064 cx->blk_sub.argarray = av;
2067 if (items >= AvMAX(av) + 1) {
2069 if (AvARRAY(av) != ary) {
2070 AvMAX(av) += AvARRAY(av) - AvALLOC(av);
2071 SvPVX(av) = (char*)ary;
2073 if (items >= AvMAX(av) + 1) {
2074 AvMAX(av) = items - 1;
2075 Renew(ary,items+1,SV*);
2077 SvPVX(av) = (char*)ary;
2080 Copy(mark,AvARRAY(av),items,SV*);
2081 AvFILLp(av) = items - 1;
2082 /* preserve @_ nature */
2093 if (PERLDB_SUB) { /* Checking curstash breaks DProf. */
2095 * We do not care about using sv to call CV;
2096 * it's for informational purposes only.
2098 SV *sv = GvSV(PL_DBsub);
2101 if (PERLDB_SUB_NN) {
2102 SvIVX(sv) = (IV)cv; /* Already upgraded, saved */
2105 gv_efullname3(sv, CvGV(cv), Nullch);
2108 && (gotocv = perl_get_cv("DB::goto", FALSE)) ) {
2109 PUSHMARK( PL_stack_sp );
2110 perl_call_sv((SV*)gotocv, G_SCALAR | G_NODEBUG);
2114 RETURNOP(CvSTART(cv));
2118 label = SvPV(sv,PL_na);
2120 else if (PL_op->op_flags & OPf_SPECIAL) {
2122 DIE("goto must have label");
2125 label = cPVOP->op_pv;
2127 if (label && *label) {
2132 PL_lastgotoprobe = 0;
2134 for (ix = cxstack_ix; ix >= 0; ix--) {
2136 switch (CxTYPE(cx)) {
2138 gotoprobe = PL_eval_root; /* XXX not good for nested eval */
2141 gotoprobe = cx->blk_oldcop->op_sibling;
2147 gotoprobe = cx->blk_oldcop->op_sibling;
2149 gotoprobe = PL_main_root;
2152 if (CvDEPTH(cx->blk_sub.cv)) {
2153 gotoprobe = CvROOT(cx->blk_sub.cv);
2158 DIE("Can't \"goto\" outside a block");
2162 gotoprobe = PL_main_root;
2165 retop = dofindlabel(gotoprobe, label,
2166 enterops, enterops + GOTO_DEPTH);
2169 PL_lastgotoprobe = gotoprobe;
2172 DIE("Can't find label %s", label);
2174 /* pop unwanted frames */
2176 if (ix < cxstack_ix) {
2183 oldsave = PL_scopestack[PL_scopestack_ix];
2184 LEAVE_SCOPE(oldsave);
2187 /* push wanted frames */
2189 if (*enterops && enterops[1]) {
2191 for (ix = 1; enterops[ix]; ix++) {
2192 PL_op = enterops[ix];
2193 /* Eventually we may want to stack the needed arguments
2194 * for each op. For now, we punt on the hard ones. */
2195 if (PL_op->op_type == OP_ENTERITER)
2196 DIE("Can't \"goto\" into the middle of a foreach loop",
2198 (CALLOP->op_ppaddr)(ARGS);
2206 if (!retop) retop = PL_main_start;
2208 PL_restartop = retop;
2209 PL_do_undump = TRUE;
2213 PL_restartop = 0; /* hmm, must be GNU unexec().. */
2214 PL_do_undump = FALSE;
2230 if (anum == 1 && VMSISH_EXIT)
2235 PUSHs(&PL_sv_undef);
2243 double value = SvNVx(GvSV(cCOP->cop_gv));
2244 register I32 match = I_32(value);
2247 if (((double)match) > value)
2248 --match; /* was fractional--truncate other way */
2250 match -= cCOP->uop.scop.scop_offset;
2253 else if (match > cCOP->uop.scop.scop_max)
2254 match = cCOP->uop.scop.scop_max;
2255 PL_op = cCOP->uop.scop.scop_next[match];
2265 PL_op = PL_op->op_next; /* can't assume anything */
2267 match = *(SvPVx(GvSV(cCOP->cop_gv), PL_na)) & 255;
2268 match -= cCOP->uop.scop.scop_offset;
2271 else if (match > cCOP->uop.scop.scop_max)
2272 match = cCOP->uop.scop.scop_max;
2273 PL_op = cCOP->uop.scop.scop_next[match];
2282 save_lines(AV *array, SV *sv)
2284 register char *s = SvPVX(sv);
2285 register char *send = SvPVX(sv) + SvCUR(sv);
2287 register I32 line = 1;
2289 while (s && s < send) {
2290 SV *tmpstr = NEWSV(85,0);
2292 sv_upgrade(tmpstr, SVt_PVMG);
2293 t = strchr(s, '\n');
2299 sv_setpvn(tmpstr, s, t - s);
2300 av_store(array, line++, tmpstr);
2315 assert(CATCH_GET == TRUE);
2316 DEBUG_l(deb("Setting up local jumplevel %p, was %p\n", &cur_env, PL_top_env));
2320 default: /* topmost level handles it */
2329 PL_op = PL_restartop;
2342 sv_compile_2op(SV *sv, OP** startop, char *code, AV** avp)
2343 /* sv Text to convert to OP tree. */
2344 /* startop op_free() this to undo. */
2345 /* code Short string id of the caller. */
2347 dSP; /* Make POPBLOCK work. */
2350 I32 gimme = 0; /* SUSPECT - INITIALZE TO WHAT? NI-S */
2353 OP *oop = PL_op, *rop;
2354 char tmpbuf[TYPE_DIGITS(long) + 12 + 10];
2360 /* switch to eval mode */
2362 if (PL_curcop == &PL_compiling) {
2363 SAVESPTR(PL_compiling.cop_stash);
2364 PL_compiling.cop_stash = PL_curstash;
2366 SAVESPTR(PL_compiling.cop_filegv);
2367 SAVEI16(PL_compiling.cop_line);
2368 sprintf(tmpbuf, "_<(%.10s_eval %lu)", code, (unsigned long)++PL_evalseq);
2369 PL_compiling.cop_filegv = gv_fetchfile(tmpbuf+2);
2370 PL_compiling.cop_line = 1;
2371 /* XXX For C<eval "...">s within BEGIN {} blocks, this ends up
2372 deleting the eval's FILEGV from the stash before gv_check() runs
2373 (i.e. before run-time proper). To work around the coredump that
2374 ensues, we always turn GvMULTI_on for any globals that were
2375 introduced within evals. See force_ident(). GSAR 96-10-12 */
2376 safestr = savepv(tmpbuf);
2377 SAVEDELETE(PL_defstash, safestr, strlen(safestr));
2379 #ifdef OP_IN_REGISTER
2387 PL_op->op_type = OP_ENTEREVAL;
2388 PL_op->op_flags = 0; /* Avoid uninit warning. */
2389 PUSHBLOCK(cx, CXt_EVAL, SP);
2390 PUSHEVAL(cx, 0, PL_compiling.cop_filegv);
2391 rop = doeval(G_SCALAR, startop);
2392 POPBLOCK(cx,PL_curpm);
2395 (*startop)->op_type = OP_NULL;
2396 (*startop)->op_ppaddr = ppaddr[OP_NULL];
2398 *avp = (AV*)SvREFCNT_inc(PL_comppad);
2400 if (PL_curcop == &PL_compiling)
2401 PL_compiling.op_private = PL_hints;
2402 #ifdef OP_IN_REGISTER
2408 /* With USE_THREADS, eval_owner must be held on entry to doeval */
2410 doeval(int gimme, OP** startop)
2423 /* set up a scratch pad */
2426 SAVESPTR(PL_curpad);
2427 SAVESPTR(PL_comppad);
2428 SAVESPTR(PL_comppad_name);
2429 SAVEI32(PL_comppad_name_fill);
2430 SAVEI32(PL_min_intro_pending);
2431 SAVEI32(PL_max_intro_pending);
2434 for (i = cxstack_ix - 1; i >= 0; i--) {
2435 PERL_CONTEXT *cx = &cxstack[i];
2436 if (CxTYPE(cx) == CXt_EVAL)
2438 else if (CxTYPE(cx) == CXt_SUB) {
2439 caller = cx->blk_sub.cv;
2444 SAVESPTR(PL_compcv);
2445 PL_compcv = (CV*)NEWSV(1104,0);
2446 sv_upgrade((SV *)PL_compcv, SVt_PVCV);
2447 CvUNIQUE_on(PL_compcv);
2449 CvOWNER(PL_compcv) = 0;
2450 New(666, CvMUTEXP(PL_compcv), 1, perl_mutex);
2451 MUTEX_INIT(CvMUTEXP(PL_compcv));
2452 #endif /* USE_THREADS */
2454 PL_comppad = newAV();
2455 av_push(PL_comppad, Nullsv);
2456 PL_curpad = AvARRAY(PL_comppad);
2457 PL_comppad_name = newAV();
2458 PL_comppad_name_fill = 0;
2459 PL_min_intro_pending = 0;
2462 av_store(PL_comppad_name, 0, newSVpv("@_", 2));
2463 PL_curpad[0] = (SV*)newAV();
2464 SvPADMY_on(PL_curpad[0]); /* XXX Needed? */
2465 #endif /* USE_THREADS */
2467 comppadlist = newAV();
2468 AvREAL_off(comppadlist);
2469 av_store(comppadlist, 0, (SV*)PL_comppad_name);
2470 av_store(comppadlist, 1, (SV*)PL_comppad);
2471 CvPADLIST(PL_compcv) = comppadlist;
2473 if (!saveop || saveop->op_type != OP_REQUIRE)
2474 CvOUTSIDE(PL_compcv) = (CV*)SvREFCNT_inc(caller);
2476 SAVEFREESV(PL_compcv);
2478 /* make sure we compile in the right package */
2480 newstash = PL_curcop->cop_stash;
2481 if (PL_curstash != newstash) {
2482 SAVESPTR(PL_curstash);
2483 PL_curstash = newstash;
2485 SAVESPTR(PL_beginav);
2486 PL_beginav = newAV();
2487 SAVEFREESV(PL_beginav);
2489 /* try to compile it */
2491 PL_eval_root = Nullop;
2493 PL_curcop = &PL_compiling;
2494 PL_curcop->cop_arybase = 0;
2495 SvREFCNT_dec(PL_rs);
2496 PL_rs = newSVpv("\n", 1);
2497 if (saveop && saveop->op_flags & OPf_SPECIAL)
2501 if (yyparse() || PL_error_count || !PL_eval_root) {
2505 I32 optype = 0; /* Might be reset by POPEVAL. */
2509 op_free(PL_eval_root);
2510 PL_eval_root = Nullop;
2512 SP = PL_stack_base + POPMARK; /* pop original mark */
2514 POPBLOCK(cx,PL_curpm);
2520 if (optype == OP_REQUIRE) {
2521 char* msg = SvPVx(ERRSV, PL_na);
2522 DIE("%s", *msg ? msg : "Compilation failed in require");
2523 } else if (startop) {
2524 char* msg = SvPVx(ERRSV, PL_na);
2526 POPBLOCK(cx,PL_curpm);
2528 croak("%sCompilation failed in regexp", (*msg ? msg : "Unknown error\n"));
2530 SvREFCNT_dec(PL_rs);
2531 PL_rs = SvREFCNT_inc(PL_nrs);
2533 MUTEX_LOCK(&PL_eval_mutex);
2535 COND_SIGNAL(&PL_eval_cond);
2536 MUTEX_UNLOCK(&PL_eval_mutex);
2537 #endif /* USE_THREADS */
2540 SvREFCNT_dec(PL_rs);
2541 PL_rs = SvREFCNT_inc(PL_nrs);
2542 PL_compiling.cop_line = 0;
2544 *startop = PL_eval_root;
2545 SvREFCNT_dec(CvOUTSIDE(PL_compcv));
2546 CvOUTSIDE(PL_compcv) = Nullcv;
2548 SAVEFREEOP(PL_eval_root);
2550 scalarvoid(PL_eval_root);
2551 else if (gimme & G_ARRAY)
2554 scalar(PL_eval_root);
2556 DEBUG_x(dump_eval());
2558 /* Register with debugger: */
2559 if (PERLDB_INTER && saveop->op_type == OP_REQUIRE) {
2560 CV *cv = perl_get_cv("DB::postponed", FALSE);
2564 XPUSHs((SV*)PL_compiling.cop_filegv);
2566 perl_call_sv((SV*)cv, G_DISCARD);
2570 /* compiled okay, so do it */
2572 CvDEPTH(PL_compcv) = 1;
2573 SP = PL_stack_base + POPMARK; /* pop original mark */
2574 PL_op = saveop; /* The caller may need it. */
2576 MUTEX_LOCK(&PL_eval_mutex);
2578 COND_SIGNAL(&PL_eval_cond);
2579 MUTEX_UNLOCK(&PL_eval_mutex);
2580 #endif /* USE_THREADS */
2582 RETURNOP(PL_eval_start);
2588 register PERL_CONTEXT *cx;
2593 SV *namesv = Nullsv;
2595 I32 gimme = G_SCALAR;
2596 PerlIO *tryrsfp = 0;
2599 if (SvNIOKp(sv) && !SvPOKp(sv)) {
2600 SET_NUMERIC_STANDARD();
2601 if (atof(PL_patchlevel) + 0.00000999 < SvNV(sv))
2602 DIE("Perl %s required--this is only version %s, stopped",
2603 SvPV(sv,PL_na),PL_patchlevel);
2606 name = SvPV(sv, len);
2607 if (!(name && len > 0 && *name))
2608 DIE("Null filename used");
2609 TAINT_PROPER("require");
2610 if (PL_op->op_type == OP_REQUIRE &&
2611 (svp = hv_fetch(GvHVn(PL_incgv), name, len, 0)) &&
2612 *svp != &PL_sv_undef)
2615 /* prepare to compile file */
2620 (name[1] == '.' && name[2] == '/')))
2622 || (name[0] && name[1] == ':')
2625 || (name[0] == '\\' && name[1] == '\\') /* UNC path */
2628 || (strchr(name,':') || ((*name == '[' || *name == '<') &&
2629 (isALNUM(name[1]) || strchr("$-_]>",name[1]))))
2634 tryrsfp = PerlIO_open(name,PERL_SCRIPT_MODE);
2637 AV *ar = GvAVn(PL_incgv);
2641 if ((unixname = tounixspec(name, Nullch)) != Nullch)
2644 namesv = NEWSV(806, 0);
2645 for (i = 0; i <= AvFILL(ar); i++) {
2646 char *dir = SvPVx(*av_fetch(ar, i, TRUE), PL_na);
2649 if ((unixdir = tounixpath(dir, Nullch)) == Nullch)
2651 sv_setpv(namesv, unixdir);
2652 sv_catpv(namesv, unixname);
2654 sv_setpvf(namesv, "%s/%s", dir, name);
2656 TAINT_PROPER("require");
2657 tryname = SvPVX(namesv);
2658 tryrsfp = PerlIO_open(tryname, PERL_SCRIPT_MODE);
2660 if (tryname[0] == '.' && tryname[1] == '/')
2667 SAVESPTR(PL_compiling.cop_filegv);
2668 PL_compiling.cop_filegv = gv_fetchfile(tryrsfp ? tryname : name);
2669 SvREFCNT_dec(namesv);
2671 if (PL_op->op_type == OP_REQUIRE) {
2672 SV *msg = sv_2mortal(newSVpvf("Can't locate %s in @INC", name));
2673 SV *dirmsgsv = NEWSV(0, 0);
2674 AV *ar = GvAVn(PL_incgv);
2676 if (instr(SvPVX(msg), ".h "))
2677 sv_catpv(msg, " (change .h to .ph maybe?)");
2678 if (instr(SvPVX(msg), ".ph "))
2679 sv_catpv(msg, " (did you run h2ph?)");
2680 sv_catpv(msg, " (@INC contains:");
2681 for (i = 0; i <= AvFILL(ar); i++) {
2682 char *dir = SvPVx(*av_fetch(ar, i, TRUE), PL_na);
2683 sv_setpvf(dirmsgsv, " %s", dir);
2684 sv_catsv(msg, dirmsgsv);
2686 sv_catpvn(msg, ")", 1);
2687 SvREFCNT_dec(dirmsgsv);
2694 SETERRNO(0, SS$_NORMAL);
2696 /* Assume success here to prevent recursive requirement. */
2697 (void)hv_store(GvHVn(PL_incgv), name, strlen(name),
2698 newSVsv(GvSV(PL_compiling.cop_filegv)), 0 );
2702 lex_start(sv_2mortal(newSVpv("",0)));
2703 SAVEGENERICSV(PL_rsfp_filters);
2704 PL_rsfp_filters = Nullav;
2707 name = savepv(name);
2711 SAVEPPTR(PL_compiling.cop_warnings);
2712 PL_compiling.cop_warnings = ((PL_dowarn & G_WARN_ALL_ON) ? WARN_ALL
2715 /* switch to eval mode */
2717 push_return(PL_op->op_next);
2718 PUSHBLOCK(cx, CXt_EVAL, SP);
2719 PUSHEVAL(cx, name, PL_compiling.cop_filegv);
2721 SAVEI16(PL_compiling.cop_line);
2722 PL_compiling.cop_line = 0;
2726 MUTEX_LOCK(&PL_eval_mutex);
2727 if (PL_eval_owner && PL_eval_owner != thr)
2728 while (PL_eval_owner)
2729 COND_WAIT(&PL_eval_cond, &PL_eval_mutex);
2730 PL_eval_owner = thr;
2731 MUTEX_UNLOCK(&PL_eval_mutex);
2732 #endif /* USE_THREADS */
2733 return DOCATCH(doeval(G_SCALAR, NULL));
2738 return pp_require(ARGS);
2744 register PERL_CONTEXT *cx;
2746 I32 gimme = GIMME_V, was = PL_sub_generation;
2747 char tmpbuf[TYPE_DIGITS(long) + 12];
2752 if (!SvPV(sv,len) || !len)
2754 TAINT_PROPER("eval");
2760 /* switch to eval mode */
2762 SAVESPTR(PL_compiling.cop_filegv);
2763 sprintf(tmpbuf, "_<(eval %lu)", (unsigned long)++PL_evalseq);
2764 PL_compiling.cop_filegv = gv_fetchfile(tmpbuf+2);
2765 PL_compiling.cop_line = 1;
2766 /* XXX For C<eval "...">s within BEGIN {} blocks, this ends up
2767 deleting the eval's FILEGV from the stash before gv_check() runs
2768 (i.e. before run-time proper). To work around the coredump that
2769 ensues, we always turn GvMULTI_on for any globals that were
2770 introduced within evals. See force_ident(). GSAR 96-10-12 */
2771 safestr = savepv(tmpbuf);
2772 SAVEDELETE(PL_defstash, safestr, strlen(safestr));
2774 PL_hints = PL_op->op_targ;
2775 SAVEPPTR(PL_compiling.cop_warnings);
2776 if (PL_compiling.cop_warnings != WARN_ALL
2777 && PL_compiling.cop_warnings != WARN_NONE){
2778 PL_compiling.cop_warnings = newSVsv(PL_compiling.cop_warnings) ;
2779 SAVEFREESV(PL_compiling.cop_warnings) ;
2782 push_return(PL_op->op_next);
2783 PUSHBLOCK(cx, (CXt_EVAL|CXp_REAL), SP);
2784 PUSHEVAL(cx, 0, PL_compiling.cop_filegv);
2786 /* prepare to compile string */
2788 if (PERLDB_LINE && PL_curstash != PL_debstash)
2789 save_lines(GvAV(PL_compiling.cop_filegv), PL_linestr);
2792 MUTEX_LOCK(&PL_eval_mutex);
2793 if (PL_eval_owner && PL_eval_owner != thr)
2794 while (PL_eval_owner)
2795 COND_WAIT(&PL_eval_cond, &PL_eval_mutex);
2796 PL_eval_owner = thr;
2797 MUTEX_UNLOCK(&PL_eval_mutex);
2798 #endif /* USE_THREADS */
2799 ret = doeval(gimme, NULL);
2800 if (PERLDB_INTER && was != PL_sub_generation /* Some subs defined here. */
2801 && ret != PL_op->op_next) { /* Successive compilation. */
2802 strcpy(safestr, "_<(eval )"); /* Anything fake and short. */
2804 return DOCATCH(ret);
2814 register PERL_CONTEXT *cx;
2816 U8 save_flags = PL_op -> op_flags;
2821 retop = pop_return();
2824 if (gimme == G_VOID)
2826 else if (gimme == G_SCALAR) {
2829 if (SvFLAGS(TOPs) & SVs_TEMP)
2832 *MARK = sv_mortalcopy(TOPs);
2836 *MARK = &PL_sv_undef;
2840 /* in case LEAVE wipes old return values */
2841 for (mark = newsp + 1; mark <= SP; mark++) {
2842 if (!(SvFLAGS(*mark) & SVs_TEMP)) {
2843 *mark = sv_mortalcopy(*mark);
2844 TAINT_NOT; /* Each item is independent */
2848 PL_curpm = newpm; /* Don't pop $1 et al till now */
2851 * Closures mentioned at top level of eval cannot be referenced
2852 * again, and their presence indirectly causes a memory leak.
2853 * (Note that the fact that compcv and friends are still set here
2854 * is, AFAIK, an accident.) --Chip
2856 if (AvFILLp(PL_comppad_name) >= 0) {
2857 SV **svp = AvARRAY(PL_comppad_name);
2859 for (ix = AvFILLp(PL_comppad_name); ix >= 0; ix--) {
2861 if (sv && sv != &PL_sv_undef && *SvPVX(sv) == '&') {
2863 svp[ix] = &PL_sv_undef;
2867 SvREFCNT_dec(CvOUTSIDE(sv));
2868 CvOUTSIDE(sv) = Nullcv;
2881 assert(CvDEPTH(PL_compcv) == 1);
2883 CvDEPTH(PL_compcv) = 0;
2886 if (optype == OP_REQUIRE &&
2887 !(gimme == G_SCALAR ? SvTRUE(*SP) : SP > newsp))
2889 /* Unassume the success we assumed earlier. */
2890 char *name = cx->blk_eval.old_name;
2891 (void)hv_delete(GvHVn(PL_incgv), name, strlen(name), G_DISCARD);
2892 retop = die("%s did not return a true value", name);
2893 /* die_where() did LEAVE, or we won't be here */
2897 if (!(save_flags & OPf_SPECIAL))
2907 register PERL_CONTEXT *cx;
2908 I32 gimme = GIMME_V;
2913 push_return(cLOGOP->op_other->op_next);
2914 PUSHBLOCK(cx, CXt_EVAL, SP);
2916 PL_eval_root = PL_op; /* Only needed so that goto works right. */
2921 return DOCATCH(PL_op->op_next);
2931 register PERL_CONTEXT *cx;
2939 if (gimme == G_VOID)
2941 else if (gimme == G_SCALAR) {
2944 if (SvFLAGS(TOPs) & (SVs_PADTMP|SVs_TEMP))
2947 *MARK = sv_mortalcopy(TOPs);
2951 *MARK = &PL_sv_undef;
2956 /* in case LEAVE wipes old return values */
2957 for (mark = newsp + 1; mark <= SP; mark++) {
2958 if (!(SvFLAGS(*mark) & (SVs_PADTMP|SVs_TEMP))) {
2959 *mark = sv_mortalcopy(*mark);
2960 TAINT_NOT; /* Each item is independent */
2964 PL_curpm = newpm; /* Don't pop $1 et al till now */
2975 register char *s = SvPV_force(sv, len);
2976 register char *send = s + len;
2977 register char *base;
2978 register I32 skipspaces = 0;
2981 bool postspace = FALSE;
2989 croak("Null picture in formline");
2991 New(804, fops, (send - s)*3+10, U16); /* Almost certainly too long... */
2996 *fpc++ = FF_LINEMARK;
2997 noblank = repeat = FALSE;
3015 case ' ': case '\t':
3026 *fpc++ = FF_LITERAL;
3034 *fpc++ = skipspaces;
3038 *fpc++ = FF_NEWLINE;
3042 arg = fpc - linepc + 1;
3049 *fpc++ = FF_LINEMARK;
3050 noblank = repeat = FALSE;
3059 ischop = s[-1] == '^';
3065 arg = (s - base) - 1;
3067 *fpc++ = FF_LITERAL;
3076 *fpc++ = FF_LINEGLOB;
3078 else if (*s == '#' || (*s == '.' && s[1] == '#')) {
3079 arg = ischop ? 512 : 0;
3089 arg |= 256 + (s - f);
3091 *fpc++ = s - base; /* fieldsize for FETCH */
3092 *fpc++ = FF_DECIMAL;
3097 bool ismore = FALSE;
3100 while (*++s == '>') ;
3101 prespace = FF_SPACE;
3103 else if (*s == '|') {
3104 while (*++s == '|') ;
3105 prespace = FF_HALFSPACE;
3110 while (*++s == '<') ;
3113 if (*s == '.' && s[1] == '.' && s[2] == '.') {
3117 *fpc++ = s - base; /* fieldsize for FETCH */
3119 *fpc++ = ischop ? FF_CHECKCHOP : FF_CHECKNL;
3137 { /* need to jump to the next word */
3139 z = WORD_ALIGN - SvCUR(sv) % WORD_ALIGN;
3140 SvGROW(sv, SvCUR(sv) + z + arg * sizeof(U16) + 4);
3141 s = SvPVX(sv) + SvCUR(sv) + z;
3143 Copy(fops, s, arg, U16);
3145 sv_magic(sv, Nullsv, 'f', Nullch, 0);
3150 * The rest of this file was derived from source code contributed
3153 * NOTE: this code was derived from Tom Horsley's qsort replacement
3154 * and should not be confused with the original code.
3157 /* Copyright (C) Tom Horsley, 1997. All rights reserved.
3159 Permission granted to distribute under the same terms as perl which are
3162 This program is free software; you can redistribute it and/or modify
3163 it under the terms of either:
3165 a) the GNU General Public License as published by the Free
3166 Software Foundation; either version 1, or (at your option) any
3169 b) the "Artistic License" which comes with this Kit.
3171 Details on the perl license can be found in the perl source code which
3172 may be located via the www.perl.com web page.
3174 This is the most wonderfulest possible qsort I can come up with (and
3175 still be mostly portable) My (limited) tests indicate it consistently
3176 does about 20% fewer calls to compare than does the qsort in the Visual
3177 C++ library, other vendors may vary.
3179 Some of the ideas in here can be found in "Algorithms" by Sedgewick,
3180 others I invented myself (or more likely re-invented since they seemed
3181 pretty obvious once I watched the algorithm operate for a while).
3183 Most of this code was written while watching the Marlins sweep the Giants
3184 in the 1997 National League Playoffs - no Braves fans allowed to use this
3185 code (just kidding :-).
3187 I realize that if I wanted to be true to the perl tradition, the only
3188 comment in this file would be something like:
3190 ...they shuffled back towards the rear of the line. 'No, not at the
3191 rear!' the slave-driver shouted. 'Three files up. And stay there...
3193 However, I really needed to violate that tradition just so I could keep
3194 track of what happens myself, not to mention some poor fool trying to
3195 understand this years from now :-).
3198 /* ********************************************************** Configuration */
3200 #ifndef QSORT_ORDER_GUESS
3201 #define QSORT_ORDER_GUESS 2 /* Select doubling version of the netBSD trick */
3204 /* QSORT_MAX_STACK is the largest number of partitions that can be stacked up for
3205 future processing - a good max upper bound is log base 2 of memory size
3206 (32 on 32 bit machines, 64 on 64 bit machines, etc). In reality can
3207 safely be smaller than that since the program is taking up some space and
3208 most operating systems only let you grab some subset of contiguous
3209 memory (not to mention that you are normally sorting data larger than
3210 1 byte element size :-).
3212 #ifndef QSORT_MAX_STACK
3213 #define QSORT_MAX_STACK 32
3216 /* QSORT_BREAK_EVEN is the size of the largest partition we should insertion sort.
3217 Anything bigger and we use qsort. If you make this too small, the qsort
3218 will probably break (or become less efficient), because it doesn't expect
3219 the middle element of a partition to be the same as the right or left -
3220 you have been warned).
3222 #ifndef QSORT_BREAK_EVEN
3223 #define QSORT_BREAK_EVEN 6
3226 /* ************************************************************* Data Types */
3228 /* hold left and right index values of a partition waiting to be sorted (the
3229 partition includes both left and right - right is NOT one past the end or
3230 anything like that).
3232 struct partition_stack_entry {
3235 #ifdef QSORT_ORDER_GUESS
3236 int qsort_break_even;
3240 /* ******************************************************* Shorthand Macros */
3242 /* Note that these macros will be used from inside the qsort function where
3243 we happen to know that the variable 'elt_size' contains the size of an
3244 array element and the variable 'temp' points to enough space to hold a
3245 temp element and the variable 'array' points to the array being sorted
3246 and 'compare' is the pointer to the compare routine.
3248 Also note that there are very many highly architecture specific ways
3249 these might be sped up, but this is simply the most generally portable
3250 code I could think of.
3253 /* Return < 0 == 0 or > 0 as the value of elt1 is < elt2, == elt2, > elt2
3256 #define qsort_cmp(elt1, elt2) \
3257 ((this->*compare)(array[elt1], array[elt2]))
3259 #define qsort_cmp(elt1, elt2) \
3260 ((*compare)(array[elt1], array[elt2]))
3263 #ifdef QSORT_ORDER_GUESS
3264 #define QSORT_NOTICE_SWAP swapped++;
3266 #define QSORT_NOTICE_SWAP
3269 /* swaps contents of array elements elt1, elt2.
3271 #define qsort_swap(elt1, elt2) \
3274 temp = array[elt1]; \
3275 array[elt1] = array[elt2]; \
3276 array[elt2] = temp; \
3279 /* rotate contents of elt1, elt2, elt3 such that elt1 gets elt2, elt2 gets
3280 elt3 and elt3 gets elt1.
3282 #define qsort_rotate(elt1, elt2, elt3) \
3285 temp = array[elt1]; \
3286 array[elt1] = array[elt2]; \
3287 array[elt2] = array[elt3]; \
3288 array[elt3] = temp; \
3291 /* ************************************************************ Debug stuff */
3298 return; /* good place to set a breakpoint */
3301 #define qsort_assert(t) (void)( (t) || (break_here(), 0) )
3304 doqsort_all_asserts(
3308 int (*compare)(const void * elt1, const void * elt2),
3309 int pc_left, int pc_right, int u_left, int u_right)
3313 qsort_assert(pc_left <= pc_right);
3314 qsort_assert(u_right < pc_left);
3315 qsort_assert(pc_right < u_left);
3316 for (i = u_right + 1; i < pc_left; ++i) {
3317 qsort_assert(qsort_cmp(i, pc_left) < 0);
3319 for (i = pc_left; i < pc_right; ++i) {
3320 qsort_assert(qsort_cmp(i, pc_right) == 0);
3322 for (i = pc_right + 1; i < u_left; ++i) {
3323 qsort_assert(qsort_cmp(pc_right, i) < 0);
3327 #define qsort_all_asserts(PC_LEFT, PC_RIGHT, U_LEFT, U_RIGHT) \
3328 doqsort_all_asserts(array, num_elts, elt_size, compare, \
3329 PC_LEFT, PC_RIGHT, U_LEFT, U_RIGHT)
3333 #define qsort_assert(t) ((void)0)
3335 #define qsort_all_asserts(PC_LEFT, PC_RIGHT, U_LEFT, U_RIGHT) ((void)0)
3339 /* ****************************************************************** qsort */
3343 qsortsv(SV ** array, size_t num_elts, SVCOMPARE compare)
3348 I32 (*compare)(SV *a, SV *b))
3353 struct partition_stack_entry partition_stack[QSORT_MAX_STACK];
3354 int next_stack_entry = 0;
3358 #ifdef QSORT_ORDER_GUESS
3359 int qsort_break_even;
3363 /* Make sure we actually have work to do.
3365 if (num_elts <= 1) {
3369 /* Setup the initial partition definition and fall into the sorting loop
3372 part_right = (int)(num_elts - 1);
3373 #ifdef QSORT_ORDER_GUESS
3374 qsort_break_even = QSORT_BREAK_EVEN;
3376 #define qsort_break_even QSORT_BREAK_EVEN
3379 if ((part_right - part_left) >= qsort_break_even) {
3380 /* OK, this is gonna get hairy, so lets try to document all the
3381 concepts and abbreviations and variables and what they keep
3384 pc: pivot chunk - the set of array elements we accumulate in the
3385 middle of the partition, all equal in value to the original
3386 pivot element selected. The pc is defined by:
3388 pc_left - the leftmost array index of the pc
3389 pc_right - the rightmost array index of the pc
3391 we start with pc_left == pc_right and only one element
3392 in the pivot chunk (but it can grow during the scan).
3394 u: uncompared elements - the set of elements in the partition
3395 we have not yet compared to the pivot value. There are two
3396 uncompared sets during the scan - one to the left of the pc
3397 and one to the right.
3399 u_right - the rightmost index of the left side's uncompared set
3400 u_left - the leftmost index of the right side's uncompared set
3402 The leftmost index of the left sides's uncompared set
3403 doesn't need its own variable because it is always defined
3404 by the leftmost edge of the whole partition (part_left). The
3405 same goes for the rightmost edge of the right partition
3408 We know there are no uncompared elements on the left once we
3409 get u_right < part_left and no uncompared elements on the
3410 right once u_left > part_right. When both these conditions
3411 are met, we have completed the scan of the partition.
3413 Any elements which are between the pivot chunk and the
3414 uncompared elements should be less than the pivot value on
3415 the left side and greater than the pivot value on the right
3416 side (in fact, the goal of the whole algorithm is to arrange
3417 for that to be true and make the groups of less-than and
3418 greater-then elements into new partitions to sort again).
3420 As you marvel at the complexity of the code and wonder why it
3421 has to be so confusing. Consider some of the things this level
3422 of confusion brings:
3424 Once I do a compare, I squeeze every ounce of juice out of it. I
3425 never do compare calls I don't have to do, and I certainly never
3428 I also never swap any elements unless I can prove there is a
3429 good reason. Many sort algorithms will swap a known value with
3430 an uncompared value just to get things in the right place (or
3431 avoid complexity :-), but that uncompared value, once it gets
3432 compared, may then have to be swapped again. A lot of the
3433 complexity of this code is due to the fact that it never swaps
3434 anything except compared values, and it only swaps them when the
3435 compare shows they are out of position.
3437 int pc_left, pc_right;
3438 int u_right, u_left;
3442 pc_left = ((part_left + part_right) / 2);
3444 u_right = pc_left - 1;
3445 u_left = pc_right + 1;
3447 /* Qsort works best when the pivot value is also the median value
3448 in the partition (unfortunately you can't find the median value
3449 without first sorting :-), so to give the algorithm a helping
3450 hand, we pick 3 elements and sort them and use the median value
3451 of that tiny set as the pivot value.
3453 Some versions of qsort like to use the left middle and right as
3454 the 3 elements to sort so they can insure the ends of the
3455 partition will contain values which will stop the scan in the
3456 compare loop, but when you have to call an arbitrarily complex
3457 routine to do a compare, its really better to just keep track of
3458 array index values to know when you hit the edge of the
3459 partition and avoid the extra compare. An even better reason to
3460 avoid using a compare call is the fact that you can drop off the
3461 edge of the array if someone foolishly provides you with an
3462 unstable compare function that doesn't always provide consistent
3465 So, since it is simpler for us to compare the three adjacent
3466 elements in the middle of the partition, those are the ones we
3467 pick here (conveniently pointed at by u_right, pc_left, and
3468 u_left). The values of the left, center, and right elements
3469 are refered to as l c and r in the following comments.
3472 #ifdef QSORT_ORDER_GUESS
3475 s = qsort_cmp(u_right, pc_left);
3478 s = qsort_cmp(pc_left, u_left);
3479 /* if l < c, c < r - already in order - nothing to do */
3481 /* l < c, c == r - already in order, pc grows */
3483 qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
3485 /* l < c, c > r - need to know more */
3486 s = qsort_cmp(u_right, u_left);
3488 /* l < c, c > r, l < r - swap c & r to get ordered */
3489 qsort_swap(pc_left, u_left);
3490 qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
3491 } else if (s == 0) {
3492 /* l < c, c > r, l == r - swap c&r, grow pc */
3493 qsort_swap(pc_left, u_left);
3495 qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
3497 /* l < c, c > r, l > r - make lcr into rlc to get ordered */
3498 qsort_rotate(pc_left, u_right, u_left);
3499 qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
3502 } else if (s == 0) {
3504 s = qsort_cmp(pc_left, u_left);
3506 /* l == c, c < r - already in order, grow pc */
3508 qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
3509 } else if (s == 0) {
3510 /* l == c, c == r - already in order, grow pc both ways */
3513 qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
3515 /* l == c, c > r - swap l & r, grow pc */
3516 qsort_swap(u_right, u_left);
3518 qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
3522 s = qsort_cmp(pc_left, u_left);
3524 /* l > c, c < r - need to know more */
3525 s = qsort_cmp(u_right, u_left);
3527 /* l > c, c < r, l < r - swap l & c to get ordered */
3528 qsort_swap(u_right, pc_left);
3529 qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
3530 } else if (s == 0) {
3531 /* l > c, c < r, l == r - swap l & c, grow pc */
3532 qsort_swap(u_right, pc_left);
3534 qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
3536 /* l > c, c < r, l > r - rotate lcr into crl to order */
3537 qsort_rotate(u_right, pc_left, u_left);
3538 qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
3540 } else if (s == 0) {
3541 /* l > c, c == r - swap ends, grow pc */
3542 qsort_swap(u_right, u_left);
3544 qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
3546 /* l > c, c > r - swap ends to get in order */
3547 qsort_swap(u_right, u_left);
3548 qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
3551 /* We now know the 3 middle elements have been compared and
3552 arranged in the desired order, so we can shrink the uncompared
3557 qsort_all_asserts(pc_left, pc_right, u_left, u_right);
3559 /* The above massive nested if was the simple part :-). We now have
3560 the middle 3 elements ordered and we need to scan through the
3561 uncompared sets on either side, swapping elements that are on
3562 the wrong side or simply shuffling equal elements around to get
3563 all equal elements into the pivot chunk.
3567 int still_work_on_left;
3568 int still_work_on_right;
3570 /* Scan the uncompared values on the left. If I find a value
3571 equal to the pivot value, move it over so it is adjacent to
3572 the pivot chunk and expand the pivot chunk. If I find a value
3573 less than the pivot value, then just leave it - its already
3574 on the correct side of the partition. If I find a greater
3575 value, then stop the scan.
3577 while (still_work_on_left = (u_right >= part_left)) {
3578 s = qsort_cmp(u_right, pc_left);
3581 } else if (s == 0) {
3583 if (pc_left != u_right) {
3584 qsort_swap(u_right, pc_left);
3590 qsort_assert(u_right < pc_left);
3591 qsort_assert(pc_left <= pc_right);
3592 qsort_assert(qsort_cmp(u_right + 1, pc_left) <= 0);
3593 qsort_assert(qsort_cmp(pc_left, pc_right) == 0);
3596 /* Do a mirror image scan of uncompared values on the right
3598 while (still_work_on_right = (u_left <= part_right)) {
3599 s = qsort_cmp(pc_right, u_left);
3602 } else if (s == 0) {
3604 if (pc_right != u_left) {
3605 qsort_swap(pc_right, u_left);
3611 qsort_assert(u_left > pc_right);
3612 qsort_assert(pc_left <= pc_right);
3613 qsort_assert(qsort_cmp(pc_right, u_left - 1) <= 0);
3614 qsort_assert(qsort_cmp(pc_left, pc_right) == 0);
3617 if (still_work_on_left) {
3618 /* I know I have a value on the left side which needs to be
3619 on the right side, but I need to know more to decide
3620 exactly the best thing to do with it.
3622 if (still_work_on_right) {
3623 /* I know I have values on both side which are out of
3624 position. This is a big win because I kill two birds
3625 with one swap (so to speak). I can advance the
3626 uncompared pointers on both sides after swapping both
3627 of them into the right place.
3629 qsort_swap(u_right, u_left);
3632 qsort_all_asserts(pc_left, pc_right, u_left, u_right);
3634 /* I have an out of position value on the left, but the
3635 right is fully scanned, so I "slide" the pivot chunk
3636 and any less-than values left one to make room for the
3637 greater value over on the right. If the out of position
3638 value is immediately adjacent to the pivot chunk (there
3639 are no less-than values), I can do that with a swap,
3640 otherwise, I have to rotate one of the less than values
3641 into the former position of the out of position value
3642 and the right end of the pivot chunk into the left end
3646 if (pc_left == u_right) {
3647 qsort_swap(u_right, pc_right);
3648 qsort_all_asserts(pc_left, pc_right-1, u_left, u_right-1);
3650 qsort_rotate(u_right, pc_left, pc_right);
3651 qsort_all_asserts(pc_left, pc_right-1, u_left, u_right-1);
3656 } else if (still_work_on_right) {
3657 /* Mirror image of complex case above: I have an out of
3658 position value on the right, but the left is fully
3659 scanned, so I need to shuffle things around to make room
3660 for the right value on the left.
3663 if (pc_right == u_left) {
3664 qsort_swap(u_left, pc_left);
3665 qsort_all_asserts(pc_left+1, pc_right, u_left+1, u_right);
3667 qsort_rotate(pc_right, pc_left, u_left);
3668 qsort_all_asserts(pc_left+1, pc_right, u_left+1, u_right);
3673 /* No more scanning required on either side of partition,
3674 break out of loop and figure out next set of partitions
3680 /* The elements in the pivot chunk are now in the right place. They
3681 will never move or be compared again. All I have to do is decide
3682 what to do with the stuff to the left and right of the pivot
3685 Notes on the QSORT_ORDER_GUESS ifdef code:
3687 1. If I just built these partitions without swapping any (or
3688 very many) elements, there is a chance that the elements are
3689 already ordered properly (being properly ordered will
3690 certainly result in no swapping, but the converse can't be
3693 2. A (properly written) insertion sort will run faster on
3694 already ordered data than qsort will.
3696 3. Perhaps there is some way to make a good guess about
3697 switching to an insertion sort earlier than partition size 6
3698 (for instance - we could save the partition size on the stack
3699 and increase the size each time we find we didn't swap, thus
3700 switching to insertion sort earlier for partitions with a
3701 history of not swapping).
3703 4. Naturally, if I just switch right away, it will make
3704 artificial benchmarks with pure ascending (or descending)
3705 data look really good, but is that a good reason in general?
3709 #ifdef QSORT_ORDER_GUESS
3711 #if QSORT_ORDER_GUESS == 1
3712 qsort_break_even = (part_right - part_left) + 1;
3714 #if QSORT_ORDER_GUESS == 2
3715 qsort_break_even *= 2;
3717 #if QSORT_ORDER_GUESS == 3
3718 int prev_break = qsort_break_even;
3719 qsort_break_even *= qsort_break_even;
3720 if (qsort_break_even < prev_break) {
3721 qsort_break_even = (part_right - part_left) + 1;
3725 qsort_break_even = QSORT_BREAK_EVEN;
3729 if (part_left < pc_left) {
3730 /* There are elements on the left which need more processing.
3731 Check the right as well before deciding what to do.
3733 if (pc_right < part_right) {
3734 /* We have two partitions to be sorted. Stack the biggest one
3735 and process the smallest one on the next iteration. This
3736 minimizes the stack height by insuring that any additional
3737 stack entries must come from the smallest partition which
3738 (because it is smallest) will have the fewest
3739 opportunities to generate additional stack entries.
3741 if ((part_right - pc_right) > (pc_left - part_left)) {
3742 /* stack the right partition, process the left */
3743 partition_stack[next_stack_entry].left = pc_right + 1;
3744 partition_stack[next_stack_entry].right = part_right;
3745 #ifdef QSORT_ORDER_GUESS
3746 partition_stack[next_stack_entry].qsort_break_even = qsort_break_even;
3748 part_right = pc_left - 1;
3750 /* stack the left partition, process the right */
3751 partition_stack[next_stack_entry].left = part_left;
3752 partition_stack[next_stack_entry].right = pc_left - 1;
3753 #ifdef QSORT_ORDER_GUESS
3754 partition_stack[next_stack_entry].qsort_break_even = qsort_break_even;
3756 part_left = pc_right + 1;
3758 qsort_assert(next_stack_entry < QSORT_MAX_STACK);
3761 /* The elements on the left are the only remaining elements
3762 that need sorting, arrange for them to be processed as the
3765 part_right = pc_left - 1;
3767 } else if (pc_right < part_right) {
3768 /* There is only one chunk on the right to be sorted, make it
3769 the new partition and loop back around.
3771 part_left = pc_right + 1;
3773 /* This whole partition wound up in the pivot chunk, so
3774 we need to get a new partition off the stack.
3776 if (next_stack_entry == 0) {
3777 /* the stack is empty - we are done */
3781 part_left = partition_stack[next_stack_entry].left;
3782 part_right = partition_stack[next_stack_entry].right;
3783 #ifdef QSORT_ORDER_GUESS
3784 qsort_break_even = partition_stack[next_stack_entry].qsort_break_even;
3788 /* This partition is too small to fool with qsort complexity, just
3789 do an ordinary insertion sort to minimize overhead.
3792 /* Assume 1st element is in right place already, and start checking
3793 at 2nd element to see where it should be inserted.
3795 for (i = part_left + 1; i <= part_right; ++i) {
3797 /* Scan (backwards - just in case 'i' is already in right place)
3798 through the elements already sorted to see if the ith element
3799 belongs ahead of one of them.
3801 for (j = i - 1; j >= part_left; --j) {
3802 if (qsort_cmp(i, j) >= 0) {
3803 /* i belongs right after j
3810 /* Looks like we really need to move some things
3814 for (k = i - 1; k >= j; --k)
3815 array[k + 1] = array[k];
3820 /* That partition is now sorted, grab the next one, or get out
3821 of the loop if there aren't any more.
3824 if (next_stack_entry == 0) {
3825 /* the stack is empty - we are done */
3829 part_left = partition_stack[next_stack_entry].left;
3830 part_right = partition_stack[next_stack_entry].right;
3831 #ifdef QSORT_ORDER_GUESS
3832 qsort_break_even = partition_stack[next_stack_entry].qsort_break_even;
3837 /* Believe it or not, the array is sorted at this point! */