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->*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 void save_lines _((AV *array, SV *sv));
40 static I32 sortcv _((SV *a, SV *b));
41 static void qsortsv _((SV **array, size_t num_elts, I32 (*fun)(SV *a, SV *b)));
42 static OP *doeval _((int gimme, OP** startop));
53 cxix = dopoptosub(cxstack_ix);
57 switch (cxstack[cxix].blk_gimme) {
74 register PMOP *pm = (PMOP*)cLOGOP->op_other;
78 MAGIC *mg = Null(MAGIC*);
82 SV *sv = SvRV(tmpstr);
84 mg = mg_find(sv, 'r');
87 regexp *re = (regexp *)mg->mg_obj;
88 ReREFCNT_dec(pm->op_pmregexp);
89 pm->op_pmregexp = ReREFCNT_inc(re);
92 t = SvPV(tmpstr, len);
94 /* JMR: Check against the last compiled regexp */
95 if ( ! pm->op_pmregexp || ! pm->op_pmregexp->precomp
96 || strnNE(pm->op_pmregexp->precomp, t, len)
97 || pm->op_pmregexp->precomp[len]) {
98 if (pm->op_pmregexp) {
99 ReREFCNT_dec(pm->op_pmregexp);
100 pm->op_pmregexp = Null(REGEXP*); /* crucial if regcomp aborts */
103 pm->op_pmflags = pm->op_pmpermflags; /* reset case sensitivity */
104 pm->op_pmregexp = pregcomp(t, t + len, pm);
108 if (!pm->op_pmregexp->prelen && curpm)
110 else if (strEQ("\\s+", pm->op_pmregexp->precomp))
111 pm->op_pmflags |= PMf_WHITE;
113 if (pm->op_pmflags & PMf_KEEP) {
114 pm->op_private &= ~OPpRUNTIME; /* no point compiling again */
115 cLOGOP->op_first->op_next = op->op_next;
123 register PMOP *pm = (PMOP*) cLOGOP->op_other;
124 register PERL_CONTEXT *cx = &cxstack[cxstack_ix];
125 register SV *dstr = cx->sb_dstr;
126 register char *s = cx->sb_s;
127 register char *m = cx->sb_m;
128 char *orig = cx->sb_orig;
129 register REGEXP *rx = cx->sb_rx;
131 rxres_restore(&cx->sb_rxres, rx);
133 if (cx->sb_iters++) {
134 if (cx->sb_iters > cx->sb_maxiters)
135 DIE("Substitution loop");
137 if (!cx->sb_rxtainted)
138 cx->sb_rxtainted = SvTAINTED(TOPs);
139 sv_catsv(dstr, POPs);
142 if (cx->sb_once || !regexec_flags(rx, s, cx->sb_strend, orig,
143 s == m, Nullsv, NULL,
144 cx->sb_safebase ? 0 : REXEC_COPY_STR))
146 SV *targ = cx->sb_targ;
147 sv_catpvn(dstr, s, cx->sb_strend - s);
149 TAINT_IF(cx->sb_rxtainted || RX_MATCH_TAINTED(rx));
151 (void)SvOOK_off(targ);
152 Safefree(SvPVX(targ));
153 SvPVX(targ) = SvPVX(dstr);
154 SvCUR_set(targ, SvCUR(dstr));
155 SvLEN_set(targ, SvLEN(dstr));
158 (void)SvPOK_only(targ);
162 PUSHs(sv_2mortal(newSViv((I32)cx->sb_iters - 1)));
163 LEAVE_SCOPE(cx->sb_oldsave);
165 RETURNOP(pm->op_next);
168 if (rx->subbase && rx->subbase != orig) {
171 cx->sb_orig = orig = rx->subbase;
173 cx->sb_strend = s + (cx->sb_strend - m);
175 cx->sb_m = m = rx->startp[0];
176 sv_catpvn(dstr, s, m-s);
177 cx->sb_s = rx->endp[0];
178 cx->sb_rxtainted |= RX_MATCH_TAINTED(rx);
179 rxres_save(&cx->sb_rxres, rx);
180 RETURNOP(pm->op_pmreplstart);
184 rxres_save(void **rsp, REGEXP *rx)
189 if (!p || p[1] < rx->nparens) {
190 i = 6 + rx->nparens * 2;
198 *p++ = (UV)rx->subbase;
199 rx->subbase = Nullch;
203 *p++ = (UV)rx->subbeg;
204 *p++ = (UV)rx->subend;
205 for (i = 0; i <= rx->nparens; ++i) {
206 *p++ = (UV)rx->startp[i];
207 *p++ = (UV)rx->endp[i];
212 rxres_restore(void **rsp, REGEXP *rx)
217 Safefree(rx->subbase);
218 rx->subbase = (char*)(*p);
223 rx->subbeg = (char*)(*p++);
224 rx->subend = (char*)(*p++);
225 for (i = 0; i <= rx->nparens; ++i) {
226 rx->startp[i] = (char*)(*p++);
227 rx->endp[i] = (char*)(*p++);
232 rxres_free(void **rsp)
237 Safefree((char*)(*p));
245 djSP; dMARK; dORIGMARK;
246 register SV *tmpForm = *++MARK;
258 bool chopspace = (strchr(chopset, ' ') != Nullch);
265 if (!SvMAGICAL(tmpForm) || !SvCOMPILED(tmpForm)) {
266 SvREADONLY_off(tmpForm);
267 doparseform(tmpForm);
270 SvPV_force(formtarget, len);
271 t = SvGROW(formtarget, len + SvCUR(tmpForm) + 1); /* XXX SvCUR bad */
273 f = SvPV(tmpForm, len);
274 /* need to jump to the next word */
275 s = f + len + WORD_ALIGN - SvCUR(tmpForm) % WORD_ALIGN;
284 case FF_LITERAL: arg = fpc[1]; name = "LITERAL"; break;
285 case FF_BLANK: arg = fpc[1]; name = "BLANK"; break;
286 case FF_SKIP: arg = fpc[1]; name = "SKIP"; break;
287 case FF_FETCH: arg = fpc[1]; name = "FETCH"; break;
288 case FF_DECIMAL: arg = fpc[1]; name = "DECIMAL"; break;
290 case FF_CHECKNL: name = "CHECKNL"; break;
291 case FF_CHECKCHOP: name = "CHECKCHOP"; break;
292 case FF_SPACE: name = "SPACE"; break;
293 case FF_HALFSPACE: name = "HALFSPACE"; break;
294 case FF_ITEM: name = "ITEM"; break;
295 case FF_CHOP: name = "CHOP"; break;
296 case FF_LINEGLOB: name = "LINEGLOB"; break;
297 case FF_NEWLINE: name = "NEWLINE"; break;
298 case FF_MORE: name = "MORE"; break;
299 case FF_LINEMARK: name = "LINEMARK"; break;
300 case FF_END: name = "END"; break;
303 PerlIO_printf(PerlIO_stderr(), "%-16s%ld\n", name, (long) arg);
305 PerlIO_printf(PerlIO_stderr(), "%-16s\n", name);
334 warn("Not enough format arguments");
339 item = s = SvPV(sv, len);
341 if (itemsize > fieldsize)
342 itemsize = fieldsize;
343 send = chophere = s + itemsize;
355 item = s = SvPV(sv, len);
357 if (itemsize <= fieldsize) {
358 send = chophere = s + itemsize;
369 itemsize = fieldsize;
370 send = chophere = s + itemsize;
371 while (s < send || (s == send && isSPACE(*s))) {
381 if (strchr(chopset, *s))
386 itemsize = chophere - item;
391 arg = fieldsize - itemsize;
400 arg = fieldsize - itemsize;
414 int ch = *t++ = *s++;
418 if ( !((*t++ = *s++) & ~31) )
428 while (*s && isSPACE(*s))
435 item = s = SvPV(sv, len);
448 SvCUR_set(formtarget, t - SvPVX(formtarget));
449 sv_catpvn(formtarget, item, itemsize);
450 SvGROW(formtarget, SvCUR(formtarget) + SvCUR(tmpForm) + 1);
451 t = SvPVX(formtarget) + SvCUR(formtarget);
456 /* If the field is marked with ^ and the value is undefined,
459 if ((arg & 512) && !SvOK(sv)) {
467 /* Formats aren't yet marked for locales, so assume "yes". */
470 sprintf(t, "%#*.*f", (int) fieldsize, (int) arg & 255, value);
472 sprintf(t, "%*.0f", (int) fieldsize, value);
479 while (t-- > linemark && *t == ' ') ;
487 if (arg) { /* repeat until fields exhausted? */
489 SvCUR_set(formtarget, t - SvPVX(formtarget));
490 lines += FmLINES(formtarget);
493 if (strnEQ(linemark, linemark - arg, arg))
494 DIE("Runaway format");
496 FmLINES(formtarget) = lines;
498 RETURNOP(cLISTOP->op_first);
509 arg = fieldsize - itemsize;
516 if (strnEQ(s," ",3)) {
517 while (s > SvPVX(formtarget) && isSPACE(s[-1]))
528 SvCUR_set(formtarget, t - SvPVX(formtarget));
529 FmLINES(formtarget) += lines;
541 if (stack_base + *markstack_ptr == sp) {
543 if (GIMME_V == G_SCALAR)
545 RETURNOP(op->op_next->op_next);
547 stack_sp = stack_base + *markstack_ptr + 1;
548 pp_pushmark(ARGS); /* push dst */
549 pp_pushmark(ARGS); /* push src */
550 ENTER; /* enter outer scope */
554 /* SAVE_DEFSV does *not* suffice here */
555 save_sptr(av_fetch(thr->threadsv, find_threadsv("_"), FALSE));
557 SAVESPTR(GvSV(defgv));
558 #endif /* USE_THREADS */
559 ENTER; /* enter inner scope */
562 src = stack_base[*markstack_ptr];
567 if (op->op_type == OP_MAPSTART)
568 pp_pushmark(ARGS); /* push top */
569 return ((LOGOP*)op->op_next)->op_other;
574 DIE("panic: mapstart"); /* uses grepstart */
580 I32 diff = (sp - stack_base) - *markstack_ptr;
588 if (diff > markstack_ptr[-1] - markstack_ptr[-2]) {
589 shift = diff - (markstack_ptr[-1] - markstack_ptr[-2]);
590 count = (sp - stack_base) - markstack_ptr[-1] + 2;
595 markstack_ptr[-1] += shift;
596 *markstack_ptr += shift;
600 dst = stack_base + (markstack_ptr[-2] += diff) - 1;
603 *dst-- = SvTEMP(TOPs) ? POPs : sv_mortalcopy(POPs);
605 LEAVE; /* exit inner scope */
608 if (markstack_ptr[-1] > *markstack_ptr) {
612 (void)POPMARK; /* pop top */
613 LEAVE; /* exit outer scope */
614 (void)POPMARK; /* pop src */
615 items = --*markstack_ptr - markstack_ptr[-1];
616 (void)POPMARK; /* pop dst */
617 SP = stack_base + POPMARK; /* pop original mark */
618 if (gimme == G_SCALAR) {
622 else if (gimme == G_ARRAY)
629 ENTER; /* enter inner scope */
632 src = stack_base[markstack_ptr[-1]];
636 RETURNOP(cLOGOP->op_other);
642 djSP; dMARK; dORIGMARK;
644 SV **myorigmark = ORIGMARK;
650 OP* nextop = op->op_next;
652 if (gimme != G_ARRAY) {
657 if (op->op_flags & OPf_STACKED) {
659 if (op->op_flags & OPf_SPECIAL) {
660 OP *kid = cLISTOP->op_first->op_sibling; /* pass pushmark */
661 kid = kUNOP->op_first; /* pass rv2gv */
662 kid = kUNOP->op_first; /* pass leave */
663 sortcop = kid->op_next;
664 stash = curcop->cop_stash;
667 cv = sv_2cv(*++MARK, &stash, &gv, 0);
668 if (!(cv && CvROOT(cv))) {
670 SV *tmpstr = sv_newmortal();
671 gv_efullname3(tmpstr, gv, Nullch);
672 if (cv && CvXSUB(cv))
673 DIE("Xsub \"%s\" called in sort", SvPVX(tmpstr));
674 DIE("Undefined sort subroutine \"%s\" called",
679 DIE("Xsub called in sort");
680 DIE("Undefined subroutine in sort");
682 DIE("Not a CODE reference in sort");
684 sortcop = CvSTART(cv);
685 SAVESPTR(CvROOT(cv)->op_ppaddr);
686 CvROOT(cv)->op_ppaddr = ppaddr[OP_NULL];
689 curpad = AvARRAY((AV*)AvARRAY(CvPADLIST(cv))[1]);
694 stash = curcop->cop_stash;
698 while (MARK < SP) { /* This may or may not shift down one here. */
700 if (*up = *++MARK) { /* Weed out nulls. */
702 if (!sortcop && !SvPOK(*up))
703 (void)sv_2pv(*up, &na);
707 max = --up - myorigmark;
713 bool oldcatch = CATCH_GET;
721 AvREAL_off(sortstack);
722 av_extend(sortstack, 32);
725 SWITCHSTACK(curstack, sortstack);
726 if (sortstash != stash) {
727 firstgv = gv_fetchpv("a", TRUE, SVt_PV);
728 secondgv = gv_fetchpv("b", TRUE, SVt_PV);
732 SAVESPTR(GvSV(firstgv));
733 SAVESPTR(GvSV(secondgv));
735 PUSHBLOCK(cx, CXt_NULL, stack_base);
736 if (!(op->op_flags & OPf_SPECIAL)) {
737 bool hasargs = FALSE;
738 cx->cx_type = CXt_SUB;
739 cx->blk_gimme = G_SCALAR;
742 (void)SvREFCNT_inc(cv); /* in preparation for POPSUB */
744 sortcxix = cxstack_ix;
745 qsortsv((myorigmark+1), max, sortcv);
748 SWITCHSTACK(sortstack, oldstack);
755 MEXTEND(SP, 20); /* Can't afford stack realloc on signal. */
756 qsortsv(ORIGMARK+1, max,
757 (op->op_private & OPpLOCALE) ? sv_cmp_locale : sv_cmp);
760 stack_sp = ORIGMARK + max;
768 if (GIMME == G_ARRAY)
769 return cCONDOP->op_true;
770 return SvTRUEx(PAD_SV(op->op_targ)) ? cCONDOP->op_false : cCONDOP->op_true;
777 if (GIMME == G_ARRAY) {
778 RETURNOP(((CONDOP*)cUNOP->op_first)->op_false);
782 SV *targ = PAD_SV(op->op_targ);
784 if ((op->op_private & OPpFLIP_LINENUM)
785 ? last_in_gv && SvIV(sv) == IoLINES(GvIOp(last_in_gv))
787 sv_setiv(PAD_SV(cUNOP->op_first->op_targ), 1);
788 if (op->op_flags & OPf_SPECIAL) {
796 RETURNOP(((CONDOP*)cUNOP->op_first)->op_false);
809 if (GIMME == G_ARRAY) {
815 if (SvNIOKp(left) || !SvPOKp(left) ||
816 (looks_like_number(left) && *SvPVX(left) != '0') )
821 EXTEND_MORTAL(max - i + 1);
822 EXTEND(SP, max - i + 1);
825 sv = sv_2mortal(newSViv(i++));
830 SV *final = sv_mortalcopy(right);
832 char *tmps = SvPV(final, len);
834 sv = sv_mortalcopy(left);
835 while (!SvNIOKp(sv) && SvCUR(sv) <= len &&
836 strNE(SvPVX(sv),tmps) ) {
838 sv = sv_2mortal(newSVsv(sv));
841 if (strEQ(SvPVX(sv),tmps))
847 SV *targ = PAD_SV(cUNOP->op_first->op_targ);
849 if ((op->op_private & OPpFLIP_LINENUM)
850 ? last_in_gv && SvIV(sv) == IoLINES(GvIOp(last_in_gv))
852 sv_setiv(PAD_SV(((UNOP*)cUNOP->op_first)->op_first->op_targ), 0);
853 sv_catpv(targ, "E0");
864 dopoptolabel(char *label)
868 register PERL_CONTEXT *cx;
870 for (i = cxstack_ix; i >= 0; i--) {
872 switch (cx->cx_type) {
875 warn("Exiting substitution via %s", op_name[op->op_type]);
879 warn("Exiting subroutine via %s", op_name[op->op_type]);
883 warn("Exiting eval via %s", op_name[op->op_type]);
887 warn("Exiting pseudo-block via %s", op_name[op->op_type]);
890 if (!cx->blk_loop.label ||
891 strNE(label, cx->blk_loop.label) ) {
892 DEBUG_l(deb("(Skipping label #%ld %s)\n",
893 (long)i, cx->blk_loop.label));
896 DEBUG_l( deb("(Found label #%ld %s)\n", (long)i, label));
906 I32 gimme = block_gimme();
907 return (gimme == G_VOID) ? G_SCALAR : gimme;
916 cxix = dopoptosub(cxstack_ix);
920 switch (cxstack[cxix].blk_gimme) {
926 croak("panic: bad gimme: %d\n", cxstack[cxix].blk_gimme);
933 dopoptosub(I32 startingblock)
937 register PERL_CONTEXT *cx;
938 for (i = startingblock; i >= 0; i--) {
940 switch (cx->cx_type) {
945 DEBUG_l( deb("(Found sub #%ld)\n", (long)i));
953 dopoptoeval(I32 startingblock)
957 register PERL_CONTEXT *cx;
958 for (i = startingblock; i >= 0; i--) {
960 switch (cx->cx_type) {
964 DEBUG_l( deb("(Found eval #%ld)\n", (long)i));
972 dopoptoloop(I32 startingblock)
976 register PERL_CONTEXT *cx;
977 for (i = startingblock; i >= 0; i--) {
979 switch (cx->cx_type) {
982 warn("Exiting substitution via %s", op_name[op->op_type]);
986 warn("Exiting subroutine via %s", op_name[op->op_type]);
990 warn("Exiting eval via %s", op_name[op->op_type]);
994 warn("Exiting pseudo-block via %s", op_name[op->op_type]);
997 DEBUG_l( deb("(Found loop #%ld)\n", (long)i));
1008 register PERL_CONTEXT *cx;
1012 while (cxstack_ix > cxix) {
1013 cx = &cxstack[cxstack_ix];
1014 DEBUG_l(PerlIO_printf(Perl_debug_log, "Unwinding block %ld, type %s\n",
1015 (long) cxstack_ix+1, block_type[cx->cx_type]));
1016 /* Note: we don't need to restore the base context info till the end. */
1017 switch (cx->cx_type) {
1020 continue; /* not break */
1038 die_where(char *message)
1043 register PERL_CONTEXT *cx;
1049 STRLEN klen = strlen(message);
1051 svp = hv_fetch(ERRHV, message, klen, TRUE);
1054 static char prefix[] = "\t(in cleanup) ";
1056 sv_upgrade(*svp, SVt_IV);
1057 (void)SvIOK_only(*svp);
1060 SvGROW(err, SvCUR(err)+sizeof(prefix)+klen);
1061 sv_catpvn(err, prefix, sizeof(prefix)-1);
1062 sv_catpvn(err, message, klen);
1068 sv_setpv(ERRSV, message);
1070 cxix = dopoptoeval(cxstack_ix);
1074 if (cxix < cxstack_ix)
1078 if (cx->cx_type != CXt_EVAL) {
1079 PerlIO_printf(PerlIO_stderr(), "panic: die %s", message);
1084 if (gimme == G_SCALAR)
1085 *++newsp = &sv_undef;
1090 if (optype == OP_REQUIRE) {
1091 char* msg = SvPVx(ERRSV, na);
1092 DIE("%s", *msg ? msg : "Compilation failed in require");
1094 return pop_return();
1097 PerlIO_printf(PerlIO_stderr(), "%s",message);
1098 PerlIO_flush(PerlIO_stderr());
1107 if (SvTRUE(left) != SvTRUE(right))
1119 RETURNOP(cLOGOP->op_other);
1128 RETURNOP(cLOGOP->op_other);
1134 register I32 cxix = dopoptosub(cxstack_ix);
1135 register PERL_CONTEXT *cx;
1146 if (GIMME != G_ARRAY)
1150 if (DBsub && cxix >= 0 &&
1151 cxstack[cxix].blk_sub.cv == GvCV(DBsub))
1155 cxix = dopoptosub(cxix - 1);
1157 cx = &cxstack[cxix];
1158 if (cxstack[cxix].cx_type == CXt_SUB) {
1159 dbcxix = dopoptosub(cxix - 1);
1160 /* We expect that cxstack[dbcxix] is CXt_SUB, anyway, the
1161 field below is defined for any cx. */
1162 if (DBsub && dbcxix >= 0 && cxstack[dbcxix].blk_sub.cv == GvCV(DBsub))
1163 cx = &cxstack[dbcxix];
1166 if (GIMME != G_ARRAY) {
1169 sv_setpv(TARG, HvNAME(cx->blk_oldcop->cop_stash));
1174 PUSHs(sv_2mortal(newSVpv(HvNAME(cx->blk_oldcop->cop_stash), 0)));
1175 PUSHs(sv_2mortal(newSVpv(SvPVX(GvSV(cx->blk_oldcop->cop_filegv)), 0)));
1176 PUSHs(sv_2mortal(newSViv((I32)cx->blk_oldcop->cop_line)));
1179 if (cx->cx_type == CXt_SUB) { /* So is cxstack[dbcxix]. */
1181 gv_efullname3(sv, CvGV(cxstack[cxix].blk_sub.cv), Nullch);
1182 PUSHs(sv_2mortal(sv));
1183 PUSHs(sv_2mortal(newSViv((I32)cx->blk_sub.hasargs)));
1186 PUSHs(sv_2mortal(newSVpv("(eval)",0)));
1187 PUSHs(sv_2mortal(newSViv(0)));
1189 gimme = (I32)cx->blk_gimme;
1190 if (gimme == G_VOID)
1193 PUSHs(sv_2mortal(newSViv(gimme & G_ARRAY)));
1194 if (cx->cx_type == CXt_EVAL) {
1195 if (cx->blk_eval.old_op_type == OP_ENTEREVAL) {
1196 PUSHs(cx->blk_eval.cur_text);
1199 else if (cx->blk_eval.old_name) { /* Try blocks have old_name == 0. */
1200 /* Require, put the name. */
1201 PUSHs(sv_2mortal(newSVpv(cx->blk_eval.old_name, 0)));
1205 else if (cx->cx_type == CXt_SUB &&
1206 cx->blk_sub.hasargs &&
1207 curcop->cop_stash == debstash)
1209 AV *ary = cx->blk_sub.argarray;
1210 int off = AvARRAY(ary) - AvALLOC(ary);
1214 dbargs = GvAV(gv_AVadd(tmpgv = gv_fetchpv("DB::args", TRUE,
1217 AvREAL_off(dbargs); /* XXX Should be REIFY */
1220 if (AvMAX(dbargs) < AvFILLp(ary) + off)
1221 av_extend(dbargs, AvFILLp(ary) + off);
1222 Copy(AvALLOC(ary), AvARRAY(dbargs), AvFILLp(ary) + 1 + off, SV*);
1223 AvFILLp(dbargs) = AvFILLp(ary) + off;
1229 sortcv(SV *a, SV *b)
1232 I32 oldsaveix = savestack_ix;
1233 I32 oldscopeix = scopestack_ix;
1237 stack_sp = stack_base;
1240 if (stack_sp != stack_base + 1)
1241 croak("Sort subroutine didn't return single value");
1242 if (!SvNIOKp(*stack_sp))
1243 croak("Sort subroutine didn't return a numeric value");
1244 result = SvIV(*stack_sp);
1245 while (scopestack_ix > oldscopeix) {
1248 leave_scope(oldsaveix);
1261 sv_reset(tmps, curcop->cop_stash);
1274 TAINT_NOT; /* Each statement is presumed innocent */
1275 stack_sp = stack_base + cxstack[cxstack_ix].blk_oldsp;
1278 if (op->op_private || SvIV(DBsingle) || SvIV(DBsignal) || SvIV(DBtrace))
1282 register PERL_CONTEXT *cx;
1283 I32 gimme = G_ARRAY;
1290 DIE("No DB::DB routine defined");
1292 if (CvDEPTH(cv) >= 1 && !(debug & (1<<30))) /* don't do recursive DB::DB call */
1304 push_return(op->op_next);
1305 PUSHBLOCK(cx, CXt_SUB, sp);
1308 (void)SvREFCNT_inc(cv);
1310 curpad = AvARRAY((AV*)*av_fetch(CvPADLIST(cv),1,FALSE));
1311 RETURNOP(CvSTART(cv));
1325 register PERL_CONTEXT *cx;
1326 I32 gimme = GIMME_V;
1333 if (op->op_flags & OPf_SPECIAL)
1334 svp = save_threadsv(op->op_targ); /* per-thread variable */
1336 #endif /* USE_THREADS */
1338 svp = &curpad[op->op_targ]; /* "my" variable */
1342 svp = &GvSV((GV*)POPs); /* symbol table variable */
1348 PUSHBLOCK(cx, CXt_LOOP, SP);
1349 PUSHLOOP(cx, svp, MARK);
1350 if (op->op_flags & OPf_STACKED)
1351 cx->blk_loop.iterary = (AV*)SvREFCNT_inc(POPs);
1353 cx->blk_loop.iterary = curstack;
1354 AvFILLp(curstack) = sp - stack_base;
1355 cx->blk_loop.iterix = MARK - stack_base;
1364 register PERL_CONTEXT *cx;
1365 I32 gimme = GIMME_V;
1371 PUSHBLOCK(cx, CXt_LOOP, SP);
1372 PUSHLOOP(cx, 0, SP);
1380 register PERL_CONTEXT *cx;
1381 struct block_loop cxloop;
1389 POPLOOP1(cx); /* Delay POPLOOP2 until stack values are safe */
1392 if (gimme == G_VOID)
1394 else if (gimme == G_SCALAR) {
1396 *++newsp = sv_mortalcopy(*SP);
1398 *++newsp = &sv_undef;
1402 *++newsp = sv_mortalcopy(*++mark);
1403 TAINT_NOT; /* Each item is independent */
1409 POPLOOP2(); /* Stack values are safe: release loop vars ... */
1410 curpm = newpm; /* ... and pop $1 et al */
1422 register PERL_CONTEXT *cx;
1423 struct block_sub cxsub;
1424 bool popsub2 = FALSE;
1430 if (curstack == sortstack) {
1431 if (cxstack_ix == sortcxix || dopoptosub(cxstack_ix) <= sortcxix) {
1432 if (cxstack_ix > sortcxix)
1434 AvARRAY(curstack)[1] = *SP;
1435 stack_sp = stack_base + 1;
1440 cxix = dopoptosub(cxstack_ix);
1442 DIE("Can't return outside a subroutine");
1443 if (cxix < cxstack_ix)
1447 switch (cx->cx_type) {
1449 POPSUB1(cx); /* Delay POPSUB2 until stack values are safe */
1454 if (optype == OP_REQUIRE &&
1455 (MARK == SP || (gimme == G_SCALAR && !SvTRUE(*SP))) )
1457 /* Unassume the success we assumed earlier. */
1458 char *name = cx->blk_eval.old_name;
1459 (void)hv_delete(GvHVn(incgv), name, strlen(name), G_DISCARD);
1460 DIE("%s did not return a true value", name);
1464 DIE("panic: return");
1468 if (gimme == G_SCALAR) {
1470 *++newsp = (popsub2 && SvTEMP(*SP))
1471 ? *SP : sv_mortalcopy(*SP);
1473 *++newsp = &sv_undef;
1475 else if (gimme == G_ARRAY) {
1476 while (++MARK <= SP) {
1477 *++newsp = (popsub2 && SvTEMP(*MARK))
1478 ? *MARK : sv_mortalcopy(*MARK);
1479 TAINT_NOT; /* Each item is independent */
1484 /* Stack values are safe: */
1486 POPSUB2(); /* release CV and @_ ... */
1488 curpm = newpm; /* ... and pop $1 et al */
1491 return pop_return();
1498 register PERL_CONTEXT *cx;
1499 struct block_loop cxloop;
1500 struct block_sub cxsub;
1507 SV **mark = stack_base + cxstack[cxstack_ix].blk_oldsp;
1509 if (op->op_flags & OPf_SPECIAL) {
1510 cxix = dopoptoloop(cxstack_ix);
1512 DIE("Can't \"last\" outside a block");
1515 cxix = dopoptolabel(cPVOP->op_pv);
1517 DIE("Label not found for \"last %s\"", cPVOP->op_pv);
1519 if (cxix < cxstack_ix)
1523 switch (cx->cx_type) {
1525 POPLOOP1(cx); /* Delay POPLOOP2 until stack values are safe */
1527 nextop = cxloop.last_op->op_next;
1530 POPSUB1(cx); /* Delay POPSUB2 until stack values are safe */
1532 nextop = pop_return();
1536 nextop = pop_return();
1543 if (gimme == G_SCALAR) {
1545 *++newsp = ((pop2 == CXt_SUB) && SvTEMP(*SP))
1546 ? *SP : sv_mortalcopy(*SP);
1548 *++newsp = &sv_undef;
1550 else if (gimme == G_ARRAY) {
1551 while (++MARK <= SP) {
1552 *++newsp = ((pop2 == CXt_SUB) && SvTEMP(*MARK))
1553 ? *MARK : sv_mortalcopy(*MARK);
1554 TAINT_NOT; /* Each item is independent */
1560 /* Stack values are safe: */
1563 POPLOOP2(); /* release loop vars ... */
1567 POPSUB2(); /* release CV and @_ ... */
1570 curpm = newpm; /* ... and pop $1 et al */
1579 register PERL_CONTEXT *cx;
1582 if (op->op_flags & OPf_SPECIAL) {
1583 cxix = dopoptoloop(cxstack_ix);
1585 DIE("Can't \"next\" outside a block");
1588 cxix = dopoptolabel(cPVOP->op_pv);
1590 DIE("Label not found for \"next %s\"", cPVOP->op_pv);
1592 if (cxix < cxstack_ix)
1596 oldsave = scopestack[scopestack_ix - 1];
1597 LEAVE_SCOPE(oldsave);
1598 return cx->blk_loop.next_op;
1604 register PERL_CONTEXT *cx;
1607 if (op->op_flags & OPf_SPECIAL) {
1608 cxix = dopoptoloop(cxstack_ix);
1610 DIE("Can't \"redo\" outside a block");
1613 cxix = dopoptolabel(cPVOP->op_pv);
1615 DIE("Label not found for \"redo %s\"", cPVOP->op_pv);
1617 if (cxix < cxstack_ix)
1621 oldsave = scopestack[scopestack_ix - 1];
1622 LEAVE_SCOPE(oldsave);
1623 return cx->blk_loop.redo_op;
1626 static OP* lastgotoprobe;
1629 dofindlabel(OP *o, char *label, OP **opstack, OP **oplimit)
1633 static char too_deep[] = "Target of goto is too deeply nested";
1637 if (o->op_type == OP_LEAVE ||
1638 o->op_type == OP_SCOPE ||
1639 o->op_type == OP_LEAVELOOP ||
1640 o->op_type == OP_LEAVETRY)
1642 *ops++ = cUNOPo->op_first;
1647 if (o->op_flags & OPf_KIDS) {
1648 /* First try all the kids at this level, since that's likeliest. */
1649 for (kid = cUNOPo->op_first; kid; kid = kid->op_sibling) {
1650 if ((kid->op_type == OP_NEXTSTATE || kid->op_type == OP_DBSTATE) &&
1651 kCOP->cop_label && strEQ(kCOP->cop_label, label))
1654 for (kid = cUNOPo->op_first; kid; kid = kid->op_sibling) {
1655 if (kid == lastgotoprobe)
1657 if ((kid->op_type == OP_NEXTSTATE || kid->op_type == OP_DBSTATE) &&
1659 (ops[-1]->op_type != OP_NEXTSTATE &&
1660 ops[-1]->op_type != OP_DBSTATE)))
1662 if (o = dofindlabel(kid, label, ops, oplimit))
1672 return pp_goto(ARGS);
1681 register PERL_CONTEXT *cx;
1682 #define GOTO_DEPTH 64
1683 OP *enterops[GOTO_DEPTH];
1685 int do_dump = (op->op_type == OP_DUMP);
1688 if (op->op_flags & OPf_STACKED) {
1691 /* This egregious kludge implements goto &subroutine */
1692 if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVCV) {
1694 register PERL_CONTEXT *cx;
1695 CV* cv = (CV*)SvRV(sv);
1700 if (!CvROOT(cv) && !CvXSUB(cv)) {
1702 SV *tmpstr = sv_newmortal();
1703 gv_efullname3(tmpstr, CvGV(cv), Nullch);
1704 DIE("Goto undefined subroutine &%s",SvPVX(tmpstr));
1706 DIE("Goto undefined subroutine");
1709 /* First do some returnish stuff. */
1710 cxix = dopoptosub(cxstack_ix);
1712 DIE("Can't goto subroutine outside a subroutine");
1713 if (cxix < cxstack_ix)
1717 if (cx->blk_sub.hasargs) { /* put @_ back onto stack */
1718 AV* av = cx->blk_sub.argarray;
1720 items = AvFILLp(av) + 1;
1722 EXTEND(stack_sp, items); /* @_ could have been extended. */
1723 Copy(AvARRAY(av), stack_sp, items, SV*);
1726 SvREFCNT_dec(GvAV(defgv));
1727 GvAV(defgv) = cx->blk_sub.savearray;
1728 #endif /* USE_THREADS */
1732 if (!(CvDEPTH(cx->blk_sub.cv) = cx->blk_sub.olddepth))
1733 SvREFCNT_dec(cx->blk_sub.cv);
1734 oldsave = scopestack[scopestack_ix - 1];
1735 LEAVE_SCOPE(oldsave);
1737 /* Now do some callish stuff. */
1740 if (CvOLDSTYLE(cv)) {
1741 I32 (*fp3)_((int,int,int));
1746 fp3 = (I32(*)_((int,int,int)))CvXSUB(cv);
1747 items = (*fp3)(CvXSUBANY(cv).any_i32,
1748 mark - stack_base + 1,
1750 sp = stack_base + items;
1753 stack_sp--; /* There is no cv arg. */
1754 (void)(*CvXSUB(cv))(THIS_ cv);
1757 return pop_return();
1760 AV* padlist = CvPADLIST(cv);
1761 SV** svp = AvARRAY(padlist);
1762 cx->blk_sub.cv = cv;
1763 cx->blk_sub.olddepth = CvDEPTH(cv);
1765 if (CvDEPTH(cv) < 2)
1766 (void)SvREFCNT_inc(cv);
1767 else { /* save temporaries on recursion? */
1768 if (CvDEPTH(cv) == 100 && dowarn)
1769 sub_crush_depth(cv);
1770 if (CvDEPTH(cv) > AvFILLp(padlist)) {
1771 AV *newpad = newAV();
1772 SV **oldpad = AvARRAY(svp[CvDEPTH(cv)-1]);
1773 I32 ix = AvFILLp((AV*)svp[1]);
1774 svp = AvARRAY(svp[0]);
1775 for ( ;ix > 0; ix--) {
1776 if (svp[ix] != &sv_undef) {
1777 char *name = SvPVX(svp[ix]);
1778 if ((SvFLAGS(svp[ix]) & SVf_FAKE)
1781 /* outer lexical or anon code */
1782 av_store(newpad, ix,
1783 SvREFCNT_inc(oldpad[ix]) );
1785 else { /* our own lexical */
1787 av_store(newpad, ix, sv = (SV*)newAV());
1788 else if (*name == '%')
1789 av_store(newpad, ix, sv = (SV*)newHV());
1791 av_store(newpad, ix, sv = NEWSV(0,0));
1796 av_store(newpad, ix, sv = NEWSV(0,0));
1800 if (cx->blk_sub.hasargs) {
1803 av_store(newpad, 0, (SV*)av);
1804 AvFLAGS(av) = AVf_REIFY;
1806 av_store(padlist, CvDEPTH(cv), (SV*)newpad);
1807 AvFILLp(padlist) = CvDEPTH(cv);
1808 svp = AvARRAY(padlist);
1812 if (!cx->blk_sub.hasargs) {
1813 AV* av = (AV*)curpad[0];
1815 items = AvFILLp(av) + 1;
1817 /* Mark is at the end of the stack. */
1819 Copy(AvARRAY(av), sp + 1, items, SV*);
1824 #endif /* USE_THREADS */
1826 curpad = AvARRAY((AV*)svp[CvDEPTH(cv)]);
1828 if (cx->blk_sub.hasargs)
1829 #endif /* USE_THREADS */
1831 AV* av = (AV*)curpad[0];
1835 cx->blk_sub.savearray = GvAV(defgv);
1836 GvAV(defgv) = (AV*)SvREFCNT_inc(av);
1837 #endif /* USE_THREADS */
1838 cx->blk_sub.argarray = av;
1841 if (items >= AvMAX(av) + 1) {
1843 if (AvARRAY(av) != ary) {
1844 AvMAX(av) += AvARRAY(av) - AvALLOC(av);
1845 SvPVX(av) = (char*)ary;
1847 if (items >= AvMAX(av) + 1) {
1848 AvMAX(av) = items - 1;
1849 Renew(ary,items+1,SV*);
1851 SvPVX(av) = (char*)ary;
1854 Copy(mark,AvARRAY(av),items,SV*);
1855 AvFILLp(av) = items - 1;
1863 if (PERLDB_SUB && curstash != debstash) {
1865 * We do not care about using sv to call CV;
1866 * it's for informational purposes only.
1868 SV *sv = GvSV(DBsub);
1870 gv_efullname3(sv, CvGV(cv), Nullch);
1872 RETURNOP(CvSTART(cv));
1876 label = SvPV(sv,na);
1878 else if (op->op_flags & OPf_SPECIAL) {
1880 DIE("goto must have label");
1883 label = cPVOP->op_pv;
1885 if (label && *label) {
1892 for (ix = cxstack_ix; ix >= 0; ix--) {
1894 switch (cx->cx_type) {
1896 gotoprobe = eval_root; /* XXX not good for nested eval */
1899 gotoprobe = cx->blk_oldcop->op_sibling;
1905 gotoprobe = cx->blk_oldcop->op_sibling;
1907 gotoprobe = main_root;
1910 if (CvDEPTH(cx->blk_sub.cv)) {
1911 gotoprobe = CvROOT(cx->blk_sub.cv);
1916 DIE("Can't \"goto\" outside a block");
1920 gotoprobe = main_root;
1923 retop = dofindlabel(gotoprobe, label,
1924 enterops, enterops + GOTO_DEPTH);
1927 lastgotoprobe = gotoprobe;
1930 DIE("Can't find label %s", label);
1932 /* pop unwanted frames */
1934 if (ix < cxstack_ix) {
1941 oldsave = scopestack[scopestack_ix];
1942 LEAVE_SCOPE(oldsave);
1945 /* push wanted frames */
1947 if (*enterops && enterops[1]) {
1949 for (ix = 1; enterops[ix]; ix++) {
1951 /* Eventually we may want to stack the needed arguments
1952 * for each op. For now, we punt on the hard ones. */
1953 if (op->op_type == OP_ENTERITER)
1954 DIE("Can't \"goto\" into the middle of a foreach loop",
1956 (CALLOP->op_ppaddr)(ARGS);
1964 if (!retop) retop = main_start;
1971 restartop = 0; /* hmm, must be GNU unexec().. */
1975 if (curstack == signalstack) {
1993 if (anum == 1 && VMSISH_EXIT)
2006 double value = SvNVx(GvSV(cCOP->cop_gv));
2007 register I32 match = I_32(value);
2010 if (((double)match) > value)
2011 --match; /* was fractional--truncate other way */
2013 match -= cCOP->uop.scop.scop_offset;
2016 else if (match > cCOP->uop.scop.scop_max)
2017 match = cCOP->uop.scop.scop_max;
2018 op = cCOP->uop.scop.scop_next[match];
2028 op = op->op_next; /* can't assume anything */
2030 match = *(SvPVx(GvSV(cCOP->cop_gv), na)) & 255;
2031 match -= cCOP->uop.scop.scop_offset;
2034 else if (match > cCOP->uop.scop.scop_max)
2035 match = cCOP->uop.scop.scop_max;
2036 op = cCOP->uop.scop.scop_next[match];
2045 save_lines(AV *array, SV *sv)
2047 register char *s = SvPVX(sv);
2048 register char *send = SvPVX(sv) + SvCUR(sv);
2050 register I32 line = 1;
2052 while (s && s < send) {
2053 SV *tmpstr = NEWSV(85,0);
2055 sv_upgrade(tmpstr, SVt_PVMG);
2056 t = strchr(s, '\n');
2062 sv_setpvn(tmpstr, s, t - s);
2063 av_store(array, line++, tmpstr);
2078 assert(CATCH_GET == TRUE);
2079 DEBUG_l(deb("Setting up local jumplevel %p, was %p\n", &cur_env, top_env));
2083 default: /* topmost level handles it */
2090 PerlIO_printf(PerlIO_stderr(), "panic: restartop\n");
2106 sv_compile_2op(SV *sv, OP** startop, char *code, AV** avp)
2107 /* sv Text to convert to OP tree. */
2108 /* startop op_free() this to undo. */
2109 /* code Short string id of the caller. */
2111 dSP; /* Make POPBLOCK work. */
2114 I32 gimme = 0; /* SUSPECT - INITIALZE TO WHAT? NI-S */
2118 char tmpbuf[TYPE_DIGITS(long) + 12 + 10];
2124 /* switch to eval mode */
2126 SAVESPTR(compiling.cop_filegv);
2127 SAVEI16(compiling.cop_line);
2128 sprintf(tmpbuf, "_<(%.10s_eval %lu)", code, (unsigned long)++evalseq);
2129 compiling.cop_filegv = gv_fetchfile(tmpbuf+2);
2130 compiling.cop_line = 1;
2131 /* XXX For C<eval "...">s within BEGIN {} blocks, this ends up
2132 deleting the eval's FILEGV from the stash before gv_check() runs
2133 (i.e. before run-time proper). To work around the coredump that
2134 ensues, we always turn GvMULTI_on for any globals that were
2135 introduced within evals. See force_ident(). GSAR 96-10-12 */
2136 safestr = savepv(tmpbuf);
2137 SAVEDELETE(defstash, safestr, strlen(safestr));
2143 op->op_type = 0; /* Avoid uninit warning. */
2144 op->op_flags = 0; /* Avoid uninit warning. */
2145 PUSHBLOCK(cx, CXt_EVAL, SP);
2146 PUSHEVAL(cx, 0, compiling.cop_filegv);
2147 rop = doeval(G_SCALAR, startop);
2151 (*startop)->op_type = OP_NULL;
2152 (*startop)->op_ppaddr = ppaddr[OP_NULL];
2154 *avp = (AV*)SvREFCNT_inc(comppad);
2159 /* With USE_THREADS, eval_owner must be held on entry to doeval */
2161 doeval(int gimme, OP** startop)
2174 /* set up a scratch pad */
2179 SAVESPTR(comppad_name);
2180 SAVEI32(comppad_name_fill);
2181 SAVEI32(min_intro_pending);
2182 SAVEI32(max_intro_pending);
2185 for (i = cxstack_ix - 1; i >= 0; i--) {
2186 PERL_CONTEXT *cx = &cxstack[i];
2187 if (cx->cx_type == CXt_EVAL)
2189 else if (cx->cx_type == CXt_SUB) {
2190 caller = cx->blk_sub.cv;
2196 compcv = (CV*)NEWSV(1104,0);
2197 sv_upgrade((SV *)compcv, SVt_PVCV);
2198 CvUNIQUE_on(compcv);
2200 CvOWNER(compcv) = 0;
2201 New(666, CvMUTEXP(compcv), 1, perl_mutex);
2202 MUTEX_INIT(CvMUTEXP(compcv));
2203 #endif /* USE_THREADS */
2206 av_push(comppad, Nullsv);
2207 curpad = AvARRAY(comppad);
2208 comppad_name = newAV();
2209 comppad_name_fill = 0;
2210 min_intro_pending = 0;
2213 av_store(comppad_name, 0, newSVpv("@_", 2));
2214 curpad[0] = (SV*)newAV();
2215 SvPADMY_on(curpad[0]); /* XXX Needed? */
2216 #endif /* USE_THREADS */
2218 comppadlist = newAV();
2219 AvREAL_off(comppadlist);
2220 av_store(comppadlist, 0, (SV*)comppad_name);
2221 av_store(comppadlist, 1, (SV*)comppad);
2222 CvPADLIST(compcv) = comppadlist;
2224 if (!saveop || saveop->op_type != OP_REQUIRE)
2225 CvOUTSIDE(compcv) = (CV*)SvREFCNT_inc(caller);
2229 /* make sure we compile in the right package */
2231 newstash = curcop->cop_stash;
2232 if (curstash != newstash) {
2234 curstash = newstash;
2238 SAVEFREESV(beginav);
2240 /* try to compile it */
2244 curcop = &compiling;
2245 curcop->cop_arybase = 0;
2247 rs = newSVpv("\n", 1);
2248 if (saveop && saveop->op_flags & OPf_SPECIAL)
2252 if (yyparse() || error_count || !eval_root) {
2256 I32 optype = 0; /* Might be reset by POPEVAL. */
2263 SP = stack_base + POPMARK; /* pop original mark */
2271 if (optype == OP_REQUIRE) {
2272 char* msg = SvPVx(ERRSV, na);
2273 DIE("%s", *msg ? msg : "Compilation failed in require");
2274 } else if (startop) {
2275 char* msg = SvPVx(ERRSV, na);
2279 croak("%sCompilation failed in regexp", (*msg ? msg : "Unknown error\n"));
2282 rs = SvREFCNT_inc(nrs);
2284 MUTEX_LOCK(&eval_mutex);
2286 COND_SIGNAL(&eval_cond);
2287 MUTEX_UNLOCK(&eval_mutex);
2288 #endif /* USE_THREADS */
2292 rs = SvREFCNT_inc(nrs);
2293 compiling.cop_line = 0;
2295 *startop = eval_root;
2296 SvREFCNT_dec(CvOUTSIDE(compcv));
2297 CvOUTSIDE(compcv) = Nullcv;
2299 SAVEFREEOP(eval_root);
2301 scalarvoid(eval_root);
2302 else if (gimme & G_ARRAY)
2307 DEBUG_x(dump_eval());
2309 /* Register with debugger: */
2310 if (PERLDB_INTER && saveop->op_type == OP_REQUIRE) {
2311 CV *cv = perl_get_cv("DB::postponed", FALSE);
2315 XPUSHs((SV*)compiling.cop_filegv);
2317 perl_call_sv((SV*)cv, G_DISCARD);
2321 /* compiled okay, so do it */
2323 CvDEPTH(compcv) = 1;
2324 SP = stack_base + POPMARK; /* pop original mark */
2325 op = saveop; /* The caller may need it. */
2327 MUTEX_LOCK(&eval_mutex);
2329 COND_SIGNAL(&eval_cond);
2330 MUTEX_UNLOCK(&eval_mutex);
2331 #endif /* USE_THREADS */
2333 RETURNOP(eval_start);
2339 register PERL_CONTEXT *cx;
2343 SV *namesv = Nullsv;
2345 I32 gimme = G_SCALAR;
2346 PerlIO *tryrsfp = 0;
2349 if (SvNIOKp(sv) && !SvPOKp(sv)) {
2350 SET_NUMERIC_STANDARD();
2351 if (atof(patchlevel) + 0.00000999 < SvNV(sv))
2352 DIE("Perl %s required--this is only version %s, stopped",
2353 SvPV(sv,na),patchlevel);
2356 name = SvPV(sv, na);
2358 DIE("Null filename used");
2359 TAINT_PROPER("require");
2360 if (op->op_type == OP_REQUIRE &&
2361 (svp = hv_fetch(GvHVn(incgv), name, SvCUR(sv), 0)) &&
2365 /* prepare to compile file */
2370 (name[1] == '.' && name[2] == '/')))
2372 || (name[0] && name[1] == ':')
2375 || (name[0] == '\\' && name[1] == '\\') /* UNC path */
2378 || (strchr(name,':') || ((*name == '[' || *name == '<') &&
2379 (isALNUM(name[1]) || strchr("$-_]>",name[1]))))
2384 tryrsfp = PerlIO_open(name,PERL_SCRIPT_MODE);
2387 AV *ar = GvAVn(incgv);
2391 if ((unixname = tounixspec(name, Nullch)) != Nullch)
2394 namesv = NEWSV(806, 0);
2395 for (i = 0; i <= AvFILL(ar); i++) {
2396 char *dir = SvPVx(*av_fetch(ar, i, TRUE), na);
2399 if ((unixdir = tounixpath(dir, Nullch)) == Nullch)
2401 sv_setpv(namesv, unixdir);
2402 sv_catpv(namesv, unixname);
2404 sv_setpvf(namesv, "%s/%s", dir, name);
2406 tryname = SvPVX(namesv);
2407 tryrsfp = PerlIO_open(tryname, PERL_SCRIPT_MODE);
2409 if (tryname[0] == '.' && tryname[1] == '/')
2416 SAVESPTR(compiling.cop_filegv);
2417 compiling.cop_filegv = gv_fetchfile(tryrsfp ? tryname : name);
2418 SvREFCNT_dec(namesv);
2420 if (op->op_type == OP_REQUIRE) {
2421 SV *msg = sv_2mortal(newSVpvf("Can't locate %s in @INC", name));
2422 SV *dirmsgsv = NEWSV(0, 0);
2423 AV *ar = GvAVn(incgv);
2425 if (instr(SvPVX(msg), ".h "))
2426 sv_catpv(msg, " (change .h to .ph maybe?)");
2427 if (instr(SvPVX(msg), ".ph "))
2428 sv_catpv(msg, " (did you run h2ph?)");
2429 sv_catpv(msg, " (@INC contains:");
2430 for (i = 0; i <= AvFILL(ar); i++) {
2431 char *dir = SvPVx(*av_fetch(ar, i, TRUE), na);
2432 sv_setpvf(dirmsgsv, " %s", dir);
2433 sv_catsv(msg, dirmsgsv);
2435 sv_catpvn(msg, ")", 1);
2436 SvREFCNT_dec(dirmsgsv);
2443 /* Assume success here to prevent recursive requirement. */
2444 (void)hv_store(GvHVn(incgv), name, strlen(name),
2445 newSVsv(GvSV(compiling.cop_filegv)), 0 );
2449 lex_start(sv_2mortal(newSVpv("",0)));
2451 save_aptr(&rsfp_filters);
2452 rsfp_filters = NULL;
2456 name = savepv(name);
2461 /* switch to eval mode */
2463 push_return(op->op_next);
2464 PUSHBLOCK(cx, CXt_EVAL, SP);
2465 PUSHEVAL(cx, name, compiling.cop_filegv);
2467 compiling.cop_line = 0;
2471 MUTEX_LOCK(&eval_mutex);
2472 if (eval_owner && eval_owner != thr)
2474 COND_WAIT(&eval_cond, &eval_mutex);
2476 MUTEX_UNLOCK(&eval_mutex);
2477 #endif /* USE_THREADS */
2478 return DOCATCH(doeval(G_SCALAR, NULL));
2483 return pp_require(ARGS);
2489 register PERL_CONTEXT *cx;
2491 I32 gimme = GIMME_V, was = sub_generation;
2492 char tmpbuf[TYPE_DIGITS(long) + 12];
2497 if (!SvPV(sv,len) || !len)
2499 TAINT_PROPER("eval");
2505 /* switch to eval mode */
2507 SAVESPTR(compiling.cop_filegv);
2508 sprintf(tmpbuf, "_<(eval %lu)", (unsigned long)++evalseq);
2509 compiling.cop_filegv = gv_fetchfile(tmpbuf+2);
2510 compiling.cop_line = 1;
2511 /* XXX For C<eval "...">s within BEGIN {} blocks, this ends up
2512 deleting the eval's FILEGV from the stash before gv_check() runs
2513 (i.e. before run-time proper). To work around the coredump that
2514 ensues, we always turn GvMULTI_on for any globals that were
2515 introduced within evals. See force_ident(). GSAR 96-10-12 */
2516 safestr = savepv(tmpbuf);
2517 SAVEDELETE(defstash, safestr, strlen(safestr));
2519 hints = op->op_targ;
2521 push_return(op->op_next);
2522 PUSHBLOCK(cx, CXt_EVAL, SP);
2523 PUSHEVAL(cx, 0, compiling.cop_filegv);
2525 /* prepare to compile string */
2527 if (PERLDB_LINE && curstash != debstash)
2528 save_lines(GvAV(compiling.cop_filegv), linestr);
2531 MUTEX_LOCK(&eval_mutex);
2532 if (eval_owner && eval_owner != thr)
2534 COND_WAIT(&eval_cond, &eval_mutex);
2536 MUTEX_UNLOCK(&eval_mutex);
2537 #endif /* USE_THREADS */
2538 ret = doeval(gimme, NULL);
2539 if (PERLDB_INTER && was != sub_generation /* Some subs defined here. */
2540 && ret != op->op_next) { /* Successive compilation. */
2541 strcpy(safestr, "_<(eval )"); /* Anything fake and short. */
2543 return DOCATCH(ret);
2553 register PERL_CONTEXT *cx;
2555 U8 save_flags = op -> op_flags;
2560 retop = pop_return();
2563 if (gimme == G_VOID)
2565 else if (gimme == G_SCALAR) {
2568 if (SvFLAGS(TOPs) & SVs_TEMP)
2571 *MARK = sv_mortalcopy(TOPs);
2579 /* in case LEAVE wipes old return values */
2580 for (mark = newsp + 1; mark <= SP; mark++) {
2581 if (!(SvFLAGS(*mark) & SVs_TEMP)) {
2582 *mark = sv_mortalcopy(*mark);
2583 TAINT_NOT; /* Each item is independent */
2587 curpm = newpm; /* Don't pop $1 et al till now */
2590 * Closures mentioned at top level of eval cannot be referenced
2591 * again, and their presence indirectly causes a memory leak.
2592 * (Note that the fact that compcv and friends are still set here
2593 * is, AFAIK, an accident.) --Chip
2595 if (AvFILLp(comppad_name) >= 0) {
2596 SV **svp = AvARRAY(comppad_name);
2598 for (ix = AvFILLp(comppad_name); ix >= 0; ix--) {
2600 if (sv && sv != &sv_undef && *SvPVX(sv) == '&') {
2602 svp[ix] = &sv_undef;
2606 SvREFCNT_dec(CvOUTSIDE(sv));
2607 CvOUTSIDE(sv) = Nullcv;
2620 assert(CvDEPTH(compcv) == 1);
2622 CvDEPTH(compcv) = 0;
2624 if (optype == OP_REQUIRE &&
2625 !(gimme == G_SCALAR ? SvTRUE(*sp) : sp > newsp))
2627 /* Unassume the success we assumed earlier. */
2628 char *name = cx->blk_eval.old_name;
2629 (void)hv_delete(GvHVn(incgv), name, strlen(name), G_DISCARD);
2630 retop = die("%s did not return a true value", name);
2636 if (!(save_flags & OPf_SPECIAL))
2645 register PERL_CONTEXT *cx;
2646 I32 gimme = GIMME_V;
2651 push_return(cLOGOP->op_other->op_next);
2652 PUSHBLOCK(cx, CXt_EVAL, SP);
2654 eval_root = op; /* Only needed so that goto works right. */
2659 return DOCATCH(op->op_next);
2669 register PERL_CONTEXT *cx;
2677 if (gimme == G_VOID)
2679 else if (gimme == G_SCALAR) {
2682 if (SvFLAGS(TOPs) & (SVs_PADTMP|SVs_TEMP))
2685 *MARK = sv_mortalcopy(TOPs);
2694 /* in case LEAVE wipes old return values */
2695 for (mark = newsp + 1; mark <= SP; mark++) {
2696 if (!(SvFLAGS(*mark) & (SVs_PADTMP|SVs_TEMP))) {
2697 *mark = sv_mortalcopy(*mark);
2698 TAINT_NOT; /* Each item is independent */
2702 curpm = newpm; /* Don't pop $1 et al till now */
2713 register char *s = SvPV_force(sv, len);
2714 register char *send = s + len;
2715 register char *base;
2716 register I32 skipspaces = 0;
2719 bool postspace = FALSE;
2727 croak("Null picture in formline");
2729 New(804, fops, (send - s)*3+10, U16); /* Almost certainly too long... */
2734 *fpc++ = FF_LINEMARK;
2735 noblank = repeat = FALSE;
2753 case ' ': case '\t':
2764 *fpc++ = FF_LITERAL;
2772 *fpc++ = skipspaces;
2776 *fpc++ = FF_NEWLINE;
2780 arg = fpc - linepc + 1;
2787 *fpc++ = FF_LINEMARK;
2788 noblank = repeat = FALSE;
2797 ischop = s[-1] == '^';
2803 arg = (s - base) - 1;
2805 *fpc++ = FF_LITERAL;
2814 *fpc++ = FF_LINEGLOB;
2816 else if (*s == '#' || (*s == '.' && s[1] == '#')) {
2817 arg = ischop ? 512 : 0;
2827 arg |= 256 + (s - f);
2829 *fpc++ = s - base; /* fieldsize for FETCH */
2830 *fpc++ = FF_DECIMAL;
2835 bool ismore = FALSE;
2838 while (*++s == '>') ;
2839 prespace = FF_SPACE;
2841 else if (*s == '|') {
2842 while (*++s == '|') ;
2843 prespace = FF_HALFSPACE;
2848 while (*++s == '<') ;
2851 if (*s == '.' && s[1] == '.' && s[2] == '.') {
2855 *fpc++ = s - base; /* fieldsize for FETCH */
2857 *fpc++ = ischop ? FF_CHECKCHOP : FF_CHECKNL;
2875 { /* need to jump to the next word */
2877 z = WORD_ALIGN - SvCUR(sv) % WORD_ALIGN;
2878 SvGROW(sv, SvCUR(sv) + z + arg * sizeof(U16) + 4);
2879 s = SvPVX(sv) + SvCUR(sv) + z;
2881 Copy(fops, s, arg, U16);
2883 sv_magic(sv, Nullsv, 'f', Nullch, 0);
2888 * The rest of this file was derived from source code contributed
2891 * NOTE: this code was derived from Tom Horsley's qsort replacement
2892 * and should not be confused with the original code.
2895 /* Copyright (C) Tom Horsley, 1997. All rights reserved.
2897 Permission granted to distribute under the same terms as perl which are
2900 This program is free software; you can redistribute it and/or modify
2901 it under the terms of either:
2903 a) the GNU General Public License as published by the Free
2904 Software Foundation; either version 1, or (at your option) any
2907 b) the "Artistic License" which comes with this Kit.
2909 Details on the perl license can be found in the perl source code which
2910 may be located via the www.perl.com web page.
2912 This is the most wonderfulest possible qsort I can come up with (and
2913 still be mostly portable) My (limited) tests indicate it consistently
2914 does about 20% fewer calls to compare than does the qsort in the Visual
2915 C++ library, other vendors may vary.
2917 Some of the ideas in here can be found in "Algorithms" by Sedgewick,
2918 others I invented myself (or more likely re-invented since they seemed
2919 pretty obvious once I watched the algorithm operate for a while).
2921 Most of this code was written while watching the Marlins sweep the Giants
2922 in the 1997 National League Playoffs - no Braves fans allowed to use this
2923 code (just kidding :-).
2925 I realize that if I wanted to be true to the perl tradition, the only
2926 comment in this file would be something like:
2928 ...they shuffled back towards the rear of the line. 'No, not at the
2929 rear!' the slave-driver shouted. 'Three files up. And stay there...
2931 However, I really needed to violate that tradition just so I could keep
2932 track of what happens myself, not to mention some poor fool trying to
2933 understand this years from now :-).
2936 /* ********************************************************** Configuration */
2938 #ifndef QSORT_ORDER_GUESS
2939 #define QSORT_ORDER_GUESS 2 /* Select doubling version of the netBSD trick */
2942 /* QSORT_MAX_STACK is the largest number of partitions that can be stacked up for
2943 future processing - a good max upper bound is log base 2 of memory size
2944 (32 on 32 bit machines, 64 on 64 bit machines, etc). In reality can
2945 safely be smaller than that since the program is taking up some space and
2946 most operating systems only let you grab some subset of contiguous
2947 memory (not to mention that you are normally sorting data larger than
2948 1 byte element size :-).
2950 #ifndef QSORT_MAX_STACK
2951 #define QSORT_MAX_STACK 32
2954 /* QSORT_BREAK_EVEN is the size of the largest partition we should insertion sort.
2955 Anything bigger and we use qsort. If you make this too small, the qsort
2956 will probably break (or become less efficient), because it doesn't expect
2957 the middle element of a partition to be the same as the right or left -
2958 you have been warned).
2960 #ifndef QSORT_BREAK_EVEN
2961 #define QSORT_BREAK_EVEN 6
2964 /* ************************************************************* Data Types */
2966 /* hold left and right index values of a partition waiting to be sorted (the
2967 partition includes both left and right - right is NOT one past the end or
2968 anything like that).
2970 struct partition_stack_entry {
2973 #ifdef QSORT_ORDER_GUESS
2974 int qsort_break_even;
2978 /* ******************************************************* Shorthand Macros */
2980 /* Note that these macros will be used from inside the qsort function where
2981 we happen to know that the variable 'elt_size' contains the size of an
2982 array element and the variable 'temp' points to enough space to hold a
2983 temp element and the variable 'array' points to the array being sorted
2984 and 'compare' is the pointer to the compare routine.
2986 Also note that there are very many highly architecture specific ways
2987 these might be sped up, but this is simply the most generally portable
2988 code I could think of.
2991 /* Return < 0 == 0 or > 0 as the value of elt1 is < elt2, == elt2, > elt2
2994 #define qsort_cmp(elt1, elt2) \
2995 ((this->*compare)(array[elt1], array[elt2]))
2997 #define qsort_cmp(elt1, elt2) \
2998 ((*compare)(array[elt1], array[elt2]))
3001 #ifdef QSORT_ORDER_GUESS
3002 #define QSORT_NOTICE_SWAP swapped++;
3004 #define QSORT_NOTICE_SWAP
3007 /* swaps contents of array elements elt1, elt2.
3009 #define qsort_swap(elt1, elt2) \
3012 temp = array[elt1]; \
3013 array[elt1] = array[elt2]; \
3014 array[elt2] = temp; \
3017 /* rotate contents of elt1, elt2, elt3 such that elt1 gets elt2, elt2 gets
3018 elt3 and elt3 gets elt1.
3020 #define qsort_rotate(elt1, elt2, elt3) \
3023 temp = array[elt1]; \
3024 array[elt1] = array[elt2]; \
3025 array[elt2] = array[elt3]; \
3026 array[elt3] = temp; \
3029 /* ************************************************************ Debug stuff */
3036 return; /* good place to set a breakpoint */
3039 #define qsort_assert(t) (void)( (t) || (break_here(), 0) )
3042 doqsort_all_asserts(
3046 int (*compare)(const void * elt1, const void * elt2),
3047 int pc_left, int pc_right, int u_left, int u_right)
3051 qsort_assert(pc_left <= pc_right);
3052 qsort_assert(u_right < pc_left);
3053 qsort_assert(pc_right < u_left);
3054 for (i = u_right + 1; i < pc_left; ++i) {
3055 qsort_assert(qsort_cmp(i, pc_left) < 0);
3057 for (i = pc_left; i < pc_right; ++i) {
3058 qsort_assert(qsort_cmp(i, pc_right) == 0);
3060 for (i = pc_right + 1; i < u_left; ++i) {
3061 qsort_assert(qsort_cmp(pc_right, i) < 0);
3065 #define qsort_all_asserts(PC_LEFT, PC_RIGHT, U_LEFT, U_RIGHT) \
3066 doqsort_all_asserts(array, num_elts, elt_size, compare, \
3067 PC_LEFT, PC_RIGHT, U_LEFT, U_RIGHT)
3071 #define qsort_assert(t) ((void)0)
3073 #define qsort_all_asserts(PC_LEFT, PC_RIGHT, U_LEFT, U_RIGHT) ((void)0)
3077 /* ****************************************************************** qsort */
3081 qsortsv(SV ** array, size_t num_elts, SVCOMPARE compare)
3086 I32 (*compare)(SV *a, SV *b))
3091 struct partition_stack_entry partition_stack[QSORT_MAX_STACK];
3092 int next_stack_entry = 0;
3096 #ifdef QSORT_ORDER_GUESS
3097 int qsort_break_even;
3101 /* Make sure we actually have work to do.
3103 if (num_elts <= 1) {
3107 /* Setup the initial partition definition and fall into the sorting loop
3110 part_right = (int)(num_elts - 1);
3111 #ifdef QSORT_ORDER_GUESS
3112 qsort_break_even = QSORT_BREAK_EVEN;
3114 #define qsort_break_even QSORT_BREAK_EVEN
3117 if ((part_right - part_left) >= qsort_break_even) {
3118 /* OK, this is gonna get hairy, so lets try to document all the
3119 concepts and abbreviations and variables and what they keep
3122 pc: pivot chunk - the set of array elements we accumulate in the
3123 middle of the partition, all equal in value to the original
3124 pivot element selected. The pc is defined by:
3126 pc_left - the leftmost array index of the pc
3127 pc_right - the rightmost array index of the pc
3129 we start with pc_left == pc_right and only one element
3130 in the pivot chunk (but it can grow during the scan).
3132 u: uncompared elements - the set of elements in the partition
3133 we have not yet compared to the pivot value. There are two
3134 uncompared sets during the scan - one to the left of the pc
3135 and one to the right.
3137 u_right - the rightmost index of the left side's uncompared set
3138 u_left - the leftmost index of the right side's uncompared set
3140 The leftmost index of the left sides's uncompared set
3141 doesn't need its own variable because it is always defined
3142 by the leftmost edge of the whole partition (part_left). The
3143 same goes for the rightmost edge of the right partition
3146 We know there are no uncompared elements on the left once we
3147 get u_right < part_left and no uncompared elements on the
3148 right once u_left > part_right. When both these conditions
3149 are met, we have completed the scan of the partition.
3151 Any elements which are between the pivot chunk and the
3152 uncompared elements should be less than the pivot value on
3153 the left side and greater than the pivot value on the right
3154 side (in fact, the goal of the whole algorithm is to arrange
3155 for that to be true and make the groups of less-than and
3156 greater-then elements into new partitions to sort again).
3158 As you marvel at the complexity of the code and wonder why it
3159 has to be so confusing. Consider some of the things this level
3160 of confusion brings:
3162 Once I do a compare, I squeeze every ounce of juice out of it. I
3163 never do compare calls I don't have to do, and I certainly never
3166 I also never swap any elements unless I can prove there is a
3167 good reason. Many sort algorithms will swap a known value with
3168 an uncompared value just to get things in the right place (or
3169 avoid complexity :-), but that uncompared value, once it gets
3170 compared, may then have to be swapped again. A lot of the
3171 complexity of this code is due to the fact that it never swaps
3172 anything except compared values, and it only swaps them when the
3173 compare shows they are out of position.
3175 int pc_left, pc_right;
3176 int u_right, u_left;
3180 pc_left = ((part_left + part_right) / 2);
3182 u_right = pc_left - 1;
3183 u_left = pc_right + 1;
3185 /* Qsort works best when the pivot value is also the median value
3186 in the partition (unfortunately you can't find the median value
3187 without first sorting :-), so to give the algorithm a helping
3188 hand, we pick 3 elements and sort them and use the median value
3189 of that tiny set as the pivot value.
3191 Some versions of qsort like to use the left middle and right as
3192 the 3 elements to sort so they can insure the ends of the
3193 partition will contain values which will stop the scan in the
3194 compare loop, but when you have to call an arbitrarily complex
3195 routine to do a compare, its really better to just keep track of
3196 array index values to know when you hit the edge of the
3197 partition and avoid the extra compare. An even better reason to
3198 avoid using a compare call is the fact that you can drop off the
3199 edge of the array if someone foolishly provides you with an
3200 unstable compare function that doesn't always provide consistent
3203 So, since it is simpler for us to compare the three adjacent
3204 elements in the middle of the partition, those are the ones we
3205 pick here (conveniently pointed at by u_right, pc_left, and
3206 u_left). The values of the left, center, and right elements
3207 are refered to as l c and r in the following comments.
3210 #ifdef QSORT_ORDER_GUESS
3213 s = qsort_cmp(u_right, pc_left);
3216 s = qsort_cmp(pc_left, u_left);
3217 /* if l < c, c < r - already in order - nothing to do */
3219 /* l < c, c == r - already in order, pc grows */
3221 qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
3223 /* l < c, c > r - need to know more */
3224 s = qsort_cmp(u_right, u_left);
3226 /* l < c, c > r, l < r - swap c & r to get ordered */
3227 qsort_swap(pc_left, u_left);
3228 qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
3229 } else if (s == 0) {
3230 /* l < c, c > r, l == r - swap c&r, grow pc */
3231 qsort_swap(pc_left, u_left);
3233 qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
3235 /* l < c, c > r, l > r - make lcr into rlc to get ordered */
3236 qsort_rotate(pc_left, u_right, u_left);
3237 qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
3240 } else if (s == 0) {
3242 s = qsort_cmp(pc_left, u_left);
3244 /* l == c, c < r - already in order, grow pc */
3246 qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
3247 } else if (s == 0) {
3248 /* l == c, c == r - already in order, grow pc both ways */
3251 qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
3253 /* l == c, c > r - swap l & r, grow pc */
3254 qsort_swap(u_right, u_left);
3256 qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
3260 s = qsort_cmp(pc_left, u_left);
3262 /* l > c, c < r - need to know more */
3263 s = qsort_cmp(u_right, u_left);
3265 /* l > c, c < r, l < r - swap l & c to get ordered */
3266 qsort_swap(u_right, pc_left);
3267 qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
3268 } else if (s == 0) {
3269 /* l > c, c < r, l == r - swap l & c, grow pc */
3270 qsort_swap(u_right, pc_left);
3272 qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
3274 /* l > c, c < r, l > r - rotate lcr into crl to order */
3275 qsort_rotate(u_right, pc_left, u_left);
3276 qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
3278 } else if (s == 0) {
3279 /* l > c, c == r - swap ends, grow pc */
3280 qsort_swap(u_right, u_left);
3282 qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
3284 /* l > c, c > r - swap ends to get in order */
3285 qsort_swap(u_right, u_left);
3286 qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
3289 /* We now know the 3 middle elements have been compared and
3290 arranged in the desired order, so we can shrink the uncompared
3295 qsort_all_asserts(pc_left, pc_right, u_left, u_right);
3297 /* The above massive nested if was the simple part :-). We now have
3298 the middle 3 elements ordered and we need to scan through the
3299 uncompared sets on either side, swapping elements that are on
3300 the wrong side or simply shuffling equal elements around to get
3301 all equal elements into the pivot chunk.
3305 int still_work_on_left;
3306 int still_work_on_right;
3308 /* Scan the uncompared values on the left. If I find a value
3309 equal to the pivot value, move it over so it is adjacent to
3310 the pivot chunk and expand the pivot chunk. If I find a value
3311 less than the pivot value, then just leave it - its already
3312 on the correct side of the partition. If I find a greater
3313 value, then stop the scan.
3315 while (still_work_on_left = (u_right >= part_left)) {
3316 s = qsort_cmp(u_right, pc_left);
3319 } else if (s == 0) {
3321 if (pc_left != u_right) {
3322 qsort_swap(u_right, pc_left);
3328 qsort_assert(u_right < pc_left);
3329 qsort_assert(pc_left <= pc_right);
3330 qsort_assert(qsort_cmp(u_right + 1, pc_left) <= 0);
3331 qsort_assert(qsort_cmp(pc_left, pc_right) == 0);
3334 /* Do a mirror image scan of uncompared values on the right
3336 while (still_work_on_right = (u_left <= part_right)) {
3337 s = qsort_cmp(pc_right, u_left);
3340 } else if (s == 0) {
3342 if (pc_right != u_left) {
3343 qsort_swap(pc_right, u_left);
3349 qsort_assert(u_left > pc_right);
3350 qsort_assert(pc_left <= pc_right);
3351 qsort_assert(qsort_cmp(pc_right, u_left - 1) <= 0);
3352 qsort_assert(qsort_cmp(pc_left, pc_right) == 0);
3355 if (still_work_on_left) {
3356 /* I know I have a value on the left side which needs to be
3357 on the right side, but I need to know more to decide
3358 exactly the best thing to do with it.
3360 if (still_work_on_right) {
3361 /* I know I have values on both side which are out of
3362 position. This is a big win because I kill two birds
3363 with one swap (so to speak). I can advance the
3364 uncompared pointers on both sides after swapping both
3365 of them into the right place.
3367 qsort_swap(u_right, u_left);
3370 qsort_all_asserts(pc_left, pc_right, u_left, u_right);
3372 /* I have an out of position value on the left, but the
3373 right is fully scanned, so I "slide" the pivot chunk
3374 and any less-than values left one to make room for the
3375 greater value over on the right. If the out of position
3376 value is immediately adjacent to the pivot chunk (there
3377 are no less-than values), I can do that with a swap,
3378 otherwise, I have to rotate one of the less than values
3379 into the former position of the out of position value
3380 and the right end of the pivot chunk into the left end
3384 if (pc_left == u_right) {
3385 qsort_swap(u_right, pc_right);
3386 qsort_all_asserts(pc_left, pc_right-1, u_left, u_right-1);
3388 qsort_rotate(u_right, pc_left, pc_right);
3389 qsort_all_asserts(pc_left, pc_right-1, u_left, u_right-1);
3394 } else if (still_work_on_right) {
3395 /* Mirror image of complex case above: I have an out of
3396 position value on the right, but the left is fully
3397 scanned, so I need to shuffle things around to make room
3398 for the right value on the left.
3401 if (pc_right == u_left) {
3402 qsort_swap(u_left, pc_left);
3403 qsort_all_asserts(pc_left+1, pc_right, u_left+1, u_right);
3405 qsort_rotate(pc_right, pc_left, u_left);
3406 qsort_all_asserts(pc_left+1, pc_right, u_left+1, u_right);
3411 /* No more scanning required on either side of partition,
3412 break out of loop and figure out next set of partitions
3418 /* The elements in the pivot chunk are now in the right place. They
3419 will never move or be compared again. All I have to do is decide
3420 what to do with the stuff to the left and right of the pivot
3423 Notes on the QSORT_ORDER_GUESS ifdef code:
3425 1. If I just built these partitions without swapping any (or
3426 very many) elements, there is a chance that the elements are
3427 already ordered properly (being properly ordered will
3428 certainly result in no swapping, but the converse can't be
3431 2. A (properly written) insertion sort will run faster on
3432 already ordered data than qsort will.
3434 3. Perhaps there is some way to make a good guess about
3435 switching to an insertion sort earlier than partition size 6
3436 (for instance - we could save the partition size on the stack
3437 and increase the size each time we find we didn't swap, thus
3438 switching to insertion sort earlier for partitions with a
3439 history of not swapping).
3441 4. Naturally, if I just switch right away, it will make
3442 artificial benchmarks with pure ascending (or descending)
3443 data look really good, but is that a good reason in general?
3447 #ifdef QSORT_ORDER_GUESS
3449 #if QSORT_ORDER_GUESS == 1
3450 qsort_break_even = (part_right - part_left) + 1;
3452 #if QSORT_ORDER_GUESS == 2
3453 qsort_break_even *= 2;
3455 #if QSORT_ORDER_GUESS == 3
3456 int prev_break = qsort_break_even;
3457 qsort_break_even *= qsort_break_even;
3458 if (qsort_break_even < prev_break) {
3459 qsort_break_even = (part_right - part_left) + 1;
3463 qsort_break_even = QSORT_BREAK_EVEN;
3467 if (part_left < pc_left) {
3468 /* There are elements on the left which need more processing.
3469 Check the right as well before deciding what to do.
3471 if (pc_right < part_right) {
3472 /* We have two partitions to be sorted. Stack the biggest one
3473 and process the smallest one on the next iteration. This
3474 minimizes the stack height by insuring that any additional
3475 stack entries must come from the smallest partition which
3476 (because it is smallest) will have the fewest
3477 opportunities to generate additional stack entries.
3479 if ((part_right - pc_right) > (pc_left - part_left)) {
3480 /* stack the right partition, process the left */
3481 partition_stack[next_stack_entry].left = pc_right + 1;
3482 partition_stack[next_stack_entry].right = part_right;
3483 #ifdef QSORT_ORDER_GUESS
3484 partition_stack[next_stack_entry].qsort_break_even = qsort_break_even;
3486 part_right = pc_left - 1;
3488 /* stack the left partition, process the right */
3489 partition_stack[next_stack_entry].left = part_left;
3490 partition_stack[next_stack_entry].right = pc_left - 1;
3491 #ifdef QSORT_ORDER_GUESS
3492 partition_stack[next_stack_entry].qsort_break_even = qsort_break_even;
3494 part_left = pc_right + 1;
3496 qsort_assert(next_stack_entry < QSORT_MAX_STACK);
3499 /* The elements on the left are the only remaining elements
3500 that need sorting, arrange for them to be processed as the
3503 part_right = pc_left - 1;
3505 } else if (pc_right < part_right) {
3506 /* There is only one chunk on the right to be sorted, make it
3507 the new partition and loop back around.
3509 part_left = pc_right + 1;
3511 /* This whole partition wound up in the pivot chunk, so
3512 we need to get a new partition off the stack.
3514 if (next_stack_entry == 0) {
3515 /* the stack is empty - we are done */
3519 part_left = partition_stack[next_stack_entry].left;
3520 part_right = partition_stack[next_stack_entry].right;
3521 #ifdef QSORT_ORDER_GUESS
3522 qsort_break_even = partition_stack[next_stack_entry].qsort_break_even;
3526 /* This partition is too small to fool with qsort complexity, just
3527 do an ordinary insertion sort to minimize overhead.
3530 /* Assume 1st element is in right place already, and start checking
3531 at 2nd element to see where it should be inserted.
3533 for (i = part_left + 1; i <= part_right; ++i) {
3535 /* Scan (backwards - just in case 'i' is already in right place)
3536 through the elements already sorted to see if the ith element
3537 belongs ahead of one of them.
3539 for (j = i - 1; j >= part_left; --j) {
3540 if (qsort_cmp(i, j) >= 0) {
3541 /* i belongs right after j
3548 /* Looks like we really need to move some things
3551 for (--i; i >= j; --i)
3552 array[i + 1] = array[i];
3557 /* That partition is now sorted, grab the next one, or get out
3558 of the loop if there aren't any more.
3561 if (next_stack_entry == 0) {
3562 /* the stack is empty - we are done */
3566 part_left = partition_stack[next_stack_entry].left;
3567 part_right = partition_stack[next_stack_entry].right;
3568 #ifdef QSORT_ORDER_GUESS
3569 qsort_break_even = partition_stack[next_stack_entry].qsort_break_even;
3574 /* Believe it or not, the array is sorted at this point! */