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