This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Documentation nit in INSTALL found by Alan Burlison.
[perl5.git] / pp_ctl.c
CommitLineData
a0d0e21e
LW
1/* pp_ctl.c
2 *
4bb101f2 3 * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
241d1a3b 4 * 2000, 2001, 2002, 2003, 2004, 2005, by Larry Wall and others
a0d0e21e
LW
5 *
6 * You may distribute under the terms of either the GNU General Public
7 * License or the Artistic License, as specified in the README file.
8 *
9 */
10
11/*
12 * Now far ahead the Road has gone,
13 * And I must follow, if I can,
14 * Pursuing it with eager feet,
15 * Until it joins some larger way
16 * Where many paths and errands meet.
17 * And whither then? I cannot say.
18 */
19
166f8a29
DM
20/* This file contains control-oriented pp ("push/pop") functions that
21 * execute the opcodes that make up a perl program. A typical pp function
22 * expects to find its arguments on the stack, and usually pushes its
23 * results onto the stack, hence the 'pp' terminology. Each OP structure
24 * contains a pointer to the relevant pp_foo() function.
25 *
26 * Control-oriented means things like pp_enteriter() and pp_next(), which
27 * alter the flow of control of the program.
28 */
29
30
a0d0e21e 31#include "EXTERN.h"
864dbfa3 32#define PERL_IN_PP_CTL_C
a0d0e21e
LW
33#include "perl.h"
34
35#ifndef WORD_ALIGN
dea28490 36#define WORD_ALIGN sizeof(U32)
a0d0e21e
LW
37#endif
38
54310121 39#define DOCATCH(o) ((CATCH_GET == TRUE) ? docatch(o) : (o))
1e422769 40
acfe0abc
GS
41static I32 run_user_filter(pTHX_ int idx, SV *buf_sv, int maxlen);
42
a0d0e21e
LW
43PP(pp_wantarray)
44{
39644a26 45 dSP;
a0d0e21e
LW
46 I32 cxix;
47 EXTEND(SP, 1);
48
49 cxix = dopoptosub(cxstack_ix);
50 if (cxix < 0)
51 RETPUSHUNDEF;
52
54310121 53 switch (cxstack[cxix].blk_gimme) {
54 case G_ARRAY:
a0d0e21e 55 RETPUSHYES;
54310121 56 case G_SCALAR:
a0d0e21e 57 RETPUSHNO;
54310121 58 default:
59 RETPUSHUNDEF;
60 }
a0d0e21e
LW
61}
62
63PP(pp_regcmaybe)
64{
65 return NORMAL;
66}
67
2cd61cdb
IZ
68PP(pp_regcreset)
69{
70 /* XXXX Should store the old value to allow for tie/overload - and
71 restore in regcomp, where marked with XXXX. */
3280af22 72 PL_reginterp_cnt = 0;
0b4182de 73 TAINT_NOT;
2cd61cdb
IZ
74 return NORMAL;
75}
76
b3eb6a9b
GS
77PP(pp_regcomp)
78{
39644a26 79 dSP;
a0d0e21e 80 register PMOP *pm = (PMOP*)cLOGOP->op_other;
a0d0e21e 81 SV *tmpstr;
c277df42 82 MAGIC *mg = Null(MAGIC*);
bfed75c6 83
4b5a0d1c 84 /* prevent recompiling under /o and ithreads. */
3db8f154 85#if defined(USE_ITHREADS)
131b3ad0
DM
86 if (pm->op_pmflags & PMf_KEEP && PM_GETRE(pm)) {
87 if (PL_op->op_flags & OPf_STACKED) {
88 dMARK;
89 SP = MARK;
90 }
91 else
92 (void)POPs;
93 RETURN;
94 }
513629ba 95#endif
131b3ad0
DM
96 if (PL_op->op_flags & OPf_STACKED) {
97 /* multiple args; concatentate them */
98 dMARK; dORIGMARK;
99 tmpstr = PAD_SV(ARGTARG);
100 sv_setpvn(tmpstr, "", 0);
101 while (++MARK <= SP) {
102 if (PL_amagic_generation) {
103 SV *sv;
104 if ((SvAMAGIC(tmpstr) || SvAMAGIC(*MARK)) &&
105 (sv = amagic_call(tmpstr, *MARK, concat_amg, AMGf_assign)))
106 {
107 sv_setsv(tmpstr, sv);
108 continue;
109 }
110 }
111 sv_catsv(tmpstr, *MARK);
112 }
113 SvSETMAGIC(tmpstr);
114 SP = ORIGMARK;
115 }
116 else
117 tmpstr = POPs;
513629ba 118
b3eb6a9b 119 if (SvROK(tmpstr)) {
227a8b4b 120 SV *sv = SvRV(tmpstr);
c277df42 121 if(SvMAGICAL(sv))
14befaf4 122 mg = mg_find(sv, PERL_MAGIC_qr);
c277df42 123 }
b3eb6a9b 124 if (mg) {
44f8325f 125 regexp * const re = (regexp *)mg->mg_obj;
aaa362c4
RS
126 ReREFCNT_dec(PM_GETRE(pm));
127 PM_SETRE(pm, ReREFCNT_inc(re));
c277df42
IZ
128 }
129 else {
e62f0680
NC
130 STRLEN len;
131 const char *t = SvPV_const(tmpstr, len);
c277df42 132
20408e3c 133 /* Check against the last compiled regexp. */
aaa362c4 134 if (!PM_GETRE(pm) || !PM_GETRE(pm)->precomp ||
eb160463 135 PM_GETRE(pm)->prelen != (I32)len ||
aaa362c4 136 memNE(PM_GETRE(pm)->precomp, t, len))
85aff577 137 {
aaa362c4 138 if (PM_GETRE(pm)) {
d8f2cf8a 139 ReREFCNT_dec(PM_GETRE(pm));
aaa362c4 140 PM_SETRE(pm, Null(REGEXP*)); /* crucial if regcomp aborts */
c277df42 141 }
533c011a 142 if (PL_op->op_flags & OPf_SPECIAL)
3280af22 143 PL_reginterp_cnt = I32_MAX; /* Mark as safe. */
a0d0e21e 144
c277df42 145 pm->op_pmflags = pm->op_pmpermflags; /* reset case sensitivity */
84e09d5e
JH
146 if (DO_UTF8(tmpstr))
147 pm->op_pmdynflags |= PMdf_DYN_UTF8;
148 else {
149 pm->op_pmdynflags &= ~PMdf_DYN_UTF8;
150 if (pm->op_pmdynflags & PMdf_UTF8)
151 t = (char*)bytes_to_utf8((U8*)t, &len);
152 }
e62f0680 153 PM_SETRE(pm, CALLREGCOMP(aTHX_ (char *)t, (char *)t + len, pm));
84e09d5e
JH
154 if (!DO_UTF8(tmpstr) && (pm->op_pmdynflags & PMdf_UTF8))
155 Safefree(t);
f86aaa29 156 PL_reginterp_cnt = 0; /* XXXX Be extra paranoid - needed
2cd61cdb 157 inside tie/overload accessors. */
c277df42 158 }
4633a7c4 159 }
a0d0e21e 160
72311751 161#ifndef INCOMPLETE_TAINTS
3280af22
NIS
162 if (PL_tainting) {
163 if (PL_tainted)
72311751
GS
164 pm->op_pmdynflags |= PMdf_TAINTED;
165 else
166 pm->op_pmdynflags &= ~PMdf_TAINTED;
167 }
168#endif
169
aaa362c4 170 if (!PM_GETRE(pm)->prelen && PL_curpm)
3280af22 171 pm = PL_curpm;
17cbf7cc
AMS
172 else if (strEQ("\\s+", PM_GETRE(pm)->precomp))
173 pm->op_pmflags |= PMf_WHITE;
16bdb4ac 174 else
17cbf7cc 175 pm->op_pmflags &= ~PMf_WHITE;
a0d0e21e 176
2360cd68 177 /* XXX runtime compiled output needs to move to the pad */
a0d0e21e 178 if (pm->op_pmflags & PMf_KEEP) {
c90c0ff4 179 pm->op_private &= ~OPpRUNTIME; /* no point compiling again */
3db8f154 180#if !defined(USE_ITHREADS)
2360cd68 181 /* XXX can't change the optree at runtime either */
533c011a 182 cLOGOP->op_first->op_next = PL_op->op_next;
2360cd68 183#endif
a0d0e21e
LW
184 }
185 RETURN;
186}
187
188PP(pp_substcont)
189{
39644a26 190 dSP;
c09156bb 191 register PERL_CONTEXT *cx = &cxstack[cxstack_ix];
901017d6
AL
192 register PMOP * const pm = (PMOP*) cLOGOP->op_other;
193 register SV * const dstr = cx->sb_dstr;
a0d0e21e
LW
194 register char *s = cx->sb_s;
195 register char *m = cx->sb_m;
196 char *orig = cx->sb_orig;
901017d6 197 register REGEXP * const rx = cx->sb_rx;
db79b45b 198 SV *nsv = Nullsv;
988e6e7e
AE
199 REGEXP *old = PM_GETRE(pm);
200 if(old != rx) {
bfed75c6 201 if(old)
988e6e7e 202 ReREFCNT_dec(old);
d8f2cf8a 203 PM_SETRE(pm,rx);
d8f2cf8a
AB
204 }
205
d9f97599 206 rxres_restore(&cx->sb_rxres, rx);
01b35787 207 RX_MATCH_UTF8_set(rx, DO_UTF8(cx->sb_targ));
c90c0ff4 208
a0d0e21e 209 if (cx->sb_iters++) {
a3b680e6 210 const I32 saviters = cx->sb_iters;
a0d0e21e 211 if (cx->sb_iters > cx->sb_maxiters)
cea2e8a9 212 DIE(aTHX_ "Substitution loop");
a0d0e21e 213
48c036b1
GS
214 if (!(cx->sb_rxtainted & 2) && SvTAINTED(TOPs))
215 cx->sb_rxtainted |= 2;
a0d0e21e 216 sv_catsv(dstr, POPs);
a0d0e21e
LW
217
218 /* Are we done */
cea2e8a9 219 if (cx->sb_once || !CALLREGEXEC(aTHX_ rx, s, cx->sb_strend, orig,
9661b544 220 s == m, cx->sb_targ, NULL,
22e551b9 221 ((cx->sb_rflags & REXEC_COPY_STR)
cf93c79d
IZ
222 ? (REXEC_IGNOREPOS|REXEC_NOT_FIRST)
223 : (REXEC_COPY_STR|REXEC_IGNOREPOS|REXEC_NOT_FIRST))))
a0d0e21e
LW
224 {
225 SV *targ = cx->sb_targ;
748a9306 226
078c425b
JH
227 assert(cx->sb_strend >= s);
228 if(cx->sb_strend > s) {
229 if (DO_UTF8(dstr) && !SvUTF8(targ))
230 sv_catpvn_utf8_upgrade(dstr, s, cx->sb_strend - s, nsv);
231 else
232 sv_catpvn(dstr, s, cx->sb_strend - s);
233 }
48c036b1 234 cx->sb_rxtainted |= RX_MATCH_TAINTED(rx);
9212bbba 235
f8c7b90f 236#ifdef PERL_OLD_COPY_ON_WRITE
ed252734
NC
237 if (SvIsCOW(targ)) {
238 sv_force_normal_flags(targ, SV_COW_DROP_PV);
239 } else
240#endif
241 {
8bd4d4c5 242 SvPV_free(targ);
ed252734 243 }
f880fe2f 244 SvPV_set(targ, SvPVX(dstr));
748a9306
LW
245 SvCUR_set(targ, SvCUR(dstr));
246 SvLEN_set(targ, SvLEN(dstr));
1aa99e6b
IH
247 if (DO_UTF8(dstr))
248 SvUTF8_on(targ);
f880fe2f 249 SvPV_set(dstr, (char*)0);
748a9306 250 sv_free(dstr);
48c036b1
GS
251
252 TAINT_IF(cx->sb_rxtainted & 1);
22e13caa 253 PUSHs(sv_2mortal(newSViv(saviters - 1)));
48c036b1 254
ffc61ed2 255 (void)SvPOK_only_UTF8(targ);
48c036b1 256 TAINT_IF(cx->sb_rxtainted);
a0d0e21e 257 SvSETMAGIC(targ);
9212bbba 258 SvTAINT(targ);
5cd24f17 259
4633a7c4 260 LEAVE_SCOPE(cx->sb_oldsave);
d8f2cf8a 261 ReREFCNT_dec(rx);
a0d0e21e
LW
262 POPSUBST(cx);
263 RETURNOP(pm->op_next);
264 }
8e5e9ebe 265 cx->sb_iters = saviters;
a0d0e21e 266 }
cf93c79d 267 if (RX_MATCH_COPIED(rx) && rx->subbeg != orig) {
a0d0e21e
LW
268 m = s;
269 s = orig;
cf93c79d 270 cx->sb_orig = orig = rx->subbeg;
a0d0e21e
LW
271 s = orig + (m - s);
272 cx->sb_strend = s + (cx->sb_strend - m);
273 }
cf93c79d 274 cx->sb_m = m = rx->startp[0] + orig;
db79b45b 275 if (m > s) {
bfed75c6 276 if (DO_UTF8(dstr) && !SvUTF8(cx->sb_targ))
db79b45b
JH
277 sv_catpvn_utf8_upgrade(dstr, s, m - s, nsv);
278 else
279 sv_catpvn(dstr, s, m-s);
280 }
cf93c79d 281 cx->sb_s = rx->endp[0] + orig;
084916e3 282 { /* Update the pos() information. */
44f8325f 283 SV * const sv = cx->sb_targ;
084916e3
JH
284 MAGIC *mg;
285 I32 i;
286 if (SvTYPE(sv) < SVt_PVMG)
862a34c6 287 SvUPGRADE(sv, SVt_PVMG);
14befaf4
DM
288 if (!(mg = mg_find(sv, PERL_MAGIC_regex_global))) {
289 sv_magic(sv, Nullsv, PERL_MAGIC_regex_global, Nullch, 0);
290 mg = mg_find(sv, PERL_MAGIC_regex_global);
084916e3
JH
291 }
292 i = m - orig;
293 if (DO_UTF8(sv))
294 sv_pos_b2u(sv, &i);
295 mg->mg_len = i;
296 }
988e6e7e 297 if (old != rx)
454f1e26 298 (void)ReREFCNT_inc(rx);
d9f97599
GS
299 cx->sb_rxtainted |= RX_MATCH_TAINTED(rx);
300 rxres_save(&cx->sb_rxres, rx);
a0d0e21e
LW
301 RETURNOP(pm->op_pmreplstart);
302}
303
c90c0ff4 304void
864dbfa3 305Perl_rxres_save(pTHX_ void **rsp, REGEXP *rx)
c90c0ff4 306{
307 UV *p = (UV*)*rsp;
308 U32 i;
309
d9f97599 310 if (!p || p[1] < rx->nparens) {
f8c7b90f 311#ifdef PERL_OLD_COPY_ON_WRITE
ed252734
NC
312 i = 7 + rx->nparens * 2;
313#else
d9f97599 314 i = 6 + rx->nparens * 2;
ed252734 315#endif
c90c0ff4 316 if (!p)
a02a5408 317 Newx(p, i, UV);
c90c0ff4 318 else
319 Renew(p, i, UV);
320 *rsp = (void*)p;
321 }
322
56431972 323 *p++ = PTR2UV(RX_MATCH_COPIED(rx) ? rx->subbeg : Nullch);
cf93c79d 324 RX_MATCH_COPIED_off(rx);
c90c0ff4 325
f8c7b90f 326#ifdef PERL_OLD_COPY_ON_WRITE
ed252734
NC
327 *p++ = PTR2UV(rx->saved_copy);
328 rx->saved_copy = Nullsv;
329#endif
330
d9f97599 331 *p++ = rx->nparens;
c90c0ff4 332
56431972 333 *p++ = PTR2UV(rx->subbeg);
cf93c79d 334 *p++ = (UV)rx->sublen;
d9f97599
GS
335 for (i = 0; i <= rx->nparens; ++i) {
336 *p++ = (UV)rx->startp[i];
337 *p++ = (UV)rx->endp[i];
c90c0ff4 338 }
339}
340
341void
864dbfa3 342Perl_rxres_restore(pTHX_ void **rsp, REGEXP *rx)
c90c0ff4 343{
344 UV *p = (UV*)*rsp;
345 U32 i;
346
ed252734 347 RX_MATCH_COPY_FREE(rx);
cf93c79d 348 RX_MATCH_COPIED_set(rx, *p);
c90c0ff4 349 *p++ = 0;
350
f8c7b90f 351#ifdef PERL_OLD_COPY_ON_WRITE
ed252734
NC
352 if (rx->saved_copy)
353 SvREFCNT_dec (rx->saved_copy);
354 rx->saved_copy = INT2PTR(SV*,*p);
355 *p++ = 0;
356#endif
357
d9f97599 358 rx->nparens = *p++;
c90c0ff4 359
56431972 360 rx->subbeg = INT2PTR(char*,*p++);
cf93c79d 361 rx->sublen = (I32)(*p++);
d9f97599 362 for (i = 0; i <= rx->nparens; ++i) {
cf93c79d
IZ
363 rx->startp[i] = (I32)(*p++);
364 rx->endp[i] = (I32)(*p++);
c90c0ff4 365 }
366}
367
368void
864dbfa3 369Perl_rxres_free(pTHX_ void **rsp)
c90c0ff4 370{
44f8325f 371 UV * const p = (UV*)*rsp;
c90c0ff4 372
373 if (p) {
94010e71
NC
374#ifdef PERL_POISON
375 void *tmp = INT2PTR(char*,*p);
376 Safefree(tmp);
377 if (*p)
378 Poison(*p, 1, sizeof(*p));
379#else
56431972 380 Safefree(INT2PTR(char*,*p));
94010e71 381#endif
f8c7b90f 382#ifdef PERL_OLD_COPY_ON_WRITE
ed252734
NC
383 if (p[1]) {
384 SvREFCNT_dec (INT2PTR(SV*,p[1]));
385 }
386#endif
c90c0ff4 387 Safefree(p);
388 *rsp = Null(void*);
389 }
390}
391
a0d0e21e
LW
392PP(pp_formline)
393{
39644a26 394 dSP; dMARK; dORIGMARK;
76e3520e 395 register SV *tmpForm = *++MARK;
dea28490 396 register U32 *fpc;
a0d0e21e 397 register char *t;
245d4a47 398 const char *f;
a0d0e21e 399 register I32 arg;
9c5ffd7c 400 register SV *sv = Nullsv;
5a34cab7 401 const char *item = Nullch;
9c5ffd7c
JH
402 I32 itemsize = 0;
403 I32 fieldsize = 0;
a0d0e21e 404 I32 lines = 0;
3280af22 405 bool chopspace = (strchr(PL_chopset, ' ') != Nullch);
5a34cab7 406 const char *chophere = Nullch;
9c5ffd7c 407 char *linemark = Nullch;
65202027 408 NV value;
9c5ffd7c 409 bool gotsome = FALSE;
a0d0e21e 410 STRLEN len;
24c89738
DM
411 STRLEN fudge = SvPOK(tmpForm)
412 ? (SvCUR(tmpForm) * (IN_BYTES ? 1 : 3) + 1) : 0;
1bd51a4c
IH
413 bool item_is_utf8 = FALSE;
414 bool targ_is_utf8 = FALSE;
78da4d13 415 SV * nsv = Nullsv;
a1b95068 416 OP * parseres = 0;
bfed75c6 417 const char *fmt;
a1b95068 418 bool oneline;
a0d0e21e 419
76e3520e 420 if (!SvMAGICAL(tmpForm) || !SvCOMPILED(tmpForm)) {
445b3f51
GS
421 if (SvREADONLY(tmpForm)) {
422 SvREADONLY_off(tmpForm);
a1b95068 423 parseres = doparseform(tmpForm);
445b3f51
GS
424 SvREADONLY_on(tmpForm);
425 }
426 else
a1b95068
WL
427 parseres = doparseform(tmpForm);
428 if (parseres)
429 return parseres;
a0d0e21e 430 }
3280af22 431 SvPV_force(PL_formtarget, len);
1bd51a4c
IH
432 if (DO_UTF8(PL_formtarget))
433 targ_is_utf8 = TRUE;
a0ed51b3 434 t = SvGROW(PL_formtarget, len + fudge + 1); /* XXX SvCUR bad */
a0d0e21e 435 t += len;
245d4a47 436 f = SvPV_const(tmpForm, len);
a0d0e21e 437 /* need to jump to the next word */
245d4a47 438 fpc = (U32*)(f + len + WORD_ALIGN - SvCUR(tmpForm) % WORD_ALIGN);
a0d0e21e
LW
439
440 for (;;) {
441 DEBUG_f( {
bfed75c6 442 const char *name = "???";
a0d0e21e
LW
443 arg = -1;
444 switch (*fpc) {
445 case FF_LITERAL: arg = fpc[1]; name = "LITERAL"; break;
446 case FF_BLANK: arg = fpc[1]; name = "BLANK"; break;
447 case FF_SKIP: arg = fpc[1]; name = "SKIP"; break;
448 case FF_FETCH: arg = fpc[1]; name = "FETCH"; break;
449 case FF_DECIMAL: arg = fpc[1]; name = "DECIMAL"; break;
450
451 case FF_CHECKNL: name = "CHECKNL"; break;
452 case FF_CHECKCHOP: name = "CHECKCHOP"; break;
453 case FF_SPACE: name = "SPACE"; break;
454 case FF_HALFSPACE: name = "HALFSPACE"; break;
455 case FF_ITEM: name = "ITEM"; break;
456 case FF_CHOP: name = "CHOP"; break;
457 case FF_LINEGLOB: name = "LINEGLOB"; break;
458 case FF_NEWLINE: name = "NEWLINE"; break;
459 case FF_MORE: name = "MORE"; break;
460 case FF_LINEMARK: name = "LINEMARK"; break;
461 case FF_END: name = "END"; break;
bfed75c6 462 case FF_0DECIMAL: name = "0DECIMAL"; break;
a1b95068 463 case FF_LINESNGL: name = "LINESNGL"; break;
a0d0e21e
LW
464 }
465 if (arg >= 0)
bf49b057 466 PerlIO_printf(Perl_debug_log, "%-16s%ld\n", name, (long) arg);
a0d0e21e 467 else
bf49b057 468 PerlIO_printf(Perl_debug_log, "%-16s\n", name);
5f80b19c 469 } );
a0d0e21e
LW
470 switch (*fpc++) {
471 case FF_LINEMARK:
472 linemark = t;
a0d0e21e
LW
473 lines++;
474 gotsome = FALSE;
475 break;
476
477 case FF_LITERAL:
478 arg = *fpc++;
1bd51a4c 479 if (targ_is_utf8 && !SvUTF8(tmpForm)) {
b15aece3 480 SvCUR_set(PL_formtarget, t - SvPVX_const(PL_formtarget));
78da4d13
JH
481 *t = '\0';
482 sv_catpvn_utf8_upgrade(PL_formtarget, f, arg, nsv);
483 t = SvEND(PL_formtarget);
1bd51a4c
IH
484 break;
485 }
486 if (!targ_is_utf8 && DO_UTF8(tmpForm)) {
b15aece3 487 SvCUR_set(PL_formtarget, t - SvPVX_const(PL_formtarget));
1bd51a4c
IH
488 *t = '\0';
489 sv_utf8_upgrade(PL_formtarget);
490 SvGROW(PL_formtarget, SvCUR(PL_formtarget) + fudge + 1);
491 t = SvEND(PL_formtarget);
492 targ_is_utf8 = TRUE;
493 }
a0d0e21e
LW
494 while (arg--)
495 *t++ = *f++;
496 break;
497
498 case FF_SKIP:
499 f += *fpc++;
500 break;
501
502 case FF_FETCH:
503 arg = *fpc++;
504 f += arg;
505 fieldsize = arg;
506
507 if (MARK < SP)
508 sv = *++MARK;
509 else {
3280af22 510 sv = &PL_sv_no;
599cee73 511 if (ckWARN(WARN_SYNTAX))
9014280d 512 Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "Not enough format arguments");
a0d0e21e
LW
513 }
514 break;
515
516 case FF_CHECKNL:
5a34cab7
NC
517 {
518 const char *send;
519 const char *s = item = SvPV_const(sv, len);
520 itemsize = len;
521 if (DO_UTF8(sv)) {
522 itemsize = sv_len_utf8(sv);
523 if (itemsize != (I32)len) {
524 I32 itembytes;
525 if (itemsize > fieldsize) {
526 itemsize = fieldsize;
527 itembytes = itemsize;
528 sv_pos_u2b(sv, &itembytes, 0);
529 }
530 else
531 itembytes = len;
532 send = chophere = s + itembytes;
533 while (s < send) {
534 if (*s & ~31)
535 gotsome = TRUE;
536 else if (*s == '\n')
537 break;
538 s++;
539 }
540 item_is_utf8 = TRUE;
541 itemsize = s - item;
542 sv_pos_b2u(sv, &itemsize);
543 break;
a0ed51b3 544 }
a0ed51b3 545 }
5a34cab7
NC
546 item_is_utf8 = FALSE;
547 if (itemsize > fieldsize)
548 itemsize = fieldsize;
549 send = chophere = s + itemsize;
550 while (s < send) {
551 if (*s & ~31)
552 gotsome = TRUE;
553 else if (*s == '\n')
554 break;
555 s++;
556 }
557 itemsize = s - item;
558 break;
a0ed51b3 559 }
a0d0e21e
LW
560
561 case FF_CHECKCHOP:
5a34cab7
NC
562 {
563 const char *s = item = SvPV_const(sv, len);
564 itemsize = len;
565 if (DO_UTF8(sv)) {
566 itemsize = sv_len_utf8(sv);
567 if (itemsize != (I32)len) {
568 I32 itembytes;
569 if (itemsize <= fieldsize) {
570 const char *send = chophere = s + itemsize;
571 while (s < send) {
572 if (*s == '\r') {
573 itemsize = s - item;
a0ed51b3 574 chophere = s;
a0ed51b3 575 break;
5a34cab7
NC
576 }
577 if (*s++ & ~31)
a0ed51b3 578 gotsome = TRUE;
a0ed51b3 579 }
a0ed51b3 580 }
5a34cab7
NC
581 else {
582 const char *send;
583 itemsize = fieldsize;
584 itembytes = itemsize;
585 sv_pos_u2b(sv, &itembytes, 0);
586 send = chophere = s + itembytes;
587 while (s < send || (s == send && isSPACE(*s))) {
588 if (isSPACE(*s)) {
589 if (chopspace)
590 chophere = s;
591 if (*s == '\r')
592 break;
593 }
594 else {
595 if (*s & ~31)
596 gotsome = TRUE;
597 if (strchr(PL_chopset, *s))
598 chophere = s + 1;
599 }
600 s++;
601 }
602 itemsize = chophere - item;
603 sv_pos_b2u(sv, &itemsize);
604 }
605 item_is_utf8 = TRUE;
a0d0e21e
LW
606 break;
607 }
a0d0e21e 608 }
5a34cab7
NC
609 item_is_utf8 = FALSE;
610 if (itemsize <= fieldsize) {
611 const char *const send = chophere = s + itemsize;
612 while (s < send) {
613 if (*s == '\r') {
614 itemsize = s - item;
a0d0e21e 615 chophere = s;
a0d0e21e 616 break;
5a34cab7
NC
617 }
618 if (*s++ & ~31)
a0d0e21e 619 gotsome = TRUE;
a0d0e21e 620 }
a0d0e21e 621 }
5a34cab7
NC
622 else {
623 const char *send;
624 itemsize = fieldsize;
625 send = chophere = s + itemsize;
626 while (s < send || (s == send && isSPACE(*s))) {
627 if (isSPACE(*s)) {
628 if (chopspace)
629 chophere = s;
630 if (*s == '\r')
631 break;
632 }
633 else {
634 if (*s & ~31)
635 gotsome = TRUE;
636 if (strchr(PL_chopset, *s))
637 chophere = s + 1;
638 }
639 s++;
640 }
641 itemsize = chophere - item;
642 }
643 break;
a0d0e21e 644 }
a0d0e21e
LW
645
646 case FF_SPACE:
647 arg = fieldsize - itemsize;
648 if (arg) {
649 fieldsize -= arg;
650 while (arg-- > 0)
651 *t++ = ' ';
652 }
653 break;
654
655 case FF_HALFSPACE:
656 arg = fieldsize - itemsize;
657 if (arg) {
658 arg /= 2;
659 fieldsize -= arg;
660 while (arg-- > 0)
661 *t++ = ' ';
662 }
663 break;
664
665 case FF_ITEM:
5a34cab7
NC
666 {
667 const char *s = item;
668 arg = itemsize;
669 if (item_is_utf8) {
670 if (!targ_is_utf8) {
671 SvCUR_set(PL_formtarget, t - SvPVX_const(PL_formtarget));
672 *t = '\0';
673 sv_utf8_upgrade(PL_formtarget);
674 SvGROW(PL_formtarget, SvCUR(PL_formtarget) + fudge + 1);
675 t = SvEND(PL_formtarget);
676 targ_is_utf8 = TRUE;
a0ed51b3 677 }
5a34cab7
NC
678 while (arg--) {
679 if (UTF8_IS_CONTINUED(*s)) {
680 STRLEN skip = UTF8SKIP(s);
681 switch (skip) {
682 default:
683 Move(s,t,skip,char);
684 s += skip;
685 t += skip;
686 break;
687 case 7: *t++ = *s++;
688 case 6: *t++ = *s++;
689 case 5: *t++ = *s++;
690 case 4: *t++ = *s++;
691 case 3: *t++ = *s++;
692 case 2: *t++ = *s++;
693 case 1: *t++ = *s++;
694 }
695 }
696 else {
697 if ( !((*t++ = *s++) & ~31) )
698 t[-1] = ' ';
699 }
a0ed51b3 700 }
5a34cab7 701 break;
a0ed51b3 702 }
5a34cab7
NC
703 if (targ_is_utf8 && !item_is_utf8) {
704 SvCUR_set(PL_formtarget, t - SvPVX_const(PL_formtarget));
705 *t = '\0';
706 sv_catpvn_utf8_upgrade(PL_formtarget, s, arg, nsv);
707 for (; t < SvEND(PL_formtarget); t++) {
78da4d13 708#ifdef EBCDIC
901017d6 709 const int ch = *t;
5a34cab7 710 if (iscntrl(ch))
78da4d13 711#else
5a34cab7 712 if (!(*t & ~31))
78da4d13 713#endif
5a34cab7
NC
714 *t = ' ';
715 }
716 break;
78da4d13 717 }
5a34cab7 718 while (arg--) {
9d116dd7 719#ifdef EBCDIC
901017d6 720 const int ch = *t++ = *s++;
5a34cab7 721 if (iscntrl(ch))
a0d0e21e 722#else
5a34cab7 723 if ( !((*t++ = *s++) & ~31) )
a0d0e21e 724#endif
5a34cab7
NC
725 t[-1] = ' ';
726 }
727 break;
a0d0e21e 728 }
a0d0e21e
LW
729
730 case FF_CHOP:
5a34cab7
NC
731 {
732 const char *s = chophere;
733 if (chopspace) {
734 while (*s && isSPACE(*s))
735 s++;
736 }
737 sv_chop(sv,s);
738 SvSETMAGIC(sv);
739 break;
a0d0e21e 740 }
a0d0e21e 741
a1b95068
WL
742 case FF_LINESNGL:
743 chopspace = 0;
744 oneline = TRUE;
745 goto ff_line;
a0d0e21e 746 case FF_LINEGLOB:
a1b95068
WL
747 oneline = FALSE;
748 ff_line:
5a34cab7
NC
749 {
750 const char *s = item = SvPV_const(sv, len);
751 itemsize = len;
752 if ((item_is_utf8 = DO_UTF8(sv)))
753 itemsize = sv_len_utf8(sv);
754 if (itemsize) {
755 bool chopped = FALSE;
756 const char *const send = s + len;
757 gotsome = TRUE;
758 chophere = s + itemsize;
759 while (s < send) {
760 if (*s++ == '\n') {
761 if (oneline) {
762 chopped = TRUE;
763 chophere = s;
764 break;
765 } else {
766 if (s == send) {
767 itemsize--;
768 chopped = TRUE;
769 } else
770 lines++;
771 }
1bd51a4c 772 }
a0d0e21e 773 }
5a34cab7
NC
774 SvCUR_set(PL_formtarget, t - SvPVX_const(PL_formtarget));
775 if (targ_is_utf8)
776 SvUTF8_on(PL_formtarget);
777 if (oneline) {
778 SvCUR_set(sv, chophere - item);
779 sv_catsv(PL_formtarget, sv);
780 SvCUR_set(sv, itemsize);
781 } else
782 sv_catsv(PL_formtarget, sv);
783 if (chopped)
784 SvCUR_set(PL_formtarget, SvCUR(PL_formtarget) - 1);
785 SvGROW(PL_formtarget, SvCUR(PL_formtarget) + fudge + 1);
786 t = SvPVX(PL_formtarget) + SvCUR(PL_formtarget);
787 if (item_is_utf8)
788 targ_is_utf8 = TRUE;
a0d0e21e 789 }
5a34cab7 790 break;
a0d0e21e 791 }
a0d0e21e 792
a1b95068
WL
793 case FF_0DECIMAL:
794 arg = *fpc++;
795#if defined(USE_LONG_DOUBLE)
796 fmt = (arg & 256) ? "%#0*.*" PERL_PRIfldbl : "%0*.*" PERL_PRIfldbl;
797#else
798 fmt = (arg & 256) ? "%#0*.*f" : "%0*.*f";
799#endif
800 goto ff_dec;
a0d0e21e 801 case FF_DECIMAL:
a0d0e21e 802 arg = *fpc++;
65202027 803#if defined(USE_LONG_DOUBLE)
a1b95068 804 fmt = (arg & 256) ? "%#*.*" PERL_PRIfldbl : "%*.*" PERL_PRIfldbl;
65202027 805#else
a1b95068 806 fmt = (arg & 256) ? "%#*.*f" : "%*.*f";
65202027 807#endif
a1b95068 808 ff_dec:
784707d5
JP
809 /* If the field is marked with ^ and the value is undefined,
810 blank it out. */
784707d5
JP
811 if ((arg & 512) && !SvOK(sv)) {
812 arg = fieldsize;
813 while (arg--)
814 *t++ = ' ';
815 break;
816 }
817 gotsome = TRUE;
818 value = SvNV(sv);
a1b95068 819 /* overflow evidence */
bfed75c6 820 if (num_overflow(value, fieldsize, arg)) {
a1b95068
WL
821 arg = fieldsize;
822 while (arg--)
823 *t++ = '#';
824 break;
825 }
784707d5
JP
826 /* Formats aren't yet marked for locales, so assume "yes". */
827 {
828 STORE_NUMERIC_STANDARD_SET_LOCAL();
a1b95068 829 sprintf(t, fmt, (int) fieldsize, (int) arg & 255, value);
784707d5
JP
830 RESTORE_NUMERIC_STANDARD();
831 }
832 t += fieldsize;
833 break;
a1b95068 834
a0d0e21e
LW
835 case FF_NEWLINE:
836 f++;
837 while (t-- > linemark && *t == ' ') ;
838 t++;
839 *t++ = '\n';
840 break;
841
842 case FF_BLANK:
843 arg = *fpc++;
844 if (gotsome) {
845 if (arg) { /* repeat until fields exhausted? */
846 *t = '\0';
b15aece3 847 SvCUR_set(PL_formtarget, t - SvPVX_const(PL_formtarget));
3280af22 848 lines += FmLINES(PL_formtarget);
a0d0e21e
LW
849 if (lines == 200) {
850 arg = t - linemark;
851 if (strnEQ(linemark, linemark - arg, arg))
cea2e8a9 852 DIE(aTHX_ "Runaway format");
a0d0e21e 853 }
1bd51a4c
IH
854 if (targ_is_utf8)
855 SvUTF8_on(PL_formtarget);
3280af22 856 FmLINES(PL_formtarget) = lines;
a0d0e21e
LW
857 SP = ORIGMARK;
858 RETURNOP(cLISTOP->op_first);
859 }
860 }
861 else {
862 t = linemark;
863 lines--;
864 }
865 break;
866
867 case FF_MORE:
5a34cab7
NC
868 {
869 const char *s = chophere;
870 const char *send = item + len;
871 if (chopspace) {
872 while (*s && isSPACE(*s) && s < send)
873 s++;
a0d0e21e 874 }
5a34cab7
NC
875 if (s < send) {
876 char *s1;
877 arg = fieldsize - itemsize;
878 if (arg) {
879 fieldsize -= arg;
880 while (arg-- > 0)
881 *t++ = ' ';
882 }
883 s1 = t - 3;
884 if (strnEQ(s1," ",3)) {
885 while (s1 > SvPVX_const(PL_formtarget) && isSPACE(s1[-1]))
886 s1--;
887 }
888 *s1++ = '.';
889 *s1++ = '.';
890 *s1++ = '.';
a0d0e21e 891 }
5a34cab7 892 break;
a0d0e21e 893 }
a0d0e21e
LW
894 case FF_END:
895 *t = '\0';
b15aece3 896 SvCUR_set(PL_formtarget, t - SvPVX_const(PL_formtarget));
1bd51a4c
IH
897 if (targ_is_utf8)
898 SvUTF8_on(PL_formtarget);
3280af22 899 FmLINES(PL_formtarget) += lines;
a0d0e21e
LW
900 SP = ORIGMARK;
901 RETPUSHYES;
902 }
903 }
904}
905
906PP(pp_grepstart)
907{
27da23d5 908 dVAR; dSP;
a0d0e21e
LW
909 SV *src;
910
3280af22 911 if (PL_stack_base + *PL_markstack_ptr == SP) {
a0d0e21e 912 (void)POPMARK;
54310121 913 if (GIMME_V == G_SCALAR)
0b024f31 914 XPUSHs(sv_2mortal(newSViv(0)));
533c011a 915 RETURNOP(PL_op->op_next->op_next);
a0d0e21e 916 }
3280af22 917 PL_stack_sp = PL_stack_base + *PL_markstack_ptr + 1;
cea2e8a9
GS
918 pp_pushmark(); /* push dst */
919 pp_pushmark(); /* push src */
a0d0e21e
LW
920 ENTER; /* enter outer scope */
921
922 SAVETMPS;
59f00321
RGS
923 if (PL_op->op_private & OPpGREP_LEX)
924 SAVESPTR(PAD_SVl(PL_op->op_targ));
925 else
926 SAVE_DEFSV;
a0d0e21e 927 ENTER; /* enter inner scope */
7766f137 928 SAVEVPTR(PL_curpm);
a0d0e21e 929
3280af22 930 src = PL_stack_base[*PL_markstack_ptr];
a0d0e21e 931 SvTEMP_off(src);
59f00321
RGS
932 if (PL_op->op_private & OPpGREP_LEX)
933 PAD_SVl(PL_op->op_targ) = src;
934 else
935 DEFSV = src;
a0d0e21e
LW
936
937 PUTBACK;
533c011a 938 if (PL_op->op_type == OP_MAPSTART)
cea2e8a9 939 pp_pushmark(); /* push top */
533c011a 940 return ((LOGOP*)PL_op->op_next)->op_other;
a0d0e21e
LW
941}
942
943PP(pp_mapstart)
944{
cea2e8a9 945 DIE(aTHX_ "panic: mapstart"); /* uses grepstart */
a0d0e21e
LW
946}
947
948PP(pp_mapwhile)
949{
27da23d5 950 dVAR; dSP;
f54cb97a 951 const I32 gimme = GIMME_V;
544f3153 952 I32 items = (SP - PL_stack_base) - *PL_markstack_ptr; /* how many new items */
a0d0e21e
LW
953 I32 count;
954 I32 shift;
955 SV** src;
ac27b0f5 956 SV** dst;
a0d0e21e 957
544f3153 958 /* first, move source pointer to the next item in the source list */
3280af22 959 ++PL_markstack_ptr[-1];
544f3153
GS
960
961 /* if there are new items, push them into the destination list */
4c90a460 962 if (items && gimme != G_VOID) {
544f3153
GS
963 /* might need to make room back there first */
964 if (items > PL_markstack_ptr[-1] - PL_markstack_ptr[-2]) {
965 /* XXX this implementation is very pessimal because the stack
966 * is repeatedly extended for every set of items. Is possible
967 * to do this without any stack extension or copying at all
968 * by maintaining a separate list over which the map iterates
18ef8bea 969 * (like foreach does). --gsar */
544f3153
GS
970
971 /* everything in the stack after the destination list moves
972 * towards the end the stack by the amount of room needed */
973 shift = items - (PL_markstack_ptr[-1] - PL_markstack_ptr[-2]);
974
975 /* items to shift up (accounting for the moved source pointer) */
976 count = (SP - PL_stack_base) - (PL_markstack_ptr[-1] - 1);
18ef8bea
BT
977
978 /* This optimization is by Ben Tilly and it does
979 * things differently from what Sarathy (gsar)
980 * is describing. The downside of this optimization is
981 * that leaves "holes" (uninitialized and hopefully unused areas)
982 * to the Perl stack, but on the other hand this
983 * shouldn't be a problem. If Sarathy's idea gets
984 * implemented, this optimization should become
985 * irrelevant. --jhi */
986 if (shift < count)
987 shift = count; /* Avoid shifting too often --Ben Tilly */
bfed75c6 988
924508f0
GS
989 EXTEND(SP,shift);
990 src = SP;
991 dst = (SP += shift);
3280af22
NIS
992 PL_markstack_ptr[-1] += shift;
993 *PL_markstack_ptr += shift;
544f3153 994 while (count--)
a0d0e21e
LW
995 *dst-- = *src--;
996 }
544f3153 997 /* copy the new items down to the destination list */
ac27b0f5 998 dst = PL_stack_base + (PL_markstack_ptr[-2] += items) - 1;
22023b26
TP
999 if (gimme == G_ARRAY) {
1000 while (items-- > 0)
1001 *dst-- = SvTEMP(TOPs) ? POPs : sv_mortalcopy(POPs);
1002 }
bfed75c6 1003 else {
22023b26
TP
1004 /* scalar context: we don't care about which values map returns
1005 * (we use undef here). And so we certainly don't want to do mortal
1006 * copies of meaningless values. */
1007 while (items-- > 0) {
b988aa42 1008 (void)POPs;
22023b26
TP
1009 *dst-- = &PL_sv_undef;
1010 }
1011 }
a0d0e21e
LW
1012 }
1013 LEAVE; /* exit inner scope */
1014
1015 /* All done yet? */
3280af22 1016 if (PL_markstack_ptr[-1] > *PL_markstack_ptr) {
a0d0e21e
LW
1017
1018 (void)POPMARK; /* pop top */
1019 LEAVE; /* exit outer scope */
1020 (void)POPMARK; /* pop src */
3280af22 1021 items = --*PL_markstack_ptr - PL_markstack_ptr[-1];
a0d0e21e 1022 (void)POPMARK; /* pop dst */
3280af22 1023 SP = PL_stack_base + POPMARK; /* pop original mark */
54310121 1024 if (gimme == G_SCALAR) {
7cc47870
RGS
1025 if (PL_op->op_private & OPpGREP_LEX) {
1026 SV* sv = sv_newmortal();
1027 sv_setiv(sv, items);
1028 PUSHs(sv);
1029 }
1030 else {
1031 dTARGET;
1032 XPUSHi(items);
1033 }
a0d0e21e 1034 }
54310121 1035 else if (gimme == G_ARRAY)
1036 SP += items;
a0d0e21e
LW
1037 RETURN;
1038 }
1039 else {
1040 SV *src;
1041
1042 ENTER; /* enter inner scope */
7766f137 1043 SAVEVPTR(PL_curpm);
a0d0e21e 1044
544f3153 1045 /* set $_ to the new source item */
3280af22 1046 src = PL_stack_base[PL_markstack_ptr[-1]];
a0d0e21e 1047 SvTEMP_off(src);
59f00321
RGS
1048 if (PL_op->op_private & OPpGREP_LEX)
1049 PAD_SVl(PL_op->op_targ) = src;
1050 else
1051 DEFSV = src;
a0d0e21e
LW
1052
1053 RETURNOP(cLOGOP->op_other);
1054 }
1055}
1056
a0d0e21e
LW
1057/* Range stuff. */
1058
1059PP(pp_range)
1060{
1061 if (GIMME == G_ARRAY)
1a67a97c 1062 return NORMAL;
538573f7 1063 if (SvTRUEx(PAD_SV(PL_op->op_targ)))
1a67a97c 1064 return cLOGOP->op_other;
538573f7 1065 else
1a67a97c 1066 return NORMAL;
a0d0e21e
LW
1067}
1068
1069PP(pp_flip)
1070{
39644a26 1071 dSP;
a0d0e21e
LW
1072
1073 if (GIMME == G_ARRAY) {
1a67a97c 1074 RETURNOP(((LOGOP*)cUNOP->op_first)->op_other);
a0d0e21e
LW
1075 }
1076 else {
1077 dTOPss;
44f8325f 1078 SV * const targ = PAD_SV(PL_op->op_targ);
bfed75c6 1079 int flip = 0;
790090df 1080
bfed75c6 1081 if (PL_op->op_private & OPpFLIP_LINENUM) {
4e3399f9
YST
1082 if (GvIO(PL_last_in_gv)) {
1083 flip = SvIV(sv) == (IV)IoLINES(GvIOp(PL_last_in_gv));
1084 }
1085 else {
44f8325f
AL
1086 GV * const gv = gv_fetchpv(".", TRUE, SVt_PV);
1087 if (gv && GvSV(gv))
1088 flip = SvIV(sv) == SvIV(GvSV(gv));
4e3399f9 1089 }
bfed75c6
AL
1090 } else {
1091 flip = SvTRUE(sv);
1092 }
1093 if (flip) {
a0d0e21e 1094 sv_setiv(PAD_SV(cUNOP->op_first->op_targ), 1);
533c011a 1095 if (PL_op->op_flags & OPf_SPECIAL) {
a0d0e21e 1096 sv_setiv(targ, 1);
3e3baf6d 1097 SETs(targ);
a0d0e21e
LW
1098 RETURN;
1099 }
1100 else {
1101 sv_setiv(targ, 0);
924508f0 1102 SP--;
1a67a97c 1103 RETURNOP(((LOGOP*)cUNOP->op_first)->op_other);
a0d0e21e
LW
1104 }
1105 }
c69006e4 1106 sv_setpvn(TARG, "", 0);
a0d0e21e
LW
1107 SETs(targ);
1108 RETURN;
1109 }
1110}
1111
8e9bbdb9
RGS
1112/* This code tries to decide if "$left .. $right" should use the
1113 magical string increment, or if the range is numeric (we make
1114 an exception for .."0" [#18165]). AMS 20021031. */
1115
1116#define RANGE_IS_NUMERIC(left,right) ( \
b0e74086
RGS
1117 SvNIOKp(left) || (SvOK(left) && !SvPOKp(left)) || \
1118 SvNIOKp(right) || (SvOK(right) && !SvPOKp(right)) || \
e0ab1c0e 1119 (((!SvOK(left) && SvOK(right)) || ((!SvOK(left) || \
b15aece3 1120 looks_like_number(left)) && SvPOKp(left) && *SvPVX_const(left) != '0')) \
e0ab1c0e 1121 && (!SvOK(right) || looks_like_number(right))))
8e9bbdb9 1122
a0d0e21e
LW
1123PP(pp_flop)
1124{
39644a26 1125 dSP;
a0d0e21e
LW
1126
1127 if (GIMME == G_ARRAY) {
1128 dPOPPOPssrl;
86cb7173 1129
5b295bef
RD
1130 SvGETMAGIC(left);
1131 SvGETMAGIC(right);
a0d0e21e 1132
8e9bbdb9 1133 if (RANGE_IS_NUMERIC(left,right)) {
901017d6
AL
1134 register IV i, j;
1135 IV max;
4fe3f0fa
MHM
1136 if ((SvOK(left) && SvNV(left) < IV_MIN) ||
1137 (SvOK(right) && SvNV(right) > IV_MAX))
d470f89e 1138 DIE(aTHX_ "Range iterator outside integer range");
a0d0e21e
LW
1139 i = SvIV(left);
1140 max = SvIV(right);
bbce6d69 1141 if (max >= i) {
c1ab3db2
AK
1142 j = max - i + 1;
1143 EXTEND_MORTAL(j);
1144 EXTEND(SP, j);
bbce6d69 1145 }
c1ab3db2
AK
1146 else
1147 j = 0;
1148 while (j--) {
901017d6 1149 SV * const sv = sv_2mortal(newSViv(i++));
a0d0e21e
LW
1150 PUSHs(sv);
1151 }
1152 }
1153 else {
44f8325f 1154 SV * const final = sv_mortalcopy(right);
13c5b33c 1155 STRLEN len;
349d4f2f 1156 const char *tmps = SvPV_const(final, len);
a0d0e21e 1157
901017d6 1158 SV *sv = sv_mortalcopy(left);
13c5b33c 1159 SvPV_force_nolen(sv);
89ea2908 1160 while (!SvNIOKp(sv) && SvCUR(sv) <= len) {
a0d0e21e 1161 XPUSHs(sv);
b15aece3 1162 if (strEQ(SvPVX_const(sv),tmps))
89ea2908 1163 break;
a0d0e21e
LW
1164 sv = sv_2mortal(newSVsv(sv));
1165 sv_inc(sv);
1166 }
a0d0e21e
LW
1167 }
1168 }
1169 else {
1170 dTOPss;
901017d6 1171 SV * const targ = PAD_SV(cUNOP->op_first->op_targ);
4e3399f9 1172 int flop = 0;
a0d0e21e 1173 sv_inc(targ);
4e3399f9
YST
1174
1175 if (PL_op->op_private & OPpFLIP_LINENUM) {
1176 if (GvIO(PL_last_in_gv)) {
1177 flop = SvIV(sv) == (IV)IoLINES(GvIOp(PL_last_in_gv));
1178 }
1179 else {
901017d6 1180 GV * const gv = gv_fetchpv(".", TRUE, SVt_PV);
4e3399f9
YST
1181 if (gv && GvSV(gv)) flop = SvIV(sv) == SvIV(GvSV(gv));
1182 }
1183 }
1184 else {
1185 flop = SvTRUE(sv);
1186 }
1187
1188 if (flop) {
a0d0e21e 1189 sv_setiv(PAD_SV(((UNOP*)cUNOP->op_first)->op_first->op_targ), 0);
901017d6 1190 sv_catpvn(targ, "E0", 2);
a0d0e21e
LW
1191 }
1192 SETs(targ);
1193 }
1194
1195 RETURN;
1196}
1197
1198/* Control. */
1199
27da23d5 1200static const char * const context_name[] = {
515afda2
NC
1201 "pseudo-block",
1202 "subroutine",
1203 "eval",
1204 "loop",
1205 "substitution",
1206 "block",
1207 "format"
1208};
1209
76e3520e 1210STATIC I32
06b5626a 1211S_dopoptolabel(pTHX_ const char *label)
a0d0e21e
LW
1212{
1213 register I32 i;
a0d0e21e
LW
1214
1215 for (i = cxstack_ix; i >= 0; i--) {
901017d6 1216 register const PERL_CONTEXT * const cx = &cxstack[i];
6b35e009 1217 switch (CxTYPE(cx)) {
a0d0e21e 1218 case CXt_SUBST:
a0d0e21e 1219 case CXt_SUB:
7766f137 1220 case CXt_FORMAT:
a0d0e21e 1221 case CXt_EVAL:
0a753a76 1222 case CXt_NULL:
e476b1b5 1223 if (ckWARN(WARN_EXITING))
515afda2
NC
1224 Perl_warner(aTHX_ packWARN(WARN_EXITING), "Exiting %s via %s",
1225 context_name[CxTYPE(cx)], OP_NAME(PL_op));
1226 if (CxTYPE(cx) == CXt_NULL)
1227 return -1;
1228 break;
a0d0e21e 1229 case CXt_LOOP:
901017d6 1230 if ( !cx->blk_loop.label || strNE(label, cx->blk_loop.label) ) {
cea2e8a9 1231 DEBUG_l(Perl_deb(aTHX_ "(Skipping label #%ld %s)\n",
68dc0745 1232 (long)i, cx->blk_loop.label));
a0d0e21e
LW
1233 continue;
1234 }
cea2e8a9 1235 DEBUG_l( Perl_deb(aTHX_ "(Found label #%ld %s)\n", (long)i, label));
a0d0e21e
LW
1236 return i;
1237 }
1238 }
1239 return i;
1240}
1241
e50aee73 1242I32
864dbfa3 1243Perl_dowantarray(pTHX)
e50aee73 1244{
f54cb97a 1245 const I32 gimme = block_gimme();
54310121 1246 return (gimme == G_VOID) ? G_SCALAR : gimme;
1247}
1248
1249I32
864dbfa3 1250Perl_block_gimme(pTHX)
54310121 1251{
06b5626a 1252 const I32 cxix = dopoptosub(cxstack_ix);
e50aee73 1253 if (cxix < 0)
46fc3d4c 1254 return G_VOID;
e50aee73 1255
54310121 1256 switch (cxstack[cxix].blk_gimme) {
d2719217
GS
1257 case G_VOID:
1258 return G_VOID;
54310121 1259 case G_SCALAR:
e50aee73 1260 return G_SCALAR;
54310121 1261 case G_ARRAY:
1262 return G_ARRAY;
1263 default:
cea2e8a9 1264 Perl_croak(aTHX_ "panic: bad gimme: %d\n", cxstack[cxix].blk_gimme);
d2719217
GS
1265 /* NOTREACHED */
1266 return 0;
54310121 1267 }
e50aee73
AD
1268}
1269
78f9721b
SM
1270I32
1271Perl_is_lvalue_sub(pTHX)
1272{
06b5626a 1273 const I32 cxix = dopoptosub(cxstack_ix);
78f9721b
SM
1274 assert(cxix >= 0); /* We should only be called from inside subs */
1275
1276 if (cxstack[cxix].blk_sub.lval && CvLVALUE(cxstack[cxix].blk_sub.cv))
1277 return cxstack[cxix].blk_sub.lval;
1278 else
1279 return 0;
1280}
1281
76e3520e 1282STATIC I32
cea2e8a9 1283S_dopoptosub(pTHX_ I32 startingblock)
a0d0e21e 1284{
2c375eb9
GS
1285 return dopoptosub_at(cxstack, startingblock);
1286}
1287
1288STATIC I32
901017d6 1289S_dopoptosub_at(pTHX_ const PERL_CONTEXT *cxstk, I32 startingblock)
2c375eb9 1290{
a0d0e21e 1291 I32 i;
a0d0e21e 1292 for (i = startingblock; i >= 0; i--) {
901017d6 1293 register const PERL_CONTEXT * const cx = &cxstk[i];
6b35e009 1294 switch (CxTYPE(cx)) {
a0d0e21e
LW
1295 default:
1296 continue;
1297 case CXt_EVAL:
1298 case CXt_SUB:
7766f137 1299 case CXt_FORMAT:
cea2e8a9 1300 DEBUG_l( Perl_deb(aTHX_ "(Found sub #%ld)\n", (long)i));
a0d0e21e
LW
1301 return i;
1302 }
1303 }
1304 return i;
1305}
1306
76e3520e 1307STATIC I32
cea2e8a9 1308S_dopoptoeval(pTHX_ I32 startingblock)
a0d0e21e
LW
1309{
1310 I32 i;
a0d0e21e 1311 for (i = startingblock; i >= 0; i--) {
06b5626a 1312 register const PERL_CONTEXT *cx = &cxstack[i];
6b35e009 1313 switch (CxTYPE(cx)) {
a0d0e21e
LW
1314 default:
1315 continue;
1316 case CXt_EVAL:
cea2e8a9 1317 DEBUG_l( Perl_deb(aTHX_ "(Found eval #%ld)\n", (long)i));
a0d0e21e
LW
1318 return i;
1319 }
1320 }
1321 return i;
1322}
1323
76e3520e 1324STATIC I32
cea2e8a9 1325S_dopoptoloop(pTHX_ I32 startingblock)
a0d0e21e
LW
1326{
1327 I32 i;
a0d0e21e 1328 for (i = startingblock; i >= 0; i--) {
901017d6 1329 register const PERL_CONTEXT * const cx = &cxstack[i];
6b35e009 1330 switch (CxTYPE(cx)) {
a0d0e21e 1331 case CXt_SUBST:
a0d0e21e 1332 case CXt_SUB:
7766f137 1333 case CXt_FORMAT:
a0d0e21e 1334 case CXt_EVAL:
0a753a76 1335 case CXt_NULL:
e476b1b5 1336 if (ckWARN(WARN_EXITING))
515afda2
NC
1337 Perl_warner(aTHX_ packWARN(WARN_EXITING), "Exiting %s via %s",
1338 context_name[CxTYPE(cx)], OP_NAME(PL_op));
1339 if ((CxTYPE(cx)) == CXt_NULL)
1340 return -1;
1341 break;
a0d0e21e 1342 case CXt_LOOP:
cea2e8a9 1343 DEBUG_l( Perl_deb(aTHX_ "(Found loop #%ld)\n", (long)i));
a0d0e21e
LW
1344 return i;
1345 }
1346 }
1347 return i;
1348}
1349
1350void
864dbfa3 1351Perl_dounwind(pTHX_ I32 cxix)
a0d0e21e 1352{
a0d0e21e
LW
1353 I32 optype;
1354
1355 while (cxstack_ix > cxix) {
b0d9ce38 1356 SV *sv;
06b5626a 1357 register PERL_CONTEXT *cx = &cxstack[cxstack_ix];
c90c0ff4 1358 DEBUG_l(PerlIO_printf(Perl_debug_log, "Unwinding block %ld, type %s\n",
22c35a8c 1359 (long) cxstack_ix, PL_block_type[CxTYPE(cx)]));
a0d0e21e 1360 /* Note: we don't need to restore the base context info till the end. */
6b35e009 1361 switch (CxTYPE(cx)) {
c90c0ff4 1362 case CXt_SUBST:
1363 POPSUBST(cx);
1364 continue; /* not break */
a0d0e21e 1365 case CXt_SUB:
b0d9ce38
GS
1366 POPSUB(cx,sv);
1367 LEAVESUB(sv);
a0d0e21e
LW
1368 break;
1369 case CXt_EVAL:
1370 POPEVAL(cx);
1371 break;
1372 case CXt_LOOP:
1373 POPLOOP(cx);
1374 break;
0a753a76 1375 case CXt_NULL:
a0d0e21e 1376 break;
7766f137
GS
1377 case CXt_FORMAT:
1378 POPFORMAT(cx);
1379 break;
a0d0e21e 1380 }
c90c0ff4 1381 cxstack_ix--;
a0d0e21e 1382 }
1b6737cc 1383 PERL_UNUSED_VAR(optype);
a0d0e21e
LW
1384}
1385
5a844595
GS
1386void
1387Perl_qerror(pTHX_ SV *err)
1388{
1389 if (PL_in_eval)
1390 sv_catsv(ERRSV, err);
1391 else if (PL_errors)
1392 sv_catsv(PL_errors, err);
1393 else
894356b3 1394 Perl_warn(aTHX_ "%"SVf, err);
5a844595
GS
1395 ++PL_error_count;
1396}
1397
a0d0e21e 1398OP *
35a4481c 1399Perl_die_where(pTHX_ const char *message, STRLEN msglen)
a0d0e21e 1400{
27da23d5 1401 dVAR;
87582a92 1402
3280af22 1403 if (PL_in_eval) {
a0d0e21e 1404 I32 cxix;
a0d0e21e 1405 I32 gimme;
a0d0e21e 1406
4e6ea2c3 1407 if (message) {
faef0170 1408 if (PL_in_eval & EVAL_KEEPERR) {
bfed75c6 1409 static const char prefix[] = "\t(in cleanup) ";
2d03de9c 1410 SV * const err = ERRSV;
06b5626a 1411 const char *e = Nullch;
98eae8f5 1412 if (!SvPOK(err))
c69006e4 1413 sv_setpvn(err,"",0);
98eae8f5 1414 else if (SvCUR(err) >= sizeof(prefix)+msglen-1) {
0510663f 1415 STRLEN len;
349d4f2f 1416 e = SvPV_const(err, len);
0510663f 1417 e += len - msglen;
98eae8f5
GS
1418 if (*e != *message || strNE(e,message))
1419 e = Nullch;
1420 }
1421 if (!e) {
1422 SvGROW(err, SvCUR(err)+sizeof(prefix)+msglen);
1423 sv_catpvn(err, prefix, sizeof(prefix)-1);
1424 sv_catpvn(err, message, msglen);
e476b1b5 1425 if (ckWARN(WARN_MISC)) {
504618e9 1426 const STRLEN start = SvCUR(err)-msglen-sizeof(prefix)+1;
b15aece3 1427 Perl_warner(aTHX_ packWARN(WARN_MISC), SvPVX_const(err)+start);
4e6ea2c3 1428 }
4633a7c4 1429 }
4633a7c4 1430 }
1aa99e6b 1431 else {
06bf62c7 1432 sv_setpvn(ERRSV, message, msglen);
1aa99e6b 1433 }
4633a7c4 1434 }
4e6ea2c3 1435
5a844595
GS
1436 while ((cxix = dopoptoeval(cxstack_ix)) < 0
1437 && PL_curstackinfo->si_prev)
1438 {
bac4b2ad 1439 dounwind(-1);
d3acc0f7 1440 POPSTACK;
bac4b2ad 1441 }
e336de0d 1442
a0d0e21e
LW
1443 if (cxix >= 0) {
1444 I32 optype;
35a4481c 1445 register PERL_CONTEXT *cx;
901017d6 1446 SV **newsp;
a0d0e21e
LW
1447
1448 if (cxix < cxstack_ix)
1449 dounwind(cxix);
1450
3280af22 1451 POPBLOCK(cx,PL_curpm);
6b35e009 1452 if (CxTYPE(cx) != CXt_EVAL) {
16869676 1453 if (!message)
349d4f2f 1454 message = SvPVx_const(ERRSV, msglen);
bf49b057
GS
1455 PerlIO_write(Perl_error_log, "panic: die ", 11);
1456 PerlIO_write(Perl_error_log, message, msglen);
a0d0e21e
LW
1457 my_exit(1);
1458 }
1459 POPEVAL(cx);
1460
1461 if (gimme == G_SCALAR)
3280af22
NIS
1462 *++newsp = &PL_sv_undef;
1463 PL_stack_sp = newsp;
a0d0e21e
LW
1464
1465 LEAVE;
748a9306 1466
7fb6a879
GS
1467 /* LEAVE could clobber PL_curcop (see save_re_context())
1468 * XXX it might be better to find a way to avoid messing with
1469 * PL_curcop in save_re_context() instead, but this is a more
1470 * minimal fix --GSAR */
1471 PL_curcop = cx->blk_oldcop;
1472
7a2e2cd6 1473 if (optype == OP_REQUIRE) {
44f8325f 1474 const char* const msg = SvPVx_nolen_const(ERRSV);
901017d6 1475 SV * const nsv = cx->blk_eval.old_namesv;
b15aece3 1476 (void)hv_store(GvHVn(PL_incgv), SvPVX_const(nsv), SvCUR(nsv),
27bcc0a7 1477 &PL_sv_undef, 0);
5a844595
GS
1478 DIE(aTHX_ "%sCompilation failed in require",
1479 *msg ? msg : "Unknown error\n");
7a2e2cd6 1480 }
f39bc417
DM
1481 assert(CxTYPE(cx) == CXt_EVAL);
1482 return cx->blk_eval.retop;
a0d0e21e
LW
1483 }
1484 }
9cc2fdd3 1485 if (!message)
349d4f2f 1486 message = SvPVx_const(ERRSV, msglen);
87582a92 1487
7ff03255 1488 write_to_stderr(message, msglen);
f86702cc 1489 my_failure_exit();
1490 /* NOTREACHED */
a0d0e21e
LW
1491 return 0;
1492}
1493
1494PP(pp_xor)
1495{
39644a26 1496 dSP; dPOPTOPssrl;
a0d0e21e
LW
1497 if (SvTRUE(left) != SvTRUE(right))
1498 RETSETYES;
1499 else
1500 RETSETNO;
1501}
1502
1503PP(pp_andassign)
1504{
39644a26 1505 dSP;
a0d0e21e
LW
1506 if (!SvTRUE(TOPs))
1507 RETURN;
1508 else
1509 RETURNOP(cLOGOP->op_other);
1510}
1511
1512PP(pp_orassign)
1513{
39644a26 1514 dSP;
a0d0e21e
LW
1515 if (SvTRUE(TOPs))
1516 RETURN;
1517 else
1518 RETURNOP(cLOGOP->op_other);
1519}
c963b151
BD
1520
1521PP(pp_dorassign)
1522{
1523 dSP;
1524 register SV* sv;
1525
1526 sv = TOPs;
1527 if (!sv || !SvANY(sv)) {
1528 RETURNOP(cLOGOP->op_other);
1529 }
1530
1531 switch (SvTYPE(sv)) {
1532 case SVt_PVAV:
1533 if (AvMAX(sv) >= 0 || SvGMAGICAL(sv) || (SvRMAGICAL(sv) && mg_find(sv, PERL_MAGIC_tied)))
1534 RETURN;
1535 break;
1536 case SVt_PVHV:
1537 if (HvARRAY(sv) || SvGMAGICAL(sv) || (SvRMAGICAL(sv) && mg_find(sv, PERL_MAGIC_tied)))
1538 RETURN;
1539 break;
1540 case SVt_PVCV:
1541 if (CvROOT(sv) || CvXSUB(sv))
1542 RETURN;
1543 break;
1544 default:
5b295bef 1545 SvGETMAGIC(sv);
c963b151
BD
1546 if (SvOK(sv))
1547 RETURN;
1548 }
1549
1550 RETURNOP(cLOGOP->op_other);
1551}
1552
a0d0e21e
LW
1553PP(pp_caller)
1554{
39644a26 1555 dSP;
a0d0e21e 1556 register I32 cxix = dopoptosub(cxstack_ix);
901017d6
AL
1557 register const PERL_CONTEXT *cx;
1558 register const PERL_CONTEXT *ccstack = cxstack;
1559 const PERL_SI *top_si = PL_curstackinfo;
54310121 1560 I32 gimme;
06b5626a 1561 const char *stashname;
a0d0e21e
LW
1562 I32 count = 0;
1563
1564 if (MAXARG)
1565 count = POPi;
27d41816 1566
a0d0e21e 1567 for (;;) {
2c375eb9
GS
1568 /* we may be in a higher stacklevel, so dig down deeper */
1569 while (cxix < 0 && top_si->si_type != PERLSI_MAIN) {
1570 top_si = top_si->si_prev;
1571 ccstack = top_si->si_cxstack;
1572 cxix = dopoptosub_at(ccstack, top_si->si_cxix);
1573 }
a0d0e21e 1574 if (cxix < 0) {
27d41816
DM
1575 if (GIMME != G_ARRAY) {
1576 EXTEND(SP, 1);
a0d0e21e 1577 RETPUSHUNDEF;
27d41816 1578 }
a0d0e21e
LW
1579 RETURN;
1580 }
f2a7f298
DG
1581 /* caller() should not report the automatic calls to &DB::sub */
1582 if (PL_DBsub && GvCV(PL_DBsub) && cxix >= 0 &&
3280af22 1583 ccstack[cxix].blk_sub.cv == GvCV(PL_DBsub))
a0d0e21e
LW
1584 count++;
1585 if (!count--)
1586 break;
2c375eb9 1587 cxix = dopoptosub_at(ccstack, cxix - 1);
a0d0e21e 1588 }
2c375eb9
GS
1589
1590 cx = &ccstack[cxix];
7766f137 1591 if (CxTYPE(cx) == CXt_SUB || CxTYPE(cx) == CXt_FORMAT) {
f54cb97a 1592 const I32 dbcxix = dopoptosub_at(ccstack, cxix - 1);
2c375eb9 1593 /* We expect that ccstack[dbcxix] is CXt_SUB, anyway, the
06a5b730 1594 field below is defined for any cx. */
f2a7f298
DG
1595 /* caller() should not report the automatic calls to &DB::sub */
1596 if (PL_DBsub && GvCV(PL_DBsub) && dbcxix >= 0 && ccstack[dbcxix].blk_sub.cv == GvCV(PL_DBsub))
2c375eb9 1597 cx = &ccstack[dbcxix];
06a5b730 1598 }
1599
ed094faf 1600 stashname = CopSTASHPV(cx->blk_oldcop);
a0d0e21e 1601 if (GIMME != G_ARRAY) {
27d41816 1602 EXTEND(SP, 1);
ed094faf 1603 if (!stashname)
3280af22 1604 PUSHs(&PL_sv_undef);
49d8d3a1
MB
1605 else {
1606 dTARGET;
ed094faf 1607 sv_setpv(TARG, stashname);
49d8d3a1
MB
1608 PUSHs(TARG);
1609 }
a0d0e21e
LW
1610 RETURN;
1611 }
a0d0e21e 1612
27d41816
DM
1613 EXTEND(SP, 10);
1614
ed094faf 1615 if (!stashname)
3280af22 1616 PUSHs(&PL_sv_undef);
49d8d3a1 1617 else
ed094faf 1618 PUSHs(sv_2mortal(newSVpv(stashname, 0)));
248c2a4d 1619 PUSHs(sv_2mortal(newSVpv(OutCopFILE(cx->blk_oldcop), 0)));
57843af0 1620 PUSHs(sv_2mortal(newSViv((I32)CopLINE(cx->blk_oldcop))));
a0d0e21e
LW
1621 if (!MAXARG)
1622 RETURN;
7766f137 1623 if (CxTYPE(cx) == CXt_SUB || CxTYPE(cx) == CXt_FORMAT) {
07b8c804 1624 GV *cvgv = CvGV(ccstack[cxix].blk_sub.cv);
7766f137 1625 /* So is ccstack[dbcxix]. */
07b8c804 1626 if (isGV(cvgv)) {
f54cb97a 1627 SV * const sv = NEWSV(49, 0);
07b8c804
RGS
1628 gv_efullname3(sv, cvgv, Nullch);
1629 PUSHs(sv_2mortal(sv));
1630 PUSHs(sv_2mortal(newSViv((I32)cx->blk_sub.hasargs)));
1631 }
1632 else {
1633 PUSHs(sv_2mortal(newSVpvn("(unknown)",9)));
72699b0f 1634 PUSHs(sv_2mortal(newSViv((I32)cx->blk_sub.hasargs)));
07b8c804 1635 }
a0d0e21e
LW
1636 }
1637 else {
79cb57f6 1638 PUSHs(sv_2mortal(newSVpvn("(eval)",6)));
a0d0e21e
LW
1639 PUSHs(sv_2mortal(newSViv(0)));
1640 }
54310121 1641 gimme = (I32)cx->blk_gimme;
1642 if (gimme == G_VOID)
3280af22 1643 PUSHs(&PL_sv_undef);
54310121 1644 else
1645 PUSHs(sv_2mortal(newSViv(gimme & G_ARRAY)));
6b35e009 1646 if (CxTYPE(cx) == CXt_EVAL) {
811a4de9 1647 /* eval STRING */
06a5b730 1648 if (cx->blk_eval.old_op_type == OP_ENTEREVAL) {
4633a7c4 1649 PUSHs(cx->blk_eval.cur_text);
3280af22 1650 PUSHs(&PL_sv_no);
0f79a09d 1651 }
811a4de9 1652 /* require */
0f79a09d
GS
1653 else if (cx->blk_eval.old_namesv) {
1654 PUSHs(sv_2mortal(newSVsv(cx->blk_eval.old_namesv)));
3280af22 1655 PUSHs(&PL_sv_yes);
06a5b730 1656 }
811a4de9
GS
1657 /* eval BLOCK (try blocks have old_namesv == 0) */
1658 else {
1659 PUSHs(&PL_sv_undef);
1660 PUSHs(&PL_sv_undef);
1661 }
4633a7c4 1662 }
a682de96
GS
1663 else {
1664 PUSHs(&PL_sv_undef);
1665 PUSHs(&PL_sv_undef);
1666 }
1667 if (CxTYPE(cx) == CXt_SUB && cx->blk_sub.hasargs
ed094faf 1668 && CopSTASH_eq(PL_curcop, PL_debstash))
4633a7c4 1669 {
66a1b24b
AL
1670 AV * const ary = cx->blk_sub.argarray;
1671 const int off = AvARRAY(ary) - AvALLOC(ary);
a0d0e21e 1672
3280af22 1673 if (!PL_dbargs) {
a0d0e21e 1674 GV* tmpgv;
3280af22 1675 PL_dbargs = GvAV(gv_AVadd(tmpgv = gv_fetchpv("DB::args", TRUE,
a0d0e21e 1676 SVt_PVAV)));
a5f75d66 1677 GvMULTI_on(tmpgv);
3ddcf04c 1678 AvREAL_off(PL_dbargs); /* XXX should be REIFY (see av.h) */
a0d0e21e
LW
1679 }
1680
3280af22
NIS
1681 if (AvMAX(PL_dbargs) < AvFILLp(ary) + off)
1682 av_extend(PL_dbargs, AvFILLp(ary) + off);
1683 Copy(AvALLOC(ary), AvARRAY(PL_dbargs), AvFILLp(ary) + 1 + off, SV*);
1684 AvFILLp(PL_dbargs) = AvFILLp(ary) + off;
a0d0e21e 1685 }
f3aa04c2
GS
1686 /* XXX only hints propagated via op_private are currently
1687 * visible (others are not easily accessible, since they
1688 * use the global PL_hints) */
1689 PUSHs(sv_2mortal(newSViv((I32)cx->blk_oldcop->op_private &
1690 HINT_PRIVATE_MASK)));
e476b1b5
GS
1691 {
1692 SV * mask ;
1693 SV * old_warnings = cx->blk_oldcop->cop_warnings ;
114bafba 1694
ac27b0f5 1695 if (old_warnings == pWARN_NONE ||
114bafba 1696 (old_warnings == pWARN_STD && (PL_dowarn & G_WARN_ON) == 0))
e476b1b5 1697 mask = newSVpvn(WARN_NONEstring, WARNsize) ;
ac27b0f5 1698 else if (old_warnings == pWARN_ALL ||
75b6c4ca
RGS
1699 (old_warnings == pWARN_STD && PL_dowarn & G_WARN_ON)) {
1700 /* Get the bit mask for $warnings::Bits{all}, because
1701 * it could have been extended by warnings::register */
1702 SV **bits_all;
1703 HV *bits = get_hv("warnings::Bits", FALSE);
1704 if (bits && (bits_all=hv_fetch(bits, "all", 3, FALSE))) {
1705 mask = newSVsv(*bits_all);
1706 }
1707 else {
1708 mask = newSVpvn(WARN_ALLstring, WARNsize) ;
1709 }
1710 }
e476b1b5
GS
1711 else
1712 mask = newSVsv(old_warnings);
1713 PUSHs(sv_2mortal(mask));
1714 }
a0d0e21e
LW
1715 RETURN;
1716}
1717
a0d0e21e
LW
1718PP(pp_reset)
1719{
39644a26 1720 dSP;
bfed75c6 1721 const char *tmps;
a0d0e21e
LW
1722
1723 if (MAXARG < 1)
1724 tmps = "";
1725 else
e62f0680 1726 tmps = POPpconstx;
11faa288 1727 sv_reset(tmps, CopSTASH(PL_curcop));
3280af22 1728 PUSHs(&PL_sv_yes);
a0d0e21e
LW
1729 RETURN;
1730}
1731
1732PP(pp_lineseq)
1733{
1734 return NORMAL;
1735}
1736
dd2155a4
DM
1737/* like pp_nextstate, but used instead when the debugger is active */
1738
a0d0e21e
LW
1739PP(pp_dbstate)
1740{
27da23d5 1741 dVAR;
533c011a 1742 PL_curcop = (COP*)PL_op;
a0d0e21e 1743 TAINT_NOT; /* Each statement is presumed innocent */
3280af22 1744 PL_stack_sp = PL_stack_base + cxstack[cxstack_ix].blk_oldsp;
a0d0e21e
LW
1745 FREETMPS;
1746
5df8de69
DM
1747 if (PL_op->op_flags & OPf_SPECIAL /* breakpoint */
1748 || SvIV(PL_DBsingle) || SvIV(PL_DBsignal) || SvIV(PL_DBtrace))
a0d0e21e 1749 {
39644a26 1750 dSP;
a0d0e21e 1751 register CV *cv;
c09156bb 1752 register PERL_CONTEXT *cx;
f54cb97a 1753 const I32 gimme = G_ARRAY;
eb160463 1754 U8 hasargs;
a0d0e21e
LW
1755 GV *gv;
1756
3280af22 1757 gv = PL_DBgv;
a0d0e21e 1758 cv = GvCV(gv);
a0d0e21e 1759 if (!cv)
cea2e8a9 1760 DIE(aTHX_ "No DB::DB routine defined");
a0d0e21e 1761
aea4f609
DM
1762 if (CvDEPTH(cv) >= 1 && !(PL_debug & DEBUG_DB_RECURSE_FLAG))
1763 /* don't do recursive DB::DB call */
a0d0e21e 1764 return NORMAL;
748a9306 1765
4633a7c4
LW
1766 ENTER;
1767 SAVETMPS;
1768
3280af22 1769 SAVEI32(PL_debug);
55497cff 1770 SAVESTACK_POS();
3280af22 1771 PL_debug = 0;
748a9306 1772 hasargs = 0;
924508f0 1773 SPAGAIN;
748a9306 1774
c127bd3a
SF
1775 if (CvXSUB(cv)) {
1776 CvDEPTH(cv)++;
1777 PUSHMARK(SP);
1778 (void)(*CvXSUB(cv))(aTHX_ cv);
1779 CvDEPTH(cv)--;
1780 FREETMPS;
1781 LEAVE;
1782 return NORMAL;
1783 }
1784 else {
1785 PUSHBLOCK(cx, CXt_SUB, SP);
1786 PUSHSUB_DB(cx);
1787 cx->blk_sub.retop = PL_op->op_next;
1788 CvDEPTH(cv)++;
1789 SAVECOMPPAD();
1790 PAD_SET_CUR_NOSAVE(CvPADLIST(cv), 1);
1791 RETURNOP(CvSTART(cv));
1792 }
a0d0e21e
LW
1793 }
1794 else
1795 return NORMAL;
1796}
1797
1798PP(pp_scope)
1799{
1800 return NORMAL;
1801}
1802
1803PP(pp_enteriter)
1804{
27da23d5 1805 dVAR; dSP; dMARK;
c09156bb 1806 register PERL_CONTEXT *cx;
f54cb97a 1807 const I32 gimme = GIMME_V;
a0d0e21e 1808 SV **svp;
7766f137
GS
1809 U32 cxtype = CXt_LOOP;
1810#ifdef USE_ITHREADS
1811 void *iterdata;
1812#endif
a0d0e21e 1813
4633a7c4
LW
1814 ENTER;
1815 SAVETMPS;
1816
533c011a 1817 if (PL_op->op_targ) {
14f338dc
DM
1818 if (PL_op->op_private & OPpLVAL_INTRO) { /* for my $x (...) */
1819 SvPADSTALE_off(PAD_SVl(PL_op->op_targ));
1820 SAVESETSVFLAGS(PAD_SVl(PL_op->op_targ),
1821 SVs_PADSTALE, SVs_PADSTALE);
1822 }
c3564e5c 1823#ifndef USE_ITHREADS
dd2155a4 1824 svp = &PAD_SVl(PL_op->op_targ); /* "my" variable */
54b9620d 1825 SAVESPTR(*svp);
c3564e5c
GS
1826#else
1827 SAVEPADSV(PL_op->op_targ);
cbfa9890 1828 iterdata = INT2PTR(void*, PL_op->op_targ);
7766f137
GS
1829 cxtype |= CXp_PADVAR;
1830#endif
54b9620d
MB
1831 }
1832 else {
7766f137
GS
1833 GV *gv = (GV*)POPs;
1834 svp = &GvSV(gv); /* symbol table variable */
0214ae40
GS
1835 SAVEGENERICSV(*svp);
1836 *svp = NEWSV(0,0);
7766f137
GS
1837#ifdef USE_ITHREADS
1838 iterdata = (void*)gv;
1839#endif
54b9620d 1840 }
4633a7c4 1841
a0d0e21e
LW
1842 ENTER;
1843
7766f137
GS
1844 PUSHBLOCK(cx, cxtype, SP);
1845#ifdef USE_ITHREADS
1846 PUSHLOOP(cx, iterdata, MARK);
1847#else
a0d0e21e 1848 PUSHLOOP(cx, svp, MARK);
7766f137 1849#endif
533c011a 1850 if (PL_op->op_flags & OPf_STACKED) {
44a8e56a 1851 cx->blk_loop.iterary = (AV*)SvREFCNT_inc(POPs);
89ea2908
GA
1852 if (SvTYPE(cx->blk_loop.iterary) != SVt_PVAV) {
1853 dPOPss;
4fe3f0fa 1854 SV *right = (SV*)cx->blk_loop.iterary;
984a4bea
RD
1855 SvGETMAGIC(sv);
1856 SvGETMAGIC(right);
4fe3f0fa
MHM
1857 if (RANGE_IS_NUMERIC(sv,right)) {
1858 if ((SvOK(sv) && SvNV(sv) < IV_MIN) ||
1859 (SvOK(right) && SvNV(right) >= IV_MAX))
076d9a11
MHM
1860 DIE(aTHX_ "Range iterator outside integer range");
1861 cx->blk_loop.iterix = SvIV(sv);
4fe3f0fa 1862 cx->blk_loop.itermax = SvIV(right);
d4665a05
DM
1863#ifdef DEBUGGING
1864 /* for correct -Dstv display */
1865 cx->blk_oldsp = sp - PL_stack_base;
1866#endif
89ea2908 1867 }
3f63a782 1868 else {
89ea2908 1869 cx->blk_loop.iterlval = newSVsv(sv);
13c5b33c 1870 (void) SvPV_force_nolen(cx->blk_loop.iterlval);
10516c54 1871 (void) SvPV_nolen_const(right);
3f63a782 1872 }
89ea2908 1873 }
ef3e5ea9 1874 else if (PL_op->op_private & OPpITER_REVERSED) {
e682d7b7 1875 cx->blk_loop.itermax = -1;
ef3e5ea9
NC
1876 cx->blk_loop.iterix = AvFILL(cx->blk_loop.iterary);
1877
1878 }
89ea2908 1879 }
4633a7c4 1880 else {
3280af22
NIS
1881 cx->blk_loop.iterary = PL_curstack;
1882 AvFILLp(PL_curstack) = SP - PL_stack_base;
ef3e5ea9
NC
1883 if (PL_op->op_private & OPpITER_REVERSED) {
1884 cx->blk_loop.itermax = MARK - PL_stack_base;
1885 cx->blk_loop.iterix = cx->blk_oldsp;
1886 }
1887 else {
1888 cx->blk_loop.iterix = MARK - PL_stack_base;
1889 }
4633a7c4 1890 }
a0d0e21e
LW
1891
1892 RETURN;
1893}
1894
1895PP(pp_enterloop)
1896{
27da23d5 1897 dVAR; dSP;
c09156bb 1898 register PERL_CONTEXT *cx;
f54cb97a 1899 const I32 gimme = GIMME_V;
a0d0e21e
LW
1900
1901 ENTER;
1902 SAVETMPS;
1903 ENTER;
1904
1905 PUSHBLOCK(cx, CXt_LOOP, SP);
1906 PUSHLOOP(cx, 0, SP);
1907
1908 RETURN;
1909}
1910
1911PP(pp_leaveloop)
1912{
27da23d5 1913 dVAR; dSP;
c09156bb 1914 register PERL_CONTEXT *cx;
a0d0e21e
LW
1915 I32 gimme;
1916 SV **newsp;
1917 PMOP *newpm;
1918 SV **mark;
1919
1920 POPBLOCK(cx,newpm);
3a1b2b9e 1921 assert(CxTYPE(cx) == CXt_LOOP);
4fdae800 1922 mark = newsp;
a8bba7fa 1923 newsp = PL_stack_base + cx->blk_loop.resetsp;
f86702cc 1924
a1f49e72 1925 TAINT_NOT;
54310121 1926 if (gimme == G_VOID)
1927 ; /* do nothing */
1928 else if (gimme == G_SCALAR) {
1929 if (mark < SP)
1930 *++newsp = sv_mortalcopy(*SP);
1931 else
3280af22 1932 *++newsp = &PL_sv_undef;
a0d0e21e
LW
1933 }
1934 else {
a1f49e72 1935 while (mark < SP) {
a0d0e21e 1936 *++newsp = sv_mortalcopy(*++mark);
a1f49e72
CS
1937 TAINT_NOT; /* Each item is independent */
1938 }
a0d0e21e 1939 }
f86702cc 1940 SP = newsp;
1941 PUTBACK;
1942
a8bba7fa 1943 POPLOOP(cx); /* Stack values are safe: release loop vars ... */
3280af22 1944 PL_curpm = newpm; /* ... and pop $1 et al */
f86702cc 1945
a0d0e21e
LW
1946 LEAVE;
1947 LEAVE;
1948
f86702cc 1949 return NORMAL;
a0d0e21e
LW
1950}
1951
1952PP(pp_return)
1953{
27da23d5 1954 dVAR; dSP; dMARK;
a0d0e21e 1955 I32 cxix;
c09156bb 1956 register PERL_CONTEXT *cx;
f86702cc 1957 bool popsub2 = FALSE;
b45de488 1958 bool clear_errsv = FALSE;
a0d0e21e
LW
1959 I32 gimme;
1960 SV **newsp;
1961 PMOP *newpm;
1962 I32 optype = 0;
b0d9ce38 1963 SV *sv;
f39bc417 1964 OP *retop;
a0d0e21e 1965
3280af22 1966 if (PL_curstackinfo->si_type == PERLSI_SORT) {
7766f137
GS
1967 if (cxstack_ix == PL_sortcxix
1968 || dopoptosub(cxstack_ix) <= PL_sortcxix)
1969 {
3280af22
NIS
1970 if (cxstack_ix > PL_sortcxix)
1971 dounwind(PL_sortcxix);
1972 AvARRAY(PL_curstack)[1] = *SP;
1973 PL_stack_sp = PL_stack_base + 1;
a0d0e21e
LW
1974 return 0;
1975 }
1976 }
1977
1978 cxix = dopoptosub(cxstack_ix);
1979 if (cxix < 0)
cea2e8a9 1980 DIE(aTHX_ "Can't return outside a subroutine");
a0d0e21e
LW
1981 if (cxix < cxstack_ix)
1982 dounwind(cxix);
1983
1984 POPBLOCK(cx,newpm);
6b35e009 1985 switch (CxTYPE(cx)) {
a0d0e21e 1986 case CXt_SUB:
f86702cc 1987 popsub2 = TRUE;
f39bc417 1988 retop = cx->blk_sub.retop;
5dd42e15 1989 cxstack_ix++; /* preserve cx entry on stack for use by POPSUB */
a0d0e21e
LW
1990 break;
1991 case CXt_EVAL:
b45de488
GS
1992 if (!(PL_in_eval & EVAL_KEEPERR))
1993 clear_errsv = TRUE;
a0d0e21e 1994 POPEVAL(cx);
f39bc417 1995 retop = cx->blk_eval.retop;
1d76a5c3
GS
1996 if (CxTRYBLOCK(cx))
1997 break;
067f92a0 1998 lex_end();
748a9306
LW
1999 if (optype == OP_REQUIRE &&
2000 (MARK == SP || (gimme == G_SCALAR && !SvTRUE(*SP))) )
2001 {
54310121 2002 /* Unassume the success we assumed earlier. */
901017d6 2003 SV * const nsv = cx->blk_eval.old_namesv;
b15aece3 2004 (void)hv_delete(GvHVn(PL_incgv), SvPVX_const(nsv), SvCUR(nsv), G_DISCARD);
35c1215d 2005 DIE(aTHX_ "%"SVf" did not return a true value", nsv);
748a9306 2006 }
a0d0e21e 2007 break;
7766f137
GS
2008 case CXt_FORMAT:
2009 POPFORMAT(cx);
f39bc417 2010 retop = cx->blk_sub.retop;
7766f137 2011 break;
a0d0e21e 2012 default:
cea2e8a9 2013 DIE(aTHX_ "panic: return");
a0d0e21e
LW
2014 }
2015
a1f49e72 2016 TAINT_NOT;
a0d0e21e 2017 if (gimme == G_SCALAR) {
a29cdaf0
IZ
2018 if (MARK < SP) {
2019 if (popsub2) {
a8bba7fa 2020 if (cx->blk_sub.cv && CvDEPTH(cx->blk_sub.cv) > 1) {
a29cdaf0
IZ
2021 if (SvTEMP(TOPs)) {
2022 *++newsp = SvREFCNT_inc(*SP);
2023 FREETMPS;
2024 sv_2mortal(*newsp);
959e3673
GS
2025 }
2026 else {
2027 sv = SvREFCNT_inc(*SP); /* FREETMPS could clobber it */
a29cdaf0 2028 FREETMPS;
959e3673
GS
2029 *++newsp = sv_mortalcopy(sv);
2030 SvREFCNT_dec(sv);
a29cdaf0 2031 }
959e3673
GS
2032 }
2033 else
a29cdaf0 2034 *++newsp = (SvTEMP(*SP)) ? *SP : sv_mortalcopy(*SP);
959e3673
GS
2035 }
2036 else
a29cdaf0 2037 *++newsp = sv_mortalcopy(*SP);
959e3673
GS
2038 }
2039 else
3280af22 2040 *++newsp = &PL_sv_undef;
a0d0e21e 2041 }
54310121 2042 else if (gimme == G_ARRAY) {
a1f49e72 2043 while (++MARK <= SP) {
f86702cc 2044 *++newsp = (popsub2 && SvTEMP(*MARK))
2045 ? *MARK : sv_mortalcopy(*MARK);
a1f49e72
CS
2046 TAINT_NOT; /* Each item is independent */
2047 }
a0d0e21e 2048 }
3280af22 2049 PL_stack_sp = newsp;
a0d0e21e 2050
5dd42e15 2051 LEAVE;
f86702cc 2052 /* Stack values are safe: */
2053 if (popsub2) {
5dd42e15 2054 cxstack_ix--;
b0d9ce38 2055 POPSUB(cx,sv); /* release CV and @_ ... */
f86702cc 2056 }
b0d9ce38
GS
2057 else
2058 sv = Nullsv;
3280af22 2059 PL_curpm = newpm; /* ... and pop $1 et al */
f86702cc 2060
b0d9ce38 2061 LEAVESUB(sv);
b45de488 2062 if (clear_errsv)
c69006e4 2063 sv_setpvn(ERRSV,"",0);
f39bc417 2064 return retop;
a0d0e21e
LW
2065}
2066
2067PP(pp_last)
2068{
27da23d5 2069 dVAR; dSP;
a0d0e21e 2070 I32 cxix;
c09156bb 2071 register PERL_CONTEXT *cx;
f86702cc 2072 I32 pop2 = 0;
a0d0e21e 2073 I32 gimme;
8772537c 2074 I32 optype;
a0d0e21e
LW
2075 OP *nextop;
2076 SV **newsp;
2077 PMOP *newpm;
a8bba7fa 2078 SV **mark;
b0d9ce38 2079 SV *sv = Nullsv;
9d4ba2ae 2080
a0d0e21e 2081
533c011a 2082 if (PL_op->op_flags & OPf_SPECIAL) {
a0d0e21e
LW
2083 cxix = dopoptoloop(cxstack_ix);
2084 if (cxix < 0)
a651a37d 2085 DIE(aTHX_ "Can't \"last\" outside a loop block");
a0d0e21e
LW
2086 }
2087 else {
2088 cxix = dopoptolabel(cPVOP->op_pv);
2089 if (cxix < 0)
cea2e8a9 2090 DIE(aTHX_ "Label not found for \"last %s\"", cPVOP->op_pv);
a0d0e21e
LW
2091 }
2092 if (cxix < cxstack_ix)
2093 dounwind(cxix);
2094
2095 POPBLOCK(cx,newpm);
5dd42e15 2096 cxstack_ix++; /* temporarily protect top context */
a8bba7fa 2097 mark = newsp;
6b35e009 2098 switch (CxTYPE(cx)) {
a0d0e21e 2099 case CXt_LOOP:
f86702cc 2100 pop2 = CXt_LOOP;
a8bba7fa
GS
2101 newsp = PL_stack_base + cx->blk_loop.resetsp;
2102 nextop = cx->blk_loop.last_op->op_next;
a0d0e21e 2103 break;
f86702cc 2104 case CXt_SUB:
f86702cc 2105 pop2 = CXt_SUB;
f39bc417 2106 nextop = cx->blk_sub.retop;
a0d0e21e 2107 break;
f86702cc 2108 case CXt_EVAL:
2109 POPEVAL(cx);
f39bc417 2110 nextop = cx->blk_eval.retop;
a0d0e21e 2111 break;
7766f137
GS
2112 case CXt_FORMAT:
2113 POPFORMAT(cx);
f39bc417 2114 nextop = cx->blk_sub.retop;
7766f137 2115 break;
a0d0e21e 2116 default:
cea2e8a9 2117 DIE(aTHX_ "panic: last");
a0d0e21e
LW
2118 }
2119
a1f49e72 2120 TAINT_NOT;
a0d0e21e 2121 if (gimme == G_SCALAR) {
f86702cc 2122 if (MARK < SP)
2123 *++newsp = ((pop2 == CXt_SUB) && SvTEMP(*SP))
2124 ? *SP : sv_mortalcopy(*SP);
a0d0e21e 2125 else
3280af22 2126 *++newsp = &PL_sv_undef;
a0d0e21e 2127 }
54310121 2128 else if (gimme == G_ARRAY) {
a1f49e72 2129 while (++MARK <= SP) {
f86702cc 2130 *++newsp = ((pop2 == CXt_SUB) && SvTEMP(*MARK))
2131 ? *MARK : sv_mortalcopy(*MARK);
a1f49e72
CS
2132 TAINT_NOT; /* Each item is independent */
2133 }
f86702cc 2134 }
2135 SP = newsp;
2136 PUTBACK;
2137
5dd42e15
DM
2138 LEAVE;
2139 cxstack_ix--;
f86702cc 2140 /* Stack values are safe: */
2141 switch (pop2) {
2142 case CXt_LOOP:
a8bba7fa 2143 POPLOOP(cx); /* release loop vars ... */
4fdae800 2144 LEAVE;
f86702cc 2145 break;
2146 case CXt_SUB:
b0d9ce38 2147 POPSUB(cx,sv); /* release CV and @_ ... */
f86702cc 2148 break;
a0d0e21e 2149 }
3280af22 2150 PL_curpm = newpm; /* ... and pop $1 et al */
a0d0e21e 2151
b0d9ce38 2152 LEAVESUB(sv);
9d4ba2ae
AL
2153 PERL_UNUSED_VAR(optype);
2154 PERL_UNUSED_VAR(gimme);
f86702cc 2155 return nextop;
a0d0e21e
LW
2156}
2157
2158PP(pp_next)
2159{
27da23d5 2160 dVAR;
a0d0e21e 2161 I32 cxix;
c09156bb 2162 register PERL_CONTEXT *cx;
85538317 2163 I32 inner;
a0d0e21e 2164
533c011a 2165 if (PL_op->op_flags & OPf_SPECIAL) {
a0d0e21e
LW
2166 cxix = dopoptoloop(cxstack_ix);
2167 if (cxix < 0)
a651a37d 2168 DIE(aTHX_ "Can't \"next\" outside a loop block");
a0d0e21e
LW
2169 }
2170 else {
2171 cxix = dopoptolabel(cPVOP->op_pv);
2172 if (cxix < 0)
cea2e8a9 2173 DIE(aTHX_ "Label not found for \"next %s\"", cPVOP->op_pv);
a0d0e21e
LW
2174 }
2175 if (cxix < cxstack_ix)
2176 dounwind(cxix);
2177
85538317
GS
2178 /* clear off anything above the scope we're re-entering, but
2179 * save the rest until after a possible continue block */
2180 inner = PL_scopestack_ix;
1ba6ee2b 2181 TOPBLOCK(cx);
85538317
GS
2182 if (PL_scopestack_ix < inner)
2183 leave_scope(PL_scopestack[PL_scopestack_ix]);
3a1b2b9e 2184 PL_curcop = cx->blk_oldcop;
1ba6ee2b 2185 return cx->blk_loop.next_op;
a0d0e21e
LW
2186}
2187
2188PP(pp_redo)
2189{
27da23d5 2190 dVAR;
a0d0e21e 2191 I32 cxix;
c09156bb 2192 register PERL_CONTEXT *cx;
a0d0e21e 2193 I32 oldsave;
a034e688 2194 OP* redo_op;
a0d0e21e 2195
533c011a 2196 if (PL_op->op_flags & OPf_SPECIAL) {
a0d0e21e
LW
2197 cxix = dopoptoloop(cxstack_ix);
2198 if (cxix < 0)
a651a37d 2199 DIE(aTHX_ "Can't \"redo\" outside a loop block");
a0d0e21e
LW
2200 }
2201 else {
2202 cxix = dopoptolabel(cPVOP->op_pv);
2203 if (cxix < 0)
cea2e8a9 2204 DIE(aTHX_ "Label not found for \"redo %s\"", cPVOP->op_pv);
a0d0e21e
LW
2205 }
2206 if (cxix < cxstack_ix)
2207 dounwind(cxix);
2208
a034e688
DM
2209 redo_op = cxstack[cxix].blk_loop.redo_op;
2210 if (redo_op->op_type == OP_ENTER) {
2211 /* pop one less context to avoid $x being freed in while (my $x..) */
2212 cxstack_ix++;
2213 assert(CxTYPE(&cxstack[cxstack_ix]) == CXt_BLOCK);
2214 redo_op = redo_op->op_next;
2215 }
2216
a0d0e21e 2217 TOPBLOCK(cx);
3280af22 2218 oldsave = PL_scopestack[PL_scopestack_ix - 1];
a0d0e21e 2219 LEAVE_SCOPE(oldsave);
936c78b5 2220 FREETMPS;
3a1b2b9e 2221 PL_curcop = cx->blk_oldcop;
a034e688 2222 return redo_op;
a0d0e21e
LW
2223}
2224
0824fdcb 2225STATIC OP *
bfed75c6 2226S_dofindlabel(pTHX_ OP *o, const char *label, OP **opstack, OP **oplimit)
a0d0e21e 2227{
a0d0e21e 2228 OP **ops = opstack;
bfed75c6 2229 static const char too_deep[] = "Target of goto is too deeply nested";
a0d0e21e 2230
fc36a67e 2231 if (ops >= oplimit)
cea2e8a9 2232 Perl_croak(aTHX_ too_deep);
11343788
MB
2233 if (o->op_type == OP_LEAVE ||
2234 o->op_type == OP_SCOPE ||
2235 o->op_type == OP_LEAVELOOP ||
33d34e4c 2236 o->op_type == OP_LEAVESUB ||
11343788 2237 o->op_type == OP_LEAVETRY)
fc36a67e 2238 {
5dc0d613 2239 *ops++ = cUNOPo->op_first;
fc36a67e 2240 if (ops >= oplimit)
cea2e8a9 2241 Perl_croak(aTHX_ too_deep);
fc36a67e 2242 }
c4aa4e48 2243 *ops = 0;
11343788 2244 if (o->op_flags & OPf_KIDS) {
aec46f14 2245 OP *kid;
a0d0e21e 2246 /* First try all the kids at this level, since that's likeliest. */
11343788 2247 for (kid = cUNOPo->op_first; kid; kid = kid->op_sibling) {
c4aa4e48
GS
2248 if ((kid->op_type == OP_NEXTSTATE || kid->op_type == OP_DBSTATE) &&
2249 kCOP->cop_label && strEQ(kCOP->cop_label, label))
a0d0e21e
LW
2250 return kid;
2251 }
11343788 2252 for (kid = cUNOPo->op_first; kid; kid = kid->op_sibling) {
3280af22 2253 if (kid == PL_lastgotoprobe)
a0d0e21e 2254 continue;
ed8d0fe2
SM
2255 if (kid->op_type == OP_NEXTSTATE || kid->op_type == OP_DBSTATE) {
2256 if (ops == opstack)
2257 *ops++ = kid;
2258 else if (ops[-1]->op_type == OP_NEXTSTATE ||
2259 ops[-1]->op_type == OP_DBSTATE)
2260 ops[-1] = kid;
2261 else
2262 *ops++ = kid;
2263 }
155aba94 2264 if ((o = dofindlabel(kid, label, ops, oplimit)))
11343788 2265 return o;
a0d0e21e
LW
2266 }
2267 }
c4aa4e48 2268 *ops = 0;
a0d0e21e
LW
2269 return 0;
2270}
2271
2272PP(pp_dump)
2273{
cea2e8a9 2274 return pp_goto();
a0d0e21e
LW
2275 /*NOTREACHED*/
2276}
2277
2278PP(pp_goto)
2279{
27da23d5 2280 dVAR; dSP;
a0d0e21e
LW
2281 OP *retop = 0;
2282 I32 ix;
c09156bb 2283 register PERL_CONTEXT *cx;
fc36a67e 2284#define GOTO_DEPTH 64
2285 OP *enterops[GOTO_DEPTH];
bfed75c6
AL
2286 const char *label = 0;
2287 const bool do_dump = (PL_op->op_type == OP_DUMP);
2288 static const char must_have_label[] = "goto must have label";
a0d0e21e 2289
533c011a 2290 if (PL_op->op_flags & OPf_STACKED) {
9d4ba2ae 2291 SV * const sv = POPs;
a0d0e21e
LW
2292
2293 /* This egregious kludge implements goto &subroutine */
2294 if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVCV) {
2295 I32 cxix;
c09156bb 2296 register PERL_CONTEXT *cx;
a0d0e21e
LW
2297 CV* cv = (CV*)SvRV(sv);
2298 SV** mark;
2299 I32 items = 0;
2300 I32 oldsave;
b1464ded 2301 bool reified = 0;
a0d0e21e 2302
e8f7dd13 2303 retry:
4aa0a1f7 2304 if (!CvROOT(cv) && !CvXSUB(cv)) {
7fc63493 2305 const GV * const gv = CvGV(cv);
e8f7dd13 2306 if (gv) {
7fc63493 2307 GV *autogv;
e8f7dd13
GS
2308 SV *tmpstr;
2309 /* autoloaded stub? */
2310 if (cv != GvCV(gv) && (cv = GvCV(gv)))
2311 goto retry;
2312 autogv = gv_autoload4(GvSTASH(gv), GvNAME(gv),
2313 GvNAMELEN(gv), FALSE);
2314 if (autogv && (cv = GvCV(autogv)))
2315 goto retry;
2316 tmpstr = sv_newmortal();
2317 gv_efullname3(tmpstr, gv, Nullch);
35c1215d 2318 DIE(aTHX_ "Goto undefined subroutine &%"SVf"",tmpstr);
4aa0a1f7 2319 }
cea2e8a9 2320 DIE(aTHX_ "Goto undefined subroutine");
4aa0a1f7
AD
2321 }
2322
a0d0e21e 2323 /* First do some returnish stuff. */
7fc63493 2324 (void)SvREFCNT_inc(cv); /* avoid premature free during unwind */
71fc2216 2325 FREETMPS;
a0d0e21e
LW
2326 cxix = dopoptosub(cxstack_ix);
2327 if (cxix < 0)
cea2e8a9 2328 DIE(aTHX_ "Can't goto subroutine outside a subroutine");
a0d0e21e
LW
2329 if (cxix < cxstack_ix)
2330 dounwind(cxix);
2331 TOPBLOCK(cx);
2d43a17f 2332 SPAGAIN;
564abe23 2333 /* ban goto in eval: see <20050521150056.GC20213@iabyn.com> */
2d43a17f 2334 if (CxTYPE(cx) == CXt_EVAL) {
c74ace89
DM
2335 if (CxREALEVAL(cx))
2336 DIE(aTHX_ "Can't goto subroutine from an eval-string");
2337 else
2338 DIE(aTHX_ "Can't goto subroutine from an eval-block");
2d43a17f 2339 }
d8b46c1b
GS
2340 if (CxTYPE(cx) == CXt_SUB && cx->blk_sub.hasargs) {
2341 /* put @_ back onto stack */
a0d0e21e 2342 AV* av = cx->blk_sub.argarray;
bfed75c6 2343
93965878 2344 items = AvFILLp(av) + 1;
a45cdc79
DM
2345 EXTEND(SP, items+1); /* @_ could have been extended. */
2346 Copy(AvARRAY(av), SP + 1, items, SV*);
3280af22
NIS
2347 SvREFCNT_dec(GvAV(PL_defgv));
2348 GvAV(PL_defgv) = cx->blk_sub.savearray;
b1464ded 2349 CLEAR_ARGARRAY(av);
d8b46c1b 2350 /* abandon @_ if it got reified */
62b1ebc2 2351 if (AvREAL(av)) {
b1464ded
DM
2352 reified = 1;
2353 SvREFCNT_dec(av);
d8b46c1b
GS
2354 av = newAV();
2355 av_extend(av, items-1);
11ca45c0 2356 AvREIFY_only(av);
dd2155a4 2357 PAD_SVl(0) = (SV*)(cx->blk_sub.argarray = av);
62b1ebc2 2358 }
a0d0e21e 2359 }
1fa4e549 2360 else if (CvXSUB(cv)) { /* put GvAV(defgv) back onto stack */
890ce7af 2361 AV* const av = GvAV(PL_defgv);
1fa4e549 2362 items = AvFILLp(av) + 1;
a45cdc79
DM
2363 EXTEND(SP, items+1); /* @_ could have been extended. */
2364 Copy(AvARRAY(av), SP + 1, items, SV*);
1fa4e549 2365 }
a45cdc79
DM
2366 mark = SP;
2367 SP += items;
6b35e009 2368 if (CxTYPE(cx) == CXt_SUB &&
b150fb22 2369 !(CvDEPTH(cx->blk_sub.cv) = cx->blk_sub.olddepth))
a0d0e21e 2370 SvREFCNT_dec(cx->blk_sub.cv);
3280af22 2371 oldsave = PL_scopestack[PL_scopestack_ix - 1];
a0d0e21e
LW
2372 LEAVE_SCOPE(oldsave);
2373
2374 /* Now do some callish stuff. */
2375 SAVETMPS;
5023d17a 2376 SAVEFREESV(cv); /* later, undo the 'avoid premature free' hack */
a0d0e21e 2377 if (CvXSUB(cv)) {
5eff7df7 2378 OP* retop = cx->blk_sub.retop;
b1464ded
DM
2379 if (reified) {
2380 I32 index;
2381 for (index=0; index<items; index++)
2382 sv_2mortal(SP[-index]);
2383 }
67caa1fe 2384#ifdef PERL_XSUB_OLDSTYLE
a0d0e21e 2385 if (CvOLDSTYLE(cv)) {
20ce7b12 2386 I32 (*fp3)(int,int,int);
924508f0
GS
2387 while (SP > mark) {
2388 SP[1] = SP[0];
2389 SP--;
a0d0e21e 2390 }
7766f137 2391 fp3 = (I32(*)(int,int,int))CvXSUB(cv);
ecfc5424 2392 items = (*fp3)(CvXSUBANY(cv).any_i32,
3280af22 2393 mark - PL_stack_base + 1,
ecfc5424 2394 items);
3280af22 2395 SP = PL_stack_base + items;
a0d0e21e 2396 }
67caa1fe
GS
2397 else
2398#endif /* PERL_XSUB_OLDSTYLE */
2399 {
1fa4e549
AD
2400 SV **newsp;
2401 I32 gimme;
2402
5eff7df7
DM
2403 /* XS subs don't have a CxSUB, so pop it */
2404 POPBLOCK(cx, PL_curpm);
1fa4e549 2405 /* Push a mark for the start of arglist */
ac27b0f5 2406 PUSHMARK(mark);
a45cdc79 2407 PUTBACK;
acfe0abc 2408 (void)(*CvXSUB(cv))(aTHX_ cv);
1b6737cc
AL
2409 /* Put these at the bottom since the vars are set but not used */
2410 PERL_UNUSED_VAR(newsp);
2411 PERL_UNUSED_VAR(gimme);
a0d0e21e
LW
2412 }
2413 LEAVE;
5eff7df7 2414 return retop;
a0d0e21e
LW
2415 }
2416 else {
2417 AV* padlist = CvPADLIST(cv);
6b35e009 2418 if (CxTYPE(cx) == CXt_EVAL) {
3280af22
NIS
2419 PL_in_eval = cx->blk_eval.old_in_eval;
2420 PL_eval_root = cx->blk_eval.old_eval_root;
b150fb22
RH
2421 cx->cx_type = CXt_SUB;
2422 cx->blk_sub.hasargs = 0;
2423 }
a0d0e21e 2424 cx->blk_sub.cv = cv;
eb160463 2425 cx->blk_sub.olddepth = (U16)CvDEPTH(cv);
dd2155a4 2426
a0d0e21e
LW
2427 CvDEPTH(cv)++;
2428 if (CvDEPTH(cv) < 2)
2429 (void)SvREFCNT_inc(cv);
dd2155a4 2430 else {
599cee73 2431 if (CvDEPTH(cv) == 100 && ckWARN(WARN_RECURSION))
44a8e56a 2432 sub_crush_depth(cv);
26019298 2433 pad_push(padlist, CvDEPTH(cv));
a0d0e21e 2434 }
fd617465
DM
2435 SAVECOMPPAD();
2436 PAD_SET_CUR_NOSAVE(padlist, CvDEPTH(cv));
6d4ff0d2 2437 if (cx->blk_sub.hasargs)
6d4ff0d2 2438 {
dd2155a4 2439 AV* av = (AV*)PAD_SVl(0);
a0d0e21e
LW
2440 SV** ary;
2441
3280af22
NIS
2442 cx->blk_sub.savearray = GvAV(PL_defgv);
2443 GvAV(PL_defgv) = (AV*)SvREFCNT_inc(av);
dd2155a4 2444 CX_CURPAD_SAVE(cx->blk_sub);
6d4ff0d2 2445 cx->blk_sub.argarray = av;
a0d0e21e
LW
2446
2447 if (items >= AvMAX(av) + 1) {
2448 ary = AvALLOC(av);
2449 if (AvARRAY(av) != ary) {
2450 AvMAX(av) += AvARRAY(av) - AvALLOC(av);
f880fe2f 2451 SvPV_set(av, (char*)ary);
a0d0e21e
LW
2452 }
2453 if (items >= AvMAX(av) + 1) {
2454 AvMAX(av) = items - 1;
2455 Renew(ary,items+1,SV*);
2456 AvALLOC(av) = ary;
f880fe2f 2457 SvPV_set(av, (char*)ary);
a0d0e21e
LW
2458 }
2459 }
a45cdc79 2460 ++mark;
a0d0e21e 2461 Copy(mark,AvARRAY(av),items,SV*);
93965878 2462 AvFILLp(av) = items - 1;
d8b46c1b 2463 assert(!AvREAL(av));
b1464ded
DM
2464 if (reified) {
2465 /* transfer 'ownership' of refcnts to new @_ */
2466 AvREAL_on(av);
2467 AvREIFY_off(av);
2468 }
a0d0e21e
LW
2469 while (items--) {
2470 if (*mark)
2471 SvTEMP_off(*mark);
2472 mark++;
2473 }
2474 }
491527d0 2475 if (PERLDB_SUB) { /* Checking curstash breaks DProf. */
44a8e56a 2476 /*
2477 * We do not care about using sv to call CV;
2478 * it's for informational purposes only.
2479 */
890ce7af 2480 SV * const sv = GvSV(PL_DBsub);
491527d0 2481 CV *gotocv;
bfed75c6 2482
f398eb67 2483 save_item(sv);
491527d0 2484 if (PERLDB_SUB_NN) {
890ce7af 2485 const int type = SvTYPE(sv);
f398eb67
NC
2486 if (type < SVt_PVIV && type != SVt_IV)
2487 sv_upgrade(sv, SVt_PVIV);
7619c85e 2488 (void)SvIOK_on(sv);
45977657 2489 SvIV_set(sv, PTR2IV(cv)); /* Do it the quickest way */
491527d0 2490 } else {
491527d0
GS
2491 gv_efullname3(sv, CvGV(cv), Nullch);
2492 }
2493 if ( PERLDB_GOTO
864dbfa3 2494 && (gotocv = get_cv("DB::goto", FALSE)) ) {
3280af22 2495 PUSHMARK( PL_stack_sp );
864dbfa3 2496 call_sv((SV*)gotocv, G_SCALAR | G_NODEBUG);
3280af22 2497 PL_stack_sp--;
491527d0 2498 }
1ce6579f 2499 }
a0d0e21e
LW
2500 RETURNOP(CvSTART(cv));
2501 }
2502 }
1614b0e3 2503 else {
0510663f 2504 label = SvPV_nolen_const(sv);
1614b0e3 2505 if (!(do_dump || *label))
cea2e8a9 2506 DIE(aTHX_ must_have_label);
1614b0e3 2507 }
a0d0e21e 2508 }
533c011a 2509 else if (PL_op->op_flags & OPf_SPECIAL) {
a0d0e21e 2510 if (! do_dump)
cea2e8a9 2511 DIE(aTHX_ must_have_label);
a0d0e21e
LW
2512 }
2513 else
2514 label = cPVOP->op_pv;
2515
2516 if (label && *label) {
2517 OP *gotoprobe = 0;
3b2447bc 2518 bool leaving_eval = FALSE;
33d34e4c 2519 bool in_block = FALSE;
a4f3a277 2520 PERL_CONTEXT *last_eval_cx = 0;
a0d0e21e
LW
2521
2522 /* find label */
2523
3280af22 2524 PL_lastgotoprobe = 0;
a0d0e21e
LW
2525 *enterops = 0;
2526 for (ix = cxstack_ix; ix >= 0; ix--) {
2527 cx = &cxstack[ix];
6b35e009 2528 switch (CxTYPE(cx)) {
a0d0e21e 2529 case CXt_EVAL:
3b2447bc 2530 leaving_eval = TRUE;
971ecbe6 2531 if (!CxTRYBLOCK(cx)) {
a4f3a277
RH
2532 gotoprobe = (last_eval_cx ?
2533 last_eval_cx->blk_eval.old_eval_root :
2534 PL_eval_root);
2535 last_eval_cx = cx;
9c5794fe
RH
2536 break;
2537 }
2538 /* else fall through */
a0d0e21e
LW
2539 case CXt_LOOP:
2540 gotoprobe = cx->blk_oldcop->op_sibling;
2541 break;
2542 case CXt_SUBST:
2543 continue;
2544 case CXt_BLOCK:
33d34e4c 2545 if (ix) {
a0d0e21e 2546 gotoprobe = cx->blk_oldcop->op_sibling;
33d34e4c
AE
2547 in_block = TRUE;
2548 } else
3280af22 2549 gotoprobe = PL_main_root;
a0d0e21e 2550 break;
b3933176
CS
2551 case CXt_SUB:
2552 if (CvDEPTH(cx->blk_sub.cv)) {
2553 gotoprobe = CvROOT(cx->blk_sub.cv);
2554 break;
2555 }
2556 /* FALL THROUGH */
7766f137 2557 case CXt_FORMAT:
0a753a76 2558 case CXt_NULL:
a651a37d 2559 DIE(aTHX_ "Can't \"goto\" out of a pseudo block");
a0d0e21e
LW
2560 default:
2561 if (ix)
cea2e8a9 2562 DIE(aTHX_ "panic: goto");
3280af22 2563 gotoprobe = PL_main_root;
a0d0e21e
LW
2564 break;
2565 }
2b597662
GS
2566 if (gotoprobe) {
2567 retop = dofindlabel(gotoprobe, label,
2568 enterops, enterops + GOTO_DEPTH);
2569 if (retop)
2570 break;
2571 }
3280af22 2572 PL_lastgotoprobe = gotoprobe;
a0d0e21e
LW
2573 }
2574 if (!retop)
cea2e8a9 2575 DIE(aTHX_ "Can't find label %s", label);
a0d0e21e 2576
3b2447bc
RH
2577 /* if we're leaving an eval, check before we pop any frames
2578 that we're not going to punt, otherwise the error
2579 won't be caught */
2580
2581 if (leaving_eval && *enterops && enterops[1]) {
2582 I32 i;
2583 for (i = 1; enterops[i]; i++)
2584 if (enterops[i]->op_type == OP_ENTERITER)
2585 DIE(aTHX_ "Can't \"goto\" into the middle of a foreach loop");
2586 }
2587
a0d0e21e
LW
2588 /* pop unwanted frames */
2589
2590 if (ix < cxstack_ix) {
2591 I32 oldsave;
2592
2593 if (ix < 0)
2594 ix = 0;
2595 dounwind(ix);
2596 TOPBLOCK(cx);
3280af22 2597 oldsave = PL_scopestack[PL_scopestack_ix];
a0d0e21e
LW
2598 LEAVE_SCOPE(oldsave);
2599 }
2600
2601 /* push wanted frames */
2602
748a9306 2603 if (*enterops && enterops[1]) {
533c011a 2604 OP *oldop = PL_op;
33d34e4c
AE
2605 ix = enterops[1]->op_type == OP_ENTER && in_block ? 2 : 1;
2606 for (; enterops[ix]; ix++) {
533c011a 2607 PL_op = enterops[ix];
84902520
TB
2608 /* Eventually we may want to stack the needed arguments
2609 * for each op. For now, we punt on the hard ones. */
533c011a 2610 if (PL_op->op_type == OP_ENTERITER)
894356b3 2611 DIE(aTHX_ "Can't \"goto\" into the middle of a foreach loop");
fc0dc3b3 2612 CALL_FPTR(PL_op->op_ppaddr)(aTHX);
a0d0e21e 2613 }
533c011a 2614 PL_op = oldop;
a0d0e21e
LW
2615 }
2616 }
2617
2618 if (do_dump) {
a5f75d66 2619#ifdef VMS
6b88bc9c 2620 if (!retop) retop = PL_main_start;
a5f75d66 2621#endif
3280af22
NIS
2622 PL_restartop = retop;
2623 PL_do_undump = TRUE;
a0d0e21e
LW
2624
2625 my_unexec();
2626
3280af22
NIS
2627 PL_restartop = 0; /* hmm, must be GNU unexec().. */
2628 PL_do_undump = FALSE;
a0d0e21e
LW
2629 }
2630
2631 RETURNOP(retop);
2632}
2633
2634PP(pp_exit)
2635{
39644a26 2636 dSP;
a0d0e21e
LW
2637 I32 anum;
2638
2639 if (MAXARG < 1)
2640 anum = 0;
ff0cee69 2641 else {
a0d0e21e 2642 anum = SvIVx(POPs);
d98f61e7
GS
2643#ifdef VMS
2644 if (anum == 1 && (PL_op->op_private & OPpEXIT_VMSISH))
ff0cee69 2645 anum = 0;
96e176bf 2646 VMSISH_HUSHED = VMSISH_HUSHED || (PL_op->op_private & OPpHUSH_VMSISH);
ff0cee69 2647#endif
2648 }
cc3604b1 2649 PL_exit_flags |= PERL_EXIT_EXPECTED;
a0d0e21e 2650 my_exit(anum);
3280af22 2651 PUSHs(&PL_sv_undef);
a0d0e21e
LW
2652 RETURN;
2653}
2654
2655#ifdef NOTYET
2656PP(pp_nswitch)
2657{
39644a26 2658 dSP;
f54cb97a 2659 const NV value = SvNVx(GvSV(cCOP->cop_gv));
a0d0e21e
LW
2660 register I32 match = I_32(value);
2661
2662 if (value < 0.0) {
65202027 2663 if (((NV)match) > value)
a0d0e21e
LW
2664 --match; /* was fractional--truncate other way */
2665 }
2666 match -= cCOP->uop.scop.scop_offset;
2667 if (match < 0)
2668 match = 0;
2669 else if (match > cCOP->uop.scop.scop_max)
2670 match = cCOP->uop.scop.scop_max;
6b88bc9c
GS
2671 PL_op = cCOP->uop.scop.scop_next[match];
2672 RETURNOP(PL_op);
a0d0e21e
LW
2673}
2674
2675PP(pp_cswitch)
2676{
39644a26 2677 dSP;
a0d0e21e
LW
2678 register I32 match;
2679
6b88bc9c
GS
2680 if (PL_multiline)
2681 PL_op = PL_op->op_next; /* can't assume anything */
a0d0e21e 2682 else {
0510663f 2683 match = *(SvPVx_nolen_const(GvSV(cCOP->cop_gv))) & 255;
a0d0e21e
LW
2684 match -= cCOP->uop.scop.scop_offset;
2685 if (match < 0)
2686 match = 0;
2687 else if (match > cCOP->uop.scop.scop_max)
2688 match = cCOP->uop.scop.scop_max;
6b88bc9c 2689 PL_op = cCOP->uop.scop.scop_next[match];
a0d0e21e 2690 }
6b88bc9c 2691 RETURNOP(PL_op);
a0d0e21e
LW
2692}
2693#endif
2694
2695/* Eval. */
2696
0824fdcb 2697STATIC void
cea2e8a9 2698S_save_lines(pTHX_ AV *array, SV *sv)
a0d0e21e 2699{
504618e9 2700 const char *s = SvPVX_const(sv);
890ce7af 2701 const char * const send = SvPVX_const(sv) + SvCUR(sv);
504618e9 2702 I32 line = 1;
a0d0e21e
LW
2703
2704 while (s && s < send) {
f54cb97a 2705 const char *t;
890ce7af 2706 SV * const tmpstr = NEWSV(85,0);
a0d0e21e
LW
2707
2708 sv_upgrade(tmpstr, SVt_PVMG);
2709 t = strchr(s, '\n');
2710 if (t)
2711 t++;
2712 else
2713 t = send;
2714
2715 sv_setpvn(tmpstr, s, t - s);
2716 av_store(array, line++, tmpstr);
2717 s = t;
2718 }
2719}
2720
901017d6 2721STATIC void
14dd3ad8
GS
2722S_docatch_body(pTHX)
2723{
cea2e8a9 2724 CALLRUNOPS(aTHX);
901017d6 2725 return;
312caa8e
CS
2726}
2727
0824fdcb 2728STATIC OP *
cea2e8a9 2729S_docatch(pTHX_ OP *o)
1e422769 2730{
6224f72b 2731 int ret;
06b5626a 2732 OP * const oldop = PL_op;
db36c5a1 2733 dJMPENV;
1e422769 2734
1e422769 2735#ifdef DEBUGGING
54310121 2736 assert(CATCH_GET == TRUE);
1e422769 2737#endif
312caa8e 2738 PL_op = o;
8bffa5f8 2739
14dd3ad8 2740 JMPENV_PUSH(ret);
6224f72b 2741 switch (ret) {
312caa8e 2742 case 0:
abd70938
DM
2743 assert(cxstack_ix >= 0);
2744 assert(CxTYPE(&cxstack[cxstack_ix]) == CXt_EVAL);
2745 cxstack[cxstack_ix].blk_eval.cur_top_env = PL_top_env;
14dd3ad8
GS
2746 redo_body:
2747 docatch_body();
312caa8e
CS
2748 break;
2749 case 3:
8bffa5f8 2750 /* die caught by an inner eval - continue inner loop */
abd70938
DM
2751
2752 /* NB XXX we rely on the old popped CxEVAL still being at the top
2753 * of the stack; the way die_where() currently works, this
2754 * assumption is valid. In theory The cur_top_env value should be
2755 * returned in another global, the way retop (aka PL_restartop)
2756 * is. */
2757 assert(CxTYPE(&cxstack[cxstack_ix+1]) == CXt_EVAL);
2758
2759 if (PL_restartop
2760 && cxstack[cxstack_ix+1].blk_eval.cur_top_env == PL_top_env)
2761 {
312caa8e
CS
2762 PL_op = PL_restartop;
2763 PL_restartop = 0;
2764 goto redo_body;
2765 }
2766 /* FALL THROUGH */
2767 default:
14dd3ad8 2768 JMPENV_POP;
533c011a 2769 PL_op = oldop;
6224f72b 2770 JMPENV_JUMP(ret);
1e422769 2771 /* NOTREACHED */
1e422769 2772 }
14dd3ad8 2773 JMPENV_POP;
533c011a 2774 PL_op = oldop;
745cf2ff 2775 return Nullop;
1e422769 2776}
2777
c277df42 2778OP *
bfed75c6 2779Perl_sv_compile_2op(pTHX_ SV *sv, OP** startop, const char *code, PAD** padp)
c277df42
IZ
2780/* sv Text to convert to OP tree. */
2781/* startop op_free() this to undo. */
2782/* code Short string id of the caller. */
2783{
27da23d5 2784 dVAR; dSP; /* Make POPBLOCK work. */
c277df42
IZ
2785 PERL_CONTEXT *cx;
2786 SV **newsp;
b094c71d 2787 I32 gimme = G_VOID;
c277df42
IZ
2788 I32 optype;
2789 OP dummy;
155aba94 2790 OP *rop;
83ee9e09
GS
2791 char tbuf[TYPE_DIGITS(long) + 12 + 10];
2792 char *tmpbuf = tbuf;
c277df42 2793 char *safestr;
a3985cdc 2794 int runtime;
40b8d195 2795 CV* runcv = Nullcv; /* initialise to avoid compiler warnings */
c277df42
IZ
2796
2797 ENTER;
2798 lex_start(sv);
2799 SAVETMPS;
2800 /* switch to eval mode */
2801
923e4eb5 2802 if (IN_PERL_COMPILETIME) {
f4dd75d9 2803 SAVECOPSTASH_FREE(&PL_compiling);
11faa288 2804 CopSTASH_set(&PL_compiling, PL_curstash);
cbce877f 2805 }
83ee9e09 2806 if (PERLDB_NAMEEVAL && CopLINE(PL_curcop)) {
9d4ba2ae 2807 SV * const sv = sv_newmortal();
83ee9e09
GS
2808 Perl_sv_setpvf(aTHX_ sv, "_<(%.10seval %lu)[%s:%"IVdf"]",
2809 code, (unsigned long)++PL_evalseq,
2810 CopFILE(PL_curcop), (IV)CopLINE(PL_curcop));
2811 tmpbuf = SvPVX(sv);
2812 }
2813 else
2814 sprintf(tmpbuf, "_<(%.10s_eval %lu)", code, (unsigned long)++PL_evalseq);
f4dd75d9 2815 SAVECOPFILE_FREE(&PL_compiling);
57843af0 2816 CopFILE_set(&PL_compiling, tmpbuf+2);
f4dd75d9 2817 SAVECOPLINE(&PL_compiling);
57843af0 2818 CopLINE_set(&PL_compiling, 1);
c277df42
IZ
2819 /* XXX For C<eval "...">s within BEGIN {} blocks, this ends up
2820 deleting the eval's FILEGV from the stash before gv_check() runs
2821 (i.e. before run-time proper). To work around the coredump that
2822 ensues, we always turn GvMULTI_on for any globals that were
2823 introduced within evals. See force_ident(). GSAR 96-10-12 */
2824 safestr = savepv(tmpbuf);
3280af22 2825 SAVEDELETE(PL_defstash, safestr, strlen(safestr));
b3ac6de7 2826 SAVEHINTS();
d1ca3daa 2827#ifdef OP_IN_REGISTER
6b88bc9c 2828 PL_opsave = op;
d1ca3daa 2829#else
7766f137 2830 SAVEVPTR(PL_op);
d1ca3daa 2831#endif
c277df42 2832
a3985cdc 2833 /* we get here either during compilation, or via pp_regcomp at runtime */
923e4eb5 2834 runtime = IN_PERL_RUNTIME;
a3985cdc 2835 if (runtime)
d819b83a 2836 runcv = find_runcv(NULL);
a3985cdc 2837
533c011a 2838 PL_op = &dummy;
13b51b79 2839 PL_op->op_type = OP_ENTEREVAL;
533c011a 2840 PL_op->op_flags = 0; /* Avoid uninit warning. */
923e4eb5 2841 PUSHBLOCK(cx, CXt_EVAL|(IN_PERL_COMPILETIME ? 0 : CXp_REAL), SP);
cc49e20b 2842 PUSHEVAL(cx, 0, Nullgv);
a3985cdc
DM
2843
2844 if (runtime)
2845 rop = doeval(G_SCALAR, startop, runcv, PL_curcop->cop_seq);
2846 else
2847 rop = doeval(G_SCALAR, startop, PL_compcv, PL_cop_seqmax);
13b51b79 2848 POPBLOCK(cx,PL_curpm);
e84b9f1f 2849 POPEVAL(cx);
c277df42
IZ
2850
2851 (*startop)->op_type = OP_NULL;
22c35a8c 2852 (*startop)->op_ppaddr = PL_ppaddr[OP_NULL];
c277df42 2853 lex_end();
f3548bdc
DM
2854 /* XXX DAPM do this properly one year */
2855 *padp = (AV*)SvREFCNT_inc(PL_comppad);
c277df42 2856 LEAVE;
923e4eb5 2857 if (IN_PERL_COMPILETIME)
eb160463 2858 PL_compiling.op_private = (U8)(PL_hints & HINT_PRIVATE_MASK);
d1ca3daa 2859#ifdef OP_IN_REGISTER
6b88bc9c 2860 op = PL_opsave;
d1ca3daa 2861#endif
9d4ba2ae
AL
2862 PERL_UNUSED_VAR(newsp);
2863 PERL_UNUSED_VAR(optype);
2864
c277df42
IZ
2865 return rop;
2866}
2867
a3985cdc
DM
2868
2869/*
2870=for apidoc find_runcv
2871
2872Locate the CV corresponding to the currently executing sub or eval.
d819b83a
DM
2873If db_seqp is non_null, skip CVs that are in the DB package and populate
2874*db_seqp with the cop sequence number at the point that the DB:: code was
2875entered. (allows debuggers to eval in the scope of the breakpoint rather
cf525c36 2876than in the scope of the debugger itself).
a3985cdc
DM
2877
2878=cut
2879*/
2880
2881CV*
d819b83a 2882Perl_find_runcv(pTHX_ U32 *db_seqp)
a3985cdc 2883{
a3985cdc 2884 PERL_SI *si;
a3985cdc 2885
d819b83a
DM
2886 if (db_seqp)
2887 *db_seqp = PL_curcop->cop_seq;
a3985cdc 2888 for (si = PL_curstackinfo; si; si = si->si_prev) {
06b5626a 2889 I32 ix;
a3985cdc 2890 for (ix = si->si_cxix; ix >= 0; ix--) {
06b5626a 2891 const PERL_CONTEXT *cx = &(si->si_cxstack[ix]);
d819b83a 2892 if (CxTYPE(cx) == CXt_SUB || CxTYPE(cx) == CXt_FORMAT) {
1b6737cc 2893 CV * const cv = cx->blk_sub.cv;
d819b83a
DM
2894 /* skip DB:: code */
2895 if (db_seqp && PL_debstash && CvSTASH(cv) == PL_debstash) {
2896 *db_seqp = cx->blk_oldcop->cop_seq;
2897 continue;
2898 }
2899 return cv;
2900 }
a3985cdc
DM
2901 else if (CxTYPE(cx) == CXt_EVAL && !CxTRYBLOCK(cx))
2902 return PL_compcv;
2903 }
2904 }
2905 return PL_main_cv;
2906}
2907
2908
2909/* Compile a require/do, an eval '', or a /(?{...})/.
2910 * In the last case, startop is non-null, and contains the address of
2911 * a pointer that should be set to the just-compiled code.
2912 * outside is the lexically enclosing CV (if any) that invoked us.
2913 */
2914
4d1ff10f 2915/* With USE_5005THREADS, eval_owner must be held on entry to doeval */
0824fdcb 2916STATIC OP *
a3985cdc 2917S_doeval(pTHX_ int gimme, OP** startop, CV* outside, U32 seq)
a0d0e21e 2918{
27da23d5 2919 dVAR; dSP;
46c461b5 2920 OP * const saveop = PL_op;
a0d0e21e 2921
6dc8a9e4
IZ
2922 PL_in_eval = ((saveop && saveop->op_type == OP_REQUIRE)
2923 ? (EVAL_INREQUIRE | (PL_in_eval & EVAL_INEVAL))
2924 : EVAL_INEVAL);
a0d0e21e 2925
1ce6579f 2926 PUSHMARK(SP);
2927
3280af22
NIS
2928 SAVESPTR(PL_compcv);
2929 PL_compcv = (CV*)NEWSV(1104,0);
2930 sv_upgrade((SV *)PL_compcv, SVt_PVCV);
1aff0e91 2931 CvEVAL_on(PL_compcv);
2090ab20
JH
2932 assert(CxTYPE(&cxstack[cxstack_ix]) == CXt_EVAL);
2933 cxstack[cxstack_ix].blk_eval.cv = PL_compcv;
2934
a3985cdc 2935 CvOUTSIDE_SEQ(PL_compcv) = seq;
7dafbf52 2936 CvOUTSIDE(PL_compcv) = (CV*)SvREFCNT_inc(outside);
a3985cdc 2937
dd2155a4 2938 /* set up a scratch pad */
a0d0e21e 2939
dd2155a4 2940 CvPADLIST(PL_compcv) = pad_new(padnew_SAVE);
2c05e328 2941
07055b4c 2942
26d9b02f 2943 SAVEMORTALIZESV(PL_compcv); /* must remain until end of current statement */
748a9306 2944
a0d0e21e
LW
2945 /* make sure we compile in the right package */
2946
ed094faf 2947 if (CopSTASH_ne(PL_curcop, PL_curstash)) {
3280af22 2948 SAVESPTR(PL_curstash);
ed094faf 2949 PL_curstash = CopSTASH(PL_curcop);
a0d0e21e 2950 }
3280af22
NIS
2951 SAVESPTR(PL_beginav);
2952 PL_beginav = newAV();
2953 SAVEFREESV(PL_beginav);
24944567 2954 SAVEI32(PL_error_count);
a0d0e21e
LW
2955
2956 /* try to compile it */
2957
3280af22
NIS
2958 PL_eval_root = Nullop;
2959 PL_error_count = 0;
2960 PL_curcop = &PL_compiling;
2961 PL_curcop->cop_arybase = 0;
c277df42 2962 if (saveop && saveop->op_flags & OPf_SPECIAL)
faef0170 2963 PL_in_eval |= EVAL_KEEPERR;
1ce6579f 2964 else
c69006e4 2965 sv_setpvn(ERRSV,"",0);
3280af22 2966 if (yyparse() || PL_error_count || !PL_eval_root) {
0c58d367 2967 SV **newsp; /* Used by POPBLOCK. */
9d4ba2ae 2968 PERL_CONTEXT *cx = &cxstack[cxstack_ix];
c277df42 2969 I32 optype = 0; /* Might be reset by POPEVAL. */
9d4ba2ae 2970 const char *msg;
bfed75c6 2971
533c011a 2972 PL_op = saveop;
3280af22
NIS
2973 if (PL_eval_root) {
2974 op_free(PL_eval_root);
2975 PL_eval_root = Nullop;
a0d0e21e 2976 }
3280af22 2977 SP = PL_stack_base + POPMARK; /* pop original mark */
c277df42 2978 if (!startop) {
3280af22 2979 POPBLOCK(cx,PL_curpm);
c277df42 2980 POPEVAL(cx);
c277df42 2981 }
a0d0e21e
LW
2982 lex_end();
2983 LEAVE;
9d4ba2ae
AL
2984
2985 msg = SvPVx_nolen_const(ERRSV);
7a2e2cd6 2986 if (optype == OP_REQUIRE) {
b464bac0 2987 const SV * const nsv = cx->blk_eval.old_namesv;
504618e9 2988 (void)hv_store(GvHVn(PL_incgv), SvPVX_const(nsv), SvCUR(nsv),
27bcc0a7 2989 &PL_sv_undef, 0);
5a844595
GS
2990 DIE(aTHX_ "%sCompilation failed in require",
2991 *msg ? msg : "Unknown error\n");
2992 }
2993 else if (startop) {
3280af22 2994 POPBLOCK(cx,PL_curpm);
c277df42 2995 POPEVAL(cx);
5a844595
GS
2996 Perl_croak(aTHX_ "%sCompilation failed in regexp",
2997 (*msg ? msg : "Unknown error\n"));
7a2e2cd6 2998 }
9d7f88dd 2999 else {
9d7f88dd
SR
3000 if (!*msg) {
3001 sv_setpv(ERRSV, "Compilation error");
3002 }
3003 }
9d4ba2ae 3004 PERL_UNUSED_VAR(newsp);
a0d0e21e
LW
3005 RETPUSHUNDEF;
3006 }
57843af0 3007 CopLINE_set(&PL_compiling, 0);
c277df42 3008 if (startop) {
3280af22 3009 *startop = PL_eval_root;
c277df42 3010 } else
3280af22 3011 SAVEFREEOP(PL_eval_root);
0c58d367
RGS
3012
3013 /* Set the context for this new optree.
3014 * If the last op is an OP_REQUIRE, force scalar context.
3015 * Otherwise, propagate the context from the eval(). */
3016 if (PL_eval_root->op_type == OP_LEAVEEVAL
3017 && cUNOPx(PL_eval_root)->op_first->op_type == OP_LINESEQ
3018 && cLISTOPx(cUNOPx(PL_eval_root)->op_first)->op_last->op_type
3019 == OP_REQUIRE)
3020 scalar(PL_eval_root);
3021 else if (gimme & G_VOID)
3280af22 3022 scalarvoid(PL_eval_root);
54310121 3023 else if (gimme & G_ARRAY)
3280af22 3024 list(PL_eval_root);
a0d0e21e 3025 else
3280af22 3026 scalar(PL_eval_root);
a0d0e21e
LW
3027
3028 DEBUG_x(dump_eval());
3029
55497cff 3030 /* Register with debugger: */
84902520 3031 if (PERLDB_INTER && saveop->op_type == OP_REQUIRE) {
890ce7af 3032 CV * const cv = get_cv("DB::postponed", FALSE);
55497cff 3033 if (cv) {
3034 dSP;
924508f0 3035 PUSHMARK(SP);
cc49e20b 3036 XPUSHs((SV*)CopFILEGV(&PL_compiling));
55497cff 3037 PUTBACK;
864dbfa3 3038 call_sv((SV*)cv, G_DISCARD);
55497cff 3039 }
3040 }
3041
a0d0e21e
LW
3042 /* compiled okay, so do it */
3043
3280af22
NIS
3044 CvDEPTH(PL_compcv) = 1;
3045 SP = PL_stack_base + POPMARK; /* pop original mark */
533c011a 3046 PL_op = saveop; /* The caller may need it. */
6dc8a9e4 3047 PL_lex_state = LEX_NOTPARSING; /* $^S needs this. */
5dc0d613 3048
3280af22 3049 RETURNOP(PL_eval_start);
a0d0e21e
LW
3050}
3051
a6c40364 3052STATIC PerlIO *
7925835c 3053S_doopen_pm(pTHX_ const char *name, const char *mode)
b295d113 3054{
7925835c 3055#ifndef PERL_DISABLE_PMC
f54cb97a 3056 const STRLEN namelen = strlen(name);
b295d113
TH
3057 PerlIO *fp;
3058
7894fbab 3059 if (namelen > 3 && strEQ(name + namelen - 3, ".pm")) {
9d4ba2ae 3060 SV * const pmcsv = Perl_newSVpvf(aTHX_ "%s%c", name, 'c');
349d4f2f 3061 const char * const pmc = SvPV_nolen_const(pmcsv);
a6c40364
GS
3062 Stat_t pmcstat;
3063 if (PerlLIO_stat(pmc, &pmcstat) < 0) {
b295d113 3064 fp = PerlIO_open(name, mode);
a6c40364
GS
3065 }
3066 else {
9d4ba2ae 3067 Stat_t pmstat;
b295d113 3068 if (PerlLIO_stat(name, &pmstat) < 0 ||
a6c40364
GS
3069 pmstat.st_mtime < pmcstat.st_mtime)
3070 {
3071 fp = PerlIO_open(pmc, mode);
3072 }
3073 else {
3074 fp = PerlIO_open(name, mode);
3075 }
b295d113 3076 }
a6c40364
GS
3077 SvREFCNT_dec(pmcsv);
3078 }
3079 else {
3080 fp = PerlIO_open(name, mode);
b295d113 3081 }
b295d113 3082 return fp;
7925835c
RGS
3083#else
3084 return PerlIO_open(name, mode);
3085#endif /* !PERL_DISABLE_PMC */
b295d113
TH
3086}
3087
a0d0e21e
LW
3088PP(pp_require)
3089{
27da23d5 3090 dVAR; dSP;
c09156bb 3091 register PERL_CONTEXT *cx;
a0d0e21e 3092 SV *sv;
5c144d81 3093 const char *name;
6132ea6c 3094 STRLEN len;
5c144d81 3095 const char *tryname = Nullch;
46fc3d4c 3096 SV *namesv = Nullsv;
f54cb97a 3097 const I32 gimme = GIMME_V;
760ac839 3098 PerlIO *tryrsfp = 0;
bbed91b5
KF
3099 int filter_has_file = 0;
3100 GV *filter_child_proc = 0;
3101 SV *filter_state = 0;
3102 SV *filter_sub = 0;
89ccab8c 3103 SV *hook_sv = 0;
6ec9efec
JH
3104 SV *encoding;
3105 OP *op;
a0d0e21e
LW
3106
3107 sv = POPs;
d7aa5382
JP
3108 if ( (SvNIOKp(sv) || SvVOK(sv)) && PL_op->op_type != OP_DOFILE) {
3109 if ( SvVOK(sv) && ckWARN(WARN_PORTABLE) ) /* require v5.6.1 */
9014280d 3110 Perl_warner(aTHX_ packWARN(WARN_PORTABLE),
e3407aba 3111 "v-string in use/require non-portable");
d7aa5382
JP
3112
3113 sv = new_version(sv);
3114 if (!sv_derived_from(PL_patchlevel, "version"))
3115 (void *)upg_version(PL_patchlevel);
149c1637 3116 if (cUNOP->op_first->op_type == OP_CONST && cUNOP->op_first->op_private & OPpCONST_NOVER) {
468aa647
RGS
3117 if ( vcmp(sv,PL_patchlevel) < 0 )
3118 DIE(aTHX_ "Perls since %"SVf" too modern--this is %"SVf", stopped",
3119 vnormal(sv), vnormal(PL_patchlevel));
3120 }
3121 else {
3122 if ( vcmp(sv,PL_patchlevel) > 0 )
3123 DIE(aTHX_ "Perl %"SVf" required--this is only %"SVf", stopped",
3124 vnormal(sv), vnormal(PL_patchlevel));
3125 }
d7aa5382 3126
4305d8ab 3127 RETPUSHYES;
a0d0e21e 3128 }
5c144d81 3129 name = SvPV_const(sv, len);
6132ea6c 3130 if (!(name && len > 0 && *name))
cea2e8a9 3131 DIE(aTHX_ "Null filename used");
4633a7c4 3132 TAINT_PROPER("require");
44f8325f
AL
3133 if (PL_op->op_type == OP_REQUIRE) {
3134 SV ** const svp = hv_fetch(GvHVn(PL_incgv), name, len, 0);
3135 if ( svp ) {
3136 if (*svp != &PL_sv_undef)
3137 RETPUSHYES;
3138 else
3139 DIE(aTHX_ "Compilation failed in require");
3140 }
4d8b06f1 3141 }
a0d0e21e
LW
3142
3143 /* prepare to compile file */
3144
be4b629d 3145 if (path_is_absolute(name)) {
46fc3d4c 3146 tryname = name;
7925835c 3147 tryrsfp = doopen_pm(name,PERL_SCRIPT_MODE);
bf4acbe4 3148 }
67627c52
JH
3149#ifdef MACOS_TRADITIONAL
3150 if (!tryrsfp) {
3151 char newname[256];
3152
3153 MacPerl_CanonDir(name, newname, 1);
3154 if (path_is_absolute(newname)) {
3155 tryname = newname;
7925835c 3156 tryrsfp = doopen_pm(newname,PERL_SCRIPT_MODE);
67627c52
JH
3157 }
3158 }
3159#endif
be4b629d 3160 if (!tryrsfp) {
44f8325f 3161 AV * const ar = GvAVn(PL_incgv);
a0d0e21e 3162 I32 i;
748a9306 3163#ifdef VMS
46fc3d4c 3164 char *unixname;
b8ffc8df 3165 if ((unixname = tounixspec(name, Nullch)) != Nullch)
46fc3d4c 3166#endif
3167 {
3168 namesv = NEWSV(806, 0);
3169 for (i = 0; i <= AvFILL(ar); i++) {
bbed91b5
KF
3170 SV *dirsv = *av_fetch(ar, i, TRUE);
3171
3172 if (SvROK(dirsv)) {
3173 int count;
3174 SV *loader = dirsv;
3175
e14e2dc8
NC
3176 if (SvTYPE(SvRV(loader)) == SVt_PVAV
3177 && !sv_isobject(loader))
3178 {
bbed91b5
KF
3179 loader = *av_fetch((AV *)SvRV(loader), 0, TRUE);
3180 }
3181
b900a521 3182 Perl_sv_setpvf(aTHX_ namesv, "/loader/0x%"UVxf"/%s",
44f0be63 3183 PTR2UV(SvRV(dirsv)), name);
349d4f2f 3184 tryname = SvPVX_const(namesv);
bbed91b5
KF
3185 tryrsfp = 0;
3186
3187 ENTER;
3188 SAVETMPS;
3189 EXTEND(SP, 2);
3190
3191 PUSHMARK(SP);
3192 PUSHs(dirsv);
3193 PUSHs(sv);
3194 PUTBACK;
e982885c
NC
3195 if (sv_isobject(loader))
3196 count = call_method("INC", G_ARRAY);
3197 else
3198 count = call_sv(loader, G_ARRAY);
bbed91b5
KF
3199 SPAGAIN;
3200
3201 if (count > 0) {
3202 int i = 0;
3203 SV *arg;
3204
3205 SP -= count - 1;
3206 arg = SP[i++];
3207
3208 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVGV) {
3209 arg = SvRV(arg);
3210 }
3211
3212 if (SvTYPE(arg) == SVt_PVGV) {
3213 IO *io = GvIO((GV *)arg);
3214
3215 ++filter_has_file;
3216
3217 if (io) {
3218 tryrsfp = IoIFP(io);
50952442 3219 if (IoTYPE(io) == IoTYPE_PIPE) {
bbed91b5
KF
3220 /* reading from a child process doesn't
3221 nest -- when returning from reading
3222 the inner module, the outer one is
3223 unreadable (closed?) I've tried to
3224 save the gv to manage the lifespan of
3225 the pipe, but this didn't help. XXX */
3226 filter_child_proc = (GV *)arg;
520c758a 3227 (void)SvREFCNT_inc(filter_child_proc);
bbed91b5
KF
3228 }
3229 else {
3230 if (IoOFP(io) && IoOFP(io) != IoIFP(io)) {
3231 PerlIO_close(IoOFP(io));
3232 }
3233 IoIFP(io) = Nullfp;
3234 IoOFP(io) = Nullfp;
3235 }
3236 }
3237
3238 if (i < count) {
3239 arg = SP[i++];
3240 }
3241 }
3242
3243 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVCV) {
3244 filter_sub = arg;
520c758a 3245 (void)SvREFCNT_inc(filter_sub);
bbed91b5
KF
3246
3247 if (i < count) {
3248 filter_state = SP[i];
520c758a 3249 (void)SvREFCNT_inc(filter_state);
bbed91b5
KF
3250 }
3251
3252 if (tryrsfp == 0) {
3253 tryrsfp = PerlIO_open("/dev/null",
3254 PERL_SCRIPT_MODE);
3255 }
3256 }
1d06aecd 3257 SP--;
bbed91b5
KF
3258 }
3259
3260 PUTBACK;
3261 FREETMPS;
3262 LEAVE;
3263
3264 if (tryrsfp) {
89ccab8c 3265 hook_sv = dirsv;
bbed91b5
KF
3266 break;
3267 }
3268
3269 filter_has_file = 0;
3270 if (filter_child_proc) {
3271 SvREFCNT_dec(filter_child_proc);
3272 filter_child_proc = 0;
3273 }
3274 if (filter_state) {
3275 SvREFCNT_dec(filter_state);
3276 filter_state = 0;
3277 }
3278 if (filter_sub) {
3279 SvREFCNT_dec(filter_sub);
3280 filter_sub = 0;
3281 }
3282 }
3283 else {
be4b629d
CN
3284 if (!path_is_absolute(name)
3285#ifdef MACOS_TRADITIONAL
3286 /* We consider paths of the form :a:b ambiguous and interpret them first
3287 as global then as local
3288 */
3289 || (*name == ':' && name[1] != ':' && strchr(name+2, ':'))
3290#endif
3291 ) {
0510663f 3292 const char *dir = SvPVx_nolen_const(dirsv);
bf4acbe4 3293#ifdef MACOS_TRADITIONAL
67627c52
JH
3294 char buf1[256];
3295 char buf2[256];
3296
3297 MacPerl_CanonDir(name, buf2, 1);
3298 Perl_sv_setpvf(aTHX_ namesv, "%s%s", MacPerl_CanonDir(dir, buf1, 0), buf2+(buf2[0] == ':'));
bf4acbe4 3299#else
27da23d5 3300# ifdef VMS
bbed91b5 3301 char *unixdir;
b8ffc8df 3302 if ((unixdir = tounixpath(dir, Nullch)) == Nullch)
bbed91b5
KF
3303 continue;
3304 sv_setpv(namesv, unixdir);
3305 sv_catpv(namesv, unixname);
27da23d5
JH
3306# else
3307# ifdef SYMBIAN
3308 if (PL_origfilename[0] &&
3309 PL_origfilename[1] == ':' &&
3310 !(dir[0] && dir[1] == ':'))
3311 Perl_sv_setpvf(aTHX_ namesv,
3312 "%c:%s\\%s",
3313 PL_origfilename[0],
3314 dir, name);
3315 else
3316 Perl_sv_setpvf(aTHX_ namesv,
3317 "%s\\%s",
3318 dir, name);
3319# else
bbed91b5 3320 Perl_sv_setpvf(aTHX_ namesv, "%s/%s", dir, name);
27da23d5
JH
3321# endif
3322# endif
bf4acbe4 3323#endif
bbed91b5 3324 TAINT_PROPER("require");
349d4f2f 3325 tryname = SvPVX_const(namesv);
7925835c 3326 tryrsfp = doopen_pm(tryname, PERL_SCRIPT_MODE);
bbed91b5
KF
3327 if (tryrsfp) {
3328 if (tryname[0] == '.' && tryname[1] == '/')
3329 tryname += 2;
3330 break;
3331 }
be4b629d 3332 }
46fc3d4c 3333 }
a0d0e21e
LW
3334 }
3335 }
3336 }
f4dd75d9 3337 SAVECOPFILE_FREE(&PL_compiling);
57843af0 3338 CopFILE_set(&PL_compiling, tryrsfp ? tryname : name);
46fc3d4c 3339 SvREFCNT_dec(namesv);
a0d0e21e 3340 if (!tryrsfp) {
533c011a 3341 if (PL_op->op_type == OP_REQUIRE) {
5c144d81 3342 const char *msgstr = name;
e31de809 3343 if(errno == EMFILE) {
44f8325f 3344 SV * const msg = sv_2mortal(newSVpv(msgstr,0));
e31de809
SP
3345 sv_catpv(msg, ": ");
3346 sv_catpv(msg, Strerror(errno));
349d4f2f 3347 msgstr = SvPV_nolen_const(msg);
e31de809
SP
3348 } else {
3349 if (namesv) { /* did we lookup @INC? */
44f8325f
AL
3350 SV * const msg = sv_2mortal(newSVpv(msgstr,0));
3351 SV * const dirmsgsv = NEWSV(0, 0);
3352 AV * const ar = GvAVn(PL_incgv);
e31de809
SP
3353 I32 i;
3354 sv_catpvn(msg, " in @INC", 8);
3355 if (instr(SvPVX_const(msg), ".h "))
3356 sv_catpv(msg, " (change .h to .ph maybe?)");
3357 if (instr(SvPVX_const(msg), ".ph "))
3358 sv_catpv(msg, " (did you run h2ph?)");
3359 sv_catpv(msg, " (@INC contains:");
3360 for (i = 0; i <= AvFILL(ar); i++) {
3361 const char *dir = SvPVx_nolen_const(*av_fetch(ar, i, TRUE));
3362 Perl_sv_setpvf(aTHX_ dirmsgsv, " %s", dir);
3363 sv_catsv(msg, dirmsgsv);
3364 }
3365 sv_catpvn(msg, ")", 1);
3366 SvREFCNT_dec(dirmsgsv);
3367 msgstr = SvPV_nolen_const(msg);
3368 }
2683423c 3369 }
ea071790 3370 DIE(aTHX_ "Can't locate %s", msgstr);
a0d0e21e
LW
3371 }
3372
3373 RETPUSHUNDEF;
3374 }
d8bfb8bd 3375 else
93189314 3376 SETERRNO(0, SS_NORMAL);
a0d0e21e
LW
3377
3378 /* Assume success here to prevent recursive requirement. */
d3a4e64e
RGS
3379 len = strlen(name);
3380 /* Check whether a hook in @INC has already filled %INC */
44f8325f
AL
3381 if (!hook_sv) {
3382 (void)hv_store(GvHVn(PL_incgv), name, len, newSVpv(CopFILE(&PL_compiling),0),0);
3383 } else {
3384 SV** const svp = hv_fetch(GvHVn(PL_incgv), name, len, 0);
3385 if (!svp)
3386 (void)hv_store(GvHVn(PL_incgv), name, len, SvREFCNT_inc(hook_sv), 0 );
d3a4e64e 3387 }
a0d0e21e
LW
3388
3389 ENTER;
3390 SAVETMPS;
79cb57f6 3391 lex_start(sv_2mortal(newSVpvn("",0)));
b9d12d37
GS
3392 SAVEGENERICSV(PL_rsfp_filters);
3393 PL_rsfp_filters = Nullav;
e50aee73 3394
3280af22 3395 PL_rsfp = tryrsfp;
b3ac6de7 3396 SAVEHINTS();
3280af22 3397 PL_hints = 0;
7766f137 3398 SAVESPTR(PL_compiling.cop_warnings);
0453d815 3399 if (PL_dowarn & G_WARN_ALL_ON)
d3a7d8c7 3400 PL_compiling.cop_warnings = pWARN_ALL ;
0453d815 3401 else if (PL_dowarn & G_WARN_ALL_OFF)
d3a7d8c7 3402 PL_compiling.cop_warnings = pWARN_NONE ;
317ea90d
MS
3403 else if (PL_taint_warn)
3404 PL_compiling.cop_warnings = newSVpvn(WARN_TAINTstring, WARNsize);
ac27b0f5 3405 else
d3a7d8c7 3406 PL_compiling.cop_warnings = pWARN_STD ;
ac27b0f5
NIS
3407 SAVESPTR(PL_compiling.cop_io);
3408 PL_compiling.cop_io = Nullsv;
a0d0e21e 3409
bbed91b5 3410 if (filter_sub || filter_child_proc) {
890ce7af 3411 SV * const datasv = filter_add(run_user_filter, Nullsv);
bbed91b5
KF
3412 IoLINES(datasv) = filter_has_file;
3413 IoFMT_GV(datasv) = (GV *)filter_child_proc;
3414 IoTOP_GV(datasv) = (GV *)filter_state;
3415 IoBOTTOM_GV(datasv) = (GV *)filter_sub;
3416 }
3417
3418 /* switch to eval mode */
a0d0e21e 3419 PUSHBLOCK(cx, CXt_EVAL, SP);
cc49e20b 3420 PUSHEVAL(cx, name, Nullgv);
f39bc417 3421 cx->blk_eval.retop = PL_op->op_next;
a0d0e21e 3422
57843af0
GS
3423 SAVECOPLINE(&PL_compiling);
3424 CopLINE_set(&PL_compiling, 0);
a0d0e21e
LW
3425
3426 PUTBACK;
6ec9efec
JH
3427
3428 /* Store and reset encoding. */
3429 encoding = PL_encoding;
3430 PL_encoding = Nullsv;
3431
a3985cdc 3432 op = DOCATCH(doeval(gimme, NULL, Nullcv, PL_curcop->cop_seq));
bfed75c6 3433
6ec9efec
JH
3434 /* Restore encoding. */
3435 PL_encoding = encoding;
3436
3437 return op;
a0d0e21e
LW
3438}
3439
3440PP(pp_dofile)
3441{
cea2e8a9 3442 return pp_require();
a0d0e21e
LW
3443}
3444
3445PP(pp_entereval)
3446{
27da23d5 3447 dVAR; dSP;
c09156bb 3448 register PERL_CONTEXT *cx;
a0d0e21e 3449 dPOPss;
890ce7af
AL
3450 const I32 gimme = GIMME_V;
3451 const I32 was = PL_sub_generation;
83ee9e09
GS
3452 char tbuf[TYPE_DIGITS(long) + 12];
3453 char *tmpbuf = tbuf;
fc36a67e 3454 char *safestr;
a0d0e21e 3455 STRLEN len;
55497cff 3456 OP *ret;
a3985cdc 3457 CV* runcv;
d819b83a 3458 U32 seq;
a0d0e21e 3459
5c144d81 3460 if (!SvPV_const(sv,len))
a0d0e21e 3461 RETPUSHUNDEF;
748a9306 3462 TAINT_PROPER("eval");
a0d0e21e
LW
3463
3464 ENTER;
a0d0e21e 3465 lex_start(sv);
748a9306 3466 SAVETMPS;
ac27b0f5 3467
a0d0e21e
LW
3468 /* switch to eval mode */
3469
83ee9e09 3470 if (PERLDB_NAMEEVAL && CopLINE(PL_curcop)) {
890ce7af 3471 SV * const sv = sv_newmortal();
83ee9e09
GS
3472 Perl_sv_setpvf(aTHX_ sv, "_<(eval %lu)[%s:%"IVdf"]",
3473 (unsigned long)++PL_evalseq,
3474 CopFILE(PL_curcop), (IV)CopLINE(PL_curcop));
3475 tmpbuf = SvPVX(sv);
3476 }
3477 else
3478 sprintf(tmpbuf, "_<(eval %lu)", (unsigned long)++PL_evalseq);
f4dd75d9 3479 SAVECOPFILE_FREE(&PL_compiling);
57843af0 3480 CopFILE_set(&PL_compiling, tmpbuf+2);
f4dd75d9 3481 SAVECOPLINE(&PL_compiling);
57843af0 3482 CopLINE_set(&PL_compiling, 1);
55497cff 3483 /* XXX For C<eval "...">s within BEGIN {} blocks, this ends up
3484 deleting the eval's FILEGV from the stash before gv_check() runs
3485 (i.e. before run-time proper). To work around the coredump that
3486 ensues, we always turn GvMULTI_on for any globals that were
3487 introduced within evals. See force_ident(). GSAR 96-10-12 */
3488 safestr = savepv(tmpbuf);
3280af22 3489 SAVEDELETE(PL_defstash, safestr, strlen(safestr));
b3ac6de7 3490 SAVEHINTS();
533c011a 3491 PL_hints = PL_op->op_targ;
7766f137 3492 SAVESPTR(PL_compiling.cop_warnings);
f0a6fc86
GS
3493 if (specialWARN(PL_curcop->cop_warnings))
3494 PL_compiling.cop_warnings = PL_curcop->cop_warnings;
3495 else {
3496 PL_compiling.cop_warnings = newSVsv(PL_curcop->cop_warnings);
3497 SAVEFREESV(PL_compiling.cop_warnings);
599cee73 3498 }
ac27b0f5
NIS
3499 SAVESPTR(PL_compiling.cop_io);
3500 if (specialCopIO(PL_curcop->cop_io))
3501 PL_compiling.cop_io = PL_curcop->cop_io;
3502 else {
3503 PL_compiling.cop_io = newSVsv(PL_curcop->cop_io);
3504 SAVEFREESV(PL_compiling.cop_io);
3505 }
d819b83a
DM
3506 /* special case: an eval '' executed within the DB package gets lexically
3507 * placed in the first non-DB CV rather than the current CV - this
3508 * allows the debugger to execute code, find lexicals etc, in the
3509 * scope of the code being debugged. Passing &seq gets find_runcv
3510 * to do the dirty work for us */
3511 runcv = find_runcv(&seq);
a0d0e21e 3512
6b35e009 3513 PUSHBLOCK(cx, (CXt_EVAL|CXp_REAL), SP);
cc49e20b 3514 PUSHEVAL(cx, 0, Nullgv);
f39bc417 3515 cx->blk_eval.retop = PL_op->op_next;
a0d0e21e
LW
3516
3517 /* prepare to compile string */
3518
3280af22 3519 if (PERLDB_LINE && PL_curstash != PL_debstash)
cc49e20b 3520 save_lines(CopFILEAV(&PL_compiling), PL_linestr);
a0d0e21e 3521 PUTBACK;
d819b83a 3522 ret = doeval(gimme, NULL, runcv, seq);
eb160463 3523 if (PERLDB_INTER && was != (I32)PL_sub_generation /* Some subs defined here. */
533c011a 3524 && ret != PL_op->op_next) { /* Successive compilation. */
55497cff 3525 strcpy(safestr, "_<(eval )"); /* Anything fake and short. */
3526 }
1e422769 3527 return DOCATCH(ret);
a0d0e21e
LW
3528}
3529
3530PP(pp_leaveeval)
3531{
27da23d5 3532 dVAR; dSP;
a0d0e21e
LW
3533 register SV **mark;
3534 SV **newsp;
3535 PMOP *newpm;
3536 I32 gimme;
c09156bb 3537 register PERL_CONTEXT *cx;
a0d0e21e 3538 OP *retop;
06b5626a 3539 const U8 save_flags = PL_op -> op_flags;
a0d0e21e
LW
3540 I32 optype;
3541
3542 POPBLOCK(cx,newpm);
3543 POPEVAL(cx);
f39bc417 3544 retop = cx->blk_eval.retop;
a0d0e21e 3545
a1f49e72 3546 TAINT_NOT;
54310121 3547 if (gimme == G_VOID)
3548 MARK = newsp;
3549 else if (gimme == G_SCALAR) {
3550 MARK = newsp + 1;
3551 if (MARK <= SP) {
3552 if (SvFLAGS(TOPs) & SVs_TEMP)
3553 *MARK = TOPs;
3554 else
3555 *MARK = sv_mortalcopy(TOPs);
3556 }
a0d0e21e 3557 else {
54310121 3558 MEXTEND(mark,0);
3280af22 3559 *MARK = &PL_sv_undef;
a0d0e21e 3560 }
a7ec2b44 3561 SP = MARK;
a0d0e21e
LW
3562 }
3563 else {
a1f49e72
CS
3564 /* in case LEAVE wipes old return values */
3565 for (mark = newsp + 1; mark <= SP; mark++) {
3566 if (!(SvFLAGS(*mark) & SVs_TEMP)) {
a0d0e21e 3567 *mark = sv_mortalcopy(*mark);
a1f49e72
CS
3568 TAINT_NOT; /* Each item is independent */
3569 }
3570 }
a0d0e21e 3571 }
3280af22 3572 PL_curpm = newpm; /* Don't pop $1 et al till now */
a0d0e21e 3573
4fdae800 3574#ifdef DEBUGGING
3280af22 3575 assert(CvDEPTH(PL_compcv) == 1);
4fdae800 3576#endif
3280af22 3577 CvDEPTH(PL_compcv) = 0;
f46d017c 3578 lex_end();
4fdae800 3579
1ce6579f 3580 if (optype == OP_REQUIRE &&
924508f0 3581 !(gimme == G_SCALAR ? SvTRUE(*SP) : SP > newsp))
54310121 3582 {
1ce6579f 3583 /* Unassume the success we assumed earlier. */
901017d6 3584 SV * const nsv = cx->blk_eval.old_namesv;
b15aece3 3585 (void)hv_delete(GvHVn(PL_incgv), SvPVX_const(nsv), SvCUR(nsv), G_DISCARD);
35c1215d 3586 retop = Perl_die(aTHX_ "%"SVf" did not return a true value", nsv);
f46d017c
GS
3587 /* die_where() did LEAVE, or we won't be here */
3588 }
3589 else {
3590 LEAVE;
3591 if (!(save_flags & OPf_SPECIAL))
c69006e4 3592 sv_setpvn(ERRSV,"",0);
a0d0e21e 3593 }
a0d0e21e
LW
3594
3595 RETURNOP(retop);
3596}
3597
a0d0e21e
LW
3598PP(pp_entertry)
3599{
27da23d5 3600 dVAR; dSP;
c09156bb 3601 register PERL_CONTEXT *cx;
f54cb97a 3602 const I32 gimme = GIMME_V;
a0d0e21e
LW
3603
3604 ENTER;
3605 SAVETMPS;
3606
1d76a5c3 3607 PUSHBLOCK(cx, (CXt_EVAL|CXp_TRYBLOCK), SP);
a0d0e21e 3608 PUSHEVAL(cx, 0, 0);
f39bc417 3609 cx->blk_eval.retop = cLOGOP->op_other->op_next;
a0d0e21e 3610
faef0170 3611 PL_in_eval = EVAL_INEVAL;
c69006e4 3612 sv_setpvn(ERRSV,"",0);
1e422769 3613 PUTBACK;
533c011a 3614 return DOCATCH(PL_op->op_next);
a0d0e21e
LW
3615}
3616
3617PP(pp_leavetry)
3618{
27da23d5 3619 dVAR; dSP;
a0d0e21e
LW
3620 register SV **mark;
3621 SV **newsp;
3622 PMOP *newpm;
3623 I32 gimme;
c09156bb 3624 register PERL_CONTEXT *cx;
a0d0e21e
LW
3625 I32 optype;
3626
3627 POPBLOCK(cx,newpm);
3628 POPEVAL(cx);
9d4ba2ae 3629 PERL_UNUSED_VAR(optype);
a0d0e21e 3630
a1f49e72 3631 TAINT_NOT;
54310121 3632 if (gimme == G_VOID)
3633 SP = newsp;
3634 else if (gimme == G_SCALAR) {
3635 MARK = newsp + 1;
3636 if (MARK <= SP) {
3637 if (SvFLAGS(TOPs) & (SVs_PADTMP|SVs_TEMP))
3638 *MARK = TOPs;
3639 else
3640 *MARK = sv_mortalcopy(TOPs);
3641 }
a0d0e21e 3642 else {
54310121 3643 MEXTEND(mark,0);
3280af22 3644 *MARK = &PL_sv_undef;
a0d0e21e
LW
3645 }
3646 SP = MARK;
3647 }
3648 else {
a1f49e72
CS
3649 /* in case LEAVE wipes old return values */
3650 for (mark = newsp + 1; mark <= SP; mark++) {
3651 if (!(SvFLAGS(*mark) & (SVs_PADTMP|SVs_TEMP))) {
a0d0e21e 3652 *mark = sv_mortalcopy(*mark);
a1f49e72
CS
3653 TAINT_NOT; /* Each item is independent */
3654 }
3655 }
a0d0e21e 3656 }
3280af22 3657 PL_curpm = newpm; /* Don't pop $1 et al till now */
a0d0e21e
LW
3658
3659 LEAVE;
c69006e4 3660 sv_setpvn(ERRSV,"",0);
745cf2ff 3661 RETURN;
a0d0e21e
LW
3662}
3663
a1b95068 3664STATIC OP *
cea2e8a9 3665S_doparseform(pTHX_ SV *sv)
a0d0e21e
LW
3666{
3667 STRLEN len;
3668 register char *s = SvPV_force(sv, len);
3669 register char *send = s + len;
9c5ffd7c 3670 register char *base = Nullch;
a0d0e21e 3671 register I32 skipspaces = 0;
9c5ffd7c
JH
3672 bool noblank = FALSE;
3673 bool repeat = FALSE;
a0d0e21e 3674 bool postspace = FALSE;
dea28490
JJ
3675 U32 *fops;
3676 register U32 *fpc;
3677 U32 *linepc = 0;
a0d0e21e
LW
3678 register I32 arg;
3679 bool ischop;
a1b95068
WL
3680 bool unchopnum = FALSE;
3681 int maxops = 12; /* FF_LINEMARK + FF_END + 10 (\0 without preceding \n) */
a0d0e21e 3682
55497cff 3683 if (len == 0)
cea2e8a9 3684 Perl_croak(aTHX_ "Null picture in formline");
ac27b0f5 3685
815f25c6
DM
3686 /* estimate the buffer size needed */
3687 for (base = s; s <= send; s++) {
a1b95068 3688 if (*s == '\n' || *s == '@' || *s == '^')
815f25c6
DM
3689 maxops += 10;
3690 }
3691 s = base;
3692 base = Nullch;
3693
a02a5408 3694 Newx(fops, maxops, U32);
a0d0e21e
LW
3695 fpc = fops;
3696
3697 if (s < send) {
3698 linepc = fpc;
3699 *fpc++ = FF_LINEMARK;
3700 noblank = repeat = FALSE;
3701 base = s;
3702 }
3703
3704 while (s <= send) {
3705 switch (*s++) {
3706 default:
3707 skipspaces = 0;
3708 continue;
3709
3710 case '~':
3711 if (*s == '~') {
3712 repeat = TRUE;
3713 *s = ' ';
3714 }
3715 noblank = TRUE;
3716 s[-1] = ' ';
3717 /* FALL THROUGH */
3718 case ' ': case '\t':
3719 skipspaces++;
3720 continue;
a1b95068
WL
3721 case 0:
3722 if (s < send) {
3723 skipspaces = 0;
3724 continue;
3725 } /* else FALL THROUGH */
3726 case '\n':
a0d0e21e
LW
3727 arg = s - base;
3728 skipspaces++;
3729 arg -= skipspaces;
3730 if (arg) {
5f05dabc 3731 if (postspace)
a0d0e21e 3732 *fpc++ = FF_SPACE;
a0d0e21e 3733 *fpc++ = FF_LITERAL;
eb160463 3734 *fpc++ = (U16)arg;
a0d0e21e 3735 }
5f05dabc 3736 postspace = FALSE;
a0d0e21e
LW
3737 if (s <= send)
3738 skipspaces--;
3739 if (skipspaces) {
3740 *fpc++ = FF_SKIP;
eb160463 3741 *fpc++ = (U16)skipspaces;
a0d0e21e
LW
3742 }
3743 skipspaces = 0;
3744 if (s <= send)
3745 *fpc++ = FF_NEWLINE;
3746 if (noblank) {
3747 *fpc++ = FF_BLANK;
3748 if (repeat)
3749 arg = fpc - linepc + 1;
3750 else
3751 arg = 0;
eb160463 3752 *fpc++ = (U16)arg;
a0d0e21e
LW
3753 }
3754 if (s < send) {
3755 linepc = fpc;
3756 *fpc++ = FF_LINEMARK;
3757 noblank = repeat = FALSE;
3758 base = s;
3759 }
3760 else
3761 s++;
3762 continue;
3763
3764 case '@':
3765 case '^':
3766 ischop = s[-1] == '^';
3767
3768 if (postspace) {
3769 *fpc++ = FF_SPACE;
3770 postspace = FALSE;
3771 }
3772 arg = (s - base) - 1;
3773 if (arg) {
3774 *fpc++ = FF_LITERAL;
eb160463 3775 *fpc++ = (U16)arg;
a0d0e21e
LW
3776 }
3777
3778 base = s - 1;
3779 *fpc++ = FF_FETCH;
3780 if (*s == '*') {
3781 s++;
a1b95068
WL
3782 *fpc++ = 2; /* skip the @* or ^* */
3783 if (ischop) {
3784 *fpc++ = FF_LINESNGL;
3785 *fpc++ = FF_CHOP;
3786 } else
3787 *fpc++ = FF_LINEGLOB;
a0d0e21e
LW
3788 }
3789 else if (*s == '#' || (*s == '.' && s[1] == '#')) {
3790 arg = ischop ? 512 : 0;
3791 base = s - 1;
3792 while (*s == '#')
3793 s++;
3794 if (*s == '.') {
06b5626a 3795 const char * const f = ++s;
a0d0e21e
LW
3796 while (*s == '#')
3797 s++;
3798 arg |= 256 + (s - f);
3799 }
3800 *fpc++ = s - base; /* fieldsize for FETCH */
3801 *fpc++ = FF_DECIMAL;
eb160463 3802 *fpc++ = (U16)arg;
a1b95068 3803 unchopnum |= ! ischop;
784707d5
JP
3804 }
3805 else if (*s == '0' && s[1] == '#') { /* Zero padded decimals */
3806 arg = ischop ? 512 : 0;
3807 base = s - 1;
3808 s++; /* skip the '0' first */
3809 while (*s == '#')
3810 s++;
3811 if (*s == '.') {
06b5626a 3812 const char * const f = ++s;
784707d5
JP
3813 while (*s == '#')
3814 s++;
3815 arg |= 256 + (s - f);
3816 }
3817 *fpc++ = s - base; /* fieldsize for FETCH */
3818 *fpc++ = FF_0DECIMAL;
eb160463 3819 *fpc++ = (U16)arg;
a1b95068 3820 unchopnum |= ! ischop;
a0d0e21e
LW
3821 }
3822 else {
3823 I32 prespace = 0;
3824 bool ismore = FALSE;
3825
3826 if (*s == '>') {
3827 while (*++s == '>') ;
3828 prespace = FF_SPACE;
3829 }
3830 else if (*s == '|') {
3831 while (*++s == '|') ;
3832 prespace = FF_HALFSPACE;
3833 postspace = TRUE;
3834 }
3835 else {
3836 if (*s == '<')
3837 while (*++s == '<') ;
3838 postspace = TRUE;
3839 }
3840 if (*s == '.' && s[1] == '.' && s[2] == '.') {
3841 s += 3;
3842 ismore = TRUE;
3843 }
3844 *fpc++ = s - base; /* fieldsize for FETCH */
3845
3846 *fpc++ = ischop ? FF_CHECKCHOP : FF_CHECKNL;
3847
3848 if (prespace)
eb160463 3849 *fpc++ = (U16)prespace;
a0d0e21e
LW
3850 *fpc++ = FF_ITEM;
3851 if (ismore)
3852 *fpc++ = FF_MORE;
3853 if (ischop)
3854 *fpc++ = FF_CHOP;
3855 }
3856 base = s;
3857 skipspaces = 0;
3858 continue;
3859 }
3860 }
3861 *fpc++ = FF_END;
3862
815f25c6 3863 assert (fpc <= fops + maxops); /* ensure our buffer estimate was valid */
a0d0e21e
LW
3864 arg = fpc - fops;
3865 { /* need to jump to the next word */
3866 int z;
3867 z = WORD_ALIGN - SvCUR(sv) % WORD_ALIGN;
dea28490 3868 SvGROW(sv, SvCUR(sv) + z + arg * sizeof(U32) + 4);
a0d0e21e
LW
3869 s = SvPVX(sv) + SvCUR(sv) + z;
3870 }
dea28490 3871 Copy(fops, s, arg, U32);
a0d0e21e 3872 Safefree(fops);
14befaf4 3873 sv_magic(sv, Nullsv, PERL_MAGIC_fm, Nullch, 0);
a0d0e21e 3874 SvCOMPILED_on(sv);
a1b95068 3875
bfed75c6 3876 if (unchopnum && repeat)
a1b95068
WL
3877 DIE(aTHX_ "Repeated format line will never terminate (~~ and @#)");
3878 return 0;
3879}
3880
3881
3882STATIC bool
3883S_num_overflow(NV value, I32 fldsize, I32 frcsize)
3884{
3885 /* Can value be printed in fldsize chars, using %*.*f ? */
3886 NV pwr = 1;
3887 NV eps = 0.5;
3888 bool res = FALSE;
3889 int intsize = fldsize - (value < 0 ? 1 : 0);
3890
3891 if (frcsize & 256)
3892 intsize--;
3893 frcsize &= 255;
3894 intsize -= frcsize;
3895
3896 while (intsize--) pwr *= 10.0;
3897 while (frcsize--) eps /= 10.0;
3898
3899 if( value >= 0 ){
3900 if (value + eps >= pwr)
3901 res = TRUE;
3902 } else {
3903 if (value - eps <= -pwr)
3904 res = TRUE;
3905 }
3906 return res;
a0d0e21e 3907}
4e35701f 3908
bbed91b5 3909static I32
acfe0abc 3910run_user_filter(pTHX_ int idx, SV *buf_sv, int maxlen)
bbed91b5 3911{
27da23d5 3912 dVAR;
bbed91b5 3913 SV *datasv = FILTER_DATA(idx);
504618e9 3914 const int filter_has_file = IoLINES(datasv);
bbed91b5
KF
3915 GV *filter_child_proc = (GV *)IoFMT_GV(datasv);
3916 SV *filter_state = (SV *)IoTOP_GV(datasv);
3917 SV *filter_sub = (SV *)IoBOTTOM_GV(datasv);
3918 int len = 0;
3919
3920 /* I was having segfault trouble under Linux 2.2.5 after a
3921 parse error occured. (Had to hack around it with a test
3922 for PL_error_count == 0.) Solaris doesn't segfault --
3923 not sure where the trouble is yet. XXX */
3924
3925 if (filter_has_file) {
3926 len = FILTER_READ(idx+1, buf_sv, maxlen);
3927 }
3928
3929 if (filter_sub && len >= 0) {
39644a26 3930 dSP;
bbed91b5
KF
3931 int count;
3932
3933 ENTER;
3934 SAVE_DEFSV;
3935 SAVETMPS;
3936 EXTEND(SP, 2);
3937
3938 DEFSV = buf_sv;
3939 PUSHMARK(SP);
3940 PUSHs(sv_2mortal(newSViv(maxlen)));
3941 if (filter_state) {
3942 PUSHs(filter_state);
3943 }
3944 PUTBACK;
3945 count = call_sv(filter_sub, G_SCALAR);
3946 SPAGAIN;
3947
3948 if (count > 0) {
3949 SV *out = POPs;
3950 if (SvOK(out)) {
3951 len = SvIV(out);
3952 }
3953 }
3954
3955 PUTBACK;
3956 FREETMPS;
3957 LEAVE;
3958 }
3959
3960 if (len <= 0) {
3961 IoLINES(datasv) = 0;
3962 if (filter_child_proc) {
3963 SvREFCNT_dec(filter_child_proc);
3964 IoFMT_GV(datasv) = Nullgv;
3965 }
3966 if (filter_state) {
3967 SvREFCNT_dec(filter_state);
3968 IoTOP_GV(datasv) = Nullgv;
3969 }
3970 if (filter_sub) {
3971 SvREFCNT_dec(filter_sub);
3972 IoBOTTOM_GV(datasv) = Nullgv;
3973 }
3974 filter_del(run_user_filter);
3975 }
3976
3977 return len;
3978}
84d4ea48 3979
be4b629d
CN
3980/* perhaps someone can come up with a better name for
3981 this? it is not really "absolute", per se ... */
cf42f822 3982static bool
06b5626a 3983S_path_is_absolute(pTHX_ const char *name)
be4b629d
CN
3984{
3985 if (PERL_FILE_IS_ABSOLUTE(name)
3986#ifdef MACOS_TRADITIONAL
67627c52 3987 || (*name == ':'))
be4b629d
CN
3988#else
3989 || (*name == '.' && (name[1] == '/' ||
3990 (name[1] == '.' && name[2] == '/'))))
3991#endif
3992 {
3993 return TRUE;
3994 }
3995 else
3996 return FALSE;
3997}
241d1a3b
NC
3998
3999/*
4000 * Local variables:
4001 * c-indentation-style: bsd
4002 * c-basic-offset: 4
4003 * indent-tabs-mode: t
4004 * End:
4005 *
37442d52
RGS
4006 * ex: set ts=8 sts=4 sw=4 noet:
4007 */