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));
51 cxix = dopoptosub(cxstack_ix);
55 switch (cxstack[cxix].blk_gimme) {
72 register PMOP *pm = (PMOP*)cLOGOP->op_other;
76 MAGIC *mg = Null(MAGIC*);
80 SV *sv = SvRV(tmpstr);
82 mg = mg_find(sv, 'r');
85 regexp *re = (regexp *)mg->mg_obj;
86 ReREFCNT_dec(pm->op_pmregexp);
87 pm->op_pmregexp = ReREFCNT_inc(re);
90 t = SvPV(tmpstr, len);
92 /* JMR: Check against the last compiled regexp
93 To know for sure, we'd need the length of precomp.
94 But we don't have it, so we must ... take a guess. */
95 if (!pm->op_pmregexp || !pm->op_pmregexp->precomp ||
96 memNE(pm->op_pmregexp->precomp, t, len + 1))
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(&THREADSV(0));
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, 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;
1147 if (GIMME != G_ARRAY)
1151 if (DBsub && cxix >= 0 &&
1152 cxstack[cxix].blk_sub.cv == GvCV(DBsub))
1156 cxix = dopoptosub(cxix - 1);
1158 cx = &cxstack[cxix];
1159 if (cxstack[cxix].cx_type == CXt_SUB) {
1160 dbcxix = dopoptosub(cxix - 1);
1161 /* We expect that cxstack[dbcxix] is CXt_SUB, anyway, the
1162 field below is defined for any cx. */
1163 if (DBsub && dbcxix >= 0 && cxstack[dbcxix].blk_sub.cv == GvCV(DBsub))
1164 cx = &cxstack[dbcxix];
1167 if (GIMME != G_ARRAY) {
1168 hv = cx->blk_oldcop->cop_stash;
1173 sv_setpv(TARG, HvNAME(hv));
1179 hv = cx->blk_oldcop->cop_stash;
1183 PUSHs(sv_2mortal(newSVpv(HvNAME(hv), 0)));
1184 PUSHs(sv_2mortal(newSVpv(SvPVX(GvSV(cx->blk_oldcop->cop_filegv)), 0)));
1185 PUSHs(sv_2mortal(newSViv((I32)cx->blk_oldcop->cop_line)));
1188 if (cx->cx_type == CXt_SUB) { /* So is cxstack[dbcxix]. */
1190 gv_efullname3(sv, CvGV(cxstack[cxix].blk_sub.cv), Nullch);
1191 PUSHs(sv_2mortal(sv));
1192 PUSHs(sv_2mortal(newSViv((I32)cx->blk_sub.hasargs)));
1195 PUSHs(sv_2mortal(newSVpv("(eval)",0)));
1196 PUSHs(sv_2mortal(newSViv(0)));
1198 gimme = (I32)cx->blk_gimme;
1199 if (gimme == G_VOID)
1202 PUSHs(sv_2mortal(newSViv(gimme & G_ARRAY)));
1203 if (cx->cx_type == CXt_EVAL) {
1204 if (cx->blk_eval.old_op_type == OP_ENTEREVAL) {
1205 PUSHs(cx->blk_eval.cur_text);
1208 else if (cx->blk_eval.old_name) { /* Try blocks have old_name == 0. */
1209 /* Require, put the name. */
1210 PUSHs(sv_2mortal(newSVpv(cx->blk_eval.old_name, 0)));
1214 else if (cx->cx_type == CXt_SUB &&
1215 cx->blk_sub.hasargs &&
1216 curcop->cop_stash == debstash)
1218 AV *ary = cx->blk_sub.argarray;
1219 int off = AvARRAY(ary) - AvALLOC(ary);
1223 dbargs = GvAV(gv_AVadd(tmpgv = gv_fetchpv("DB::args", TRUE,
1226 AvREAL_off(dbargs); /* XXX Should be REIFY */
1229 if (AvMAX(dbargs) < AvFILLp(ary) + off)
1230 av_extend(dbargs, AvFILLp(ary) + off);
1231 Copy(AvALLOC(ary), AvARRAY(dbargs), AvFILLp(ary) + 1 + off, SV*);
1232 AvFILLp(dbargs) = AvFILLp(ary) + off;
1238 sortcv(SV *a, SV *b)
1241 I32 oldsaveix = savestack_ix;
1242 I32 oldscopeix = scopestack_ix;
1246 stack_sp = stack_base;
1249 if (stack_sp != stack_base + 1)
1250 croak("Sort subroutine didn't return single value");
1251 if (!SvNIOKp(*stack_sp))
1252 croak("Sort subroutine didn't return a numeric value");
1253 result = SvIV(*stack_sp);
1254 while (scopestack_ix > oldscopeix) {
1257 leave_scope(oldsaveix);
1270 sv_reset(tmps, curcop->cop_stash);
1283 TAINT_NOT; /* Each statement is presumed innocent */
1284 stack_sp = stack_base + cxstack[cxstack_ix].blk_oldsp;
1287 if (op->op_private || SvIV(DBsingle) || SvIV(DBsignal) || SvIV(DBtrace))
1291 register PERL_CONTEXT *cx;
1292 I32 gimme = G_ARRAY;
1299 DIE("No DB::DB routine defined");
1301 if (CvDEPTH(cv) >= 1 && !(debug & (1<<30))) /* don't do recursive DB::DB call */
1313 push_return(op->op_next);
1314 PUSHBLOCK(cx, CXt_SUB, sp);
1317 (void)SvREFCNT_inc(cv);
1319 curpad = AvARRAY((AV*)*av_fetch(CvPADLIST(cv),1,FALSE));
1320 RETURNOP(CvSTART(cv));
1334 register PERL_CONTEXT *cx;
1335 I32 gimme = GIMME_V;
1342 if (op->op_flags & OPf_SPECIAL)
1343 svp = save_threadsv(op->op_targ); /* per-thread variable */
1345 #endif /* USE_THREADS */
1347 svp = &curpad[op->op_targ]; /* "my" variable */
1352 (void)save_scalar(gv);
1353 svp = &GvSV(gv); /* symbol table variable */
1358 PUSHBLOCK(cx, CXt_LOOP, SP);
1359 PUSHLOOP(cx, svp, MARK);
1360 if (op->op_flags & OPf_STACKED)
1361 cx->blk_loop.iterary = (AV*)SvREFCNT_inc(POPs);
1363 cx->blk_loop.iterary = curstack;
1364 AvFILLp(curstack) = sp - stack_base;
1365 cx->blk_loop.iterix = MARK - stack_base;
1374 register PERL_CONTEXT *cx;
1375 I32 gimme = GIMME_V;
1381 PUSHBLOCK(cx, CXt_LOOP, SP);
1382 PUSHLOOP(cx, 0, SP);
1390 register PERL_CONTEXT *cx;
1391 struct block_loop cxloop;
1399 POPLOOP1(cx); /* Delay POPLOOP2 until stack values are safe */
1402 if (gimme == G_VOID)
1404 else if (gimme == G_SCALAR) {
1406 *++newsp = sv_mortalcopy(*SP);
1408 *++newsp = &sv_undef;
1412 *++newsp = sv_mortalcopy(*++mark);
1413 TAINT_NOT; /* Each item is independent */
1419 POPLOOP2(); /* Stack values are safe: release loop vars ... */
1420 curpm = newpm; /* ... and pop $1 et al */
1432 register PERL_CONTEXT *cx;
1433 struct block_sub cxsub;
1434 bool popsub2 = FALSE;
1440 if (curstack == sortstack) {
1441 if (cxstack_ix == sortcxix || dopoptosub(cxstack_ix) <= sortcxix) {
1442 if (cxstack_ix > sortcxix)
1444 AvARRAY(curstack)[1] = *SP;
1445 stack_sp = stack_base + 1;
1450 cxix = dopoptosub(cxstack_ix);
1452 DIE("Can't return outside a subroutine");
1453 if (cxix < cxstack_ix)
1457 switch (cx->cx_type) {
1459 POPSUB1(cx); /* Delay POPSUB2 until stack values are safe */
1464 if (optype == OP_REQUIRE &&
1465 (MARK == SP || (gimme == G_SCALAR && !SvTRUE(*SP))) )
1467 /* Unassume the success we assumed earlier. */
1468 char *name = cx->blk_eval.old_name;
1469 (void)hv_delete(GvHVn(incgv), name, strlen(name), G_DISCARD);
1470 DIE("%s did not return a true value", name);
1474 DIE("panic: return");
1478 if (gimme == G_SCALAR) {
1480 *++newsp = (popsub2 && SvTEMP(*SP))
1481 ? *SP : sv_mortalcopy(*SP);
1483 *++newsp = &sv_undef;
1485 else if (gimme == G_ARRAY) {
1486 while (++MARK <= SP) {
1487 *++newsp = (popsub2 && SvTEMP(*MARK))
1488 ? *MARK : sv_mortalcopy(*MARK);
1489 TAINT_NOT; /* Each item is independent */
1494 /* Stack values are safe: */
1496 POPSUB2(); /* release CV and @_ ... */
1498 curpm = newpm; /* ... and pop $1 et al */
1501 return pop_return();
1508 register PERL_CONTEXT *cx;
1509 struct block_loop cxloop;
1510 struct block_sub cxsub;
1517 SV **mark = stack_base + cxstack[cxstack_ix].blk_oldsp;
1519 if (op->op_flags & OPf_SPECIAL) {
1520 cxix = dopoptoloop(cxstack_ix);
1522 DIE("Can't \"last\" outside a block");
1525 cxix = dopoptolabel(cPVOP->op_pv);
1527 DIE("Label not found for \"last %s\"", cPVOP->op_pv);
1529 if (cxix < cxstack_ix)
1533 switch (cx->cx_type) {
1535 POPLOOP1(cx); /* Delay POPLOOP2 until stack values are safe */
1537 nextop = cxloop.last_op->op_next;
1540 POPSUB1(cx); /* Delay POPSUB2 until stack values are safe */
1542 nextop = pop_return();
1546 nextop = pop_return();
1553 if (gimme == G_SCALAR) {
1555 *++newsp = ((pop2 == CXt_SUB) && SvTEMP(*SP))
1556 ? *SP : sv_mortalcopy(*SP);
1558 *++newsp = &sv_undef;
1560 else if (gimme == G_ARRAY) {
1561 while (++MARK <= SP) {
1562 *++newsp = ((pop2 == CXt_SUB) && SvTEMP(*MARK))
1563 ? *MARK : sv_mortalcopy(*MARK);
1564 TAINT_NOT; /* Each item is independent */
1570 /* Stack values are safe: */
1573 POPLOOP2(); /* release loop vars ... */
1577 POPSUB2(); /* release CV and @_ ... */
1580 curpm = newpm; /* ... and pop $1 et al */
1589 register PERL_CONTEXT *cx;
1592 if (op->op_flags & OPf_SPECIAL) {
1593 cxix = dopoptoloop(cxstack_ix);
1595 DIE("Can't \"next\" outside a block");
1598 cxix = dopoptolabel(cPVOP->op_pv);
1600 DIE("Label not found for \"next %s\"", cPVOP->op_pv);
1602 if (cxix < cxstack_ix)
1606 oldsave = scopestack[scopestack_ix - 1];
1607 LEAVE_SCOPE(oldsave);
1608 return cx->blk_loop.next_op;
1614 register PERL_CONTEXT *cx;
1617 if (op->op_flags & OPf_SPECIAL) {
1618 cxix = dopoptoloop(cxstack_ix);
1620 DIE("Can't \"redo\" outside a block");
1623 cxix = dopoptolabel(cPVOP->op_pv);
1625 DIE("Label not found for \"redo %s\"", cPVOP->op_pv);
1627 if (cxix < cxstack_ix)
1631 oldsave = scopestack[scopestack_ix - 1];
1632 LEAVE_SCOPE(oldsave);
1633 return cx->blk_loop.redo_op;
1637 dofindlabel(OP *o, char *label, OP **opstack, OP **oplimit)
1641 static char too_deep[] = "Target of goto is too deeply nested";
1645 if (o->op_type == OP_LEAVE ||
1646 o->op_type == OP_SCOPE ||
1647 o->op_type == OP_LEAVELOOP ||
1648 o->op_type == OP_LEAVETRY)
1650 *ops++ = cUNOPo->op_first;
1655 if (o->op_flags & OPf_KIDS) {
1656 /* First try all the kids at this level, since that's likeliest. */
1657 for (kid = cUNOPo->op_first; kid; kid = kid->op_sibling) {
1658 if ((kid->op_type == OP_NEXTSTATE || kid->op_type == OP_DBSTATE) &&
1659 kCOP->cop_label && strEQ(kCOP->cop_label, label))
1662 for (kid = cUNOPo->op_first; kid; kid = kid->op_sibling) {
1663 if (kid == lastgotoprobe)
1665 if ((kid->op_type == OP_NEXTSTATE || kid->op_type == OP_DBSTATE) &&
1667 (ops[-1]->op_type != OP_NEXTSTATE &&
1668 ops[-1]->op_type != OP_DBSTATE)))
1670 if (o = dofindlabel(kid, label, ops, oplimit))
1680 return pp_goto(ARGS);
1689 register PERL_CONTEXT *cx;
1690 #define GOTO_DEPTH 64
1691 OP *enterops[GOTO_DEPTH];
1693 int do_dump = (op->op_type == OP_DUMP);
1696 if (op->op_flags & OPf_STACKED) {
1699 /* This egregious kludge implements goto &subroutine */
1700 if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVCV) {
1702 register PERL_CONTEXT *cx;
1703 CV* cv = (CV*)SvRV(sv);
1708 if (!CvROOT(cv) && !CvXSUB(cv)) {
1710 SV *tmpstr = sv_newmortal();
1711 gv_efullname3(tmpstr, CvGV(cv), Nullch);
1712 DIE("Goto undefined subroutine &%s",SvPVX(tmpstr));
1714 DIE("Goto undefined subroutine");
1717 /* First do some returnish stuff. */
1718 cxix = dopoptosub(cxstack_ix);
1720 DIE("Can't goto subroutine outside a subroutine");
1721 if (cxix < cxstack_ix)
1725 if (cx->blk_sub.hasargs) { /* put @_ back onto stack */
1726 AV* av = cx->blk_sub.argarray;
1728 items = AvFILLp(av) + 1;
1730 EXTEND(stack_sp, items); /* @_ could have been extended. */
1731 Copy(AvARRAY(av), stack_sp, items, SV*);
1734 SvREFCNT_dec(GvAV(defgv));
1735 GvAV(defgv) = cx->blk_sub.savearray;
1736 #endif /* USE_THREADS */
1740 if (!(CvDEPTH(cx->blk_sub.cv) = cx->blk_sub.olddepth))
1741 SvREFCNT_dec(cx->blk_sub.cv);
1742 oldsave = scopestack[scopestack_ix - 1];
1743 LEAVE_SCOPE(oldsave);
1745 /* Now do some callish stuff. */
1748 if (CvOLDSTYLE(cv)) {
1749 I32 (*fp3)_((int,int,int));
1754 fp3 = (I32(*)_((int,int,int)))CvXSUB(cv);
1755 items = (*fp3)(CvXSUBANY(cv).any_i32,
1756 mark - stack_base + 1,
1758 sp = stack_base + items;
1761 stack_sp--; /* There is no cv arg. */
1762 (void)(*CvXSUB(cv))(THIS_ cv);
1765 return pop_return();
1768 AV* padlist = CvPADLIST(cv);
1769 SV** svp = AvARRAY(padlist);
1770 cx->blk_sub.cv = cv;
1771 cx->blk_sub.olddepth = CvDEPTH(cv);
1773 if (CvDEPTH(cv) < 2)
1774 (void)SvREFCNT_inc(cv);
1775 else { /* save temporaries on recursion? */
1776 if (CvDEPTH(cv) == 100 && dowarn)
1777 sub_crush_depth(cv);
1778 if (CvDEPTH(cv) > AvFILLp(padlist)) {
1779 AV *newpad = newAV();
1780 SV **oldpad = AvARRAY(svp[CvDEPTH(cv)-1]);
1781 I32 ix = AvFILLp((AV*)svp[1]);
1782 svp = AvARRAY(svp[0]);
1783 for ( ;ix > 0; ix--) {
1784 if (svp[ix] != &sv_undef) {
1785 char *name = SvPVX(svp[ix]);
1786 if ((SvFLAGS(svp[ix]) & SVf_FAKE)
1789 /* outer lexical or anon code */
1790 av_store(newpad, ix,
1791 SvREFCNT_inc(oldpad[ix]) );
1793 else { /* our own lexical */
1795 av_store(newpad, ix, sv = (SV*)newAV());
1796 else if (*name == '%')
1797 av_store(newpad, ix, sv = (SV*)newHV());
1799 av_store(newpad, ix, sv = NEWSV(0,0));
1804 av_store(newpad, ix, sv = NEWSV(0,0));
1808 if (cx->blk_sub.hasargs) {
1811 av_store(newpad, 0, (SV*)av);
1812 AvFLAGS(av) = AVf_REIFY;
1814 av_store(padlist, CvDEPTH(cv), (SV*)newpad);
1815 AvFILLp(padlist) = CvDEPTH(cv);
1816 svp = AvARRAY(padlist);
1820 if (!cx->blk_sub.hasargs) {
1821 AV* av = (AV*)curpad[0];
1823 items = AvFILLp(av) + 1;
1825 /* Mark is at the end of the stack. */
1827 Copy(AvARRAY(av), sp + 1, items, SV*);
1832 #endif /* USE_THREADS */
1834 curpad = AvARRAY((AV*)svp[CvDEPTH(cv)]);
1836 if (cx->blk_sub.hasargs)
1837 #endif /* USE_THREADS */
1839 AV* av = (AV*)curpad[0];
1843 cx->blk_sub.savearray = GvAV(defgv);
1844 GvAV(defgv) = (AV*)SvREFCNT_inc(av);
1845 #endif /* USE_THREADS */
1846 cx->blk_sub.argarray = av;
1849 if (items >= AvMAX(av) + 1) {
1851 if (AvARRAY(av) != ary) {
1852 AvMAX(av) += AvARRAY(av) - AvALLOC(av);
1853 SvPVX(av) = (char*)ary;
1855 if (items >= AvMAX(av) + 1) {
1856 AvMAX(av) = items - 1;
1857 Renew(ary,items+1,SV*);
1859 SvPVX(av) = (char*)ary;
1862 Copy(mark,AvARRAY(av),items,SV*);
1863 AvFILLp(av) = items - 1;
1871 if (PERLDB_SUB && curstash != debstash) {
1873 * We do not care about using sv to call CV;
1874 * it's for informational purposes only.
1876 SV *sv = GvSV(DBsub);
1878 gv_efullname3(sv, CvGV(cv), Nullch);
1880 RETURNOP(CvSTART(cv));
1884 label = SvPV(sv,na);
1886 else if (op->op_flags & OPf_SPECIAL) {
1888 DIE("goto must have label");
1891 label = cPVOP->op_pv;
1893 if (label && *label) {
1900 for (ix = cxstack_ix; ix >= 0; ix--) {
1902 switch (cx->cx_type) {
1904 gotoprobe = eval_root; /* XXX not good for nested eval */
1907 gotoprobe = cx->blk_oldcop->op_sibling;
1913 gotoprobe = cx->blk_oldcop->op_sibling;
1915 gotoprobe = main_root;
1918 if (CvDEPTH(cx->blk_sub.cv)) {
1919 gotoprobe = CvROOT(cx->blk_sub.cv);
1924 DIE("Can't \"goto\" outside a block");
1928 gotoprobe = main_root;
1931 retop = dofindlabel(gotoprobe, label,
1932 enterops, enterops + GOTO_DEPTH);
1935 lastgotoprobe = gotoprobe;
1938 DIE("Can't find label %s", label);
1940 /* pop unwanted frames */
1942 if (ix < cxstack_ix) {
1949 oldsave = scopestack[scopestack_ix];
1950 LEAVE_SCOPE(oldsave);
1953 /* push wanted frames */
1955 if (*enterops && enterops[1]) {
1957 for (ix = 1; enterops[ix]; ix++) {
1959 /* Eventually we may want to stack the needed arguments
1960 * for each op. For now, we punt on the hard ones. */
1961 if (op->op_type == OP_ENTERITER)
1962 DIE("Can't \"goto\" into the middle of a foreach loop",
1964 (CALLOP->op_ppaddr)(ARGS);
1972 if (!retop) retop = main_start;
1979 restartop = 0; /* hmm, must be GNU unexec().. */
1983 if (curstack == signalstack) {
2001 if (anum == 1 && VMSISH_EXIT)
2014 double value = SvNVx(GvSV(cCOP->cop_gv));
2015 register I32 match = I_32(value);
2018 if (((double)match) > value)
2019 --match; /* was fractional--truncate other way */
2021 match -= cCOP->uop.scop.scop_offset;
2024 else if (match > cCOP->uop.scop.scop_max)
2025 match = cCOP->uop.scop.scop_max;
2026 op = cCOP->uop.scop.scop_next[match];
2036 op = op->op_next; /* can't assume anything */
2038 match = *(SvPVx(GvSV(cCOP->cop_gv), na)) & 255;
2039 match -= cCOP->uop.scop.scop_offset;
2042 else if (match > cCOP->uop.scop.scop_max)
2043 match = cCOP->uop.scop.scop_max;
2044 op = cCOP->uop.scop.scop_next[match];
2053 save_lines(AV *array, SV *sv)
2055 register char *s = SvPVX(sv);
2056 register char *send = SvPVX(sv) + SvCUR(sv);
2058 register I32 line = 1;
2060 while (s && s < send) {
2061 SV *tmpstr = NEWSV(85,0);
2063 sv_upgrade(tmpstr, SVt_PVMG);
2064 t = strchr(s, '\n');
2070 sv_setpvn(tmpstr, s, t - s);
2071 av_store(array, line++, tmpstr);
2086 assert(CATCH_GET == TRUE);
2087 DEBUG_l(deb("Setting up local jumplevel %p, was %p\n", &cur_env, top_env));
2091 default: /* topmost level handles it */
2098 PerlIO_printf(PerlIO_stderr(), "panic: restartop\n");
2114 sv_compile_2op(SV *sv, OP** startop, char *code, AV** avp)
2115 /* sv Text to convert to OP tree. */
2116 /* startop op_free() this to undo. */
2117 /* code Short string id of the caller. */
2119 dSP; /* Make POPBLOCK work. */
2122 I32 gimme = 0; /* SUSPECT - INITIALZE TO WHAT? NI-S */
2126 char tmpbuf[TYPE_DIGITS(long) + 12 + 10];
2132 /* switch to eval mode */
2134 SAVESPTR(compiling.cop_filegv);
2135 SAVEI16(compiling.cop_line);
2136 sprintf(tmpbuf, "_<(%.10s_eval %lu)", code, (unsigned long)++evalseq);
2137 compiling.cop_filegv = gv_fetchfile(tmpbuf+2);
2138 compiling.cop_line = 1;
2139 /* XXX For C<eval "...">s within BEGIN {} blocks, this ends up
2140 deleting the eval's FILEGV from the stash before gv_check() runs
2141 (i.e. before run-time proper). To work around the coredump that
2142 ensues, we always turn GvMULTI_on for any globals that were
2143 introduced within evals. See force_ident(). GSAR 96-10-12 */
2144 safestr = savepv(tmpbuf);
2145 SAVEDELETE(defstash, safestr, strlen(safestr));
2151 op->op_type = 0; /* Avoid uninit warning. */
2152 op->op_flags = 0; /* Avoid uninit warning. */
2153 PUSHBLOCK(cx, CXt_EVAL, SP);
2154 PUSHEVAL(cx, 0, compiling.cop_filegv);
2155 rop = doeval(G_SCALAR, startop);
2159 (*startop)->op_type = OP_NULL;
2160 (*startop)->op_ppaddr = ppaddr[OP_NULL];
2162 *avp = (AV*)SvREFCNT_inc(comppad);
2167 /* With USE_THREADS, eval_owner must be held on entry to doeval */
2169 doeval(int gimme, OP** startop)
2182 /* set up a scratch pad */
2187 SAVESPTR(comppad_name);
2188 SAVEI32(comppad_name_fill);
2189 SAVEI32(min_intro_pending);
2190 SAVEI32(max_intro_pending);
2193 for (i = cxstack_ix - 1; i >= 0; i--) {
2194 PERL_CONTEXT *cx = &cxstack[i];
2195 if (cx->cx_type == CXt_EVAL)
2197 else if (cx->cx_type == CXt_SUB) {
2198 caller = cx->blk_sub.cv;
2204 compcv = (CV*)NEWSV(1104,0);
2205 sv_upgrade((SV *)compcv, SVt_PVCV);
2206 CvUNIQUE_on(compcv);
2208 CvOWNER(compcv) = 0;
2209 New(666, CvMUTEXP(compcv), 1, perl_mutex);
2210 MUTEX_INIT(CvMUTEXP(compcv));
2211 #endif /* USE_THREADS */
2214 av_push(comppad, Nullsv);
2215 curpad = AvARRAY(comppad);
2216 comppad_name = newAV();
2217 comppad_name_fill = 0;
2218 min_intro_pending = 0;
2221 av_store(comppad_name, 0, newSVpv("@_", 2));
2222 curpad[0] = (SV*)newAV();
2223 SvPADMY_on(curpad[0]); /* XXX Needed? */
2224 #endif /* USE_THREADS */
2226 comppadlist = newAV();
2227 AvREAL_off(comppadlist);
2228 av_store(comppadlist, 0, (SV*)comppad_name);
2229 av_store(comppadlist, 1, (SV*)comppad);
2230 CvPADLIST(compcv) = comppadlist;
2232 if (!saveop || saveop->op_type != OP_REQUIRE)
2233 CvOUTSIDE(compcv) = (CV*)SvREFCNT_inc(caller);
2237 /* make sure we compile in the right package */
2239 newstash = curcop->cop_stash;
2240 if (curstash != newstash) {
2242 curstash = newstash;
2246 SAVEFREESV(beginav);
2248 /* try to compile it */
2252 curcop = &compiling;
2253 curcop->cop_arybase = 0;
2255 rs = newSVpv("\n", 1);
2256 if (saveop && saveop->op_flags & OPf_SPECIAL)
2260 if (yyparse() || error_count || !eval_root) {
2264 I32 optype = 0; /* Might be reset by POPEVAL. */
2271 SP = stack_base + POPMARK; /* pop original mark */
2279 if (optype == OP_REQUIRE) {
2280 char* msg = SvPVx(ERRSV, na);
2281 DIE("%s", *msg ? msg : "Compilation failed in require");
2282 } else if (startop) {
2283 char* msg = SvPVx(ERRSV, na);
2287 croak("%sCompilation failed in regexp", (*msg ? msg : "Unknown error\n"));
2290 rs = SvREFCNT_inc(nrs);
2292 MUTEX_LOCK(&eval_mutex);
2294 COND_SIGNAL(&eval_cond);
2295 MUTEX_UNLOCK(&eval_mutex);
2296 #endif /* USE_THREADS */
2300 rs = SvREFCNT_inc(nrs);
2301 compiling.cop_line = 0;
2303 *startop = eval_root;
2304 SvREFCNT_dec(CvOUTSIDE(compcv));
2305 CvOUTSIDE(compcv) = Nullcv;
2307 SAVEFREEOP(eval_root);
2309 scalarvoid(eval_root);
2310 else if (gimme & G_ARRAY)
2315 DEBUG_x(dump_eval());
2317 /* Register with debugger: */
2318 if (PERLDB_INTER && saveop->op_type == OP_REQUIRE) {
2319 CV *cv = perl_get_cv("DB::postponed", FALSE);
2323 XPUSHs((SV*)compiling.cop_filegv);
2325 perl_call_sv((SV*)cv, G_DISCARD);
2329 /* compiled okay, so do it */
2331 CvDEPTH(compcv) = 1;
2332 SP = stack_base + POPMARK; /* pop original mark */
2333 op = saveop; /* The caller may need it. */
2335 MUTEX_LOCK(&eval_mutex);
2337 COND_SIGNAL(&eval_cond);
2338 MUTEX_UNLOCK(&eval_mutex);
2339 #endif /* USE_THREADS */
2341 RETURNOP(eval_start);
2347 register PERL_CONTEXT *cx;
2352 SV *namesv = Nullsv;
2354 I32 gimme = G_SCALAR;
2355 PerlIO *tryrsfp = 0;
2358 if (SvNIOKp(sv) && !SvPOKp(sv)) {
2359 SET_NUMERIC_STANDARD();
2360 if (atof(patchlevel) + 0.00000999 < SvNV(sv))
2361 DIE("Perl %s required--this is only version %s, stopped",
2362 SvPV(sv,na),patchlevel);
2365 name = SvPV(sv, len);
2366 if (!(name && len > 0 && *name))
2367 DIE("Null filename used");
2368 TAINT_PROPER("require");
2369 if (op->op_type == OP_REQUIRE &&
2370 (svp = hv_fetch(GvHVn(incgv), name, len, 0)) &&
2374 /* prepare to compile file */
2379 (name[1] == '.' && name[2] == '/')))
2381 || (name[0] && name[1] == ':')
2384 || (name[0] == '\\' && name[1] == '\\') /* UNC path */
2387 || (strchr(name,':') || ((*name == '[' || *name == '<') &&
2388 (isALNUM(name[1]) || strchr("$-_]>",name[1]))))
2393 tryrsfp = PerlIO_open(name,PERL_SCRIPT_MODE);
2396 AV *ar = GvAVn(incgv);
2400 if ((unixname = tounixspec(name, Nullch)) != Nullch)
2403 namesv = NEWSV(806, 0);
2404 for (i = 0; i <= AvFILL(ar); i++) {
2405 char *dir = SvPVx(*av_fetch(ar, i, TRUE), na);
2408 if ((unixdir = tounixpath(dir, Nullch)) == Nullch)
2410 sv_setpv(namesv, unixdir);
2411 sv_catpv(namesv, unixname);
2413 sv_setpvf(namesv, "%s/%s", dir, name);
2415 tryname = SvPVX(namesv);
2416 tryrsfp = PerlIO_open(tryname, PERL_SCRIPT_MODE);
2418 if (tryname[0] == '.' && tryname[1] == '/')
2425 SAVESPTR(compiling.cop_filegv);
2426 compiling.cop_filegv = gv_fetchfile(tryrsfp ? tryname : name);
2427 SvREFCNT_dec(namesv);
2429 if (op->op_type == OP_REQUIRE) {
2430 SV *msg = sv_2mortal(newSVpvf("Can't locate %s in @INC", name));
2431 SV *dirmsgsv = NEWSV(0, 0);
2432 AV *ar = GvAVn(incgv);
2434 if (instr(SvPVX(msg), ".h "))
2435 sv_catpv(msg, " (change .h to .ph maybe?)");
2436 if (instr(SvPVX(msg), ".ph "))
2437 sv_catpv(msg, " (did you run h2ph?)");
2438 sv_catpv(msg, " (@INC contains:");
2439 for (i = 0; i <= AvFILL(ar); i++) {
2440 char *dir = SvPVx(*av_fetch(ar, i, TRUE), na);
2441 sv_setpvf(dirmsgsv, " %s", dir);
2442 sv_catsv(msg, dirmsgsv);
2444 sv_catpvn(msg, ")", 1);
2445 SvREFCNT_dec(dirmsgsv);
2452 /* Assume success here to prevent recursive requirement. */
2453 (void)hv_store(GvHVn(incgv), name, strlen(name),
2454 newSVsv(GvSV(compiling.cop_filegv)), 0 );
2458 lex_start(sv_2mortal(newSVpv("",0)));
2460 save_aptr(&rsfp_filters);
2461 rsfp_filters = NULL;
2465 name = savepv(name);
2470 /* switch to eval mode */
2472 push_return(op->op_next);
2473 PUSHBLOCK(cx, CXt_EVAL, SP);
2474 PUSHEVAL(cx, name, compiling.cop_filegv);
2476 compiling.cop_line = 0;
2480 MUTEX_LOCK(&eval_mutex);
2481 if (eval_owner && eval_owner != thr)
2483 COND_WAIT(&eval_cond, &eval_mutex);
2485 MUTEX_UNLOCK(&eval_mutex);
2486 #endif /* USE_THREADS */
2487 return DOCATCH(doeval(G_SCALAR, NULL));
2492 return pp_require(ARGS);
2498 register PERL_CONTEXT *cx;
2500 I32 gimme = GIMME_V, was = sub_generation;
2501 char tmpbuf[TYPE_DIGITS(long) + 12];
2506 if (!SvPV(sv,len) || !len)
2508 TAINT_PROPER("eval");
2514 /* switch to eval mode */
2516 SAVESPTR(compiling.cop_filegv);
2517 sprintf(tmpbuf, "_<(eval %lu)", (unsigned long)++evalseq);
2518 compiling.cop_filegv = gv_fetchfile(tmpbuf+2);
2519 compiling.cop_line = 1;
2520 /* XXX For C<eval "...">s within BEGIN {} blocks, this ends up
2521 deleting the eval's FILEGV from the stash before gv_check() runs
2522 (i.e. before run-time proper). To work around the coredump that
2523 ensues, we always turn GvMULTI_on for any globals that were
2524 introduced within evals. See force_ident(). GSAR 96-10-12 */
2525 safestr = savepv(tmpbuf);
2526 SAVEDELETE(defstash, safestr, strlen(safestr));
2528 hints = op->op_targ;
2530 push_return(op->op_next);
2531 PUSHBLOCK(cx, CXt_EVAL, SP);
2532 PUSHEVAL(cx, 0, compiling.cop_filegv);
2534 /* prepare to compile string */
2536 if (PERLDB_LINE && curstash != debstash)
2537 save_lines(GvAV(compiling.cop_filegv), linestr);
2540 MUTEX_LOCK(&eval_mutex);
2541 if (eval_owner && eval_owner != thr)
2543 COND_WAIT(&eval_cond, &eval_mutex);
2545 MUTEX_UNLOCK(&eval_mutex);
2546 #endif /* USE_THREADS */
2547 ret = doeval(gimme, NULL);
2548 if (PERLDB_INTER && was != sub_generation /* Some subs defined here. */
2549 && ret != op->op_next) { /* Successive compilation. */
2550 strcpy(safestr, "_<(eval )"); /* Anything fake and short. */
2552 return DOCATCH(ret);
2562 register PERL_CONTEXT *cx;
2564 U8 save_flags = op -> op_flags;
2569 retop = pop_return();
2572 if (gimme == G_VOID)
2574 else if (gimme == G_SCALAR) {
2577 if (SvFLAGS(TOPs) & SVs_TEMP)
2580 *MARK = sv_mortalcopy(TOPs);
2588 /* in case LEAVE wipes old return values */
2589 for (mark = newsp + 1; mark <= SP; mark++) {
2590 if (!(SvFLAGS(*mark) & SVs_TEMP)) {
2591 *mark = sv_mortalcopy(*mark);
2592 TAINT_NOT; /* Each item is independent */
2596 curpm = newpm; /* Don't pop $1 et al till now */
2599 * Closures mentioned at top level of eval cannot be referenced
2600 * again, and their presence indirectly causes a memory leak.
2601 * (Note that the fact that compcv and friends are still set here
2602 * is, AFAIK, an accident.) --Chip
2604 if (AvFILLp(comppad_name) >= 0) {
2605 SV **svp = AvARRAY(comppad_name);
2607 for (ix = AvFILLp(comppad_name); ix >= 0; ix--) {
2609 if (sv && sv != &sv_undef && *SvPVX(sv) == '&') {
2611 svp[ix] = &sv_undef;
2615 SvREFCNT_dec(CvOUTSIDE(sv));
2616 CvOUTSIDE(sv) = Nullcv;
2629 assert(CvDEPTH(compcv) == 1);
2631 CvDEPTH(compcv) = 0;
2634 if (optype == OP_REQUIRE &&
2635 !(gimme == G_SCALAR ? SvTRUE(*sp) : sp > newsp))
2637 /* Unassume the success we assumed earlier. */
2638 char *name = cx->blk_eval.old_name;
2639 (void)hv_delete(GvHVn(incgv), name, strlen(name), G_DISCARD);
2640 retop = die("%s did not return a true value", name);
2641 /* die_where() did LEAVE, or we won't be here */
2645 if (!(save_flags & OPf_SPECIAL))
2655 register PERL_CONTEXT *cx;
2656 I32 gimme = GIMME_V;
2661 push_return(cLOGOP->op_other->op_next);
2662 PUSHBLOCK(cx, CXt_EVAL, SP);
2664 eval_root = op; /* Only needed so that goto works right. */
2669 return DOCATCH(op->op_next);
2679 register PERL_CONTEXT *cx;
2687 if (gimme == G_VOID)
2689 else if (gimme == G_SCALAR) {
2692 if (SvFLAGS(TOPs) & (SVs_PADTMP|SVs_TEMP))
2695 *MARK = sv_mortalcopy(TOPs);
2704 /* in case LEAVE wipes old return values */
2705 for (mark = newsp + 1; mark <= SP; mark++) {
2706 if (!(SvFLAGS(*mark) & (SVs_PADTMP|SVs_TEMP))) {
2707 *mark = sv_mortalcopy(*mark);
2708 TAINT_NOT; /* Each item is independent */
2712 curpm = newpm; /* Don't pop $1 et al till now */
2723 register char *s = SvPV_force(sv, len);
2724 register char *send = s + len;
2725 register char *base;
2726 register I32 skipspaces = 0;
2729 bool postspace = FALSE;
2737 croak("Null picture in formline");
2739 New(804, fops, (send - s)*3+10, U16); /* Almost certainly too long... */
2744 *fpc++ = FF_LINEMARK;
2745 noblank = repeat = FALSE;
2763 case ' ': case '\t':
2774 *fpc++ = FF_LITERAL;
2782 *fpc++ = skipspaces;
2786 *fpc++ = FF_NEWLINE;
2790 arg = fpc - linepc + 1;
2797 *fpc++ = FF_LINEMARK;
2798 noblank = repeat = FALSE;
2807 ischop = s[-1] == '^';
2813 arg = (s - base) - 1;
2815 *fpc++ = FF_LITERAL;
2824 *fpc++ = FF_LINEGLOB;
2826 else if (*s == '#' || (*s == '.' && s[1] == '#')) {
2827 arg = ischop ? 512 : 0;
2837 arg |= 256 + (s - f);
2839 *fpc++ = s - base; /* fieldsize for FETCH */
2840 *fpc++ = FF_DECIMAL;
2845 bool ismore = FALSE;
2848 while (*++s == '>') ;
2849 prespace = FF_SPACE;
2851 else if (*s == '|') {
2852 while (*++s == '|') ;
2853 prespace = FF_HALFSPACE;
2858 while (*++s == '<') ;
2861 if (*s == '.' && s[1] == '.' && s[2] == '.') {
2865 *fpc++ = s - base; /* fieldsize for FETCH */
2867 *fpc++ = ischop ? FF_CHECKCHOP : FF_CHECKNL;
2885 { /* need to jump to the next word */
2887 z = WORD_ALIGN - SvCUR(sv) % WORD_ALIGN;
2888 SvGROW(sv, SvCUR(sv) + z + arg * sizeof(U16) + 4);
2889 s = SvPVX(sv) + SvCUR(sv) + z;
2891 Copy(fops, s, arg, U16);
2893 sv_magic(sv, Nullsv, 'f', Nullch, 0);
2898 * The rest of this file was derived from source code contributed
2901 * NOTE: this code was derived from Tom Horsley's qsort replacement
2902 * and should not be confused with the original code.
2905 /* Copyright (C) Tom Horsley, 1997. All rights reserved.
2907 Permission granted to distribute under the same terms as perl which are
2910 This program is free software; you can redistribute it and/or modify
2911 it under the terms of either:
2913 a) the GNU General Public License as published by the Free
2914 Software Foundation; either version 1, or (at your option) any
2917 b) the "Artistic License" which comes with this Kit.
2919 Details on the perl license can be found in the perl source code which
2920 may be located via the www.perl.com web page.
2922 This is the most wonderfulest possible qsort I can come up with (and
2923 still be mostly portable) My (limited) tests indicate it consistently
2924 does about 20% fewer calls to compare than does the qsort in the Visual
2925 C++ library, other vendors may vary.
2927 Some of the ideas in here can be found in "Algorithms" by Sedgewick,
2928 others I invented myself (or more likely re-invented since they seemed
2929 pretty obvious once I watched the algorithm operate for a while).
2931 Most of this code was written while watching the Marlins sweep the Giants
2932 in the 1997 National League Playoffs - no Braves fans allowed to use this
2933 code (just kidding :-).
2935 I realize that if I wanted to be true to the perl tradition, the only
2936 comment in this file would be something like:
2938 ...they shuffled back towards the rear of the line. 'No, not at the
2939 rear!' the slave-driver shouted. 'Three files up. And stay there...
2941 However, I really needed to violate that tradition just so I could keep
2942 track of what happens myself, not to mention some poor fool trying to
2943 understand this years from now :-).
2946 /* ********************************************************** Configuration */
2948 #ifndef QSORT_ORDER_GUESS
2949 #define QSORT_ORDER_GUESS 2 /* Select doubling version of the netBSD trick */
2952 /* QSORT_MAX_STACK is the largest number of partitions that can be stacked up for
2953 future processing - a good max upper bound is log base 2 of memory size
2954 (32 on 32 bit machines, 64 on 64 bit machines, etc). In reality can
2955 safely be smaller than that since the program is taking up some space and
2956 most operating systems only let you grab some subset of contiguous
2957 memory (not to mention that you are normally sorting data larger than
2958 1 byte element size :-).
2960 #ifndef QSORT_MAX_STACK
2961 #define QSORT_MAX_STACK 32
2964 /* QSORT_BREAK_EVEN is the size of the largest partition we should insertion sort.
2965 Anything bigger and we use qsort. If you make this too small, the qsort
2966 will probably break (or become less efficient), because it doesn't expect
2967 the middle element of a partition to be the same as the right or left -
2968 you have been warned).
2970 #ifndef QSORT_BREAK_EVEN
2971 #define QSORT_BREAK_EVEN 6
2974 /* ************************************************************* Data Types */
2976 /* hold left and right index values of a partition waiting to be sorted (the
2977 partition includes both left and right - right is NOT one past the end or
2978 anything like that).
2980 struct partition_stack_entry {
2983 #ifdef QSORT_ORDER_GUESS
2984 int qsort_break_even;
2988 /* ******************************************************* Shorthand Macros */
2990 /* Note that these macros will be used from inside the qsort function where
2991 we happen to know that the variable 'elt_size' contains the size of an
2992 array element and the variable 'temp' points to enough space to hold a
2993 temp element and the variable 'array' points to the array being sorted
2994 and 'compare' is the pointer to the compare routine.
2996 Also note that there are very many highly architecture specific ways
2997 these might be sped up, but this is simply the most generally portable
2998 code I could think of.
3001 /* Return < 0 == 0 or > 0 as the value of elt1 is < elt2, == elt2, > elt2
3004 #define qsort_cmp(elt1, elt2) \
3005 ((this->*compare)(array[elt1], array[elt2]))
3007 #define qsort_cmp(elt1, elt2) \
3008 ((*compare)(array[elt1], array[elt2]))
3011 #ifdef QSORT_ORDER_GUESS
3012 #define QSORT_NOTICE_SWAP swapped++;
3014 #define QSORT_NOTICE_SWAP
3017 /* swaps contents of array elements elt1, elt2.
3019 #define qsort_swap(elt1, elt2) \
3022 temp = array[elt1]; \
3023 array[elt1] = array[elt2]; \
3024 array[elt2] = temp; \
3027 /* rotate contents of elt1, elt2, elt3 such that elt1 gets elt2, elt2 gets
3028 elt3 and elt3 gets elt1.
3030 #define qsort_rotate(elt1, elt2, elt3) \
3033 temp = array[elt1]; \
3034 array[elt1] = array[elt2]; \
3035 array[elt2] = array[elt3]; \
3036 array[elt3] = temp; \
3039 /* ************************************************************ Debug stuff */
3046 return; /* good place to set a breakpoint */
3049 #define qsort_assert(t) (void)( (t) || (break_here(), 0) )
3052 doqsort_all_asserts(
3056 int (*compare)(const void * elt1, const void * elt2),
3057 int pc_left, int pc_right, int u_left, int u_right)
3061 qsort_assert(pc_left <= pc_right);
3062 qsort_assert(u_right < pc_left);
3063 qsort_assert(pc_right < u_left);
3064 for (i = u_right + 1; i < pc_left; ++i) {
3065 qsort_assert(qsort_cmp(i, pc_left) < 0);
3067 for (i = pc_left; i < pc_right; ++i) {
3068 qsort_assert(qsort_cmp(i, pc_right) == 0);
3070 for (i = pc_right + 1; i < u_left; ++i) {
3071 qsort_assert(qsort_cmp(pc_right, i) < 0);
3075 #define qsort_all_asserts(PC_LEFT, PC_RIGHT, U_LEFT, U_RIGHT) \
3076 doqsort_all_asserts(array, num_elts, elt_size, compare, \
3077 PC_LEFT, PC_RIGHT, U_LEFT, U_RIGHT)
3081 #define qsort_assert(t) ((void)0)
3083 #define qsort_all_asserts(PC_LEFT, PC_RIGHT, U_LEFT, U_RIGHT) ((void)0)
3087 /* ****************************************************************** qsort */
3091 qsortsv(SV ** array, size_t num_elts, SVCOMPARE compare)
3096 I32 (*compare)(SV *a, SV *b))
3101 struct partition_stack_entry partition_stack[QSORT_MAX_STACK];
3102 int next_stack_entry = 0;
3106 #ifdef QSORT_ORDER_GUESS
3107 int qsort_break_even;
3111 /* Make sure we actually have work to do.
3113 if (num_elts <= 1) {
3117 /* Setup the initial partition definition and fall into the sorting loop
3120 part_right = (int)(num_elts - 1);
3121 #ifdef QSORT_ORDER_GUESS
3122 qsort_break_even = QSORT_BREAK_EVEN;
3124 #define qsort_break_even QSORT_BREAK_EVEN
3127 if ((part_right - part_left) >= qsort_break_even) {
3128 /* OK, this is gonna get hairy, so lets try to document all the
3129 concepts and abbreviations and variables and what they keep
3132 pc: pivot chunk - the set of array elements we accumulate in the
3133 middle of the partition, all equal in value to the original
3134 pivot element selected. The pc is defined by:
3136 pc_left - the leftmost array index of the pc
3137 pc_right - the rightmost array index of the pc
3139 we start with pc_left == pc_right and only one element
3140 in the pivot chunk (but it can grow during the scan).
3142 u: uncompared elements - the set of elements in the partition
3143 we have not yet compared to the pivot value. There are two
3144 uncompared sets during the scan - one to the left of the pc
3145 and one to the right.
3147 u_right - the rightmost index of the left side's uncompared set
3148 u_left - the leftmost index of the right side's uncompared set
3150 The leftmost index of the left sides's uncompared set
3151 doesn't need its own variable because it is always defined
3152 by the leftmost edge of the whole partition (part_left). The
3153 same goes for the rightmost edge of the right partition
3156 We know there are no uncompared elements on the left once we
3157 get u_right < part_left and no uncompared elements on the
3158 right once u_left > part_right. When both these conditions
3159 are met, we have completed the scan of the partition.
3161 Any elements which are between the pivot chunk and the
3162 uncompared elements should be less than the pivot value on
3163 the left side and greater than the pivot value on the right
3164 side (in fact, the goal of the whole algorithm is to arrange
3165 for that to be true and make the groups of less-than and
3166 greater-then elements into new partitions to sort again).
3168 As you marvel at the complexity of the code and wonder why it
3169 has to be so confusing. Consider some of the things this level
3170 of confusion brings:
3172 Once I do a compare, I squeeze every ounce of juice out of it. I
3173 never do compare calls I don't have to do, and I certainly never
3176 I also never swap any elements unless I can prove there is a
3177 good reason. Many sort algorithms will swap a known value with
3178 an uncompared value just to get things in the right place (or
3179 avoid complexity :-), but that uncompared value, once it gets
3180 compared, may then have to be swapped again. A lot of the
3181 complexity of this code is due to the fact that it never swaps
3182 anything except compared values, and it only swaps them when the
3183 compare shows they are out of position.
3185 int pc_left, pc_right;
3186 int u_right, u_left;
3190 pc_left = ((part_left + part_right) / 2);
3192 u_right = pc_left - 1;
3193 u_left = pc_right + 1;
3195 /* Qsort works best when the pivot value is also the median value
3196 in the partition (unfortunately you can't find the median value
3197 without first sorting :-), so to give the algorithm a helping
3198 hand, we pick 3 elements and sort them and use the median value
3199 of that tiny set as the pivot value.
3201 Some versions of qsort like to use the left middle and right as
3202 the 3 elements to sort so they can insure the ends of the
3203 partition will contain values which will stop the scan in the
3204 compare loop, but when you have to call an arbitrarily complex
3205 routine to do a compare, its really better to just keep track of
3206 array index values to know when you hit the edge of the
3207 partition and avoid the extra compare. An even better reason to
3208 avoid using a compare call is the fact that you can drop off the
3209 edge of the array if someone foolishly provides you with an
3210 unstable compare function that doesn't always provide consistent
3213 So, since it is simpler for us to compare the three adjacent
3214 elements in the middle of the partition, those are the ones we
3215 pick here (conveniently pointed at by u_right, pc_left, and
3216 u_left). The values of the left, center, and right elements
3217 are refered to as l c and r in the following comments.
3220 #ifdef QSORT_ORDER_GUESS
3223 s = qsort_cmp(u_right, pc_left);
3226 s = qsort_cmp(pc_left, u_left);
3227 /* if l < c, c < r - already in order - nothing to do */
3229 /* l < c, c == r - already in order, pc grows */
3231 qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
3233 /* l < c, c > r - need to know more */
3234 s = qsort_cmp(u_right, u_left);
3236 /* l < c, c > r, l < r - swap c & r to get ordered */
3237 qsort_swap(pc_left, u_left);
3238 qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
3239 } else if (s == 0) {
3240 /* l < c, c > r, l == r - swap c&r, grow pc */
3241 qsort_swap(pc_left, u_left);
3243 qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
3245 /* l < c, c > r, l > r - make lcr into rlc to get ordered */
3246 qsort_rotate(pc_left, u_right, u_left);
3247 qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
3250 } else if (s == 0) {
3252 s = qsort_cmp(pc_left, u_left);
3254 /* l == c, c < r - already in order, grow pc */
3256 qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
3257 } else if (s == 0) {
3258 /* l == c, c == r - already in order, grow pc both ways */
3261 qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
3263 /* l == c, c > r - swap l & r, grow pc */
3264 qsort_swap(u_right, u_left);
3266 qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
3270 s = qsort_cmp(pc_left, u_left);
3272 /* l > c, c < r - need to know more */
3273 s = qsort_cmp(u_right, u_left);
3275 /* l > c, c < r, l < r - swap l & c to get ordered */
3276 qsort_swap(u_right, pc_left);
3277 qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
3278 } else if (s == 0) {
3279 /* l > c, c < r, l == r - swap l & c, grow pc */
3280 qsort_swap(u_right, pc_left);
3282 qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
3284 /* l > c, c < r, l > r - rotate lcr into crl to order */
3285 qsort_rotate(u_right, pc_left, u_left);
3286 qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
3288 } else if (s == 0) {
3289 /* l > c, c == r - swap ends, grow pc */
3290 qsort_swap(u_right, u_left);
3292 qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
3294 /* l > c, c > r - swap ends to get in order */
3295 qsort_swap(u_right, u_left);
3296 qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
3299 /* We now know the 3 middle elements have been compared and
3300 arranged in the desired order, so we can shrink the uncompared
3305 qsort_all_asserts(pc_left, pc_right, u_left, u_right);
3307 /* The above massive nested if was the simple part :-). We now have
3308 the middle 3 elements ordered and we need to scan through the
3309 uncompared sets on either side, swapping elements that are on
3310 the wrong side or simply shuffling equal elements around to get
3311 all equal elements into the pivot chunk.
3315 int still_work_on_left;
3316 int still_work_on_right;
3318 /* Scan the uncompared values on the left. If I find a value
3319 equal to the pivot value, move it over so it is adjacent to
3320 the pivot chunk and expand the pivot chunk. If I find a value
3321 less than the pivot value, then just leave it - its already
3322 on the correct side of the partition. If I find a greater
3323 value, then stop the scan.
3325 while (still_work_on_left = (u_right >= part_left)) {
3326 s = qsort_cmp(u_right, pc_left);
3329 } else if (s == 0) {
3331 if (pc_left != u_right) {
3332 qsort_swap(u_right, pc_left);
3338 qsort_assert(u_right < pc_left);
3339 qsort_assert(pc_left <= pc_right);
3340 qsort_assert(qsort_cmp(u_right + 1, pc_left) <= 0);
3341 qsort_assert(qsort_cmp(pc_left, pc_right) == 0);
3344 /* Do a mirror image scan of uncompared values on the right
3346 while (still_work_on_right = (u_left <= part_right)) {
3347 s = qsort_cmp(pc_right, u_left);
3350 } else if (s == 0) {
3352 if (pc_right != u_left) {
3353 qsort_swap(pc_right, u_left);
3359 qsort_assert(u_left > pc_right);
3360 qsort_assert(pc_left <= pc_right);
3361 qsort_assert(qsort_cmp(pc_right, u_left - 1) <= 0);
3362 qsort_assert(qsort_cmp(pc_left, pc_right) == 0);
3365 if (still_work_on_left) {
3366 /* I know I have a value on the left side which needs to be
3367 on the right side, but I need to know more to decide
3368 exactly the best thing to do with it.
3370 if (still_work_on_right) {
3371 /* I know I have values on both side which are out of
3372 position. This is a big win because I kill two birds
3373 with one swap (so to speak). I can advance the
3374 uncompared pointers on both sides after swapping both
3375 of them into the right place.
3377 qsort_swap(u_right, u_left);
3380 qsort_all_asserts(pc_left, pc_right, u_left, u_right);
3382 /* I have an out of position value on the left, but the
3383 right is fully scanned, so I "slide" the pivot chunk
3384 and any less-than values left one to make room for the
3385 greater value over on the right. If the out of position
3386 value is immediately adjacent to the pivot chunk (there
3387 are no less-than values), I can do that with a swap,
3388 otherwise, I have to rotate one of the less than values
3389 into the former position of the out of position value
3390 and the right end of the pivot chunk into the left end
3394 if (pc_left == u_right) {
3395 qsort_swap(u_right, pc_right);
3396 qsort_all_asserts(pc_left, pc_right-1, u_left, u_right-1);
3398 qsort_rotate(u_right, pc_left, pc_right);
3399 qsort_all_asserts(pc_left, pc_right-1, u_left, u_right-1);
3404 } else if (still_work_on_right) {
3405 /* Mirror image of complex case above: I have an out of
3406 position value on the right, but the left is fully
3407 scanned, so I need to shuffle things around to make room
3408 for the right value on the left.
3411 if (pc_right == u_left) {
3412 qsort_swap(u_left, pc_left);
3413 qsort_all_asserts(pc_left+1, pc_right, u_left+1, u_right);
3415 qsort_rotate(pc_right, pc_left, u_left);
3416 qsort_all_asserts(pc_left+1, pc_right, u_left+1, u_right);
3421 /* No more scanning required on either side of partition,
3422 break out of loop and figure out next set of partitions
3428 /* The elements in the pivot chunk are now in the right place. They
3429 will never move or be compared again. All I have to do is decide
3430 what to do with the stuff to the left and right of the pivot
3433 Notes on the QSORT_ORDER_GUESS ifdef code:
3435 1. If I just built these partitions without swapping any (or
3436 very many) elements, there is a chance that the elements are
3437 already ordered properly (being properly ordered will
3438 certainly result in no swapping, but the converse can't be
3441 2. A (properly written) insertion sort will run faster on
3442 already ordered data than qsort will.
3444 3. Perhaps there is some way to make a good guess about
3445 switching to an insertion sort earlier than partition size 6
3446 (for instance - we could save the partition size on the stack
3447 and increase the size each time we find we didn't swap, thus
3448 switching to insertion sort earlier for partitions with a
3449 history of not swapping).
3451 4. Naturally, if I just switch right away, it will make
3452 artificial benchmarks with pure ascending (or descending)
3453 data look really good, but is that a good reason in general?
3457 #ifdef QSORT_ORDER_GUESS
3459 #if QSORT_ORDER_GUESS == 1
3460 qsort_break_even = (part_right - part_left) + 1;
3462 #if QSORT_ORDER_GUESS == 2
3463 qsort_break_even *= 2;
3465 #if QSORT_ORDER_GUESS == 3
3466 int prev_break = qsort_break_even;
3467 qsort_break_even *= qsort_break_even;
3468 if (qsort_break_even < prev_break) {
3469 qsort_break_even = (part_right - part_left) + 1;
3473 qsort_break_even = QSORT_BREAK_EVEN;
3477 if (part_left < pc_left) {
3478 /* There are elements on the left which need more processing.
3479 Check the right as well before deciding what to do.
3481 if (pc_right < part_right) {
3482 /* We have two partitions to be sorted. Stack the biggest one
3483 and process the smallest one on the next iteration. This
3484 minimizes the stack height by insuring that any additional
3485 stack entries must come from the smallest partition which
3486 (because it is smallest) will have the fewest
3487 opportunities to generate additional stack entries.
3489 if ((part_right - pc_right) > (pc_left - part_left)) {
3490 /* stack the right partition, process the left */
3491 partition_stack[next_stack_entry].left = pc_right + 1;
3492 partition_stack[next_stack_entry].right = part_right;
3493 #ifdef QSORT_ORDER_GUESS
3494 partition_stack[next_stack_entry].qsort_break_even = qsort_break_even;
3496 part_right = pc_left - 1;
3498 /* stack the left partition, process the right */
3499 partition_stack[next_stack_entry].left = part_left;
3500 partition_stack[next_stack_entry].right = pc_left - 1;
3501 #ifdef QSORT_ORDER_GUESS
3502 partition_stack[next_stack_entry].qsort_break_even = qsort_break_even;
3504 part_left = pc_right + 1;
3506 qsort_assert(next_stack_entry < QSORT_MAX_STACK);
3509 /* The elements on the left are the only remaining elements
3510 that need sorting, arrange for them to be processed as the
3513 part_right = pc_left - 1;
3515 } else if (pc_right < part_right) {
3516 /* There is only one chunk on the right to be sorted, make it
3517 the new partition and loop back around.
3519 part_left = pc_right + 1;
3521 /* This whole partition wound up in the pivot chunk, so
3522 we need to get a new partition off the stack.
3524 if (next_stack_entry == 0) {
3525 /* the stack is empty - we are done */
3529 part_left = partition_stack[next_stack_entry].left;
3530 part_right = partition_stack[next_stack_entry].right;
3531 #ifdef QSORT_ORDER_GUESS
3532 qsort_break_even = partition_stack[next_stack_entry].qsort_break_even;
3536 /* This partition is too small to fool with qsort complexity, just
3537 do an ordinary insertion sort to minimize overhead.
3540 /* Assume 1st element is in right place already, and start checking
3541 at 2nd element to see where it should be inserted.
3543 for (i = part_left + 1; i <= part_right; ++i) {
3545 /* Scan (backwards - just in case 'i' is already in right place)
3546 through the elements already sorted to see if the ith element
3547 belongs ahead of one of them.
3549 for (j = i - 1; j >= part_left; --j) {
3550 if (qsort_cmp(i, j) >= 0) {
3551 /* i belongs right after j
3558 /* Looks like we really need to move some things
3561 for (--i; i >= j; --i)
3562 array[i + 1] = array[i];
3567 /* That partition is now sorted, grab the next one, or get out
3568 of the loop if there aren't any more.
3571 if (next_stack_entry == 0) {
3572 /* the stack is empty - we are done */
3576 part_left = partition_stack[next_stack_entry].left;
3577 part_right = partition_stack[next_stack_entry].right;
3578 #ifdef QSORT_ORDER_GUESS
3579 qsort_break_even = partition_stack[next_stack_entry].qsort_break_even;
3584 /* Believe it or not, the array is sorted at this point! */