This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Re: [ID 20010309.004] my-variables lose values while goto'ing within a for(;;)-loop
[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
IZ
93 if(SvMAGICAL(sv))
94 mg = mg_find(sv, 'r');
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);
084916e3
JH
230 if (!(mg = mg_find(sv, 'g'))) {
231 sv_magic(sv, Nullsv, 'g', Nullch, 0);
232 mg = mg_find(sv, 'g');
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;
315 register SV *sv;
316 char *item;
317 I32 itemsize;
318 I32 fieldsize;
319 I32 lines = 0;
3280af22 320 bool chopspace = (strchr(PL_chopset, ' ') != Nullch);
a0d0e21e
LW
321 char *chophere;
322 char *linemark;
65202027 323 NV value;
a0d0e21e
LW
324 bool gotsome;
325 STRLEN len;
7e2040f0
GS
326 STRLEN fudge = SvCUR(tmpForm) * (IN_BYTE ? 1 : 3) + 1;
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);
a0d0e21e
LW
376 } )
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)) {
a0ed51b3
LW
554 switch (UTF8SKIP(s)) {
555 case 7: *t++ = *s++;
556 case 6: *t++ = *s++;
557 case 5: *t++ = *s++;
558 case 4: *t++ = *s++;
559 case 3: *t++ = *s++;
560 case 2: *t++ = *s++;
561 case 1: *t++ = *s++;
562 }
563 }
564 else {
565 if ( !((*t++ = *s++) & ~31) )
566 t[-1] = ' ';
567 }
568 }
569 break;
570 }
a0d0e21e 571 while (arg--) {
9d116dd7 572#ifdef EBCDIC
a0d0e21e 573 int ch = *t++ = *s++;
9d116dd7 574 if (iscntrl(ch))
a0d0e21e
LW
575#else
576 if ( !((*t++ = *s++) & ~31) )
a0d0e21e 577#endif
9d116dd7 578 t[-1] = ' ';
a0d0e21e
LW
579 }
580 break;
581
582 case FF_CHOP:
583 s = chophere;
584 if (chopspace) {
585 while (*s && isSPACE(*s))
586 s++;
587 }
588 sv_chop(sv,s);
589 break;
590
591 case FF_LINEGLOB:
592 item = s = SvPV(sv, len);
593 itemsize = len;
7e2040f0 594 item_is_utf = FALSE; /* XXX is this correct? */
a0d0e21e
LW
595 if (itemsize) {
596 gotsome = TRUE;
597 send = s + itemsize;
598 while (s < send) {
599 if (*s++ == '\n') {
600 if (s == send)
601 itemsize--;
602 else
603 lines++;
604 }
605 }
3280af22
NIS
606 SvCUR_set(PL_formtarget, t - SvPVX(PL_formtarget));
607 sv_catpvn(PL_formtarget, item, itemsize);
a0ed51b3 608 SvGROW(PL_formtarget, SvCUR(PL_formtarget) + fudge + 1);
3280af22 609 t = SvPVX(PL_formtarget) + SvCUR(PL_formtarget);
a0d0e21e
LW
610 }
611 break;
612
613 case FF_DECIMAL:
614 /* If the field is marked with ^ and the value is undefined,
615 blank it out. */
616 arg = *fpc++;
617 if ((arg & 512) && !SvOK(sv)) {
618 arg = fieldsize;
619 while (arg--)
620 *t++ = ' ';
621 break;
622 }
623 gotsome = TRUE;
624 value = SvNV(sv);
bbce6d69 625 /* Formats aren't yet marked for locales, so assume "yes". */
097ee67d 626 {
f93f4e46 627 STORE_NUMERIC_STANDARD_SET_LOCAL();
65202027
DS
628#if defined(USE_LONG_DOUBLE)
629 if (arg & 256) {
cf2093f6 630 sprintf(t, "%#*.*" PERL_PRIfldbl,
65202027
DS
631 (int) fieldsize, (int) arg & 255, value);
632 } else {
cf2093f6 633 sprintf(t, "%*.0" PERL_PRIfldbl, (int) fieldsize, value);
65202027
DS
634 }
635#else
097ee67d
JH
636 if (arg & 256) {
637 sprintf(t, "%#*.*f",
638 (int) fieldsize, (int) arg & 255, value);
639 } else {
640 sprintf(t, "%*.0f",
641 (int) fieldsize, value);
642 }
65202027 643#endif
097ee67d 644 RESTORE_NUMERIC_STANDARD();
a0d0e21e
LW
645 }
646 t += fieldsize;
647 break;
648
784707d5
JP
649 case FF_0DECIMAL:
650 /* If the field is marked with ^ and the value is undefined,
651 blank it out. */
652 arg = *fpc++;
653 if ((arg & 512) && !SvOK(sv)) {
654 arg = fieldsize;
655 while (arg--)
656 *t++ = ' ';
657 break;
658 }
659 gotsome = TRUE;
660 value = SvNV(sv);
661 /* Formats aren't yet marked for locales, so assume "yes". */
662 {
663 STORE_NUMERIC_STANDARD_SET_LOCAL();
664#if defined(USE_LONG_DOUBLE)
665 if (arg & 256) {
666 sprintf(t, "%#0*.*" PERL_PRIfldbl,
ac27b0f5
NIS
667 (int) fieldsize, (int) arg & 255, value);
668/* is this legal? I don't have long doubles */
784707d5
JP
669 } else {
670 sprintf(t, "%0*.0" PERL_PRIfldbl, (int) fieldsize, value);
671 }
672#else
673 if (arg & 256) {
674 sprintf(t, "%#0*.*f",
675 (int) fieldsize, (int) arg & 255, value);
676 } else {
677 sprintf(t, "%0*.0f",
678 (int) fieldsize, value);
679 }
680#endif
681 RESTORE_NUMERIC_STANDARD();
682 }
683 t += fieldsize;
684 break;
ac27b0f5 685
a0d0e21e
LW
686 case FF_NEWLINE:
687 f++;
688 while (t-- > linemark && *t == ' ') ;
689 t++;
690 *t++ = '\n';
691 break;
692
693 case FF_BLANK:
694 arg = *fpc++;
695 if (gotsome) {
696 if (arg) { /* repeat until fields exhausted? */
697 *t = '\0';
3280af22
NIS
698 SvCUR_set(PL_formtarget, t - SvPVX(PL_formtarget));
699 lines += FmLINES(PL_formtarget);
a0d0e21e
LW
700 if (lines == 200) {
701 arg = t - linemark;
702 if (strnEQ(linemark, linemark - arg, arg))
cea2e8a9 703 DIE(aTHX_ "Runaway format");
a0d0e21e 704 }
3280af22 705 FmLINES(PL_formtarget) = lines;
a0d0e21e
LW
706 SP = ORIGMARK;
707 RETURNOP(cLISTOP->op_first);
708 }
709 }
710 else {
711 t = linemark;
712 lines--;
713 }
714 break;
715
716 case FF_MORE:
7056ecde
KM
717 s = chophere;
718 send = item + len;
719 if (chopspace) {
720 while (*s && isSPACE(*s) && s < send)
721 s++;
722 }
723 if (s < send) {
a0d0e21e
LW
724 arg = fieldsize - itemsize;
725 if (arg) {
726 fieldsize -= arg;
727 while (arg-- > 0)
728 *t++ = ' ';
729 }
730 s = t - 3;
731 if (strnEQ(s," ",3)) {
3280af22 732 while (s > SvPVX(PL_formtarget) && isSPACE(s[-1]))
a0d0e21e
LW
733 s--;
734 }
735 *s++ = '.';
736 *s++ = '.';
737 *s++ = '.';
738 }
739 break;
740
741 case FF_END:
742 *t = '\0';
3280af22
NIS
743 SvCUR_set(PL_formtarget, t - SvPVX(PL_formtarget));
744 FmLINES(PL_formtarget) += lines;
a0d0e21e
LW
745 SP = ORIGMARK;
746 RETPUSHYES;
747 }
748 }
749}
750
751PP(pp_grepstart)
752{
39644a26 753 dSP;
a0d0e21e
LW
754 SV *src;
755
3280af22 756 if (PL_stack_base + *PL_markstack_ptr == SP) {
a0d0e21e 757 (void)POPMARK;
54310121 758 if (GIMME_V == G_SCALAR)
0b024f31 759 XPUSHs(sv_2mortal(newSViv(0)));
533c011a 760 RETURNOP(PL_op->op_next->op_next);
a0d0e21e 761 }
3280af22 762 PL_stack_sp = PL_stack_base + *PL_markstack_ptr + 1;
cea2e8a9
GS
763 pp_pushmark(); /* push dst */
764 pp_pushmark(); /* push src */
a0d0e21e
LW
765 ENTER; /* enter outer scope */
766
767 SAVETMPS;
127ad2b7
GS
768 /* SAVE_DEFSV does *not* suffice here for USE_THREADS */
769 SAVESPTR(DEFSV);
a0d0e21e 770 ENTER; /* enter inner scope */
7766f137 771 SAVEVPTR(PL_curpm);
a0d0e21e 772
3280af22 773 src = PL_stack_base[*PL_markstack_ptr];
a0d0e21e 774 SvTEMP_off(src);
54b9620d 775 DEFSV = src;
a0d0e21e
LW
776
777 PUTBACK;
533c011a 778 if (PL_op->op_type == OP_MAPSTART)
cea2e8a9 779 pp_pushmark(); /* push top */
533c011a 780 return ((LOGOP*)PL_op->op_next)->op_other;
a0d0e21e
LW
781}
782
783PP(pp_mapstart)
784{
cea2e8a9 785 DIE(aTHX_ "panic: mapstart"); /* uses grepstart */
a0d0e21e
LW
786}
787
788PP(pp_mapwhile)
789{
39644a26 790 dSP;
544f3153 791 I32 items = (SP - PL_stack_base) - *PL_markstack_ptr; /* how many new items */
a0d0e21e
LW
792 I32 count;
793 I32 shift;
794 SV** src;
ac27b0f5 795 SV** dst;
a0d0e21e 796
544f3153 797 /* first, move source pointer to the next item in the source list */
3280af22 798 ++PL_markstack_ptr[-1];
544f3153
GS
799
800 /* if there are new items, push them into the destination list */
801 if (items) {
802 /* might need to make room back there first */
803 if (items > PL_markstack_ptr[-1] - PL_markstack_ptr[-2]) {
804 /* XXX this implementation is very pessimal because the stack
805 * is repeatedly extended for every set of items. Is possible
806 * to do this without any stack extension or copying at all
807 * by maintaining a separate list over which the map iterates
18ef8bea 808 * (like foreach does). --gsar */
544f3153
GS
809
810 /* everything in the stack after the destination list moves
811 * towards the end the stack by the amount of room needed */
812 shift = items - (PL_markstack_ptr[-1] - PL_markstack_ptr[-2]);
813
814 /* items to shift up (accounting for the moved source pointer) */
815 count = (SP - PL_stack_base) - (PL_markstack_ptr[-1] - 1);
18ef8bea
BT
816
817 /* This optimization is by Ben Tilly and it does
818 * things differently from what Sarathy (gsar)
819 * is describing. The downside of this optimization is
820 * that leaves "holes" (uninitialized and hopefully unused areas)
821 * to the Perl stack, but on the other hand this
822 * shouldn't be a problem. If Sarathy's idea gets
823 * implemented, this optimization should become
824 * irrelevant. --jhi */
825 if (shift < count)
826 shift = count; /* Avoid shifting too often --Ben Tilly */
ac27b0f5 827
924508f0
GS
828 EXTEND(SP,shift);
829 src = SP;
830 dst = (SP += shift);
3280af22
NIS
831 PL_markstack_ptr[-1] += shift;
832 *PL_markstack_ptr += shift;
544f3153 833 while (count--)
a0d0e21e
LW
834 *dst-- = *src--;
835 }
544f3153 836 /* copy the new items down to the destination list */
ac27b0f5 837 dst = PL_stack_base + (PL_markstack_ptr[-2] += items) - 1;
544f3153 838 while (items--)
ac27b0f5 839 *dst-- = SvTEMP(TOPs) ? POPs : sv_mortalcopy(POPs);
a0d0e21e
LW
840 }
841 LEAVE; /* exit inner scope */
842
843 /* All done yet? */
3280af22 844 if (PL_markstack_ptr[-1] > *PL_markstack_ptr) {
54310121 845 I32 gimme = GIMME_V;
a0d0e21e
LW
846
847 (void)POPMARK; /* pop top */
848 LEAVE; /* exit outer scope */
849 (void)POPMARK; /* pop src */
3280af22 850 items = --*PL_markstack_ptr - PL_markstack_ptr[-1];
a0d0e21e 851 (void)POPMARK; /* pop dst */
3280af22 852 SP = PL_stack_base + POPMARK; /* pop original mark */
54310121 853 if (gimme == G_SCALAR) {
a0d0e21e
LW
854 dTARGET;
855 XPUSHi(items);
a0d0e21e 856 }
54310121 857 else if (gimme == G_ARRAY)
858 SP += items;
a0d0e21e
LW
859 RETURN;
860 }
861 else {
862 SV *src;
863
864 ENTER; /* enter inner scope */
7766f137 865 SAVEVPTR(PL_curpm);
a0d0e21e 866
544f3153 867 /* set $_ to the new source item */
3280af22 868 src = PL_stack_base[PL_markstack_ptr[-1]];
a0d0e21e 869 SvTEMP_off(src);
54b9620d 870 DEFSV = src;
a0d0e21e
LW
871
872 RETURNOP(cLOGOP->op_other);
873 }
874}
875
a0d0e21e
LW
876PP(pp_sort)
877{
39644a26 878 dSP; dMARK; dORIGMARK;
a0d0e21e
LW
879 register SV **up;
880 SV **myorigmark = ORIGMARK;
881 register I32 max;
882 HV *stash;
883 GV *gv;
884 CV *cv;
885 I32 gimme = GIMME;
533c011a 886 OP* nextop = PL_op->op_next;
d0ecd44c 887 I32 overloading = 0;
43481408
GS
888 bool hasargs = FALSE;
889 I32 is_xsub = 0;
a0d0e21e
LW
890
891 if (gimme != G_ARRAY) {
892 SP = MARK;
893 RETPUSHUNDEF;
894 }
895
d0abe6c5 896 ENTER;
7766f137 897 SAVEVPTR(PL_sortcop);
533c011a
NIS
898 if (PL_op->op_flags & OPf_STACKED) {
899 if (PL_op->op_flags & OPf_SPECIAL) {
a0d0e21e
LW
900 OP *kid = cLISTOP->op_first->op_sibling; /* pass pushmark */
901 kid = kUNOP->op_first; /* pass rv2gv */
902 kid = kUNOP->op_first; /* pass leave */
3280af22 903 PL_sortcop = kid->op_next;
11faa288 904 stash = CopSTASH(PL_curcop);
a0d0e21e
LW
905 }
906 else {
907 cv = sv_2cv(*++MARK, &stash, &gv, 0);
43481408
GS
908 if (cv && SvPOK(cv)) {
909 STRLEN n_a;
910 char *proto = SvPV((SV*)cv, n_a);
911 if (proto && strEQ(proto, "$$")) {
912 hasargs = TRUE;
913 }
914 }
a0d0e21e 915 if (!(cv && CvROOT(cv))) {
43481408
GS
916 if (cv && CvXSUB(cv)) {
917 is_xsub = 1;
918 }
919 else if (gv) {
a0d0e21e 920 SV *tmpstr = sv_newmortal();
e5cf08de 921 gv_efullname3(tmpstr, gv, Nullch);
cea2e8a9 922 DIE(aTHX_ "Undefined sort subroutine \"%s\" called",
a0d0e21e
LW
923 SvPVX(tmpstr));
924 }
43481408 925 else {
cea2e8a9 926 DIE(aTHX_ "Undefined subroutine in sort");
a0d0e21e 927 }
a0d0e21e 928 }
b3933176 929
43481408
GS
930 if (is_xsub)
931 PL_sortcop = (OP*)cv;
932 else {
933 PL_sortcop = CvSTART(cv);
934 SAVEVPTR(CvROOT(cv)->op_ppaddr);
935 CvROOT(cv)->op_ppaddr = PL_ppaddr[OP_NULL];
936
937 SAVEVPTR(PL_curpad);
938 PL_curpad = AvARRAY((AV*)AvARRAY(CvPADLIST(cv))[1]);
939 }
a0d0e21e
LW
940 }
941 }
942 else {
3280af22 943 PL_sortcop = Nullop;
11faa288 944 stash = CopSTASH(PL_curcop);
a0d0e21e
LW
945 }
946
947 up = myorigmark + 1;
948 while (MARK < SP) { /* This may or may not shift down one here. */
949 /*SUPPRESS 560*/
155aba94 950 if ((*up = *++MARK)) { /* Weed out nulls. */
9f8d30d5 951 SvTEMP_off(*up);
d0ecd44c 952 if (!PL_sortcop && !SvPOK(*up)) {
2d8e6c8d 953 STRLEN n_a;
d0ecd44c
IZ
954 if (SvAMAGIC(*up))
955 overloading = 1;
956 else
2d8e6c8d 957 (void)sv_2pv(*up, &n_a);
d0ecd44c 958 }
a0d0e21e
LW
959 up++;
960 }
961 }
962 max = --up - myorigmark;
3280af22 963 if (PL_sortcop) {
a0d0e21e 964 if (max > 1) {
c09156bb 965 PERL_CONTEXT *cx;
a0d0e21e 966 SV** newsp;
54310121 967 bool oldcatch = CATCH_GET;
a0d0e21e
LW
968
969 SAVETMPS;
462e5cf6 970 SAVEOP();
a0d0e21e 971
54310121 972 CATCH_SET(TRUE);
e788e7d3 973 PUSHSTACKi(PERLSI_SORT);
8e664e10
GS
974 if (!hasargs && !is_xsub) {
975 if (PL_sortstash != stash || !PL_firstgv || !PL_secondgv) {
976 SAVESPTR(PL_firstgv);
977 SAVESPTR(PL_secondgv);
978 PL_firstgv = gv_fetchpv("a", TRUE, SVt_PV);
979 PL_secondgv = gv_fetchpv("b", TRUE, SVt_PV);
980 PL_sortstash = stash;
981 }
3d35f11b 982#ifdef USE_THREADS
4755096e
GS
983 sv_lock((SV *)PL_firstgv);
984 sv_lock((SV *)PL_secondgv);
3d35f11b 985#endif
8e664e10
GS
986 SAVESPTR(GvSV(PL_firstgv));
987 SAVESPTR(GvSV(PL_secondgv));
a0d0e21e
LW
988 }
989
3280af22 990 PUSHBLOCK(cx, CXt_NULL, PL_stack_base);
533c011a 991 if (!(PL_op->op_flags & OPf_SPECIAL)) {
b3933176
CS
992 cx->cx_type = CXt_SUB;
993 cx->blk_gimme = G_SCALAR;
994 PUSHSUB(cx);
995 if (!CvDEPTH(cv))
3e3baf6d 996 (void)SvREFCNT_inc(cv); /* in preparation for POPSUB */
b3933176 997 }
3280af22 998 PL_sortcxix = cxstack_ix;
43481408
GS
999
1000 if (hasargs && !is_xsub) {
1001 /* This is mostly copied from pp_entersub */
1002 AV *av = (AV*)PL_curpad[0];
1003
1004#ifndef USE_THREADS
1005 cx->blk_sub.savearray = GvAV(PL_defgv);
1006 GvAV(PL_defgv) = (AV*)SvREFCNT_inc(av);
1007#endif /* USE_THREADS */
7032098e 1008 cx->blk_sub.oldcurpad = PL_curpad;
43481408
GS
1009 cx->blk_sub.argarray = av;
1010 }
1011 qsortsv((myorigmark+1), max,
1012 is_xsub ? sortcv_xsub : hasargs ? sortcv_stacked : sortcv);
a0d0e21e 1013
3280af22 1014 POPBLOCK(cx,PL_curpm);
ebafeae7 1015 PL_stack_sp = newsp;
d3acc0f7 1016 POPSTACK;
54310121 1017 CATCH_SET(oldcatch);
a0d0e21e 1018 }
a0d0e21e
LW
1019 }
1020 else {
1021 if (max > 1) {
1022 MEXTEND(SP, 20); /* Can't afford stack realloc on signal. */
745d3a65 1023 qsortsv(ORIGMARK+1, max,
9c007264
JH
1024 (PL_op->op_private & OPpSORT_NUMERIC)
1025 ? ( (PL_op->op_private & OPpSORT_INTEGER)
0b94c7bb
GS
1026 ? ( overloading ? amagic_i_ncmp : sv_i_ncmp)
1027 : ( overloading ? amagic_ncmp : sv_ncmp))
9c007264
JH
1028 : ( (PL_op->op_private & OPpLOCALE)
1029 ? ( overloading
0b94c7bb
GS
1030 ? amagic_cmp_locale
1031 : sv_cmp_locale_static)
1032 : ( overloading ? amagic_cmp : sv_cmp_static)));
9c007264
JH
1033 if (PL_op->op_private & OPpSORT_REVERSE) {
1034 SV **p = ORIGMARK+1;
1035 SV **q = ORIGMARK+max;
1036 while (p < q) {
1037 SV *tmp = *p;
1038 *p++ = *q;
1039 *q-- = tmp;
1040 }
1041 }
a0d0e21e
LW
1042 }
1043 }
d0abe6c5 1044 LEAVE;
3280af22 1045 PL_stack_sp = ORIGMARK + max;
a0d0e21e
LW
1046 return nextop;
1047}
1048
1049/* Range stuff. */
1050
1051PP(pp_range)
1052{
1053 if (GIMME == G_ARRAY)
1a67a97c 1054 return NORMAL;
538573f7 1055 if (SvTRUEx(PAD_SV(PL_op->op_targ)))
1a67a97c 1056 return cLOGOP->op_other;
538573f7 1057 else
1a67a97c 1058 return NORMAL;
a0d0e21e
LW
1059}
1060
1061PP(pp_flip)
1062{
39644a26 1063 dSP;
a0d0e21e
LW
1064
1065 if (GIMME == G_ARRAY) {
1a67a97c 1066 RETURNOP(((LOGOP*)cUNOP->op_first)->op_other);
a0d0e21e
LW
1067 }
1068 else {
1069 dTOPss;
533c011a 1070 SV *targ = PAD_SV(PL_op->op_targ);
790090df
HS
1071 int flip;
1072
1073 if (PL_op->op_private & OPpFLIP_LINENUM) {
1074 struct io *gp_io;
1075 flip = PL_last_in_gv
1076 && (gp_io = GvIOp(PL_last_in_gv))
1077 && SvIV(sv) == (IV)IoLINES(gp_io);
1078 } else {
1079 flip = SvTRUE(sv);
1080 }
1081 if (flip) {
a0d0e21e 1082 sv_setiv(PAD_SV(cUNOP->op_first->op_targ), 1);
533c011a 1083 if (PL_op->op_flags & OPf_SPECIAL) {
a0d0e21e 1084 sv_setiv(targ, 1);
3e3baf6d 1085 SETs(targ);
a0d0e21e
LW
1086 RETURN;
1087 }
1088 else {
1089 sv_setiv(targ, 0);
924508f0 1090 SP--;
1a67a97c 1091 RETURNOP(((LOGOP*)cUNOP->op_first)->op_other);
a0d0e21e
LW
1092 }
1093 }
1094 sv_setpv(TARG, "");
1095 SETs(targ);
1096 RETURN;
1097 }
1098}
1099
1100PP(pp_flop)
1101{
39644a26 1102 dSP;
a0d0e21e
LW
1103
1104 if (GIMME == G_ARRAY) {
1105 dPOPPOPssrl;
c1ab3db2 1106 register I32 i, j;
a0d0e21e
LW
1107 register SV *sv;
1108 I32 max;
86cb7173
HS
1109
1110 if (SvGMAGICAL(left))
1111 mg_get(left);
1112 if (SvGMAGICAL(right))
1113 mg_get(right);
a0d0e21e 1114
4633a7c4 1115 if (SvNIOKp(left) || !SvPOKp(left) ||
39eb4040
GS
1116 SvNIOKp(right) || !SvPOKp(right) ||
1117 (looks_like_number(left) && *SvPVX(left) != '0' &&
1118 looks_like_number(right) && *SvPVX(right) != '0'))
bbce6d69 1119 {
c1ab3db2 1120 if (SvNV(left) < IV_MIN || SvNV(right) > IV_MAX)
d470f89e 1121 DIE(aTHX_ "Range iterator outside integer range");
a0d0e21e
LW
1122 i = SvIV(left);
1123 max = SvIV(right);
bbce6d69 1124 if (max >= i) {
c1ab3db2
AK
1125 j = max - i + 1;
1126 EXTEND_MORTAL(j);
1127 EXTEND(SP, j);
bbce6d69 1128 }
c1ab3db2
AK
1129 else
1130 j = 0;
1131 while (j--) {
bbce6d69 1132 sv = sv_2mortal(newSViv(i++));
a0d0e21e
LW
1133 PUSHs(sv);
1134 }
1135 }
1136 else {
1137 SV *final = sv_mortalcopy(right);
2d8e6c8d 1138 STRLEN len, n_a;
a0d0e21e
LW
1139 char *tmps = SvPV(final, len);
1140
1141 sv = sv_mortalcopy(left);
2d8e6c8d 1142 SvPV_force(sv,n_a);
89ea2908 1143 while (!SvNIOKp(sv) && SvCUR(sv) <= len) {
a0d0e21e 1144 XPUSHs(sv);
89ea2908
GA
1145 if (strEQ(SvPVX(sv),tmps))
1146 break;
a0d0e21e
LW
1147 sv = sv_2mortal(newSVsv(sv));
1148 sv_inc(sv);
1149 }
a0d0e21e
LW
1150 }
1151 }
1152 else {
1153 dTOPss;
1154 SV *targ = PAD_SV(cUNOP->op_first->op_targ);
1155 sv_inc(targ);
533c011a 1156 if ((PL_op->op_private & OPpFLIP_LINENUM)
3280af22 1157 ? (PL_last_in_gv && SvIV(sv) == (IV)IoLINES(GvIOp(PL_last_in_gv)))
a0d0e21e
LW
1158 : SvTRUE(sv) ) {
1159 sv_setiv(PAD_SV(((UNOP*)cUNOP->op_first)->op_first->op_targ), 0);
1160 sv_catpv(targ, "E0");
1161 }
1162 SETs(targ);
1163 }
1164
1165 RETURN;
1166}
1167
1168/* Control. */
1169
76e3520e 1170STATIC I32
cea2e8a9 1171S_dopoptolabel(pTHX_ char *label)
a0d0e21e
LW
1172{
1173 register I32 i;
c09156bb 1174 register PERL_CONTEXT *cx;
a0d0e21e
LW
1175
1176 for (i = cxstack_ix; i >= 0; i--) {
1177 cx = &cxstack[i];
6b35e009 1178 switch (CxTYPE(cx)) {
a0d0e21e 1179 case CXt_SUBST:
e476b1b5 1180 if (ckWARN(WARN_EXITING))
ac27b0f5 1181 Perl_warner(aTHX_ WARN_EXITING, "Exiting substitution via %s",
22c35a8c 1182 PL_op_name[PL_op->op_type]);
a0d0e21e
LW
1183 break;
1184 case CXt_SUB:
e476b1b5 1185 if (ckWARN(WARN_EXITING))
ac27b0f5 1186 Perl_warner(aTHX_ WARN_EXITING, "Exiting subroutine via %s",
22c35a8c 1187 PL_op_name[PL_op->op_type]);
a0d0e21e 1188 break;
7766f137 1189 case CXt_FORMAT:
e476b1b5 1190 if (ckWARN(WARN_EXITING))
ac27b0f5 1191 Perl_warner(aTHX_ WARN_EXITING, "Exiting format via %s",
7766f137
GS
1192 PL_op_name[PL_op->op_type]);
1193 break;
a0d0e21e 1194 case CXt_EVAL:
e476b1b5 1195 if (ckWARN(WARN_EXITING))
ac27b0f5 1196 Perl_warner(aTHX_ WARN_EXITING, "Exiting eval via %s",
22c35a8c 1197 PL_op_name[PL_op->op_type]);
a0d0e21e 1198 break;
0a753a76 1199 case CXt_NULL:
e476b1b5 1200 if (ckWARN(WARN_EXITING))
ac27b0f5 1201 Perl_warner(aTHX_ WARN_EXITING, "Exiting pseudo-block via %s",
22c35a8c 1202 PL_op_name[PL_op->op_type]);
0a753a76 1203 return -1;
a0d0e21e
LW
1204 case CXt_LOOP:
1205 if (!cx->blk_loop.label ||
1206 strNE(label, cx->blk_loop.label) ) {
cea2e8a9 1207 DEBUG_l(Perl_deb(aTHX_ "(Skipping label #%ld %s)\n",
68dc0745 1208 (long)i, cx->blk_loop.label));
a0d0e21e
LW
1209 continue;
1210 }
cea2e8a9 1211 DEBUG_l( Perl_deb(aTHX_ "(Found label #%ld %s)\n", (long)i, label));
a0d0e21e
LW
1212 return i;
1213 }
1214 }
1215 return i;
1216}
1217
e50aee73 1218I32
864dbfa3 1219Perl_dowantarray(pTHX)
e50aee73 1220{
54310121 1221 I32 gimme = block_gimme();
1222 return (gimme == G_VOID) ? G_SCALAR : gimme;
1223}
1224
1225I32
864dbfa3 1226Perl_block_gimme(pTHX)
54310121 1227{
e50aee73
AD
1228 I32 cxix;
1229
1230 cxix = dopoptosub(cxstack_ix);
1231 if (cxix < 0)
46fc3d4c 1232 return G_VOID;
e50aee73 1233
54310121 1234 switch (cxstack[cxix].blk_gimme) {
d2719217
GS
1235 case G_VOID:
1236 return G_VOID;
54310121 1237 case G_SCALAR:
e50aee73 1238 return G_SCALAR;
54310121 1239 case G_ARRAY:
1240 return G_ARRAY;
1241 default:
cea2e8a9 1242 Perl_croak(aTHX_ "panic: bad gimme: %d\n", cxstack[cxix].blk_gimme);
d2719217
GS
1243 /* NOTREACHED */
1244 return 0;
54310121 1245 }
e50aee73
AD
1246}
1247
78f9721b
SM
1248I32
1249Perl_is_lvalue_sub(pTHX)
1250{
1251 I32 cxix;
1252
1253 cxix = dopoptosub(cxstack_ix);
1254 assert(cxix >= 0); /* We should only be called from inside subs */
1255
1256 if (cxstack[cxix].blk_sub.lval && CvLVALUE(cxstack[cxix].blk_sub.cv))
1257 return cxstack[cxix].blk_sub.lval;
1258 else
1259 return 0;
1260}
1261
76e3520e 1262STATIC I32
cea2e8a9 1263S_dopoptosub(pTHX_ I32 startingblock)
a0d0e21e 1264{
2c375eb9
GS
1265 return dopoptosub_at(cxstack, startingblock);
1266}
1267
1268STATIC I32
cea2e8a9 1269S_dopoptosub_at(pTHX_ PERL_CONTEXT *cxstk, I32 startingblock)
2c375eb9 1270{
a0d0e21e 1271 I32 i;
c09156bb 1272 register PERL_CONTEXT *cx;
a0d0e21e 1273 for (i = startingblock; i >= 0; i--) {
2c375eb9 1274 cx = &cxstk[i];
6b35e009 1275 switch (CxTYPE(cx)) {
a0d0e21e
LW
1276 default:
1277 continue;
1278 case CXt_EVAL:
1279 case CXt_SUB:
7766f137 1280 case CXt_FORMAT:
cea2e8a9 1281 DEBUG_l( Perl_deb(aTHX_ "(Found sub #%ld)\n", (long)i));
a0d0e21e
LW
1282 return i;
1283 }
1284 }
1285 return i;
1286}
1287
76e3520e 1288STATIC I32
cea2e8a9 1289S_dopoptoeval(pTHX_ I32 startingblock)
a0d0e21e
LW
1290{
1291 I32 i;
c09156bb 1292 register PERL_CONTEXT *cx;
a0d0e21e
LW
1293 for (i = startingblock; i >= 0; i--) {
1294 cx = &cxstack[i];
6b35e009 1295 switch (CxTYPE(cx)) {
a0d0e21e
LW
1296 default:
1297 continue;
1298 case CXt_EVAL:
cea2e8a9 1299 DEBUG_l( Perl_deb(aTHX_ "(Found eval #%ld)\n", (long)i));
a0d0e21e
LW
1300 return i;
1301 }
1302 }
1303 return i;
1304}
1305
76e3520e 1306STATIC I32
cea2e8a9 1307S_dopoptoloop(pTHX_ I32 startingblock)
a0d0e21e
LW
1308{
1309 I32 i;
c09156bb 1310 register PERL_CONTEXT *cx;
a0d0e21e
LW
1311 for (i = startingblock; i >= 0; i--) {
1312 cx = &cxstack[i];
6b35e009 1313 switch (CxTYPE(cx)) {
a0d0e21e 1314 case CXt_SUBST:
e476b1b5 1315 if (ckWARN(WARN_EXITING))
ac27b0f5 1316 Perl_warner(aTHX_ WARN_EXITING, "Exiting substitution via %s",
22c35a8c 1317 PL_op_name[PL_op->op_type]);
a0d0e21e
LW
1318 break;
1319 case CXt_SUB:
e476b1b5 1320 if (ckWARN(WARN_EXITING))
ac27b0f5 1321 Perl_warner(aTHX_ WARN_EXITING, "Exiting subroutine via %s",
22c35a8c 1322 PL_op_name[PL_op->op_type]);
a0d0e21e 1323 break;
7766f137 1324 case CXt_FORMAT:
e476b1b5 1325 if (ckWARN(WARN_EXITING))
ac27b0f5 1326 Perl_warner(aTHX_ WARN_EXITING, "Exiting format via %s",
7766f137
GS
1327 PL_op_name[PL_op->op_type]);
1328 break;
a0d0e21e 1329 case CXt_EVAL:
e476b1b5 1330 if (ckWARN(WARN_EXITING))
ac27b0f5 1331 Perl_warner(aTHX_ WARN_EXITING, "Exiting eval via %s",
22c35a8c 1332 PL_op_name[PL_op->op_type]);
a0d0e21e 1333 break;
0a753a76 1334 case CXt_NULL:
e476b1b5 1335 if (ckWARN(WARN_EXITING))
ac27b0f5 1336 Perl_warner(aTHX_ WARN_EXITING, "Exiting pseudo-block via %s",
22c35a8c 1337 PL_op_name[PL_op->op_type]);
0a753a76 1338 return -1;
a0d0e21e 1339 case CXt_LOOP:
cea2e8a9 1340 DEBUG_l( Perl_deb(aTHX_ "(Found loop #%ld)\n", (long)i));
a0d0e21e
LW
1341 return i;
1342 }
1343 }
1344 return i;
1345}
1346
1347void
864dbfa3 1348Perl_dounwind(pTHX_ I32 cxix)
a0d0e21e 1349{
c09156bb 1350 register PERL_CONTEXT *cx;
a0d0e21e
LW
1351 I32 optype;
1352
1353 while (cxstack_ix > cxix) {
b0d9ce38 1354 SV *sv;
c90c0ff4 1355 cx = &cxstack[cxstack_ix];
1356 DEBUG_l(PerlIO_printf(Perl_debug_log, "Unwinding block %ld, type %s\n",
22c35a8c 1357 (long) cxstack_ix, PL_block_type[CxTYPE(cx)]));
a0d0e21e 1358 /* Note: we don't need to restore the base context info till the end. */
6b35e009 1359 switch (CxTYPE(cx)) {
c90c0ff4 1360 case CXt_SUBST:
1361 POPSUBST(cx);
1362 continue; /* not break */
a0d0e21e 1363 case CXt_SUB:
b0d9ce38
GS
1364 POPSUB(cx,sv);
1365 LEAVESUB(sv);
a0d0e21e
LW
1366 break;
1367 case CXt_EVAL:
1368 POPEVAL(cx);
1369 break;
1370 case CXt_LOOP:
1371 POPLOOP(cx);
1372 break;
0a753a76 1373 case CXt_NULL:
a0d0e21e 1374 break;
7766f137
GS
1375 case CXt_FORMAT:
1376 POPFORMAT(cx);
1377 break;
a0d0e21e 1378 }
c90c0ff4 1379 cxstack_ix--;
a0d0e21e
LW
1380 }
1381}
1382
5a844595
GS
1383void
1384Perl_qerror(pTHX_ SV *err)
1385{
1386 if (PL_in_eval)
1387 sv_catsv(ERRSV, err);
1388 else if (PL_errors)
1389 sv_catsv(PL_errors, err);
1390 else
894356b3 1391 Perl_warn(aTHX_ "%"SVf, err);
5a844595
GS
1392 ++PL_error_count;
1393}
1394
a0d0e21e 1395OP *
864dbfa3 1396Perl_die_where(pTHX_ char *message, STRLEN msglen)
a0d0e21e 1397{
2d8e6c8d 1398 STRLEN n_a;
3280af22 1399 if (PL_in_eval) {
a0d0e21e 1400 I32 cxix;
c09156bb 1401 register PERL_CONTEXT *cx;
a0d0e21e
LW
1402 I32 gimme;
1403 SV **newsp;
1404
4e6ea2c3 1405 if (message) {
faef0170 1406 if (PL_in_eval & EVAL_KEEPERR) {
98eae8f5
GS
1407 static char prefix[] = "\t(in cleanup) ";
1408 SV *err = ERRSV;
1409 char *e = Nullch;
1410 if (!SvPOK(err))
1411 sv_setpv(err,"");
1412 else if (SvCUR(err) >= sizeof(prefix)+msglen-1) {
1413 e = SvPV(err, n_a);
1414 e += n_a - msglen;
1415 if (*e != *message || strNE(e,message))
1416 e = Nullch;
1417 }
1418 if (!e) {
1419 SvGROW(err, SvCUR(err)+sizeof(prefix)+msglen);
1420 sv_catpvn(err, prefix, sizeof(prefix)-1);
1421 sv_catpvn(err, message, msglen);
e476b1b5 1422 if (ckWARN(WARN_MISC)) {
98eae8f5 1423 STRLEN start = SvCUR(err)-msglen-sizeof(prefix)+1;
e476b1b5 1424 Perl_warner(aTHX_ WARN_MISC, SvPVX(err)+start);
4e6ea2c3 1425 }
4633a7c4 1426 }
4633a7c4 1427 }
1aa99e6b 1428 else {
06bf62c7 1429 sv_setpvn(ERRSV, message, msglen);
1aa99e6b
IH
1430 if (PL_hints & HINT_UTF8)
1431 SvUTF8_on(ERRSV);
1432 else
1433 SvUTF8_off(ERRSV);
1434 }
4633a7c4
LW
1435 }
1436 else
06bf62c7 1437 message = SvPVx(ERRSV, msglen);
4e6ea2c3 1438
5a844595
GS
1439 while ((cxix = dopoptoeval(cxstack_ix)) < 0
1440 && PL_curstackinfo->si_prev)
1441 {
bac4b2ad 1442 dounwind(-1);
d3acc0f7 1443 POPSTACK;
bac4b2ad 1444 }
e336de0d 1445
a0d0e21e
LW
1446 if (cxix >= 0) {
1447 I32 optype;
1448
1449 if (cxix < cxstack_ix)
1450 dounwind(cxix);
1451
3280af22 1452 POPBLOCK(cx,PL_curpm);
6b35e009 1453 if (CxTYPE(cx) != CXt_EVAL) {
bf49b057
GS
1454 PerlIO_write(Perl_error_log, "panic: die ", 11);
1455 PerlIO_write(Perl_error_log, message, msglen);
a0d0e21e
LW
1456 my_exit(1);
1457 }
1458 POPEVAL(cx);
1459
1460 if (gimme == G_SCALAR)
3280af22
NIS
1461 *++newsp = &PL_sv_undef;
1462 PL_stack_sp = newsp;
a0d0e21e
LW
1463
1464 LEAVE;
748a9306 1465
7fb6a879
GS
1466 /* LEAVE could clobber PL_curcop (see save_re_context())
1467 * XXX it might be better to find a way to avoid messing with
1468 * PL_curcop in save_re_context() instead, but this is a more
1469 * minimal fix --GSAR */
1470 PL_curcop = cx->blk_oldcop;
1471
7a2e2cd6 1472 if (optype == OP_REQUIRE) {
2d8e6c8d 1473 char* msg = SvPVx(ERRSV, n_a);
5a844595
GS
1474 DIE(aTHX_ "%sCompilation failed in require",
1475 *msg ? msg : "Unknown error\n");
7a2e2cd6 1476 }
a0d0e21e
LW
1477 return pop_return();
1478 }
1479 }
9cc2fdd3 1480 if (!message)
06bf62c7 1481 message = SvPVx(ERRSV, msglen);
d175a3f0
GS
1482 {
1483#ifdef USE_SFIO
1484 /* SFIO can really mess with your errno */
1485 int e = errno;
1486#endif
bf49b057
GS
1487 PerlIO *serr = Perl_error_log;
1488
1489 PerlIO_write(serr, message, msglen);
1490 (void)PerlIO_flush(serr);
d175a3f0
GS
1491#ifdef USE_SFIO
1492 errno = e;
1493#endif
1494 }
f86702cc 1495 my_failure_exit();
1496 /* NOTREACHED */
a0d0e21e
LW
1497 return 0;
1498}
1499
1500PP(pp_xor)
1501{
39644a26 1502 dSP; dPOPTOPssrl;
a0d0e21e
LW
1503 if (SvTRUE(left) != SvTRUE(right))
1504 RETSETYES;
1505 else
1506 RETSETNO;
1507}
1508
1509PP(pp_andassign)
1510{
39644a26 1511 dSP;
a0d0e21e
LW
1512 if (!SvTRUE(TOPs))
1513 RETURN;
1514 else
1515 RETURNOP(cLOGOP->op_other);
1516}
1517
1518PP(pp_orassign)
1519{
39644a26 1520 dSP;
a0d0e21e
LW
1521 if (SvTRUE(TOPs))
1522 RETURN;
1523 else
1524 RETURNOP(cLOGOP->op_other);
1525}
1526
a0d0e21e
LW
1527PP(pp_caller)
1528{
39644a26 1529 dSP;
a0d0e21e 1530 register I32 cxix = dopoptosub(cxstack_ix);
c09156bb 1531 register PERL_CONTEXT *cx;
2c375eb9 1532 register PERL_CONTEXT *ccstack = cxstack;
3280af22 1533 PERL_SI *top_si = PL_curstackinfo;
a0d0e21e 1534 I32 dbcxix;
54310121 1535 I32 gimme;
ed094faf 1536 char *stashname;
a0d0e21e
LW
1537 SV *sv;
1538 I32 count = 0;
1539
1540 if (MAXARG)
1541 count = POPi;
e476b1b5 1542 EXTEND(SP, 10);
a0d0e21e 1543 for (;;) {
2c375eb9
GS
1544 /* we may be in a higher stacklevel, so dig down deeper */
1545 while (cxix < 0 && top_si->si_type != PERLSI_MAIN) {
1546 top_si = top_si->si_prev;
1547 ccstack = top_si->si_cxstack;
1548 cxix = dopoptosub_at(ccstack, top_si->si_cxix);
1549 }
a0d0e21e
LW
1550 if (cxix < 0) {
1551 if (GIMME != G_ARRAY)
1552 RETPUSHUNDEF;
1553 RETURN;
1554 }
3280af22
NIS
1555 if (PL_DBsub && cxix >= 0 &&
1556 ccstack[cxix].blk_sub.cv == GvCV(PL_DBsub))
a0d0e21e
LW
1557 count++;
1558 if (!count--)
1559 break;
2c375eb9 1560 cxix = dopoptosub_at(ccstack, cxix - 1);
a0d0e21e 1561 }
2c375eb9
GS
1562
1563 cx = &ccstack[cxix];
7766f137 1564 if (CxTYPE(cx) == CXt_SUB || CxTYPE(cx) == CXt_FORMAT) {
2c375eb9
GS
1565 dbcxix = dopoptosub_at(ccstack, cxix - 1);
1566 /* We expect that ccstack[dbcxix] is CXt_SUB, anyway, the
06a5b730 1567 field below is defined for any cx. */
3280af22 1568 if (PL_DBsub && dbcxix >= 0 && ccstack[dbcxix].blk_sub.cv == GvCV(PL_DBsub))
2c375eb9 1569 cx = &ccstack[dbcxix];
06a5b730 1570 }
1571
ed094faf 1572 stashname = CopSTASHPV(cx->blk_oldcop);
a0d0e21e 1573 if (GIMME != G_ARRAY) {
ed094faf 1574 if (!stashname)
3280af22 1575 PUSHs(&PL_sv_undef);
49d8d3a1
MB
1576 else {
1577 dTARGET;
ed094faf 1578 sv_setpv(TARG, stashname);
49d8d3a1
MB
1579 PUSHs(TARG);
1580 }
a0d0e21e
LW
1581 RETURN;
1582 }
a0d0e21e 1583
ed094faf 1584 if (!stashname)
3280af22 1585 PUSHs(&PL_sv_undef);
49d8d3a1 1586 else
ed094faf
GS
1587 PUSHs(sv_2mortal(newSVpv(stashname, 0)));
1588 PUSHs(sv_2mortal(newSVpv(CopFILE(cx->blk_oldcop), 0)));
57843af0 1589 PUSHs(sv_2mortal(newSViv((I32)CopLINE(cx->blk_oldcop))));
a0d0e21e
LW
1590 if (!MAXARG)
1591 RETURN;
7766f137
GS
1592 if (CxTYPE(cx) == CXt_SUB || CxTYPE(cx) == CXt_FORMAT) {
1593 /* So is ccstack[dbcxix]. */
a0d0e21e 1594 sv = NEWSV(49, 0);
2c375eb9 1595 gv_efullname3(sv, CvGV(ccstack[cxix].blk_sub.cv), Nullch);
a0d0e21e
LW
1596 PUSHs(sv_2mortal(sv));
1597 PUSHs(sv_2mortal(newSViv((I32)cx->blk_sub.hasargs)));
1598 }
1599 else {
79cb57f6 1600 PUSHs(sv_2mortal(newSVpvn("(eval)",6)));
a0d0e21e
LW
1601 PUSHs(sv_2mortal(newSViv(0)));
1602 }
54310121 1603 gimme = (I32)cx->blk_gimme;
1604 if (gimme == G_VOID)
3280af22 1605 PUSHs(&PL_sv_undef);
54310121 1606 else
1607 PUSHs(sv_2mortal(newSViv(gimme & G_ARRAY)));
6b35e009 1608 if (CxTYPE(cx) == CXt_EVAL) {
811a4de9 1609 /* eval STRING */
06a5b730 1610 if (cx->blk_eval.old_op_type == OP_ENTEREVAL) {
4633a7c4 1611 PUSHs(cx->blk_eval.cur_text);
3280af22 1612 PUSHs(&PL_sv_no);
0f79a09d 1613 }
811a4de9 1614 /* require */
0f79a09d
GS
1615 else if (cx->blk_eval.old_namesv) {
1616 PUSHs(sv_2mortal(newSVsv(cx->blk_eval.old_namesv)));
3280af22 1617 PUSHs(&PL_sv_yes);
06a5b730 1618 }
811a4de9
GS
1619 /* eval BLOCK (try blocks have old_namesv == 0) */
1620 else {
1621 PUSHs(&PL_sv_undef);
1622 PUSHs(&PL_sv_undef);
1623 }
4633a7c4 1624 }
a682de96
GS
1625 else {
1626 PUSHs(&PL_sv_undef);
1627 PUSHs(&PL_sv_undef);
1628 }
1629 if (CxTYPE(cx) == CXt_SUB && cx->blk_sub.hasargs
ed094faf 1630 && CopSTASH_eq(PL_curcop, PL_debstash))
4633a7c4 1631 {
a0d0e21e
LW
1632 AV *ary = cx->blk_sub.argarray;
1633 int off = AvARRAY(ary) - AvALLOC(ary);
1634
3280af22 1635 if (!PL_dbargs) {
a0d0e21e 1636 GV* tmpgv;
3280af22 1637 PL_dbargs = GvAV(gv_AVadd(tmpgv = gv_fetchpv("DB::args", TRUE,
a0d0e21e 1638 SVt_PVAV)));
a5f75d66 1639 GvMULTI_on(tmpgv);
3ddcf04c 1640 AvREAL_off(PL_dbargs); /* XXX should be REIFY (see av.h) */
a0d0e21e
LW
1641 }
1642
3280af22
NIS
1643 if (AvMAX(PL_dbargs) < AvFILLp(ary) + off)
1644 av_extend(PL_dbargs, AvFILLp(ary) + off);
1645 Copy(AvALLOC(ary), AvARRAY(PL_dbargs), AvFILLp(ary) + 1 + off, SV*);
1646 AvFILLp(PL_dbargs) = AvFILLp(ary) + off;
a0d0e21e 1647 }
f3aa04c2
GS
1648 /* XXX only hints propagated via op_private are currently
1649 * visible (others are not easily accessible, since they
1650 * use the global PL_hints) */
1651 PUSHs(sv_2mortal(newSViv((I32)cx->blk_oldcop->op_private &
1652 HINT_PRIVATE_MASK)));
e476b1b5
GS
1653 {
1654 SV * mask ;
1655 SV * old_warnings = cx->blk_oldcop->cop_warnings ;
114bafba 1656
ac27b0f5 1657 if (old_warnings == pWARN_NONE ||
114bafba 1658 (old_warnings == pWARN_STD && (PL_dowarn & G_WARN_ON) == 0))
e476b1b5 1659 mask = newSVpvn(WARN_NONEstring, WARNsize) ;
ac27b0f5 1660 else if (old_warnings == pWARN_ALL ||
114bafba 1661 (old_warnings == pWARN_STD && PL_dowarn & G_WARN_ON))
e476b1b5
GS
1662 mask = newSVpvn(WARN_ALLstring, WARNsize) ;
1663 else
1664 mask = newSVsv(old_warnings);
1665 PUSHs(sv_2mortal(mask));
1666 }
a0d0e21e
LW
1667 RETURN;
1668}
1669
a0d0e21e
LW
1670PP(pp_reset)
1671{
39644a26 1672 dSP;
a0d0e21e 1673 char *tmps;
2d8e6c8d 1674 STRLEN n_a;
a0d0e21e
LW
1675
1676 if (MAXARG < 1)
1677 tmps = "";
1678 else
2d8e6c8d 1679 tmps = POPpx;
11faa288 1680 sv_reset(tmps, CopSTASH(PL_curcop));
3280af22 1681 PUSHs(&PL_sv_yes);
a0d0e21e
LW
1682 RETURN;
1683}
1684
1685PP(pp_lineseq)
1686{
1687 return NORMAL;
1688}
1689
1690PP(pp_dbstate)
1691{
533c011a 1692 PL_curcop = (COP*)PL_op;
a0d0e21e 1693 TAINT_NOT; /* Each statement is presumed innocent */
3280af22 1694 PL_stack_sp = PL_stack_base + cxstack[cxstack_ix].blk_oldsp;
a0d0e21e
LW
1695 FREETMPS;
1696
533c011a 1697 if (PL_op->op_private || SvIV(PL_DBsingle) || SvIV(PL_DBsignal) || SvIV(PL_DBtrace))
a0d0e21e 1698 {
39644a26 1699 dSP;
a0d0e21e 1700 register CV *cv;
c09156bb 1701 register PERL_CONTEXT *cx;
748a9306 1702 I32 gimme = G_ARRAY;
a0d0e21e
LW
1703 I32 hasargs;
1704 GV *gv;
1705
3280af22 1706 gv = PL_DBgv;
a0d0e21e 1707 cv = GvCV(gv);
a0d0e21e 1708 if (!cv)
cea2e8a9 1709 DIE(aTHX_ "No DB::DB routine defined");
a0d0e21e 1710
aea4f609
DM
1711 if (CvDEPTH(cv) >= 1 && !(PL_debug & DEBUG_DB_RECURSE_FLAG))
1712 /* don't do recursive DB::DB call */
a0d0e21e 1713 return NORMAL;
748a9306 1714
4633a7c4
LW
1715 ENTER;
1716 SAVETMPS;
1717
3280af22 1718 SAVEI32(PL_debug);
55497cff 1719 SAVESTACK_POS();
3280af22 1720 PL_debug = 0;
748a9306 1721 hasargs = 0;
924508f0 1722 SPAGAIN;
748a9306 1723
533c011a 1724 push_return(PL_op->op_next);
924508f0 1725 PUSHBLOCK(cx, CXt_SUB, SP);
a0d0e21e
LW
1726 PUSHSUB(cx);
1727 CvDEPTH(cv)++;
1728 (void)SvREFCNT_inc(cv);
7766f137 1729 SAVEVPTR(PL_curpad);
3280af22 1730 PL_curpad = AvARRAY((AV*)*av_fetch(CvPADLIST(cv),1,FALSE));
a0d0e21e
LW
1731 RETURNOP(CvSTART(cv));
1732 }
1733 else
1734 return NORMAL;
1735}
1736
1737PP(pp_scope)
1738{
1739 return NORMAL;
1740}
1741
1742PP(pp_enteriter)
1743{
39644a26 1744 dSP; dMARK;
c09156bb 1745 register PERL_CONTEXT *cx;
54310121 1746 I32 gimme = GIMME_V;
a0d0e21e 1747 SV **svp;
7766f137
GS
1748 U32 cxtype = CXt_LOOP;
1749#ifdef USE_ITHREADS
1750 void *iterdata;
1751#endif
a0d0e21e 1752
4633a7c4
LW
1753 ENTER;
1754 SAVETMPS;
1755
54b9620d 1756#ifdef USE_THREADS
0214ae40 1757 if (PL_op->op_flags & OPf_SPECIAL) {
0214ae40
GS
1758 svp = &THREADSV(PL_op->op_targ); /* per-thread variable */
1759 SAVEGENERICSV(*svp);
1760 *svp = NEWSV(0,0);
1761 }
a0d0e21e 1762 else
54b9620d 1763#endif /* USE_THREADS */
533c011a 1764 if (PL_op->op_targ) {
c3564e5c 1765#ifndef USE_ITHREADS
533c011a 1766 svp = &PL_curpad[PL_op->op_targ]; /* "my" variable */
54b9620d 1767 SAVESPTR(*svp);
c3564e5c
GS
1768#else
1769 SAVEPADSV(PL_op->op_targ);
7766f137
GS
1770 iterdata = (void*)PL_op->op_targ;
1771 cxtype |= CXp_PADVAR;
1772#endif
54b9620d
MB
1773 }
1774 else {
7766f137
GS
1775 GV *gv = (GV*)POPs;
1776 svp = &GvSV(gv); /* symbol table variable */
0214ae40
GS
1777 SAVEGENERICSV(*svp);
1778 *svp = NEWSV(0,0);
7766f137
GS
1779#ifdef USE_ITHREADS
1780 iterdata = (void*)gv;
1781#endif
54b9620d 1782 }
4633a7c4 1783
a0d0e21e
LW
1784 ENTER;
1785
7766f137
GS
1786 PUSHBLOCK(cx, cxtype, SP);
1787#ifdef USE_ITHREADS
1788 PUSHLOOP(cx, iterdata, MARK);
1789#else
a0d0e21e 1790 PUSHLOOP(cx, svp, MARK);
7766f137 1791#endif
533c011a 1792 if (PL_op->op_flags & OPf_STACKED) {
44a8e56a 1793 cx->blk_loop.iterary = (AV*)SvREFCNT_inc(POPs);
89ea2908
GA
1794 if (SvTYPE(cx->blk_loop.iterary) != SVt_PVAV) {
1795 dPOPss;
1796 if (SvNIOKp(sv) || !SvPOKp(sv) ||
39eb4040
GS
1797 SvNIOKp(cx->blk_loop.iterary) || !SvPOKp(cx->blk_loop.iterary) ||
1798 (looks_like_number(sv) && *SvPVX(sv) != '0' &&
1799 looks_like_number((SV*)cx->blk_loop.iterary) &&
1800 *SvPVX(cx->blk_loop.iterary) != '0'))
1801 {
89ea2908
GA
1802 if (SvNV(sv) < IV_MIN ||
1803 SvNV((SV*)cx->blk_loop.iterary) >= IV_MAX)
d470f89e 1804 DIE(aTHX_ "Range iterator outside integer range");
89ea2908
GA
1805 cx->blk_loop.iterix = SvIV(sv);
1806 cx->blk_loop.itermax = SvIV((SV*)cx->blk_loop.iterary);
1807 }
1808 else
1809 cx->blk_loop.iterlval = newSVsv(sv);
1810 }
1811 }
4633a7c4 1812 else {
3280af22
NIS
1813 cx->blk_loop.iterary = PL_curstack;
1814 AvFILLp(PL_curstack) = SP - PL_stack_base;
1815 cx->blk_loop.iterix = MARK - PL_stack_base;
4633a7c4 1816 }
a0d0e21e
LW
1817
1818 RETURN;
1819}
1820
1821PP(pp_enterloop)
1822{
39644a26 1823 dSP;
c09156bb 1824 register PERL_CONTEXT *cx;
54310121 1825 I32 gimme = GIMME_V;
a0d0e21e
LW
1826
1827 ENTER;
1828 SAVETMPS;
1829 ENTER;
1830
1831 PUSHBLOCK(cx, CXt_LOOP, SP);
1832 PUSHLOOP(cx, 0, SP);
1833
1834 RETURN;
1835}
1836
1837PP(pp_leaveloop)
1838{
39644a26 1839 dSP;
c09156bb 1840 register PERL_CONTEXT *cx;
a0d0e21e
LW
1841 I32 gimme;
1842 SV **newsp;
1843 PMOP *newpm;
1844 SV **mark;
1845
1846 POPBLOCK(cx,newpm);
4fdae800 1847 mark = newsp;
a8bba7fa 1848 newsp = PL_stack_base + cx->blk_loop.resetsp;
f86702cc 1849
a1f49e72 1850 TAINT_NOT;
54310121 1851 if (gimme == G_VOID)
1852 ; /* do nothing */
1853 else if (gimme == G_SCALAR) {
1854 if (mark < SP)
1855 *++newsp = sv_mortalcopy(*SP);
1856 else
3280af22 1857 *++newsp = &PL_sv_undef;
a0d0e21e
LW
1858 }
1859 else {
a1f49e72 1860 while (mark < SP) {
a0d0e21e 1861 *++newsp = sv_mortalcopy(*++mark);
a1f49e72
CS
1862 TAINT_NOT; /* Each item is independent */
1863 }
a0d0e21e 1864 }
f86702cc 1865 SP = newsp;
1866 PUTBACK;
1867
a8bba7fa 1868 POPLOOP(cx); /* Stack values are safe: release loop vars ... */
3280af22 1869 PL_curpm = newpm; /* ... and pop $1 et al */
f86702cc 1870
a0d0e21e
LW
1871 LEAVE;
1872 LEAVE;
1873
f86702cc 1874 return NORMAL;
a0d0e21e
LW
1875}
1876
1877PP(pp_return)
1878{
39644a26 1879 dSP; dMARK;
a0d0e21e 1880 I32 cxix;
c09156bb 1881 register PERL_CONTEXT *cx;
f86702cc 1882 bool popsub2 = FALSE;
b45de488 1883 bool clear_errsv = FALSE;
a0d0e21e
LW
1884 I32 gimme;
1885 SV **newsp;
1886 PMOP *newpm;
1887 I32 optype = 0;
b0d9ce38 1888 SV *sv;
a0d0e21e 1889
3280af22 1890 if (PL_curstackinfo->si_type == PERLSI_SORT) {
7766f137
GS
1891 if (cxstack_ix == PL_sortcxix
1892 || dopoptosub(cxstack_ix) <= PL_sortcxix)
1893 {
3280af22
NIS
1894 if (cxstack_ix > PL_sortcxix)
1895 dounwind(PL_sortcxix);
1896 AvARRAY(PL_curstack)[1] = *SP;
1897 PL_stack_sp = PL_stack_base + 1;
a0d0e21e
LW
1898 return 0;
1899 }
1900 }
1901
1902 cxix = dopoptosub(cxstack_ix);
1903 if (cxix < 0)
cea2e8a9 1904 DIE(aTHX_ "Can't return outside a subroutine");
a0d0e21e
LW
1905 if (cxix < cxstack_ix)
1906 dounwind(cxix);
1907
1908 POPBLOCK(cx,newpm);
6b35e009 1909 switch (CxTYPE(cx)) {
a0d0e21e 1910 case CXt_SUB:
f86702cc 1911 popsub2 = TRUE;
a0d0e21e
LW
1912 break;
1913 case CXt_EVAL:
b45de488
GS
1914 if (!(PL_in_eval & EVAL_KEEPERR))
1915 clear_errsv = TRUE;
a0d0e21e 1916 POPEVAL(cx);
1d76a5c3
GS
1917 if (CxTRYBLOCK(cx))
1918 break;
067f92a0 1919 lex_end();
748a9306
LW
1920 if (optype == OP_REQUIRE &&
1921 (MARK == SP || (gimme == G_SCALAR && !SvTRUE(*SP))) )
1922 {
54310121 1923 /* Unassume the success we assumed earlier. */
0f79a09d
GS
1924 SV *nsv = cx->blk_eval.old_namesv;
1925 (void)hv_delete(GvHVn(PL_incgv), SvPVX(nsv), SvCUR(nsv), G_DISCARD);
1926 DIE(aTHX_ "%s did not return a true value", SvPVX(nsv));
748a9306 1927 }
a0d0e21e 1928 break;
7766f137
GS
1929 case CXt_FORMAT:
1930 POPFORMAT(cx);
1931 break;
a0d0e21e 1932 default:
cea2e8a9 1933 DIE(aTHX_ "panic: return");
a0d0e21e
LW
1934 }
1935
a1f49e72 1936 TAINT_NOT;
a0d0e21e 1937 if (gimme == G_SCALAR) {
a29cdaf0
IZ
1938 if (MARK < SP) {
1939 if (popsub2) {
a8bba7fa 1940 if (cx->blk_sub.cv && CvDEPTH(cx->blk_sub.cv) > 1) {
a29cdaf0
IZ
1941 if (SvTEMP(TOPs)) {
1942 *++newsp = SvREFCNT_inc(*SP);
1943 FREETMPS;
1944 sv_2mortal(*newsp);
959e3673
GS
1945 }
1946 else {
1947 sv = SvREFCNT_inc(*SP); /* FREETMPS could clobber it */
a29cdaf0 1948 FREETMPS;
959e3673
GS
1949 *++newsp = sv_mortalcopy(sv);
1950 SvREFCNT_dec(sv);
a29cdaf0 1951 }
959e3673
GS
1952 }
1953 else
a29cdaf0 1954 *++newsp = (SvTEMP(*SP)) ? *SP : sv_mortalcopy(*SP);
959e3673
GS
1955 }
1956 else
a29cdaf0 1957 *++newsp = sv_mortalcopy(*SP);
959e3673
GS
1958 }
1959 else
3280af22 1960 *++newsp = &PL_sv_undef;
a0d0e21e 1961 }
54310121 1962 else if (gimme == G_ARRAY) {
a1f49e72 1963 while (++MARK <= SP) {
f86702cc 1964 *++newsp = (popsub2 && SvTEMP(*MARK))
1965 ? *MARK : sv_mortalcopy(*MARK);
a1f49e72
CS
1966 TAINT_NOT; /* Each item is independent */
1967 }
a0d0e21e 1968 }
3280af22 1969 PL_stack_sp = newsp;
a0d0e21e 1970
f86702cc 1971 /* Stack values are safe: */
1972 if (popsub2) {
b0d9ce38 1973 POPSUB(cx,sv); /* release CV and @_ ... */
f86702cc 1974 }
b0d9ce38
GS
1975 else
1976 sv = Nullsv;
3280af22 1977 PL_curpm = newpm; /* ... and pop $1 et al */
f86702cc 1978
a0d0e21e 1979 LEAVE;
b0d9ce38 1980 LEAVESUB(sv);
b45de488
GS
1981 if (clear_errsv)
1982 sv_setpv(ERRSV,"");
a0d0e21e
LW
1983 return pop_return();
1984}
1985
1986PP(pp_last)
1987{
39644a26 1988 dSP;
a0d0e21e 1989 I32 cxix;
c09156bb 1990 register PERL_CONTEXT *cx;
f86702cc 1991 I32 pop2 = 0;
a0d0e21e
LW
1992 I32 gimme;
1993 I32 optype;
1994 OP *nextop;
1995 SV **newsp;
1996 PMOP *newpm;
a8bba7fa 1997 SV **mark;
b0d9ce38 1998 SV *sv = Nullsv;
a0d0e21e 1999
533c011a 2000 if (PL_op->op_flags & OPf_SPECIAL) {
a0d0e21e
LW
2001 cxix = dopoptoloop(cxstack_ix);
2002 if (cxix < 0)
a651a37d 2003 DIE(aTHX_ "Can't \"last\" outside a loop block");
a0d0e21e
LW
2004 }
2005 else {
2006 cxix = dopoptolabel(cPVOP->op_pv);
2007 if (cxix < 0)
cea2e8a9 2008 DIE(aTHX_ "Label not found for \"last %s\"", cPVOP->op_pv);
a0d0e21e
LW
2009 }
2010 if (cxix < cxstack_ix)
2011 dounwind(cxix);
2012
2013 POPBLOCK(cx,newpm);
a8bba7fa 2014 mark = newsp;
6b35e009 2015 switch (CxTYPE(cx)) {
a0d0e21e 2016 case CXt_LOOP:
f86702cc 2017 pop2 = CXt_LOOP;
a8bba7fa
GS
2018 newsp = PL_stack_base + cx->blk_loop.resetsp;
2019 nextop = cx->blk_loop.last_op->op_next;
a0d0e21e 2020 break;
f86702cc 2021 case CXt_SUB:
f86702cc 2022 pop2 = CXt_SUB;
a0d0e21e
LW
2023 nextop = pop_return();
2024 break;
f86702cc 2025 case CXt_EVAL:
2026 POPEVAL(cx);
a0d0e21e
LW
2027 nextop = pop_return();
2028 break;
7766f137
GS
2029 case CXt_FORMAT:
2030 POPFORMAT(cx);
2031 nextop = pop_return();
2032 break;
a0d0e21e 2033 default:
cea2e8a9 2034 DIE(aTHX_ "panic: last");
a0d0e21e
LW
2035 }
2036
a1f49e72 2037 TAINT_NOT;
a0d0e21e 2038 if (gimme == G_SCALAR) {
f86702cc 2039 if (MARK < SP)
2040 *++newsp = ((pop2 == CXt_SUB) && SvTEMP(*SP))
2041 ? *SP : sv_mortalcopy(*SP);
a0d0e21e 2042 else
3280af22 2043 *++newsp = &PL_sv_undef;
a0d0e21e 2044 }
54310121 2045 else if (gimme == G_ARRAY) {
a1f49e72 2046 while (++MARK <= SP) {
f86702cc 2047 *++newsp = ((pop2 == CXt_SUB) && SvTEMP(*MARK))
2048 ? *MARK : sv_mortalcopy(*MARK);
a1f49e72
CS
2049 TAINT_NOT; /* Each item is independent */
2050 }
f86702cc 2051 }
2052 SP = newsp;
2053 PUTBACK;
2054
2055 /* Stack values are safe: */
2056 switch (pop2) {
2057 case CXt_LOOP:
a8bba7fa 2058 POPLOOP(cx); /* release loop vars ... */
4fdae800 2059 LEAVE;
f86702cc 2060 break;
2061 case CXt_SUB:
b0d9ce38 2062 POPSUB(cx,sv); /* release CV and @_ ... */
f86702cc 2063 break;
a0d0e21e 2064 }
3280af22 2065 PL_curpm = newpm; /* ... and pop $1 et al */
a0d0e21e
LW
2066
2067 LEAVE;
b0d9ce38 2068 LEAVESUB(sv);
f86702cc 2069 return nextop;
a0d0e21e
LW
2070}
2071
2072PP(pp_next)
2073{
2074 I32 cxix;
c09156bb 2075 register PERL_CONTEXT *cx;
85538317 2076 I32 inner;
a0d0e21e 2077
533c011a 2078 if (PL_op->op_flags & OPf_SPECIAL) {
a0d0e21e
LW
2079 cxix = dopoptoloop(cxstack_ix);
2080 if (cxix < 0)
a651a37d 2081 DIE(aTHX_ "Can't \"next\" outside a loop block");
a0d0e21e
LW
2082 }
2083 else {
2084 cxix = dopoptolabel(cPVOP->op_pv);
2085 if (cxix < 0)
cea2e8a9 2086 DIE(aTHX_ "Label not found for \"next %s\"", cPVOP->op_pv);
a0d0e21e
LW
2087 }
2088 if (cxix < cxstack_ix)
2089 dounwind(cxix);
2090
85538317
GS
2091 /* clear off anything above the scope we're re-entering, but
2092 * save the rest until after a possible continue block */
2093 inner = PL_scopestack_ix;
1ba6ee2b 2094 TOPBLOCK(cx);
85538317
GS
2095 if (PL_scopestack_ix < inner)
2096 leave_scope(PL_scopestack[PL_scopestack_ix]);
1ba6ee2b 2097 return cx->blk_loop.next_op;
a0d0e21e
LW
2098}
2099
2100PP(pp_redo)
2101{
2102 I32 cxix;
c09156bb 2103 register PERL_CONTEXT *cx;
a0d0e21e
LW
2104 I32 oldsave;
2105
533c011a 2106 if (PL_op->op_flags & OPf_SPECIAL) {
a0d0e21e
LW
2107 cxix = dopoptoloop(cxstack_ix);
2108 if (cxix < 0)
a651a37d 2109 DIE(aTHX_ "Can't \"redo\" outside a loop block");
a0d0e21e
LW
2110 }
2111 else {
2112 cxix = dopoptolabel(cPVOP->op_pv);
2113 if (cxix < 0)
cea2e8a9 2114 DIE(aTHX_ "Label not found for \"redo %s\"", cPVOP->op_pv);
a0d0e21e
LW
2115 }
2116 if (cxix < cxstack_ix)
2117 dounwind(cxix);
2118
2119 TOPBLOCK(cx);
3280af22 2120 oldsave = PL_scopestack[PL_scopestack_ix - 1];
a0d0e21e
LW
2121 LEAVE_SCOPE(oldsave);
2122 return cx->blk_loop.redo_op;
2123}
2124
0824fdcb 2125STATIC OP *
cea2e8a9 2126S_dofindlabel(pTHX_ OP *o, char *label, OP **opstack, OP **oplimit)
a0d0e21e
LW
2127{
2128 OP *kid;
2129 OP **ops = opstack;
fc36a67e 2130 static char too_deep[] = "Target of goto is too deeply nested";
a0d0e21e 2131
fc36a67e 2132 if (ops >= oplimit)
cea2e8a9 2133 Perl_croak(aTHX_ too_deep);
11343788
MB
2134 if (o->op_type == OP_LEAVE ||
2135 o->op_type == OP_SCOPE ||
2136 o->op_type == OP_LEAVELOOP ||
2137 o->op_type == OP_LEAVETRY)
fc36a67e 2138 {
5dc0d613 2139 *ops++ = cUNOPo->op_first;
fc36a67e 2140 if (ops >= oplimit)
cea2e8a9 2141 Perl_croak(aTHX_ too_deep);
fc36a67e 2142 }
c4aa4e48 2143 *ops = 0;
11343788 2144 if (o->op_flags & OPf_KIDS) {
a0d0e21e 2145 /* First try all the kids at this level, since that's likeliest. */
11343788 2146 for (kid = cUNOPo->op_first; kid; kid = kid->op_sibling) {
c4aa4e48
GS
2147 if ((kid->op_type == OP_NEXTSTATE || kid->op_type == OP_DBSTATE) &&
2148 kCOP->cop_label && strEQ(kCOP->cop_label, label))
a0d0e21e
LW
2149 return kid;
2150 }
11343788 2151 for (kid = cUNOPo->op_first; kid; kid = kid->op_sibling) {
3280af22 2152 if (kid == PL_lastgotoprobe)
a0d0e21e 2153 continue;
c4aa4e48
GS
2154 if ((kid->op_type == OP_NEXTSTATE || kid->op_type == OP_DBSTATE) &&
2155 (ops == opstack ||
2156 (ops[-1]->op_type != OP_NEXTSTATE &&
2157 ops[-1]->op_type != OP_DBSTATE)))
fc36a67e 2158 *ops++ = kid;
155aba94 2159 if ((o = dofindlabel(kid, label, ops, oplimit)))
11343788 2160 return o;
a0d0e21e
LW
2161 }
2162 }
c4aa4e48 2163 *ops = 0;
a0d0e21e
LW
2164 return 0;
2165}
2166
2167PP(pp_dump)
2168{
cea2e8a9 2169 return pp_goto();
a0d0e21e
LW
2170 /*NOTREACHED*/
2171}
2172
2173PP(pp_goto)
2174{
39644a26 2175 dSP;
a0d0e21e
LW
2176 OP *retop = 0;
2177 I32 ix;
c09156bb 2178 register PERL_CONTEXT *cx;
fc36a67e 2179#define GOTO_DEPTH 64
2180 OP *enterops[GOTO_DEPTH];
a0d0e21e 2181 char *label;
533c011a 2182 int do_dump = (PL_op->op_type == OP_DUMP);
1614b0e3 2183 static char must_have_label[] = "goto must have label";
a0d0e21e
LW
2184
2185 label = 0;
533c011a 2186 if (PL_op->op_flags & OPf_STACKED) {
a0d0e21e 2187 SV *sv = POPs;
2d8e6c8d 2188 STRLEN n_a;
a0d0e21e
LW
2189
2190 /* This egregious kludge implements goto &subroutine */
2191 if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVCV) {
2192 I32 cxix;
c09156bb 2193 register PERL_CONTEXT *cx;
a0d0e21e
LW
2194 CV* cv = (CV*)SvRV(sv);
2195 SV** mark;
2196 I32 items = 0;
2197 I32 oldsave;
2198
e8f7dd13 2199 retry:
4aa0a1f7 2200 if (!CvROOT(cv) && !CvXSUB(cv)) {
e8f7dd13
GS
2201 GV *gv = CvGV(cv);
2202 GV *autogv;
2203 if (gv) {
2204 SV *tmpstr;
2205 /* autoloaded stub? */
2206 if (cv != GvCV(gv) && (cv = GvCV(gv)))
2207 goto retry;
2208 autogv = gv_autoload4(GvSTASH(gv), GvNAME(gv),
2209 GvNAMELEN(gv), FALSE);
2210 if (autogv && (cv = GvCV(autogv)))
2211 goto retry;
2212 tmpstr = sv_newmortal();
2213 gv_efullname3(tmpstr, gv, Nullch);
cea2e8a9 2214 DIE(aTHX_ "Goto undefined subroutine &%s",SvPVX(tmpstr));
4aa0a1f7 2215 }
cea2e8a9 2216 DIE(aTHX_ "Goto undefined subroutine");
4aa0a1f7
AD
2217 }
2218
a0d0e21e
LW
2219 /* First do some returnish stuff. */
2220 cxix = dopoptosub(cxstack_ix);
2221 if (cxix < 0)
cea2e8a9 2222 DIE(aTHX_ "Can't goto subroutine outside a subroutine");
a0d0e21e
LW
2223 if (cxix < cxstack_ix)
2224 dounwind(cxix);
2225 TOPBLOCK(cx);
ac27b0f5 2226 if (CxTYPE(cx) == CXt_EVAL && cx->blk_eval.old_op_type == OP_ENTEREVAL)
cea2e8a9 2227 DIE(aTHX_ "Can't goto subroutine from an eval-string");
3280af22 2228 mark = PL_stack_sp;
d8b46c1b
GS
2229 if (CxTYPE(cx) == CXt_SUB && cx->blk_sub.hasargs) {
2230 /* put @_ back onto stack */
a0d0e21e
LW
2231 AV* av = cx->blk_sub.argarray;
2232
93965878 2233 items = AvFILLp(av) + 1;
3280af22
NIS
2234 PL_stack_sp++;
2235 EXTEND(PL_stack_sp, items); /* @_ could have been extended. */
2236 Copy(AvARRAY(av), PL_stack_sp, items, SV*);
2237 PL_stack_sp += items;
6d4ff0d2 2238#ifndef USE_THREADS
3280af22
NIS
2239 SvREFCNT_dec(GvAV(PL_defgv));
2240 GvAV(PL_defgv) = cx->blk_sub.savearray;
6d4ff0d2 2241#endif /* USE_THREADS */
d8b46c1b 2242 /* abandon @_ if it got reified */
62b1ebc2 2243 if (AvREAL(av)) {
d8b46c1b
GS
2244 (void)sv_2mortal((SV*)av); /* delay until return */
2245 av = newAV();
2246 av_extend(av, items-1);
2247 AvFLAGS(av) = AVf_REIFY;
2248 PL_curpad[0] = (SV*)(cx->blk_sub.argarray = av);
62b1ebc2 2249 }
a0d0e21e 2250 }
1fa4e549
AD
2251 else if (CvXSUB(cv)) { /* put GvAV(defgv) back onto stack */
2252 AV* av;
1fa4e549 2253#ifdef USE_THREADS
533c011a 2254 av = (AV*)PL_curpad[0];
1fa4e549 2255#else
3280af22 2256 av = GvAV(PL_defgv);
1fa4e549
AD
2257#endif
2258 items = AvFILLp(av) + 1;
3280af22
NIS
2259 PL_stack_sp++;
2260 EXTEND(PL_stack_sp, items); /* @_ could have been extended. */
2261 Copy(AvARRAY(av), PL_stack_sp, items, SV*);
2262 PL_stack_sp += items;
1fa4e549 2263 }
6b35e009 2264 if (CxTYPE(cx) == CXt_SUB &&
b150fb22 2265 !(CvDEPTH(cx->blk_sub.cv) = cx->blk_sub.olddepth))
a0d0e21e 2266 SvREFCNT_dec(cx->blk_sub.cv);
3280af22 2267 oldsave = PL_scopestack[PL_scopestack_ix - 1];
a0d0e21e
LW
2268 LEAVE_SCOPE(oldsave);
2269
2270 /* Now do some callish stuff. */
2271 SAVETMPS;
2272 if (CvXSUB(cv)) {
67caa1fe 2273#ifdef PERL_XSUB_OLDSTYLE
a0d0e21e 2274 if (CvOLDSTYLE(cv)) {
20ce7b12 2275 I32 (*fp3)(int,int,int);
924508f0
GS
2276 while (SP > mark) {
2277 SP[1] = SP[0];
2278 SP--;
a0d0e21e 2279 }
7766f137 2280 fp3 = (I32(*)(int,int,int))CvXSUB(cv);
ecfc5424 2281 items = (*fp3)(CvXSUBANY(cv).any_i32,
3280af22 2282 mark - PL_stack_base + 1,
ecfc5424 2283 items);
3280af22 2284 SP = PL_stack_base + items;
a0d0e21e 2285 }
67caa1fe
GS
2286 else
2287#endif /* PERL_XSUB_OLDSTYLE */
2288 {
1fa4e549
AD
2289 SV **newsp;
2290 I32 gimme;
2291
3280af22 2292 PL_stack_sp--; /* There is no cv arg. */
1fa4e549 2293 /* Push a mark for the start of arglist */
ac27b0f5 2294 PUSHMARK(mark);
0cb96387 2295 (void)(*CvXSUB(cv))(aTHXo_ cv);
1fa4e549 2296 /* Pop the current context like a decent sub should */
3280af22 2297 POPBLOCK(cx, PL_curpm);
1fa4e549 2298 /* Do _not_ use PUTBACK, keep the XSUB's return stack! */
a0d0e21e
LW
2299 }
2300 LEAVE;
2301 return pop_return();
2302 }
2303 else {
2304 AV* padlist = CvPADLIST(cv);
2305 SV** svp = AvARRAY(padlist);
6b35e009 2306 if (CxTYPE(cx) == CXt_EVAL) {
3280af22
NIS
2307 PL_in_eval = cx->blk_eval.old_in_eval;
2308 PL_eval_root = cx->blk_eval.old_eval_root;
b150fb22
RH
2309 cx->cx_type = CXt_SUB;
2310 cx->blk_sub.hasargs = 0;
2311 }
a0d0e21e
LW
2312 cx->blk_sub.cv = cv;
2313 cx->blk_sub.olddepth = CvDEPTH(cv);
2314 CvDEPTH(cv)++;
2315 if (CvDEPTH(cv) < 2)
2316 (void)SvREFCNT_inc(cv);
2317 else { /* save temporaries on recursion? */
599cee73 2318 if (CvDEPTH(cv) == 100 && ckWARN(WARN_RECURSION))
44a8e56a 2319 sub_crush_depth(cv);
93965878 2320 if (CvDEPTH(cv) > AvFILLp(padlist)) {
a0d0e21e 2321 AV *newpad = newAV();
4aa0a1f7 2322 SV **oldpad = AvARRAY(svp[CvDEPTH(cv)-1]);
93965878 2323 I32 ix = AvFILLp((AV*)svp[1]);
7766f137 2324 I32 names_fill = AvFILLp((AV*)svp[0]);
a0d0e21e 2325 svp = AvARRAY(svp[0]);
748a9306 2326 for ( ;ix > 0; ix--) {
7766f137 2327 if (names_fill >= ix && svp[ix] != &PL_sv_undef) {
748a9306 2328 char *name = SvPVX(svp[ix]);
5f05dabc 2329 if ((SvFLAGS(svp[ix]) & SVf_FAKE)
2330 || *name == '&')
2331 {
2332 /* outer lexical or anon code */
748a9306 2333 av_store(newpad, ix,
4aa0a1f7 2334 SvREFCNT_inc(oldpad[ix]) );
748a9306
LW
2335 }
2336 else { /* our own lexical */
2337 if (*name == '@')
2338 av_store(newpad, ix, sv = (SV*)newAV());
2339 else if (*name == '%')
2340 av_store(newpad, ix, sv = (SV*)newHV());
2341 else
2342 av_store(newpad, ix, sv = NEWSV(0,0));
2343 SvPADMY_on(sv);
2344 }
a0d0e21e 2345 }
7766f137 2346 else if (IS_PADGV(oldpad[ix]) || IS_PADCONST(oldpad[ix])) {
743e66e6
GS
2347 av_store(newpad, ix, sv = SvREFCNT_inc(oldpad[ix]));
2348 }
a0d0e21e 2349 else {
748a9306 2350 av_store(newpad, ix, sv = NEWSV(0,0));
a0d0e21e
LW
2351 SvPADTMP_on(sv);
2352 }
2353 }
2354 if (cx->blk_sub.hasargs) {
2355 AV* av = newAV();
2356 av_extend(av, 0);
2357 av_store(newpad, 0, (SV*)av);
2358 AvFLAGS(av) = AVf_REIFY;
2359 }
2360 av_store(padlist, CvDEPTH(cv), (SV*)newpad);
93965878 2361 AvFILLp(padlist) = CvDEPTH(cv);
a0d0e21e
LW
2362 svp = AvARRAY(padlist);
2363 }
2364 }
6d4ff0d2
MB
2365#ifdef USE_THREADS
2366 if (!cx->blk_sub.hasargs) {
533c011a 2367 AV* av = (AV*)PL_curpad[0];
ac27b0f5 2368
93965878 2369 items = AvFILLp(av) + 1;
6d4ff0d2
MB
2370 if (items) {
2371 /* Mark is at the end of the stack. */
924508f0
GS
2372 EXTEND(SP, items);
2373 Copy(AvARRAY(av), SP + 1, items, SV*);
2374 SP += items;
ac27b0f5 2375 PUTBACK ;
6d4ff0d2
MB
2376 }
2377 }
2378#endif /* USE_THREADS */
7766f137 2379 SAVEVPTR(PL_curpad);
3280af22 2380 PL_curpad = AvARRAY((AV*)svp[CvDEPTH(cv)]);
6d4ff0d2
MB
2381#ifndef USE_THREADS
2382 if (cx->blk_sub.hasargs)
2383#endif /* USE_THREADS */
2384 {
3280af22 2385 AV* av = (AV*)PL_curpad[0];
a0d0e21e
LW
2386 SV** ary;
2387
6d4ff0d2 2388#ifndef USE_THREADS
3280af22
NIS
2389 cx->blk_sub.savearray = GvAV(PL_defgv);
2390 GvAV(PL_defgv) = (AV*)SvREFCNT_inc(av);
6d4ff0d2 2391#endif /* USE_THREADS */
7032098e 2392 cx->blk_sub.oldcurpad = PL_curpad;
6d4ff0d2 2393 cx->blk_sub.argarray = av;
a0d0e21e
LW
2394 ++mark;
2395
2396 if (items >= AvMAX(av) + 1) {
2397 ary = AvALLOC(av);
2398 if (AvARRAY(av) != ary) {
2399 AvMAX(av) += AvARRAY(av) - AvALLOC(av);
2400 SvPVX(av) = (char*)ary;
2401 }
2402 if (items >= AvMAX(av) + 1) {
2403 AvMAX(av) = items - 1;
2404 Renew(ary,items+1,SV*);
2405 AvALLOC(av) = ary;
2406 SvPVX(av) = (char*)ary;
2407 }
2408 }
2409 Copy(mark,AvARRAY(av),items,SV*);
93965878 2410 AvFILLp(av) = items - 1;
d8b46c1b 2411 assert(!AvREAL(av));
a0d0e21e
LW
2412 while (items--) {
2413 if (*mark)
2414 SvTEMP_off(*mark);
2415 mark++;
2416 }
2417 }
491527d0 2418 if (PERLDB_SUB) { /* Checking curstash breaks DProf. */
44a8e56a 2419 /*
2420 * We do not care about using sv to call CV;
2421 * it's for informational purposes only.
2422 */
3280af22 2423 SV *sv = GvSV(PL_DBsub);
491527d0 2424 CV *gotocv;
ac27b0f5 2425
491527d0 2426 if (PERLDB_SUB_NN) {
56431972 2427 SvIVX(sv) = PTR2IV(cv); /* Already upgraded, saved */
491527d0
GS
2428 } else {
2429 save_item(sv);
2430 gv_efullname3(sv, CvGV(cv), Nullch);
2431 }
2432 if ( PERLDB_GOTO
864dbfa3 2433 && (gotocv = get_cv("DB::goto", FALSE)) ) {
3280af22 2434 PUSHMARK( PL_stack_sp );
864dbfa3 2435 call_sv((SV*)gotocv, G_SCALAR | G_NODEBUG);
3280af22 2436 PL_stack_sp--;
491527d0 2437 }
1ce6579f 2438 }
a0d0e21e
LW
2439 RETURNOP(CvSTART(cv));
2440 }
2441 }
1614b0e3 2442 else {
2d8e6c8d 2443 label = SvPV(sv,n_a);
1614b0e3 2444 if (!(do_dump || *label))
cea2e8a9 2445 DIE(aTHX_ must_have_label);
1614b0e3 2446 }
a0d0e21e 2447 }
533c011a 2448 else if (PL_op->op_flags & OPf_SPECIAL) {
a0d0e21e 2449 if (! do_dump)
cea2e8a9 2450 DIE(aTHX_ must_have_label);
a0d0e21e
LW
2451 }
2452 else
2453 label = cPVOP->op_pv;
2454
2455 if (label && *label) {
2456 OP *gotoprobe = 0;
2457
2458 /* find label */
2459
3280af22 2460 PL_lastgotoprobe = 0;
a0d0e21e
LW
2461 *enterops = 0;
2462 for (ix = cxstack_ix; ix >= 0; ix--) {
2463 cx = &cxstack[ix];
6b35e009 2464 switch (CxTYPE(cx)) {
a0d0e21e 2465 case CXt_EVAL:
9c5794fe
RH
2466 if (CxREALEVAL(cx)) {
2467 gotoprobe = PL_eval_root; /* XXX not good for nested eval */
2468 break;
2469 }
2470 /* else fall through */
a0d0e21e
LW
2471 case CXt_LOOP:
2472 gotoprobe = cx->blk_oldcop->op_sibling;
2473 break;
2474 case CXt_SUBST:
2475 continue;
2476 case CXt_BLOCK:
2477 if (ix)
2478 gotoprobe = cx->blk_oldcop->op_sibling;
2479 else
3280af22 2480 gotoprobe = PL_main_root;
a0d0e21e 2481 break;
b3933176
CS
2482 case CXt_SUB:
2483 if (CvDEPTH(cx->blk_sub.cv)) {
2484 gotoprobe = CvROOT(cx->blk_sub.cv);
2485 break;
2486 }
2487 /* FALL THROUGH */
7766f137 2488 case CXt_FORMAT:
0a753a76 2489 case CXt_NULL:
a651a37d 2490 DIE(aTHX_ "Can't \"goto\" out of a pseudo block");
a0d0e21e
LW
2491 default:
2492 if (ix)
cea2e8a9 2493 DIE(aTHX_ "panic: goto");
3280af22 2494 gotoprobe = PL_main_root;
a0d0e21e
LW
2495 break;
2496 }
2b597662
GS
2497 if (gotoprobe) {
2498 retop = dofindlabel(gotoprobe, label,
2499 enterops, enterops + GOTO_DEPTH);
2500 if (retop)
2501 break;
2502 }
3280af22 2503 PL_lastgotoprobe = gotoprobe;
a0d0e21e
LW
2504 }
2505 if (!retop)
cea2e8a9 2506 DIE(aTHX_ "Can't find label %s", label);
a0d0e21e
LW
2507
2508 /* pop unwanted frames */
2509
2510 if (ix < cxstack_ix) {
2511 I32 oldsave;
2512
2513 if (ix < 0)
2514 ix = 0;
2515 dounwind(ix);
2516 TOPBLOCK(cx);
3280af22 2517 oldsave = PL_scopestack[PL_scopestack_ix];
a0d0e21e
LW
2518 LEAVE_SCOPE(oldsave);
2519 }
2520
2521 /* push wanted frames */
2522
748a9306 2523 if (*enterops && enterops[1]) {
533c011a 2524 OP *oldop = PL_op;
748a9306 2525 for (ix = 1; enterops[ix]; ix++) {
533c011a 2526 PL_op = enterops[ix];
84902520
TB
2527 /* Eventually we may want to stack the needed arguments
2528 * for each op. For now, we punt on the hard ones. */
533c011a 2529 if (PL_op->op_type == OP_ENTERITER)
894356b3 2530 DIE(aTHX_ "Can't \"goto\" into the middle of a foreach loop");
fc0dc3b3 2531 CALL_FPTR(PL_op->op_ppaddr)(aTHX);
a0d0e21e 2532 }
533c011a 2533 PL_op = oldop;
a0d0e21e
LW
2534 }
2535 }
2536
2537 if (do_dump) {
a5f75d66 2538#ifdef VMS
6b88bc9c 2539 if (!retop) retop = PL_main_start;
a5f75d66 2540#endif
3280af22
NIS
2541 PL_restartop = retop;
2542 PL_do_undump = TRUE;
a0d0e21e
LW
2543
2544 my_unexec();
2545
3280af22
NIS
2546 PL_restartop = 0; /* hmm, must be GNU unexec().. */
2547 PL_do_undump = FALSE;
a0d0e21e
LW
2548 }
2549
2550 RETURNOP(retop);
2551}
2552
2553PP(pp_exit)
2554{
39644a26 2555 dSP;
a0d0e21e
LW
2556 I32 anum;
2557
2558 if (MAXARG < 1)
2559 anum = 0;
ff0cee69 2560 else {
a0d0e21e 2561 anum = SvIVx(POPs);
d98f61e7
GS
2562#ifdef VMS
2563 if (anum == 1 && (PL_op->op_private & OPpEXIT_VMSISH))
ff0cee69 2564 anum = 0;
2565#endif
2566 }
cc3604b1 2567 PL_exit_flags |= PERL_EXIT_EXPECTED;
a0d0e21e 2568 my_exit(anum);
3280af22 2569 PUSHs(&PL_sv_undef);
a0d0e21e
LW
2570 RETURN;
2571}
2572
2573#ifdef NOTYET
2574PP(pp_nswitch)
2575{
39644a26 2576 dSP;
65202027 2577 NV value = SvNVx(GvSV(cCOP->cop_gv));
a0d0e21e
LW
2578 register I32 match = I_32(value);
2579
2580 if (value < 0.0) {
65202027 2581 if (((NV)match) > value)
a0d0e21e
LW
2582 --match; /* was fractional--truncate other way */
2583 }
2584 match -= cCOP->uop.scop.scop_offset;
2585 if (match < 0)
2586 match = 0;
2587 else if (match > cCOP->uop.scop.scop_max)
2588 match = cCOP->uop.scop.scop_max;
6b88bc9c
GS
2589 PL_op = cCOP->uop.scop.scop_next[match];
2590 RETURNOP(PL_op);
a0d0e21e
LW
2591}
2592
2593PP(pp_cswitch)
2594{
39644a26 2595 dSP;
a0d0e21e
LW
2596 register I32 match;
2597
6b88bc9c
GS
2598 if (PL_multiline)
2599 PL_op = PL_op->op_next; /* can't assume anything */
a0d0e21e 2600 else {
2d8e6c8d
GS
2601 STRLEN n_a;
2602 match = *(SvPVx(GvSV(cCOP->cop_gv), n_a)) & 255;
a0d0e21e
LW
2603 match -= cCOP->uop.scop.scop_offset;
2604 if (match < 0)
2605 match = 0;
2606 else if (match > cCOP->uop.scop.scop_max)
2607 match = cCOP->uop.scop.scop_max;
6b88bc9c 2608 PL_op = cCOP->uop.scop.scop_next[match];
a0d0e21e 2609 }
6b88bc9c 2610 RETURNOP(PL_op);
a0d0e21e
LW
2611}
2612#endif
2613
2614/* Eval. */
2615
0824fdcb 2616STATIC void
cea2e8a9 2617S_save_lines(pTHX_ AV *array, SV *sv)
a0d0e21e
LW
2618{
2619 register char *s = SvPVX(sv);
2620 register char *send = SvPVX(sv) + SvCUR(sv);
2621 register char *t;
2622 register I32 line = 1;
2623
2624 while (s && s < send) {
2625 SV *tmpstr = NEWSV(85,0);
2626
2627 sv_upgrade(tmpstr, SVt_PVMG);
2628 t = strchr(s, '\n');
2629 if (t)
2630 t++;
2631 else
2632 t = send;
2633
2634 sv_setpvn(tmpstr, s, t - s);
2635 av_store(array, line++, tmpstr);
2636 s = t;
2637 }
2638}
2639
14dd3ad8 2640#ifdef PERL_FLEXIBLE_EXCEPTIONS
312caa8e 2641STATIC void *
cea2e8a9 2642S_docatch_body(pTHX_ va_list args)
312caa8e 2643{
14dd3ad8
GS
2644 return docatch_body();
2645}
2646#endif
2647
2648STATIC void *
2649S_docatch_body(pTHX)
2650{
cea2e8a9 2651 CALLRUNOPS(aTHX);
312caa8e
CS
2652 return NULL;
2653}
2654
0824fdcb 2655STATIC OP *
cea2e8a9 2656S_docatch(pTHX_ OP *o)
1e422769 2657{
6224f72b 2658 int ret;
533c011a 2659 OP *oldop = PL_op;
0cdb2077 2660 volatile PERL_SI *cursi = PL_curstackinfo;
db36c5a1 2661 dJMPENV;
1e422769 2662
1e422769 2663#ifdef DEBUGGING
54310121 2664 assert(CATCH_GET == TRUE);
1e422769 2665#endif
312caa8e 2666 PL_op = o;
14dd3ad8 2667#ifdef PERL_FLEXIBLE_EXCEPTIONS
312caa8e 2668 redo_body:
db36c5a1 2669 CALLPROTECT(aTHX_ pcur_env, &ret, MEMBER_TO_FPTR(S_docatch_body));
14dd3ad8
GS
2670#else
2671 JMPENV_PUSH(ret);
2672#endif
6224f72b 2673 switch (ret) {
312caa8e 2674 case 0:
14dd3ad8
GS
2675#ifndef PERL_FLEXIBLE_EXCEPTIONS
2676 redo_body:
2677 docatch_body();
2678#endif
312caa8e
CS
2679 break;
2680 case 3:
0cdb2077 2681 if (PL_restartop && cursi == PL_curstackinfo) {
312caa8e
CS
2682 PL_op = PL_restartop;
2683 PL_restartop = 0;
2684 goto redo_body;
2685 }
2686 /* FALL THROUGH */
2687 default:
14dd3ad8 2688 JMPENV_POP;
533c011a 2689 PL_op = oldop;
6224f72b 2690 JMPENV_JUMP(ret);
1e422769 2691 /* NOTREACHED */
1e422769 2692 }
14dd3ad8 2693 JMPENV_POP;
533c011a 2694 PL_op = oldop;
1e422769 2695 return Nullop;
2696}
2697
c277df42 2698OP *
864dbfa3 2699Perl_sv_compile_2op(pTHX_ SV *sv, OP** startop, char *code, AV** avp)
c277df42
IZ
2700/* sv Text to convert to OP tree. */
2701/* startop op_free() this to undo. */
2702/* code Short string id of the caller. */
2703{
2704 dSP; /* Make POPBLOCK work. */
2705 PERL_CONTEXT *cx;
2706 SV **newsp;
f987c7de 2707 I32 gimme = 0; /* SUSPECT - INITIALZE TO WHAT? NI-S */
c277df42
IZ
2708 I32 optype;
2709 OP dummy;
155aba94 2710 OP *rop;
83ee9e09
GS
2711 char tbuf[TYPE_DIGITS(long) + 12 + 10];
2712 char *tmpbuf = tbuf;
c277df42
IZ
2713 char *safestr;
2714
2715 ENTER;
2716 lex_start(sv);
2717 SAVETMPS;
2718 /* switch to eval mode */
2719
cbce877f 2720 if (PL_curcop == &PL_compiling) {
f4dd75d9 2721 SAVECOPSTASH_FREE(&PL_compiling);
11faa288 2722 CopSTASH_set(&PL_compiling, PL_curstash);
cbce877f 2723 }
83ee9e09
GS
2724 if (PERLDB_NAMEEVAL && CopLINE(PL_curcop)) {
2725 SV *sv = sv_newmortal();
2726 Perl_sv_setpvf(aTHX_ sv, "_<(%.10seval %lu)[%s:%"IVdf"]",
2727 code, (unsigned long)++PL_evalseq,
2728 CopFILE(PL_curcop), (IV)CopLINE(PL_curcop));
2729 tmpbuf = SvPVX(sv);
2730 }
2731 else
2732 sprintf(tmpbuf, "_<(%.10s_eval %lu)", code, (unsigned long)++PL_evalseq);
f4dd75d9 2733 SAVECOPFILE_FREE(&PL_compiling);
57843af0 2734 CopFILE_set(&PL_compiling, tmpbuf+2);
f4dd75d9 2735 SAVECOPLINE(&PL_compiling);
57843af0 2736 CopLINE_set(&PL_compiling, 1);
c277df42
IZ
2737 /* XXX For C<eval "...">s within BEGIN {} blocks, this ends up
2738 deleting the eval's FILEGV from the stash before gv_check() runs
2739 (i.e. before run-time proper). To work around the coredump that
2740 ensues, we always turn GvMULTI_on for any globals that were
2741 introduced within evals. See force_ident(). GSAR 96-10-12 */
2742 safestr = savepv(tmpbuf);
3280af22 2743 SAVEDELETE(PL_defstash, safestr, strlen(safestr));
b3ac6de7 2744 SAVEHINTS();
d1ca3daa 2745#ifdef OP_IN_REGISTER
6b88bc9c 2746 PL_opsave = op;
d1ca3daa 2747#else
7766f137 2748 SAVEVPTR(PL_op);
d1ca3daa 2749#endif
1aa99e6b 2750 PL_hints &= HINT_UTF8;
c277df42 2751
533c011a 2752 PL_op = &dummy;
13b51b79 2753 PL_op->op_type = OP_ENTEREVAL;
533c011a 2754 PL_op->op_flags = 0; /* Avoid uninit warning. */
160cb429 2755 PUSHBLOCK(cx, CXt_EVAL|(PL_curcop == &PL_compiling ? 0 : CXp_REAL), SP);
cc49e20b 2756 PUSHEVAL(cx, 0, Nullgv);
c277df42 2757 rop = doeval(G_SCALAR, startop);
13b51b79 2758 POPBLOCK(cx,PL_curpm);
e84b9f1f 2759 POPEVAL(cx);
c277df42
IZ
2760
2761 (*startop)->op_type = OP_NULL;
22c35a8c 2762 (*startop)->op_ppaddr = PL_ppaddr[OP_NULL];
c277df42 2763 lex_end();
3280af22 2764 *avp = (AV*)SvREFCNT_inc(PL_comppad);
c277df42 2765 LEAVE;
13b51b79 2766 if (PL_curcop == &PL_compiling)
a0ed51b3 2767 PL_compiling.op_private = PL_hints;
d1ca3daa 2768#ifdef OP_IN_REGISTER
6b88bc9c 2769 op = PL_opsave;
d1ca3daa 2770#endif
c277df42
IZ
2771 return rop;
2772}
2773
0f15f207 2774/* With USE_THREADS, eval_owner must be held on entry to doeval */
0824fdcb 2775STATIC OP *
cea2e8a9 2776S_doeval(pTHX_ int gimme, OP** startop)
a0d0e21e
LW
2777{
2778 dSP;
533c011a 2779 OP *saveop = PL_op;
ff3ff8d1 2780 CV *caller;
748a9306 2781 AV* comppadlist;
67a38de0 2782 I32 i;
a0d0e21e 2783
6dc8a9e4
IZ
2784 PL_in_eval = ((saveop && saveop->op_type == OP_REQUIRE)
2785 ? (EVAL_INREQUIRE | (PL_in_eval & EVAL_INEVAL))
2786 : EVAL_INEVAL);
a0d0e21e 2787
1ce6579f 2788 PUSHMARK(SP);
2789
a0d0e21e
LW
2790 /* set up a scratch pad */
2791
3280af22 2792 SAVEI32(PL_padix);
7766f137 2793 SAVEVPTR(PL_curpad);
3280af22
NIS
2794 SAVESPTR(PL_comppad);
2795 SAVESPTR(PL_comppad_name);
2796 SAVEI32(PL_comppad_name_fill);
2797 SAVEI32(PL_min_intro_pending);
2798 SAVEI32(PL_max_intro_pending);
748a9306 2799
3280af22 2800 caller = PL_compcv;
6b35e009 2801 for (i = cxstack_ix - 1; i >= 0; i--) {
67a38de0 2802 PERL_CONTEXT *cx = &cxstack[i];
6b35e009 2803 if (CxTYPE(cx) == CXt_EVAL)
67a38de0 2804 break;
7766f137 2805 else if (CxTYPE(cx) == CXt_SUB || CxTYPE(cx) == CXt_FORMAT) {
67a38de0
NIS
2806 caller = cx->blk_sub.cv;
2807 break;
2808 }
2809 }
2810
3280af22
NIS
2811 SAVESPTR(PL_compcv);
2812 PL_compcv = (CV*)NEWSV(1104,0);
2813 sv_upgrade((SV *)PL_compcv, SVt_PVCV);
1aff0e91 2814 CvEVAL_on(PL_compcv);
11343788 2815#ifdef USE_THREADS
533c011a
NIS
2816 CvOWNER(PL_compcv) = 0;
2817 New(666, CvMUTEXP(PL_compcv), 1, perl_mutex);
2818 MUTEX_INIT(CvMUTEXP(PL_compcv));
11343788 2819#endif /* USE_THREADS */
748a9306 2820
3280af22
NIS
2821 PL_comppad = newAV();
2822 av_push(PL_comppad, Nullsv);
2823 PL_curpad = AvARRAY(PL_comppad);
2824 PL_comppad_name = newAV();
2825 PL_comppad_name_fill = 0;
2826 PL_min_intro_pending = 0;
2827 PL_padix = 0;
11343788 2828#ifdef USE_THREADS
79cb57f6 2829 av_store(PL_comppad_name, 0, newSVpvn("@_", 2));
533c011a
NIS
2830 PL_curpad[0] = (SV*)newAV();
2831 SvPADMY_on(PL_curpad[0]); /* XXX Needed? */
11343788 2832#endif /* USE_THREADS */
a0d0e21e 2833
748a9306
LW
2834 comppadlist = newAV();
2835 AvREAL_off(comppadlist);
3280af22
NIS
2836 av_store(comppadlist, 0, (SV*)PL_comppad_name);
2837 av_store(comppadlist, 1, (SV*)PL_comppad);
2838 CvPADLIST(PL_compcv) = comppadlist;
2c05e328 2839
faa7e5bb
GS
2840 if (!saveop ||
2841 (saveop->op_type != OP_REQUIRE && saveop->op_type != OP_DOFILE))
2842 {
3280af22 2843 CvOUTSIDE(PL_compcv) = (CV*)SvREFCNT_inc(caller);
faa7e5bb 2844 }
07055b4c 2845
3280af22 2846 SAVEFREESV(PL_compcv);
748a9306 2847
a0d0e21e
LW
2848 /* make sure we compile in the right package */
2849
ed094faf 2850 if (CopSTASH_ne(PL_curcop, PL_curstash)) {
3280af22 2851 SAVESPTR(PL_curstash);
ed094faf 2852 PL_curstash = CopSTASH(PL_curcop);
a0d0e21e 2853 }
3280af22
NIS
2854 SAVESPTR(PL_beginav);
2855 PL_beginav = newAV();
2856 SAVEFREESV(PL_beginav);
24944567 2857 SAVEI32(PL_error_count);
a0d0e21e
LW
2858
2859 /* try to compile it */
2860
3280af22
NIS
2861 PL_eval_root = Nullop;
2862 PL_error_count = 0;
2863 PL_curcop = &PL_compiling;
2864 PL_curcop->cop_arybase = 0;
2865 SvREFCNT_dec(PL_rs);
79cb57f6 2866 PL_rs = newSVpvn("\n", 1);
c277df42 2867 if (saveop && saveop->op_flags & OPf_SPECIAL)
faef0170 2868 PL_in_eval |= EVAL_KEEPERR;
1ce6579f 2869 else
38a03e6e 2870 sv_setpv(ERRSV,"");
3280af22 2871 if (yyparse() || PL_error_count || !PL_eval_root) {
a0d0e21e
LW
2872 SV **newsp;
2873 I32 gimme;
c09156bb 2874 PERL_CONTEXT *cx;
c277df42 2875 I32 optype = 0; /* Might be reset by POPEVAL. */
2d8e6c8d 2876 STRLEN n_a;
097ee67d 2877
533c011a 2878 PL_op = saveop;
3280af22
NIS
2879 if (PL_eval_root) {
2880 op_free(PL_eval_root);
2881 PL_eval_root = Nullop;
a0d0e21e 2882 }
3280af22 2883 SP = PL_stack_base + POPMARK; /* pop original mark */
c277df42 2884 if (!startop) {
3280af22 2885 POPBLOCK(cx,PL_curpm);
c277df42
IZ
2886 POPEVAL(cx);
2887 pop_return();
2888 }
a0d0e21e
LW
2889 lex_end();
2890 LEAVE;
7a2e2cd6 2891 if (optype == OP_REQUIRE) {
2d8e6c8d 2892 char* msg = SvPVx(ERRSV, n_a);
5a844595
GS
2893 DIE(aTHX_ "%sCompilation failed in require",
2894 *msg ? msg : "Unknown error\n");
2895 }
2896 else if (startop) {
2d8e6c8d 2897 char* msg = SvPVx(ERRSV, n_a);
c277df42 2898
3280af22 2899 POPBLOCK(cx,PL_curpm);
c277df42 2900 POPEVAL(cx);
5a844595
GS
2901 Perl_croak(aTHX_ "%sCompilation failed in regexp",
2902 (*msg ? msg : "Unknown error\n"));
7a2e2cd6 2903 }
3280af22
NIS
2904 SvREFCNT_dec(PL_rs);
2905 PL_rs = SvREFCNT_inc(PL_nrs);
f2134d95 2906#ifdef USE_THREADS
533c011a
NIS
2907 MUTEX_LOCK(&PL_eval_mutex);
2908 PL_eval_owner = 0;
2909 COND_SIGNAL(&PL_eval_cond);
2910 MUTEX_UNLOCK(&PL_eval_mutex);
f2134d95 2911#endif /* USE_THREADS */
a0d0e21e
LW
2912 RETPUSHUNDEF;
2913 }
3280af22
NIS
2914 SvREFCNT_dec(PL_rs);
2915 PL_rs = SvREFCNT_inc(PL_nrs);
57843af0 2916 CopLINE_set(&PL_compiling, 0);
c277df42 2917 if (startop) {
3280af22
NIS
2918 *startop = PL_eval_root;
2919 SvREFCNT_dec(CvOUTSIDE(PL_compcv));
2920 CvOUTSIDE(PL_compcv) = Nullcv;
c277df42 2921 } else
3280af22 2922 SAVEFREEOP(PL_eval_root);
54310121 2923 if (gimme & G_VOID)
3280af22 2924 scalarvoid(PL_eval_root);
54310121 2925 else if (gimme & G_ARRAY)
3280af22 2926 list(PL_eval_root);
a0d0e21e 2927 else
3280af22 2928 scalar(PL_eval_root);
a0d0e21e
LW
2929
2930 DEBUG_x(dump_eval());
2931
55497cff 2932 /* Register with debugger: */
84902520 2933 if (PERLDB_INTER && saveop->op_type == OP_REQUIRE) {
864dbfa3 2934 CV *cv = get_cv("DB::postponed", FALSE);
55497cff 2935 if (cv) {
2936 dSP;
924508f0 2937 PUSHMARK(SP);
cc49e20b 2938 XPUSHs((SV*)CopFILEGV(&PL_compiling));
55497cff 2939 PUTBACK;
864dbfa3 2940 call_sv((SV*)cv, G_DISCARD);
55497cff 2941 }
2942 }
2943
a0d0e21e
LW
2944 /* compiled okay, so do it */
2945
3280af22
NIS
2946 CvDEPTH(PL_compcv) = 1;
2947 SP = PL_stack_base + POPMARK; /* pop original mark */
533c011a 2948 PL_op = saveop; /* The caller may need it. */
6dc8a9e4 2949 PL_lex_state = LEX_NOTPARSING; /* $^S needs this. */
b35b2403 2950#ifdef USE_THREADS
533c011a
NIS
2951 MUTEX_LOCK(&PL_eval_mutex);
2952 PL_eval_owner = 0;
2953 COND_SIGNAL(&PL_eval_cond);
2954 MUTEX_UNLOCK(&PL_eval_mutex);
b35b2403 2955#endif /* USE_THREADS */
5dc0d613 2956
3280af22 2957 RETURNOP(PL_eval_start);
a0d0e21e
LW
2958}
2959
a6c40364 2960STATIC PerlIO *
cea2e8a9 2961S_doopen_pmc(pTHX_ const char *name, const char *mode)
b295d113
TH
2962{
2963 STRLEN namelen = strlen(name);
2964 PerlIO *fp;
2965
7894fbab 2966 if (namelen > 3 && strEQ(name + namelen - 3, ".pm")) {
cea2e8a9 2967 SV *pmcsv = Perl_newSVpvf(aTHX_ "%s%c", name, 'c');
b295d113
TH
2968 char *pmc = SvPV_nolen(pmcsv);
2969 Stat_t pmstat;
a6c40364
GS
2970 Stat_t pmcstat;
2971 if (PerlLIO_stat(pmc, &pmcstat) < 0) {
b295d113 2972 fp = PerlIO_open(name, mode);
a6c40364
GS
2973 }
2974 else {
b295d113 2975 if (PerlLIO_stat(name, &pmstat) < 0 ||
a6c40364
GS
2976 pmstat.st_mtime < pmcstat.st_mtime)
2977 {
2978 fp = PerlIO_open(pmc, mode);
2979 }
2980 else {
2981 fp = PerlIO_open(name, mode);
2982 }
b295d113 2983 }
a6c40364
GS
2984 SvREFCNT_dec(pmcsv);
2985 }
2986 else {
2987 fp = PerlIO_open(name, mode);
b295d113 2988 }
b295d113
TH
2989 return fp;
2990}
2991
a0d0e21e
LW
2992PP(pp_require)
2993{
39644a26 2994 dSP;
c09156bb 2995 register PERL_CONTEXT *cx;
a0d0e21e
LW
2996 SV *sv;
2997 char *name;
6132ea6c 2998 STRLEN len;
46fc3d4c 2999 char *tryname;
3000 SV *namesv = Nullsv;
a0d0e21e
LW
3001 SV** svp;
3002 I32 gimme = G_SCALAR;
760ac839 3003 PerlIO *tryrsfp = 0;
2d8e6c8d 3004 STRLEN n_a;
bbed91b5
KF
3005 int filter_has_file = 0;
3006 GV *filter_child_proc = 0;
3007 SV *filter_state = 0;
3008 SV *filter_sub = 0;
a0d0e21e
LW
3009
3010 sv = POPs;
a7cb1f99 3011 if (SvNIOKp(sv)) {
4305d8ab
GS
3012 if (SvPOK(sv) && SvNOK(sv)) { /* require v5.6.1 */
3013 UV rev = 0, ver = 0, sver = 0;
ba210ebe 3014 STRLEN len;
a7cb1f99
GS
3015 U8 *s = (U8*)SvPVX(sv);
3016 U8 *end = (U8*)SvPVX(sv) + SvCUR(sv);
3017 if (s < end) {
9041c2e3 3018 rev = utf8n_to_uvchr(s, end - s, &len, 0);
a7cb1f99
GS
3019 s += len;
3020 if (s < end) {
9041c2e3 3021 ver = utf8n_to_uvchr(s, end - s, &len, 0);
a7cb1f99
GS
3022 s += len;
3023 if (s < end)
9041c2e3 3024 sver = utf8n_to_uvchr(s, end - s, &len, 0);
a7cb1f99 3025 }
a7cb1f99 3026 }
a7cb1f99
GS
3027 if (PERL_REVISION < rev
3028 || (PERL_REVISION == rev
3029 && (PERL_VERSION < ver
3030 || (PERL_VERSION == ver
3031 && PERL_SUBVERSION < sver))))
3032 {
cc507455 3033 DIE(aTHX_ "Perl v%"UVuf".%"UVuf".%"UVuf" required--this is only "
894356b3 3034 "v%d.%d.%d, stopped", rev, ver, sver, PERL_REVISION,
a7cb1f99
GS
3035 PERL_VERSION, PERL_SUBVERSION);
3036 }
4305d8ab 3037 RETPUSHYES;
a7cb1f99
GS
3038 }
3039 else if (!SvPOKp(sv)) { /* require 5.005_03 */
a7cb1f99
GS
3040 if ((NV)PERL_REVISION + ((NV)PERL_VERSION/(NV)1000)
3041 + ((NV)PERL_SUBVERSION/(NV)1000000)
3042 + 0.00000099 < SvNV(sv))
3043 {
dbe7b177
GS
3044 NV nrev = SvNV(sv);
3045 UV rev = (UV)nrev;
3046 NV nver = (nrev - rev) * 1000;
3047 UV ver = (UV)(nver + 0.0009);
3048 NV nsver = (nver - ver) * 1000;
3049 UV sver = (UV)(nsver + 0.0009);
3050
cc507455
GS
3051 /* help out with the "use 5.6" confusion */
3052 if (sver == 0 && (rev > 5 || (rev == 5 && ver >= 100))) {
3053 DIE(aTHX_ "Perl v%"UVuf".%"UVuf".%"UVuf" required--"
3054 "this is only v%d.%d.%d, stopped"
3055 " (did you mean v%"UVuf".%"UVuf".0?)",
3056 rev, ver, sver, PERL_REVISION, PERL_VERSION,
3057 PERL_SUBVERSION, rev, ver/100);
3058 }
3059 else {
3060 DIE(aTHX_ "Perl v%"UVuf".%"UVuf".%"UVuf" required--"
3061 "this is only v%d.%d.%d, stopped",
3062 rev, ver, sver, PERL_REVISION, PERL_VERSION,
3063 PERL_SUBVERSION);
3064 }
a7cb1f99 3065 }
4305d8ab 3066 RETPUSHYES;
a7cb1f99 3067 }
a0d0e21e 3068 }
6132ea6c
GS
3069 name = SvPV(sv, len);
3070 if (!(name && len > 0 && *name))
cea2e8a9 3071 DIE(aTHX_ "Null filename used");
4633a7c4 3072 TAINT_PROPER("require");
533c011a 3073 if (PL_op->op_type == OP_REQUIRE &&
3280af22
NIS
3074 (svp = hv_fetch(GvHVn(PL_incgv), name, len, 0)) &&
3075 *svp != &PL_sv_undef)
a0d0e21e
LW
3076 RETPUSHYES;
3077
3078 /* prepare to compile file */
3079
084592ab 3080#ifdef MACOS_TRADITIONAL
57843af0 3081 if (PERL_FILE_IS_ABSOLUTE(name)
084592ab 3082 || (*name == ':' && name[1] != ':' && strchr(name+2, ':')))
a0d0e21e 3083 {
46fc3d4c 3084 tryname = name;
a6c40364 3085 tryrsfp = doopen_pmc(name,PERL_SCRIPT_MODE);
bf4acbe4
GS
3086 /* We consider paths of the form :a:b ambiguous and interpret them first
3087 as global then as local
3088 */
084592ab 3089 if (!tryrsfp && *name == ':' && name[1] != ':' && strchr(name+2, ':'))
bf4acbe4
GS
3090 goto trylocal;
3091 }
ac27b0f5 3092 else
bf4acbe4
GS
3093trylocal: {
3094#else
084592ab
CN
3095 if (PERL_FILE_IS_ABSOLUTE(name)
3096 || (*name == '.' && (name[1] == '/' ||
3097 (name[1] == '.' && name[2] == '/'))))
3098 {
3099 tryname = name;
3100 tryrsfp = doopen_pmc(name,PERL_SCRIPT_MODE);
a0d0e21e
LW
3101 }
3102 else {
bf4acbe4 3103#endif
3280af22 3104 AV *ar = GvAVn(PL_incgv);
a0d0e21e 3105 I32 i;
748a9306 3106#ifdef VMS
46fc3d4c 3107 char *unixname;
3108 if ((unixname = tounixspec(name, Nullch)) != Nullch)
3109#endif
3110 {
3111 namesv = NEWSV(806, 0);
3112 for (i = 0; i <= AvFILL(ar); i++) {
bbed91b5
KF
3113 SV *dirsv = *av_fetch(ar, i, TRUE);
3114
3115 if (SvROK(dirsv)) {
3116 int count;
3117 SV *loader = dirsv;
3118
3119 if (SvTYPE(SvRV(loader)) == SVt_PVAV) {
3120 loader = *av_fetch((AV *)SvRV(loader), 0, TRUE);
3121 }
3122
b900a521
JH
3123 Perl_sv_setpvf(aTHX_ namesv, "/loader/0x%"UVxf"/%s",
3124 PTR2UV(SvANY(loader)), name);
bbed91b5
KF
3125 tryname = SvPVX(namesv);
3126 tryrsfp = 0;
3127
3128 ENTER;
3129 SAVETMPS;
3130 EXTEND(SP, 2);
3131
3132 PUSHMARK(SP);
3133 PUSHs(dirsv);
3134 PUSHs(sv);
3135 PUTBACK;
e982885c
NC
3136 if (sv_isobject(loader))
3137 count = call_method("INC", G_ARRAY);
3138 else
3139 count = call_sv(loader, G_ARRAY);
bbed91b5
KF
3140 SPAGAIN;
3141
3142 if (count > 0) {
3143 int i = 0;
3144 SV *arg;
3145
3146 SP -= count - 1;
3147 arg = SP[i++];
3148
3149 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVGV) {
3150 arg = SvRV(arg);
3151 }
3152
3153 if (SvTYPE(arg) == SVt_PVGV) {
3154 IO *io = GvIO((GV *)arg);
3155
3156 ++filter_has_file;
3157
3158 if (io) {
3159 tryrsfp = IoIFP(io);
50952442 3160 if (IoTYPE(io) == IoTYPE_PIPE) {
bbed91b5
KF
3161 /* reading from a child process doesn't
3162 nest -- when returning from reading
3163 the inner module, the outer one is
3164 unreadable (closed?) I've tried to
3165 save the gv to manage the lifespan of
3166 the pipe, but this didn't help. XXX */
3167 filter_child_proc = (GV *)arg;
520c758a 3168 (void)SvREFCNT_inc(filter_child_proc);
bbed91b5
KF
3169 }
3170 else {
3171 if (IoOFP(io) && IoOFP(io) != IoIFP(io)) {
3172 PerlIO_close(IoOFP(io));
3173 }
3174 IoIFP(io) = Nullfp;
3175 IoOFP(io) = Nullfp;
3176 }
3177 }
3178
3179 if (i < count) {
3180 arg = SP[i++];
3181 }
3182 }
3183
3184 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVCV) {
3185 filter_sub = arg;
520c758a 3186 (void)SvREFCNT_inc(filter_sub);
bbed91b5
KF
3187
3188 if (i < count) {
3189 filter_state = SP[i];
520c758a 3190 (void)SvREFCNT_inc(filter_state);
bbed91b5
KF
3191 }
3192
3193 if (tryrsfp == 0) {
3194 tryrsfp = PerlIO_open("/dev/null",
3195 PERL_SCRIPT_MODE);
3196 }
3197 }
3198 }
3199
3200 PUTBACK;
3201 FREETMPS;
3202 LEAVE;
3203
3204 if (tryrsfp) {
3205 break;
3206 }
3207
3208 filter_has_file = 0;
3209 if (filter_child_proc) {
3210 SvREFCNT_dec(filter_child_proc);
3211 filter_child_proc = 0;
3212 }
3213 if (filter_state) {
3214 SvREFCNT_dec(filter_state);
3215 filter_state = 0;
3216 }
3217 if (filter_sub) {
3218 SvREFCNT_dec(filter_sub);
3219 filter_sub = 0;
3220 }
3221 }
3222 else {
3223 char *dir = SvPVx(dirsv, n_a);
bf4acbe4 3224#ifdef MACOS_TRADITIONAL
eae9c151
JH
3225 char buf[256];
3226 Perl_sv_setpvf(aTHX_ namesv, "%s%s", MacPerl_CanonDir(dir, buf), name+(name[0] == ':'));
bf4acbe4 3227#else
46fc3d4c 3228#ifdef VMS
bbed91b5
KF
3229 char *unixdir;
3230 if ((unixdir = tounixpath(dir, Nullch)) == Nullch)
3231 continue;
3232 sv_setpv(namesv, unixdir);
3233 sv_catpv(namesv, unixname);
748a9306 3234#else
bbed91b5 3235 Perl_sv_setpvf(aTHX_ namesv, "%s/%s", dir, name);
748a9306 3236#endif
bf4acbe4 3237#endif
bbed91b5
KF
3238 TAINT_PROPER("require");
3239 tryname = SvPVX(namesv);
bf4acbe4
GS
3240#ifdef MACOS_TRADITIONAL
3241 {
3242 /* Convert slashes in the name part, but not the directory part, to colons */
3243 char * colon;
3244 for (colon = tryname+strlen(dir); colon = strchr(colon, '/'); )
3245 *colon++ = ':';
3246 }
3247#endif
bbed91b5
KF
3248 tryrsfp = doopen_pmc(tryname, PERL_SCRIPT_MODE);
3249 if (tryrsfp) {
3250 if (tryname[0] == '.' && tryname[1] == '/')
3251 tryname += 2;
3252 break;
3253 }
46fc3d4c 3254 }
a0d0e21e
LW
3255 }
3256 }
3257 }
f4dd75d9 3258 SAVECOPFILE_FREE(&PL_compiling);
57843af0 3259 CopFILE_set(&PL_compiling, tryrsfp ? tryname : name);
46fc3d4c 3260 SvREFCNT_dec(namesv);
a0d0e21e 3261 if (!tryrsfp) {
533c011a 3262 if (PL_op->op_type == OP_REQUIRE) {
ec889f3a
GS
3263 char *msgstr = name;
3264 if (namesv) { /* did we lookup @INC? */
3265 SV *msg = sv_2mortal(newSVpv(msgstr,0));
3266 SV *dirmsgsv = NEWSV(0, 0);
3267 AV *ar = GvAVn(PL_incgv);
3268 I32 i;
3269 sv_catpvn(msg, " in @INC", 8);
3270 if (instr(SvPVX(msg), ".h "))
3271 sv_catpv(msg, " (change .h to .ph maybe?)");
3272 if (instr(SvPVX(msg), ".ph "))
3273 sv_catpv(msg, " (did you run h2ph?)");
3274 sv_catpv(msg, " (@INC contains:");
3275 for (i = 0; i <= AvFILL(ar); i++) {
3276 char *dir = SvPVx(*av_fetch(ar, i, TRUE), n_a);
cea2e8a9 3277 Perl_sv_setpvf(aTHX_ dirmsgsv, " %s", dir);
ec889f3a
GS
3278 sv_catsv(msg, dirmsgsv);
3279 }
3280 sv_catpvn(msg, ")", 1);
3281 SvREFCNT_dec(dirmsgsv);
3282 msgstr = SvPV_nolen(msg);
2683423c 3283 }
cea2e8a9 3284 DIE(aTHX_ "Can't locate %s", msgstr);
a0d0e21e
LW
3285 }
3286
3287 RETPUSHUNDEF;
3288 }
d8bfb8bd 3289 else
aba27d88 3290 SETERRNO(0, SS$_NORMAL);
a0d0e21e
LW
3291
3292 /* Assume success here to prevent recursive requirement. */
3280af22 3293 (void)hv_store(GvHVn(PL_incgv), name, strlen(name),
ed094faf 3294 newSVpv(CopFILE(&PL_compiling), 0), 0 );
a0d0e21e
LW
3295
3296 ENTER;
3297 SAVETMPS;
79cb57f6 3298 lex_start(sv_2mortal(newSVpvn("",0)));
b9d12d37
GS
3299 SAVEGENERICSV(PL_rsfp_filters);
3300 PL_rsfp_filters = Nullav;
e50aee73 3301
3280af22 3302 PL_rsfp = tryrsfp;
b3ac6de7 3303 SAVEHINTS();
3280af22 3304 PL_hints = 0;
7766f137 3305 SAVESPTR(PL_compiling.cop_warnings);
0453d815 3306 if (PL_dowarn & G_WARN_ALL_ON)
d3a7d8c7 3307 PL_compiling.cop_warnings = pWARN_ALL ;
0453d815 3308 else if (PL_dowarn & G_WARN_ALL_OFF)
d3a7d8c7 3309 PL_compiling.cop_warnings = pWARN_NONE ;
ac27b0f5 3310 else
d3a7d8c7 3311 PL_compiling.cop_warnings = pWARN_STD ;
ac27b0f5
NIS
3312 SAVESPTR(PL_compiling.cop_io);
3313 PL_compiling.cop_io = Nullsv;
a0d0e21e 3314
bbed91b5
KF
3315 if (filter_sub || filter_child_proc) {
3316 SV *datasv = filter_add(run_user_filter, Nullsv);
3317 IoLINES(datasv) = filter_has_file;
3318 IoFMT_GV(datasv) = (GV *)filter_child_proc;
3319 IoTOP_GV(datasv) = (GV *)filter_state;
3320 IoBOTTOM_GV(datasv) = (GV *)filter_sub;
3321 }
3322
3323 /* switch to eval mode */
533c011a 3324 push_return(PL_op->op_next);
a0d0e21e 3325 PUSHBLOCK(cx, CXt_EVAL, SP);
cc49e20b 3326 PUSHEVAL(cx, name, Nullgv);
a0d0e21e 3327
57843af0
GS
3328 SAVECOPLINE(&PL_compiling);
3329 CopLINE_set(&PL_compiling, 0);
a0d0e21e
LW
3330
3331 PUTBACK;
0f15f207 3332#ifdef USE_THREADS
533c011a
NIS
3333 MUTEX_LOCK(&PL_eval_mutex);
3334 if (PL_eval_owner && PL_eval_owner != thr)
3335 while (PL_eval_owner)
3336 COND_WAIT(&PL_eval_cond, &PL_eval_mutex);
3337 PL_eval_owner = thr;
3338 MUTEX_UNLOCK(&PL_eval_mutex);
0f15f207 3339#endif /* USE_THREADS */
c277df42 3340 return DOCATCH(doeval(G_SCALAR, NULL));
a0d0e21e
LW
3341}
3342
3343PP(pp_dofile)
3344{
cea2e8a9 3345 return pp_require();
a0d0e21e
LW
3346}
3347
3348PP(pp_entereval)
3349{
39644a26 3350 dSP;
c09156bb 3351 register PERL_CONTEXT *cx;
a0d0e21e 3352 dPOPss;
3280af22 3353 I32 gimme = GIMME_V, was = PL_sub_generation;
83ee9e09
GS
3354 char tbuf[TYPE_DIGITS(long) + 12];
3355 char *tmpbuf = tbuf;
fc36a67e 3356 char *safestr;
a0d0e21e 3357 STRLEN len;
55497cff 3358 OP *ret;
a0d0e21e
LW
3359
3360 if (!SvPV(sv,len) || !len)
3361 RETPUSHUNDEF;
748a9306 3362 TAINT_PROPER("eval");
a0d0e21e
LW
3363
3364 ENTER;
a0d0e21e 3365 lex_start(sv);
748a9306 3366 SAVETMPS;
ac27b0f5 3367
a0d0e21e
LW
3368 /* switch to eval mode */
3369
83ee9e09
GS
3370 if (PERLDB_NAMEEVAL && CopLINE(PL_curcop)) {
3371 SV *sv = sv_newmortal();
3372 Perl_sv_setpvf(aTHX_ sv, "_<(eval %lu)[%s:%"IVdf"]",
3373 (unsigned long)++PL_evalseq,
3374 CopFILE(PL_curcop), (IV)CopLINE(PL_curcop));
3375 tmpbuf = SvPVX(sv);
3376 }
3377 else
3378 sprintf(tmpbuf, "_<(eval %lu)", (unsigned long)++PL_evalseq);
f4dd75d9 3379 SAVECOPFILE_FREE(&PL_compiling);
57843af0 3380 CopFILE_set(&PL_compiling, tmpbuf+2);
f4dd75d9 3381 SAVECOPLINE(&PL_compiling);
57843af0 3382 CopLINE_set(&PL_compiling, 1);
55497cff 3383 /* XXX For C<eval "...">s within BEGIN {} blocks, this ends up
3384 deleting the eval's FILEGV from the stash before gv_check() runs
3385 (i.e. before run-time proper). To work around the coredump that
3386 ensues, we always turn GvMULTI_on for any globals that were
3387 introduced within evals. See force_ident(). GSAR 96-10-12 */
3388 safestr = savepv(tmpbuf);
3280af22 3389 SAVEDELETE(PL_defstash, safestr, strlen(safestr));
b3ac6de7 3390 SAVEHINTS();
533c011a 3391 PL_hints = PL_op->op_targ;
7766f137 3392 SAVESPTR(PL_compiling.cop_warnings);
f0a6fc86
GS
3393 if (specialWARN(PL_curcop->cop_warnings))
3394 PL_compiling.cop_warnings = PL_curcop->cop_warnings;
3395 else {
3396 PL_compiling.cop_warnings = newSVsv(PL_curcop->cop_warnings);
3397 SAVEFREESV(PL_compiling.cop_warnings);
599cee73 3398 }
ac27b0f5
NIS
3399 SAVESPTR(PL_compiling.cop_io);
3400 if (specialCopIO(PL_curcop->cop_io))
3401 PL_compiling.cop_io = PL_curcop->cop_io;
3402 else {
3403 PL_compiling.cop_io = newSVsv(PL_curcop->cop_io);
3404 SAVEFREESV(PL_compiling.cop_io);
3405 }
a0d0e21e 3406
533c011a 3407 push_return(PL_op->op_next);
6b35e009 3408 PUSHBLOCK(cx, (CXt_EVAL|CXp_REAL), SP);
cc49e20b 3409 PUSHEVAL(cx, 0, Nullgv);
a0d0e21e
LW
3410
3411 /* prepare to compile string */
3412
3280af22 3413 if (PERLDB_LINE && PL_curstash != PL_debstash)
cc49e20b 3414 save_lines(CopFILEAV(&PL_compiling), PL_linestr);
a0d0e21e 3415 PUTBACK;
0f15f207 3416#ifdef USE_THREADS
533c011a
NIS
3417 MUTEX_LOCK(&PL_eval_mutex);
3418 if (PL_eval_owner && PL_eval_owner != thr)
3419 while (PL_eval_owner)
3420 COND_WAIT(&PL_eval_cond, &PL_eval_mutex);
3421 PL_eval_owner = thr;
3422 MUTEX_UNLOCK(&PL_eval_mutex);
0f15f207 3423#endif /* USE_THREADS */
c277df42 3424 ret = doeval(gimme, NULL);
3280af22 3425 if (PERLDB_INTER && was != PL_sub_generation /* Some subs defined here. */
533c011a 3426 && ret != PL_op->op_next) { /* Successive compilation. */
55497cff 3427 strcpy(safestr, "_<(eval )"); /* Anything fake and short. */
3428 }
1e422769 3429 return DOCATCH(ret);
a0d0e21e
LW
3430}
3431
3432PP(pp_leaveeval)
3433{
39644a26 3434 dSP;
a0d0e21e
LW
3435 register SV **mark;
3436 SV **newsp;
3437 PMOP *newpm;
3438 I32 gimme;
c09156bb 3439 register PERL_CONTEXT *cx;
a0d0e21e 3440 OP *retop;
533c011a 3441 U8 save_flags = PL_op -> op_flags;
a0d0e21e
LW
3442 I32 optype;
3443
3444 POPBLOCK(cx,newpm);
3445 POPEVAL(cx);
3446 retop = pop_return();
3447
a1f49e72 3448 TAINT_NOT;
54310121 3449 if (gimme == G_VOID)
3450 MARK = newsp;
3451 else if (gimme == G_SCALAR) {
3452 MARK = newsp + 1;
3453 if (MARK <= SP) {
3454 if (SvFLAGS(TOPs) & SVs_TEMP)
3455 *MARK = TOPs;
3456 else
3457 *MARK = sv_mortalcopy(TOPs);
3458 }
a0d0e21e 3459 else {
54310121 3460 MEXTEND(mark,0);
3280af22 3461 *MARK = &PL_sv_undef;
a0d0e21e 3462 }
a7ec2b44 3463 SP = MARK;
a0d0e21e
LW
3464 }
3465 else {
a1f49e72
CS
3466 /* in case LEAVE wipes old return values */
3467 for (mark = newsp + 1; mark <= SP; mark++) {
3468 if (!(SvFLAGS(*mark) & SVs_TEMP)) {
a0d0e21e 3469 *mark = sv_mortalcopy(*mark);
a1f49e72
CS
3470 TAINT_NOT; /* Each item is independent */
3471 }
3472 }
a0d0e21e 3473 }
3280af22 3474 PL_curpm = newpm; /* Don't pop $1 et al till now */
a0d0e21e 3475
4fdae800 3476#ifdef DEBUGGING
3280af22 3477 assert(CvDEPTH(PL_compcv) == 1);
4fdae800 3478#endif
3280af22 3479 CvDEPTH(PL_compcv) = 0;
f46d017c 3480 lex_end();
4fdae800 3481
1ce6579f 3482 if (optype == OP_REQUIRE &&
924508f0 3483 !(gimme == G_SCALAR ? SvTRUE(*SP) : SP > newsp))
54310121 3484 {
1ce6579f 3485 /* Unassume the success we assumed earlier. */
0f79a09d
GS
3486 SV *nsv = cx->blk_eval.old_namesv;
3487 (void)hv_delete(GvHVn(PL_incgv), SvPVX(nsv), SvCUR(nsv), G_DISCARD);
3488 retop = Perl_die(aTHX_ "%s did not return a true value", SvPVX(nsv));
f46d017c
GS
3489 /* die_where() did LEAVE, or we won't be here */
3490 }
3491 else {
3492 LEAVE;
3493 if (!(save_flags & OPf_SPECIAL))
3494 sv_setpv(ERRSV,"");
a0d0e21e 3495 }
a0d0e21e
LW
3496
3497 RETURNOP(retop);
3498}
3499
a0d0e21e
LW
3500PP(pp_entertry)
3501{
39644a26 3502 dSP;
c09156bb 3503 register PERL_CONTEXT *cx;
54310121 3504 I32 gimme = GIMME_V;
a0d0e21e
LW
3505
3506 ENTER;
3507 SAVETMPS;
3508
3509 push_return(cLOGOP->op_other->op_next);
1d76a5c3 3510 PUSHBLOCK(cx, (CXt_EVAL|CXp_TRYBLOCK), SP);
a0d0e21e 3511 PUSHEVAL(cx, 0, 0);
a0d0e21e 3512
faef0170 3513 PL_in_eval = EVAL_INEVAL;
38a03e6e 3514 sv_setpv(ERRSV,"");
1e422769 3515 PUTBACK;
533c011a 3516 return DOCATCH(PL_op->op_next);
a0d0e21e
LW
3517}
3518
3519PP(pp_leavetry)
3520{
39644a26 3521 dSP;
a0d0e21e
LW
3522 register SV **mark;
3523 SV **newsp;
3524 PMOP *newpm;
3525 I32 gimme;
c09156bb 3526 register PERL_CONTEXT *cx;
a0d0e21e
LW
3527 I32 optype;
3528
3529 POPBLOCK(cx,newpm);
3530 POPEVAL(cx);
3531 pop_return();
3532
a1f49e72 3533 TAINT_NOT;
54310121 3534 if (gimme == G_VOID)
3535 SP = newsp;
3536 else if (gimme == G_SCALAR) {
3537 MARK = newsp + 1;
3538 if (MARK <= SP) {
3539 if (SvFLAGS(TOPs) & (SVs_PADTMP|SVs_TEMP))
3540 *MARK = TOPs;
3541 else
3542 *MARK = sv_mortalcopy(TOPs);
3543 }
a0d0e21e 3544 else {
54310121 3545 MEXTEND(mark,0);
3280af22 3546 *MARK = &PL_sv_undef;