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