3 * Copyright (c) 1991-1997, Larry Wall
5 * You may distribute under the terms of either the GNU General Public
6 * License or the Artistic License, as specified in the README file.
11 * Now far ahead the Road has gone,
12 * And I must follow, if I can,
13 * Pursuing it with eager feet,
14 * Until it joins some larger way
15 * Where many paths and errands meet.
16 * And whither then? I cannot say.
23 #define WORD_ALIGN sizeof(U16)
26 #define DOCATCH(o) ((CATCH_GET == TRUE) ? docatch(o) : (o))
29 #define CALLOP this->*PL_op
32 static OP *docatch _((OP *o));
33 static OP *dofindlabel _((OP *o, char *label, OP **opstack, OP **oplimit));
34 static void doparseform _((SV *sv));
35 static I32 dopoptoeval _((I32 startingblock));
36 static I32 dopoptolabel _((char *label));
37 static I32 dopoptoloop _((I32 startingblock));
38 static I32 dopoptosub _((I32 startingblock));
39 static I32 dopoptosub_at _((PERL_CONTEXT *cxstk, I32 startingblock));
40 static void save_lines _((AV *array, SV *sv));
41 static I32 sortcv _((SV *a, SV *b));
42 static void qsortsv _((SV **array, size_t num_elts, I32 (*fun)(SV *a, SV *b)));
43 static OP *doeval _((int gimme, OP** startop));
44 static I32 amagic_cmp _((SV *str1, SV *str2));
45 static I32 amagic_cmp_locale _((SV *str1, SV *str2));
54 cxix = dopoptosub(cxstack_ix);
58 switch (cxstack[cxix].blk_gimme) {
75 /* XXXX Should store the old value to allow for tie/overload - and
76 restore in regcomp, where marked with XXXX. */
84 register PMOP *pm = (PMOP*)cLOGOP->op_other;
88 MAGIC *mg = Null(MAGIC*);
92 SV *sv = SvRV(tmpstr);
94 mg = mg_find(sv, 'r');
97 regexp *re = (regexp *)mg->mg_obj;
98 ReREFCNT_dec(pm->op_pmregexp);
99 pm->op_pmregexp = ReREFCNT_inc(re);
102 t = SvPV(tmpstr, len);
104 /* Check against the last compiled regexp. */
105 if (!pm->op_pmregexp || !pm->op_pmregexp->precomp ||
106 pm->op_pmregexp->prelen != len ||
107 memNE(pm->op_pmregexp->precomp, t, len))
109 if (pm->op_pmregexp) {
110 ReREFCNT_dec(pm->op_pmregexp);
111 pm->op_pmregexp = Null(REGEXP*); /* crucial if regcomp aborts */
113 if (PL_op->op_flags & OPf_SPECIAL)
114 PL_reginterp_cnt = I32_MAX; /* Mark as safe. */
116 pm->op_pmflags = pm->op_pmpermflags; /* reset case sensitivity */
117 pm->op_pmregexp = CALLREGCOMP(t, t + len, pm);
118 PL_reginterp_cnt = 0; /* XXXX Be extra paranoid - needed
119 inside tie/overload accessors. */
123 #ifndef INCOMPLETE_TAINTS
126 pm->op_pmdynflags |= PMdf_TAINTED;
128 pm->op_pmdynflags &= ~PMdf_TAINTED;
132 if (!pm->op_pmregexp->prelen && PL_curpm)
134 else if (strEQ("\\s+", pm->op_pmregexp->precomp))
135 pm->op_pmflags |= PMf_WHITE;
137 if (pm->op_pmflags & PMf_KEEP) {
138 pm->op_private &= ~OPpRUNTIME; /* no point compiling again */
139 cLOGOP->op_first->op_next = PL_op->op_next;
147 register PMOP *pm = (PMOP*) cLOGOP->op_other;
148 register PERL_CONTEXT *cx = &cxstack[cxstack_ix];
149 register SV *dstr = cx->sb_dstr;
150 register char *s = cx->sb_s;
151 register char *m = cx->sb_m;
152 char *orig = cx->sb_orig;
153 register REGEXP *rx = cx->sb_rx;
155 rxres_restore(&cx->sb_rxres, rx);
157 if (cx->sb_iters++) {
158 if (cx->sb_iters > cx->sb_maxiters)
159 DIE("Substitution loop");
161 if (!(cx->sb_rxtainted & 2) && SvTAINTED(TOPs))
162 cx->sb_rxtainted |= 2;
163 sv_catsv(dstr, POPs);
166 if (cx->sb_once || !CALLREGEXEC(rx, s, cx->sb_strend, orig,
167 s == m, cx->sb_targ, NULL,
168 ((cx->sb_rflags & REXEC_COPY_STR)
169 ? 0 : REXEC_COPY_STR)))
171 SV *targ = cx->sb_targ;
172 sv_catpvn(dstr, s, cx->sb_strend - s);
174 cx->sb_rxtainted |= RX_MATCH_TAINTED(rx);
176 (void)SvOOK_off(targ);
177 Safefree(SvPVX(targ));
178 SvPVX(targ) = SvPVX(dstr);
179 SvCUR_set(targ, SvCUR(dstr));
180 SvLEN_set(targ, SvLEN(dstr));
184 TAINT_IF(cx->sb_rxtainted & 1);
185 PUSHs(sv_2mortal(newSViv((I32)cx->sb_iters - 1)));
187 (void)SvPOK_only(targ);
188 TAINT_IF(cx->sb_rxtainted);
192 LEAVE_SCOPE(cx->sb_oldsave);
194 RETURNOP(pm->op_next);
197 if (rx->subbase && rx->subbase != orig) {
200 cx->sb_orig = orig = rx->subbase;
202 cx->sb_strend = s + (cx->sb_strend - m);
204 cx->sb_m = m = rx->startp[0];
205 sv_catpvn(dstr, s, m-s);
206 cx->sb_s = rx->endp[0];
207 cx->sb_rxtainted |= RX_MATCH_TAINTED(rx);
208 rxres_save(&cx->sb_rxres, rx);
209 RETURNOP(pm->op_pmreplstart);
213 rxres_save(void **rsp, REGEXP *rx)
218 if (!p || p[1] < rx->nparens) {
219 i = 6 + rx->nparens * 2;
227 *p++ = (UV)rx->subbase;
228 rx->subbase = Nullch;
232 *p++ = (UV)rx->subbeg;
233 *p++ = (UV)rx->subend;
234 for (i = 0; i <= rx->nparens; ++i) {
235 *p++ = (UV)rx->startp[i];
236 *p++ = (UV)rx->endp[i];
241 rxres_restore(void **rsp, REGEXP *rx)
246 Safefree(rx->subbase);
247 rx->subbase = (char*)(*p);
252 rx->subbeg = (char*)(*p++);
253 rx->subend = (char*)(*p++);
254 for (i = 0; i <= rx->nparens; ++i) {
255 rx->startp[i] = (char*)(*p++);
256 rx->endp[i] = (char*)(*p++);
261 rxres_free(void **rsp)
266 Safefree((char*)(*p));
274 djSP; dMARK; dORIGMARK;
275 register SV *tmpForm = *++MARK;
287 bool chopspace = (strchr(PL_chopset, ' ') != Nullch);
293 STRLEN fudge = SvCUR(tmpForm) * (IN_UTF8 ? 3 : 1) + 1;
295 if (!SvMAGICAL(tmpForm) || !SvCOMPILED(tmpForm)) {
296 SvREADONLY_off(tmpForm);
297 doparseform(tmpForm);
300 SvPV_force(PL_formtarget, len);
301 t = SvGROW(PL_formtarget, len + fudge + 1); /* XXX SvCUR bad */
303 f = SvPV(tmpForm, len);
304 /* need to jump to the next word */
305 s = f + len + WORD_ALIGN - SvCUR(tmpForm) % WORD_ALIGN;
314 case FF_LITERAL: arg = fpc[1]; name = "LITERAL"; break;
315 case FF_BLANK: arg = fpc[1]; name = "BLANK"; break;
316 case FF_SKIP: arg = fpc[1]; name = "SKIP"; break;
317 case FF_FETCH: arg = fpc[1]; name = "FETCH"; break;
318 case FF_DECIMAL: arg = fpc[1]; name = "DECIMAL"; break;
320 case FF_CHECKNL: name = "CHECKNL"; break;
321 case FF_CHECKCHOP: name = "CHECKCHOP"; break;
322 case FF_SPACE: name = "SPACE"; break;
323 case FF_HALFSPACE: name = "HALFSPACE"; break;
324 case FF_ITEM: name = "ITEM"; break;
325 case FF_CHOP: name = "CHOP"; break;
326 case FF_LINEGLOB: name = "LINEGLOB"; break;
327 case FF_NEWLINE: name = "NEWLINE"; break;
328 case FF_MORE: name = "MORE"; break;
329 case FF_LINEMARK: name = "LINEMARK"; break;
330 case FF_END: name = "END"; break;
333 PerlIO_printf(PerlIO_stderr(), "%-16s%ld\n", name, (long) arg);
335 PerlIO_printf(PerlIO_stderr(), "%-16s\n", name);
363 if (ckWARN(WARN_SYNTAX))
364 warner(WARN_SYNTAX, "Not enough format arguments");
369 item = s = SvPV(sv, len);
372 itemsize = sv_len_utf8(sv);
373 if (itemsize != len) {
375 if (itemsize > fieldsize) {
376 itemsize = fieldsize;
377 itembytes = itemsize;
378 sv_pos_u2b(sv, &itembytes, 0);
382 send = chophere = s + itembytes;
391 sv_pos_b2u(sv, &itemsize);
395 if (itemsize > fieldsize)
396 itemsize = fieldsize;
397 send = chophere = s + itemsize;
409 item = s = SvPV(sv, len);
412 itemsize = sv_len_utf8(sv);
413 if (itemsize != len) {
415 if (itemsize <= fieldsize) {
416 send = chophere = s + itemsize;
427 itemsize = fieldsize;
428 itembytes = itemsize;
429 sv_pos_u2b(sv, &itembytes, 0);
430 send = chophere = s + itembytes;
431 while (s < send || (s == send && isSPACE(*s))) {
441 if (strchr(PL_chopset, *s))
446 itemsize = chophere - item;
447 sv_pos_b2u(sv, &itemsize);
452 if (itemsize <= fieldsize) {
453 send = chophere = s + itemsize;
464 itemsize = fieldsize;
465 send = chophere = s + itemsize;
466 while (s < send || (s == send && isSPACE(*s))) {
476 if (strchr(PL_chopset, *s))
481 itemsize = chophere - item;
486 arg = fieldsize - itemsize;
495 arg = fieldsize - itemsize;
510 switch (UTF8SKIP(s)) {
521 if ( !((*t++ = *s++) & ~31) )
529 int ch = *t++ = *s++;
532 if ( !((*t++ = *s++) & ~31) )
541 while (*s && isSPACE(*s))
548 item = s = SvPV(sv, len);
561 SvCUR_set(PL_formtarget, t - SvPVX(PL_formtarget));
562 sv_catpvn(PL_formtarget, item, itemsize);
563 SvGROW(PL_formtarget, SvCUR(PL_formtarget) + fudge + 1);
564 t = SvPVX(PL_formtarget) + SvCUR(PL_formtarget);
569 /* If the field is marked with ^ and the value is undefined,
572 if ((arg & 512) && !SvOK(sv)) {
580 /* Formats aren't yet marked for locales, so assume "yes". */
583 sprintf(t, "%#*.*f", (int) fieldsize, (int) arg & 255, value);
585 sprintf(t, "%*.0f", (int) fieldsize, value);
592 while (t-- > linemark && *t == ' ') ;
600 if (arg) { /* repeat until fields exhausted? */
602 SvCUR_set(PL_formtarget, t - SvPVX(PL_formtarget));
603 lines += FmLINES(PL_formtarget);
606 if (strnEQ(linemark, linemark - arg, arg))
607 DIE("Runaway format");
609 FmLINES(PL_formtarget) = lines;
611 RETURNOP(cLISTOP->op_first);
624 while (*s && isSPACE(*s) && s < send)
628 arg = fieldsize - itemsize;
635 if (strnEQ(s," ",3)) {
636 while (s > SvPVX(PL_formtarget) && isSPACE(s[-1]))
647 SvCUR_set(PL_formtarget, t - SvPVX(PL_formtarget));
648 FmLINES(PL_formtarget) += lines;
660 if (PL_stack_base + *PL_markstack_ptr == SP) {
662 if (GIMME_V == G_SCALAR)
664 RETURNOP(PL_op->op_next->op_next);
666 PL_stack_sp = PL_stack_base + *PL_markstack_ptr + 1;
667 pp_pushmark(ARGS); /* push dst */
668 pp_pushmark(ARGS); /* push src */
669 ENTER; /* enter outer scope */
672 /* SAVE_DEFSV does *not* suffice here for USE_THREADS */
674 ENTER; /* enter inner scope */
677 src = PL_stack_base[*PL_markstack_ptr];
682 if (PL_op->op_type == OP_MAPSTART)
683 pp_pushmark(ARGS); /* push top */
684 return ((LOGOP*)PL_op->op_next)->op_other;
689 DIE("panic: mapstart"); /* uses grepstart */
695 I32 diff = (SP - PL_stack_base) - *PL_markstack_ptr;
701 ++PL_markstack_ptr[-1];
703 if (diff > PL_markstack_ptr[-1] - PL_markstack_ptr[-2]) {
704 shift = diff - (PL_markstack_ptr[-1] - PL_markstack_ptr[-2]);
705 count = (SP - PL_stack_base) - PL_markstack_ptr[-1] + 2;
710 PL_markstack_ptr[-1] += shift;
711 *PL_markstack_ptr += shift;
715 dst = PL_stack_base + (PL_markstack_ptr[-2] += diff) - 1;
718 *dst-- = SvTEMP(TOPs) ? POPs : sv_mortalcopy(POPs);
720 LEAVE; /* exit inner scope */
723 if (PL_markstack_ptr[-1] > *PL_markstack_ptr) {
727 (void)POPMARK; /* pop top */
728 LEAVE; /* exit outer scope */
729 (void)POPMARK; /* pop src */
730 items = --*PL_markstack_ptr - PL_markstack_ptr[-1];
731 (void)POPMARK; /* pop dst */
732 SP = PL_stack_base + POPMARK; /* pop original mark */
733 if (gimme == G_SCALAR) {
737 else if (gimme == G_ARRAY)
744 ENTER; /* enter inner scope */
747 src = PL_stack_base[PL_markstack_ptr[-1]];
751 RETURNOP(cLOGOP->op_other);
755 #define tryCALL_AMAGICbin(left,right,meth,svp) STMT_START { \
757 if (PL_amagic_generation) { \
758 if (SvAMAGIC(left)||SvAMAGIC(right))\
759 *svp = amagic_call(left, \
767 amagic_cmp(register SV *str1, register SV *str2)
770 tryCALL_AMAGICbin(str1,str2,scmp,&tmpsv);
775 I32 i = SvIVX(tmpsv);
785 return sv_cmp(str1, str2);
789 amagic_cmp_locale(register SV *str1, register SV *str2)
792 tryCALL_AMAGICbin(str1,str2,scmp,&tmpsv);
797 I32 i = SvIVX(tmpsv);
807 return sv_cmp_locale(str1, str2);
812 djSP; dMARK; dORIGMARK;
814 SV **myorigmark = ORIGMARK;
820 OP* nextop = PL_op->op_next;
823 if (gimme != G_ARRAY) {
829 SAVEPPTR(PL_sortcop);
830 if (PL_op->op_flags & OPf_STACKED) {
831 if (PL_op->op_flags & OPf_SPECIAL) {
832 OP *kid = cLISTOP->op_first->op_sibling; /* pass pushmark */
833 kid = kUNOP->op_first; /* pass rv2gv */
834 kid = kUNOP->op_first; /* pass leave */
835 PL_sortcop = kid->op_next;
836 stash = PL_curcop->cop_stash;
839 cv = sv_2cv(*++MARK, &stash, &gv, 0);
840 if (!(cv && CvROOT(cv))) {
842 SV *tmpstr = sv_newmortal();
843 gv_efullname3(tmpstr, gv, Nullch);
844 if (cv && CvXSUB(cv))
845 DIE("Xsub \"%s\" called in sort", SvPVX(tmpstr));
846 DIE("Undefined sort subroutine \"%s\" called",
851 DIE("Xsub called in sort");
852 DIE("Undefined subroutine in sort");
854 DIE("Not a CODE reference in sort");
856 PL_sortcop = CvSTART(cv);
857 SAVESPTR(CvROOT(cv)->op_ppaddr);
858 CvROOT(cv)->op_ppaddr = PL_ppaddr[OP_NULL];
861 PL_curpad = AvARRAY((AV*)AvARRAY(CvPADLIST(cv))[1]);
866 stash = PL_curcop->cop_stash;
870 while (MARK < SP) { /* This may or may not shift down one here. */
872 if (*up = *++MARK) { /* Weed out nulls. */
874 if (!PL_sortcop && !SvPOK(*up)) {
879 (void)sv_2pv(*up, &n_a);
884 max = --up - myorigmark;
889 bool oldcatch = CATCH_GET;
895 PUSHSTACKi(PERLSI_SORT);
896 if (PL_sortstash != stash) {
897 PL_firstgv = gv_fetchpv("a", TRUE, SVt_PV);
898 PL_secondgv = gv_fetchpv("b", TRUE, SVt_PV);
899 PL_sortstash = stash;
902 SAVESPTR(GvSV(PL_firstgv));
903 SAVESPTR(GvSV(PL_secondgv));
905 PUSHBLOCK(cx, CXt_NULL, PL_stack_base);
906 if (!(PL_op->op_flags & OPf_SPECIAL)) {
907 bool hasargs = FALSE;
908 cx->cx_type = CXt_SUB;
909 cx->blk_gimme = G_SCALAR;
912 (void)SvREFCNT_inc(cv); /* in preparation for POPSUB */
914 PL_sortcxix = cxstack_ix;
915 qsortsv((myorigmark+1), max, FUNC_NAME_TO_PTR(sortcv));
917 POPBLOCK(cx,PL_curpm);
925 MEXTEND(SP, 20); /* Can't afford stack realloc on signal. */
926 qsortsv(ORIGMARK+1, max,
927 (PL_op->op_private & OPpLOCALE)
929 ? FUNC_NAME_TO_PTR(amagic_cmp_locale)
930 : FUNC_NAME_TO_PTR(sv_cmp_locale))
932 ? FUNC_NAME_TO_PTR(amagic_cmp)
933 : FUNC_NAME_TO_PTR(sv_cmp) ));
937 PL_stack_sp = ORIGMARK + max;
945 if (GIMME == G_ARRAY)
946 return cCONDOP->op_true;
947 return SvTRUEx(PAD_SV(PL_op->op_targ)) ? cCONDOP->op_false : cCONDOP->op_true;
954 if (GIMME == G_ARRAY) {
955 RETURNOP(((CONDOP*)cUNOP->op_first)->op_false);
959 SV *targ = PAD_SV(PL_op->op_targ);
961 if ((PL_op->op_private & OPpFLIP_LINENUM)
962 ? (PL_last_in_gv && SvIV(sv) == (IV)IoLINES(GvIOp(PL_last_in_gv)))
964 sv_setiv(PAD_SV(cUNOP->op_first->op_targ), 1);
965 if (PL_op->op_flags & OPf_SPECIAL) {
973 RETURNOP(((CONDOP*)cUNOP->op_first)->op_false);
986 if (GIMME == G_ARRAY) {
992 if (SvNIOKp(left) || !SvPOKp(left) ||
993 (looks_like_number(left) && *SvPVX(left) != '0') )
995 if (SvNV(left) < IV_MIN || SvNV(right) >= IV_MAX)
996 croak("Range iterator outside integer range");
1000 EXTEND_MORTAL(max - i + 1);
1001 EXTEND(SP, max - i + 1);
1004 sv = sv_2mortal(newSViv(i++));
1009 SV *final = sv_mortalcopy(right);
1011 char *tmps = SvPV(final, len);
1013 sv = sv_mortalcopy(left);
1015 while (!SvNIOKp(sv) && SvCUR(sv) <= len) {
1017 if (strEQ(SvPVX(sv),tmps))
1019 sv = sv_2mortal(newSVsv(sv));
1026 SV *targ = PAD_SV(cUNOP->op_first->op_targ);
1028 if ((PL_op->op_private & OPpFLIP_LINENUM)
1029 ? (PL_last_in_gv && SvIV(sv) == (IV)IoLINES(GvIOp(PL_last_in_gv)))
1031 sv_setiv(PAD_SV(((UNOP*)cUNOP->op_first)->op_first->op_targ), 0);
1032 sv_catpv(targ, "E0");
1043 dopoptolabel(char *label)
1047 register PERL_CONTEXT *cx;
1049 for (i = cxstack_ix; i >= 0; i--) {
1051 switch (CxTYPE(cx)) {
1053 if (ckWARN(WARN_UNSAFE))
1054 warner(WARN_UNSAFE, "Exiting substitution via %s",
1055 PL_op_name[PL_op->op_type]);
1058 if (ckWARN(WARN_UNSAFE))
1059 warner(WARN_UNSAFE, "Exiting subroutine via %s",
1060 PL_op_name[PL_op->op_type]);
1063 if (ckWARN(WARN_UNSAFE))
1064 warner(WARN_UNSAFE, "Exiting eval via %s",
1065 PL_op_name[PL_op->op_type]);
1068 if (ckWARN(WARN_UNSAFE))
1069 warner(WARN_UNSAFE, "Exiting pseudo-block via %s",
1070 PL_op_name[PL_op->op_type]);
1073 if (!cx->blk_loop.label ||
1074 strNE(label, cx->blk_loop.label) ) {
1075 DEBUG_l(deb("(Skipping label #%ld %s)\n",
1076 (long)i, cx->blk_loop.label));
1079 DEBUG_l( deb("(Found label #%ld %s)\n", (long)i, label));
1089 I32 gimme = block_gimme();
1090 return (gimme == G_VOID) ? G_SCALAR : gimme;
1099 cxix = dopoptosub(cxstack_ix);
1103 switch (cxstack[cxix].blk_gimme) {
1111 croak("panic: bad gimme: %d\n", cxstack[cxix].blk_gimme);
1118 dopoptosub(I32 startingblock)
1121 return dopoptosub_at(cxstack, startingblock);
1125 dopoptosub_at(PERL_CONTEXT *cxstk, I32 startingblock)
1129 register PERL_CONTEXT *cx;
1130 for (i = startingblock; i >= 0; i--) {
1132 switch (CxTYPE(cx)) {
1137 DEBUG_l( deb("(Found sub #%ld)\n", (long)i));
1145 dopoptoeval(I32 startingblock)
1149 register PERL_CONTEXT *cx;
1150 for (i = startingblock; i >= 0; i--) {
1152 switch (CxTYPE(cx)) {
1156 DEBUG_l( deb("(Found eval #%ld)\n", (long)i));
1164 dopoptoloop(I32 startingblock)
1168 register PERL_CONTEXT *cx;
1169 for (i = startingblock; i >= 0; i--) {
1171 switch (CxTYPE(cx)) {
1173 if (ckWARN(WARN_UNSAFE))
1174 warner(WARN_UNSAFE, "Exiting substitution via %s",
1175 PL_op_name[PL_op->op_type]);
1178 if (ckWARN(WARN_UNSAFE))
1179 warner(WARN_UNSAFE, "Exiting subroutine via %s",
1180 PL_op_name[PL_op->op_type]);
1183 if (ckWARN(WARN_UNSAFE))
1184 warner(WARN_UNSAFE, "Exiting eval via %s",
1185 PL_op_name[PL_op->op_type]);
1188 if (ckWARN(WARN_UNSAFE))
1189 warner(WARN_UNSAFE, "Exiting pseudo-block via %s",
1190 PL_op_name[PL_op->op_type]);
1193 DEBUG_l( deb("(Found loop #%ld)\n", (long)i));
1204 register PERL_CONTEXT *cx;
1208 while (cxstack_ix > cxix) {
1209 cx = &cxstack[cxstack_ix];
1210 DEBUG_l(PerlIO_printf(Perl_debug_log, "Unwinding block %ld, type %s\n",
1211 (long) cxstack_ix, PL_block_type[CxTYPE(cx)]));
1212 /* Note: we don't need to restore the base context info till the end. */
1213 switch (CxTYPE(cx)) {
1216 continue; /* not break */
1234 die_where(char *message)
1240 register PERL_CONTEXT *cx;
1245 if (PL_in_eval & 4) {
1247 STRLEN klen = strlen(message);
1249 svp = hv_fetch(ERRHV, message, klen, TRUE);
1252 static char prefix[] = "\t(in cleanup) ";
1254 sv_upgrade(*svp, SVt_IV);
1255 (void)SvIOK_only(*svp);
1258 SvGROW(err, SvCUR(err)+sizeof(prefix)+klen);
1259 sv_catpvn(err, prefix, sizeof(prefix)-1);
1260 sv_catpvn(err, message, klen);
1261 if (ckWARN(WARN_UNSAFE)) {
1262 STRLEN start = SvCUR(err)-klen-sizeof(prefix)+1;
1263 warner(WARN_UNSAFE, SvPVX(err)+start);
1270 sv_setpv(ERRSV, message);
1273 message = SvPVx(ERRSV, n_a);
1275 while ((cxix = dopoptoeval(cxstack_ix)) < 0 && PL_curstackinfo->si_prev) {
1283 if (cxix < cxstack_ix)
1286 POPBLOCK(cx,PL_curpm);
1287 if (CxTYPE(cx) != CXt_EVAL) {
1288 PerlIO_printf(PerlIO_stderr(), "panic: die %s", message);
1293 if (gimme == G_SCALAR)
1294 *++newsp = &PL_sv_undef;
1295 PL_stack_sp = newsp;
1299 if (optype == OP_REQUIRE) {
1300 char* msg = SvPVx(ERRSV, n_a);
1301 DIE("%s", *msg ? msg : "Compilation failed in require");
1303 return pop_return();
1307 message = SvPVx(ERRSV, n_a);
1308 PerlIO_printf(PerlIO_stderr(), "%s",message);
1309 PerlIO_flush(PerlIO_stderr());
1318 if (SvTRUE(left) != SvTRUE(right))
1330 RETURNOP(cLOGOP->op_other);
1339 RETURNOP(cLOGOP->op_other);
1345 register I32 cxix = dopoptosub(cxstack_ix);
1346 register PERL_CONTEXT *cx;
1347 register PERL_CONTEXT *ccstack = cxstack;
1348 PERL_SI *top_si = PL_curstackinfo;
1359 /* we may be in a higher stacklevel, so dig down deeper */
1360 while (cxix < 0 && top_si->si_type != PERLSI_MAIN) {
1361 top_si = top_si->si_prev;
1362 ccstack = top_si->si_cxstack;
1363 cxix = dopoptosub_at(ccstack, top_si->si_cxix);
1366 if (GIMME != G_ARRAY)
1370 if (PL_DBsub && cxix >= 0 &&
1371 ccstack[cxix].blk_sub.cv == GvCV(PL_DBsub))
1375 cxix = dopoptosub_at(ccstack, cxix - 1);
1378 cx = &ccstack[cxix];
1379 if (CxTYPE(cx) == CXt_SUB) {
1380 dbcxix = dopoptosub_at(ccstack, cxix - 1);
1381 /* We expect that ccstack[dbcxix] is CXt_SUB, anyway, the
1382 field below is defined for any cx. */
1383 if (PL_DBsub && dbcxix >= 0 && ccstack[dbcxix].blk_sub.cv == GvCV(PL_DBsub))
1384 cx = &ccstack[dbcxix];
1387 if (GIMME != G_ARRAY) {
1388 hv = cx->blk_oldcop->cop_stash;
1390 PUSHs(&PL_sv_undef);
1393 sv_setpv(TARG, HvNAME(hv));
1399 hv = cx->blk_oldcop->cop_stash;
1401 PUSHs(&PL_sv_undef);
1403 PUSHs(sv_2mortal(newSVpv(HvNAME(hv), 0)));
1404 PUSHs(sv_2mortal(newSVpv(SvPVX(GvSV(cx->blk_oldcop->cop_filegv)), 0)));
1405 PUSHs(sv_2mortal(newSViv((I32)cx->blk_oldcop->cop_line)));
1408 if (CxTYPE(cx) == CXt_SUB) { /* So is ccstack[dbcxix]. */
1410 gv_efullname3(sv, CvGV(ccstack[cxix].blk_sub.cv), Nullch);
1411 PUSHs(sv_2mortal(sv));
1412 PUSHs(sv_2mortal(newSViv((I32)cx->blk_sub.hasargs)));
1415 PUSHs(sv_2mortal(newSVpv("(eval)",0)));
1416 PUSHs(sv_2mortal(newSViv(0)));
1418 gimme = (I32)cx->blk_gimme;
1419 if (gimme == G_VOID)
1420 PUSHs(&PL_sv_undef);
1422 PUSHs(sv_2mortal(newSViv(gimme & G_ARRAY)));
1423 if (CxTYPE(cx) == CXt_EVAL) {
1424 if (cx->blk_eval.old_op_type == OP_ENTEREVAL) {
1425 PUSHs(cx->blk_eval.cur_text);
1428 else if (cx->blk_eval.old_name) { /* Try blocks have old_name == 0. */
1429 /* Require, put the name. */
1430 PUSHs(sv_2mortal(newSVpv(cx->blk_eval.old_name, 0)));
1434 else if (CxTYPE(cx) == CXt_SUB &&
1435 cx->blk_sub.hasargs &&
1436 PL_curcop->cop_stash == PL_debstash)
1438 AV *ary = cx->blk_sub.argarray;
1439 int off = AvARRAY(ary) - AvALLOC(ary);
1443 PL_dbargs = GvAV(gv_AVadd(tmpgv = gv_fetchpv("DB::args", TRUE,
1446 AvREAL_off(PL_dbargs); /* XXX Should be REIFY */
1449 if (AvMAX(PL_dbargs) < AvFILLp(ary) + off)
1450 av_extend(PL_dbargs, AvFILLp(ary) + off);
1451 Copy(AvALLOC(ary), AvARRAY(PL_dbargs), AvFILLp(ary) + 1 + off, SV*);
1452 AvFILLp(PL_dbargs) = AvFILLp(ary) + off;
1458 sortcv(SV *a, SV *b)
1461 I32 oldsaveix = PL_savestack_ix;
1462 I32 oldscopeix = PL_scopestack_ix;
1464 GvSV(PL_firstgv) = a;
1465 GvSV(PL_secondgv) = b;
1466 PL_stack_sp = PL_stack_base;
1469 if (PL_stack_sp != PL_stack_base + 1)
1470 croak("Sort subroutine didn't return single value");
1471 if (!SvNIOKp(*PL_stack_sp))
1472 croak("Sort subroutine didn't return a numeric value");
1473 result = SvIV(*PL_stack_sp);
1474 while (PL_scopestack_ix > oldscopeix) {
1477 leave_scope(oldsaveix);
1491 sv_reset(tmps, PL_curcop->cop_stash);
1503 PL_curcop = (COP*)PL_op;
1504 TAINT_NOT; /* Each statement is presumed innocent */
1505 PL_stack_sp = PL_stack_base + cxstack[cxstack_ix].blk_oldsp;
1508 if (PL_op->op_private || SvIV(PL_DBsingle) || SvIV(PL_DBsignal) || SvIV(PL_DBtrace))
1512 register PERL_CONTEXT *cx;
1513 I32 gimme = G_ARRAY;
1520 DIE("No DB::DB routine defined");
1522 if (CvDEPTH(cv) >= 1 && !(PL_debug & (1<<30))) /* don't do recursive DB::DB call */
1534 push_return(PL_op->op_next);
1535 PUSHBLOCK(cx, CXt_SUB, SP);
1538 (void)SvREFCNT_inc(cv);
1539 SAVESPTR(PL_curpad);
1540 PL_curpad = AvARRAY((AV*)*av_fetch(CvPADLIST(cv),1,FALSE));
1541 RETURNOP(CvSTART(cv));
1555 register PERL_CONTEXT *cx;
1556 I32 gimme = GIMME_V;
1563 if (PL_op->op_flags & OPf_SPECIAL)
1564 svp = save_threadsv(PL_op->op_targ); /* per-thread variable */
1566 #endif /* USE_THREADS */
1567 if (PL_op->op_targ) {
1568 svp = &PL_curpad[PL_op->op_targ]; /* "my" variable */
1573 (void)save_scalar(gv);
1574 svp = &GvSV(gv); /* symbol table variable */
1579 PUSHBLOCK(cx, CXt_LOOP, SP);
1580 PUSHLOOP(cx, svp, MARK);
1581 if (PL_op->op_flags & OPf_STACKED) {
1582 cx->blk_loop.iterary = (AV*)SvREFCNT_inc(POPs);
1583 if (SvTYPE(cx->blk_loop.iterary) != SVt_PVAV) {
1585 if (SvNIOKp(sv) || !SvPOKp(sv) ||
1586 (looks_like_number(sv) && *SvPVX(sv) != '0')) {
1587 if (SvNV(sv) < IV_MIN ||
1588 SvNV((SV*)cx->blk_loop.iterary) >= IV_MAX)
1589 croak("Range iterator outside integer range");
1590 cx->blk_loop.iterix = SvIV(sv);
1591 cx->blk_loop.itermax = SvIV((SV*)cx->blk_loop.iterary);
1594 cx->blk_loop.iterlval = newSVsv(sv);
1598 cx->blk_loop.iterary = PL_curstack;
1599 AvFILLp(PL_curstack) = SP - PL_stack_base;
1600 cx->blk_loop.iterix = MARK - PL_stack_base;
1609 register PERL_CONTEXT *cx;
1610 I32 gimme = GIMME_V;
1616 PUSHBLOCK(cx, CXt_LOOP, SP);
1617 PUSHLOOP(cx, 0, SP);
1625 register PERL_CONTEXT *cx;
1626 struct block_loop cxloop;
1634 POPLOOP1(cx); /* Delay POPLOOP2 until stack values are safe */
1637 if (gimme == G_VOID)
1639 else if (gimme == G_SCALAR) {
1641 *++newsp = sv_mortalcopy(*SP);
1643 *++newsp = &PL_sv_undef;
1647 *++newsp = sv_mortalcopy(*++mark);
1648 TAINT_NOT; /* Each item is independent */
1654 POPLOOP2(); /* Stack values are safe: release loop vars ... */
1655 PL_curpm = newpm; /* ... and pop $1 et al */
1667 register PERL_CONTEXT *cx;
1668 struct block_sub cxsub;
1669 bool popsub2 = FALSE;
1675 if (PL_curstackinfo->si_type == PERLSI_SORT) {
1676 if (cxstack_ix == PL_sortcxix || dopoptosub(cxstack_ix) <= PL_sortcxix) {
1677 if (cxstack_ix > PL_sortcxix)
1678 dounwind(PL_sortcxix);
1679 AvARRAY(PL_curstack)[1] = *SP;
1680 PL_stack_sp = PL_stack_base + 1;
1685 cxix = dopoptosub(cxstack_ix);
1687 DIE("Can't return outside a subroutine");
1688 if (cxix < cxstack_ix)
1692 switch (CxTYPE(cx)) {
1694 POPSUB1(cx); /* Delay POPSUB2 until stack values are safe */
1699 if (optype == OP_REQUIRE &&
1700 (MARK == SP || (gimme == G_SCALAR && !SvTRUE(*SP))) )
1702 /* Unassume the success we assumed earlier. */
1703 char *name = cx->blk_eval.old_name;
1704 (void)hv_delete(GvHVn(PL_incgv), name, strlen(name), G_DISCARD);
1705 DIE("%s did not return a true value", name);
1709 DIE("panic: return");
1713 if (gimme == G_SCALAR) {
1716 if (cxsub.cv && CvDEPTH(cxsub.cv) > 1) {
1718 *++newsp = SvREFCNT_inc(*SP);
1723 *++newsp = sv_mortalcopy(*SP);
1726 *++newsp = (SvTEMP(*SP)) ? *SP : sv_mortalcopy(*SP);
1728 *++newsp = sv_mortalcopy(*SP);
1730 *++newsp = &PL_sv_undef;
1732 else if (gimme == G_ARRAY) {
1733 while (++MARK <= SP) {
1734 *++newsp = (popsub2 && SvTEMP(*MARK))
1735 ? *MARK : sv_mortalcopy(*MARK);
1736 TAINT_NOT; /* Each item is independent */
1739 PL_stack_sp = newsp;
1741 /* Stack values are safe: */
1743 POPSUB2(); /* release CV and @_ ... */
1745 PL_curpm = newpm; /* ... and pop $1 et al */
1748 return pop_return();
1755 register PERL_CONTEXT *cx;
1756 struct block_loop cxloop;
1757 struct block_sub cxsub;
1764 SV **mark = PL_stack_base + cxstack[cxstack_ix].blk_oldsp;
1766 if (PL_op->op_flags & OPf_SPECIAL) {
1767 cxix = dopoptoloop(cxstack_ix);
1769 DIE("Can't \"last\" outside a block");
1772 cxix = dopoptolabel(cPVOP->op_pv);
1774 DIE("Label not found for \"last %s\"", cPVOP->op_pv);
1776 if (cxix < cxstack_ix)
1780 switch (CxTYPE(cx)) {
1782 POPLOOP1(cx); /* Delay POPLOOP2 until stack values are safe */
1784 nextop = cxloop.last_op->op_next;
1787 POPSUB1(cx); /* Delay POPSUB2 until stack values are safe */
1789 nextop = pop_return();
1793 nextop = pop_return();
1800 if (gimme == G_SCALAR) {
1802 *++newsp = ((pop2 == CXt_SUB) && SvTEMP(*SP))
1803 ? *SP : sv_mortalcopy(*SP);
1805 *++newsp = &PL_sv_undef;
1807 else if (gimme == G_ARRAY) {
1808 while (++MARK <= SP) {
1809 *++newsp = ((pop2 == CXt_SUB) && SvTEMP(*MARK))
1810 ? *MARK : sv_mortalcopy(*MARK);
1811 TAINT_NOT; /* Each item is independent */
1817 /* Stack values are safe: */
1820 POPLOOP2(); /* release loop vars ... */
1824 POPSUB2(); /* release CV and @_ ... */
1827 PL_curpm = newpm; /* ... and pop $1 et al */
1836 register PERL_CONTEXT *cx;
1839 if (PL_op->op_flags & OPf_SPECIAL) {
1840 cxix = dopoptoloop(cxstack_ix);
1842 DIE("Can't \"next\" outside a block");
1845 cxix = dopoptolabel(cPVOP->op_pv);
1847 DIE("Label not found for \"next %s\"", cPVOP->op_pv);
1849 if (cxix < cxstack_ix)
1853 oldsave = PL_scopestack[PL_scopestack_ix - 1];
1854 LEAVE_SCOPE(oldsave);
1855 return cx->blk_loop.next_op;
1861 register PERL_CONTEXT *cx;
1864 if (PL_op->op_flags & OPf_SPECIAL) {
1865 cxix = dopoptoloop(cxstack_ix);
1867 DIE("Can't \"redo\" outside a block");
1870 cxix = dopoptolabel(cPVOP->op_pv);
1872 DIE("Label not found for \"redo %s\"", cPVOP->op_pv);
1874 if (cxix < cxstack_ix)
1878 oldsave = PL_scopestack[PL_scopestack_ix - 1];
1879 LEAVE_SCOPE(oldsave);
1880 return cx->blk_loop.redo_op;
1884 dofindlabel(OP *o, char *label, OP **opstack, OP **oplimit)
1888 static char too_deep[] = "Target of goto is too deeply nested";
1892 if (o->op_type == OP_LEAVE ||
1893 o->op_type == OP_SCOPE ||
1894 o->op_type == OP_LEAVELOOP ||
1895 o->op_type == OP_LEAVETRY)
1897 *ops++ = cUNOPo->op_first;
1902 if (o->op_flags & OPf_KIDS) {
1904 /* First try all the kids at this level, since that's likeliest. */
1905 for (kid = cUNOPo->op_first; kid; kid = kid->op_sibling) {
1906 if ((kid->op_type == OP_NEXTSTATE || kid->op_type == OP_DBSTATE) &&
1907 kCOP->cop_label && strEQ(kCOP->cop_label, label))
1910 for (kid = cUNOPo->op_first; kid; kid = kid->op_sibling) {
1911 if (kid == PL_lastgotoprobe)
1913 if ((kid->op_type == OP_NEXTSTATE || kid->op_type == OP_DBSTATE) &&
1915 (ops[-1]->op_type != OP_NEXTSTATE &&
1916 ops[-1]->op_type != OP_DBSTATE)))
1918 if (o = dofindlabel(kid, label, ops, oplimit))
1928 return pp_goto(ARGS);
1937 register PERL_CONTEXT *cx;
1938 #define GOTO_DEPTH 64
1939 OP *enterops[GOTO_DEPTH];
1941 int do_dump = (PL_op->op_type == OP_DUMP);
1944 if (PL_op->op_flags & OPf_STACKED) {
1948 /* This egregious kludge implements goto &subroutine */
1949 if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVCV) {
1951 register PERL_CONTEXT *cx;
1952 CV* cv = (CV*)SvRV(sv);
1956 int arg_was_real = 0;
1959 if (!CvROOT(cv) && !CvXSUB(cv)) {
1964 /* autoloaded stub? */
1965 if (cv != GvCV(gv) && (cv = GvCV(gv)))
1967 autogv = gv_autoload4(GvSTASH(gv), GvNAME(gv),
1968 GvNAMELEN(gv), FALSE);
1969 if (autogv && (cv = GvCV(autogv)))
1971 tmpstr = sv_newmortal();
1972 gv_efullname3(tmpstr, gv, Nullch);
1973 DIE("Goto undefined subroutine &%s",SvPVX(tmpstr));
1975 DIE("Goto undefined subroutine");
1978 /* First do some returnish stuff. */
1979 cxix = dopoptosub(cxstack_ix);
1981 DIE("Can't goto subroutine outside a subroutine");
1982 if (cxix < cxstack_ix)
1985 if (CxTYPE(cx) == CXt_EVAL && cx->blk_eval.old_op_type == OP_ENTEREVAL)
1986 DIE("Can't goto subroutine from an eval-string");
1988 if (CxTYPE(cx) == CXt_SUB &&
1989 cx->blk_sub.hasargs) { /* put @_ back onto stack */
1990 AV* av = cx->blk_sub.argarray;
1992 items = AvFILLp(av) + 1;
1994 EXTEND(PL_stack_sp, items); /* @_ could have been extended. */
1995 Copy(AvARRAY(av), PL_stack_sp, items, SV*);
1996 PL_stack_sp += items;
1998 SvREFCNT_dec(GvAV(PL_defgv));
1999 GvAV(PL_defgv) = cx->blk_sub.savearray;
2000 #endif /* USE_THREADS */
2003 AvREAL_off(av); /* so av_clear() won't clobber elts */
2007 else if (CvXSUB(cv)) { /* put GvAV(defgv) back onto stack */
2011 av = (AV*)PL_curpad[0];
2013 av = GvAV(PL_defgv);
2015 items = AvFILLp(av) + 1;
2017 EXTEND(PL_stack_sp, items); /* @_ could have been extended. */
2018 Copy(AvARRAY(av), PL_stack_sp, items, SV*);
2019 PL_stack_sp += items;
2021 if (CxTYPE(cx) == CXt_SUB &&
2022 !(CvDEPTH(cx->blk_sub.cv) = cx->blk_sub.olddepth))
2023 SvREFCNT_dec(cx->blk_sub.cv);
2024 oldsave = PL_scopestack[PL_scopestack_ix - 1];
2025 LEAVE_SCOPE(oldsave);
2027 /* Now do some callish stuff. */
2030 if (CvOLDSTYLE(cv)) {
2031 I32 (*fp3)_((int,int,int));
2036 fp3 = (I32(*)_((int,int,int)))CvXSUB(cv);
2037 items = (*fp3)(CvXSUBANY(cv).any_i32,
2038 mark - PL_stack_base + 1,
2040 SP = PL_stack_base + items;
2046 PL_stack_sp--; /* There is no cv arg. */
2047 /* Push a mark for the start of arglist */
2049 (void)(*CvXSUB(cv))(cv _PERL_OBJECT_THIS);
2050 /* Pop the current context like a decent sub should */
2051 POPBLOCK(cx, PL_curpm);
2052 /* Do _not_ use PUTBACK, keep the XSUB's return stack! */
2055 return pop_return();
2058 AV* padlist = CvPADLIST(cv);
2059 SV** svp = AvARRAY(padlist);
2060 if (CxTYPE(cx) == CXt_EVAL) {
2061 PL_in_eval = cx->blk_eval.old_in_eval;
2062 PL_eval_root = cx->blk_eval.old_eval_root;
2063 cx->cx_type = CXt_SUB;
2064 cx->blk_sub.hasargs = 0;
2066 cx->blk_sub.cv = cv;
2067 cx->blk_sub.olddepth = CvDEPTH(cv);
2069 if (CvDEPTH(cv) < 2)
2070 (void)SvREFCNT_inc(cv);
2071 else { /* save temporaries on recursion? */
2072 if (CvDEPTH(cv) == 100 && ckWARN(WARN_RECURSION))
2073 sub_crush_depth(cv);
2074 if (CvDEPTH(cv) > AvFILLp(padlist)) {
2075 AV *newpad = newAV();
2076 SV **oldpad = AvARRAY(svp[CvDEPTH(cv)-1]);
2077 I32 ix = AvFILLp((AV*)svp[1]);
2078 svp = AvARRAY(svp[0]);
2079 for ( ;ix > 0; ix--) {
2080 if (svp[ix] != &PL_sv_undef) {
2081 char *name = SvPVX(svp[ix]);
2082 if ((SvFLAGS(svp[ix]) & SVf_FAKE)
2085 /* outer lexical or anon code */
2086 av_store(newpad, ix,
2087 SvREFCNT_inc(oldpad[ix]) );
2089 else { /* our own lexical */
2091 av_store(newpad, ix, sv = (SV*)newAV());
2092 else if (*name == '%')
2093 av_store(newpad, ix, sv = (SV*)newHV());
2095 av_store(newpad, ix, sv = NEWSV(0,0));
2100 av_store(newpad, ix, sv = NEWSV(0,0));
2104 if (cx->blk_sub.hasargs) {
2107 av_store(newpad, 0, (SV*)av);
2108 AvFLAGS(av) = AVf_REIFY;
2110 av_store(padlist, CvDEPTH(cv), (SV*)newpad);
2111 AvFILLp(padlist) = CvDEPTH(cv);
2112 svp = AvARRAY(padlist);
2116 if (!cx->blk_sub.hasargs) {
2117 AV* av = (AV*)PL_curpad[0];
2119 items = AvFILLp(av) + 1;
2121 /* Mark is at the end of the stack. */
2123 Copy(AvARRAY(av), SP + 1, items, SV*);
2128 #endif /* USE_THREADS */
2129 SAVESPTR(PL_curpad);
2130 PL_curpad = AvARRAY((AV*)svp[CvDEPTH(cv)]);
2132 if (cx->blk_sub.hasargs)
2133 #endif /* USE_THREADS */
2135 AV* av = (AV*)PL_curpad[0];
2139 cx->blk_sub.savearray = GvAV(PL_defgv);
2140 GvAV(PL_defgv) = (AV*)SvREFCNT_inc(av);
2141 #endif /* USE_THREADS */
2142 cx->blk_sub.argarray = av;
2145 if (items >= AvMAX(av) + 1) {
2147 if (AvARRAY(av) != ary) {
2148 AvMAX(av) += AvARRAY(av) - AvALLOC(av);
2149 SvPVX(av) = (char*)ary;
2151 if (items >= AvMAX(av) + 1) {
2152 AvMAX(av) = items - 1;
2153 Renew(ary,items+1,SV*);
2155 SvPVX(av) = (char*)ary;
2158 Copy(mark,AvARRAY(av),items,SV*);
2159 AvFILLp(av) = items - 1;
2160 /* preserve @_ nature */
2171 if (PERLDB_SUB) { /* Checking curstash breaks DProf. */
2173 * We do not care about using sv to call CV;
2174 * it's for informational purposes only.
2176 SV *sv = GvSV(PL_DBsub);
2179 if (PERLDB_SUB_NN) {
2180 SvIVX(sv) = (IV)cv; /* Already upgraded, saved */
2183 gv_efullname3(sv, CvGV(cv), Nullch);
2186 && (gotocv = perl_get_cv("DB::goto", FALSE)) ) {
2187 PUSHMARK( PL_stack_sp );
2188 perl_call_sv((SV*)gotocv, G_SCALAR | G_NODEBUG);
2192 RETURNOP(CvSTART(cv));
2196 label = SvPV(sv,n_a);
2198 else if (PL_op->op_flags & OPf_SPECIAL) {
2200 DIE("goto must have label");
2203 label = cPVOP->op_pv;
2205 if (label && *label) {
2210 PL_lastgotoprobe = 0;
2212 for (ix = cxstack_ix; ix >= 0; ix--) {
2214 switch (CxTYPE(cx)) {
2216 gotoprobe = PL_eval_root; /* XXX not good for nested eval */
2219 gotoprobe = cx->blk_oldcop->op_sibling;
2225 gotoprobe = cx->blk_oldcop->op_sibling;
2227 gotoprobe = PL_main_root;
2230 if (CvDEPTH(cx->blk_sub.cv)) {
2231 gotoprobe = CvROOT(cx->blk_sub.cv);
2236 DIE("Can't \"goto\" outside a block");
2240 gotoprobe = PL_main_root;
2243 retop = dofindlabel(gotoprobe, label,
2244 enterops, enterops + GOTO_DEPTH);
2247 PL_lastgotoprobe = gotoprobe;
2250 DIE("Can't find label %s", label);
2252 /* pop unwanted frames */
2254 if (ix < cxstack_ix) {
2261 oldsave = PL_scopestack[PL_scopestack_ix];
2262 LEAVE_SCOPE(oldsave);
2265 /* push wanted frames */
2267 if (*enterops && enterops[1]) {
2269 for (ix = 1; enterops[ix]; ix++) {
2270 PL_op = enterops[ix];
2271 /* Eventually we may want to stack the needed arguments
2272 * for each op. For now, we punt on the hard ones. */
2273 if (PL_op->op_type == OP_ENTERITER)
2274 DIE("Can't \"goto\" into the middle of a foreach loop",
2276 (CALLOP->op_ppaddr)(ARGS);
2284 if (!retop) retop = PL_main_start;
2286 PL_restartop = retop;
2287 PL_do_undump = TRUE;
2291 PL_restartop = 0; /* hmm, must be GNU unexec().. */
2292 PL_do_undump = FALSE;
2308 if (anum == 1 && VMSISH_EXIT)
2313 PUSHs(&PL_sv_undef);
2321 double value = SvNVx(GvSV(cCOP->cop_gv));
2322 register I32 match = I_32(value);
2325 if (((double)match) > value)
2326 --match; /* was fractional--truncate other way */
2328 match -= cCOP->uop.scop.scop_offset;
2331 else if (match > cCOP->uop.scop.scop_max)
2332 match = cCOP->uop.scop.scop_max;
2333 PL_op = cCOP->uop.scop.scop_next[match];
2343 PL_op = PL_op->op_next; /* can't assume anything */
2346 match = *(SvPVx(GvSV(cCOP->cop_gv), n_a)) & 255;
2347 match -= cCOP->uop.scop.scop_offset;
2350 else if (match > cCOP->uop.scop.scop_max)
2351 match = cCOP->uop.scop.scop_max;
2352 PL_op = cCOP->uop.scop.scop_next[match];
2361 save_lines(AV *array, SV *sv)
2363 register char *s = SvPVX(sv);
2364 register char *send = SvPVX(sv) + SvCUR(sv);
2366 register I32 line = 1;
2368 while (s && s < send) {
2369 SV *tmpstr = NEWSV(85,0);
2371 sv_upgrade(tmpstr, SVt_PVMG);
2372 t = strchr(s, '\n');
2378 sv_setpvn(tmpstr, s, t - s);
2379 av_store(array, line++, tmpstr);
2394 assert(CATCH_GET == TRUE);
2395 DEBUG_l(deb("Setting up local jumplevel %p, was %p\n", &cur_env, PL_top_env));
2399 default: /* topmost level handles it */
2408 PL_op = PL_restartop;
2421 sv_compile_2op(SV *sv, OP** startop, char *code, AV** avp)
2422 /* sv Text to convert to OP tree. */
2423 /* startop op_free() this to undo. */
2424 /* code Short string id of the caller. */
2426 dSP; /* Make POPBLOCK work. */
2429 I32 gimme = 0; /* SUSPECT - INITIALZE TO WHAT? NI-S */
2432 OP *oop = PL_op, *rop;
2433 char tmpbuf[TYPE_DIGITS(long) + 12 + 10];
2439 /* switch to eval mode */
2441 if (PL_curcop == &PL_compiling) {
2442 SAVESPTR(PL_compiling.cop_stash);
2443 PL_compiling.cop_stash = PL_curstash;
2445 SAVESPTR(PL_compiling.cop_filegv);
2446 SAVEI16(PL_compiling.cop_line);
2447 sprintf(tmpbuf, "_<(%.10s_eval %lu)", code, (unsigned long)++PL_evalseq);
2448 PL_compiling.cop_filegv = gv_fetchfile(tmpbuf+2);
2449 PL_compiling.cop_line = 1;
2450 /* XXX For C<eval "...">s within BEGIN {} blocks, this ends up
2451 deleting the eval's FILEGV from the stash before gv_check() runs
2452 (i.e. before run-time proper). To work around the coredump that
2453 ensues, we always turn GvMULTI_on for any globals that were
2454 introduced within evals. See force_ident(). GSAR 96-10-12 */
2455 safestr = savepv(tmpbuf);
2456 SAVEDELETE(PL_defstash, safestr, strlen(safestr));
2458 #ifdef OP_IN_REGISTER
2466 PL_op->op_type = OP_ENTEREVAL;
2467 PL_op->op_flags = 0; /* Avoid uninit warning. */
2468 PUSHBLOCK(cx, CXt_EVAL, SP);
2469 PUSHEVAL(cx, 0, PL_compiling.cop_filegv);
2470 rop = doeval(G_SCALAR, startop);
2471 POPBLOCK(cx,PL_curpm);
2474 (*startop)->op_type = OP_NULL;
2475 (*startop)->op_ppaddr = PL_ppaddr[OP_NULL];
2477 *avp = (AV*)SvREFCNT_inc(PL_comppad);
2479 if (PL_curcop == &PL_compiling)
2480 PL_compiling.op_private = PL_hints;
2481 #ifdef OP_IN_REGISTER
2487 /* With USE_THREADS, eval_owner must be held on entry to doeval */
2489 doeval(int gimme, OP** startop)
2502 /* set up a scratch pad */
2505 SAVESPTR(PL_curpad);
2506 SAVESPTR(PL_comppad);
2507 SAVESPTR(PL_comppad_name);
2508 SAVEI32(PL_comppad_name_fill);
2509 SAVEI32(PL_min_intro_pending);
2510 SAVEI32(PL_max_intro_pending);
2513 for (i = cxstack_ix - 1; i >= 0; i--) {
2514 PERL_CONTEXT *cx = &cxstack[i];
2515 if (CxTYPE(cx) == CXt_EVAL)
2517 else if (CxTYPE(cx) == CXt_SUB) {
2518 caller = cx->blk_sub.cv;
2523 SAVESPTR(PL_compcv);
2524 PL_compcv = (CV*)NEWSV(1104,0);
2525 sv_upgrade((SV *)PL_compcv, SVt_PVCV);
2526 CvUNIQUE_on(PL_compcv);
2528 CvOWNER(PL_compcv) = 0;
2529 New(666, CvMUTEXP(PL_compcv), 1, perl_mutex);
2530 MUTEX_INIT(CvMUTEXP(PL_compcv));
2531 #endif /* USE_THREADS */
2533 PL_comppad = newAV();
2534 av_push(PL_comppad, Nullsv);
2535 PL_curpad = AvARRAY(PL_comppad);
2536 PL_comppad_name = newAV();
2537 PL_comppad_name_fill = 0;
2538 PL_min_intro_pending = 0;
2541 av_store(PL_comppad_name, 0, newSVpv("@_", 2));
2542 PL_curpad[0] = (SV*)newAV();
2543 SvPADMY_on(PL_curpad[0]); /* XXX Needed? */
2544 #endif /* USE_THREADS */
2546 comppadlist = newAV();
2547 AvREAL_off(comppadlist);
2548 av_store(comppadlist, 0, (SV*)PL_comppad_name);
2549 av_store(comppadlist, 1, (SV*)PL_comppad);
2550 CvPADLIST(PL_compcv) = comppadlist;
2552 if (!saveop || saveop->op_type != OP_REQUIRE)
2553 CvOUTSIDE(PL_compcv) = (CV*)SvREFCNT_inc(caller);
2555 SAVEFREESV(PL_compcv);
2557 /* make sure we compile in the right package */
2559 newstash = PL_curcop->cop_stash;
2560 if (PL_curstash != newstash) {
2561 SAVESPTR(PL_curstash);
2562 PL_curstash = newstash;
2564 SAVESPTR(PL_beginav);
2565 PL_beginav = newAV();
2566 SAVEFREESV(PL_beginav);
2568 /* try to compile it */
2570 PL_eval_root = Nullop;
2572 PL_curcop = &PL_compiling;
2573 PL_curcop->cop_arybase = 0;
2574 SvREFCNT_dec(PL_rs);
2575 PL_rs = newSVpv("\n", 1);
2576 if (saveop && saveop->op_flags & OPf_SPECIAL)
2580 if (yyparse() || PL_error_count || !PL_eval_root) {
2584 I32 optype = 0; /* Might be reset by POPEVAL. */
2589 op_free(PL_eval_root);
2590 PL_eval_root = Nullop;
2592 SP = PL_stack_base + POPMARK; /* pop original mark */
2594 POPBLOCK(cx,PL_curpm);
2600 if (optype == OP_REQUIRE) {
2601 char* msg = SvPVx(ERRSV, n_a);
2602 DIE("%s", *msg ? msg : "Compilation failed in require");
2603 } else if (startop) {
2604 char* msg = SvPVx(ERRSV, n_a);
2606 POPBLOCK(cx,PL_curpm);
2608 croak("%sCompilation failed in regexp", (*msg ? msg : "Unknown error\n"));
2610 SvREFCNT_dec(PL_rs);
2611 PL_rs = SvREFCNT_inc(PL_nrs);
2613 MUTEX_LOCK(&PL_eval_mutex);
2615 COND_SIGNAL(&PL_eval_cond);
2616 MUTEX_UNLOCK(&PL_eval_mutex);
2617 #endif /* USE_THREADS */
2620 SvREFCNT_dec(PL_rs);
2621 PL_rs = SvREFCNT_inc(PL_nrs);
2622 PL_compiling.cop_line = 0;
2624 *startop = PL_eval_root;
2625 SvREFCNT_dec(CvOUTSIDE(PL_compcv));
2626 CvOUTSIDE(PL_compcv) = Nullcv;
2628 SAVEFREEOP(PL_eval_root);
2630 scalarvoid(PL_eval_root);
2631 else if (gimme & G_ARRAY)
2634 scalar(PL_eval_root);
2636 DEBUG_x(dump_eval());
2638 /* Register with debugger: */
2639 if (PERLDB_INTER && saveop->op_type == OP_REQUIRE) {
2640 CV *cv = perl_get_cv("DB::postponed", FALSE);
2644 XPUSHs((SV*)PL_compiling.cop_filegv);
2646 perl_call_sv((SV*)cv, G_DISCARD);
2650 /* compiled okay, so do it */
2652 CvDEPTH(PL_compcv) = 1;
2653 SP = PL_stack_base + POPMARK; /* pop original mark */
2654 PL_op = saveop; /* The caller may need it. */
2656 MUTEX_LOCK(&PL_eval_mutex);
2658 COND_SIGNAL(&PL_eval_cond);
2659 MUTEX_UNLOCK(&PL_eval_mutex);
2660 #endif /* USE_THREADS */
2662 RETURNOP(PL_eval_start);
2668 register PERL_CONTEXT *cx;
2673 SV *namesv = Nullsv;
2675 I32 gimme = G_SCALAR;
2676 PerlIO *tryrsfp = 0;
2680 if (SvNIOKp(sv) && !SvPOKp(sv)) {
2681 SET_NUMERIC_STANDARD();
2682 if (atof(PL_patchlevel) + 0.00000999 < SvNV(sv))
2683 DIE("Perl %s required--this is only version %s, stopped",
2684 SvPV(sv,n_a),PL_patchlevel);
2687 name = SvPV(sv, len);
2688 if (!(name && len > 0 && *name))
2689 DIE("Null filename used");
2690 TAINT_PROPER("require");
2691 if (PL_op->op_type == OP_REQUIRE &&
2692 (svp = hv_fetch(GvHVn(PL_incgv), name, len, 0)) &&
2693 *svp != &PL_sv_undef)
2696 /* prepare to compile file */
2701 (name[1] == '.' && name[2] == '/')))
2703 || (name[0] && name[1] == ':')
2706 || (name[0] == '\\' && name[1] == '\\') /* UNC path */
2709 || (strchr(name,':') || ((*name == '[' || *name == '<') &&
2710 (isALNUM(name[1]) || strchr("$-_]>",name[1]))))
2715 tryrsfp = PerlIO_open(name,PERL_SCRIPT_MODE);
2718 AV *ar = GvAVn(PL_incgv);
2722 if ((unixname = tounixspec(name, Nullch)) != Nullch)
2725 namesv = NEWSV(806, 0);
2726 for (i = 0; i <= AvFILL(ar); i++) {
2727 char *dir = SvPVx(*av_fetch(ar, i, TRUE), n_a);
2730 if ((unixdir = tounixpath(dir, Nullch)) == Nullch)
2732 sv_setpv(namesv, unixdir);
2733 sv_catpv(namesv, unixname);
2735 sv_setpvf(namesv, "%s/%s", dir, name);
2737 TAINT_PROPER("require");
2738 tryname = SvPVX(namesv);
2739 tryrsfp = PerlIO_open(tryname, PERL_SCRIPT_MODE);
2741 if (tryname[0] == '.' && tryname[1] == '/')
2748 SAVESPTR(PL_compiling.cop_filegv);
2749 PL_compiling.cop_filegv = gv_fetchfile(tryrsfp ? tryname : name);
2750 SvREFCNT_dec(namesv);
2752 if (PL_op->op_type == OP_REQUIRE) {
2753 SV *msg = sv_2mortal(newSVpvf("Can't locate %s in @INC", name));
2754 SV *dirmsgsv = NEWSV(0, 0);
2755 AV *ar = GvAVn(PL_incgv);
2757 if (instr(SvPVX(msg), ".h "))
2758 sv_catpv(msg, " (change .h to .ph maybe?)");
2759 if (instr(SvPVX(msg), ".ph "))
2760 sv_catpv(msg, " (did you run h2ph?)");
2761 sv_catpv(msg, " (@INC contains:");
2762 for (i = 0; i <= AvFILL(ar); i++) {
2763 char *dir = SvPVx(*av_fetch(ar, i, TRUE), n_a);
2764 sv_setpvf(dirmsgsv, " %s", dir);
2765 sv_catsv(msg, dirmsgsv);
2767 sv_catpvn(msg, ")", 1);
2768 SvREFCNT_dec(dirmsgsv);
2775 SETERRNO(0, SS$_NORMAL);
2777 /* Assume success here to prevent recursive requirement. */
2778 (void)hv_store(GvHVn(PL_incgv), name, strlen(name),
2779 newSVsv(GvSV(PL_compiling.cop_filegv)), 0 );
2783 lex_start(sv_2mortal(newSVpv("",0)));
2784 SAVEGENERICSV(PL_rsfp_filters);
2785 PL_rsfp_filters = Nullav;
2788 name = savepv(name);
2792 SAVEPPTR(PL_compiling.cop_warnings);
2793 PL_compiling.cop_warnings = ((PL_dowarn & G_WARN_ALL_ON) ? WARN_ALL
2796 /* switch to eval mode */
2798 push_return(PL_op->op_next);
2799 PUSHBLOCK(cx, CXt_EVAL, SP);
2800 PUSHEVAL(cx, name, PL_compiling.cop_filegv);
2802 SAVEI16(PL_compiling.cop_line);
2803 PL_compiling.cop_line = 0;
2807 MUTEX_LOCK(&PL_eval_mutex);
2808 if (PL_eval_owner && PL_eval_owner != thr)
2809 while (PL_eval_owner)
2810 COND_WAIT(&PL_eval_cond, &PL_eval_mutex);
2811 PL_eval_owner = thr;
2812 MUTEX_UNLOCK(&PL_eval_mutex);
2813 #endif /* USE_THREADS */
2814 return DOCATCH(doeval(G_SCALAR, NULL));
2819 return pp_require(ARGS);
2825 register PERL_CONTEXT *cx;
2827 I32 gimme = GIMME_V, was = PL_sub_generation;
2828 char tmpbuf[TYPE_DIGITS(long) + 12];
2833 if (!SvPV(sv,len) || !len)
2835 TAINT_PROPER("eval");
2841 /* switch to eval mode */
2843 SAVESPTR(PL_compiling.cop_filegv);
2844 sprintf(tmpbuf, "_<(eval %lu)", (unsigned long)++PL_evalseq);
2845 PL_compiling.cop_filegv = gv_fetchfile(tmpbuf+2);
2846 PL_compiling.cop_line = 1;
2847 /* XXX For C<eval "...">s within BEGIN {} blocks, this ends up
2848 deleting the eval's FILEGV from the stash before gv_check() runs
2849 (i.e. before run-time proper). To work around the coredump that
2850 ensues, we always turn GvMULTI_on for any globals that were
2851 introduced within evals. See force_ident(). GSAR 96-10-12 */
2852 safestr = savepv(tmpbuf);
2853 SAVEDELETE(PL_defstash, safestr, strlen(safestr));
2855 PL_hints = PL_op->op_targ;
2856 SAVEPPTR(PL_compiling.cop_warnings);
2857 if (PL_compiling.cop_warnings != WARN_ALL
2858 && PL_compiling.cop_warnings != WARN_NONE){
2859 PL_compiling.cop_warnings = newSVsv(PL_compiling.cop_warnings) ;
2860 SAVEFREESV(PL_compiling.cop_warnings) ;
2863 push_return(PL_op->op_next);
2864 PUSHBLOCK(cx, (CXt_EVAL|CXp_REAL), SP);
2865 PUSHEVAL(cx, 0, PL_compiling.cop_filegv);
2867 /* prepare to compile string */
2869 if (PERLDB_LINE && PL_curstash != PL_debstash)
2870 save_lines(GvAV(PL_compiling.cop_filegv), PL_linestr);
2873 MUTEX_LOCK(&PL_eval_mutex);
2874 if (PL_eval_owner && PL_eval_owner != thr)
2875 while (PL_eval_owner)
2876 COND_WAIT(&PL_eval_cond, &PL_eval_mutex);
2877 PL_eval_owner = thr;
2878 MUTEX_UNLOCK(&PL_eval_mutex);
2879 #endif /* USE_THREADS */
2880 ret = doeval(gimme, NULL);
2881 if (PERLDB_INTER && was != PL_sub_generation /* Some subs defined here. */
2882 && ret != PL_op->op_next) { /* Successive compilation. */
2883 strcpy(safestr, "_<(eval )"); /* Anything fake and short. */
2885 return DOCATCH(ret);
2895 register PERL_CONTEXT *cx;
2897 U8 save_flags = PL_op -> op_flags;
2902 retop = pop_return();
2905 if (gimme == G_VOID)
2907 else if (gimme == G_SCALAR) {
2910 if (SvFLAGS(TOPs) & SVs_TEMP)
2913 *MARK = sv_mortalcopy(TOPs);
2917 *MARK = &PL_sv_undef;
2921 /* in case LEAVE wipes old return values */
2922 for (mark = newsp + 1; mark <= SP; mark++) {
2923 if (!(SvFLAGS(*mark) & SVs_TEMP)) {
2924 *mark = sv_mortalcopy(*mark);
2925 TAINT_NOT; /* Each item is independent */
2929 PL_curpm = newpm; /* Don't pop $1 et al till now */
2932 * Closures mentioned at top level of eval cannot be referenced
2933 * again, and their presence indirectly causes a memory leak.
2934 * (Note that the fact that compcv and friends are still set here
2935 * is, AFAIK, an accident.) --Chip
2937 if (AvFILLp(PL_comppad_name) >= 0) {
2938 SV **svp = AvARRAY(PL_comppad_name);
2940 for (ix = AvFILLp(PL_comppad_name); ix >= 0; ix--) {
2942 if (sv && sv != &PL_sv_undef && *SvPVX(sv) == '&') {
2944 svp[ix] = &PL_sv_undef;
2948 SvREFCNT_dec(CvOUTSIDE(sv));
2949 CvOUTSIDE(sv) = Nullcv;
2962 assert(CvDEPTH(PL_compcv) == 1);
2964 CvDEPTH(PL_compcv) = 0;
2967 if (optype == OP_REQUIRE &&
2968 !(gimme == G_SCALAR ? SvTRUE(*SP) : SP > newsp))
2970 /* Unassume the success we assumed earlier. */
2971 char *name = cx->blk_eval.old_name;
2972 (void)hv_delete(GvHVn(PL_incgv), name, strlen(name), G_DISCARD);
2973 retop = die("%s did not return a true value", name);
2974 /* die_where() did LEAVE, or we won't be here */
2978 if (!(save_flags & OPf_SPECIAL))
2988 register PERL_CONTEXT *cx;
2989 I32 gimme = GIMME_V;
2994 push_return(cLOGOP->op_other->op_next);
2995 PUSHBLOCK(cx, CXt_EVAL, SP);
2997 PL_eval_root = PL_op; /* Only needed so that goto works right. */
3002 return DOCATCH(PL_op->op_next);
3012 register PERL_CONTEXT *cx;
3020 if (gimme == G_VOID)
3022 else if (gimme == G_SCALAR) {
3025 if (SvFLAGS(TOPs) & (SVs_PADTMP|SVs_TEMP))
3028 *MARK = sv_mortalcopy(TOPs);
3032 *MARK = &PL_sv_undef;
3037 /* in case LEAVE wipes old return values */
3038 for (mark = newsp + 1; mark <= SP; mark++) {
3039 if (!(SvFLAGS(*mark) & (SVs_PADTMP|SVs_TEMP))) {
3040 *mark = sv_mortalcopy(*mark);
3041 TAINT_NOT; /* Each item is independent */
3045 PL_curpm = newpm; /* Don't pop $1 et al till now */
3056 register char *s = SvPV_force(sv, len);
3057 register char *send = s + len;
3058 register char *base;
3059 register I32 skipspaces = 0;
3062 bool postspace = FALSE;
3070 croak("Null picture in formline");
3072 New(804, fops, (send - s)*3+10, U16); /* Almost certainly too long... */
3077 *fpc++ = FF_LINEMARK;
3078 noblank = repeat = FALSE;
3096 case ' ': case '\t':
3107 *fpc++ = FF_LITERAL;
3115 *fpc++ = skipspaces;
3119 *fpc++ = FF_NEWLINE;
3123 arg = fpc - linepc + 1;
3130 *fpc++ = FF_LINEMARK;
3131 noblank = repeat = FALSE;
3140 ischop = s[-1] == '^';
3146 arg = (s - base) - 1;
3148 *fpc++ = FF_LITERAL;
3157 *fpc++ = FF_LINEGLOB;
3159 else if (*s == '#' || (*s == '.' && s[1] == '#')) {
3160 arg = ischop ? 512 : 0;
3170 arg |= 256 + (s - f);
3172 *fpc++ = s - base; /* fieldsize for FETCH */
3173 *fpc++ = FF_DECIMAL;
3178 bool ismore = FALSE;
3181 while (*++s == '>') ;
3182 prespace = FF_SPACE;
3184 else if (*s == '|') {
3185 while (*++s == '|') ;
3186 prespace = FF_HALFSPACE;
3191 while (*++s == '<') ;
3194 if (*s == '.' && s[1] == '.' && s[2] == '.') {
3198 *fpc++ = s - base; /* fieldsize for FETCH */
3200 *fpc++ = ischop ? FF_CHECKCHOP : FF_CHECKNL;
3218 { /* need to jump to the next word */
3220 z = WORD_ALIGN - SvCUR(sv) % WORD_ALIGN;
3221 SvGROW(sv, SvCUR(sv) + z + arg * sizeof(U16) + 4);
3222 s = SvPVX(sv) + SvCUR(sv) + z;
3224 Copy(fops, s, arg, U16);
3226 sv_magic(sv, Nullsv, 'f', Nullch, 0);
3231 * The rest of this file was derived from source code contributed
3234 * NOTE: this code was derived from Tom Horsley's qsort replacement
3235 * and should not be confused with the original code.
3238 /* Copyright (C) Tom Horsley, 1997. All rights reserved.
3240 Permission granted to distribute under the same terms as perl which are
3243 This program is free software; you can redistribute it and/or modify
3244 it under the terms of either:
3246 a) the GNU General Public License as published by the Free
3247 Software Foundation; either version 1, or (at your option) any
3250 b) the "Artistic License" which comes with this Kit.
3252 Details on the perl license can be found in the perl source code which
3253 may be located via the www.perl.com web page.
3255 This is the most wonderfulest possible qsort I can come up with (and
3256 still be mostly portable) My (limited) tests indicate it consistently
3257 does about 20% fewer calls to compare than does the qsort in the Visual
3258 C++ library, other vendors may vary.
3260 Some of the ideas in here can be found in "Algorithms" by Sedgewick,
3261 others I invented myself (or more likely re-invented since they seemed
3262 pretty obvious once I watched the algorithm operate for a while).
3264 Most of this code was written while watching the Marlins sweep the Giants
3265 in the 1997 National League Playoffs - no Braves fans allowed to use this
3266 code (just kidding :-).
3268 I realize that if I wanted to be true to the perl tradition, the only
3269 comment in this file would be something like:
3271 ...they shuffled back towards the rear of the line. 'No, not at the
3272 rear!' the slave-driver shouted. 'Three files up. And stay there...
3274 However, I really needed to violate that tradition just so I could keep
3275 track of what happens myself, not to mention some poor fool trying to
3276 understand this years from now :-).
3279 /* ********************************************************** Configuration */
3281 #ifndef QSORT_ORDER_GUESS
3282 #define QSORT_ORDER_GUESS 2 /* Select doubling version of the netBSD trick */
3285 /* QSORT_MAX_STACK is the largest number of partitions that can be stacked up for
3286 future processing - a good max upper bound is log base 2 of memory size
3287 (32 on 32 bit machines, 64 on 64 bit machines, etc). In reality can
3288 safely be smaller than that since the program is taking up some space and
3289 most operating systems only let you grab some subset of contiguous
3290 memory (not to mention that you are normally sorting data larger than
3291 1 byte element size :-).
3293 #ifndef QSORT_MAX_STACK
3294 #define QSORT_MAX_STACK 32
3297 /* QSORT_BREAK_EVEN is the size of the largest partition we should insertion sort.
3298 Anything bigger and we use qsort. If you make this too small, the qsort
3299 will probably break (or become less efficient), because it doesn't expect
3300 the middle element of a partition to be the same as the right or left -
3301 you have been warned).
3303 #ifndef QSORT_BREAK_EVEN
3304 #define QSORT_BREAK_EVEN 6
3307 /* ************************************************************* Data Types */
3309 /* hold left and right index values of a partition waiting to be sorted (the
3310 partition includes both left and right - right is NOT one past the end or
3311 anything like that).
3313 struct partition_stack_entry {
3316 #ifdef QSORT_ORDER_GUESS
3317 int qsort_break_even;
3321 /* ******************************************************* Shorthand Macros */
3323 /* Note that these macros will be used from inside the qsort function where
3324 we happen to know that the variable 'elt_size' contains the size of an
3325 array element and the variable 'temp' points to enough space to hold a
3326 temp element and the variable 'array' points to the array being sorted
3327 and 'compare' is the pointer to the compare routine.
3329 Also note that there are very many highly architecture specific ways
3330 these might be sped up, but this is simply the most generally portable
3331 code I could think of.
3334 /* Return < 0 == 0 or > 0 as the value of elt1 is < elt2, == elt2, > elt2
3337 #define qsort_cmp(elt1, elt2) \
3338 ((this->*compare)(array[elt1], array[elt2]))
3340 #define qsort_cmp(elt1, elt2) \
3341 ((*compare)(array[elt1], array[elt2]))
3344 #ifdef QSORT_ORDER_GUESS
3345 #define QSORT_NOTICE_SWAP swapped++;
3347 #define QSORT_NOTICE_SWAP
3350 /* swaps contents of array elements elt1, elt2.
3352 #define qsort_swap(elt1, elt2) \
3355 temp = array[elt1]; \
3356 array[elt1] = array[elt2]; \
3357 array[elt2] = temp; \
3360 /* rotate contents of elt1, elt2, elt3 such that elt1 gets elt2, elt2 gets
3361 elt3 and elt3 gets elt1.
3363 #define qsort_rotate(elt1, elt2, elt3) \
3366 temp = array[elt1]; \
3367 array[elt1] = array[elt2]; \
3368 array[elt2] = array[elt3]; \
3369 array[elt3] = temp; \
3372 /* ************************************************************ Debug stuff */
3379 return; /* good place to set a breakpoint */
3382 #define qsort_assert(t) (void)( (t) || (break_here(), 0) )
3385 doqsort_all_asserts(
3389 int (*compare)(const void * elt1, const void * elt2),
3390 int pc_left, int pc_right, int u_left, int u_right)
3394 qsort_assert(pc_left <= pc_right);
3395 qsort_assert(u_right < pc_left);
3396 qsort_assert(pc_right < u_left);
3397 for (i = u_right + 1; i < pc_left; ++i) {
3398 qsort_assert(qsort_cmp(i, pc_left) < 0);
3400 for (i = pc_left; i < pc_right; ++i) {
3401 qsort_assert(qsort_cmp(i, pc_right) == 0);
3403 for (i = pc_right + 1; i < u_left; ++i) {
3404 qsort_assert(qsort_cmp(pc_right, i) < 0);
3408 #define qsort_all_asserts(PC_LEFT, PC_RIGHT, U_LEFT, U_RIGHT) \
3409 doqsort_all_asserts(array, num_elts, elt_size, compare, \
3410 PC_LEFT, PC_RIGHT, U_LEFT, U_RIGHT)
3414 #define qsort_assert(t) ((void)0)
3416 #define qsort_all_asserts(PC_LEFT, PC_RIGHT, U_LEFT, U_RIGHT) ((void)0)
3420 /* ****************************************************************** qsort */
3424 qsortsv(SV ** array, size_t num_elts, SVCOMPARE compare)
3429 I32 (*compare)(SV *a, SV *b))
3434 struct partition_stack_entry partition_stack[QSORT_MAX_STACK];
3435 int next_stack_entry = 0;
3439 #ifdef QSORT_ORDER_GUESS
3440 int qsort_break_even;
3444 /* Make sure we actually have work to do.
3446 if (num_elts <= 1) {
3450 /* Setup the initial partition definition and fall into the sorting loop
3453 part_right = (int)(num_elts - 1);
3454 #ifdef QSORT_ORDER_GUESS
3455 qsort_break_even = QSORT_BREAK_EVEN;
3457 #define qsort_break_even QSORT_BREAK_EVEN
3460 if ((part_right - part_left) >= qsort_break_even) {
3461 /* OK, this is gonna get hairy, so lets try to document all the
3462 concepts and abbreviations and variables and what they keep
3465 pc: pivot chunk - the set of array elements we accumulate in the
3466 middle of the partition, all equal in value to the original
3467 pivot element selected. The pc is defined by:
3469 pc_left - the leftmost array index of the pc
3470 pc_right - the rightmost array index of the pc
3472 we start with pc_left == pc_right and only one element
3473 in the pivot chunk (but it can grow during the scan).
3475 u: uncompared elements - the set of elements in the partition
3476 we have not yet compared to the pivot value. There are two
3477 uncompared sets during the scan - one to the left of the pc
3478 and one to the right.
3480 u_right - the rightmost index of the left side's uncompared set
3481 u_left - the leftmost index of the right side's uncompared set
3483 The leftmost index of the left sides's uncompared set
3484 doesn't need its own variable because it is always defined
3485 by the leftmost edge of the whole partition (part_left). The
3486 same goes for the rightmost edge of the right partition
3489 We know there are no uncompared elements on the left once we
3490 get u_right < part_left and no uncompared elements on the
3491 right once u_left > part_right. When both these conditions
3492 are met, we have completed the scan of the partition.
3494 Any elements which are between the pivot chunk and the
3495 uncompared elements should be less than the pivot value on
3496 the left side and greater than the pivot value on the right
3497 side (in fact, the goal of the whole algorithm is to arrange
3498 for that to be true and make the groups of less-than and
3499 greater-then elements into new partitions to sort again).
3501 As you marvel at the complexity of the code and wonder why it
3502 has to be so confusing. Consider some of the things this level
3503 of confusion brings:
3505 Once I do a compare, I squeeze every ounce of juice out of it. I
3506 never do compare calls I don't have to do, and I certainly never
3509 I also never swap any elements unless I can prove there is a
3510 good reason. Many sort algorithms will swap a known value with
3511 an uncompared value just to get things in the right place (or
3512 avoid complexity :-), but that uncompared value, once it gets
3513 compared, may then have to be swapped again. A lot of the
3514 complexity of this code is due to the fact that it never swaps
3515 anything except compared values, and it only swaps them when the
3516 compare shows they are out of position.
3518 int pc_left, pc_right;
3519 int u_right, u_left;
3523 pc_left = ((part_left + part_right) / 2);
3525 u_right = pc_left - 1;
3526 u_left = pc_right + 1;
3528 /* Qsort works best when the pivot value is also the median value
3529 in the partition (unfortunately you can't find the median value
3530 without first sorting :-), so to give the algorithm a helping
3531 hand, we pick 3 elements and sort them and use the median value
3532 of that tiny set as the pivot value.
3534 Some versions of qsort like to use the left middle and right as
3535 the 3 elements to sort so they can insure the ends of the
3536 partition will contain values which will stop the scan in the
3537 compare loop, but when you have to call an arbitrarily complex
3538 routine to do a compare, its really better to just keep track of
3539 array index values to know when you hit the edge of the
3540 partition and avoid the extra compare. An even better reason to
3541 avoid using a compare call is the fact that you can drop off the
3542 edge of the array if someone foolishly provides you with an
3543 unstable compare function that doesn't always provide consistent
3546 So, since it is simpler for us to compare the three adjacent
3547 elements in the middle of the partition, those are the ones we
3548 pick here (conveniently pointed at by u_right, pc_left, and
3549 u_left). The values of the left, center, and right elements
3550 are refered to as l c and r in the following comments.
3553 #ifdef QSORT_ORDER_GUESS
3556 s = qsort_cmp(u_right, pc_left);
3559 s = qsort_cmp(pc_left, u_left);
3560 /* if l < c, c < r - already in order - nothing to do */
3562 /* l < c, c == r - already in order, pc grows */
3564 qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
3566 /* l < c, c > r - need to know more */
3567 s = qsort_cmp(u_right, u_left);
3569 /* l < c, c > r, l < r - swap c & r to get ordered */
3570 qsort_swap(pc_left, u_left);
3571 qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
3572 } else if (s == 0) {
3573 /* l < c, c > r, l == r - swap c&r, grow pc */
3574 qsort_swap(pc_left, u_left);
3576 qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
3578 /* l < c, c > r, l > r - make lcr into rlc to get ordered */
3579 qsort_rotate(pc_left, u_right, u_left);
3580 qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
3583 } else if (s == 0) {
3585 s = qsort_cmp(pc_left, u_left);
3587 /* l == c, c < r - already in order, grow pc */
3589 qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
3590 } else if (s == 0) {
3591 /* l == c, c == r - already in order, grow pc both ways */
3594 qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
3596 /* l == c, c > r - swap l & r, grow pc */
3597 qsort_swap(u_right, u_left);
3599 qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
3603 s = qsort_cmp(pc_left, u_left);
3605 /* l > c, c < r - need to know more */
3606 s = qsort_cmp(u_right, u_left);
3608 /* l > c, c < r, l < r - swap l & c to get ordered */
3609 qsort_swap(u_right, pc_left);
3610 qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
3611 } else if (s == 0) {
3612 /* l > c, c < r, l == r - swap l & c, grow pc */
3613 qsort_swap(u_right, pc_left);
3615 qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
3617 /* l > c, c < r, l > r - rotate lcr into crl to order */
3618 qsort_rotate(u_right, pc_left, u_left);
3619 qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
3621 } else if (s == 0) {
3622 /* l > c, c == r - swap ends, grow pc */
3623 qsort_swap(u_right, u_left);
3625 qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
3627 /* l > c, c > r - swap ends to get in order */
3628 qsort_swap(u_right, u_left);
3629 qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
3632 /* We now know the 3 middle elements have been compared and
3633 arranged in the desired order, so we can shrink the uncompared
3638 qsort_all_asserts(pc_left, pc_right, u_left, u_right);
3640 /* The above massive nested if was the simple part :-). We now have
3641 the middle 3 elements ordered and we need to scan through the
3642 uncompared sets on either side, swapping elements that are on
3643 the wrong side or simply shuffling equal elements around to get
3644 all equal elements into the pivot chunk.
3648 int still_work_on_left;
3649 int still_work_on_right;
3651 /* Scan the uncompared values on the left. If I find a value
3652 equal to the pivot value, move it over so it is adjacent to
3653 the pivot chunk and expand the pivot chunk. If I find a value
3654 less than the pivot value, then just leave it - its already
3655 on the correct side of the partition. If I find a greater
3656 value, then stop the scan.
3658 while (still_work_on_left = (u_right >= part_left)) {
3659 s = qsort_cmp(u_right, pc_left);
3662 } else if (s == 0) {
3664 if (pc_left != u_right) {
3665 qsort_swap(u_right, pc_left);
3671 qsort_assert(u_right < pc_left);
3672 qsort_assert(pc_left <= pc_right);
3673 qsort_assert(qsort_cmp(u_right + 1, pc_left) <= 0);
3674 qsort_assert(qsort_cmp(pc_left, pc_right) == 0);
3677 /* Do a mirror image scan of uncompared values on the right
3679 while (still_work_on_right = (u_left <= part_right)) {
3680 s = qsort_cmp(pc_right, u_left);
3683 } else if (s == 0) {
3685 if (pc_right != u_left) {
3686 qsort_swap(pc_right, u_left);
3692 qsort_assert(u_left > pc_right);
3693 qsort_assert(pc_left <= pc_right);
3694 qsort_assert(qsort_cmp(pc_right, u_left - 1) <= 0);
3695 qsort_assert(qsort_cmp(pc_left, pc_right) == 0);
3698 if (still_work_on_left) {
3699 /* I know I have a value on the left side which needs to be
3700 on the right side, but I need to know more to decide
3701 exactly the best thing to do with it.
3703 if (still_work_on_right) {
3704 /* I know I have values on both side which are out of
3705 position. This is a big win because I kill two birds
3706 with one swap (so to speak). I can advance the
3707 uncompared pointers on both sides after swapping both
3708 of them into the right place.
3710 qsort_swap(u_right, u_left);
3713 qsort_all_asserts(pc_left, pc_right, u_left, u_right);
3715 /* I have an out of position value on the left, but the
3716 right is fully scanned, so I "slide" the pivot chunk
3717 and any less-than values left one to make room for the
3718 greater value over on the right. If the out of position
3719 value is immediately adjacent to the pivot chunk (there
3720 are no less-than values), I can do that with a swap,
3721 otherwise, I have to rotate one of the less than values
3722 into the former position of the out of position value
3723 and the right end of the pivot chunk into the left end
3727 if (pc_left == u_right) {
3728 qsort_swap(u_right, pc_right);
3729 qsort_all_asserts(pc_left, pc_right-1, u_left, u_right-1);
3731 qsort_rotate(u_right, pc_left, pc_right);
3732 qsort_all_asserts(pc_left, pc_right-1, u_left, u_right-1);
3737 } else if (still_work_on_right) {
3738 /* Mirror image of complex case above: I have an out of
3739 position value on the right, but the left is fully
3740 scanned, so I need to shuffle things around to make room
3741 for the right value on the left.
3744 if (pc_right == u_left) {
3745 qsort_swap(u_left, pc_left);
3746 qsort_all_asserts(pc_left+1, pc_right, u_left+1, u_right);
3748 qsort_rotate(pc_right, pc_left, u_left);
3749 qsort_all_asserts(pc_left+1, pc_right, u_left+1, u_right);
3754 /* No more scanning required on either side of partition,
3755 break out of loop and figure out next set of partitions
3761 /* The elements in the pivot chunk are now in the right place. They
3762 will never move or be compared again. All I have to do is decide
3763 what to do with the stuff to the left and right of the pivot
3766 Notes on the QSORT_ORDER_GUESS ifdef code:
3768 1. If I just built these partitions without swapping any (or
3769 very many) elements, there is a chance that the elements are
3770 already ordered properly (being properly ordered will
3771 certainly result in no swapping, but the converse can't be
3774 2. A (properly written) insertion sort will run faster on
3775 already ordered data than qsort will.
3777 3. Perhaps there is some way to make a good guess about
3778 switching to an insertion sort earlier than partition size 6
3779 (for instance - we could save the partition size on the stack
3780 and increase the size each time we find we didn't swap, thus
3781 switching to insertion sort earlier for partitions with a
3782 history of not swapping).
3784 4. Naturally, if I just switch right away, it will make
3785 artificial benchmarks with pure ascending (or descending)
3786 data look really good, but is that a good reason in general?
3790 #ifdef QSORT_ORDER_GUESS
3792 #if QSORT_ORDER_GUESS == 1
3793 qsort_break_even = (part_right - part_left) + 1;
3795 #if QSORT_ORDER_GUESS == 2
3796 qsort_break_even *= 2;
3798 #if QSORT_ORDER_GUESS == 3
3799 int prev_break = qsort_break_even;
3800 qsort_break_even *= qsort_break_even;
3801 if (qsort_break_even < prev_break) {
3802 qsort_break_even = (part_right - part_left) + 1;
3806 qsort_break_even = QSORT_BREAK_EVEN;
3810 if (part_left < pc_left) {
3811 /* There are elements on the left which need more processing.
3812 Check the right as well before deciding what to do.
3814 if (pc_right < part_right) {
3815 /* We have two partitions to be sorted. Stack the biggest one
3816 and process the smallest one on the next iteration. This
3817 minimizes the stack height by insuring that any additional
3818 stack entries must come from the smallest partition which
3819 (because it is smallest) will have the fewest
3820 opportunities to generate additional stack entries.
3822 if ((part_right - pc_right) > (pc_left - part_left)) {
3823 /* stack the right partition, process the left */
3824 partition_stack[next_stack_entry].left = pc_right + 1;
3825 partition_stack[next_stack_entry].right = part_right;
3826 #ifdef QSORT_ORDER_GUESS
3827 partition_stack[next_stack_entry].qsort_break_even = qsort_break_even;
3829 part_right = pc_left - 1;
3831 /* stack the left partition, process the right */
3832 partition_stack[next_stack_entry].left = part_left;
3833 partition_stack[next_stack_entry].right = pc_left - 1;
3834 #ifdef QSORT_ORDER_GUESS
3835 partition_stack[next_stack_entry].qsort_break_even = qsort_break_even;
3837 part_left = pc_right + 1;
3839 qsort_assert(next_stack_entry < QSORT_MAX_STACK);
3842 /* The elements on the left are the only remaining elements
3843 that need sorting, arrange for them to be processed as the
3846 part_right = pc_left - 1;
3848 } else if (pc_right < part_right) {
3849 /* There is only one chunk on the right to be sorted, make it
3850 the new partition and loop back around.
3852 part_left = pc_right + 1;
3854 /* This whole partition wound up in the pivot chunk, so
3855 we need to get a new partition off the stack.
3857 if (next_stack_entry == 0) {
3858 /* the stack is empty - we are done */
3862 part_left = partition_stack[next_stack_entry].left;
3863 part_right = partition_stack[next_stack_entry].right;
3864 #ifdef QSORT_ORDER_GUESS
3865 qsort_break_even = partition_stack[next_stack_entry].qsort_break_even;
3869 /* This partition is too small to fool with qsort complexity, just
3870 do an ordinary insertion sort to minimize overhead.
3873 /* Assume 1st element is in right place already, and start checking
3874 at 2nd element to see where it should be inserted.
3876 for (i = part_left + 1; i <= part_right; ++i) {
3878 /* Scan (backwards - just in case 'i' is already in right place)
3879 through the elements already sorted to see if the ith element
3880 belongs ahead of one of them.
3882 for (j = i - 1; j >= part_left; --j) {
3883 if (qsort_cmp(i, j) >= 0) {
3884 /* i belongs right after j
3891 /* Looks like we really need to move some things
3895 for (k = i - 1; k >= j; --k)
3896 array[k + 1] = array[k];
3901 /* That partition is now sorted, grab the next one, or get out
3902 of the loop if there aren't any more.
3905 if (next_stack_entry == 0) {
3906 /* the stack is empty - we are done */
3910 part_left = partition_stack[next_stack_entry].left;
3911 part_right = partition_stack[next_stack_entry].right;
3912 #ifdef QSORT_ORDER_GUESS
3913 qsort_break_even = partition_stack[next_stack_entry].qsort_break_even;
3918 /* Believe it or not, the array is sorted at this point! */