This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Use Pid_t.
[perl5.git] / pp_ctl.c
CommitLineData
a0d0e21e
LW
1/* pp_ctl.c
2 *
4eb8286e 3 * Copyright (c) 1991-1999, Larry Wall
a0d0e21e
LW
4 *
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.
7 *
8 */
9
10/*
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.
17 */
18
19#include "EXTERN.h"
864dbfa3 20#define PERL_IN_PP_CTL_C
a0d0e21e
LW
21#include "perl.h"
22
23#ifndef WORD_ALIGN
24#define WORD_ALIGN sizeof(U16)
25#endif
26
54310121 27#define DOCATCH(o) ((CATCH_GET == TRUE) ? docatch(o) : (o))
1e422769 28
76e3520e 29#ifdef PERL_OBJECT
4c2891ed 30#define CALLOP this->*PL_op
76e3520e 31#else
533c011a 32#define CALLOP *PL_op
76e3520e 33#endif
a0d0e21e 34
51371543
GS
35static I32 sortcv(pTHXo_ SV *a, SV *b);
36static I32 sv_ncmp(pTHXo_ SV *a, SV *b);
37static I32 sv_i_ncmp(pTHXo_ SV *a, SV *b);
38static I32 amagic_ncmp(pTHXo_ SV *a, SV *b);
39static I32 amagic_i_ncmp(pTHXo_ SV *a, SV *b);
40static I32 amagic_cmp(pTHXo_ SV *a, SV *b);
41static I32 amagic_cmp_locale(pTHXo_ SV *a, SV *b);
bbed91b5
KF
42static I32 run_user_filter(pTHXo_ int idx, SV *buf_sv, int maxlen);
43
e7513ba0 44#ifdef PERL_OBJECT
51371543
GS
45static I32 sv_cmp_static(pTHXo_ SV *a, SV *b);
46static I32 sv_cmp_locale_static(pTHXo_ SV *a, SV *b);
e7513ba0
GS
47#else
48#define sv_cmp_static Perl_sv_cmp
49#define sv_cmp_locale_static Perl_sv_cmp_locale
50#endif
51371543 51
a0d0e21e
LW
52PP(pp_wantarray)
53{
4e35701f 54 djSP;
a0d0e21e
LW
55 I32 cxix;
56 EXTEND(SP, 1);
57
58 cxix = dopoptosub(cxstack_ix);
59 if (cxix < 0)
60 RETPUSHUNDEF;
61
54310121 62 switch (cxstack[cxix].blk_gimme) {
63 case G_ARRAY:
a0d0e21e 64 RETPUSHYES;
54310121 65 case G_SCALAR:
a0d0e21e 66 RETPUSHNO;
54310121 67 default:
68 RETPUSHUNDEF;
69 }
a0d0e21e
LW
70}
71
72PP(pp_regcmaybe)
73{
74 return NORMAL;
75}
76
2cd61cdb
IZ
77PP(pp_regcreset)
78{
79 /* XXXX Should store the old value to allow for tie/overload - and
80 restore in regcomp, where marked with XXXX. */
3280af22 81 PL_reginterp_cnt = 0;
2cd61cdb
IZ
82 return NORMAL;
83}
84
b3eb6a9b
GS
85PP(pp_regcomp)
86{
4e35701f 87 djSP;
a0d0e21e
LW
88 register PMOP *pm = (PMOP*)cLOGOP->op_other;
89 register char *t;
90 SV *tmpstr;
91 STRLEN len;
c277df42 92 MAGIC *mg = Null(MAGIC*);
a0d0e21e
LW
93
94 tmpstr = POPs;
b3eb6a9b 95 if (SvROK(tmpstr)) {
227a8b4b 96 SV *sv = SvRV(tmpstr);
c277df42
IZ
97 if(SvMAGICAL(sv))
98 mg = mg_find(sv, 'r');
99 }
b3eb6a9b 100 if (mg) {
c277df42
IZ
101 regexp *re = (regexp *)mg->mg_obj;
102 ReREFCNT_dec(pm->op_pmregexp);
103 pm->op_pmregexp = ReREFCNT_inc(re);
104 }
105 else {
106 t = SvPV(tmpstr, len);
107
20408e3c 108 /* Check against the last compiled regexp. */
85aff577 109 if (!pm->op_pmregexp || !pm->op_pmregexp->precomp ||
20408e3c
GS
110 pm->op_pmregexp->prelen != len ||
111 memNE(pm->op_pmregexp->precomp, t, len))
85aff577 112 {
c277df42
IZ
113 if (pm->op_pmregexp) {
114 ReREFCNT_dec(pm->op_pmregexp);
115 pm->op_pmregexp = Null(REGEXP*); /* crucial if regcomp aborts */
116 }
533c011a 117 if (PL_op->op_flags & OPf_SPECIAL)
3280af22 118 PL_reginterp_cnt = I32_MAX; /* Mark as safe. */
a0d0e21e 119
c277df42 120 pm->op_pmflags = pm->op_pmpermflags; /* reset case sensitivity */
cea2e8a9 121 pm->op_pmregexp = CALLREGCOMP(aTHX_ t, t + len, pm);
3280af22 122 PL_reginterp_cnt = 0; /* XXXX Be extra paranoid - needed
2cd61cdb 123 inside tie/overload accessors. */
c277df42 124 }
4633a7c4 125 }
a0d0e21e 126
72311751 127#ifndef INCOMPLETE_TAINTS
3280af22
NIS
128 if (PL_tainting) {
129 if (PL_tainted)
72311751
GS
130 pm->op_pmdynflags |= PMdf_TAINTED;
131 else
132 pm->op_pmdynflags &= ~PMdf_TAINTED;
133 }
134#endif
135
3280af22
NIS
136 if (!pm->op_pmregexp->prelen && PL_curpm)
137 pm = PL_curpm;
a0d0e21e
LW
138 else if (strEQ("\\s+", pm->op_pmregexp->precomp))
139 pm->op_pmflags |= PMf_WHITE;
140
141 if (pm->op_pmflags & PMf_KEEP) {
c90c0ff4 142 pm->op_private &= ~OPpRUNTIME; /* no point compiling again */
533c011a 143 cLOGOP->op_first->op_next = PL_op->op_next;
a0d0e21e
LW
144 }
145 RETURN;
146}
147
148PP(pp_substcont)
149{
4e35701f 150 djSP;
a0d0e21e 151 register PMOP *pm = (PMOP*) cLOGOP->op_other;
c09156bb 152 register PERL_CONTEXT *cx = &cxstack[cxstack_ix];
a0d0e21e
LW
153 register SV *dstr = cx->sb_dstr;
154 register char *s = cx->sb_s;
155 register char *m = cx->sb_m;
156 char *orig = cx->sb_orig;
d9f97599 157 register REGEXP *rx = cx->sb_rx;
a0d0e21e 158
d9f97599 159 rxres_restore(&cx->sb_rxres, rx);
c90c0ff4 160
a0d0e21e
LW
161 if (cx->sb_iters++) {
162 if (cx->sb_iters > cx->sb_maxiters)
cea2e8a9 163 DIE(aTHX_ "Substitution loop");
a0d0e21e 164
48c036b1
GS
165 if (!(cx->sb_rxtainted & 2) && SvTAINTED(TOPs))
166 cx->sb_rxtainted |= 2;
a0d0e21e 167 sv_catsv(dstr, POPs);
a0d0e21e
LW
168
169 /* Are we done */
cea2e8a9 170 if (cx->sb_once || !CALLREGEXEC(aTHX_ rx, s, cx->sb_strend, orig,
9661b544 171 s == m, cx->sb_targ, NULL,
22e551b9 172 ((cx->sb_rflags & REXEC_COPY_STR)
cf93c79d
IZ
173 ? (REXEC_IGNOREPOS|REXEC_NOT_FIRST)
174 : (REXEC_COPY_STR|REXEC_IGNOREPOS|REXEC_NOT_FIRST))))
a0d0e21e
LW
175 {
176 SV *targ = cx->sb_targ;
177 sv_catpvn(dstr, s, cx->sb_strend - s);
748a9306 178
48c036b1 179 cx->sb_rxtainted |= RX_MATCH_TAINTED(rx);
9212bbba 180
4633a7c4 181 (void)SvOOK_off(targ);
cb0b1708 182 Safefree(SvPVX(targ));
748a9306
LW
183 SvPVX(targ) = SvPVX(dstr);
184 SvCUR_set(targ, SvCUR(dstr));
185 SvLEN_set(targ, SvLEN(dstr));
186 SvPVX(dstr) = 0;
187 sv_free(dstr);
48c036b1
GS
188
189 TAINT_IF(cx->sb_rxtainted & 1);
190 PUSHs(sv_2mortal(newSViv((I32)cx->sb_iters - 1)));
191
a0d0e21e 192 (void)SvPOK_only(targ);
48c036b1 193 TAINT_IF(cx->sb_rxtainted);
a0d0e21e 194 SvSETMAGIC(targ);
9212bbba 195 SvTAINT(targ);
5cd24f17 196
4633a7c4 197 LEAVE_SCOPE(cx->sb_oldsave);
a0d0e21e
LW
198 POPSUBST(cx);
199 RETURNOP(pm->op_next);
200 }
201 }
cf93c79d 202 if (RX_MATCH_COPIED(rx) && rx->subbeg != orig) {
a0d0e21e
LW
203 m = s;
204 s = orig;
cf93c79d 205 cx->sb_orig = orig = rx->subbeg;
a0d0e21e
LW
206 s = orig + (m - s);
207 cx->sb_strend = s + (cx->sb_strend - m);
208 }
cf93c79d 209 cx->sb_m = m = rx->startp[0] + orig;
a0d0e21e 210 sv_catpvn(dstr, s, m-s);
cf93c79d 211 cx->sb_s = rx->endp[0] + orig;
d9f97599
GS
212 cx->sb_rxtainted |= RX_MATCH_TAINTED(rx);
213 rxres_save(&cx->sb_rxres, rx);
a0d0e21e
LW
214 RETURNOP(pm->op_pmreplstart);
215}
216
c90c0ff4 217void
864dbfa3 218Perl_rxres_save(pTHX_ void **rsp, REGEXP *rx)
c90c0ff4 219{
220 UV *p = (UV*)*rsp;
221 U32 i;
222
d9f97599
GS
223 if (!p || p[1] < rx->nparens) {
224 i = 6 + rx->nparens * 2;
c90c0ff4 225 if (!p)
226 New(501, p, i, UV);
227 else
228 Renew(p, i, UV);
229 *rsp = (void*)p;
230 }
231
cf93c79d
IZ
232 *p++ = (UV)(RX_MATCH_COPIED(rx) ? rx->subbeg : Nullch);
233 RX_MATCH_COPIED_off(rx);
c90c0ff4 234
d9f97599 235 *p++ = rx->nparens;
c90c0ff4 236
d9f97599 237 *p++ = (UV)rx->subbeg;
cf93c79d 238 *p++ = (UV)rx->sublen;
d9f97599
GS
239 for (i = 0; i <= rx->nparens; ++i) {
240 *p++ = (UV)rx->startp[i];
241 *p++ = (UV)rx->endp[i];
c90c0ff4 242 }
243}
244
245void
864dbfa3 246Perl_rxres_restore(pTHX_ void **rsp, REGEXP *rx)
c90c0ff4 247{
248 UV *p = (UV*)*rsp;
249 U32 i;
250
cf93c79d
IZ
251 if (RX_MATCH_COPIED(rx))
252 Safefree(rx->subbeg);
253 RX_MATCH_COPIED_set(rx, *p);
c90c0ff4 254 *p++ = 0;
255
d9f97599 256 rx->nparens = *p++;
c90c0ff4 257
d9f97599 258 rx->subbeg = (char*)(*p++);
cf93c79d 259 rx->sublen = (I32)(*p++);
d9f97599 260 for (i = 0; i <= rx->nparens; ++i) {
cf93c79d
IZ
261 rx->startp[i] = (I32)(*p++);
262 rx->endp[i] = (I32)(*p++);
c90c0ff4 263 }
264}
265
266void
864dbfa3 267Perl_rxres_free(pTHX_ void **rsp)
c90c0ff4 268{
269 UV *p = (UV*)*rsp;
270
271 if (p) {
272 Safefree((char*)(*p));
273 Safefree(p);
274 *rsp = Null(void*);
275 }
276}
277
a0d0e21e
LW
278PP(pp_formline)
279{
4e35701f 280 djSP; dMARK; dORIGMARK;
76e3520e 281 register SV *tmpForm = *++MARK;
a0d0e21e
LW
282 register U16 *fpc;
283 register char *t;
284 register char *f;
285 register char *s;
286 register char *send;
287 register I32 arg;
288 register SV *sv;
289 char *item;
290 I32 itemsize;
291 I32 fieldsize;
292 I32 lines = 0;
3280af22 293 bool chopspace = (strchr(PL_chopset, ' ') != Nullch);
a0d0e21e
LW
294 char *chophere;
295 char *linemark;
65202027 296 NV value;
a0d0e21e
LW
297 bool gotsome;
298 STRLEN len;
a0ed51b3 299 STRLEN fudge = SvCUR(tmpForm) * (IN_UTF8 ? 3 : 1) + 1;
a0d0e21e 300
76e3520e
GS
301 if (!SvMAGICAL(tmpForm) || !SvCOMPILED(tmpForm)) {
302 SvREADONLY_off(tmpForm);
303 doparseform(tmpForm);
a0d0e21e
LW
304 }
305
3280af22 306 SvPV_force(PL_formtarget, len);
a0ed51b3 307 t = SvGROW(PL_formtarget, len + fudge + 1); /* XXX SvCUR bad */
a0d0e21e 308 t += len;
76e3520e 309 f = SvPV(tmpForm, len);
a0d0e21e 310 /* need to jump to the next word */
76e3520e 311 s = f + len + WORD_ALIGN - SvCUR(tmpForm) % WORD_ALIGN;
a0d0e21e
LW
312
313 fpc = (U16*)s;
314
315 for (;;) {
316 DEBUG_f( {
317 char *name = "???";
318 arg = -1;
319 switch (*fpc) {
320 case FF_LITERAL: arg = fpc[1]; name = "LITERAL"; break;
321 case FF_BLANK: arg = fpc[1]; name = "BLANK"; break;
322 case FF_SKIP: arg = fpc[1]; name = "SKIP"; break;
323 case FF_FETCH: arg = fpc[1]; name = "FETCH"; break;
324 case FF_DECIMAL: arg = fpc[1]; name = "DECIMAL"; break;
325
326 case FF_CHECKNL: name = "CHECKNL"; break;
327 case FF_CHECKCHOP: name = "CHECKCHOP"; break;
328 case FF_SPACE: name = "SPACE"; break;
329 case FF_HALFSPACE: name = "HALFSPACE"; break;
330 case FF_ITEM: name = "ITEM"; break;
331 case FF_CHOP: name = "CHOP"; break;
332 case FF_LINEGLOB: name = "LINEGLOB"; break;
333 case FF_NEWLINE: name = "NEWLINE"; break;
334 case FF_MORE: name = "MORE"; break;
335 case FF_LINEMARK: name = "LINEMARK"; break;
336 case FF_END: name = "END"; break;
337 }
338 if (arg >= 0)
760ac839 339 PerlIO_printf(PerlIO_stderr(), "%-16s%ld\n", name, (long) arg);
a0d0e21e 340 else
760ac839 341 PerlIO_printf(PerlIO_stderr(), "%-16s\n", name);
a0d0e21e
LW
342 } )
343 switch (*fpc++) {
344 case FF_LINEMARK:
345 linemark = t;
a0d0e21e
LW
346 lines++;
347 gotsome = FALSE;
348 break;
349
350 case FF_LITERAL:
351 arg = *fpc++;
352 while (arg--)
353 *t++ = *f++;
354 break;
355
356 case FF_SKIP:
357 f += *fpc++;
358 break;
359
360 case FF_FETCH:
361 arg = *fpc++;
362 f += arg;
363 fieldsize = arg;
364
365 if (MARK < SP)
366 sv = *++MARK;
367 else {
3280af22 368 sv = &PL_sv_no;
599cee73 369 if (ckWARN(WARN_SYNTAX))
cea2e8a9 370 Perl_warner(aTHX_ WARN_SYNTAX, "Not enough format arguments");
a0d0e21e
LW
371 }
372 break;
373
374 case FF_CHECKNL:
375 item = s = SvPV(sv, len);
376 itemsize = len;
a0ed51b3
LW
377 if (IN_UTF8) {
378 itemsize = sv_len_utf8(sv);
379 if (itemsize != len) {
380 I32 itembytes;
381 if (itemsize > fieldsize) {
382 itemsize = fieldsize;
383 itembytes = itemsize;
384 sv_pos_u2b(sv, &itembytes, 0);
385 }
386 else
387 itembytes = len;
388 send = chophere = s + itembytes;
389 while (s < send) {
390 if (*s & ~31)
391 gotsome = TRUE;
392 else if (*s == '\n')
393 break;
394 s++;
395 }
396 itemsize = s - item;
397 sv_pos_b2u(sv, &itemsize);
398 break;
399 }
400 }
a0d0e21e
LW
401 if (itemsize > fieldsize)
402 itemsize = fieldsize;
403 send = chophere = s + itemsize;
404 while (s < send) {
405 if (*s & ~31)
406 gotsome = TRUE;
407 else if (*s == '\n')
408 break;
409 s++;
410 }
411 itemsize = s - item;
412 break;
413
414 case FF_CHECKCHOP:
415 item = s = SvPV(sv, len);
416 itemsize = len;
a0ed51b3
LW
417 if (IN_UTF8) {
418 itemsize = sv_len_utf8(sv);
419 if (itemsize != len) {
420 I32 itembytes;
421 if (itemsize <= fieldsize) {
422 send = chophere = s + itemsize;
423 while (s < send) {
424 if (*s == '\r') {
425 itemsize = s - item;
426 break;
427 }
428 if (*s++ & ~31)
429 gotsome = TRUE;
430 }
431 }
432 else {
433 itemsize = fieldsize;
434 itembytes = itemsize;
435 sv_pos_u2b(sv, &itembytes, 0);
436 send = chophere = s + itembytes;
437 while (s < send || (s == send && isSPACE(*s))) {
438 if (isSPACE(*s)) {
439 if (chopspace)
440 chophere = s;
441 if (*s == '\r')
442 break;
443 }
444 else {
445 if (*s & ~31)
446 gotsome = TRUE;
447 if (strchr(PL_chopset, *s))
448 chophere = s + 1;
449 }
450 s++;
451 }
452 itemsize = chophere - item;
453 sv_pos_b2u(sv, &itemsize);
454 }
455 break;
456 }
457 }
a0d0e21e
LW
458 if (itemsize <= fieldsize) {
459 send = chophere = s + itemsize;
460 while (s < send) {
461 if (*s == '\r') {
462 itemsize = s - item;
463 break;
464 }
465 if (*s++ & ~31)
466 gotsome = TRUE;
467 }
468 }
469 else {
470 itemsize = fieldsize;
471 send = chophere = s + itemsize;
472 while (s < send || (s == send && isSPACE(*s))) {
473 if (isSPACE(*s)) {
474 if (chopspace)
475 chophere = s;
476 if (*s == '\r')
477 break;
478 }
479 else {
480 if (*s & ~31)
481 gotsome = TRUE;
3280af22 482 if (strchr(PL_chopset, *s))
a0d0e21e
LW
483 chophere = s + 1;
484 }
485 s++;
486 }
487 itemsize = chophere - item;
488 }
489 break;
490
491 case FF_SPACE:
492 arg = fieldsize - itemsize;
493 if (arg) {
494 fieldsize -= arg;
495 while (arg-- > 0)
496 *t++ = ' ';
497 }
498 break;
499
500 case FF_HALFSPACE:
501 arg = fieldsize - itemsize;
502 if (arg) {
503 arg /= 2;
504 fieldsize -= arg;
505 while (arg-- > 0)
506 *t++ = ' ';
507 }
508 break;
509
510 case FF_ITEM:
511 arg = itemsize;
512 s = item;
a0ed51b3
LW
513 if (IN_UTF8) {
514 while (arg--) {
515 if (*s & 0x80) {
516 switch (UTF8SKIP(s)) {
517 case 7: *t++ = *s++;
518 case 6: *t++ = *s++;
519 case 5: *t++ = *s++;
520 case 4: *t++ = *s++;
521 case 3: *t++ = *s++;
522 case 2: *t++ = *s++;
523 case 1: *t++ = *s++;
524 }
525 }
526 else {
527 if ( !((*t++ = *s++) & ~31) )
528 t[-1] = ' ';
529 }
530 }
531 break;
532 }
a0d0e21e 533 while (arg--) {
9d116dd7 534#ifdef EBCDIC
a0d0e21e 535 int ch = *t++ = *s++;
9d116dd7 536 if (iscntrl(ch))
a0d0e21e
LW
537#else
538 if ( !((*t++ = *s++) & ~31) )
a0d0e21e 539#endif
9d116dd7 540 t[-1] = ' ';
a0d0e21e
LW
541 }
542 break;
543
544 case FF_CHOP:
545 s = chophere;
546 if (chopspace) {
547 while (*s && isSPACE(*s))
548 s++;
549 }
550 sv_chop(sv,s);
551 break;
552
553 case FF_LINEGLOB:
554 item = s = SvPV(sv, len);
555 itemsize = len;
556 if (itemsize) {
557 gotsome = TRUE;
558 send = s + itemsize;
559 while (s < send) {
560 if (*s++ == '\n') {
561 if (s == send)
562 itemsize--;
563 else
564 lines++;
565 }
566 }
3280af22
NIS
567 SvCUR_set(PL_formtarget, t - SvPVX(PL_formtarget));
568 sv_catpvn(PL_formtarget, item, itemsize);
a0ed51b3 569 SvGROW(PL_formtarget, SvCUR(PL_formtarget) + fudge + 1);
3280af22 570 t = SvPVX(PL_formtarget) + SvCUR(PL_formtarget);
a0d0e21e
LW
571 }
572 break;
573
574 case FF_DECIMAL:
575 /* If the field is marked with ^ and the value is undefined,
576 blank it out. */
577 arg = *fpc++;
578 if ((arg & 512) && !SvOK(sv)) {
579 arg = fieldsize;
580 while (arg--)
581 *t++ = ' ';
582 break;
583 }
584 gotsome = TRUE;
585 value = SvNV(sv);
bbce6d69 586 /* Formats aren't yet marked for locales, so assume "yes". */
097ee67d
JH
587 {
588 RESTORE_NUMERIC_LOCAL();
65202027
DS
589#if defined(USE_LONG_DOUBLE)
590 if (arg & 256) {
cf2093f6 591 sprintf(t, "%#*.*" PERL_PRIfldbl,
65202027
DS
592 (int) fieldsize, (int) arg & 255, value);
593 } else {
cf2093f6 594 sprintf(t, "%*.0" PERL_PRIfldbl, (int) fieldsize, value);
65202027
DS
595 }
596#else
097ee67d
JH
597 if (arg & 256) {
598 sprintf(t, "%#*.*f",
599 (int) fieldsize, (int) arg & 255, value);
600 } else {
601 sprintf(t, "%*.0f",
602 (int) fieldsize, value);
603 }
65202027 604#endif
097ee67d 605 RESTORE_NUMERIC_STANDARD();
a0d0e21e
LW
606 }
607 t += fieldsize;
608 break;
609
610 case FF_NEWLINE:
611 f++;
612 while (t-- > linemark && *t == ' ') ;
613 t++;
614 *t++ = '\n';
615 break;
616
617 case FF_BLANK:
618 arg = *fpc++;
619 if (gotsome) {
620 if (arg) { /* repeat until fields exhausted? */
621 *t = '\0';
3280af22
NIS
622 SvCUR_set(PL_formtarget, t - SvPVX(PL_formtarget));
623 lines += FmLINES(PL_formtarget);
a0d0e21e
LW
624 if (lines == 200) {
625 arg = t - linemark;
626 if (strnEQ(linemark, linemark - arg, arg))
cea2e8a9 627 DIE(aTHX_ "Runaway format");
a0d0e21e 628 }
3280af22 629 FmLINES(PL_formtarget) = lines;
a0d0e21e
LW
630 SP = ORIGMARK;
631 RETURNOP(cLISTOP->op_first);
632 }
633 }
634 else {
635 t = linemark;
636 lines--;
637 }
638 break;
639
640 case FF_MORE:
7056ecde
KM
641 s = chophere;
642 send = item + len;
643 if (chopspace) {
644 while (*s && isSPACE(*s) && s < send)
645 s++;
646 }
647 if (s < send) {
a0d0e21e
LW
648 arg = fieldsize - itemsize;
649 if (arg) {
650 fieldsize -= arg;
651 while (arg-- > 0)
652 *t++ = ' ';
653 }
654 s = t - 3;
655 if (strnEQ(s," ",3)) {
3280af22 656 while (s > SvPVX(PL_formtarget) && isSPACE(s[-1]))
a0d0e21e
LW
657 s--;
658 }
659 *s++ = '.';
660 *s++ = '.';
661 *s++ = '.';
662 }
663 break;
664
665 case FF_END:
666 *t = '\0';
3280af22
NIS
667 SvCUR_set(PL_formtarget, t - SvPVX(PL_formtarget));
668 FmLINES(PL_formtarget) += lines;
a0d0e21e
LW
669 SP = ORIGMARK;
670 RETPUSHYES;
671 }
672 }
673}
674
675PP(pp_grepstart)
676{
4e35701f 677 djSP;
a0d0e21e
LW
678 SV *src;
679
3280af22 680 if (PL_stack_base + *PL_markstack_ptr == SP) {
a0d0e21e 681 (void)POPMARK;
54310121 682 if (GIMME_V == G_SCALAR)
0b024f31 683 XPUSHs(sv_2mortal(newSViv(0)));
533c011a 684 RETURNOP(PL_op->op_next->op_next);
a0d0e21e 685 }
3280af22 686 PL_stack_sp = PL_stack_base + *PL_markstack_ptr + 1;
cea2e8a9
GS
687 pp_pushmark(); /* push dst */
688 pp_pushmark(); /* push src */
a0d0e21e
LW
689 ENTER; /* enter outer scope */
690
691 SAVETMPS;
127ad2b7
GS
692 /* SAVE_DEFSV does *not* suffice here for USE_THREADS */
693 SAVESPTR(DEFSV);
a0d0e21e 694 ENTER; /* enter inner scope */
3280af22 695 SAVESPTR(PL_curpm);
a0d0e21e 696
3280af22 697 src = PL_stack_base[*PL_markstack_ptr];
a0d0e21e 698 SvTEMP_off(src);
54b9620d 699 DEFSV = src;
a0d0e21e
LW
700
701 PUTBACK;
533c011a 702 if (PL_op->op_type == OP_MAPSTART)
cea2e8a9 703 pp_pushmark(); /* push top */
533c011a 704 return ((LOGOP*)PL_op->op_next)->op_other;
a0d0e21e
LW
705}
706
707PP(pp_mapstart)
708{
cea2e8a9 709 DIE(aTHX_ "panic: mapstart"); /* uses grepstart */
a0d0e21e
LW
710}
711
712PP(pp_mapwhile)
713{
4e35701f 714 djSP;
3280af22 715 I32 diff = (SP - PL_stack_base) - *PL_markstack_ptr;
a0d0e21e
LW
716 I32 count;
717 I32 shift;
718 SV** src;
719 SV** dst;
720
3280af22 721 ++PL_markstack_ptr[-1];
a0d0e21e 722 if (diff) {
3280af22
NIS
723 if (diff > PL_markstack_ptr[-1] - PL_markstack_ptr[-2]) {
724 shift = diff - (PL_markstack_ptr[-1] - PL_markstack_ptr[-2]);
725 count = (SP - PL_stack_base) - PL_markstack_ptr[-1] + 2;
a0d0e21e 726
924508f0
GS
727 EXTEND(SP,shift);
728 src = SP;
729 dst = (SP += shift);
3280af22
NIS
730 PL_markstack_ptr[-1] += shift;
731 *PL_markstack_ptr += shift;
a0d0e21e
LW
732 while (--count)
733 *dst-- = *src--;
734 }
3280af22 735 dst = PL_stack_base + (PL_markstack_ptr[-2] += diff) - 1;
a0d0e21e
LW
736 ++diff;
737 while (--diff)
738 *dst-- = SvTEMP(TOPs) ? POPs : sv_mortalcopy(POPs);
739 }
740 LEAVE; /* exit inner scope */
741
742 /* All done yet? */
3280af22 743 if (PL_markstack_ptr[-1] > *PL_markstack_ptr) {
a0d0e21e 744 I32 items;
54310121 745 I32 gimme = GIMME_V;
a0d0e21e
LW
746
747 (void)POPMARK; /* pop top */
748 LEAVE; /* exit outer scope */
749 (void)POPMARK; /* pop src */
3280af22 750 items = --*PL_markstack_ptr - PL_markstack_ptr[-1];
a0d0e21e 751 (void)POPMARK; /* pop dst */
3280af22 752 SP = PL_stack_base + POPMARK; /* pop original mark */
54310121 753 if (gimme == G_SCALAR) {
a0d0e21e
LW
754 dTARGET;
755 XPUSHi(items);
a0d0e21e 756 }
54310121 757 else if (gimme == G_ARRAY)
758 SP += items;
a0d0e21e
LW
759 RETURN;
760 }
761 else {
762 SV *src;
763
764 ENTER; /* enter inner scope */
3280af22 765 SAVESPTR(PL_curpm);
a0d0e21e 766
3280af22 767 src = PL_stack_base[PL_markstack_ptr[-1]];
a0d0e21e 768 SvTEMP_off(src);
54b9620d 769 DEFSV = src;
a0d0e21e
LW
770
771 RETURNOP(cLOGOP->op_other);
772 }
773}
774
a0d0e21e
LW
775PP(pp_sort)
776{
4e35701f 777 djSP; dMARK; dORIGMARK;
a0d0e21e
LW
778 register SV **up;
779 SV **myorigmark = ORIGMARK;
780 register I32 max;
781 HV *stash;
782 GV *gv;
783 CV *cv;
784 I32 gimme = GIMME;
533c011a 785 OP* nextop = PL_op->op_next;
d0ecd44c 786 I32 overloading = 0;
a0d0e21e
LW
787
788 if (gimme != G_ARRAY) {
789 SP = MARK;
790 RETPUSHUNDEF;
791 }
792
d0abe6c5 793 ENTER;
3280af22 794 SAVEPPTR(PL_sortcop);
533c011a
NIS
795 if (PL_op->op_flags & OPf_STACKED) {
796 if (PL_op->op_flags & OPf_SPECIAL) {
a0d0e21e
LW
797 OP *kid = cLISTOP->op_first->op_sibling; /* pass pushmark */
798 kid = kUNOP->op_first; /* pass rv2gv */
799 kid = kUNOP->op_first; /* pass leave */
3280af22
NIS
800 PL_sortcop = kid->op_next;
801 stash = PL_curcop->cop_stash;
a0d0e21e
LW
802 }
803 else {
804 cv = sv_2cv(*++MARK, &stash, &gv, 0);
805 if (!(cv && CvROOT(cv))) {
806 if (gv) {
807 SV *tmpstr = sv_newmortal();
e5cf08de 808 gv_efullname3(tmpstr, gv, Nullch);
a0d0e21e 809 if (cv && CvXSUB(cv))
cea2e8a9
GS
810 DIE(aTHX_ "Xsub \"%s\" called in sort", SvPVX(tmpstr));
811 DIE(aTHX_ "Undefined sort subroutine \"%s\" called",
a0d0e21e
LW
812 SvPVX(tmpstr));
813 }
814 if (cv) {
815 if (CvXSUB(cv))
cea2e8a9
GS
816 DIE(aTHX_ "Xsub called in sort");
817 DIE(aTHX_ "Undefined subroutine in sort");
a0d0e21e 818 }
cea2e8a9 819 DIE(aTHX_ "Not a CODE reference in sort");
a0d0e21e 820 }
3280af22 821 PL_sortcop = CvSTART(cv);
a0d0e21e 822 SAVESPTR(CvROOT(cv)->op_ppaddr);
22c35a8c 823 CvROOT(cv)->op_ppaddr = PL_ppaddr[OP_NULL];
b3933176 824
3280af22
NIS
825 SAVESPTR(PL_curpad);
826 PL_curpad = AvARRAY((AV*)AvARRAY(CvPADLIST(cv))[1]);
a0d0e21e
LW
827 }
828 }
829 else {
3280af22
NIS
830 PL_sortcop = Nullop;
831 stash = PL_curcop->cop_stash;
a0d0e21e
LW
832 }
833
834 up = myorigmark + 1;
835 while (MARK < SP) { /* This may or may not shift down one here. */
836 /*SUPPRESS 560*/
837 if (*up = *++MARK) { /* Weed out nulls. */
9f8d30d5 838 SvTEMP_off(*up);
d0ecd44c 839 if (!PL_sortcop && !SvPOK(*up)) {
2d8e6c8d 840 STRLEN n_a;
d0ecd44c
IZ
841 if (SvAMAGIC(*up))
842 overloading = 1;
843 else
2d8e6c8d 844 (void)sv_2pv(*up, &n_a);
d0ecd44c 845 }
a0d0e21e
LW
846 up++;
847 }
848 }
849 max = --up - myorigmark;
3280af22 850 if (PL_sortcop) {
a0d0e21e 851 if (max > 1) {
c09156bb 852 PERL_CONTEXT *cx;
a0d0e21e 853 SV** newsp;
54310121 854 bool oldcatch = CATCH_GET;
a0d0e21e
LW
855
856 SAVETMPS;
462e5cf6 857 SAVEOP();
a0d0e21e 858
54310121 859 CATCH_SET(TRUE);
e788e7d3 860 PUSHSTACKi(PERLSI_SORT);
3280af22
NIS
861 if (PL_sortstash != stash) {
862 PL_firstgv = gv_fetchpv("a", TRUE, SVt_PV);
863 PL_secondgv = gv_fetchpv("b", TRUE, SVt_PV);
864 PL_sortstash = stash;
a0d0e21e
LW
865 }
866
3280af22
NIS
867 SAVESPTR(GvSV(PL_firstgv));
868 SAVESPTR(GvSV(PL_secondgv));
b3933176 869
3280af22 870 PUSHBLOCK(cx, CXt_NULL, PL_stack_base);
533c011a 871 if (!(PL_op->op_flags & OPf_SPECIAL)) {
b3933176
CS
872 bool hasargs = FALSE;
873 cx->cx_type = CXt_SUB;
874 cx->blk_gimme = G_SCALAR;
875 PUSHSUB(cx);
876 if (!CvDEPTH(cv))
3e3baf6d 877 (void)SvREFCNT_inc(cv); /* in preparation for POPSUB */
b3933176 878 }
3280af22 879 PL_sortcxix = cxstack_ix;
0b94c7bb 880 qsortsv((myorigmark+1), max, sortcv);
a0d0e21e 881
3280af22 882 POPBLOCK(cx,PL_curpm);
ebafeae7 883 PL_stack_sp = newsp;
d3acc0f7 884 POPSTACK;
54310121 885 CATCH_SET(oldcatch);
a0d0e21e 886 }
a0d0e21e
LW
887 }
888 else {
889 if (max > 1) {
890 MEXTEND(SP, 20); /* Can't afford stack realloc on signal. */
745d3a65 891 qsortsv(ORIGMARK+1, max,
9c007264
JH
892 (PL_op->op_private & OPpSORT_NUMERIC)
893 ? ( (PL_op->op_private & OPpSORT_INTEGER)
0b94c7bb
GS
894 ? ( overloading ? amagic_i_ncmp : sv_i_ncmp)
895 : ( overloading ? amagic_ncmp : sv_ncmp))
9c007264
JH
896 : ( (PL_op->op_private & OPpLOCALE)
897 ? ( overloading
0b94c7bb
GS
898 ? amagic_cmp_locale
899 : sv_cmp_locale_static)
900 : ( overloading ? amagic_cmp : sv_cmp_static)));
9c007264
JH
901 if (PL_op->op_private & OPpSORT_REVERSE) {
902 SV **p = ORIGMARK+1;
903 SV **q = ORIGMARK+max;
904 while (p < q) {
905 SV *tmp = *p;
906 *p++ = *q;
907 *q-- = tmp;
908 }
909 }
a0d0e21e
LW
910 }
911 }
d0abe6c5 912 LEAVE;
3280af22 913 PL_stack_sp = ORIGMARK + max;
a0d0e21e
LW
914 return nextop;
915}
916
917/* Range stuff. */
918
919PP(pp_range)
920{
921 if (GIMME == G_ARRAY)
1a67a97c 922 return NORMAL;
538573f7 923 if (SvTRUEx(PAD_SV(PL_op->op_targ)))
1a67a97c 924 return cLOGOP->op_other;
538573f7 925 else
1a67a97c 926 return NORMAL;
a0d0e21e
LW
927}
928
929PP(pp_flip)
930{
4e35701f 931 djSP;
a0d0e21e
LW
932
933 if (GIMME == G_ARRAY) {
1a67a97c 934 RETURNOP(((LOGOP*)cUNOP->op_first)->op_other);
a0d0e21e
LW
935 }
936 else {
937 dTOPss;
533c011a 938 SV *targ = PAD_SV(PL_op->op_targ);
a0d0e21e 939
533c011a 940 if ((PL_op->op_private & OPpFLIP_LINENUM)
3280af22 941 ? (PL_last_in_gv && SvIV(sv) == (IV)IoLINES(GvIOp(PL_last_in_gv)))
a0d0e21e
LW
942 : SvTRUE(sv) ) {
943 sv_setiv(PAD_SV(cUNOP->op_first->op_targ), 1);
533c011a 944 if (PL_op->op_flags & OPf_SPECIAL) {
a0d0e21e 945 sv_setiv(targ, 1);
3e3baf6d 946 SETs(targ);
a0d0e21e
LW
947 RETURN;
948 }
949 else {
950 sv_setiv(targ, 0);
924508f0 951 SP--;
1a67a97c 952 RETURNOP(((LOGOP*)cUNOP->op_first)->op_other);
a0d0e21e
LW
953 }
954 }
955 sv_setpv(TARG, "");
956 SETs(targ);
957 RETURN;
958 }
959}
960
961PP(pp_flop)
962{
4e35701f 963 djSP;
a0d0e21e
LW
964
965 if (GIMME == G_ARRAY) {
966 dPOPPOPssrl;
c1ab3db2 967 register I32 i, j;
a0d0e21e
LW
968 register SV *sv;
969 I32 max;
86cb7173
HS
970
971 if (SvGMAGICAL(left))
972 mg_get(left);
973 if (SvGMAGICAL(right))
974 mg_get(right);
a0d0e21e 975
4633a7c4 976 if (SvNIOKp(left) || !SvPOKp(left) ||
bbce6d69 977 (looks_like_number(left) && *SvPVX(left) != '0') )
978 {
c1ab3db2 979 if (SvNV(left) < IV_MIN || SvNV(right) > IV_MAX)
cea2e8a9 980 Perl_croak(aTHX_ "Range iterator outside integer range");
a0d0e21e
LW
981 i = SvIV(left);
982 max = SvIV(right);
bbce6d69 983 if (max >= i) {
c1ab3db2
AK
984 j = max - i + 1;
985 EXTEND_MORTAL(j);
986 EXTEND(SP, j);
bbce6d69 987 }
c1ab3db2
AK
988 else
989 j = 0;
990 while (j--) {
bbce6d69 991 sv = sv_2mortal(newSViv(i++));
a0d0e21e
LW
992 PUSHs(sv);
993 }
994 }
995 else {
996 SV *final = sv_mortalcopy(right);
2d8e6c8d 997 STRLEN len, n_a;
a0d0e21e
LW
998 char *tmps = SvPV(final, len);
999
1000 sv = sv_mortalcopy(left);
2d8e6c8d 1001 SvPV_force(sv,n_a);
89ea2908 1002 while (!SvNIOKp(sv) && SvCUR(sv) <= len) {
a0d0e21e 1003 XPUSHs(sv);
89ea2908
GA
1004 if (strEQ(SvPVX(sv),tmps))
1005 break;
a0d0e21e
LW
1006 sv = sv_2mortal(newSVsv(sv));
1007 sv_inc(sv);
1008 }
a0d0e21e
LW
1009 }
1010 }
1011 else {
1012 dTOPss;
1013 SV *targ = PAD_SV(cUNOP->op_first->op_targ);
1014 sv_inc(targ);
533c011a 1015 if ((PL_op->op_private & OPpFLIP_LINENUM)
3280af22 1016 ? (PL_last_in_gv && SvIV(sv) == (IV)IoLINES(GvIOp(PL_last_in_gv)))
a0d0e21e
LW
1017 : SvTRUE(sv) ) {
1018 sv_setiv(PAD_SV(((UNOP*)cUNOP->op_first)->op_first->op_targ), 0);
1019 sv_catpv(targ, "E0");
1020 }
1021 SETs(targ);
1022 }
1023
1024 RETURN;
1025}
1026
1027/* Control. */
1028
76e3520e 1029STATIC I32
cea2e8a9 1030S_dopoptolabel(pTHX_ char *label)
a0d0e21e 1031{
11343788 1032 dTHR;
a0d0e21e 1033 register I32 i;
c09156bb 1034 register PERL_CONTEXT *cx;
a0d0e21e
LW
1035
1036 for (i = cxstack_ix; i >= 0; i--) {
1037 cx = &cxstack[i];
6b35e009 1038 switch (CxTYPE(cx)) {
a0d0e21e 1039 case CXt_SUBST:
599cee73 1040 if (ckWARN(WARN_UNSAFE))
cea2e8a9 1041 Perl_warner(aTHX_ WARN_UNSAFE, "Exiting substitution via %s",
22c35a8c 1042 PL_op_name[PL_op->op_type]);
a0d0e21e
LW
1043 break;
1044 case CXt_SUB:
599cee73 1045 if (ckWARN(WARN_UNSAFE))
cea2e8a9 1046 Perl_warner(aTHX_ WARN_UNSAFE, "Exiting subroutine via %s",
22c35a8c 1047 PL_op_name[PL_op->op_type]);
a0d0e21e
LW
1048 break;
1049 case CXt_EVAL:
599cee73 1050 if (ckWARN(WARN_UNSAFE))
cea2e8a9 1051 Perl_warner(aTHX_ WARN_UNSAFE, "Exiting eval via %s",
22c35a8c 1052 PL_op_name[PL_op->op_type]);
a0d0e21e 1053 break;
0a753a76 1054 case CXt_NULL:
599cee73 1055 if (ckWARN(WARN_UNSAFE))
cea2e8a9 1056 Perl_warner(aTHX_ WARN_UNSAFE, "Exiting pseudo-block via %s",
22c35a8c 1057 PL_op_name[PL_op->op_type]);
0a753a76 1058 return -1;
a0d0e21e
LW
1059 case CXt_LOOP:
1060 if (!cx->blk_loop.label ||
1061 strNE(label, cx->blk_loop.label) ) {
cea2e8a9 1062 DEBUG_l(Perl_deb(aTHX_ "(Skipping label #%ld %s)\n",
68dc0745 1063 (long)i, cx->blk_loop.label));
a0d0e21e
LW
1064 continue;
1065 }
cea2e8a9 1066 DEBUG_l( Perl_deb(aTHX_ "(Found label #%ld %s)\n", (long)i, label));
a0d0e21e
LW
1067 return i;
1068 }
1069 }
1070 return i;
1071}
1072
e50aee73 1073I32
864dbfa3 1074Perl_dowantarray(pTHX)
e50aee73 1075{
54310121 1076 I32 gimme = block_gimme();
1077 return (gimme == G_VOID) ? G_SCALAR : gimme;
1078}
1079
1080I32
864dbfa3 1081Perl_block_gimme(pTHX)
54310121 1082{
11343788 1083 dTHR;
e50aee73
AD
1084 I32 cxix;
1085
1086 cxix = dopoptosub(cxstack_ix);
1087 if (cxix < 0)
46fc3d4c 1088 return G_VOID;
e50aee73 1089
54310121 1090 switch (cxstack[cxix].blk_gimme) {
d2719217
GS
1091 case G_VOID:
1092 return G_VOID;
54310121 1093 case G_SCALAR:
e50aee73 1094 return G_SCALAR;
54310121 1095 case G_ARRAY:
1096 return G_ARRAY;
1097 default:
cea2e8a9 1098 Perl_croak(aTHX_ "panic: bad gimme: %d\n", cxstack[cxix].blk_gimme);
d2719217
GS
1099 /* NOTREACHED */
1100 return 0;
54310121 1101 }
e50aee73
AD
1102}
1103
76e3520e 1104STATIC I32
cea2e8a9 1105S_dopoptosub(pTHX_ I32 startingblock)
a0d0e21e 1106{
11343788 1107 dTHR;
2c375eb9
GS
1108 return dopoptosub_at(cxstack, startingblock);
1109}
1110
1111STATIC I32
cea2e8a9 1112S_dopoptosub_at(pTHX_ PERL_CONTEXT *cxstk, I32 startingblock)
2c375eb9
GS
1113{
1114 dTHR;
a0d0e21e 1115 I32 i;
c09156bb 1116 register PERL_CONTEXT *cx;
a0d0e21e 1117 for (i = startingblock; i >= 0; i--) {
2c375eb9 1118 cx = &cxstk[i];
6b35e009 1119 switch (CxTYPE(cx)) {
a0d0e21e
LW
1120 default:
1121 continue;
1122 case CXt_EVAL:
1123 case CXt_SUB:
cea2e8a9 1124 DEBUG_l( Perl_deb(aTHX_ "(Found sub #%ld)\n", (long)i));
a0d0e21e
LW
1125 return i;
1126 }
1127 }
1128 return i;
1129}
1130
76e3520e 1131STATIC I32
cea2e8a9 1132S_dopoptoeval(pTHX_ I32 startingblock)
a0d0e21e 1133{
11343788 1134 dTHR;
a0d0e21e 1135 I32 i;
c09156bb 1136 register PERL_CONTEXT *cx;
a0d0e21e
LW
1137 for (i = startingblock; i >= 0; i--) {
1138 cx = &cxstack[i];
6b35e009 1139 switch (CxTYPE(cx)) {
a0d0e21e
LW
1140 default:
1141 continue;
1142 case CXt_EVAL:
cea2e8a9 1143 DEBUG_l( Perl_deb(aTHX_ "(Found eval #%ld)\n", (long)i));
a0d0e21e
LW
1144 return i;
1145 }
1146 }
1147 return i;
1148}
1149
76e3520e 1150STATIC I32
cea2e8a9 1151S_dopoptoloop(pTHX_ I32 startingblock)
a0d0e21e 1152{
11343788 1153 dTHR;
a0d0e21e 1154 I32 i;
c09156bb 1155 register PERL_CONTEXT *cx;
a0d0e21e
LW
1156 for (i = startingblock; i >= 0; i--) {
1157 cx = &cxstack[i];
6b35e009 1158 switch (CxTYPE(cx)) {
a0d0e21e 1159 case CXt_SUBST:
599cee73 1160 if (ckWARN(WARN_UNSAFE))
cea2e8a9 1161 Perl_warner(aTHX_ WARN_UNSAFE, "Exiting substitution via %s",
22c35a8c 1162 PL_op_name[PL_op->op_type]);
a0d0e21e
LW
1163 break;
1164 case CXt_SUB:
599cee73 1165 if (ckWARN(WARN_UNSAFE))
cea2e8a9 1166 Perl_warner(aTHX_ WARN_UNSAFE, "Exiting subroutine via %s",
22c35a8c 1167 PL_op_name[PL_op->op_type]);
a0d0e21e
LW
1168 break;
1169 case CXt_EVAL:
599cee73 1170 if (ckWARN(WARN_UNSAFE))
cea2e8a9 1171 Perl_warner(aTHX_ WARN_UNSAFE, "Exiting eval via %s",
22c35a8c 1172 PL_op_name[PL_op->op_type]);
a0d0e21e 1173 break;
0a753a76 1174 case CXt_NULL:
599cee73 1175 if (ckWARN(WARN_UNSAFE))
cea2e8a9 1176 Perl_warner(aTHX_ WARN_UNSAFE, "Exiting pseudo-block via %s",
22c35a8c 1177 PL_op_name[PL_op->op_type]);
0a753a76 1178 return -1;
a0d0e21e 1179 case CXt_LOOP:
cea2e8a9 1180 DEBUG_l( Perl_deb(aTHX_ "(Found loop #%ld)\n", (long)i));
a0d0e21e
LW
1181 return i;
1182 }
1183 }
1184 return i;
1185}
1186
1187void
864dbfa3 1188Perl_dounwind(pTHX_ I32 cxix)
a0d0e21e 1189{
11343788 1190 dTHR;
c09156bb 1191 register PERL_CONTEXT *cx;
a0d0e21e
LW
1192 SV **newsp;
1193 I32 optype;
1194
1195 while (cxstack_ix > cxix) {
c90c0ff4 1196 cx = &cxstack[cxstack_ix];
1197 DEBUG_l(PerlIO_printf(Perl_debug_log, "Unwinding block %ld, type %s\n",
22c35a8c 1198 (long) cxstack_ix, PL_block_type[CxTYPE(cx)]));
a0d0e21e 1199 /* Note: we don't need to restore the base context info till the end. */
6b35e009 1200 switch (CxTYPE(cx)) {
c90c0ff4 1201 case CXt_SUBST:
1202 POPSUBST(cx);
1203 continue; /* not break */
a0d0e21e
LW
1204 case CXt_SUB:
1205 POPSUB(cx);
1206 break;
1207 case CXt_EVAL:
1208 POPEVAL(cx);
1209 break;
1210 case CXt_LOOP:
1211 POPLOOP(cx);
1212 break;
0a753a76 1213 case CXt_NULL:
a0d0e21e
LW
1214 break;
1215 }
c90c0ff4 1216 cxstack_ix--;
a0d0e21e
LW
1217 }
1218}
1219
067f92a0
GS
1220/*
1221 * Closures mentioned at top level of eval cannot be referenced
1222 * again, and their presence indirectly causes a memory leak.
1223 * (Note that the fact that compcv and friends are still set here
1224 * is, AFAIK, an accident.) --Chip
1225 *
1226 * XXX need to get comppad et al from eval's cv rather than
1227 * relying on the incidental global values.
1228 */
1229STATIC void
cea2e8a9 1230S_free_closures(pTHX)
067f92a0
GS
1231{
1232 dTHR;
1233 SV **svp = AvARRAY(PL_comppad_name);
1234 I32 ix;
1235 for (ix = AvFILLp(PL_comppad_name); ix >= 0; ix--) {
1236 SV *sv = svp[ix];
1237 if (sv && sv != &PL_sv_undef && *SvPVX(sv) == '&') {
1238 SvREFCNT_dec(sv);
1239 svp[ix] = &PL_sv_undef;
1240
1241 sv = PL_curpad[ix];
1242 if (CvCLONE(sv)) {
1243 SvREFCNT_dec(CvOUTSIDE(sv));
1244 CvOUTSIDE(sv) = Nullcv;
1245 }
1246 else {
1247 SvREFCNT_dec(sv);
1248 sv = NEWSV(0,0);
1249 SvPADTMP_on(sv);
1250 PL_curpad[ix] = sv;
1251 }
1252 }
1253 }
1254}
1255
a0d0e21e 1256OP *
864dbfa3 1257Perl_die_where(pTHX_ char *message, STRLEN msglen)
a0d0e21e 1258{
e336de0d 1259 dSP;
2d8e6c8d 1260 STRLEN n_a;
3280af22 1261 if (PL_in_eval) {
a0d0e21e 1262 I32 cxix;
c09156bb 1263 register PERL_CONTEXT *cx;
a0d0e21e
LW
1264 I32 gimme;
1265 SV **newsp;
1266
4e6ea2c3 1267 if (message) {
faef0170 1268 if (PL_in_eval & EVAL_KEEPERR) {
4e6ea2c3 1269 SV **svp;
4e6ea2c3 1270
06bf62c7 1271 svp = hv_fetch(ERRHV, message, msglen, TRUE);
4e6ea2c3
GS
1272 if (svp) {
1273 if (!SvIOK(*svp)) {
1274 static char prefix[] = "\t(in cleanup) ";
1275 SV *err = ERRSV;
1276 sv_upgrade(*svp, SVt_IV);
1277 (void)SvIOK_only(*svp);
1278 if (!SvPOK(err))
1279 sv_setpv(err,"");
06bf62c7 1280 SvGROW(err, SvCUR(err)+sizeof(prefix)+msglen);
4e6ea2c3 1281 sv_catpvn(err, prefix, sizeof(prefix)-1);
06bf62c7 1282 sv_catpvn(err, message, msglen);
b5d92ff4 1283 if (ckWARN(WARN_UNSAFE)) {
06bf62c7 1284 STRLEN start = SvCUR(err)-msglen-sizeof(prefix)+1;
cea2e8a9 1285 Perl_warner(aTHX_ WARN_UNSAFE, SvPVX(err)+start);
b5d92ff4 1286 }
4e6ea2c3
GS
1287 }
1288 sv_inc(*svp);
4633a7c4 1289 }
4633a7c4 1290 }
4e6ea2c3 1291 else
06bf62c7 1292 sv_setpvn(ERRSV, message, msglen);
4633a7c4
LW
1293 }
1294 else
06bf62c7 1295 message = SvPVx(ERRSV, msglen);
4e6ea2c3 1296
3280af22 1297 while ((cxix = dopoptoeval(cxstack_ix)) < 0 && PL_curstackinfo->si_prev) {
bac4b2ad 1298 dounwind(-1);
d3acc0f7 1299 POPSTACK;
bac4b2ad 1300 }
e336de0d 1301
a0d0e21e
LW
1302 if (cxix >= 0) {
1303 I32 optype;
1304
1305 if (cxix < cxstack_ix)
1306 dounwind(cxix);
1307
3280af22 1308 POPBLOCK(cx,PL_curpm);
6b35e009 1309 if (CxTYPE(cx) != CXt_EVAL) {
06bf62c7
GS
1310 PerlIO_write(PerlIO_stderr(), "panic: die ", 11);
1311 PerlIO_write(PerlIO_stderr(), message, msglen);
a0d0e21e
LW
1312 my_exit(1);
1313 }
1314 POPEVAL(cx);
1315
1316 if (gimme == G_SCALAR)
3280af22
NIS
1317 *++newsp = &PL_sv_undef;
1318 PL_stack_sp = newsp;
a0d0e21e
LW
1319
1320 LEAVE;
748a9306 1321
7a2e2cd6 1322 if (optype == OP_REQUIRE) {
2d8e6c8d 1323 char* msg = SvPVx(ERRSV, n_a);
cea2e8a9 1324 DIE(aTHX_ "%s", *msg ? msg : "Compilation failed in require");
7a2e2cd6 1325 }
a0d0e21e
LW
1326 return pop_return();
1327 }
1328 }
9cc2fdd3 1329 if (!message)
06bf62c7 1330 message = SvPVx(ERRSV, msglen);
d175a3f0
GS
1331 {
1332#ifdef USE_SFIO
1333 /* SFIO can really mess with your errno */
1334 int e = errno;
1335#endif
06bf62c7 1336 PerlIO_write(PerlIO_stderr(), message, msglen);
d175a3f0
GS
1337 (void)PerlIO_flush(PerlIO_stderr());
1338#ifdef USE_SFIO
1339 errno = e;
1340#endif
1341 }
f86702cc 1342 my_failure_exit();
1343 /* NOTREACHED */
a0d0e21e
LW
1344 return 0;
1345}
1346
1347PP(pp_xor)
1348{
4e35701f 1349 djSP; dPOPTOPssrl;
a0d0e21e
LW
1350 if (SvTRUE(left) != SvTRUE(right))
1351 RETSETYES;
1352 else
1353 RETSETNO;
1354}
1355
1356PP(pp_andassign)
1357{
4e35701f 1358 djSP;
a0d0e21e
LW
1359 if (!SvTRUE(TOPs))
1360 RETURN;
1361 else
1362 RETURNOP(cLOGOP->op_other);
1363}
1364
1365PP(pp_orassign)
1366{
4e35701f 1367 djSP;
a0d0e21e
LW
1368 if (SvTRUE(TOPs))
1369 RETURN;
1370 else
1371 RETURNOP(cLOGOP->op_other);
1372}
1373
a0d0e21e
LW
1374PP(pp_caller)
1375{
4e35701f 1376 djSP;
a0d0e21e 1377 register I32 cxix = dopoptosub(cxstack_ix);
c09156bb 1378 register PERL_CONTEXT *cx;
2c375eb9 1379 register PERL_CONTEXT *ccstack = cxstack;
3280af22 1380 PERL_SI *top_si = PL_curstackinfo;
a0d0e21e 1381 I32 dbcxix;
54310121 1382 I32 gimme;
49d8d3a1 1383 HV *hv;
a0d0e21e
LW
1384 SV *sv;
1385 I32 count = 0;
1386
1387 if (MAXARG)
1388 count = POPi;
f3aa04c2 1389 EXTEND(SP, 7);
a0d0e21e 1390 for (;;) {
2c375eb9
GS
1391 /* we may be in a higher stacklevel, so dig down deeper */
1392 while (cxix < 0 && top_si->si_type != PERLSI_MAIN) {
1393 top_si = top_si->si_prev;
1394 ccstack = top_si->si_cxstack;
1395 cxix = dopoptosub_at(ccstack, top_si->si_cxix);
1396 }
a0d0e21e
LW
1397 if (cxix < 0) {
1398 if (GIMME != G_ARRAY)
1399 RETPUSHUNDEF;
1400 RETURN;
1401 }
3280af22
NIS
1402 if (PL_DBsub && cxix >= 0 &&
1403 ccstack[cxix].blk_sub.cv == GvCV(PL_DBsub))
a0d0e21e
LW
1404 count++;
1405 if (!count--)
1406 break;
2c375eb9 1407 cxix = dopoptosub_at(ccstack, cxix - 1);
a0d0e21e 1408 }
2c375eb9
GS
1409
1410 cx = &ccstack[cxix];
6b35e009 1411 if (CxTYPE(cx) == CXt_SUB) {
2c375eb9
GS
1412 dbcxix = dopoptosub_at(ccstack, cxix - 1);
1413 /* We expect that ccstack[dbcxix] is CXt_SUB, anyway, the
06a5b730 1414 field below is defined for any cx. */
3280af22 1415 if (PL_DBsub && dbcxix >= 0 && ccstack[dbcxix].blk_sub.cv == GvCV(PL_DBsub))
2c375eb9 1416 cx = &ccstack[dbcxix];
06a5b730 1417 }
1418
a0d0e21e 1419 if (GIMME != G_ARRAY) {
49d8d3a1
MB
1420 hv = cx->blk_oldcop->cop_stash;
1421 if (!hv)
3280af22 1422 PUSHs(&PL_sv_undef);
49d8d3a1
MB
1423 else {
1424 dTARGET;
1425 sv_setpv(TARG, HvNAME(hv));
1426 PUSHs(TARG);
1427 }
a0d0e21e
LW
1428 RETURN;
1429 }
a0d0e21e 1430
49d8d3a1
MB
1431 hv = cx->blk_oldcop->cop_stash;
1432 if (!hv)
3280af22 1433 PUSHs(&PL_sv_undef);
49d8d3a1
MB
1434 else
1435 PUSHs(sv_2mortal(newSVpv(HvNAME(hv), 0)));
79cb57f6
GS
1436 PUSHs(sv_2mortal(newSVpvn(SvPVX(GvSV(cx->blk_oldcop->cop_filegv)),
1437 SvCUR(GvSV(cx->blk_oldcop->cop_filegv)))));
a0d0e21e
LW
1438 PUSHs(sv_2mortal(newSViv((I32)cx->blk_oldcop->cop_line)));
1439 if (!MAXARG)
1440 RETURN;
6b35e009 1441 if (CxTYPE(cx) == CXt_SUB) { /* So is ccstack[dbcxix]. */
a0d0e21e 1442 sv = NEWSV(49, 0);
2c375eb9 1443 gv_efullname3(sv, CvGV(ccstack[cxix].blk_sub.cv), Nullch);
a0d0e21e
LW
1444 PUSHs(sv_2mortal(sv));
1445 PUSHs(sv_2mortal(newSViv((I32)cx->blk_sub.hasargs)));
1446 }
1447 else {
79cb57f6 1448 PUSHs(sv_2mortal(newSVpvn("(eval)",6)));
a0d0e21e
LW
1449 PUSHs(sv_2mortal(newSViv(0)));
1450 }
54310121 1451 gimme = (I32)cx->blk_gimme;
1452 if (gimme == G_VOID)
3280af22 1453 PUSHs(&PL_sv_undef);
54310121 1454 else
1455 PUSHs(sv_2mortal(newSViv(gimme & G_ARRAY)));
6b35e009 1456 if (CxTYPE(cx) == CXt_EVAL) {
06a5b730 1457 if (cx->blk_eval.old_op_type == OP_ENTEREVAL) {
4633a7c4 1458 PUSHs(cx->blk_eval.cur_text);
3280af22 1459 PUSHs(&PL_sv_no);
06a5b730 1460 }
1461 else if (cx->blk_eval.old_name) { /* Try blocks have old_name == 0. */
1462 /* Require, put the name. */
1463 PUSHs(sv_2mortal(newSVpv(cx->blk_eval.old_name, 0)));
3280af22 1464 PUSHs(&PL_sv_yes);
06a5b730 1465 }
4633a7c4 1466 }
a682de96
GS
1467 else {
1468 PUSHs(&PL_sv_undef);
1469 PUSHs(&PL_sv_undef);
1470 }
1471 if (CxTYPE(cx) == CXt_SUB && cx->blk_sub.hasargs
1472 && PL_curcop->cop_stash == PL_debstash)
4633a7c4 1473 {
a0d0e21e
LW
1474 AV *ary = cx->blk_sub.argarray;
1475 int off = AvARRAY(ary) - AvALLOC(ary);
1476
3280af22 1477 if (!PL_dbargs) {
a0d0e21e 1478 GV* tmpgv;
3280af22 1479 PL_dbargs = GvAV(gv_AVadd(tmpgv = gv_fetchpv("DB::args", TRUE,
a0d0e21e 1480 SVt_PVAV)));
a5f75d66 1481 GvMULTI_on(tmpgv);
3280af22 1482 AvREAL_off(PL_dbargs); /* XXX Should be REIFY */
a0d0e21e
LW
1483 }
1484
3280af22
NIS
1485 if (AvMAX(PL_dbargs) < AvFILLp(ary) + off)
1486 av_extend(PL_dbargs, AvFILLp(ary) + off);
1487 Copy(AvALLOC(ary), AvARRAY(PL_dbargs), AvFILLp(ary) + 1 + off, SV*);
1488 AvFILLp(PL_dbargs) = AvFILLp(ary) + off;
a0d0e21e 1489 }
f3aa04c2
GS
1490 /* XXX only hints propagated via op_private are currently
1491 * visible (others are not easily accessible, since they
1492 * use the global PL_hints) */
1493 PUSHs(sv_2mortal(newSViv((I32)cx->blk_oldcop->op_private &
1494 HINT_PRIVATE_MASK)));
a0d0e21e
LW
1495 RETURN;
1496}
1497
a0d0e21e
LW
1498PP(pp_reset)
1499{
4e35701f 1500 djSP;
a0d0e21e 1501 char *tmps;
2d8e6c8d 1502 STRLEN n_a;
a0d0e21e
LW
1503
1504 if (MAXARG < 1)
1505 tmps = "";
1506 else
2d8e6c8d 1507 tmps = POPpx;
3280af22
NIS
1508 sv_reset(tmps, PL_curcop->cop_stash);
1509 PUSHs(&PL_sv_yes);
a0d0e21e
LW
1510 RETURN;
1511}
1512
1513PP(pp_lineseq)
1514{
1515 return NORMAL;
1516}
1517
1518PP(pp_dbstate)
1519{
533c011a 1520 PL_curcop = (COP*)PL_op;
a0d0e21e 1521 TAINT_NOT; /* Each statement is presumed innocent */
3280af22 1522 PL_stack_sp = PL_stack_base + cxstack[cxstack_ix].blk_oldsp;
a0d0e21e
LW
1523 FREETMPS;
1524
533c011a 1525 if (PL_op->op_private || SvIV(PL_DBsingle) || SvIV(PL_DBsignal) || SvIV(PL_DBtrace))
a0d0e21e 1526 {
924508f0 1527 djSP;
a0d0e21e 1528 register CV *cv;
c09156bb 1529 register PERL_CONTEXT *cx;
748a9306 1530 I32 gimme = G_ARRAY;
a0d0e21e
LW
1531 I32 hasargs;
1532 GV *gv;
1533
3280af22 1534 gv = PL_DBgv;
a0d0e21e 1535 cv = GvCV(gv);
a0d0e21e 1536 if (!cv)
cea2e8a9 1537 DIE(aTHX_ "No DB::DB routine defined");
a0d0e21e 1538
3280af22 1539 if (CvDEPTH(cv) >= 1 && !(PL_debug & (1<<30))) /* don't do recursive DB::DB call */
a0d0e21e 1540 return NORMAL;
748a9306 1541
4633a7c4
LW
1542 ENTER;
1543 SAVETMPS;
1544
3280af22 1545 SAVEI32(PL_debug);
55497cff 1546 SAVESTACK_POS();
3280af22 1547 PL_debug = 0;
748a9306 1548 hasargs = 0;
924508f0 1549 SPAGAIN;
748a9306 1550
533c011a 1551 push_return(PL_op->op_next);
924508f0 1552 PUSHBLOCK(cx, CXt_SUB, SP);
a0d0e21e
LW
1553 PUSHSUB(cx);
1554 CvDEPTH(cv)++;
1555 (void)SvREFCNT_inc(cv);
3280af22
NIS
1556 SAVESPTR(PL_curpad);
1557 PL_curpad = AvARRAY((AV*)*av_fetch(CvPADLIST(cv),1,FALSE));
a0d0e21e
LW
1558 RETURNOP(CvSTART(cv));
1559 }
1560 else
1561 return NORMAL;
1562}
1563
1564PP(pp_scope)
1565{
1566 return NORMAL;
1567}
1568
1569PP(pp_enteriter)
1570{
4e35701f 1571 djSP; dMARK;
c09156bb 1572 register PERL_CONTEXT *cx;
54310121 1573 I32 gimme = GIMME_V;
a0d0e21e
LW
1574 SV **svp;
1575
4633a7c4
LW
1576 ENTER;
1577 SAVETMPS;
1578
54b9620d 1579#ifdef USE_THREADS
0214ae40
GS
1580 if (PL_op->op_flags & OPf_SPECIAL) {
1581 dTHR;
1582 svp = &THREADSV(PL_op->op_targ); /* per-thread variable */
1583 SAVEGENERICSV(*svp);
1584 *svp = NEWSV(0,0);
1585 }
a0d0e21e 1586 else
54b9620d 1587#endif /* USE_THREADS */
533c011a
NIS
1588 if (PL_op->op_targ) {
1589 svp = &PL_curpad[PL_op->op_targ]; /* "my" variable */
54b9620d
MB
1590 SAVESPTR(*svp);
1591 }
1592 else {
0214ae40
GS
1593 svp = &GvSV((GV*)POPs); /* symbol table variable */
1594 SAVEGENERICSV(*svp);
1595 *svp = NEWSV(0,0);
54b9620d 1596 }
4633a7c4 1597
a0d0e21e
LW
1598 ENTER;
1599
1600 PUSHBLOCK(cx, CXt_LOOP, SP);
1601 PUSHLOOP(cx, svp, MARK);
533c011a 1602 if (PL_op->op_flags & OPf_STACKED) {
44a8e56a 1603 cx->blk_loop.iterary = (AV*)SvREFCNT_inc(POPs);
89ea2908
GA
1604 if (SvTYPE(cx->blk_loop.iterary) != SVt_PVAV) {
1605 dPOPss;
1606 if (SvNIOKp(sv) || !SvPOKp(sv) ||
1607 (looks_like_number(sv) && *SvPVX(sv) != '0')) {
1608 if (SvNV(sv) < IV_MIN ||
1609 SvNV((SV*)cx->blk_loop.iterary) >= IV_MAX)
cea2e8a9 1610 Perl_croak(aTHX_ "Range iterator outside integer range");
89ea2908
GA
1611 cx->blk_loop.iterix = SvIV(sv);
1612 cx->blk_loop.itermax = SvIV((SV*)cx->blk_loop.iterary);
1613 }
1614 else
1615 cx->blk_loop.iterlval = newSVsv(sv);
1616 }
1617 }
4633a7c4 1618 else {
3280af22
NIS
1619 cx->blk_loop.iterary = PL_curstack;
1620 AvFILLp(PL_curstack) = SP - PL_stack_base;
1621 cx->blk_loop.iterix = MARK - PL_stack_base;
4633a7c4 1622 }
a0d0e21e
LW
1623
1624 RETURN;
1625}
1626
1627PP(pp_enterloop)
1628{
4e35701f 1629 djSP;
c09156bb 1630 register PERL_CONTEXT *cx;
54310121 1631 I32 gimme = GIMME_V;
a0d0e21e
LW
1632
1633 ENTER;
1634 SAVETMPS;
1635 ENTER;
1636
1637 PUSHBLOCK(cx, CXt_LOOP, SP);
1638 PUSHLOOP(cx, 0, SP);
1639
1640 RETURN;
1641}
1642
1643PP(pp_leaveloop)
1644{
4e35701f 1645 djSP;
c09156bb 1646 register PERL_CONTEXT *cx;
f86702cc 1647 struct block_loop cxloop;
a0d0e21e
LW
1648 I32 gimme;
1649 SV **newsp;
1650 PMOP *newpm;
1651 SV **mark;
1652
1653 POPBLOCK(cx,newpm);
4fdae800 1654 mark = newsp;
f86702cc 1655 POPLOOP1(cx); /* Delay POPLOOP2 until stack values are safe */
1656
a1f49e72 1657 TAINT_NOT;
54310121 1658 if (gimme == G_VOID)
1659 ; /* do nothing */
1660 else if (gimme == G_SCALAR) {
1661 if (mark < SP)
1662 *++newsp = sv_mortalcopy(*SP);
1663 else
3280af22 1664 *++newsp = &PL_sv_undef;
a0d0e21e
LW
1665 }
1666 else {
a1f49e72 1667 while (mark < SP) {
a0d0e21e 1668 *++newsp = sv_mortalcopy(*++mark);
a1f49e72
CS
1669 TAINT_NOT; /* Each item is independent */
1670 }
a0d0e21e 1671 }
f86702cc 1672 SP = newsp;
1673 PUTBACK;
1674
1675 POPLOOP2(); /* Stack values are safe: release loop vars ... */
3280af22 1676 PL_curpm = newpm; /* ... and pop $1 et al */
f86702cc 1677
a0d0e21e
LW
1678 LEAVE;
1679 LEAVE;
1680
f86702cc 1681 return NORMAL;
a0d0e21e
LW
1682}
1683
1684PP(pp_return)
1685{
4e35701f 1686 djSP; dMARK;
a0d0e21e 1687 I32 cxix;
c09156bb 1688 register PERL_CONTEXT *cx;
f86702cc 1689 struct block_sub cxsub;
1690 bool popsub2 = FALSE;
a0d0e21e
LW
1691 I32 gimme;
1692 SV **newsp;
1693 PMOP *newpm;
1694 I32 optype = 0;
1695
3280af22
NIS
1696 if (PL_curstackinfo->si_type == PERLSI_SORT) {
1697 if (cxstack_ix == PL_sortcxix || dopoptosub(cxstack_ix) <= PL_sortcxix) {
1698 if (cxstack_ix > PL_sortcxix)
1699 dounwind(PL_sortcxix);
1700 AvARRAY(PL_curstack)[1] = *SP;
1701 PL_stack_sp = PL_stack_base + 1;
a0d0e21e
LW
1702 return 0;
1703 }
1704 }
1705
1706 cxix = dopoptosub(cxstack_ix);
1707 if (cxix < 0)
cea2e8a9 1708 DIE(aTHX_ "Can't return outside a subroutine");
a0d0e21e
LW
1709 if (cxix < cxstack_ix)
1710 dounwind(cxix);
1711
1712 POPBLOCK(cx,newpm);
6b35e009 1713 switch (CxTYPE(cx)) {
a0d0e21e 1714 case CXt_SUB:
f86702cc 1715 POPSUB1(cx); /* Delay POPSUB2 until stack values are safe */
1716 popsub2 = TRUE;
a0d0e21e
LW
1717 break;
1718 case CXt_EVAL:
1719 POPEVAL(cx);
067f92a0
GS
1720 if (AvFILLp(PL_comppad_name) >= 0)
1721 free_closures();
1722 lex_end();
748a9306
LW
1723 if (optype == OP_REQUIRE &&
1724 (MARK == SP || (gimme == G_SCALAR && !SvTRUE(*SP))) )
1725 {
54310121 1726 /* Unassume the success we assumed earlier. */
748a9306 1727 char *name = cx->blk_eval.old_name;
3280af22 1728 (void)hv_delete(GvHVn(PL_incgv), name, strlen(name), G_DISCARD);
cea2e8a9 1729 DIE(aTHX_ "%s did not return a true value", name);
748a9306 1730 }
a0d0e21e
LW
1731 break;
1732 default:
cea2e8a9 1733 DIE(aTHX_ "panic: return");
a0d0e21e
LW
1734 }
1735
a1f49e72 1736 TAINT_NOT;
a0d0e21e 1737 if (gimme == G_SCALAR) {
a29cdaf0
IZ
1738 if (MARK < SP) {
1739 if (popsub2) {
1740 if (cxsub.cv && CvDEPTH(cxsub.cv) > 1) {
1741 if (SvTEMP(TOPs)) {
1742 *++newsp = SvREFCNT_inc(*SP);
1743 FREETMPS;
1744 sv_2mortal(*newsp);
1745 } else {
1746 FREETMPS;
1747 *++newsp = sv_mortalcopy(*SP);
1748 }
1749 } else
1750 *++newsp = (SvTEMP(*SP)) ? *SP : sv_mortalcopy(*SP);
1751 } else
1752 *++newsp = sv_mortalcopy(*SP);
1753 } else
3280af22 1754 *++newsp = &PL_sv_undef;
a0d0e21e 1755 }
54310121 1756 else if (gimme == G_ARRAY) {
a1f49e72 1757 while (++MARK <= SP) {
f86702cc 1758 *++newsp = (popsub2 && SvTEMP(*MARK))
1759 ? *MARK : sv_mortalcopy(*MARK);
a1f49e72
CS
1760 TAINT_NOT; /* Each item is independent */
1761 }
a0d0e21e 1762 }
3280af22 1763 PL_stack_sp = newsp;
a0d0e21e 1764
f86702cc 1765 /* Stack values are safe: */
1766 if (popsub2) {
1767 POPSUB2(); /* release CV and @_ ... */
1768 }
3280af22 1769 PL_curpm = newpm; /* ... and pop $1 et al */
f86702cc 1770
a0d0e21e
LW
1771 LEAVE;
1772 return pop_return();
1773}
1774
1775PP(pp_last)
1776{
4e35701f 1777 djSP;
a0d0e21e 1778 I32 cxix;
c09156bb 1779 register PERL_CONTEXT *cx;
f86702cc 1780 struct block_loop cxloop;
1781 struct block_sub cxsub;
1782 I32 pop2 = 0;
a0d0e21e
LW
1783 I32 gimme;
1784 I32 optype;
1785 OP *nextop;
1786 SV **newsp;
1787 PMOP *newpm;
3280af22 1788 SV **mark = PL_stack_base + cxstack[cxstack_ix].blk_oldsp;
a0d0e21e 1789
533c011a 1790 if (PL_op->op_flags & OPf_SPECIAL) {
a0d0e21e
LW
1791 cxix = dopoptoloop(cxstack_ix);
1792 if (cxix < 0)
cea2e8a9 1793 DIE(aTHX_ "Can't \"last\" outside a block");
a0d0e21e
LW
1794 }
1795 else {
1796 cxix = dopoptolabel(cPVOP->op_pv);
1797 if (cxix < 0)
cea2e8a9 1798 DIE(aTHX_ "Label not found for \"last %s\"", cPVOP->op_pv);
a0d0e21e
LW
1799 }
1800 if (cxix < cxstack_ix)
1801 dounwind(cxix);
1802
1803 POPBLOCK(cx,newpm);
6b35e009 1804 switch (CxTYPE(cx)) {
a0d0e21e 1805 case CXt_LOOP:
f86702cc 1806 POPLOOP1(cx); /* Delay POPLOOP2 until stack values are safe */
1807 pop2 = CXt_LOOP;
4fdae800 1808 nextop = cxloop.last_op->op_next;
a0d0e21e 1809 break;
f86702cc 1810 case CXt_SUB:
1811 POPSUB1(cx); /* Delay POPSUB2 until stack values are safe */
1812 pop2 = CXt_SUB;
a0d0e21e
LW
1813 nextop = pop_return();
1814 break;
f86702cc 1815 case CXt_EVAL:
1816 POPEVAL(cx);
a0d0e21e
LW
1817 nextop = pop_return();
1818 break;
1819 default:
cea2e8a9 1820 DIE(aTHX_ "panic: last");
a0d0e21e
LW
1821 }
1822
a1f49e72 1823 TAINT_NOT;
a0d0e21e 1824 if (gimme == G_SCALAR) {
f86702cc 1825 if (MARK < SP)
1826 *++newsp = ((pop2 == CXt_SUB) && SvTEMP(*SP))
1827 ? *SP : sv_mortalcopy(*SP);
a0d0e21e 1828 else
3280af22 1829 *++newsp = &PL_sv_undef;
a0d0e21e 1830 }
54310121 1831 else if (gimme == G_ARRAY) {
a1f49e72 1832 while (++MARK <= SP) {
f86702cc 1833 *++newsp = ((pop2 == CXt_SUB) && SvTEMP(*MARK))
1834 ? *MARK : sv_mortalcopy(*MARK);
a1f49e72
CS
1835 TAINT_NOT; /* Each item is independent */
1836 }
f86702cc 1837 }
1838 SP = newsp;
1839 PUTBACK;
1840
1841 /* Stack values are safe: */
1842 switch (pop2) {
1843 case CXt_LOOP:
1844 POPLOOP2(); /* release loop vars ... */
4fdae800 1845 LEAVE;
f86702cc 1846 break;
1847 case CXt_SUB:
1848 POPSUB2(); /* release CV and @_ ... */
1849 break;
a0d0e21e 1850 }
3280af22 1851 PL_curpm = newpm; /* ... and pop $1 et al */
a0d0e21e
LW
1852
1853 LEAVE;
f86702cc 1854 return nextop;
a0d0e21e
LW
1855}
1856
1857PP(pp_next)
1858{
1859 I32 cxix;
c09156bb 1860 register PERL_CONTEXT *cx;
a0d0e21e
LW
1861 I32 oldsave;
1862
533c011a 1863 if (PL_op->op_flags & OPf_SPECIAL) {
a0d0e21e
LW
1864 cxix = dopoptoloop(cxstack_ix);
1865 if (cxix < 0)
cea2e8a9 1866 DIE(aTHX_ "Can't \"next\" outside a block");
a0d0e21e
LW
1867 }
1868 else {
1869 cxix = dopoptolabel(cPVOP->op_pv);
1870 if (cxix < 0)
cea2e8a9 1871 DIE(aTHX_ "Label not found for \"next %s\"", cPVOP->op_pv);
a0d0e21e
LW
1872 }
1873 if (cxix < cxstack_ix)
1874 dounwind(cxix);
1875
1876 TOPBLOCK(cx);
3280af22 1877 oldsave = PL_scopestack[PL_scopestack_ix - 1];
a0d0e21e
LW
1878 LEAVE_SCOPE(oldsave);
1879 return cx->blk_loop.next_op;
1880}
1881
1882PP(pp_redo)
1883{
1884 I32 cxix;
c09156bb 1885 register PERL_CONTEXT *cx;
a0d0e21e
LW
1886 I32 oldsave;
1887
533c011a 1888 if (PL_op->op_flags & OPf_SPECIAL) {
a0d0e21e
LW
1889 cxix = dopoptoloop(cxstack_ix);
1890 if (cxix < 0)
cea2e8a9 1891 DIE(aTHX_ "Can't \"redo\" outside a block");
a0d0e21e
LW
1892 }
1893 else {
1894 cxix = dopoptolabel(cPVOP->op_pv);
1895 if (cxix < 0)
cea2e8a9 1896 DIE(aTHX_ "Label not found for \"redo %s\"", cPVOP->op_pv);
a0d0e21e
LW
1897 }
1898 if (cxix < cxstack_ix)
1899 dounwind(cxix);
1900
1901 TOPBLOCK(cx);
3280af22 1902 oldsave = PL_scopestack[PL_scopestack_ix - 1];
a0d0e21e
LW
1903 LEAVE_SCOPE(oldsave);
1904 return cx->blk_loop.redo_op;
1905}
1906
0824fdcb 1907STATIC OP *
cea2e8a9 1908S_dofindlabel(pTHX_ OP *o, char *label, OP **opstack, OP **oplimit)
a0d0e21e
LW
1909{
1910 OP *kid;
1911 OP **ops = opstack;
fc36a67e 1912 static char too_deep[] = "Target of goto is too deeply nested";
a0d0e21e 1913
fc36a67e 1914 if (ops >= oplimit)
cea2e8a9 1915 Perl_croak(aTHX_ too_deep);
11343788
MB
1916 if (o->op_type == OP_LEAVE ||
1917 o->op_type == OP_SCOPE ||
1918 o->op_type == OP_LEAVELOOP ||
1919 o->op_type == OP_LEAVETRY)
fc36a67e 1920 {
5dc0d613 1921 *ops++ = cUNOPo->op_first;
fc36a67e 1922 if (ops >= oplimit)
cea2e8a9 1923 Perl_croak(aTHX_ too_deep);
fc36a67e 1924 }
c4aa4e48 1925 *ops = 0;
11343788 1926 if (o->op_flags & OPf_KIDS) {
5c0ca799 1927 dTHR;
a0d0e21e 1928 /* First try all the kids at this level, since that's likeliest. */
11343788 1929 for (kid = cUNOPo->op_first; kid; kid = kid->op_sibling) {
c4aa4e48
GS
1930 if ((kid->op_type == OP_NEXTSTATE || kid->op_type == OP_DBSTATE) &&
1931 kCOP->cop_label && strEQ(kCOP->cop_label, label))
a0d0e21e
LW
1932 return kid;
1933 }
11343788 1934 for (kid = cUNOPo->op_first; kid; kid = kid->op_sibling) {
3280af22 1935 if (kid == PL_lastgotoprobe)
a0d0e21e 1936 continue;
c4aa4e48
GS
1937 if ((kid->op_type == OP_NEXTSTATE || kid->op_type == OP_DBSTATE) &&
1938 (ops == opstack ||
1939 (ops[-1]->op_type != OP_NEXTSTATE &&
1940 ops[-1]->op_type != OP_DBSTATE)))
fc36a67e 1941 *ops++ = kid;
5dc0d613 1942 if (o = dofindlabel(kid, label, ops, oplimit))
11343788 1943 return o;
a0d0e21e
LW
1944 }
1945 }
c4aa4e48 1946 *ops = 0;
a0d0e21e
LW
1947 return 0;
1948}
1949
1950PP(pp_dump)
1951{
cea2e8a9 1952 return pp_goto();
a0d0e21e
LW
1953 /*NOTREACHED*/
1954}
1955
1956PP(pp_goto)
1957{
4e35701f 1958 djSP;
a0d0e21e
LW
1959 OP *retop = 0;
1960 I32 ix;
c09156bb 1961 register PERL_CONTEXT *cx;
fc36a67e 1962#define GOTO_DEPTH 64
1963 OP *enterops[GOTO_DEPTH];
a0d0e21e 1964 char *label;
533c011a 1965 int do_dump = (PL_op->op_type == OP_DUMP);
1614b0e3 1966 static char must_have_label[] = "goto must have label";
a0d0e21e
LW
1967
1968 label = 0;
533c011a 1969 if (PL_op->op_flags & OPf_STACKED) {
a0d0e21e 1970 SV *sv = POPs;
2d8e6c8d 1971 STRLEN n_a;
a0d0e21e
LW
1972
1973 /* This egregious kludge implements goto &subroutine */
1974 if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVCV) {
1975 I32 cxix;
c09156bb 1976 register PERL_CONTEXT *cx;
a0d0e21e
LW
1977 CV* cv = (CV*)SvRV(sv);
1978 SV** mark;
1979 I32 items = 0;
1980 I32 oldsave;
62b1ebc2 1981 int arg_was_real = 0;
a0d0e21e 1982
e8f7dd13 1983 retry:
4aa0a1f7 1984 if (!CvROOT(cv) && !CvXSUB(cv)) {
e8f7dd13
GS
1985 GV *gv = CvGV(cv);
1986 GV *autogv;
1987 if (gv) {
1988 SV *tmpstr;
1989 /* autoloaded stub? */
1990 if (cv != GvCV(gv) && (cv = GvCV(gv)))
1991 goto retry;
1992 autogv = gv_autoload4(GvSTASH(gv), GvNAME(gv),
1993 GvNAMELEN(gv), FALSE);
1994 if (autogv && (cv = GvCV(autogv)))
1995 goto retry;
1996 tmpstr = sv_newmortal();
1997 gv_efullname3(tmpstr, gv, Nullch);
cea2e8a9 1998 DIE(aTHX_ "Goto undefined subroutine &%s",SvPVX(tmpstr));
4aa0a1f7 1999 }
cea2e8a9 2000 DIE(aTHX_ "Goto undefined subroutine");
4aa0a1f7
AD
2001 }
2002
a0d0e21e
LW
2003 /* First do some returnish stuff. */
2004 cxix = dopoptosub(cxstack_ix);
2005 if (cxix < 0)
cea2e8a9 2006 DIE(aTHX_ "Can't goto subroutine outside a subroutine");
a0d0e21e
LW
2007 if (cxix < cxstack_ix)
2008 dounwind(cxix);
2009 TOPBLOCK(cx);
6b35e009 2010 if (CxTYPE(cx) == CXt_EVAL && cx->blk_eval.old_op_type == OP_ENTEREVAL)
cea2e8a9 2011 DIE(aTHX_ "Can't goto subroutine from an eval-string");
3280af22 2012 mark = PL_stack_sp;
6b35e009 2013 if (CxTYPE(cx) == CXt_SUB &&
b150fb22 2014 cx->blk_sub.hasargs) { /* put @_ back onto stack */
a0d0e21e
LW
2015 AV* av = cx->blk_sub.argarray;
2016
93965878 2017 items = AvFILLp(av) + 1;
3280af22
NIS
2018 PL_stack_sp++;
2019 EXTEND(PL_stack_sp, items); /* @_ could have been extended. */
2020 Copy(AvARRAY(av), PL_stack_sp, items, SV*);
2021 PL_stack_sp += items;
6d4ff0d2 2022#ifndef USE_THREADS
3280af22
NIS
2023 SvREFCNT_dec(GvAV(PL_defgv));
2024 GvAV(PL_defgv) = cx->blk_sub.savearray;
6d4ff0d2 2025#endif /* USE_THREADS */
62b1ebc2
GS
2026 if (AvREAL(av)) {
2027 arg_was_real = 1;
2028 AvREAL_off(av); /* so av_clear() won't clobber elts */
2029 }
4633a7c4 2030 av_clear(av);
a0d0e21e 2031 }
1fa4e549
AD
2032 else if (CvXSUB(cv)) { /* put GvAV(defgv) back onto stack */
2033 AV* av;
2034 int i;
2035#ifdef USE_THREADS
533c011a 2036 av = (AV*)PL_curpad[0];
1fa4e549 2037#else
3280af22 2038 av = GvAV(PL_defgv);
1fa4e549
AD
2039#endif
2040 items = AvFILLp(av) + 1;
3280af22
NIS
2041 PL_stack_sp++;
2042 EXTEND(PL_stack_sp, items); /* @_ could have been extended. */
2043 Copy(AvARRAY(av), PL_stack_sp, items, SV*);
2044 PL_stack_sp += items;
1fa4e549 2045 }
6b35e009 2046 if (CxTYPE(cx) == CXt_SUB &&
b150fb22 2047 !(CvDEPTH(cx->blk_sub.cv) = cx->blk_sub.olddepth))
a0d0e21e 2048 SvREFCNT_dec(cx->blk_sub.cv);
3280af22 2049 oldsave = PL_scopestack[PL_scopestack_ix - 1];
a0d0e21e
LW
2050 LEAVE_SCOPE(oldsave);
2051
2052 /* Now do some callish stuff. */
2053 SAVETMPS;
2054 if (CvXSUB(cv)) {
67caa1fe 2055#ifdef PERL_XSUB_OLDSTYLE
a0d0e21e 2056 if (CvOLDSTYLE(cv)) {
20ce7b12 2057 I32 (*fp3)(int,int,int);
924508f0
GS
2058 while (SP > mark) {
2059 SP[1] = SP[0];
2060 SP--;
a0d0e21e 2061 }
20ce7b12 2062 fp3 = (I32(*)(int,int,int)))CvXSUB(cv;
ecfc5424 2063 items = (*fp3)(CvXSUBANY(cv).any_i32,
3280af22 2064 mark - PL_stack_base + 1,
ecfc5424 2065 items);
3280af22 2066 SP = PL_stack_base + items;
a0d0e21e 2067 }
67caa1fe
GS
2068 else
2069#endif /* PERL_XSUB_OLDSTYLE */
2070 {
1fa4e549
AD
2071 SV **newsp;
2072 I32 gimme;
2073
3280af22 2074 PL_stack_sp--; /* There is no cv arg. */
1fa4e549
AD
2075 /* Push a mark for the start of arglist */
2076 PUSHMARK(mark);
0cb96387 2077 (void)(*CvXSUB(cv))(aTHXo_ cv);
1fa4e549 2078 /* Pop the current context like a decent sub should */
3280af22 2079 POPBLOCK(cx, PL_curpm);
1fa4e549 2080 /* Do _not_ use PUTBACK, keep the XSUB's return stack! */
a0d0e21e
LW
2081 }
2082 LEAVE;
2083 return pop_return();
2084 }
2085 else {
2086 AV* padlist = CvPADLIST(cv);
2087 SV** svp = AvARRAY(padlist);
6b35e009 2088 if (CxTYPE(cx) == CXt_EVAL) {
3280af22
NIS
2089 PL_in_eval = cx->blk_eval.old_in_eval;
2090 PL_eval_root = cx->blk_eval.old_eval_root;
b150fb22
RH
2091 cx->cx_type = CXt_SUB;
2092 cx->blk_sub.hasargs = 0;
2093 }
a0d0e21e
LW
2094 cx->blk_sub.cv = cv;
2095 cx->blk_sub.olddepth = CvDEPTH(cv);
2096 CvDEPTH(cv)++;
2097 if (CvDEPTH(cv) < 2)
2098 (void)SvREFCNT_inc(cv);
2099 else { /* save temporaries on recursion? */
599cee73 2100 if (CvDEPTH(cv) == 100 && ckWARN(WARN_RECURSION))
44a8e56a 2101 sub_crush_depth(cv);
93965878 2102 if (CvDEPTH(cv) > AvFILLp(padlist)) {
a0d0e21e 2103 AV *newpad = newAV();
4aa0a1f7 2104 SV **oldpad = AvARRAY(svp[CvDEPTH(cv)-1]);
93965878 2105 I32 ix = AvFILLp((AV*)svp[1]);
a0d0e21e 2106 svp = AvARRAY(svp[0]);
748a9306 2107 for ( ;ix > 0; ix--) {
3280af22 2108 if (svp[ix] != &PL_sv_undef) {
748a9306 2109 char *name = SvPVX(svp[ix]);
5f05dabc 2110 if ((SvFLAGS(svp[ix]) & SVf_FAKE)
2111 || *name == '&')
2112 {
2113 /* outer lexical or anon code */
748a9306 2114 av_store(newpad, ix,
4aa0a1f7 2115 SvREFCNT_inc(oldpad[ix]) );
748a9306
LW
2116 }
2117 else { /* our own lexical */
2118 if (*name == '@')
2119 av_store(newpad, ix, sv = (SV*)newAV());
2120 else if (*name == '%')
2121 av_store(newpad, ix, sv = (SV*)newHV());
2122 else
2123 av_store(newpad, ix, sv = NEWSV(0,0));
2124 SvPADMY_on(sv);
2125 }
a0d0e21e
LW
2126 }
2127 else {
748a9306 2128 av_store(newpad, ix, sv = NEWSV(0,0));
a0d0e21e
LW
2129 SvPADTMP_on(sv);
2130 }
2131 }
2132 if (cx->blk_sub.hasargs) {
2133 AV* av = newAV();
2134 av_extend(av, 0);
2135 av_store(newpad, 0, (SV*)av);
2136 AvFLAGS(av) = AVf_REIFY;
2137 }
2138 av_store(padlist, CvDEPTH(cv), (SV*)newpad);
93965878 2139 AvFILLp(padlist) = CvDEPTH(cv);
a0d0e21e
LW
2140 svp = AvARRAY(padlist);
2141 }
2142 }
6d4ff0d2
MB
2143#ifdef USE_THREADS
2144 if (!cx->blk_sub.hasargs) {
533c011a 2145 AV* av = (AV*)PL_curpad[0];
6d4ff0d2 2146
93965878 2147 items = AvFILLp(av) + 1;
6d4ff0d2
MB
2148 if (items) {
2149 /* Mark is at the end of the stack. */
924508f0
GS
2150 EXTEND(SP, items);
2151 Copy(AvARRAY(av), SP + 1, items, SV*);
2152 SP += items;
6d4ff0d2
MB
2153 PUTBACK ;
2154 }
2155 }
2156#endif /* USE_THREADS */
3280af22
NIS
2157 SAVESPTR(PL_curpad);
2158 PL_curpad = AvARRAY((AV*)svp[CvDEPTH(cv)]);
6d4ff0d2
MB
2159#ifndef USE_THREADS
2160 if (cx->blk_sub.hasargs)
2161#endif /* USE_THREADS */
2162 {
3280af22 2163 AV* av = (AV*)PL_curpad[0];
a0d0e21e
LW
2164 SV** ary;
2165
6d4ff0d2 2166#ifndef USE_THREADS
3280af22
NIS
2167 cx->blk_sub.savearray = GvAV(PL_defgv);
2168 GvAV(PL_defgv) = (AV*)SvREFCNT_inc(av);
6d4ff0d2
MB
2169#endif /* USE_THREADS */
2170 cx->blk_sub.argarray = av;
a0d0e21e
LW
2171 ++mark;
2172
2173 if (items >= AvMAX(av) + 1) {
2174 ary = AvALLOC(av);
2175 if (AvARRAY(av) != ary) {
2176 AvMAX(av) += AvARRAY(av) - AvALLOC(av);
2177 SvPVX(av) = (char*)ary;
2178 }
2179 if (items >= AvMAX(av) + 1) {
2180 AvMAX(av) = items - 1;
2181 Renew(ary,items+1,SV*);
2182 AvALLOC(av) = ary;
2183 SvPVX(av) = (char*)ary;
2184 }
2185 }
2186 Copy(mark,AvARRAY(av),items,SV*);
93965878 2187 AvFILLp(av) = items - 1;
62b1ebc2
GS
2188 /* preserve @_ nature */
2189 if (arg_was_real) {
2190 AvREIFY_off(av);
2191 AvREAL_on(av);
2192 }
a0d0e21e
LW
2193 while (items--) {
2194 if (*mark)
2195 SvTEMP_off(*mark);
2196 mark++;
2197 }
2198 }
491527d0 2199 if (PERLDB_SUB) { /* Checking curstash breaks DProf. */
44a8e56a 2200 /*
2201 * We do not care about using sv to call CV;
2202 * it's for informational purposes only.
2203 */
3280af22 2204 SV *sv = GvSV(PL_DBsub);
491527d0
GS
2205 CV *gotocv;
2206
2207 if (PERLDB_SUB_NN) {
2208 SvIVX(sv) = (IV)cv; /* Already upgraded, saved */
2209 } else {
2210 save_item(sv);
2211 gv_efullname3(sv, CvGV(cv), Nullch);
2212 }
2213 if ( PERLDB_GOTO
864dbfa3 2214 && (gotocv = get_cv("DB::goto", FALSE)) ) {
3280af22 2215 PUSHMARK( PL_stack_sp );
864dbfa3 2216 call_sv((SV*)gotocv, G_SCALAR | G_NODEBUG);
3280af22 2217 PL_stack_sp--;
491527d0 2218 }
1ce6579f 2219 }
a0d0e21e
LW
2220 RETURNOP(CvSTART(cv));
2221 }
2222 }
1614b0e3 2223 else {
2d8e6c8d 2224 label = SvPV(sv,n_a);
1614b0e3 2225 if (!(do_dump || *label))
cea2e8a9 2226 DIE(aTHX_ must_have_label);
1614b0e3 2227 }
a0d0e21e 2228 }
533c011a 2229 else if (PL_op->op_flags & OPf_SPECIAL) {
a0d0e21e 2230 if (! do_dump)
cea2e8a9 2231 DIE(aTHX_ must_have_label);
a0d0e21e
LW
2232 }
2233 else
2234 label = cPVOP->op_pv;
2235
2236 if (label && *label) {
2237 OP *gotoprobe = 0;
2238
2239 /* find label */
2240
3280af22 2241 PL_lastgotoprobe = 0;
a0d0e21e
LW
2242 *enterops = 0;
2243 for (ix = cxstack_ix; ix >= 0; ix--) {
2244 cx = &cxstack[ix];
6b35e009 2245 switch (CxTYPE(cx)) {
a0d0e21e 2246 case CXt_EVAL:
3280af22 2247 gotoprobe = PL_eval_root; /* XXX not good for nested eval */
a0d0e21e
LW
2248 break;
2249 case CXt_LOOP:
2250 gotoprobe = cx->blk_oldcop->op_sibling;
2251 break;
2252 case CXt_SUBST:
2253 continue;
2254 case CXt_BLOCK:
2255 if (ix)
2256 gotoprobe = cx->blk_oldcop->op_sibling;
2257 else
3280af22 2258 gotoprobe = PL_main_root;
a0d0e21e 2259 break;
b3933176
CS
2260 case CXt_SUB:
2261 if (CvDEPTH(cx->blk_sub.cv)) {
2262 gotoprobe = CvROOT(cx->blk_sub.cv);
2263 break;
2264 }
2265 /* FALL THROUGH */
0a753a76 2266 case CXt_NULL:
cea2e8a9 2267 DIE(aTHX_ "Can't \"goto\" outside a block");
a0d0e21e
LW
2268 default:
2269 if (ix)
cea2e8a9 2270 DIE(aTHX_ "panic: goto");
3280af22 2271 gotoprobe = PL_main_root;
a0d0e21e
LW
2272 break;
2273 }
fc36a67e 2274 retop = dofindlabel(gotoprobe, label,
2275 enterops, enterops + GOTO_DEPTH);
a0d0e21e
LW
2276 if (retop)
2277 break;
3280af22 2278 PL_lastgotoprobe = gotoprobe;
a0d0e21e
LW
2279 }
2280 if (!retop)
cea2e8a9 2281 DIE(aTHX_ "Can't find label %s", label);
a0d0e21e
LW
2282
2283 /* pop unwanted frames */
2284
2285 if (ix < cxstack_ix) {
2286 I32 oldsave;
2287
2288 if (ix < 0)
2289 ix = 0;
2290 dounwind(ix);
2291 TOPBLOCK(cx);
3280af22 2292 oldsave = PL_scopestack[PL_scopestack_ix];
a0d0e21e
LW
2293 LEAVE_SCOPE(oldsave);
2294 }
2295
2296 /* push wanted frames */
2297
748a9306 2298 if (*enterops && enterops[1]) {
533c011a 2299 OP *oldop = PL_op;
748a9306 2300 for (ix = 1; enterops[ix]; ix++) {
533c011a 2301 PL_op = enterops[ix];
84902520
TB
2302 /* Eventually we may want to stack the needed arguments
2303 * for each op. For now, we punt on the hard ones. */
533c011a 2304 if (PL_op->op_type == OP_ENTERITER)
cea2e8a9 2305 DIE(aTHX_ "Can't \"goto\" into the middle of a foreach loop",
84902520 2306 label);
cea2e8a9 2307 (CALLOP->op_ppaddr)(aTHX);
a0d0e21e 2308 }
533c011a 2309 PL_op = oldop;
a0d0e21e
LW
2310 }
2311 }
2312
2313 if (do_dump) {
a5f75d66 2314#ifdef VMS
6b88bc9c 2315 if (!retop) retop = PL_main_start;
a5f75d66 2316#endif
3280af22
NIS
2317 PL_restartop = retop;
2318 PL_do_undump = TRUE;
a0d0e21e
LW
2319
2320 my_unexec();
2321
3280af22
NIS
2322 PL_restartop = 0; /* hmm, must be GNU unexec().. */
2323 PL_do_undump = FALSE;
a0d0e21e
LW
2324 }
2325
2326 RETURNOP(retop);
2327}
2328
2329PP(pp_exit)
2330{
4e35701f 2331 djSP;
a0d0e21e
LW
2332 I32 anum;
2333
2334 if (MAXARG < 1)
2335 anum = 0;
ff0cee69 2336 else {
a0d0e21e 2337 anum = SvIVx(POPs);
ff0cee69 2338#ifdef VMSISH_EXIT
2339 if (anum == 1 && VMSISH_EXIT)
2340 anum = 0;
2341#endif
2342 }
a0d0e21e 2343 my_exit(anum);
3280af22 2344 PUSHs(&PL_sv_undef);
a0d0e21e
LW
2345 RETURN;
2346}
2347
2348#ifdef NOTYET
2349PP(pp_nswitch)
2350{
4e35701f 2351 djSP;
65202027 2352 NV value = SvNVx(GvSV(cCOP->cop_gv));
a0d0e21e
LW
2353 register I32 match = I_32(value);
2354
2355 if (value < 0.0) {
65202027 2356 if (((NV)match) > value)
a0d0e21e
LW
2357 --match; /* was fractional--truncate other way */
2358 }
2359 match -= cCOP->uop.scop.scop_offset;
2360 if (match < 0)
2361 match = 0;
2362 else if (match > cCOP->uop.scop.scop_max)
2363 match = cCOP->uop.scop.scop_max;
6b88bc9c
GS
2364 PL_op = cCOP->uop.scop.scop_next[match];
2365 RETURNOP(PL_op);
a0d0e21e
LW
2366}
2367
2368PP(pp_cswitch)
2369{
4e35701f 2370 djSP;
a0d0e21e
LW
2371 register I32 match;
2372
6b88bc9c
GS
2373 if (PL_multiline)
2374 PL_op = PL_op->op_next; /* can't assume anything */
a0d0e21e 2375 else {
2d8e6c8d
GS
2376 STRLEN n_a;
2377 match = *(SvPVx(GvSV(cCOP->cop_gv), n_a)) & 255;
a0d0e21e
LW
2378 match -= cCOP->uop.scop.scop_offset;
2379 if (match < 0)
2380 match = 0;
2381 else if (match > cCOP->uop.scop.scop_max)
2382 match = cCOP->uop.scop.scop_max;
6b88bc9c 2383 PL_op = cCOP->uop.scop.scop_next[match];
a0d0e21e 2384 }
6b88bc9c 2385 RETURNOP(PL_op);
a0d0e21e
LW
2386}
2387#endif
2388
2389/* Eval. */
2390
0824fdcb 2391STATIC void
cea2e8a9 2392S_save_lines(pTHX_ AV *array, SV *sv)
a0d0e21e
LW
2393{
2394 register char *s = SvPVX(sv);
2395 register char *send = SvPVX(sv) + SvCUR(sv);
2396 register char *t;
2397 register I32 line = 1;
2398
2399 while (s && s < send) {
2400 SV *tmpstr = NEWSV(85,0);
2401
2402 sv_upgrade(tmpstr, SVt_PVMG);
2403 t = strchr(s, '\n');
2404 if (t)
2405 t++;
2406 else
2407 t = send;
2408
2409 sv_setpvn(tmpstr, s, t - s);
2410 av_store(array, line++, tmpstr);
2411 s = t;
2412 }
2413}
2414
312caa8e 2415STATIC void *
cea2e8a9 2416S_docatch_body(pTHX_ va_list args)
312caa8e 2417{
cea2e8a9 2418 CALLRUNOPS(aTHX);
312caa8e
CS
2419 return NULL;
2420}
2421
0824fdcb 2422STATIC OP *
cea2e8a9 2423S_docatch(pTHX_ OP *o)
1e422769 2424{
e858de61 2425 dTHR;
6224f72b 2426 int ret;
533c011a 2427 OP *oldop = PL_op;
1e422769 2428
1e422769 2429#ifdef DEBUGGING
54310121 2430 assert(CATCH_GET == TRUE);
1e422769 2431#endif
312caa8e
CS
2432 PL_op = o;
2433 redo_body:
0b94c7bb 2434 CALLPROTECT(aTHX_ &ret, MEMBER_TO_FPTR(S_docatch_body));
6224f72b 2435 switch (ret) {
312caa8e
CS
2436 case 0:
2437 break;
2438 case 3:
2439 if (PL_restartop) {
2440 PL_op = PL_restartop;
2441 PL_restartop = 0;
2442 goto redo_body;
2443 }
2444 /* FALL THROUGH */
2445 default:
533c011a 2446 PL_op = oldop;
6224f72b 2447 JMPENV_JUMP(ret);
1e422769 2448 /* NOTREACHED */
1e422769 2449 }
533c011a 2450 PL_op = oldop;
1e422769 2451 return Nullop;
2452}
2453
c277df42 2454OP *
864dbfa3 2455Perl_sv_compile_2op(pTHX_ SV *sv, OP** startop, char *code, AV** avp)
c277df42
IZ
2456/* sv Text to convert to OP tree. */
2457/* startop op_free() this to undo. */
2458/* code Short string id of the caller. */
2459{
2460 dSP; /* Make POPBLOCK work. */
2461 PERL_CONTEXT *cx;
2462 SV **newsp;
f987c7de 2463 I32 gimme = 0; /* SUSPECT - INITIALZE TO WHAT? NI-S */
c277df42
IZ
2464 I32 optype;
2465 OP dummy;
533c011a 2466 OP *oop = PL_op, *rop;
c277df42
IZ
2467 char tmpbuf[TYPE_DIGITS(long) + 12 + 10];
2468 char *safestr;
2469
2470 ENTER;
2471 lex_start(sv);
2472 SAVETMPS;
2473 /* switch to eval mode */
2474
cbce877f
IZ
2475 if (PL_curcop == &PL_compiling) {
2476 SAVESPTR(PL_compiling.cop_stash);
2477 PL_compiling.cop_stash = PL_curstash;
2478 }
3280af22
NIS
2479 SAVESPTR(PL_compiling.cop_filegv);
2480 SAVEI16(PL_compiling.cop_line);
2481 sprintf(tmpbuf, "_<(%.10s_eval %lu)", code, (unsigned long)++PL_evalseq);
2482 PL_compiling.cop_filegv = gv_fetchfile(tmpbuf+2);
2483 PL_compiling.cop_line = 1;
c277df42
IZ
2484 /* XXX For C<eval "...">s within BEGIN {} blocks, this ends up
2485 deleting the eval's FILEGV from the stash before gv_check() runs
2486 (i.e. before run-time proper). To work around the coredump that
2487 ensues, we always turn GvMULTI_on for any globals that were
2488 introduced within evals. See force_ident(). GSAR 96-10-12 */
2489 safestr = savepv(tmpbuf);
3280af22 2490 SAVEDELETE(PL_defstash, safestr, strlen(safestr));
b3ac6de7 2491 SAVEHINTS();
d1ca3daa 2492#ifdef OP_IN_REGISTER
6b88bc9c 2493 PL_opsave = op;
d1ca3daa 2494#else
533c011a 2495 SAVEPPTR(PL_op);
d1ca3daa 2496#endif
3280af22 2497 PL_hints = 0;
c277df42 2498
533c011a 2499 PL_op = &dummy;
13b51b79 2500 PL_op->op_type = OP_ENTEREVAL;
533c011a 2501 PL_op->op_flags = 0; /* Avoid uninit warning. */
c277df42 2502 PUSHBLOCK(cx, CXt_EVAL, SP);
6b88bc9c 2503 PUSHEVAL(cx, 0, PL_compiling.cop_filegv);
c277df42 2504 rop = doeval(G_SCALAR, startop);
13b51b79 2505 POPBLOCK(cx,PL_curpm);
e84b9f1f 2506 POPEVAL(cx);
c277df42
IZ
2507
2508 (*startop)->op_type = OP_NULL;
22c35a8c 2509 (*startop)->op_ppaddr = PL_ppaddr[OP_NULL];
c277df42 2510 lex_end();
3280af22 2511 *avp = (AV*)SvREFCNT_inc(PL_comppad);
c277df42 2512 LEAVE;
13b51b79 2513 if (PL_curcop == &PL_compiling)
a0ed51b3 2514 PL_compiling.op_private = PL_hints;
d1ca3daa 2515#ifdef OP_IN_REGISTER
6b88bc9c 2516 op = PL_opsave;
d1ca3daa 2517#endif
c277df42
IZ
2518 return rop;
2519}
2520
0f15f207 2521/* With USE_THREADS, eval_owner must be held on entry to doeval */
0824fdcb 2522STATIC OP *
cea2e8a9 2523S_doeval(pTHX_ int gimme, OP** startop)
a0d0e21e
LW
2524{
2525 dSP;
533c011a 2526 OP *saveop = PL_op;
a0d0e21e 2527 HV *newstash;
ff3ff8d1 2528 CV *caller;
748a9306 2529 AV* comppadlist;
67a38de0 2530 I32 i;
a0d0e21e 2531
faef0170 2532 PL_in_eval = EVAL_INEVAL;
a0d0e21e 2533
1ce6579f 2534 PUSHMARK(SP);
2535
a0d0e21e
LW
2536 /* set up a scratch pad */
2537
3280af22
NIS
2538 SAVEI32(PL_padix);
2539 SAVESPTR(PL_curpad);
2540 SAVESPTR(PL_comppad);
2541 SAVESPTR(PL_comppad_name);
2542 SAVEI32(PL_comppad_name_fill);
2543 SAVEI32(PL_min_intro_pending);
2544 SAVEI32(PL_max_intro_pending);
748a9306 2545
3280af22 2546 caller = PL_compcv;
6b35e009 2547 for (i = cxstack_ix - 1; i >= 0; i--) {
67a38de0 2548 PERL_CONTEXT *cx = &cxstack[i];
6b35e009 2549 if (CxTYPE(cx) == CXt_EVAL)
67a38de0 2550 break;
6b35e009 2551 else if (CxTYPE(cx) == CXt_SUB) {
67a38de0
NIS
2552 caller = cx->blk_sub.cv;
2553 break;
2554 }
2555 }
2556
3280af22
NIS
2557 SAVESPTR(PL_compcv);
2558 PL_compcv = (CV*)NEWSV(1104,0);
2559 sv_upgrade((SV *)PL_compcv, SVt_PVCV);
1aff0e91 2560 CvEVAL_on(PL_compcv);
11343788 2561#ifdef USE_THREADS
533c011a
NIS
2562 CvOWNER(PL_compcv) = 0;
2563 New(666, CvMUTEXP(PL_compcv), 1, perl_mutex);
2564 MUTEX_INIT(CvMUTEXP(PL_compcv));
11343788 2565#endif /* USE_THREADS */
748a9306 2566
3280af22
NIS
2567 PL_comppad = newAV();
2568 av_push(PL_comppad, Nullsv);
2569 PL_curpad = AvARRAY(PL_comppad);
2570 PL_comppad_name = newAV();
2571 PL_comppad_name_fill = 0;
2572 PL_min_intro_pending = 0;
2573 PL_padix = 0;
11343788 2574#ifdef USE_THREADS
79cb57f6 2575 av_store(PL_comppad_name, 0, newSVpvn("@_", 2));
533c011a
NIS
2576 PL_curpad[0] = (SV*)newAV();
2577 SvPADMY_on(PL_curpad[0]); /* XXX Needed? */
11343788 2578#endif /* USE_THREADS */
a0d0e21e 2579
748a9306
LW
2580 comppadlist = newAV();
2581 AvREAL_off(comppadlist);
3280af22
NIS
2582 av_store(comppadlist, 0, (SV*)PL_comppad_name);
2583 av_store(comppadlist, 1, (SV*)PL_comppad);
2584 CvPADLIST(PL_compcv) = comppadlist;
2c05e328 2585
c277df42 2586 if (!saveop || saveop->op_type != OP_REQUIRE)
3280af22 2587 CvOUTSIDE(PL_compcv) = (CV*)SvREFCNT_inc(caller);
07055b4c 2588
3280af22 2589 SAVEFREESV(PL_compcv);
748a9306 2590
a0d0e21e
LW
2591 /* make sure we compile in the right package */
2592
3280af22
NIS
2593 newstash = PL_curcop->cop_stash;
2594 if (PL_curstash != newstash) {
2595 SAVESPTR(PL_curstash);
2596 PL_curstash = newstash;
a0d0e21e 2597 }
3280af22
NIS
2598 SAVESPTR(PL_beginav);
2599 PL_beginav = newAV();
2600 SAVEFREESV(PL_beginav);
a0d0e21e
LW
2601
2602 /* try to compile it */
2603
3280af22
NIS
2604 PL_eval_root = Nullop;
2605 PL_error_count = 0;
2606 PL_curcop = &PL_compiling;
2607 PL_curcop->cop_arybase = 0;
2608 SvREFCNT_dec(PL_rs);
79cb57f6 2609 PL_rs = newSVpvn("\n", 1);
c277df42 2610 if (saveop && saveop->op_flags & OPf_SPECIAL)
faef0170 2611 PL_in_eval |= EVAL_KEEPERR;
1ce6579f 2612 else
38a03e6e 2613 sv_setpv(ERRSV,"");
3280af22 2614 if (yyparse() || PL_error_count || !PL_eval_root) {
a0d0e21e
LW
2615 SV **newsp;
2616 I32 gimme;
c09156bb 2617 PERL_CONTEXT *cx;
c277df42 2618 I32 optype = 0; /* Might be reset by POPEVAL. */
2d8e6c8d 2619 STRLEN n_a;
097ee67d 2620
533c011a 2621 PL_op = saveop;
3280af22
NIS
2622 if (PL_eval_root) {
2623 op_free(PL_eval_root);
2624 PL_eval_root = Nullop;
a0d0e21e 2625 }
3280af22 2626 SP = PL_stack_base + POPMARK; /* pop original mark */
c277df42 2627 if (!startop) {
3280af22 2628 POPBLOCK(cx,PL_curpm);
c277df42
IZ
2629 POPEVAL(cx);
2630 pop_return();
2631 }
a0d0e21e
LW
2632 lex_end();
2633 LEAVE;
7a2e2cd6 2634 if (optype == OP_REQUIRE) {
2d8e6c8d 2635 char* msg = SvPVx(ERRSV, n_a);
cea2e8a9 2636 DIE(aTHX_ "%s", *msg ? msg : "Compilation failed in require");
c277df42 2637 } else if (startop) {
2d8e6c8d 2638 char* msg = SvPVx(ERRSV, n_a);
c277df42 2639
3280af22 2640 POPBLOCK(cx,PL_curpm);
c277df42 2641 POPEVAL(cx);
cea2e8a9 2642 Perl_croak(aTHX_ "%sCompilation failed in regexp", (*msg ? msg : "Unknown error\n"));
7a2e2cd6 2643 }
3280af22
NIS
2644 SvREFCNT_dec(PL_rs);
2645 PL_rs = SvREFCNT_inc(PL_nrs);
f2134d95 2646#ifdef USE_THREADS
533c011a
NIS
2647 MUTEX_LOCK(&PL_eval_mutex);
2648 PL_eval_owner = 0;
2649 COND_SIGNAL(&PL_eval_cond);
2650 MUTEX_UNLOCK(&PL_eval_mutex);
f2134d95 2651#endif /* USE_THREADS */
a0d0e21e
LW
2652 RETPUSHUNDEF;
2653 }
3280af22
NIS
2654 SvREFCNT_dec(PL_rs);
2655 PL_rs = SvREFCNT_inc(PL_nrs);
2656 PL_compiling.cop_line = 0;
c277df42 2657 if (startop) {
3280af22
NIS
2658 *startop = PL_eval_root;
2659 SvREFCNT_dec(CvOUTSIDE(PL_compcv));
2660 CvOUTSIDE(PL_compcv) = Nullcv;
c277df42 2661 } else
3280af22 2662 SAVEFREEOP(PL_eval_root);
54310121 2663 if (gimme & G_VOID)
3280af22 2664 scalarvoid(PL_eval_root);
54310121 2665 else if (gimme & G_ARRAY)
3280af22 2666 list(PL_eval_root);
a0d0e21e 2667 else
3280af22 2668 scalar(PL_eval_root);
a0d0e21e
LW
2669
2670 DEBUG_x(dump_eval());
2671
55497cff 2672 /* Register with debugger: */
84902520 2673 if (PERLDB_INTER && saveop->op_type == OP_REQUIRE) {
864dbfa3 2674 CV *cv = get_cv("DB::postponed", FALSE);
55497cff 2675 if (cv) {
2676 dSP;
924508f0 2677 PUSHMARK(SP);
3280af22 2678 XPUSHs((SV*)PL_compiling.cop_filegv);
55497cff 2679 PUTBACK;
864dbfa3 2680 call_sv((SV*)cv, G_DISCARD);
55497cff 2681 }
2682 }
2683
a0d0e21e
LW
2684 /* compiled okay, so do it */
2685
3280af22
NIS
2686 CvDEPTH(PL_compcv) = 1;
2687 SP = PL_stack_base + POPMARK; /* pop original mark */
533c011a 2688 PL_op = saveop; /* The caller may need it. */
b35b2403 2689#ifdef USE_THREADS
533c011a
NIS
2690 MUTEX_LOCK(&PL_eval_mutex);
2691 PL_eval_owner = 0;
2692 COND_SIGNAL(&PL_eval_cond);
2693 MUTEX_UNLOCK(&PL_eval_mutex);
b35b2403 2694#endif /* USE_THREADS */
5dc0d613 2695
3280af22 2696 RETURNOP(PL_eval_start);
a0d0e21e
LW
2697}
2698
a6c40364 2699STATIC PerlIO *
cea2e8a9 2700S_doopen_pmc(pTHX_ const char *name, const char *mode)
b295d113
TH
2701{
2702 STRLEN namelen = strlen(name);
2703 PerlIO *fp;
2704
7894fbab 2705 if (namelen > 3 && strEQ(name + namelen - 3, ".pm")) {
cea2e8a9 2706 SV *pmcsv = Perl_newSVpvf(aTHX_ "%s%c", name, 'c');
b295d113
TH
2707 char *pmc = SvPV_nolen(pmcsv);
2708 Stat_t pmstat;
a6c40364
GS
2709 Stat_t pmcstat;
2710 if (PerlLIO_stat(pmc, &pmcstat) < 0) {
b295d113 2711 fp = PerlIO_open(name, mode);
a6c40364
GS
2712 }
2713 else {
b295d113 2714 if (PerlLIO_stat(name, &pmstat) < 0 ||
a6c40364
GS
2715 pmstat.st_mtime < pmcstat.st_mtime)
2716 {
2717 fp = PerlIO_open(pmc, mode);
2718 }
2719 else {
2720 fp = PerlIO_open(name, mode);
2721 }
b295d113 2722 }
a6c40364
GS
2723 SvREFCNT_dec(pmcsv);
2724 }
2725 else {
2726 fp = PerlIO_open(name, mode);
b295d113 2727 }
b295d113
TH
2728 return fp;
2729}
2730
a0d0e21e
LW
2731PP(pp_require)
2732{
4e35701f 2733 djSP;
c09156bb 2734 register PERL_CONTEXT *cx;
a0d0e21e
LW
2735 SV *sv;
2736 char *name;
6132ea6c 2737 STRLEN len;
46fc3d4c 2738 char *tryname;
2739 SV *namesv = Nullsv;
a0d0e21e
LW
2740 SV** svp;
2741 I32 gimme = G_SCALAR;
760ac839 2742 PerlIO *tryrsfp = 0;
2d8e6c8d 2743 STRLEN n_a;
bbed91b5
KF
2744 int filter_has_file = 0;
2745 GV *filter_child_proc = 0;
2746 SV *filter_state = 0;
2747 SV *filter_sub = 0;
a0d0e21e
LW
2748
2749 sv = POPs;
4633a7c4 2750 if (SvNIOKp(sv) && !SvPOKp(sv)) {
097ee67d 2751 if (Atof(PL_patchlevel) + 0.00000999 < SvNV(sv))
cea2e8a9 2752 DIE(aTHX_ "Perl %s required--this is only version %s, stopped",
2d8e6c8d 2753 SvPV(sv,n_a),PL_patchlevel);
a0d0e21e
LW
2754 RETPUSHYES;
2755 }
6132ea6c
GS
2756 name = SvPV(sv, len);
2757 if (!(name && len > 0 && *name))
cea2e8a9 2758 DIE(aTHX_ "Null filename used");
4633a7c4 2759 TAINT_PROPER("require");
533c011a 2760 if (PL_op->op_type == OP_REQUIRE &&
3280af22
NIS
2761 (svp = hv_fetch(GvHVn(PL_incgv), name, len, 0)) &&
2762 *svp != &PL_sv_undef)
a0d0e21e
LW
2763 RETPUSHYES;
2764
2765 /* prepare to compile file */
2766
46fc3d4c 2767 if (*name == '/' ||
2768 (*name == '.' &&
2769 (name[1] == '/' ||
2770 (name[1] == '.' && name[2] == '/')))
4633a7c4 2771#ifdef DOSISH
46fc3d4c 2772 || (name[0] && name[1] == ':')
4633a7c4 2773#endif
ba42ef2f
WJ
2774#ifdef WIN32
2775 || (name[0] == '\\' && name[1] == '\\') /* UNC path */
2776#endif
748a9306 2777#ifdef VMS
46fc3d4c 2778 || (strchr(name,':') || ((*name == '[' || *name == '<') &&
2779 (isALNUM(name[1]) || strchr("$-_]>",name[1]))))
748a9306
LW
2780#endif
2781 )
a0d0e21e 2782 {
46fc3d4c 2783 tryname = name;
a6c40364 2784 tryrsfp = doopen_pmc(name,PERL_SCRIPT_MODE);
a0d0e21e
LW
2785 }
2786 else {
3280af22 2787 AV *ar = GvAVn(PL_incgv);
a0d0e21e 2788 I32 i;
748a9306 2789#ifdef VMS
46fc3d4c 2790 char *unixname;
2791 if ((unixname = tounixspec(name, Nullch)) != Nullch)
2792#endif
2793 {
2794 namesv = NEWSV(806, 0);
2795 for (i = 0; i <= AvFILL(ar); i++) {
bbed91b5
KF
2796 SV *dirsv = *av_fetch(ar, i, TRUE);
2797
2798 if (SvROK(dirsv)) {
2799 int count;
2800 SV *loader = dirsv;
2801
2802 if (SvTYPE(SvRV(loader)) == SVt_PVAV) {
2803 loader = *av_fetch((AV *)SvRV(loader), 0, TRUE);
2804 }
2805
2806 Perl_sv_setpvf(aTHX_ namesv, "/loader/0x%lx/%s",
2807 SvANY(loader), name);
2808 tryname = SvPVX(namesv);
2809 tryrsfp = 0;
2810
2811 ENTER;
2812 SAVETMPS;
2813 EXTEND(SP, 2);
2814
2815 PUSHMARK(SP);
2816 PUSHs(dirsv);
2817 PUSHs(sv);
2818 PUTBACK;
2819 count = call_sv(loader, G_ARRAY);
2820 SPAGAIN;
2821
2822 if (count > 0) {
2823 int i = 0;
2824 SV *arg;
2825
2826 SP -= count - 1;
2827 arg = SP[i++];
2828
2829 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVGV) {
2830 arg = SvRV(arg);
2831 }
2832
2833 if (SvTYPE(arg) == SVt_PVGV) {
2834 IO *io = GvIO((GV *)arg);
2835
2836 ++filter_has_file;
2837
2838 if (io) {
2839 tryrsfp = IoIFP(io);
2840 if (IoTYPE(io) == '|') {
2841 /* reading from a child process doesn't
2842 nest -- when returning from reading
2843 the inner module, the outer one is
2844 unreadable (closed?) I've tried to
2845 save the gv to manage the lifespan of
2846 the pipe, but this didn't help. XXX */
2847 filter_child_proc = (GV *)arg;
520c758a 2848 (void)SvREFCNT_inc(filter_child_proc);
bbed91b5
KF
2849 }
2850 else {
2851 if (IoOFP(io) && IoOFP(io) != IoIFP(io)) {
2852 PerlIO_close(IoOFP(io));
2853 }
2854 IoIFP(io) = Nullfp;
2855 IoOFP(io) = Nullfp;
2856 }
2857 }
2858
2859 if (i < count) {
2860 arg = SP[i++];
2861 }
2862 }
2863
2864 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVCV) {
2865 filter_sub = arg;
520c758a 2866 (void)SvREFCNT_inc(filter_sub);
bbed91b5
KF
2867
2868 if (i < count) {
2869 filter_state = SP[i];
520c758a 2870 (void)SvREFCNT_inc(filter_state);
bbed91b5
KF
2871 }
2872
2873 if (tryrsfp == 0) {
2874 tryrsfp = PerlIO_open("/dev/null",
2875 PERL_SCRIPT_MODE);
2876 }
2877 }
2878 }
2879
2880 PUTBACK;
2881 FREETMPS;
2882 LEAVE;
2883
2884 if (tryrsfp) {
2885 break;
2886 }
2887
2888 filter_has_file = 0;
2889 if (filter_child_proc) {
2890 SvREFCNT_dec(filter_child_proc);
2891 filter_child_proc = 0;
2892 }
2893 if (filter_state) {
2894 SvREFCNT_dec(filter_state);
2895 filter_state = 0;
2896 }
2897 if (filter_sub) {
2898 SvREFCNT_dec(filter_sub);
2899 filter_sub = 0;
2900 }
2901 }
2902 else {
2903 char *dir = SvPVx(dirsv, n_a);
46fc3d4c 2904#ifdef VMS
bbed91b5
KF
2905 char *unixdir;
2906 if ((unixdir = tounixpath(dir, Nullch)) == Nullch)
2907 continue;
2908 sv_setpv(namesv, unixdir);
2909 sv_catpv(namesv, unixname);
748a9306 2910#else
bbed91b5 2911 Perl_sv_setpvf(aTHX_ namesv, "%s/%s", dir, name);
748a9306 2912#endif
bbed91b5
KF
2913 TAINT_PROPER("require");
2914 tryname = SvPVX(namesv);
2915 tryrsfp = doopen_pmc(tryname, PERL_SCRIPT_MODE);
2916 if (tryrsfp) {
2917 if (tryname[0] == '.' && tryname[1] == '/')
2918 tryname += 2;
2919 break;
2920 }
46fc3d4c 2921 }
a0d0e21e
LW
2922 }
2923 }
2924 }
3280af22
NIS
2925 SAVESPTR(PL_compiling.cop_filegv);
2926 PL_compiling.cop_filegv = gv_fetchfile(tryrsfp ? tryname : name);
46fc3d4c 2927 SvREFCNT_dec(namesv);
a0d0e21e 2928 if (!tryrsfp) {
533c011a 2929 if (PL_op->op_type == OP_REQUIRE) {
ec889f3a
GS
2930 char *msgstr = name;
2931 if (namesv) { /* did we lookup @INC? */
2932 SV *msg = sv_2mortal(newSVpv(msgstr,0));
2933 SV *dirmsgsv = NEWSV(0, 0);
2934 AV *ar = GvAVn(PL_incgv);
2935 I32 i;
2936 sv_catpvn(msg, " in @INC", 8);
2937 if (instr(SvPVX(msg), ".h "))
2938 sv_catpv(msg, " (change .h to .ph maybe?)");
2939 if (instr(SvPVX(msg), ".ph "))
2940 sv_catpv(msg, " (did you run h2ph?)");
2941 sv_catpv(msg, " (@INC contains:");
2942 for (i = 0; i <= AvFILL(ar); i++) {
2943 char *dir = SvPVx(*av_fetch(ar, i, TRUE), n_a);
cea2e8a9 2944 Perl_sv_setpvf(aTHX_ dirmsgsv, " %s", dir);
ec889f3a
GS
2945 sv_catsv(msg, dirmsgsv);
2946 }
2947 sv_catpvn(msg, ")", 1);
2948 SvREFCNT_dec(dirmsgsv);
2949 msgstr = SvPV_nolen(msg);
2683423c 2950 }
cea2e8a9 2951 DIE(aTHX_ "Can't locate %s", msgstr);
a0d0e21e
LW
2952 }
2953
2954 RETPUSHUNDEF;
2955 }
d8bfb8bd 2956 else
aba27d88 2957 SETERRNO(0, SS$_NORMAL);
a0d0e21e
LW
2958
2959 /* Assume success here to prevent recursive requirement. */
3280af22
NIS
2960 (void)hv_store(GvHVn(PL_incgv), name, strlen(name),
2961 newSVsv(GvSV(PL_compiling.cop_filegv)), 0 );
a0d0e21e
LW
2962
2963 ENTER;
2964 SAVETMPS;
79cb57f6 2965 lex_start(sv_2mortal(newSVpvn("",0)));
b9d12d37
GS
2966 SAVEGENERICSV(PL_rsfp_filters);
2967 PL_rsfp_filters = Nullav;
e50aee73 2968
3280af22 2969 PL_rsfp = tryrsfp;
a0d0e21e
LW
2970 name = savepv(name);
2971 SAVEFREEPV(name);
b3ac6de7 2972 SAVEHINTS();
3280af22 2973 PL_hints = 0;
599cee73 2974 SAVEPPTR(PL_compiling.cop_warnings);
0453d815
PM
2975 if (PL_dowarn & G_WARN_ALL_ON)
2976 PL_compiling.cop_warnings = WARN_ALL ;
2977 else if (PL_dowarn & G_WARN_ALL_OFF)
2978 PL_compiling.cop_warnings = WARN_NONE ;
2979 else
2980 PL_compiling.cop_warnings = WARN_STD ;
a0d0e21e 2981
bbed91b5
KF
2982 if (filter_sub || filter_child_proc) {
2983 SV *datasv = filter_add(run_user_filter, Nullsv);
2984 IoLINES(datasv) = filter_has_file;
2985 IoFMT_GV(datasv) = (GV *)filter_child_proc;
2986 IoTOP_GV(datasv) = (GV *)filter_state;
2987 IoBOTTOM_GV(datasv) = (GV *)filter_sub;
2988 }
2989
2990 /* switch to eval mode */
533c011a 2991 push_return(PL_op->op_next);
a0d0e21e 2992 PUSHBLOCK(cx, CXt_EVAL, SP);
6b88bc9c 2993 PUSHEVAL(cx, name, PL_compiling.cop_filegv);
a0d0e21e 2994
63eb823a 2995 SAVEI16(PL_compiling.cop_line);
3280af22 2996 PL_compiling.cop_line = 0;
a0d0e21e
LW
2997
2998 PUTBACK;
0f15f207 2999#ifdef USE_THREADS
533c011a
NIS
3000 MUTEX_LOCK(&PL_eval_mutex);
3001 if (PL_eval_owner && PL_eval_owner != thr)
3002 while (PL_eval_owner)
3003 COND_WAIT(&PL_eval_cond, &PL_eval_mutex);
3004 PL_eval_owner = thr;
3005 MUTEX_UNLOCK(&PL_eval_mutex);
0f15f207 3006#endif /* USE_THREADS */
c277df42 3007 return DOCATCH(doeval(G_SCALAR, NULL));
a0d0e21e
LW
3008}
3009
3010PP(pp_dofile)
3011{
cea2e8a9 3012 return pp_require();
a0d0e21e
LW
3013}
3014
3015PP(pp_entereval)
3016{
4e35701f 3017 djSP;
c09156bb 3018 register PERL_CONTEXT *cx;
a0d0e21e 3019 dPOPss;
3280af22 3020 I32 gimme = GIMME_V, was = PL_sub_generation;
fc36a67e 3021 char tmpbuf[TYPE_DIGITS(long) + 12];
3022 char *safestr;
a0d0e21e 3023 STRLEN len;
55497cff 3024 OP *ret;
a0d0e21e
LW
3025
3026 if (!SvPV(sv,len) || !len)
3027 RETPUSHUNDEF;
748a9306 3028 TAINT_PROPER("eval");
a0d0e21e
LW
3029
3030 ENTER;
a0d0e21e 3031 lex_start(sv);
748a9306 3032 SAVETMPS;
a0d0e21e
LW
3033
3034 /* switch to eval mode */
3035
3280af22
NIS
3036 SAVESPTR(PL_compiling.cop_filegv);
3037 sprintf(tmpbuf, "_<(eval %lu)", (unsigned long)++PL_evalseq);
3038 PL_compiling.cop_filegv = gv_fetchfile(tmpbuf+2);
3039 PL_compiling.cop_line = 1;
55497cff 3040 /* XXX For C<eval "...">s within BEGIN {} blocks, this ends up
3041 deleting the eval's FILEGV from the stash before gv_check() runs
3042 (i.e. before run-time proper). To work around the coredump that
3043 ensues, we always turn GvMULTI_on for any globals that were
3044 introduced within evals. See force_ident(). GSAR 96-10-12 */
3045 safestr = savepv(tmpbuf);
3280af22 3046 SAVEDELETE(PL_defstash, safestr, strlen(safestr));
b3ac6de7 3047 SAVEHINTS();
533c011a 3048 PL_hints = PL_op->op_targ;
e24b16f9 3049 SAVEPPTR(PL_compiling.cop_warnings);
0453d815 3050 if (!specialWARN(PL_compiling.cop_warnings)) {
599cee73
PM
3051 PL_compiling.cop_warnings = newSVsv(PL_compiling.cop_warnings) ;
3052 SAVEFREESV(PL_compiling.cop_warnings) ;
3053 }
a0d0e21e 3054
533c011a 3055 push_return(PL_op->op_next);
6b35e009 3056 PUSHBLOCK(cx, (CXt_EVAL|CXp_REAL), SP);
6b88bc9c 3057 PUSHEVAL(cx, 0, PL_compiling.cop_filegv);
a0d0e21e
LW
3058
3059 /* prepare to compile string */
3060
3280af22
NIS
3061 if (PERLDB_LINE && PL_curstash != PL_debstash)
3062 save_lines(GvAV(PL_compiling.cop_filegv), PL_linestr);
a0d0e21e 3063 PUTBACK;
0f15f207 3064#ifdef USE_THREADS
533c011a
NIS
3065 MUTEX_LOCK(&PL_eval_mutex);
3066 if (PL_eval_owner && PL_eval_owner != thr)
3067 while (PL_eval_owner)
3068 COND_WAIT(&PL_eval_cond, &PL_eval_mutex);
3069 PL_eval_owner = thr;
3070 MUTEX_UNLOCK(&PL_eval_mutex);
0f15f207 3071#endif /* USE_THREADS */
c277df42 3072 ret = doeval(gimme, NULL);
3280af22 3073 if (PERLDB_INTER && was != PL_sub_generation /* Some subs defined here. */
533c011a 3074 && ret != PL_op->op_next) { /* Successive compilation. */
55497cff 3075 strcpy(safestr, "_<(eval )"); /* Anything fake and short. */
3076 }
1e422769 3077 return DOCATCH(ret);
a0d0e21e
LW
3078}
3079
3080PP(pp_leaveeval)
3081{
4e35701f 3082 djSP;
a0d0e21e
LW
3083 register SV **mark;
3084 SV **newsp;
3085 PMOP *newpm;
3086 I32 gimme;
c09156bb 3087 register PERL_CONTEXT *cx;
a0d0e21e 3088 OP *retop;
533c011a 3089 U8 save_flags = PL_op -> op_flags;
a0d0e21e
LW
3090 I32 optype;
3091
3092 POPBLOCK(cx,newpm);
3093 POPEVAL(cx);
3094 retop = pop_return();
3095
a1f49e72 3096 TAINT_NOT;
54310121 3097 if (gimme == G_VOID)
3098 MARK = newsp;
3099 else if (gimme == G_SCALAR) {
3100 MARK = newsp + 1;
3101 if (MARK <= SP) {
3102 if (SvFLAGS(TOPs) & SVs_TEMP)
3103 *MARK = TOPs;
3104 else
3105 *MARK = sv_mortalcopy(TOPs);
3106 }
a0d0e21e 3107 else {
54310121 3108 MEXTEND(mark,0);
3280af22 3109 *MARK = &PL_sv_undef;
a0d0e21e 3110 }
a0d0e21e
LW
3111 }
3112 else {
a1f49e72
CS
3113 /* in case LEAVE wipes old return values */
3114 for (mark = newsp + 1; mark <= SP; mark++) {
3115 if (!(SvFLAGS(*mark) & SVs_TEMP)) {
a0d0e21e 3116 *mark = sv_mortalcopy(*mark);
a1f49e72
CS
3117 TAINT_NOT; /* Each item is independent */
3118 }
3119 }
a0d0e21e 3120 }
3280af22 3121 PL_curpm = newpm; /* Don't pop $1 et al till now */
a0d0e21e 3122
067f92a0
GS
3123 if (AvFILLp(PL_comppad_name) >= 0)
3124 free_closures();
84902520 3125
4fdae800 3126#ifdef DEBUGGING
3280af22 3127 assert(CvDEPTH(PL_compcv) == 1);
4fdae800 3128#endif
3280af22 3129 CvDEPTH(PL_compcv) = 0;
f46d017c 3130 lex_end();
4fdae800 3131
1ce6579f 3132 if (optype == OP_REQUIRE &&
924508f0 3133 !(gimme == G_SCALAR ? SvTRUE(*SP) : SP > newsp))
54310121 3134 {
1ce6579f 3135 /* Unassume the success we assumed earlier. */
54310121 3136 char *name = cx->blk_eval.old_name;
3280af22 3137 (void)hv_delete(GvHVn(PL_incgv), name, strlen(name), G_DISCARD);
cea2e8a9 3138 retop = Perl_die(aTHX_ "%s did not return a true value", name);
f46d017c
GS
3139 /* die_where() did LEAVE, or we won't be here */
3140 }
3141 else {
3142 LEAVE;
3143 if (!(save_flags & OPf_SPECIAL))
3144 sv_setpv(ERRSV,"");
a0d0e21e 3145 }
a0d0e21e
LW
3146
3147 RETURNOP(retop);
3148}
3149
a0d0e21e
LW
3150PP(pp_entertry)
3151{
4e35701f 3152 djSP;
c09156bb 3153 register PERL_CONTEXT *cx;
54310121 3154 I32 gimme = GIMME_V;
a0d0e21e
LW
3155
3156 ENTER;
3157 SAVETMPS;
3158
3159 push_return(cLOGOP->op_other->op_next);
3160 PUSHBLOCK(cx, CXt_EVAL, SP);
3161 PUSHEVAL(cx, 0, 0);
533c011a 3162 PL_eval_root = PL_op; /* Only needed so that goto works right. */
a0d0e21e 3163
faef0170 3164 PL_in_eval = EVAL_INEVAL;
38a03e6e 3165 sv_setpv(ERRSV,"");
1e422769 3166 PUTBACK;
533c011a 3167 return DOCATCH(PL_op->op_next);
a0d0e21e
LW
3168}
3169
3170PP(pp_leavetry)
3171{
4e35701f 3172 djSP;
a0d0e21e
LW
3173 register SV **mark;
3174 SV **newsp;
3175 PMOP *newpm;
3176 I32 gimme;
c09156bb 3177 register PERL_CONTEXT *cx;
a0d0e21e
LW
3178 I32 optype;
3179
3180 POPBLOCK(cx,newpm);
3181 POPEVAL(cx);
3182 pop_return();
3183
a1f49e72 3184 TAINT_NOT;
54310121 3185 if (gimme == G_VOID)
3186 SP = newsp;
3187 else if (gimme == G_SCALAR) {
3188 MARK = newsp + 1;
3189 if (MARK <= SP) {
3190 if (SvFLAGS(TOPs) & (SVs_PADTMP|SVs_TEMP))
3191 *MARK = TOPs;
3192 else
3193 *MARK = sv_mortalcopy(TOPs);
3194 }
a0d0e21e 3195 else {
54310121 3196 MEXTEND(mark,0);
3280af22 3197 *MARK = &PL_sv_undef;
a0d0e21e
LW
3198 }
3199 SP = MARK;
3200 }
3201 else {
a1f49e72
CS
3202 /* in case LEAVE wipes old return values */
3203 for (mark = newsp + 1; mark <= SP; mark++) {
3204 if (!(SvFLAGS(*mark) & (SVs_PADTMP|SVs_TEMP))) {
a0d0e21e 3205 *mark = sv_mortalcopy(*mark);
a1f49e72
CS
3206 TAINT_NOT; /* Each item is independent */
3207 }
3208 }
a0d0e21e 3209 }
3280af22 3210 PL_curpm = newpm; /* Don't pop $1 et al till now */
a0d0e21e
LW
3211
3212 LEAVE;
38a03e6e 3213 sv_setpv(ERRSV,"");
a0d0e21e
LW
3214 RETURN;
3215}
3216
0824fdcb 3217STATIC void
cea2e8a9 3218S_doparseform(pTHX_ SV *sv)
a0d0e21e
LW
3219{
3220 STRLEN len;
3221 register char *s = SvPV_force(sv, len);
3222 register char *send = s + len;
3223 register char *base;
3224 register I32 skipspaces = 0;
3225 bool noblank;
3226 bool repeat;
3227 bool postspace = FALSE;
3228 U16 *fops;
3229 register U16 *fpc;
3230 U16 *linepc;
3231 register I32 arg;
3232 bool ischop;
3233
55497cff 3234 if (len == 0)
cea2e8a9 3235 Perl_croak(aTHX_ "Null picture in formline");
55497cff 3236
3237 New(804, fops, (send - s)*3+10, U16); /* Almost certainly too long... */
a0d0e21e
LW
3238 fpc = fops;
3239
3240 if (s < send) {
3241 linepc = fpc;
3242 *fpc++ = FF_LINEMARK;
3243 noblank = repeat = FALSE;
3244 base = s;
3245 }
3246
3247 while (s <= send) {
3248 switch (*s++) {
3249 default:
3250 skipspaces = 0;
3251 continue;
3252
3253 case '~':
3254 if (*s == '~') {
3255 repeat = TRUE;
3256 *s = ' ';
3257 }
3258 noblank = TRUE;
3259 s[-1] = ' ';
3260 /* FALL THROUGH */
3261 case ' ': case '\t':
3262 skipspaces++;
3263 continue;
3264
3265 case '\n': case 0:
3266 arg = s - base;
3267 skipspaces++;
3268 arg -= skipspaces;
3269 if (arg) {
5f05dabc 3270 if (postspace)
a0d0e21e 3271 *fpc++ = FF_SPACE;
a0d0e21e
LW
3272 *fpc++ = FF_LITERAL;
3273 *fpc++ = arg;
3274 }
5f05dabc 3275 postspace = FALSE;
a0d0e21e
LW
3276 if (s <= send)
3277 skipspaces--;
3278 if (skipspaces) {
3279 *fpc++ = FF_SKIP;
3280 *fpc++ = skipspaces;
3281 }
3282 skipspaces = 0;
3283 if (s <= send)
3284 *fpc++ = FF_NEWLINE;
3285 if (noblank) {
3286 *fpc++ = FF_BLANK;
3287 if (repeat)
3288 arg = fpc - linepc + 1;
3289 else
3290 arg = 0;
3291 *fpc++ = arg;
3292 }
3293 if (s < send) {
3294 linepc = fpc;
3295 *fpc++ = FF_LINEMARK;
3296 noblank = repeat = FALSE;
3297 base = s;
3298 }
3299 else
3300 s++;
3301 continue;
3302
3303 case '@':
3304 case '^':
3305 ischop = s[-1] == '^';
3306
3307 if (postspace) {
3308 *fpc++ = FF_SPACE;
3309 postspace = FALSE;
3310 }
3311 arg = (s - base) - 1;
3312 if (arg) {
3313 *fpc++ = FF_LITERAL;
3314 *fpc++ = arg;
3315 }
3316
3317 base = s - 1;
3318 *fpc++ = FF_FETCH;
3319 if (*s == '*') {
3320 s++;
3321 *fpc++ = 0;
3322 *fpc++ = FF_LINEGLOB;
3323 }
3324 else if (*s == '#' || (*s == '.' && s[1] == '#')) {
3325 arg = ischop ? 512 : 0;
3326 base = s - 1;
3327 while (*s == '#')
3328 s++;
3329 if (*s == '.') {
3330 char *f;
3331 s++;
3332 f = s;
3333 while (*s == '#')
3334 s++;
3335 arg |= 256 + (s - f);
3336 }
3337 *fpc++ = s - base; /* fieldsize for FETCH */
3338 *fpc++ = FF_DECIMAL;
3339 *fpc++ = arg;
3340 }
3341 else {
3342 I32 prespace = 0;
3343 bool ismore = FALSE;
3344
3345 if (*s == '>') {
3346 while (*++s == '>') ;
3347 prespace = FF_SPACE;
3348 }
3349 else if (*s == '|') {
3350 while (*++s == '|') ;
3351 prespace = FF_HALFSPACE;
3352 postspace = TRUE;
3353 }
3354 else {
3355 if (*s == '<')
3356 while (*++s == '<') ;
3357 postspace = TRUE;
3358 }
3359 if (*s == '.' && s[1] == '.' && s[2] == '.') {
3360 s += 3;
3361 ismore = TRUE;
3362 }
3363 *fpc++ = s - base; /* fieldsize for FETCH */
3364
3365 *fpc++ = ischop ? FF_CHECKCHOP : FF_CHECKNL;
3366
3367 if (prespace)
3368 *fpc++ = prespace;
3369 *fpc++ = FF_ITEM;
3370 if (ismore)
3371 *fpc++ = FF_MORE;
3372 if (ischop)
3373 *fpc++ = FF_CHOP;
3374 }
3375 base = s;
3376 skipspaces = 0;
3377 continue;
3378 }
3379 }
3380 *fpc++ = FF_END;
3381
3382 arg = fpc - fops;
3383 { /* need to jump to the next word */
3384 int z;
3385 z = WORD_ALIGN - SvCUR(sv) % WORD_ALIGN;
3386 SvGROW(sv, SvCUR(sv) + z + arg * sizeof(U16) + 4);
3387 s = SvPVX(sv) + SvCUR(sv) + z;
3388 }
3389 Copy(fops, s, arg, U16);
3390 Safefree(fops);
55497cff 3391 sv_magic(sv, Nullsv, 'f', Nullch, 0);
a0d0e21e
LW
3392 SvCOMPILED_on(sv);
3393}
4e35701f 3394
745d3a65
HM
3395/*
3396 * The rest of this file was derived from source code contributed
3397 * by Tom Horsley.
3398 *
3399 * NOTE: this code was derived from Tom Horsley's qsort replacement
3400 * and should not be confused with the original code.
3401 */
3402
3403/* Copyright (C) Tom Horsley, 1997. All rights reserved.
3404
3405 Permission granted to distribute under the same terms as perl which are
3406 (briefly):
3407
3408 This program is free software; you can redistribute it and/or modify
3409 it under the terms of either:
3410
3411 a) the GNU General Public License as published by the Free
3412 Software Foundation; either version 1, or (at your option) any
3413 later version, or
3414
3415 b) the "Artistic License" which comes with this Kit.
3416
3417 Details on the perl license can be found in the perl source code which
3418 may be located via the www.perl.com web page.
3419
3420 This is the most wonderfulest possible qsort I can come up with (and
3421 still be mostly portable) My (limited) tests indicate it consistently
3422 does about 20% fewer calls to compare than does the qsort in the Visual
3423 C++ library, other vendors may vary.
3424
3425 Some of the ideas in here can be found in "Algorithms" by Sedgewick,
3426 others I invented myself (or more likely re-invented since they seemed
3427 pretty obvious once I watched the algorithm operate for a while).
3428
3429 Most of this code was written while watching the Marlins sweep the Giants
3430 in the 1997 National League Playoffs - no Braves fans allowed to use this
3431 code (just kidding :-).
3432
3433 I realize that if I wanted to be true to the perl tradition, the only
3434 comment in this file would be something like:
3435
3436 ...they shuffled back towards the rear of the line. 'No, not at the
3437 rear!' the slave-driver shouted. 'Three files up. And stay there...
3438
3439 However, I really needed to violate that tradition just so I could keep
3440 track of what happens myself, not to mention some poor fool trying to
3441 understand this years from now :-).
3442*/
3443
3444/* ********************************************************** Configuration */
3445
3446#ifndef QSORT_ORDER_GUESS
3447#define QSORT_ORDER_GUESS 2 /* Select doubling version of the netBSD trick */
3448#endif
3449
3450/* QSORT_MAX_STACK is the largest number of partitions that can be stacked up for
3451 future processing - a good max upper bound is log base 2 of memory size
3452 (32 on 32 bit machines, 64 on 64 bit machines, etc). In reality can
3453 safely be smaller than that since the program is taking up some space and
3454 most operating systems only let you grab some subset of contiguous
3455 memory (not to mention that you are normally sorting data larger than
3456 1 byte element size :-).
3457*/
3458#ifndef QSORT_MAX_STACK
3459#define QSORT_MAX_STACK 32
3460#endif
3461
3462/* QSORT_BREAK_EVEN is the size of the largest partition we should insertion sort.
3463 Anything bigger and we use qsort. If you make this too small, the qsort
3464 will probably break (or become less efficient), because it doesn't expect
3465 the middle element of a partition to be the same as the right or left -
3466 you have been warned).
3467*/
3468#ifndef QSORT_BREAK_EVEN
3469#define QSORT_BREAK_EVEN 6
3470#endif
3471
3472/* ************************************************************* Data Types */
3473
3474/* hold left and right index values of a partition waiting to be sorted (the
3475 partition includes both left and right - right is NOT one past the end or
3476 anything like that).
3477*/
3478struct partition_stack_entry {
3479 int left;
3480 int right;
3481#ifdef QSORT_ORDER_GUESS
3482 int qsort_break_even;
3483#endif
3484};
3485
3486/* ******************************************************* Shorthand Macros */
3487
3488/* Note that these macros will be used from inside the qsort function where
3489 we happen to know that the variable 'elt_size' contains the size of an
3490 array element and the variable 'temp' points to enough space to hold a
3491 temp element and the variable 'array' points to the array being sorted
3492 and 'compare' is the pointer to the compare routine.
3493
3494 Also note that there are very many highly architecture specific ways
3495 these might be sped up, but this is simply the most generally portable
3496 code I could think of.
3497*/
161b471a 3498
745d3a65
HM
3499/* Return < 0 == 0 or > 0 as the value of elt1 is < elt2, == elt2, > elt2
3500*/
565764a8 3501#define qsort_cmp(elt1, elt2) \
51371543 3502 ((*compare)(aTHXo_ array[elt1], array[elt2]))
745d3a65
HM
3503
3504#ifdef QSORT_ORDER_GUESS
3505#define QSORT_NOTICE_SWAP swapped++;
3506#else
3507#define QSORT_NOTICE_SWAP
3508#endif
3509
3510/* swaps contents of array elements elt1, elt2.
3511*/
3512#define qsort_swap(elt1, elt2) \
3513 STMT_START { \
3514 QSORT_NOTICE_SWAP \
3515 temp = array[elt1]; \
3516 array[elt1] = array[elt2]; \
3517 array[elt2] = temp; \
3518 } STMT_END
3519
3520/* rotate contents of elt1, elt2, elt3 such that elt1 gets elt2, elt2 gets
3521 elt3 and elt3 gets elt1.
3522*/
3523#define qsort_rotate(elt1, elt2, elt3) \
3524 STMT_START { \
3525 QSORT_NOTICE_SWAP \
3526 temp = array[elt1]; \
3527 array[elt1] = array[elt2]; \
3528 array[elt2] = array[elt3]; \
3529 array[elt3] = temp; \
3530 } STMT_END
3531
3532/* ************************************************************ Debug stuff */
3533
3534#ifdef QSORT_DEBUG
3535
3536static void
3537break_here()
3538{
3539 return; /* good place to set a breakpoint */
3540}
3541
3542#define qsort_assert(t) (void)( (t) || (break_here(), 0) )
3543
3544static void
3545doqsort_all_asserts(
3546 void * array,
3547 size_t num_elts,
3548 size_t elt_size,
3549 int (*compare)(const void * elt1, const void * elt2),
3550 int pc_left, int pc_right, int u_left, int u_right)
3551{
3552 int i;
3553
3554 qsort_assert(pc_left <= pc_right);
3555 qsort_assert(u_right < pc_left);
3556 qsort_assert(pc_right < u_left);
3557 for (i = u_right + 1; i < pc_left; ++i) {
3558 qsort_assert(qsort_cmp(i, pc_left) < 0);
3559 }
3560 for (i = pc_left; i < pc_right; ++i) {
3561 qsort_assert(qsort_cmp(i, pc_right) == 0);
3562 }
3563 for (i = pc_right + 1; i < u_left; ++i) {
3564 qsort_assert(qsort_cmp(pc_right, i) < 0);
3565 }
3566}
3567
3568#define qsort_all_asserts(PC_LEFT, PC_RIGHT, U_LEFT, U_RIGHT) \
3569 doqsort_all_asserts(array, num_elts, elt_size, compare, \
3570 PC_LEFT, PC_RIGHT, U_LEFT, U_RIGHT)
3571
3572#else
3573
3574#define qsort_assert(t) ((void)0)
3575
3576#define qsort_all_asserts(PC_LEFT, PC_RIGHT, U_LEFT, U_RIGHT) ((void)0)
3577
3578#endif
3579
3580/* ****************************************************************** qsort */
3581
6cc33c6d 3582STATIC void
cea2e8a9 3583S_qsortsv(pTHX_ SV ** array, size_t num_elts, SVCOMPARE_t compare)
745d3a65
HM
3584{
3585 register SV * temp;
3586
3587 struct partition_stack_entry partition_stack[QSORT_MAX_STACK];
3588 int next_stack_entry = 0;
3589
3590 int part_left;
3591 int part_right;
3592#ifdef QSORT_ORDER_GUESS
3593 int qsort_break_even;
3594 int swapped;
3595#endif
161b471a 3596
745d3a65
HM
3597 /* Make sure we actually have work to do.
3598 */
3599 if (num_elts <= 1) {
3600 return;
3601 }
3602
3603 /* Setup the initial partition definition and fall into the sorting loop
3604 */
3605 part_left = 0;
3606 part_right = (int)(num_elts - 1);
3607#ifdef QSORT_ORDER_GUESS
3608 qsort_break_even = QSORT_BREAK_EVEN;
3609#else
3610#define qsort_break_even QSORT_BREAK_EVEN
3611#endif
3612 for ( ; ; ) {
3613 if ((part_right - part_left) >= qsort_break_even) {
3614 /* OK, this is gonna get hairy, so lets try to document all the
3615 concepts and abbreviations and variables and what they keep
3616 track of:
3617
3618 pc: pivot chunk - the set of array elements we accumulate in the
3619 middle of the partition, all equal in value to the original
3620 pivot element selected. The pc is defined by:
3621
3622 pc_left - the leftmost array index of the pc
3623 pc_right - the rightmost array index of the pc
3624
3625 we start with pc_left == pc_right and only one element
3626 in the pivot chunk (but it can grow during the scan).
3627
3628 u: uncompared elements - the set of elements in the partition
3629 we have not yet compared to the pivot value. There are two
3630 uncompared sets during the scan - one to the left of the pc
3631 and one to the right.
3632
3633 u_right - the rightmost index of the left side's uncompared set
3634 u_left - the leftmost index of the right side's uncompared set
3635
3636 The leftmost index of the left sides's uncompared set
3637 doesn't need its own variable because it is always defined
3638 by the leftmost edge of the whole partition (part_left). The
3639 same goes for the rightmost edge of the right partition
3640 (part_right).
3641
3642 We know there are no uncompared elements on the left once we
3643 get u_right < part_left and no uncompared elements on the
3644 right once u_left > part_right. When both these conditions
3645 are met, we have completed the scan of the partition.
3646
3647 Any elements which are between the pivot chunk and the
3648 uncompared elements should be less than the pivot value on
3649 the left side and greater than the pivot value on the right
3650 side (in fact, the goal of the whole algorithm is to arrange
3651 for that to be true and make the groups of less-than and
3652 greater-then elements into new partitions to sort again).
3653
3654 As you marvel at the complexity of the code and wonder why it
3655 has to be so confusing. Consider some of the things this level
3656 of confusion brings:
3657
3658 Once I do a compare, I squeeze every ounce of juice out of it. I
3659 never do compare calls I don't have to do, and I certainly never
3660 do redundant calls.
3661
3662 I also never swap any elements unless I can prove there is a
3663 good reason. Many sort algorithms will swap a known value with
3664 an uncompared value just to get things in the right place (or
3665 avoid complexity :-), but that uncompared value, once it gets
3666 compared, may then have to be swapped again. A lot of the
3667 complexity of this code is due to the fact that it never swaps
3668 anything except compared values, and it only swaps them when the
3669 compare shows they are out of position.
3670 */
3671 int pc_left, pc_right;
3672 int u_right, u_left;
3673
3674 int s;
3675
3676 pc_left = ((part_left + part_right) / 2);
3677 pc_right = pc_left;
3678 u_right = pc_left - 1;
3679 u_left = pc_right + 1;
3680
3681 /* Qsort works best when the pivot value is also the median value
3682 in the partition (unfortunately you can't find the median value
3683 without first sorting :-), so to give the algorithm a helping
3684 hand, we pick 3 elements and sort them and use the median value
3685 of that tiny set as the pivot value.
3686
3687 Some versions of qsort like to use the left middle and right as
3688 the 3 elements to sort so they can insure the ends of the
3689 partition will contain values which will stop the scan in the
3690 compare loop, but when you have to call an arbitrarily complex
3691 routine to do a compare, its really better to just keep track of
3692 array index values to know when you hit the edge of the
3693 partition and avoid the extra compare. An even better reason to
3694 avoid using a compare call is the fact that you can drop off the
3695 edge of the array if someone foolishly provides you with an
3696 unstable compare function that doesn't always provide consistent
3697 results.
3698
3699 So, since it is simpler for us to compare the three adjacent
3700 elements in the middle of the partition, those are the ones we
3701 pick here (conveniently pointed at by u_right, pc_left, and
3702 u_left). The values of the left, center, and right elements
3703 are refered to as l c and r in the following comments.
3704 */
3705
3706#ifdef QSORT_ORDER_GUESS
3707 swapped = 0;
3708#endif
3709 s = qsort_cmp(u_right, pc_left);
3710 if (s < 0) {
3711 /* l < c */
3712 s = qsort_cmp(pc_left, u_left);
3713 /* if l < c, c < r - already in order - nothing to do */
3714 if (s == 0) {
3715 /* l < c, c == r - already in order, pc grows */
3716 ++pc_right;
3717 qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
3718 } else if (s > 0) {
3719 /* l < c, c > r - need to know more */
3720 s = qsort_cmp(u_right, u_left);
3721 if (s < 0) {
3722 /* l < c, c > r, l < r - swap c & r to get ordered */
3723 qsort_swap(pc_left, u_left);
3724 qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
3725 } else if (s == 0) {
3726 /* l < c, c > r, l == r - swap c&r, grow pc */
3727 qsort_swap(pc_left, u_left);
3728 --pc_left;
3729 qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
3730 } else {
3731 /* l < c, c > r, l > r - make lcr into rlc to get ordered */
3732 qsort_rotate(pc_left, u_right, u_left);
3733 qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
3734 }
3735 }
3736 } else if (s == 0) {
3737 /* l == c */
3738 s = qsort_cmp(pc_left, u_left);
3739 if (s < 0) {
3740 /* l == c, c < r - already in order, grow pc */
3741 --pc_left;
3742 qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
3743 } else if (s == 0) {
3744 /* l == c, c == r - already in order, grow pc both ways */
3745 --pc_left;
3746 ++pc_right;
3747 qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
3748 } else {
3749 /* l == c, c > r - swap l & r, grow pc */
3750 qsort_swap(u_right, u_left);
3751 ++pc_right;
3752 qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
3753 }
3754 } else {
3755 /* l > c */
3756 s = qsort_cmp(pc_left, u_left);
3757 if (s < 0) {
3758 /* l > c, c < r - need to know more */
3759 s = qsort_cmp(u_right, u_left);
3760 if (s < 0) {
3761 /* l > c, c < r, l < r - swap l & c to get ordered */
3762 qsort_swap(u_right, pc_left);
3763 qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
3764 } else if (s == 0) {
3765 /* l > c, c < r, l == r - swap l & c, grow pc */
3766 qsort_swap(u_right, pc_left);
3767 ++pc_right;
3768 qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
3769 } else {
3770 /* l > c, c < r, l > r - rotate lcr into crl to order */
3771 qsort_rotate(u_right, pc_left, u_left);
3772 qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
3773 }
3774 } else if (s == 0) {
3775 /* l > c, c == r - swap ends, grow pc */
3776 qsort_swap(u_right, u_left);
3777 --pc_left;
3778 qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
3779 } else {
3780 /* l > c, c > r - swap ends to get in order */
3781 qsort_swap(u_right, u_left);
3782 qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
3783 }
3784 }
3785 /* We now know the 3 middle elements have been compared and
3786 arranged in the desired order, so we can shrink the uncompared
3787 sets on both sides
3788 */
3789 --u_right;
3790 ++u_left;
3791 qsort_all_asserts(pc_left, pc_right, u_left, u_right);
3792
3793 /* The above massive nested if was the simple part :-). We now have
3794 the middle 3 elements ordered and we need to scan through the
3795 uncompared sets on either side, swapping elements that are on
3796 the wrong side or simply shuffling equal elements around to get
3797 all equal elements into the pivot chunk.
3798 */
3799
3800 for ( ; ; ) {
3801 int still_work_on_left;
3802 int still_work_on_right;
3803
3804 /* Scan the uncompared values on the left. If I find a value
3805 equal to the pivot value, move it over so it is adjacent to
3806 the pivot chunk and expand the pivot chunk. If I find a value
3807 less than the pivot value, then just leave it - its already
3808 on the correct side of the partition. If I find a greater
3809 value, then stop the scan.
3810 */
3811 while (still_work_on_left = (u_right >= part_left)) {
3812 s = qsort_cmp(u_right, pc_left);
3813 if (s < 0) {
3814 --u_right;
3815 } else if (s == 0) {
3816 --pc_left;
3817 if (pc_left != u_right) {
3818 qsort_swap(u_right, pc_left);
3819 }
3820 --u_right;
3821 } else {
3822 break;
3823 }
3824 qsort_assert(u_right < pc_left);
3825 qsort_assert(pc_left <= pc_right);
3826 qsort_assert(qsort_cmp(u_right + 1, pc_left) <= 0);
3827 qsort_assert(qsort_cmp(pc_left, pc_right) == 0);
3828 }
3829
3830 /* Do a mirror image scan of uncompared values on the right
3831 */
3832 while (still_work_on_right = (u_left <= part_right)) {
3833 s = qsort_cmp(pc_right, u_left);
3834 if (s < 0) {
3835 ++u_left;
3836 } else if (s == 0) {
3837 ++pc_right;
3838 if (pc_right != u_left) {
3839 qsort_swap(pc_right, u_left);
3840 }
3841 ++u_left;
3842 } else {
3843 break;
3844 }
3845 qsort_assert(u_left > pc_right);
3846 qsort_assert(pc_left <= pc_right);
3847 qsort_assert(qsort_cmp(pc_right, u_left - 1) <= 0);
3848 qsort_assert(qsort_cmp(pc_left, pc_right) == 0);
3849 }
3850
3851 if (still_work_on_left) {
3852 /* I know I have a value on the left side which needs to be
3853 on the right side, but I need to know more to decide
3854 exactly the best thing to do with it.
3855 */
3856 if (still_work_on_right) {
3857 /* I know I have values on both side which are out of
3858 position. This is a big win because I kill two birds
3859 with one swap (so to speak). I can advance the
3860 uncompared pointers on both sides after swapping both
3861 of them into the right place.
3862 */
3863 qsort_swap(u_right, u_left);
3864 --u_right;
3865 ++u_left;
3866 qsort_all_asserts(pc_left, pc_right, u_left, u_right);
3867 } else {
3868 /* I have an out of position value on the left, but the
3869 right is fully scanned, so I "slide" the pivot chunk
3870 and any less-than values left one to make room for the
3871 greater value over on the right. If the out of position
3872 value is immediately adjacent to the pivot chunk (there
3873 are no less-than values), I can do that with a swap,
3874 otherwise, I have to rotate one of the less than values
3875 into the former position of the out of position value
3876 and the right end of the pivot chunk into the left end
3877 (got all that?).
3878 */
3879 --pc_left;
3880 if (pc_left == u_right) {
3881 qsort_swap(u_right, pc_right);
3882 qsort_all_asserts(pc_left, pc_right-1, u_left, u_right-1);
3883 } else {
3884 qsort_rotate(u_right, pc_left, pc_right);
3885 qsort_all_asserts(pc_left, pc_right-1, u_left, u_right-1);
3886 }
3887 --pc_right;
3888 --u_right;
3889 }
3890 } else if (still_work_on_right) {
3891 /* Mirror image of complex case above: I have an out of
3892 position value on the right, but the left is fully
3893 scanned, so I need to shuffle things around to make room
3894 for the right value on the left.
3895 */
3896 ++pc_right;
3897 if (pc_right == u_left) {
3898 qsort_swap(u_left, pc_left);
3899 qsort_all_asserts(pc_left+1, pc_right, u_left+1, u_right);
3900 } else {
3901 qsort_rotate(pc_right, pc_left, u_left);
3902 qsort_all_asserts(pc_left+1, pc_right, u_left+1, u_right);
3903 }
3904 ++pc_left;
3905 ++u_left;
3906 } else {
3907 /* No more scanning required on either side of partition,
3908 break out of loop and figure out next set of partitions
3909 */
3910 break;
3911 }
3912 }
3913
3914 /* The elements in the pivot chunk are now in the right place. They
3915 will never move or be compared again. All I have to do is decide
3916 what to do with the stuff to the left and right of the pivot
3917 chunk.
3918
3919 Notes on the QSORT_ORDER_GUESS ifdef code:
3920
3921 1. If I just built these partitions without swapping any (or
3922 very many) elements, there is a chance that the elements are
3923 already ordered properly (being properly ordered will
3924 certainly result in no swapping, but the converse can't be
3925 proved :-).
3926
3927 2. A (properly written) insertion sort will run faster on
3928 already ordered data than qsort will.
3929
3930 3. Perhaps there is some way to make a good guess about
3931 switching to an insertion sort earlier than partition size 6
3932 (for instance - we could save the partition size on the stack
3933 and increase the size each time we find we didn't swap, thus
3934 switching to insertion sort earlier for partitions with a
3935 history of not swapping).
3936
3937 4. Naturally, if I just switch right away, it will make
3938 artificial benchmarks with pure ascending (or descending)
3939 data look really good, but is that a good reason in general?
3940 Hard to say...
3941 */
3942
3943#ifdef QSORT_ORDER_GUESS
3944 if (swapped < 3) {
3945#if QSORT_ORDER_GUESS == 1
3946 qsort_break_even = (part_right - part_left) + 1;
3947#endif
3948#if QSORT_ORDER_GUESS == 2
3949 qsort_break_even *= 2;
3950#endif
3951#if QSORT_ORDER_GUESS == 3
3952 int prev_break = qsort_break_even;
3953 qsort_break_even *= qsort_break_even;
3954 if (qsort_break_even < prev_break) {
3955 qsort_break_even = (part_right - part_left) + 1;
3956 }
3957#endif
3958 } else {
3959 qsort_break_even = QSORT_BREAK_EVEN;
3960 }
3961#endif
3962
3963 if (part_left < pc_left) {
3964 /* There are elements on the left which need more processing.
3965 Check the right as well before deciding what to do.
3966 */
3967 if (pc_right < part_right) {
3968 /* We have two partitions to be sorted. Stack the biggest one
3969 and process the smallest one on the next iteration. This
3970 minimizes the stack height by insuring that any additional
3971 stack entries must come from the smallest partition which
3972 (because it is smallest) will have the fewest
3973 opportunities to generate additional stack entries.
3974 */
3975 if ((part_right - pc_right) > (pc_left - part_left)) {
3976 /* stack the right partition, process the left */
3977 partition_stack[next_stack_entry].left = pc_right + 1;
3978 partition_stack[next_stack_entry].right = part_right;
3979#ifdef QSORT_ORDER_GUESS
3980 partition_stack[next_stack_entry].qsort_break_even = qsort_break_even;
3981#endif
3982 part_right = pc_left - 1;
3983 } else {
3984 /* stack the left partition, process the right */
3985 partition_stack[next_stack_entry].left = part_left;
3986 partition_stack[next_stack_entry].right = pc_left - 1;
3987#ifdef QSORT_ORDER_GUESS
3988 partition_stack[next_stack_entry].qsort_break_even = qsort_break_even;
3989#endif
3990 part_left = pc_right + 1;
3991 }
3992 qsort_assert(next_stack_entry < QSORT_MAX_STACK);
3993 ++next_stack_entry;
3994 } else {
3995 /* The elements on the left are the only remaining elements
3996 that need sorting, arrange for them to be processed as the
3997 next partition.
3998 */
3999 part_right = pc_left - 1;
4000 }
4001 } else if (pc_right < part_right) {
4002 /* There is only one chunk on the right to be sorted, make it
4003 the new partition and loop back around.
4004 */
4005 part_left = pc_right + 1;
4006 } else {
4007 /* This whole partition wound up in the pivot chunk, so
4008 we need to get a new partition off the stack.
4009 */
4010 if (next_stack_entry == 0) {
4011 /* the stack is empty - we are done */
4012 break;
4013 }
4014 --next_stack_entry;
4015 part_left = partition_stack[next_stack_entry].left;
4016 part_right = partition_stack[next_stack_entry].right;
4017#ifdef QSORT_ORDER_GUESS
4018 qsort_break_even = partition_stack[next_stack_entry].qsort_break_even;
4019#endif
4020 }
4021 } else {
4022 /* This partition is too small to fool with qsort complexity, just
4023 do an ordinary insertion sort to minimize overhead.
4024 */
4025 int i;
4026 /* Assume 1st element is in right place already, and start checking
4027 at 2nd element to see where it should be inserted.
4028 */
4029 for (i = part_left + 1; i <= part_right; ++i) {
4030 int j;
4031 /* Scan (backwards - just in case 'i' is already in right place)
4032 through the elements already sorted to see if the ith element
4033 belongs ahead of one of them.
4034 */
4035 for (j = i - 1; j >= part_left; --j) {
4036 if (qsort_cmp(i, j) >= 0) {
4037 /* i belongs right after j
4038 */
4039 break;
4040 }
4041 }
4042 ++j;
4043 if (j != i) {
4044 /* Looks like we really need to move some things
4045 */
b6917549 4046 int k;
745d3a65 4047 temp = array[i];
b6917549
HM
4048 for (k = i - 1; k >= j; --k)
4049 array[k + 1] = array[k];
745d3a65
HM
4050 array[j] = temp;
4051 }
4052 }
4053
4054 /* That partition is now sorted, grab the next one, or get out
4055 of the loop if there aren't any more.
4056 */
4057
4058 if (next_stack_entry == 0) {
4059 /* the stack is empty - we are done */
4060 break;
4061 }
4062 --next_stack_entry;
4063 part_left = partition_stack[next_stack_entry].left;
4064 part_right = partition_stack[next_stack_entry].right;
4065#ifdef QSORT_ORDER_GUESS
4066 qsort_break_even = partition_stack[next_stack_entry].qsort_break_even;
4067#endif
4068 }
4069 }
4070
4071 /* Believe it or not, the array is sorted at this point! */
4072}
51371543
GS
4073
4074
4075#ifdef PERL_OBJECT
4076#define NO_XSLOCKS
4077#undef this
4078#define this pPerl
4079#include "XSUB.h"
4080#endif
4081
4082
4083static I32
4084sortcv(pTHXo_ SV *a, SV *b)
4085{
4086 dTHR;
4087 I32 oldsaveix = PL_savestack_ix;
4088 I32 oldscopeix = PL_scopestack_ix;
4089 I32 result;
4090 GvSV(PL_firstgv) = a;
4091 GvSV(PL_secondgv) = b;
4092 PL_stack_sp = PL_stack_base;
4093 PL_op = PL_sortcop;
4094 CALLRUNOPS(aTHX);
4095 if (PL_stack_sp != PL_stack_base + 1)
4096 Perl_croak(aTHX_ "Sort subroutine didn't return single value");
4097 if (!SvNIOKp(*PL_stack_sp))
4098 Perl_croak(aTHX_ "Sort subroutine didn't return a numeric value");
4099 result = SvIV(*PL_stack_sp);
4100 while (PL_scopestack_ix > oldscopeix) {
4101 LEAVE;
4102 }
4103 leave_scope(oldsaveix);
4104 return result;
4105}
4106
4107
4108static I32
4109sv_ncmp(pTHXo_ SV *a, SV *b)
4110{
4111 NV nv1 = SvNV(a);
4112 NV nv2 = SvNV(b);
4113 return nv1 < nv2 ? -1 : nv1 > nv2 ? 1 : 0;
4114}
4115
4116static I32
4117sv_i_ncmp(pTHXo_ SV *a, SV *b)
4118{
4119 IV iv1 = SvIV(a);
4120 IV iv2 = SvIV(b);
4121 return iv1 < iv2 ? -1 : iv1 > iv2 ? 1 : 0;
4122}
4123#define tryCALL_AMAGICbin(left,right,meth,svp) STMT_START { \
4124 *svp = Nullsv; \
4125 if (PL_amagic_generation) { \
4126 if (SvAMAGIC(left)||SvAMAGIC(right))\
4127 *svp = amagic_call(left, \
4128 right, \
4129 CAT2(meth,_amg), \
4130 0); \
4131 } \
4132 } STMT_END
4133
4134static I32
4135amagic_ncmp(pTHXo_ register SV *a, register SV *b)
4136{
4137 SV *tmpsv;
4138 tryCALL_AMAGICbin(a,b,ncmp,&tmpsv);
4139 if (tmpsv) {
4140 NV d;
4141
4142 if (SvIOK(tmpsv)) {
4143 I32 i = SvIVX(tmpsv);
4144 if (i > 0)
4145 return 1;
4146 return i? -1 : 0;
4147 }
4148 d = SvNV(tmpsv);
4149 if (d > 0)
4150 return 1;
4151 return d? -1 : 0;
4152 }
4153 return sv_ncmp(aTHXo_ a, b);
4154}
4155
4156static I32
4157amagic_i_ncmp(pTHXo_ register SV *a, register SV *b)
4158{
4159 SV *tmpsv;
4160 tryCALL_AMAGICbin(a,b,ncmp,&tmpsv);
4161 if (tmpsv) {
4162 NV d;
4163
4164 if (SvIOK(tmpsv)) {
4165 I32 i = SvIVX(tmpsv);
4166 if (i > 0)
4167 return 1;
4168 return i? -1 : 0;
4169 }
4170 d = SvNV(tmpsv);
4171 if (d > 0)
4172 return 1;
4173 return d? -1 : 0;
4174 }
4175 return sv_i_ncmp(aTHXo_ a, b);
4176}
4177
4178static I32
4179amagic_cmp(pTHXo_ register SV *str1, register SV *str2)
4180{
4181 SV *tmpsv;
4182 tryCALL_AMAGICbin(str1,str2,scmp,&tmpsv);
4183 if (tmpsv) {
4184 NV d;
4185
4186 if (SvIOK(tmpsv)) {
4187 I32 i = SvIVX(tmpsv);
4188 if (i > 0)
4189 return 1;
4190 return i? -1 : 0;
4191 }
4192 d = SvNV(tmpsv);
4193 if (d > 0)
4194 return 1;
4195 return d? -1 : 0;
4196 }
4197 return sv_cmp(str1, str2);
4198}
4199
4200static I32
4201amagic_cmp_locale(pTHXo_ register SV *str1, register SV *str2)
4202{
4203 SV *tmpsv;
4204 tryCALL_AMAGICbin(str1,str2,scmp,&tmpsv);
4205 if (tmpsv) {
4206 NV d;
4207
4208 if (SvIOK(tmpsv)) {
4209 I32 i = SvIVX(tmpsv);
4210 if (i > 0)
4211 return 1;
4212 return i? -1 : 0;
4213 }
4214 d = SvNV(tmpsv);
4215 if (d > 0)
4216 return 1;
4217 return d? -1 : 0;
4218 }
4219 return sv_cmp_locale(str1, str2);
4220}
4221
bbed91b5
KF
4222static I32
4223run_user_filter(pTHXo_ int idx, SV *buf_sv, int maxlen)
4224{
4225 SV *datasv = FILTER_DATA(idx);
4226 int filter_has_file = IoLINES(datasv);
4227 GV *filter_child_proc = (GV *)IoFMT_GV(datasv);
4228 SV *filter_state = (SV *)IoTOP_GV(datasv);
4229 SV *filter_sub = (SV *)IoBOTTOM_GV(datasv);
4230 int len = 0;
4231
4232 /* I was having segfault trouble under Linux 2.2.5 after a
4233 parse error occured. (Had to hack around it with a test
4234 for PL_error_count == 0.) Solaris doesn't segfault --
4235 not sure where the trouble is yet. XXX */
4236
4237 if (filter_has_file) {
4238 len = FILTER_READ(idx+1, buf_sv, maxlen);
4239 }
4240
4241 if (filter_sub && len >= 0) {
4242 djSP;
4243 int count;
4244
4245 ENTER;
4246 SAVE_DEFSV;
4247 SAVETMPS;
4248 EXTEND(SP, 2);
4249
4250 DEFSV = buf_sv;
4251 PUSHMARK(SP);
4252 PUSHs(sv_2mortal(newSViv(maxlen)));
4253 if (filter_state) {
4254 PUSHs(filter_state);
4255 }
4256 PUTBACK;
4257 count = call_sv(filter_sub, G_SCALAR);
4258 SPAGAIN;
4259
4260 if (count > 0) {
4261 SV *out = POPs;
4262 if (SvOK(out)) {
4263 len = SvIV(out);
4264 }
4265 }
4266
4267 PUTBACK;
4268 FREETMPS;
4269 LEAVE;
4270 }
4271
4272 if (len <= 0) {
4273 IoLINES(datasv) = 0;
4274 if (filter_child_proc) {
4275 SvREFCNT_dec(filter_child_proc);
4276 IoFMT_GV(datasv) = Nullgv;
4277 }
4278 if (filter_state) {
4279 SvREFCNT_dec(filter_state);
4280 IoTOP_GV(datasv) = Nullgv;
4281 }
4282 if (filter_sub) {
4283 SvREFCNT_dec(filter_sub);
4284 IoBOTTOM_GV(datasv) = Nullgv;
4285 }
4286 filter_del(run_user_filter);
4287 }
4288
4289 return len;
4290}
4291
e7513ba0
GS
4292#ifdef PERL_OBJECT
4293
51371543
GS
4294static I32
4295sv_cmp_locale_static(pTHXo_ register SV *str1, register SV *str2)
4296{
4297 return sv_cmp_locale(str1, str2);
4298}
4299
4300static I32
4301sv_cmp_static(pTHXo_ register SV *str1, register SV *str2)
4302{
4303 return sv_cmp(str1, str2);
4304}
e7513ba0
GS
4305
4306#endif /* PERL_OBJECT */