This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Integrate change #9108 from maintperl to mainline.
[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
PP
58 switch (cxstack[cxix].blk_gimme) {
59 case G_ARRAY:
a0d0e21e 60 RETPUSHYES;
54310121 61 case G_SCALAR:
a0d0e21e 62 RETPUSHNO;
54310121
PP
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
PP
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
PP
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
PP
269 }
270}
271
272void
864dbfa3 273Perl_rxres_restore(pTHX_ void **rsp, REGEXP *rx)
c90c0ff4
PP
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
PP
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
PP
290 }
291}
292
293void
864dbfa3 294Perl_rxres_free(pTHX_ void **rsp)
c90c0ff4
PP
295{
296 UV *p = (UV*)*rsp;
297
298 if (p) {
56431972 299 Safefree(INT2PTR(char*,*p));
c90c0ff4
PP
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
URCI
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
PP
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
PP
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
PP
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
PP
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
PP
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
PP
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
PP
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
PP
1603 gimme = (I32)cx->blk_gimme;
1604 if (gimme == G_VOID)
3280af22 1605 PUSHs(&PL_sv_undef);
54310121
PP
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
PP
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
PP
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
PP
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
PP
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
PP
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
PP
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
PP
2047 *++newsp = ((pop2 == CXt_SUB) && SvTEMP(*MARK))
2048 ? *MARK : sv_mortalcopy(*MARK);
a1f49e72
CS
2049 TAINT_NOT; /* Each item is independent */
2050 }
f86702cc
PP
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
PP
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
PP
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
PP
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
PP
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:
3280af22 2466 gotoprobe = PL_eval_root; /* XXX not good for nested eval */
a0d0e21e
LW
2467 break;
2468 case CXt_LOOP:
2469 gotoprobe = cx->blk_oldcop->op_sibling;
2470 break;
2471 case CXt_SUBST:
2472 continue;
2473 case CXt_BLOCK:
2474 if (ix)
2475 gotoprobe = cx->blk_oldcop->op_sibling;
2476 else
3280af22 2477 gotoprobe = PL_main_root;
a0d0e21e 2478 break;
b3933176
CS
2479 case CXt_SUB:
2480 if (CvDEPTH(cx->blk_sub.cv)) {
2481 gotoprobe = CvROOT(cx->blk_sub.cv);
2482 break;
2483 }
2484 /* FALL THROUGH */
7766f137 2485 case CXt_FORMAT:
0a753a76 2486 case CXt_NULL:
a651a37d 2487 DIE(aTHX_ "Can't \"goto\" out of a pseudo block");
a0d0e21e
LW
2488 default:
2489 if (ix)
cea2e8a9 2490 DIE(aTHX_ "panic: goto");
3280af22 2491 gotoprobe = PL_main_root;
a0d0e21e
LW
2492 break;
2493 }
2b597662
GS
2494 if (gotoprobe) {
2495 retop = dofindlabel(gotoprobe, label,
2496 enterops, enterops + GOTO_DEPTH);
2497 if (retop)
2498 break;
2499 }
3280af22 2500 PL_lastgotoprobe = gotoprobe;
a0d0e21e
LW
2501 }
2502 if (!retop)
cea2e8a9 2503 DIE(aTHX_ "Can't find label %s", label);
a0d0e21e
LW
2504
2505 /* pop unwanted frames */
2506
2507 if (ix < cxstack_ix) {
2508 I32 oldsave;
2509
2510 if (ix < 0)
2511 ix = 0;
2512 dounwind(ix);
2513 TOPBLOCK(cx);
3280af22 2514 oldsave = PL_scopestack[PL_scopestack_ix];
a0d0e21e
LW
2515 LEAVE_SCOPE(oldsave);
2516 }
2517
2518 /* push wanted frames */
2519
748a9306 2520 if (*enterops && enterops[1]) {
533c011a 2521 OP *oldop = PL_op;
748a9306 2522 for (ix = 1; enterops[ix]; ix++) {
533c011a 2523 PL_op = enterops[ix];
84902520
TB
2524 /* Eventually we may want to stack the needed arguments
2525 * for each op. For now, we punt on the hard ones. */
533c011a 2526 if (PL_op->op_type == OP_ENTERITER)
894356b3 2527 DIE(aTHX_ "Can't \"goto\" into the middle of a foreach loop");
fc0dc3b3 2528 CALL_FPTR(PL_op->op_ppaddr)(aTHX);
a0d0e21e 2529 }
533c011a 2530 PL_op = oldop;
a0d0e21e
LW
2531 }
2532 }
2533
2534 if (do_dump) {
a5f75d66 2535#ifdef VMS
6b88bc9c 2536 if (!retop) retop = PL_main_start;
a5f75d66 2537#endif
3280af22
NIS
2538 PL_restartop = retop;
2539 PL_do_undump = TRUE;
a0d0e21e
LW
2540
2541 my_unexec();
2542
3280af22
NIS
2543 PL_restartop = 0; /* hmm, must be GNU unexec().. */
2544 PL_do_undump = FALSE;
a0d0e21e
LW
2545 }
2546
2547 RETURNOP(retop);
2548}
2549
2550PP(pp_exit)
2551{
39644a26 2552 dSP;
a0d0e21e
LW
2553 I32 anum;
2554
2555 if (MAXARG < 1)
2556 anum = 0;
ff0cee69 2557 else {
a0d0e21e 2558 anum = SvIVx(POPs);
d98f61e7
GS
2559#ifdef VMS
2560 if (anum == 1 && (PL_op->op_private & OPpEXIT_VMSISH))
ff0cee69
PP
2561 anum = 0;
2562#endif
2563 }
cc3604b1 2564 PL_exit_flags |= PERL_EXIT_EXPECTED;
a0d0e21e 2565 my_exit(anum);
3280af22 2566 PUSHs(&PL_sv_undef);
a0d0e21e
LW
2567 RETURN;
2568}
2569
2570#ifdef NOTYET
2571PP(pp_nswitch)
2572{
39644a26 2573 dSP;
65202027 2574 NV value = SvNVx(GvSV(cCOP->cop_gv));
a0d0e21e
LW
2575 register I32 match = I_32(value);
2576
2577 if (value < 0.0) {
65202027 2578 if (((NV)match) > value)
a0d0e21e
LW
2579 --match; /* was fractional--truncate other way */
2580 }
2581 match -= cCOP->uop.scop.scop_offset;
2582 if (match < 0)
2583 match = 0;
2584 else if (match > cCOP->uop.scop.scop_max)
2585 match = cCOP->uop.scop.scop_max;
6b88bc9c
GS
2586 PL_op = cCOP->uop.scop.scop_next[match];
2587 RETURNOP(PL_op);
a0d0e21e
LW
2588}
2589
2590PP(pp_cswitch)
2591{
39644a26 2592 dSP;
a0d0e21e
LW
2593 register I32 match;
2594
6b88bc9c
GS
2595 if (PL_multiline)
2596 PL_op = PL_op->op_next; /* can't assume anything */
a0d0e21e 2597 else {
2d8e6c8d
GS
2598 STRLEN n_a;
2599 match = *(SvPVx(GvSV(cCOP->cop_gv), n_a)) & 255;
a0d0e21e
LW
2600 match -= cCOP->uop.scop.scop_offset;
2601 if (match < 0)
2602 match = 0;
2603 else if (match > cCOP->uop.scop.scop_max)
2604 match = cCOP->uop.scop.scop_max;
6b88bc9c 2605 PL_op = cCOP->uop.scop.scop_next[match];
a0d0e21e 2606 }
6b88bc9c 2607 RETURNOP(PL_op);
a0d0e21e
LW
2608}
2609#endif
2610
2611/* Eval. */
2612
0824fdcb 2613STATIC void
cea2e8a9 2614S_save_lines(pTHX_ AV *array, SV *sv)
a0d0e21e
LW
2615{
2616 register char *s = SvPVX(sv);
2617 register char *send = SvPVX(sv) + SvCUR(sv);
2618 register char *t;
2619 register I32 line = 1;
2620
2621 while (s && s < send) {
2622 SV *tmpstr = NEWSV(85,0);
2623
2624 sv_upgrade(tmpstr, SVt_PVMG);
2625 t = strchr(s, '\n');
2626 if (t)
2627 t++;
2628 else
2629 t = send;
2630
2631 sv_setpvn(tmpstr, s, t - s);
2632 av_store(array, line++, tmpstr);
2633 s = t;
2634 }
2635}
2636
14dd3ad8 2637#ifdef PERL_FLEXIBLE_EXCEPTIONS
312caa8e 2638STATIC void *
cea2e8a9 2639S_docatch_body(pTHX_ va_list args)
312caa8e 2640{
14dd3ad8
GS
2641 return docatch_body();
2642}
2643#endif
2644
2645STATIC void *
2646S_docatch_body(pTHX)
2647{
cea2e8a9 2648 CALLRUNOPS(aTHX);
312caa8e
CS
2649 return NULL;
2650}
2651
0824fdcb 2652STATIC OP *
cea2e8a9 2653S_docatch(pTHX_ OP *o)
1e422769 2654{
6224f72b 2655 int ret;
533c011a 2656 OP *oldop = PL_op;
0cdb2077 2657 volatile PERL_SI *cursi = PL_curstackinfo;
db36c5a1 2658 dJMPENV;
1e422769 2659
1e422769 2660#ifdef DEBUGGING
54310121 2661 assert(CATCH_GET == TRUE);
1e422769 2662#endif
312caa8e 2663 PL_op = o;
14dd3ad8 2664#ifdef PERL_FLEXIBLE_EXCEPTIONS
312caa8e 2665 redo_body:
db36c5a1 2666 CALLPROTECT(aTHX_ pcur_env, &ret, MEMBER_TO_FPTR(S_docatch_body));
14dd3ad8
GS
2667#else
2668 JMPENV_PUSH(ret);
2669#endif
6224f72b 2670 switch (ret) {
312caa8e 2671 case 0:
14dd3ad8
GS
2672#ifndef PERL_FLEXIBLE_EXCEPTIONS
2673 redo_body:
2674 docatch_body();
2675#endif
312caa8e
CS
2676 break;
2677 case 3:
0cdb2077 2678 if (PL_restartop && cursi == PL_curstackinfo) {
312caa8e
CS
2679 PL_op = PL_restartop;
2680 PL_restartop = 0;
2681 goto redo_body;
2682 }
2683 /* FALL THROUGH */
2684 default:
14dd3ad8 2685 JMPENV_POP;
533c011a 2686 PL_op = oldop;
6224f72b 2687 JMPENV_JUMP(ret);
1e422769 2688 /* NOTREACHED */
1e422769 2689 }
14dd3ad8 2690 JMPENV_POP;
533c011a 2691 PL_op = oldop;
1e422769
PP
2692 return Nullop;
2693}
2694
c277df42 2695OP *
864dbfa3 2696Perl_sv_compile_2op(pTHX_ SV *sv, OP** startop, char *code, AV** avp)
c277df42
IZ
2697/* sv Text to convert to OP tree. */
2698/* startop op_free() this to undo. */
2699/* code Short string id of the caller. */
2700{
2701 dSP; /* Make POPBLOCK work. */
2702 PERL_CONTEXT *cx;
2703 SV **newsp;
f987c7de 2704 I32 gimme = 0; /* SUSPECT - INITIALZE TO WHAT? NI-S */
c277df42
IZ
2705 I32 optype;
2706 OP dummy;
155aba94 2707 OP *rop;
83ee9e09
GS
2708 char tbuf[TYPE_DIGITS(long) + 12 + 10];
2709 char *tmpbuf = tbuf;
c277df42
IZ
2710 char *safestr;
2711
2712 ENTER;
2713 lex_start(sv);
2714 SAVETMPS;
2715 /* switch to eval mode */
2716
cbce877f 2717 if (PL_curcop == &PL_compiling) {
f4dd75d9 2718 SAVECOPSTASH_FREE(&PL_compiling);
11faa288 2719 CopSTASH_set(&PL_compiling, PL_curstash);
cbce877f 2720 }
83ee9e09
GS
2721 if (PERLDB_NAMEEVAL && CopLINE(PL_curcop)) {
2722 SV *sv = sv_newmortal();
2723 Perl_sv_setpvf(aTHX_ sv, "_<(%.10seval %lu)[%s:%"IVdf"]",
2724 code, (unsigned long)++PL_evalseq,
2725 CopFILE(PL_curcop), (IV)CopLINE(PL_curcop));
2726 tmpbuf = SvPVX(sv);
2727 }
2728 else
2729 sprintf(tmpbuf, "_<(%.10s_eval %lu)", code, (unsigned long)++PL_evalseq);
f4dd75d9 2730 SAVECOPFILE_FREE(&PL_compiling);
57843af0 2731 CopFILE_set(&PL_compiling, tmpbuf+2);
f4dd75d9 2732 SAVECOPLINE(&PL_compiling);
57843af0 2733 CopLINE_set(&PL_compiling, 1);
c277df42
IZ
2734 /* XXX For C<eval "...">s within BEGIN {} blocks, this ends up
2735 deleting the eval's FILEGV from the stash before gv_check() runs
2736 (i.e. before run-time proper). To work around the coredump that
2737 ensues, we always turn GvMULTI_on for any globals that were
2738 introduced within evals. See force_ident(). GSAR 96-10-12 */
2739 safestr = savepv(tmpbuf);
3280af22 2740 SAVEDELETE(PL_defstash, safestr, strlen(safestr));
b3ac6de7 2741 SAVEHINTS();
d1ca3daa 2742#ifdef OP_IN_REGISTER
6b88bc9c 2743 PL_opsave = op;
d1ca3daa 2744#else
7766f137 2745 SAVEVPTR(PL_op);
d1ca3daa 2746#endif
1aa99e6b 2747 PL_hints &= HINT_UTF8;
c277df42 2748
533c011a 2749 PL_op = &dummy;
13b51b79 2750 PL_op->op_type = OP_ENTEREVAL;
533c011a 2751 PL_op->op_flags = 0; /* Avoid uninit warning. */
160cb429 2752 PUSHBLOCK(cx, CXt_EVAL|(PL_curcop == &PL_compiling ? 0 : CXp_REAL), SP);
cc49e20b 2753 PUSHEVAL(cx, 0, Nullgv);
c277df42 2754 rop = doeval(G_SCALAR, startop);
13b51b79 2755 POPBLOCK(cx,PL_curpm);
e84b9f1f 2756 POPEVAL(cx);
c277df42
IZ
2757
2758 (*startop)->op_type = OP_NULL;
22c35a8c 2759 (*startop)->op_ppaddr = PL_ppaddr[OP_NULL];
c277df42 2760 lex_end();
3280af22 2761 *avp = (AV*)SvREFCNT_inc(PL_comppad);
c277df42 2762 LEAVE;
13b51b79 2763 if (PL_curcop == &PL_compiling)
a0ed51b3 2764 PL_compiling.op_private = PL_hints;
d1ca3daa 2765#ifdef OP_IN_REGISTER
6b88bc9c 2766 op = PL_opsave;
d1ca3daa 2767#endif
c277df42
IZ
2768 return rop;
2769}
2770
0f15f207 2771/* With USE_THREADS, eval_owner must be held on entry to doeval */
0824fdcb 2772STATIC OP *
cea2e8a9 2773S_doeval(pTHX_ int gimme, OP** startop)
a0d0e21e
LW
2774{
2775 dSP;
533c011a 2776 OP *saveop = PL_op;
ff3ff8d1 2777 CV *caller;
748a9306 2778 AV* comppadlist;
67a38de0 2779 I32 i;
a0d0e21e 2780
6dc8a9e4
IZ
2781 PL_in_eval = ((saveop && saveop->op_type == OP_REQUIRE)
2782 ? (EVAL_INREQUIRE | (PL_in_eval & EVAL_INEVAL))
2783 : EVAL_INEVAL);
a0d0e21e 2784
1ce6579f
PP
2785 PUSHMARK(SP);
2786
a0d0e21e
LW
2787 /* set up a scratch pad */
2788
3280af22 2789 SAVEI32(PL_padix);
7766f137 2790 SAVEVPTR(PL_curpad);
3280af22
NIS
2791 SAVESPTR(PL_comppad);
2792 SAVESPTR(PL_comppad_name);
2793 SAVEI32(PL_comppad_name_fill);
2794 SAVEI32(PL_min_intro_pending);
2795 SAVEI32(PL_max_intro_pending);
748a9306 2796
3280af22 2797 caller = PL_compcv;
6b35e009 2798 for (i = cxstack_ix - 1; i >= 0; i--) {
67a38de0 2799 PERL_CONTEXT *cx = &cxstack[i];
6b35e009 2800 if (CxTYPE(cx) == CXt_EVAL)
67a38de0 2801 break;
7766f137 2802 else if (CxTYPE(cx) == CXt_SUB || CxTYPE(cx) == CXt_FORMAT) {
67a38de0
NIS
2803 caller = cx->blk_sub.cv;
2804 break;
2805 }
2806 }
2807
3280af22
NIS
2808 SAVESPTR(PL_compcv);
2809 PL_compcv = (CV*)NEWSV(1104,0);
2810 sv_upgrade((SV *)PL_compcv, SVt_PVCV);
1aff0e91 2811 CvEVAL_on(PL_compcv);
11343788 2812#ifdef USE_THREADS
533c011a
NIS
2813 CvOWNER(PL_compcv) = 0;
2814 New(666, CvMUTEXP(PL_compcv), 1, perl_mutex);
2815 MUTEX_INIT(CvMUTEXP(PL_compcv));
11343788 2816#endif /* USE_THREADS */
748a9306 2817
3280af22
NIS
2818 PL_comppad = newAV();
2819 av_push(PL_comppad, Nullsv);
2820 PL_curpad = AvARRAY(PL_comppad);
2821 PL_comppad_name = newAV();
2822 PL_comppad_name_fill = 0;
2823 PL_min_intro_pending = 0;
2824 PL_padix = 0;
11343788 2825#ifdef USE_THREADS
79cb57f6 2826 av_store(PL_comppad_name, 0, newSVpvn("@_", 2));
533c011a
NIS
2827 PL_curpad[0] = (SV*)newAV();
2828 SvPADMY_on(PL_curpad[0]); /* XXX Needed? */
11343788 2829#endif /* USE_THREADS */
a0d0e21e 2830
748a9306
LW
2831 comppadlist = newAV();
2832 AvREAL_off(comppadlist);
3280af22
NIS
2833 av_store(comppadlist, 0, (SV*)PL_comppad_name);
2834 av_store(comppadlist, 1, (SV*)PL_comppad);
2835 CvPADLIST(PL_compcv) = comppadlist;
2c05e328 2836
faa7e5bb
GS
2837 if (!saveop ||
2838 (saveop->op_type != OP_REQUIRE && saveop->op_type != OP_DOFILE))
2839 {
3280af22 2840 CvOUTSIDE(PL_compcv) = (CV*)SvREFCNT_inc(caller);
faa7e5bb 2841 }
07055b4c 2842
3280af22 2843 SAVEFREESV(PL_compcv);
748a9306 2844
a0d0e21e
LW
2845 /* make sure we compile in the right package */
2846
ed094faf 2847 if (CopSTASH_ne(PL_curcop, PL_curstash)) {
3280af22 2848 SAVESPTR(PL_curstash);
ed094faf 2849 PL_curstash = CopSTASH(PL_curcop);
a0d0e21e 2850 }
3280af22
NIS
2851 SAVESPTR(PL_beginav);
2852 PL_beginav = newAV();
2853 SAVEFREESV(PL_beginav);
24944567 2854 SAVEI32(PL_error_count);
a0d0e21e
LW
2855
2856 /* try to compile it */
2857
3280af22
NIS
2858 PL_eval_root = Nullop;
2859 PL_error_count = 0;
2860 PL_curcop = &PL_compiling;
2861 PL_curcop->cop_arybase = 0;
2862 SvREFCNT_dec(PL_rs);
79cb57f6 2863 PL_rs = newSVpvn("\n", 1);
c277df42 2864 if (saveop && saveop->op_flags & OPf_SPECIAL)
faef0170 2865 PL_in_eval |= EVAL_KEEPERR;
1ce6579f 2866 else
38a03e6e 2867 sv_setpv(ERRSV,"");
3280af22 2868 if (yyparse() || PL_error_count || !PL_eval_root) {
a0d0e21e
LW
2869 SV **newsp;
2870 I32 gimme;
c09156bb 2871 PERL_CONTEXT *cx;
c277df42 2872 I32 optype = 0; /* Might be reset by POPEVAL. */
2d8e6c8d 2873 STRLEN n_a;
097ee67d 2874
533c011a 2875 PL_op = saveop;
3280af22
NIS
2876 if (PL_eval_root) {
2877 op_free(PL_eval_root);
2878 PL_eval_root = Nullop;
a0d0e21e 2879 }
3280af22 2880 SP = PL_stack_base + POPMARK; /* pop original mark */
c277df42 2881 if (!startop) {
3280af22 2882 POPBLOCK(cx,PL_curpm);
c277df42
IZ
2883 POPEVAL(cx);
2884 pop_return();
2885 }
a0d0e21e
LW
2886 lex_end();
2887 LEAVE;
7a2e2cd6 2888 if (optype == OP_REQUIRE) {
2d8e6c8d 2889 char* msg = SvPVx(ERRSV, n_a);
5a844595
GS
2890 DIE(aTHX_ "%sCompilation failed in require",
2891 *msg ? msg : "Unknown error\n");
2892 }
2893 else if (startop) {
2d8e6c8d 2894 char* msg = SvPVx(ERRSV, n_a);
c277df42 2895
3280af22 2896 POPBLOCK(cx,PL_curpm);
c277df42 2897 POPEVAL(cx);
5a844595
GS
2898 Perl_croak(aTHX_ "%sCompilation failed in regexp",
2899 (*msg ? msg : "Unknown error\n"));
7a2e2cd6 2900 }
3280af22
NIS
2901 SvREFCNT_dec(PL_rs);
2902 PL_rs = SvREFCNT_inc(PL_nrs);
f2134d95 2903#ifdef USE_THREADS
533c011a
NIS
2904 MUTEX_LOCK(&PL_eval_mutex);
2905 PL_eval_owner = 0;
2906 COND_SIGNAL(&PL_eval_cond);
2907 MUTEX_UNLOCK(&PL_eval_mutex);
f2134d95 2908#endif /* USE_THREADS */
a0d0e21e
LW
2909 RETPUSHUNDEF;
2910 }
3280af22
NIS
2911 SvREFCNT_dec(PL_rs);
2912 PL_rs = SvREFCNT_inc(PL_nrs);
57843af0 2913 CopLINE_set(&PL_compiling, 0);
c277df42 2914 if (startop) {
3280af22
NIS
2915 *startop = PL_eval_root;
2916 SvREFCNT_dec(CvOUTSIDE(PL_compcv));
2917 CvOUTSIDE(PL_compcv) = Nullcv;
c277df42 2918 } else
3280af22 2919 SAVEFREEOP(PL_eval_root);
54310121 2920 if (gimme & G_VOID)
3280af22 2921 scalarvoid(PL_eval_root);
54310121 2922 else if (gimme & G_ARRAY)
3280af22 2923 list(PL_eval_root);
a0d0e21e 2924 else
3280af22 2925 scalar(PL_eval_root);
a0d0e21e
LW
2926
2927 DEBUG_x(dump_eval());
2928
55497cff 2929 /* Register with debugger: */
84902520 2930 if (PERLDB_INTER && saveop->op_type == OP_REQUIRE) {
864dbfa3 2931 CV *cv = get_cv("DB::postponed", FALSE);
55497cff
PP
2932 if (cv) {
2933 dSP;
924508f0 2934 PUSHMARK(SP);
cc49e20b 2935 XPUSHs((SV*)CopFILEGV(&PL_compiling));
55497cff 2936 PUTBACK;
864dbfa3 2937 call_sv((SV*)cv, G_DISCARD);
55497cff
PP
2938 }
2939 }
2940
a0d0e21e
LW
2941 /* compiled okay, so do it */
2942
3280af22
NIS
2943 CvDEPTH(PL_compcv) = 1;
2944 SP = PL_stack_base + POPMARK; /* pop original mark */
533c011a 2945 PL_op = saveop; /* The caller may need it. */
6dc8a9e4 2946 PL_lex_state = LEX_NOTPARSING; /* $^S needs this. */
b35b2403 2947#ifdef USE_THREADS
533c011a
NIS
2948 MUTEX_LOCK(&PL_eval_mutex);
2949 PL_eval_owner = 0;
2950 COND_SIGNAL(&PL_eval_cond);
2951 MUTEX_UNLOCK(&PL_eval_mutex);
b35b2403 2952#endif /* USE_THREADS */
5dc0d613 2953
3280af22 2954 RETURNOP(PL_eval_start);
a0d0e21e
LW
2955}
2956
a6c40364 2957STATIC PerlIO *
cea2e8a9 2958S_doopen_pmc(pTHX_ const char *name, const char *mode)
b295d113
TH
2959{
2960 STRLEN namelen = strlen(name);
2961 PerlIO *fp;
2962
7894fbab 2963 if (namelen > 3 && strEQ(name + namelen - 3, ".pm")) {
cea2e8a9 2964 SV *pmcsv = Perl_newSVpvf(aTHX_ "%s%c", name, 'c');
b295d113
TH
2965 char *pmc = SvPV_nolen(pmcsv);
2966 Stat_t pmstat;
a6c40364
GS
2967 Stat_t pmcstat;
2968 if (PerlLIO_stat(pmc, &pmcstat) < 0) {
b295d113 2969 fp = PerlIO_open(name, mode);
a6c40364
GS
2970 }
2971 else {
b295d113 2972 if (PerlLIO_stat(name, &pmstat) < 0 ||
a6c40364
GS
2973 pmstat.st_mtime < pmcstat.st_mtime)
2974 {
2975 fp = PerlIO_open(pmc, mode);
2976 }
2977 else {
2978 fp = PerlIO_open(name, mode);
2979 }
b295d113 2980 }
a6c40364
GS
2981 SvREFCNT_dec(pmcsv);
2982 }
2983 else {
2984 fp = PerlIO_open(name, mode);
b295d113 2985 }
b295d113
TH
2986 return fp;
2987}
2988
a0d0e21e
LW
2989PP(pp_require)
2990{
39644a26 2991 dSP;
c09156bb 2992 register PERL_CONTEXT *cx;
a0d0e21e
LW
2993 SV *sv;
2994 char *name;
6132ea6c 2995 STRLEN len;
46fc3d4c
PP
2996 char *tryname;
2997 SV *namesv = Nullsv;
a0d0e21e
LW
2998 SV** svp;
2999 I32 gimme = G_SCALAR;
760ac839 3000 PerlIO *tryrsfp = 0;
2d8e6c8d 3001 STRLEN n_a;
bbed91b5
KF
3002 int filter_has_file = 0;
3003 GV *filter_child_proc = 0;
3004 SV *filter_state = 0;
3005 SV *filter_sub = 0;
a0d0e21e
LW
3006
3007 sv = POPs;
a7cb1f99 3008 if (SvNIOKp(sv)) {
4305d8ab
GS
3009 if (SvPOK(sv) && SvNOK(sv)) { /* require v5.6.1 */
3010 UV rev = 0, ver = 0, sver = 0;
ba210ebe 3011 STRLEN len;
a7cb1f99
GS
3012 U8 *s = (U8*)SvPVX(sv);
3013 U8 *end = (U8*)SvPVX(sv) + SvCUR(sv);
3014 if (s < end) {
9041c2e3 3015 rev = utf8n_to_uvchr(s, end - s, &len, 0);
a7cb1f99
GS
3016 s += len;
3017 if (s < end) {
9041c2e3 3018 ver = utf8n_to_uvchr(s, end - s, &len, 0);
a7cb1f99
GS
3019 s += len;
3020 if (s < end)
9041c2e3 3021 sver = utf8n_to_uvchr(s, end - s, &len, 0);
a7cb1f99 3022 }
a7cb1f99 3023 }
a7cb1f99
GS
3024 if (PERL_REVISION < rev
3025 || (PERL_REVISION == rev
3026 && (PERL_VERSION < ver
3027 || (PERL_VERSION == ver
3028 && PERL_SUBVERSION < sver))))
3029 {
cc507455 3030 DIE(aTHX_ "Perl v%"UVuf".%"UVuf".%"UVuf" required--this is only "
894356b3 3031 "v%d.%d.%d, stopped", rev, ver, sver, PERL_REVISION,
a7cb1f99
GS
3032 PERL_VERSION, PERL_SUBVERSION);
3033 }
4305d8ab 3034 RETPUSHYES;
a7cb1f99
GS
3035 }
3036 else if (!SvPOKp(sv)) { /* require 5.005_03 */
a7cb1f99
GS
3037 if ((NV)PERL_REVISION + ((NV)PERL_VERSION/(NV)1000)
3038 + ((NV)PERL_SUBVERSION/(NV)1000000)
3039 + 0.00000099 < SvNV(sv))
3040 {
dbe7b177
GS
3041 NV nrev = SvNV(sv);
3042 UV rev = (UV)nrev;
3043 NV nver = (nrev - rev) * 1000;
3044 UV ver = (UV)(nver + 0.0009);
3045 NV nsver = (nver - ver) * 1000;
3046 UV sver = (UV)(nsver + 0.0009);
3047
cc507455
GS
3048 /* help out with the "use 5.6" confusion */
3049 if (sver == 0 && (rev > 5 || (rev == 5 && ver >= 100))) {
3050 DIE(aTHX_ "Perl v%"UVuf".%"UVuf".%"UVuf" required--"
3051 "this is only v%d.%d.%d, stopped"
3052 " (did you mean v%"UVuf".%"UVuf".0?)",
3053 rev, ver, sver, PERL_REVISION, PERL_VERSION,
3054 PERL_SUBVERSION, rev, ver/100);
3055 }
3056 else {
3057 DIE(aTHX_ "Perl v%"UVuf".%"UVuf".%"UVuf" required--"
3058 "this is only v%d.%d.%d, stopped",
3059 rev, ver, sver, PERL_REVISION, PERL_VERSION,
3060 PERL_SUBVERSION);
3061 }
a7cb1f99 3062 }
4305d8ab 3063 RETPUSHYES;
a7cb1f99 3064 }
a0d0e21e 3065 }
6132ea6c
GS
3066 name = SvPV(sv, len);
3067 if (!(name && len > 0 && *name))
cea2e8a9 3068 DIE(aTHX_ "Null filename used");
4633a7c4 3069 TAINT_PROPER("require");
533c011a 3070 if (PL_op->op_type == OP_REQUIRE &&
3280af22
NIS
3071 (svp = hv_fetch(GvHVn(PL_incgv), name, len, 0)) &&
3072 *svp != &PL_sv_undef)
a0d0e21e
LW
3073 RETPUSHYES;
3074
3075 /* prepare to compile file */
3076
084592ab 3077#ifdef MACOS_TRADITIONAL
57843af0 3078 if (PERL_FILE_IS_ABSOLUTE(name)
084592ab 3079 || (*name == ':' && name[1] != ':' && strchr(name+2, ':')))
a0d0e21e 3080 {
46fc3d4c 3081 tryname = name;
a6c40364 3082 tryrsfp = doopen_pmc(name,PERL_SCRIPT_MODE);
bf4acbe4
GS
3083 /* We consider paths of the form :a:b ambiguous and interpret them first
3084 as global then as local
3085 */
084592ab 3086 if (!tryrsfp && *name == ':' && name[1] != ':' && strchr(name+2, ':'))
bf4acbe4
GS
3087 goto trylocal;
3088 }
ac27b0f5 3089 else
bf4acbe4
GS
3090trylocal: {
3091#else
084592ab
CN
3092 if (PERL_FILE_IS_ABSOLUTE(name)
3093 || (*name == '.' && (name[1] == '/' ||
3094 (name[1] == '.' && name[2] == '/'))))
3095 {
3096 tryname = name;
3097 tryrsfp = doopen_pmc(name,PERL_SCRIPT_MODE);
a0d0e21e
LW
3098 }
3099 else {
bf4acbe4 3100#endif
3280af22 3101 AV *ar = GvAVn(PL_incgv);
a0d0e21e 3102 I32 i;
748a9306 3103#ifdef VMS
46fc3d4c
PP
3104 char *unixname;
3105 if ((unixname = tounixspec(name, Nullch)) != Nullch)
3106#endif
3107 {
3108 namesv = NEWSV(806, 0);
3109 for (i = 0; i <= AvFILL(ar); i++) {
bbed91b5
KF
3110 SV *dirsv = *av_fetch(ar, i, TRUE);
3111
3112 if (SvROK(dirsv)) {
3113 int count;
3114 SV *loader = dirsv;
3115
3116 if (SvTYPE(SvRV(loader)) == SVt_PVAV) {
3117 loader = *av_fetch((AV *)SvRV(loader), 0, TRUE);
3118 }
3119
b900a521
JH
3120 Perl_sv_setpvf(aTHX_ namesv, "/loader/0x%"UVxf"/%s",
3121 PTR2UV(SvANY(loader)), name);
bbed91b5
KF
3122 tryname = SvPVX(namesv);
3123 tryrsfp = 0;
3124
3125 ENTER;
3126 SAVETMPS;
3127 EXTEND(SP, 2);
3128
3129 PUSHMARK(SP);
3130 PUSHs(dirsv);
3131 PUSHs(sv);
3132 PUTBACK;
e982885c
NC
3133 if (sv_isobject(loader))
3134 count = call_method("INC", G_ARRAY);
3135 else
3136 count = call_sv(loader, G_ARRAY);
bbed91b5
KF
3137 SPAGAIN;
3138
3139 if (count > 0) {
3140 int i = 0;
3141 SV *arg;
3142
3143 SP -= count - 1;
3144 arg = SP[i++];
3145
3146 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVGV) {
3147 arg = SvRV(arg);
3148 }
3149
3150 if (SvTYPE(arg) == SVt_PVGV) {
3151 IO *io = GvIO((GV *)arg);
3152
3153 ++filter_has_file;
3154
3155 if (io) {
3156 tryrsfp = IoIFP(io);
50952442 3157 if (IoTYPE(io) == IoTYPE_PIPE) {
bbed91b5
KF
3158 /* reading from a child process doesn't
3159 nest -- when returning from reading
3160 the inner module, the outer one is
3161 unreadable (closed?) I've tried to
3162 save the gv to manage the lifespan of
3163 the pipe, but this didn't help. XXX */
3164 filter_child_proc = (GV *)arg;
520c758a 3165 (void)SvREFCNT_inc(filter_child_proc);
bbed91b5
KF
3166 }
3167 else {
3168 if (IoOFP(io) && IoOFP(io) != IoIFP(io)) {
3169 PerlIO_close(IoOFP(io));
3170 }
3171 IoIFP(io) = Nullfp;
3172 IoOFP(io) = Nullfp;
3173 }
3174 }
3175
3176 if (i < count) {
3177 arg = SP[i++];
3178 }
3179 }
3180
3181 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVCV) {
3182 filter_sub = arg;
520c758a 3183 (void)SvREFCNT_inc(filter_sub);
bbed91b5
KF
3184
3185 if (i < count) {
3186 filter_state = SP[i];
520c758a 3187 (void)SvREFCNT_inc(filter_state);
bbed91b5
KF
3188 }
3189
3190 if (tryrsfp == 0) {
3191 tryrsfp = PerlIO_open("/dev/null",
3192 PERL_SCRIPT_MODE);
3193 }
3194 }
3195 }
3196
3197 PUTBACK;
3198 FREETMPS;
3199 LEAVE;
3200
3201 if (tryrsfp) {
3202 break;
3203 }
3204
3205 filter_has_file = 0;
3206 if (filter_child_proc) {
3207 SvREFCNT_dec(filter_child_proc);
3208 filter_child_proc = 0;
3209 }
3210 if (filter_state) {
3211 SvREFCNT_dec(filter_state);
3212 filter_state = 0;
3213 }
3214 if (filter_sub) {
3215 SvREFCNT_dec(filter_sub);
3216 filter_sub = 0;
3217 }
3218 }
3219 else {
3220 char *dir = SvPVx(dirsv, n_a);
bf4acbe4 3221#ifdef MACOS_TRADITIONAL
eae9c151
JH
3222 char buf[256];
3223 Perl_sv_setpvf(aTHX_ namesv, "%s%s", MacPerl_CanonDir(dir, buf), name+(name[0] == ':'));
bf4acbe4 3224#else
46fc3d4c 3225#ifdef VMS
bbed91b5
KF
3226 char *unixdir;
3227 if ((unixdir = tounixpath(dir, Nullch)) == Nullch)
3228 continue;
3229 sv_setpv(namesv, unixdir);
3230 sv_catpv(namesv, unixname);
748a9306 3231#else
bbed91b5 3232 Perl_sv_setpvf(aTHX_ namesv, "%s/%s", dir, name);
748a9306 3233#endif
bf4acbe4 3234#endif
bbed91b5
KF
3235 TAINT_PROPER("require");
3236 tryname = SvPVX(namesv);
bf4acbe4
GS
3237#ifdef MACOS_TRADITIONAL
3238 {
3239 /* Convert slashes in the name part, but not the directory part, to colons */
3240 char * colon;
3241 for (colon = tryname+strlen(dir); colon = strchr(colon, '/'); )
3242 *colon++ = ':';
3243 }
3244#endif
bbed91b5
KF
3245 tryrsfp = doopen_pmc(tryname, PERL_SCRIPT_MODE);
3246 if (tryrsfp) {
3247 if (tryname[0] == '.' && tryname[1] == '/')
3248 tryname += 2;
3249 break;
3250 }
46fc3d4c 3251 }
a0d0e21e
LW
3252 }
3253 }
3254 }
f4dd75d9 3255 SAVECOPFILE_FREE(&PL_compiling);
57843af0 3256 CopFILE_set(&PL_compiling, tryrsfp ? tryname : name);
46fc3d4c 3257 SvREFCNT_dec(namesv);
a0d0e21e 3258 if (!tryrsfp) {
533c011a 3259 if (PL_op->op_type == OP_REQUIRE) {
ec889f3a
GS
3260 char *msgstr = name;
3261 if (namesv) { /* did we lookup @INC? */
3262 SV *msg = sv_2mortal(newSVpv(msgstr,0));
3263 SV *dirmsgsv = NEWSV(0, 0);
3264 AV *ar = GvAVn(PL_incgv);
3265 I32 i;
3266 sv_catpvn(msg, " in @INC", 8);
3267 if (instr(SvPVX(msg), ".h "))
3268 sv_catpv(msg, " (change .h to .ph maybe?)");
3269 if (instr(SvPVX(msg), ".ph "))
3270 sv_catpv(msg, " (did you run h2ph?)");
3271 sv_catpv(msg, " (@INC contains:");
3272 for (i = 0; i <= AvFILL(ar); i++) {
3273 char *dir = SvPVx(*av_fetch(ar, i, TRUE), n_a);
cea2e8a9 3274 Perl_sv_setpvf(aTHX_ dirmsgsv, " %s", dir);
ec889f3a
GS
3275 sv_catsv(msg, dirmsgsv);
3276 }
3277 sv_catpvn(msg, ")", 1);
3278 SvREFCNT_dec(dirmsgsv);
3279 msgstr = SvPV_nolen(msg);
2683423c 3280 }
cea2e8a9 3281 DIE(aTHX_ "Can't locate %s", msgstr);
a0d0e21e
LW
3282 }
3283
3284 RETPUSHUNDEF;
3285 }
d8bfb8bd 3286 else
aba27d88 3287 SETERRNO(0, SS$_NORMAL);
a0d0e21e
LW
3288
3289 /* Assume success here to prevent recursive requirement. */
3280af22 3290 (void)hv_store(GvHVn(PL_incgv), name, strlen(name),
ed094faf 3291 newSVpv(CopFILE(&PL_compiling), 0), 0 );
a0d0e21e
LW
3292
3293 ENTER;
3294 SAVETMPS;
79cb57f6 3295 lex_start(sv_2mortal(newSVpvn("",0)));
b9d12d37
GS
3296 SAVEGENERICSV(PL_rsfp_filters);
3297 PL_rsfp_filters = Nullav;
e50aee73 3298
3280af22 3299 PL_rsfp = tryrsfp;
b3ac6de7 3300 SAVEHINTS();
3280af22 3301 PL_hints = 0;
7766f137 3302 SAVESPTR(PL_compiling.cop_warnings);
0453d815 3303 if (PL_dowarn & G_WARN_ALL_ON)
d3a7d8c7 3304 PL_compiling.cop_warnings = pWARN_ALL ;
0453d815 3305 else if (PL_dowarn & G_WARN_ALL_OFF)
d3a7d8c7 3306 PL_compiling.cop_warnings = pWARN_NONE ;
ac27b0f5 3307 else
d3a7d8c7 3308 PL_compiling.cop_warnings = pWARN_STD ;
ac27b0f5
NIS
3309 SAVESPTR(PL_compiling.cop_io);
3310 PL_compiling.cop_io = Nullsv;
a0d0e21e 3311
bbed91b5
KF
3312 if (filter_sub || filter_child_proc) {
3313 SV *datasv = filter_add(run_user_filter, Nullsv);
3314 IoLINES(datasv) = filter_has_file;
3315 IoFMT_GV(datasv) = (GV *)filter_child_proc;
3316 IoTOP_GV(datasv) = (GV *)filter_state;
3317 IoBOTTOM_GV(datasv) = (GV *)filter_sub;
3318 }
3319
3320 /* switch to eval mode */
533c011a 3321 push_return(PL_op->op_next);
a0d0e21e 3322 PUSHBLOCK(cx, CXt_EVAL, SP);
cc49e20b 3323 PUSHEVAL(cx, name, Nullgv);
a0d0e21e 3324
57843af0
GS
3325 SAVECOPLINE(&PL_compiling);
3326 CopLINE_set(&PL_compiling, 0);
a0d0e21e
LW
3327
3328 PUTBACK;
0f15f207 3329#ifdef USE_THREADS
533c011a
NIS
3330 MUTEX_LOCK(&PL_eval_mutex);
3331 if (PL_eval_owner && PL_eval_owner != thr)
3332 while (PL_eval_owner)
3333 COND_WAIT(&PL_eval_cond, &PL_eval_mutex);
3334 PL_eval_owner = thr;
3335 MUTEX_UNLOCK(&PL_eval_mutex);
0f15f207 3336#endif /* USE_THREADS */
c277df42 3337 return DOCATCH(doeval(G_SCALAR, NULL));
a0d0e21e
LW
3338}
3339
3340PP(pp_dofile)
3341{
cea2e8a9 3342 return pp_require();
a0d0e21e
LW
3343}
3344
3345PP(pp_entereval)
3346{
39644a26 3347 dSP;
c09156bb 3348 register PERL_CONTEXT *cx;
a0d0e21e 3349 dPOPss;
3280af22 3350 I32 gimme = GIMME_V, was = PL_sub_generation;
83ee9e09
GS
3351 char tbuf[TYPE_DIGITS(long) + 12];
3352 char *tmpbuf = tbuf;
fc36a67e 3353 char *safestr;
a0d0e21e 3354 STRLEN len;
55497cff 3355 OP *ret;
a0d0e21e
LW
3356
3357 if (!SvPV(sv,len) || !len)
3358 RETPUSHUNDEF;
748a9306 3359 TAINT_PROPER("eval");
a0d0e21e
LW
3360
3361 ENTER;
a0d0e21e 3362 lex_start(sv);
748a9306 3363 SAVETMPS;
ac27b0f5 3364
a0d0e21e
LW
3365 /* switch to eval mode */
3366
83ee9e09
GS
3367 if (PERLDB_NAMEEVAL && CopLINE(PL_curcop)) {
3368 SV *sv = sv_newmortal();
3369 Perl_sv_setpvf(aTHX_ sv, "_<(eval %lu)[%s:%"IVdf"]",
3370 (unsigned long)++PL_evalseq,
3371 CopFILE(PL_curcop), (IV)CopLINE(PL_curcop));
3372 tmpbuf = SvPVX(sv);
3373 }
3374 else
3375 sprintf(tmpbuf, "_<(eval %lu)", (unsigned long)++PL_evalseq);
f4dd75d9 3376 SAVECOPFILE_FREE(&PL_compiling);
57843af0 3377 CopFILE_set(&PL_compiling, tmpbuf+2);
f4dd75d9 3378 SAVECOPLINE(&PL_compiling);
57843af0 3379 CopLINE_set(&PL_compiling, 1);
55497cff
PP
3380 /* XXX For C<eval "...">s within BEGIN {} blocks, this ends up
3381 deleting the eval's FILEGV from the stash before gv_check() runs
3382 (i.e. before run-time proper). To work around the coredump that
3383 ensues, we always turn GvMULTI_on for any globals that were
3384 introduced within evals. See force_ident(). GSAR 96-10-12 */
3385 safestr = savepv(tmpbuf);
3280af22 3386 SAVEDELETE(PL_defstash, safestr, strlen(safestr));
b3ac6de7 3387 SAVEHINTS();
533c011a 3388 PL_hints = PL_op->op_targ;
7766f137 3389 SAVESPTR(PL_compiling.cop_warnings);
f0a6fc86
GS
3390 if (specialWARN(PL_curcop->cop_warnings))
3391 PL_compiling.cop_warnings = PL_curcop->cop_warnings;
3392 else {
3393 PL_compiling.cop_warnings = newSVsv(PL_curcop->cop_warnings);
3394 SAVEFREESV(PL_compiling.cop_warnings);
599cee73 3395 }
ac27b0f5
NIS
3396 SAVESPTR(PL_compiling.cop_io);
3397 if (specialCopIO(PL_curcop->cop_io))
3398 PL_compiling.cop_io = PL_curcop->cop_io;
3399 else {
3400 PL_compiling.cop_io = newSVsv(PL_curcop->cop_io);
3401 SAVEFREESV(PL_compiling.cop_io);
3402 }
a0d0e21e 3403
533c011a 3404 push_return(PL_op->op_next);
6b35e009 3405 PUSHBLOCK(cx, (CXt_EVAL|CXp_REAL), SP);
cc49e20b 3406 PUSHEVAL(cx, 0, Nullgv);
a0d0e21e
LW
3407
3408 /* prepare to compile string */
3409
3280af22 3410 if (PERLDB_LINE && PL_curstash != PL_debstash)
cc49e20b 3411 save_lines(CopFILEAV(&PL_compiling), PL_linestr);
a0d0e21e 3412 PUTBACK;
0f15f207 3413#ifdef USE_THREADS
533c011a
NIS
3414 MUTEX_LOCK(&PL_eval_mutex);
3415 if (PL_eval_owner && PL_eval_owner != thr)
3416 while (PL_eval_owner)
3417 COND_WAIT(&PL_eval_cond, &PL_eval_mutex);
3418 PL_eval_owner = thr;
3419 MUTEX_UNLOCK(&PL_eval_mutex);
0f15f207 3420#endif /* USE_THREADS */
c277df42 3421 ret = doeval(gimme, NULL);
3280af22 3422 if (PERLDB_INTER && was != PL_sub_generation /* Some subs defined here. */
533c011a 3423 && ret != PL_op->op_next) { /* Successive compilation. */
55497cff
PP
3424 strcpy(safestr, "_<(eval )"); /* Anything fake and short. */
3425 }
1e422769 3426 return DOCATCH(ret);
a0d0e21e
LW
3427}
3428
3429PP(pp_leaveeval)
3430{
39644a26 3431 dSP;
a0d0e21e
LW
3432 register SV **mark;
3433 SV **newsp;
3434 PMOP *newpm;
3435 I32 gimme;
c09156bb 3436 register PERL_CONTEXT *cx;
a0d0e21e 3437 OP *retop;
533c011a 3438 U8 save_flags = PL_op -> op_flags;
a0d0e21e
LW
3439 I32 optype;
3440
3441 POPBLOCK(cx,newpm);
3442 POPEVAL(cx);
3443 retop = pop_return();
3444
a1f49e72 3445 TAINT_NOT;
54310121
PP
3446 if (gimme == G_VOID)
3447 MARK = newsp;
3448 else if (gimme == G_SCALAR) {
3449 MARK = newsp + 1;
3450 if (MARK <= SP) {
3451 if (SvFLAGS(TOPs) & SVs_TEMP)
3452 *MARK = TOPs;
3453 else
3454 *MARK = sv_mortalcopy(TOPs);
3455 }
a0d0e21e 3456 else {
54310121 3457 MEXTEND(mark,0);
3280af22 3458 *MARK = &PL_sv_undef;
a0d0e21e 3459 }
a7ec2b44 3460 SP = MARK;
a0d0e21e
LW
3461 }
3462 else {
a1f49e72
CS
3463 /* in case LEAVE wipes old return values */
3464 for (mark = newsp + 1; mark <= SP; mark++) {
3465 if (!(SvFLAGS(*mark) & SVs_TEMP)) {
a0d0e21e 3466 *mark = sv_mortalcopy(*mark);
a1f49e72
CS
3467 TAINT_NOT; /* Each item is independent */
3468 }
3469 }
a0d0e21e 3470 }
3280af22 3471 PL_curpm = newpm; /* Don't pop $1 et al till now */
a0d0e21e 3472
4fdae800 3473#ifdef DEBUGGING
3280af22 3474 assert(CvDEPTH(PL_compcv) == 1);
4fdae800 3475#endif
3280af22 3476 CvDEPTH(PL_compcv) = 0;
f46d017c 3477 lex_end();
4fdae800 3478
1ce6579f 3479 if (optype == OP_REQUIRE &&
924508f0 3480 !(gimme == G_SCALAR ? SvTRUE(*SP) : SP > newsp))
54310121 3481 {
1ce6579f 3482 /* Unassume the success we assumed earlier. */
0f79a09d
GS
3483 SV *nsv = cx->blk_eval.old_namesv;
3484 (void)hv_delete(GvHVn(PL_incgv), SvPVX(nsv), SvCUR(nsv), G_DISCARD);
3485 retop = Perl_die(aTHX_ "%s did not return a true value", SvPVX(nsv));
f46d017c
GS
3486 /* die_where() did LEAVE, or we won't be here */
3487 }
3488 else {
3489 LEAVE;
3490 if (!(save_flags & OPf_SPECIAL))
3491 sv_setpv(ERRSV,"");
a0d0e21e 3492 }
a0d0e21e
LW
3493
3494 RETURNOP(retop);
3495}
3496
a0d0e21e
LW
3497PP(pp_entertry)
3498{
39644a26 3499 dSP;
c09156bb 3500 register PERL_CONTEXT *cx;
54310121 3501 I32 gimme = GIMME_V;
a0d0e21e
LW
3502
3503 ENTER;
3504 SAVETMPS;
3505
3506 push_return(cLOGOP->op_other->op_next);
1d76a5c3 3507 PUSHBLOCK(cx, (CXt_EVAL|CXp_TRYBLOCK), SP);
a0d0e21e 3508 PUSHEVAL(cx, 0, 0);
533c011a 3509 PL_eval_root = PL_op; /* Only needed so that goto works right. */
a0d0e21e 3510
faef0170 3511 PL_in_eval = EVAL_INEVAL;
38a03e6e 3512 sv_setpv(ERRSV,"");
1e422769 3513 PUTBACK;
533c011a 3514 return DOCATCH(PL_op->op_next);
a0d0e21e
LW
3515}
3516
3517PP(pp_leavetry)
3518{
39644a26 3519 dSP;
a0d0e21e
LW
3520 register SV **mark;
3521 SV **newsp;
3522 PMOP *newpm;
3523 I32 gimme;
c09156bb 3524 register PERL_CONTEXT *cx;
a0d0e21e
LW
3525 I32 optype;
3526
3527 POPBLOCK(cx,newpm);
3528 POPEVAL(cx);
3529 pop_return();
3530
a1f49e72 3531 TAINT_NOT;
54310121
PP
3532 if (gimme == G_VOID)
3533 SP = newsp;
3534 else if (gimme == G_SCALAR) {
3535 MARK = newsp + 1;
3536 if (MARK <= SP) {
3537 if (SvFLAGS(TOPs) & (SVs_PADTMP|SVs_TEMP))
3538 *MARK = TOPs;
3539 else
3540 *MARK = sv_mortalcopy(TOPs);
3541 }