This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
handy.h: White space only
[perl5.git] / pp_ctl.c
CommitLineData
a0d0e21e
LW
1/* pp_ctl.c
2 *
1129b882
NC
3 * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
4 * 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 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/*
4ac71550
TC
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 * [Bilbo on p.35 of _The Lord of the Rings_, I/i: "A Long-Expected Party"]
a0d0e21e
LW
20 */
21
166f8a29
DM
22/* This file contains control-oriented pp ("push/pop") functions that
23 * execute the opcodes that make up a perl program. A typical pp function
24 * expects to find its arguments on the stack, and usually pushes its
25 * results onto the stack, hence the 'pp' terminology. Each OP structure
26 * contains a pointer to the relevant pp_foo() function.
27 *
28 * Control-oriented means things like pp_enteriter() and pp_next(), which
29 * alter the flow of control of the program.
30 */
31
32
a0d0e21e 33#include "EXTERN.h"
864dbfa3 34#define PERL_IN_PP_CTL_C
a0d0e21e
LW
35#include "perl.h"
36
54310121 37#define DOCATCH(o) ((CATCH_GET == TRUE) ? docatch(o) : (o))
1e422769 38
94fcd414
NC
39#define dopoptosub(plop) dopoptosub_at(cxstack, (plop))
40
a0d0e21e
LW
41PP(pp_wantarray)
42{
97aff369 43 dVAR;
39644a26 44 dSP;
a0d0e21e 45 I32 cxix;
93f0bc49 46 const PERL_CONTEXT *cx;
a0d0e21e
LW
47 EXTEND(SP, 1);
48
93f0bc49
FC
49 if (PL_op->op_private & OPpOFFBYONE) {
50 if (!(cx = caller_cx(1,NULL))) RETPUSHUNDEF;
51 }
52 else {
53 cxix = dopoptosub(cxstack_ix);
54 if (cxix < 0)
a0d0e21e 55 RETPUSHUNDEF;
93f0bc49
FC
56 cx = &cxstack[cxix];
57 }
a0d0e21e 58
93f0bc49 59 switch (cx->blk_gimme) {
54310121 60 case G_ARRAY:
a0d0e21e 61 RETPUSHYES;
54310121 62 case G_SCALAR:
a0d0e21e 63 RETPUSHNO;
54310121 64 default:
65 RETPUSHUNDEF;
66 }
a0d0e21e
LW
67}
68
2cd61cdb
IZ
69PP(pp_regcreset)
70{
97aff369 71 dVAR;
0b4182de 72 TAINT_NOT;
2cd61cdb
IZ
73 return NORMAL;
74}
75
b3eb6a9b
GS
76PP(pp_regcomp)
77{
97aff369 78 dVAR;
39644a26 79 dSP;
eb578fdb 80 PMOP *pm = (PMOP*)cLOGOP->op_other;
9f141731 81 SV **args;
df787a7b 82 int nargs;
84679df5 83 REGEXP *re = NULL;
9f141731
DM
84 REGEXP *new_re;
85 const regexp_engine *eng;
76ac488f 86 bool is_bare_re;
bfed75c6 87
df787a7b
DM
88 if (PL_op->op_flags & OPf_STACKED) {
89 dMARK;
90 nargs = SP - MARK;
91 args = ++MARK;
92 }
93 else {
94 nargs = 1;
95 args = SP;
96 }
97
4b5a0d1c 98 /* prevent recompiling under /o and ithreads. */
3db8f154 99#if defined(USE_ITHREADS)
131b3ad0 100 if (pm->op_pmflags & PMf_KEEP && PM_GETRE(pm)) {
df787a7b 101 SP = args-1;
131b3ad0
DM
102 RETURN;
103 }
513629ba 104#endif
d4b87e75 105
9f141731
DM
106 re = PM_GETRE(pm);
107 assert (re != (REGEXP*) &PL_sv_undef);
108 eng = re ? RX_ENGINE(re) : current_re_engine();
109
3c13cae6
DM
110 new_re = (eng->op_comp
111 ? eng->op_comp
112 : &Perl_re_op_compile
113 )(aTHX_ args, nargs, pm->op_code_list, eng, re,
346d3070 114 &is_bare_re,
514a91f1 115 (pm->op_pmflags & RXf_PMf_COMPILETIME),
a5ae69f0
DM
116 pm->op_pmflags |
117 (PL_op->op_flags & OPf_SPECIAL ? PMf_USE_RE_EVAL : 0));
346d3070 118 if (pm->op_pmflags & PMf_HAS_CV)
8d919b0a 119 ReANY(new_re)->qr_anoncv
9fe3265f 120 = (CV*) SvREFCNT_inc(PAD_SV(PL_op->op_targ));
9f141731
DM
121
122 if (is_bare_re) {
123 REGEXP *tmp;
124 /* The match's LHS's get-magic might need to access this op's regexp
125 (e.g. $' =~ /$re/ while foo; see bug 70764). So we must call
126 get-magic now before we replace the regexp. Hopefully this hack can
127 be replaced with the approach described at
128 http://www.nntp.perl.org/group/perl.perl5.porters/2007/03/msg122415.html
129 some day. */
130 if (pm->op_type == OP_MATCH) {
131 SV *lhs;
284167a5 132 const bool was_tainted = TAINT_get;
9f141731
DM
133 if (pm->op_flags & OPf_STACKED)
134 lhs = args[-1];
135 else if (pm->op_private & OPpTARGET_MY)
136 lhs = PAD_SV(pm->op_targ);
137 else lhs = DEFSV;
138 SvGETMAGIC(lhs);
139 /* Restore the previous value of PL_tainted (which may have been
140 modified by get-magic), to avoid incorrectly setting the
284167a5
S
141 RXf_TAINTED flag with RX_TAINT_on further down. */
142 TAINT_set(was_tainted);
df787a7b 143 }
9f141731
DM
144 tmp = reg_temp_copy(NULL, new_re);
145 ReREFCNT_dec(new_re);
146 new_re = tmp;
df787a7b 147 }
9f141731
DM
148 if (re != new_re) {
149 ReREFCNT_dec(re);
150 PM_SETRE(pm, new_re);
c277df42 151 }
d4b87e75 152
72311751 153#ifndef INCOMPLETE_TAINTS
284167a5 154 if (TAINTING_get && TAINT_get) {
9f141731 155 SvTAINTED_on((SV*)new_re);
284167a5 156 RX_TAINT_on(new_re);
72311751
GS
157 }
158#endif
159
c737faaf
YO
160#if !defined(USE_ITHREADS)
161 /* can't change the optree at runtime either */
162 /* PMf_KEEP is handled differently under threads to avoid these problems */
9f141731
DM
163 if (!RX_PRELEN(PM_GETRE(pm)) && PL_curpm)
164 pm = PL_curpm;
a0d0e21e 165 if (pm->op_pmflags & PMf_KEEP) {
c90c0ff4 166 pm->op_private &= ~OPpRUNTIME; /* no point compiling again */
533c011a 167 cLOGOP->op_first->op_next = PL_op->op_next;
a0d0e21e 168 }
c737faaf 169#endif
9f141731 170
df787a7b 171 SP = args-1;
a0d0e21e
LW
172 RETURN;
173}
174
9f141731 175
a0d0e21e
LW
176PP(pp_substcont)
177{
97aff369 178 dVAR;
39644a26 179 dSP;
eb578fdb
KW
180 PERL_CONTEXT *cx = &cxstack[cxstack_ix];
181 PMOP * const pm = (PMOP*) cLOGOP->op_other;
182 SV * const dstr = cx->sb_dstr;
183 char *s = cx->sb_s;
184 char *m = cx->sb_m;
a0d0e21e 185 char *orig = cx->sb_orig;
eb578fdb 186 REGEXP * const rx = cx->sb_rx;
c445ea15 187 SV *nsv = NULL;
988e6e7e 188 REGEXP *old = PM_GETRE(pm);
f410a211
NC
189
190 PERL_ASYNC_CHECK();
191
988e6e7e 192 if(old != rx) {
bfed75c6 193 if(old)
988e6e7e 194 ReREFCNT_dec(old);
d6106309 195 PM_SETRE(pm,ReREFCNT_inc(rx));
d8f2cf8a
AB
196 }
197
d9f97599 198 rxres_restore(&cx->sb_rxres, rx);
01b35787 199 RX_MATCH_UTF8_set(rx, DO_UTF8(cx->sb_targ));
c90c0ff4 200
a0d0e21e 201 if (cx->sb_iters++) {
a3b680e6 202 const I32 saviters = cx->sb_iters;
a0d0e21e 203 if (cx->sb_iters > cx->sb_maxiters)
cea2e8a9 204 DIE(aTHX_ "Substitution loop");
a0d0e21e 205
447ee134
DM
206 SvGETMAGIC(TOPs); /* possibly clear taint on $1 etc: #67962 */
207
ef07e810 208 /* See "how taint works" above pp_subst() */
20be6587
DM
209 if (SvTAINTED(TOPs))
210 cx->sb_rxtainted |= SUBST_TAINT_REPL;
447ee134 211 sv_catsv_nomg(dstr, POPs);
2c296965
YO
212 /* XXX: adjust for positive offsets of \G for instance s/(.)\G//g with positive pos() */
213 s -= RX_GOFS(rx);
a0d0e21e
LW
214
215 /* Are we done */
2c296965
YO
216 if (CxONCE(cx) || s < orig ||
217 !CALLREGEXEC(rx, s, cx->sb_strend, orig,
218 (s == m) + RX_GOFS(rx), cx->sb_targ, NULL,
fbfb1899 219 (REXEC_IGNOREPOS|REXEC_NOT_FIRST)))
a0d0e21e 220 {
8ca8a454 221 SV *targ = cx->sb_targ;
748a9306 222
078c425b
JH
223 assert(cx->sb_strend >= s);
224 if(cx->sb_strend > s) {
225 if (DO_UTF8(dstr) && !SvUTF8(targ))
4bac9ae4 226 sv_catpvn_nomg_utf8_upgrade(dstr, s, cx->sb_strend - s, nsv);
078c425b 227 else
4bac9ae4 228 sv_catpvn_nomg(dstr, s, cx->sb_strend - s);
078c425b 229 }
20be6587
DM
230 if (RX_MATCH_TAINTED(rx)) /* run time pattern taint, eg locale */
231 cx->sb_rxtainted |= SUBST_TAINT_PAT;
9212bbba 232
8ca8a454
NC
233 if (pm->op_pmflags & PMf_NONDESTRUCT) {
234 PUSHs(dstr);
235 /* From here on down we're using the copy, and leaving the
236 original untouched. */
237 targ = dstr;
238 }
239 else {
8ca8a454
NC
240 if (SvIsCOW(targ)) {
241 sv_force_normal_flags(targ, SV_COW_DROP_PV);
242 } else
8ca8a454
NC
243 {
244 SvPV_free(targ);
245 }
246 SvPV_set(targ, SvPVX(dstr));
247 SvCUR_set(targ, SvCUR(dstr));
248 SvLEN_set(targ, SvLEN(dstr));
249 if (DO_UTF8(dstr))
250 SvUTF8_on(targ);
251 SvPV_set(dstr, NULL);
252
52c47e16 253 PL_tainted = 0;
4f4d7508 254 mPUSHi(saviters - 1);
48c036b1 255
8ca8a454
NC
256 (void)SvPOK_only_UTF8(targ);
257 }
5cd24f17 258
20be6587 259 /* update the taint state of various various variables in
ef07e810
DM
260 * preparation for final exit.
261 * See "how taint works" above pp_subst() */
284167a5 262 if (TAINTING_get) {
20be6587
DM
263 if ((cx->sb_rxtainted & SUBST_TAINT_PAT) ||
264 ((cx->sb_rxtainted & (SUBST_TAINT_STR|SUBST_TAINT_RETAINT))
265 == (SUBST_TAINT_STR|SUBST_TAINT_RETAINT))
266 )
267 (RX_MATCH_TAINTED_on(rx)); /* taint $1 et al */
268
269 if (!(cx->sb_rxtainted & SUBST_TAINT_BOOLRET)
270 && (cx->sb_rxtainted & (SUBST_TAINT_STR|SUBST_TAINT_PAT))
271 )
272 SvTAINTED_on(TOPs); /* taint return value */
273 /* needed for mg_set below */
284167a5
S
274 TAINT_set(
275 cBOOL(cx->sb_rxtainted &
276 (SUBST_TAINT_STR|SUBST_TAINT_PAT|SUBST_TAINT_REPL))
277 );
20be6587
DM
278 SvTAINT(TARG);
279 }
280 /* PL_tainted must be correctly set for this mg_set */
281 SvSETMAGIC(TARG);
282 TAINT_NOT;
4633a7c4 283 LEAVE_SCOPE(cx->sb_oldsave);
a0d0e21e
LW
284 POPSUBST(cx);
285 RETURNOP(pm->op_next);
118e2215 286 assert(0); /* NOTREACHED */
a0d0e21e 287 }
8e5e9ebe 288 cx->sb_iters = saviters;
a0d0e21e 289 }
07bc277f 290 if (RX_MATCH_COPIED(rx) && RX_SUBBEG(rx) != orig) {
a0d0e21e
LW
291 m = s;
292 s = orig;
6502e081 293 assert(!RX_SUBOFFSET(rx));
07bc277f 294 cx->sb_orig = orig = RX_SUBBEG(rx);
a0d0e21e
LW
295 s = orig + (m - s);
296 cx->sb_strend = s + (cx->sb_strend - m);
297 }
07bc277f 298 cx->sb_m = m = RX_OFFS(rx)[0].start + orig;
db79b45b 299 if (m > s) {
bfed75c6 300 if (DO_UTF8(dstr) && !SvUTF8(cx->sb_targ))
4bac9ae4 301 sv_catpvn_nomg_utf8_upgrade(dstr, s, m - s, nsv);
db79b45b 302 else
4bac9ae4 303 sv_catpvn_nomg(dstr, s, m-s);
db79b45b 304 }
07bc277f 305 cx->sb_s = RX_OFFS(rx)[0].end + orig;
084916e3 306 { /* Update the pos() information. */
8ca8a454
NC
307 SV * const sv
308 = (pm->op_pmflags & PMf_NONDESTRUCT) ? cx->sb_dstr : cx->sb_targ;
084916e3 309 MAGIC *mg;
7a7f3e45 310 SvUPGRADE(sv, SVt_PVMG);
14befaf4 311 if (!(mg = mg_find(sv, PERL_MAGIC_regex_global))) {
d83f0a82 312#ifdef PERL_OLD_COPY_ON_WRITE
51a9ea20 313 if (SvIsCOW(sv))
d83f0a82
NC
314 sv_force_normal_flags(sv, 0);
315#endif
316 mg = sv_magicext(sv, NULL, PERL_MAGIC_regex_global, &PL_vtbl_mglob,
317 NULL, 0);
084916e3 318 }
ce474962 319 mg->mg_len = m - orig;
084916e3 320 }
988e6e7e 321 if (old != rx)
d6106309 322 (void)ReREFCNT_inc(rx);
20be6587 323 /* update the taint state of various various variables in preparation
ef07e810
DM
324 * for calling the code block.
325 * See "how taint works" above pp_subst() */
284167a5 326 if (TAINTING_get) {
20be6587
DM
327 if (RX_MATCH_TAINTED(rx)) /* run time pattern taint, eg locale */
328 cx->sb_rxtainted |= SUBST_TAINT_PAT;
329
330 if ((cx->sb_rxtainted & SUBST_TAINT_PAT) ||
331 ((cx->sb_rxtainted & (SUBST_TAINT_STR|SUBST_TAINT_RETAINT))
332 == (SUBST_TAINT_STR|SUBST_TAINT_RETAINT))
333 )
334 (RX_MATCH_TAINTED_on(rx)); /* taint $1 et al */
335
336 if (cx->sb_iters > 1 && (cx->sb_rxtainted &
337 (SUBST_TAINT_STR|SUBST_TAINT_PAT|SUBST_TAINT_REPL)))
8ca8a454
NC
338 SvTAINTED_on((pm->op_pmflags & PMf_NONDESTRUCT)
339 ? cx->sb_dstr : cx->sb_targ);
20be6587
DM
340 TAINT_NOT;
341 }
d9f97599 342 rxres_save(&cx->sb_rxres, rx);
af9838cc 343 PL_curpm = pm;
29f2e912 344 RETURNOP(pm->op_pmstashstartu.op_pmreplstart);
a0d0e21e
LW
345}
346
c90c0ff4 347void
864dbfa3 348Perl_rxres_save(pTHX_ void **rsp, REGEXP *rx)
c90c0ff4 349{
350 UV *p = (UV*)*rsp;
351 U32 i;
7918f24d
NC
352
353 PERL_ARGS_ASSERT_RXRES_SAVE;
96a5add6 354 PERL_UNUSED_CONTEXT;
c90c0ff4 355
07bc277f 356 if (!p || p[1] < RX_NPARENS(rx)) {
db2c6cb3 357#ifdef PERL_ANY_COW
6502e081 358 i = 7 + (RX_NPARENS(rx)+1) * 2;
ed252734 359#else
6502e081 360 i = 6 + (RX_NPARENS(rx)+1) * 2;
ed252734 361#endif
c90c0ff4 362 if (!p)
a02a5408 363 Newx(p, i, UV);
c90c0ff4 364 else
365 Renew(p, i, UV);
366 *rsp = (void*)p;
367 }
368
5eabab15
DM
369 /* what (if anything) to free on croak */
370 *p++ = PTR2UV(RX_MATCH_COPIED(rx) ? RX_SUBBEG(rx) : NULL);
cf93c79d 371 RX_MATCH_COPIED_off(rx);
6c31ff74 372 *p++ = RX_NPARENS(rx);
c90c0ff4 373
db2c6cb3 374#ifdef PERL_ANY_COW
bdd9a1b1
NC
375 *p++ = PTR2UV(RX_SAVED_COPY(rx));
376 RX_SAVED_COPY(rx) = NULL;
ed252734
NC
377#endif
378
07bc277f
NC
379 *p++ = PTR2UV(RX_SUBBEG(rx));
380 *p++ = (UV)RX_SUBLEN(rx);
6502e081
DM
381 *p++ = (UV)RX_SUBOFFSET(rx);
382 *p++ = (UV)RX_SUBCOFFSET(rx);
07bc277f
NC
383 for (i = 0; i <= RX_NPARENS(rx); ++i) {
384 *p++ = (UV)RX_OFFS(rx)[i].start;
385 *p++ = (UV)RX_OFFS(rx)[i].end;
c90c0ff4 386 }
387}
388
9c105995
NC
389static void
390S_rxres_restore(pTHX_ void **rsp, REGEXP *rx)
c90c0ff4 391{
392 UV *p = (UV*)*rsp;
393 U32 i;
7918f24d
NC
394
395 PERL_ARGS_ASSERT_RXRES_RESTORE;
96a5add6 396 PERL_UNUSED_CONTEXT;
c90c0ff4 397
ed252734 398 RX_MATCH_COPY_FREE(rx);
cf93c79d 399 RX_MATCH_COPIED_set(rx, *p);
c90c0ff4 400 *p++ = 0;
6c31ff74 401 RX_NPARENS(rx) = *p++;
c90c0ff4 402
db2c6cb3 403#ifdef PERL_ANY_COW
bdd9a1b1
NC
404 if (RX_SAVED_COPY(rx))
405 SvREFCNT_dec (RX_SAVED_COPY(rx));
406 RX_SAVED_COPY(rx) = INT2PTR(SV*,*p);
ed252734
NC
407 *p++ = 0;
408#endif
409
07bc277f
NC
410 RX_SUBBEG(rx) = INT2PTR(char*,*p++);
411 RX_SUBLEN(rx) = (I32)(*p++);
6502e081
DM
412 RX_SUBOFFSET(rx) = (I32)*p++;
413 RX_SUBCOFFSET(rx) = (I32)*p++;
07bc277f
NC
414 for (i = 0; i <= RX_NPARENS(rx); ++i) {
415 RX_OFFS(rx)[i].start = (I32)(*p++);
416 RX_OFFS(rx)[i].end = (I32)(*p++);
c90c0ff4 417 }
418}
419
9c105995
NC
420static void
421S_rxres_free(pTHX_ void **rsp)
c90c0ff4 422{
44f8325f 423 UV * const p = (UV*)*rsp;
7918f24d
NC
424
425 PERL_ARGS_ASSERT_RXRES_FREE;
96a5add6 426 PERL_UNUSED_CONTEXT;
c90c0ff4 427
428 if (p) {
94010e71 429 void *tmp = INT2PTR(char*,*p);
6c31ff74 430#ifdef PERL_POISON
db2c6cb3 431#ifdef PERL_ANY_COW
6c31ff74 432 U32 i = 9 + p[1] * 2;
94010e71 433#else
6c31ff74 434 U32 i = 8 + p[1] * 2;
94010e71 435#endif
6c31ff74
NC
436#endif
437
db2c6cb3 438#ifdef PERL_ANY_COW
6c31ff74 439 SvREFCNT_dec (INT2PTR(SV*,p[2]));
ed252734 440#endif
6c31ff74
NC
441#ifdef PERL_POISON
442 PoisonFree(p, i, sizeof(UV));
443#endif
444
445 Safefree(tmp);
c90c0ff4 446 Safefree(p);
4608196e 447 *rsp = NULL;
c90c0ff4 448 }
449}
450
a701009a
DM
451#define FORM_NUM_BLANK (1<<30)
452#define FORM_NUM_POINT (1<<29)
453
a0d0e21e
LW
454PP(pp_formline)
455{
97aff369 456 dVAR; dSP; dMARK; dORIGMARK;
eb578fdb 457 SV * const tmpForm = *++MARK;
086b26f3 458 SV *formsv; /* contains text of original format */
eb578fdb
KW
459 U32 *fpc; /* format ops program counter */
460 char *t; /* current append position in target string */
086b26f3 461 const char *f; /* current position in format string */
eb578fdb
KW
462 I32 arg;
463 SV *sv = NULL; /* current item */
086b26f3
DM
464 const char *item = NULL;/* string value of current item */
465 I32 itemsize = 0; /* length of current item, possibly truncated */
466 I32 fieldsize = 0; /* width of current field */
467 I32 lines = 0; /* number of lines that have been output */
468 bool chopspace = (strchr(PL_chopset, ' ') != NULL); /* does $: have space */
469 const char *chophere = NULL; /* where to chop current item */
f5ada144 470 STRLEN linemark = 0; /* pos of start of line in output */
65202027 471 NV value;
086b26f3 472 bool gotsome = FALSE; /* seen at least one non-blank item on this line */
a0d0e21e 473 STRLEN len;
26e935cf 474 STRLEN linemax; /* estimate of output size in bytes */
1bd51a4c
IH
475 bool item_is_utf8 = FALSE;
476 bool targ_is_utf8 = FALSE;
bfed75c6 477 const char *fmt;
74e0ddf7 478 MAGIC *mg = NULL;
4ff700b9
DM
479 U8 *source; /* source of bytes to append */
480 STRLEN to_copy; /* how may bytes to append */
ea60cfe8 481 char trans; /* what chars to translate */
74e0ddf7 482
3808a683 483 mg = doparseform(tmpForm);
a0d0e21e 484
74e0ddf7 485 fpc = (U32*)mg->mg_ptr;
3808a683
DM
486 /* the actual string the format was compiled from.
487 * with overload etc, this may not match tmpForm */
488 formsv = mg->mg_obj;
489
74e0ddf7 490
3280af22 491 SvPV_force(PL_formtarget, len);
3808a683 492 if (SvTAINTED(tmpForm) || SvTAINTED(formsv))
125b9982 493 SvTAINTED_on(PL_formtarget);
1bd51a4c
IH
494 if (DO_UTF8(PL_formtarget))
495 targ_is_utf8 = TRUE;
26e935cf
DM
496 linemax = (SvCUR(formsv) * (IN_BYTES ? 1 : 3) + 1);
497 t = SvGROW(PL_formtarget, len + linemax + 1);
498 /* XXX from now onwards, SvCUR(PL_formtarget) is invalid */
a0d0e21e 499 t += len;
3808a683 500 f = SvPV_const(formsv, len);
a0d0e21e
LW
501
502 for (;;) {
503 DEBUG_f( {
bfed75c6 504 const char *name = "???";
a0d0e21e
LW
505 arg = -1;
506 switch (*fpc) {
507 case FF_LITERAL: arg = fpc[1]; name = "LITERAL"; break;
508 case FF_BLANK: arg = fpc[1]; name = "BLANK"; break;
509 case FF_SKIP: arg = fpc[1]; name = "SKIP"; break;
510 case FF_FETCH: arg = fpc[1]; name = "FETCH"; break;
511 case FF_DECIMAL: arg = fpc[1]; name = "DECIMAL"; break;
512
513 case FF_CHECKNL: name = "CHECKNL"; break;
514 case FF_CHECKCHOP: name = "CHECKCHOP"; break;
515 case FF_SPACE: name = "SPACE"; break;
516 case FF_HALFSPACE: name = "HALFSPACE"; break;
517 case FF_ITEM: name = "ITEM"; break;
518 case FF_CHOP: name = "CHOP"; break;
519 case FF_LINEGLOB: name = "LINEGLOB"; break;
520 case FF_NEWLINE: name = "NEWLINE"; break;
521 case FF_MORE: name = "MORE"; break;
522 case FF_LINEMARK: name = "LINEMARK"; break;
523 case FF_END: name = "END"; break;
bfed75c6 524 case FF_0DECIMAL: name = "0DECIMAL"; break;
a1b95068 525 case FF_LINESNGL: name = "LINESNGL"; break;
a0d0e21e
LW
526 }
527 if (arg >= 0)
bf49b057 528 PerlIO_printf(Perl_debug_log, "%-16s%ld\n", name, (long) arg);
a0d0e21e 529 else
bf49b057 530 PerlIO_printf(Perl_debug_log, "%-16s\n", name);
5f80b19c 531 } );
a0d0e21e
LW
532 switch (*fpc++) {
533 case FF_LINEMARK:
f5ada144 534 linemark = t - SvPVX(PL_formtarget);
a0d0e21e
LW
535 lines++;
536 gotsome = FALSE;
537 break;
538
539 case FF_LITERAL:
ea60cfe8
DM
540 to_copy = *fpc++;
541 source = (U8 *)f;
542 f += to_copy;
543 trans = '~';
75645721 544 item_is_utf8 = targ_is_utf8 ? !!DO_UTF8(formsv) : !!SvUTF8(formsv);
ea60cfe8 545 goto append;
a0d0e21e
LW
546
547 case FF_SKIP:
548 f += *fpc++;
549 break;
550
551 case FF_FETCH:
552 arg = *fpc++;
553 f += arg;
554 fieldsize = arg;
555
556 if (MARK < SP)
557 sv = *++MARK;
558 else {
3280af22 559 sv = &PL_sv_no;
a2a5de95 560 Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX), "Not enough format arguments");
a0d0e21e 561 }
125b9982
NT
562 if (SvTAINTED(sv))
563 SvTAINTED_on(PL_formtarget);
a0d0e21e
LW
564 break;
565
566 case FF_CHECKNL:
5a34cab7
NC
567 {
568 const char *send;
569 const char *s = item = SvPV_const(sv, len);
570 itemsize = len;
571 if (DO_UTF8(sv)) {
572 itemsize = sv_len_utf8(sv);
573 if (itemsize != (I32)len) {
574 I32 itembytes;
575 if (itemsize > fieldsize) {
576 itemsize = fieldsize;
577 itembytes = itemsize;
578 sv_pos_u2b(sv, &itembytes, 0);
579 }
580 else
581 itembytes = len;
582 send = chophere = s + itembytes;
583 while (s < send) {
584 if (*s & ~31)
585 gotsome = TRUE;
586 else if (*s == '\n')
587 break;
588 s++;
589 }
590 item_is_utf8 = TRUE;
591 itemsize = s - item;
592 sv_pos_b2u(sv, &itemsize);
593 break;
a0ed51b3 594 }
a0ed51b3 595 }
5a34cab7
NC
596 item_is_utf8 = FALSE;
597 if (itemsize > fieldsize)
598 itemsize = fieldsize;
599 send = chophere = s + itemsize;
600 while (s < send) {
601 if (*s & ~31)
602 gotsome = TRUE;
603 else if (*s == '\n')
604 break;
605 s++;
606 }
607 itemsize = s - item;
608 break;
a0ed51b3 609 }
a0d0e21e
LW
610
611 case FF_CHECKCHOP:
5a34cab7
NC
612 {
613 const char *s = item = SvPV_const(sv, len);
614 itemsize = len;
615 if (DO_UTF8(sv)) {
616 itemsize = sv_len_utf8(sv);
617 if (itemsize != (I32)len) {
618 I32 itembytes;
619 if (itemsize <= fieldsize) {
620 const char *send = chophere = s + itemsize;
621 while (s < send) {
622 if (*s == '\r') {
623 itemsize = s - item;
a0ed51b3 624 chophere = s;
a0ed51b3 625 break;
5a34cab7
NC
626 }
627 if (*s++ & ~31)
a0ed51b3 628 gotsome = TRUE;
a0ed51b3 629 }
a0ed51b3 630 }
5a34cab7
NC
631 else {
632 const char *send;
633 itemsize = fieldsize;
634 itembytes = itemsize;
635 sv_pos_u2b(sv, &itembytes, 0);
636 send = chophere = s + itembytes;
637 while (s < send || (s == send && isSPACE(*s))) {
638 if (isSPACE(*s)) {
639 if (chopspace)
640 chophere = s;
641 if (*s == '\r')
642 break;
643 }
644 else {
645 if (*s & ~31)
646 gotsome = TRUE;
647 if (strchr(PL_chopset, *s))
648 chophere = s + 1;
649 }
650 s++;
651 }
652 itemsize = chophere - item;
653 sv_pos_b2u(sv, &itemsize);
654 }
655 item_is_utf8 = TRUE;
a0d0e21e
LW
656 break;
657 }
a0d0e21e 658 }
5a34cab7
NC
659 item_is_utf8 = FALSE;
660 if (itemsize <= fieldsize) {
661 const char *const send = chophere = s + itemsize;
662 while (s < send) {
663 if (*s == '\r') {
664 itemsize = s - item;
a0d0e21e 665 chophere = s;
a0d0e21e 666 break;
5a34cab7
NC
667 }
668 if (*s++ & ~31)
a0d0e21e 669 gotsome = TRUE;
a0d0e21e 670 }
a0d0e21e 671 }
5a34cab7
NC
672 else {
673 const char *send;
674 itemsize = fieldsize;
675 send = chophere = s + itemsize;
676 while (s < send || (s == send && isSPACE(*s))) {
677 if (isSPACE(*s)) {
678 if (chopspace)
679 chophere = s;
680 if (*s == '\r')
681 break;
682 }
683 else {
684 if (*s & ~31)
685 gotsome = TRUE;
686 if (strchr(PL_chopset, *s))
687 chophere = s + 1;
688 }
689 s++;
690 }
691 itemsize = chophere - item;
692 }
693 break;
a0d0e21e 694 }
a0d0e21e
LW
695
696 case FF_SPACE:
697 arg = fieldsize - itemsize;
698 if (arg) {
699 fieldsize -= arg;
700 while (arg-- > 0)
701 *t++ = ' ';
702 }
703 break;
704
705 case FF_HALFSPACE:
706 arg = fieldsize - itemsize;
707 if (arg) {
708 arg /= 2;
709 fieldsize -= arg;
710 while (arg-- > 0)
711 *t++ = ' ';
712 }
713 break;
714
715 case FF_ITEM:
8aa7beb6
DM
716 to_copy = itemsize;
717 source = (U8 *)item;
718 trans = 1;
719 if (item_is_utf8) {
720 /* convert to_copy from chars to bytes */
721 U8 *s = source;
722 while (to_copy--)
723 s += UTF8SKIP(s);
724 to_copy = s - source;
a0d0e21e 725 }
8aa7beb6 726 goto append;
a0d0e21e
LW
727
728 case FF_CHOP:
5a34cab7
NC
729 {
730 const char *s = chophere;
731 if (chopspace) {
af68e756 732 while (isSPACE(*s))
5a34cab7
NC
733 s++;
734 }
735 sv_chop(sv,s);
736 SvSETMAGIC(sv);
737 break;
a0d0e21e 738 }
a0d0e21e 739
a1b95068
WL
740 case FF_LINESNGL:
741 chopspace = 0;
a0d0e21e 742 case FF_LINEGLOB:
5a34cab7 743 {
e32383e2 744 const bool oneline = fpc[-1] == FF_LINESNGL;
5a34cab7 745 const char *s = item = SvPV_const(sv, len);
7440a75b 746 const char *const send = s + len;
7440a75b 747
f3f2f1a3 748 item_is_utf8 = DO_UTF8(sv);
a1137ee5 749 if (!len)
7440a75b 750 break;
ea60cfe8 751 trans = 0;
0d21cefe 752 gotsome = TRUE;
a1137ee5 753 chophere = s + len;
4ff700b9
DM
754 source = (U8 *) s;
755 to_copy = len;
0d21cefe
DM
756 while (s < send) {
757 if (*s++ == '\n') {
758 if (oneline) {
759 to_copy = s - SvPVX_const(sv) - 1;
760 chophere = s;
761 break;
762 } else {
763 if (s == send) {
0d21cefe
DM
764 to_copy--;
765 } else
766 lines++;
1bd51a4c 767 }
a0d0e21e 768 }
0d21cefe 769 }
a2c0032b
DM
770 }
771
ea60cfe8
DM
772 append:
773 /* append to_copy bytes from source to PL_formstring.
774 * item_is_utf8 implies source is utf8.
775 * if trans, translate certain characters during the copy */
a2c0032b
DM
776 {
777 U8 *tmp = NULL;
26e935cf 778 STRLEN grow = 0;
0325ce87
DM
779
780 SvCUR_set(PL_formtarget,
781 t - SvPVX_const(PL_formtarget));
782
0d21cefe
DM
783 if (targ_is_utf8 && !item_is_utf8) {
784 source = tmp = bytes_to_utf8(source, &to_copy);
0d21cefe
DM
785 } else {
786 if (item_is_utf8 && !targ_is_utf8) {
f5ada144 787 U8 *s;
0d21cefe 788 /* Upgrade targ to UTF8, and then we reduce it to
0325ce87
DM
789 a problem we have a simple solution for.
790 Don't need get magic. */
0d21cefe 791 sv_utf8_upgrade_nomg(PL_formtarget);
0325ce87 792 targ_is_utf8 = TRUE;
f5ada144
DM
793 /* re-calculate linemark */
794 s = (U8*)SvPVX(PL_formtarget);
26e935cf
DM
795 /* the bytes we initially allocated to append the
796 * whole line may have been gobbled up during the
797 * upgrade, so allocate a whole new line's worth
798 * for safety */
799 grow = linemax;
f5ada144
DM
800 while (linemark--)
801 s += UTF8SKIP(s);
802 linemark = s - (U8*)SvPVX(PL_formtarget);
e8e72d41 803 }
0d21cefe
DM
804 /* Easy. They agree. */
805 assert (item_is_utf8 == targ_is_utf8);
806 }
26e935cf
DM
807 if (!trans)
808 /* @* and ^* are the only things that can exceed
809 * the linemax, so grow by the output size, plus
810 * a whole new form's worth in case of any further
811 * output */
812 grow = linemax + to_copy;
813 if (grow)
814 SvGROW(PL_formtarget, SvCUR(PL_formtarget) + grow + 1);
0d21cefe
DM
815 t = SvPVX(PL_formtarget) + SvCUR(PL_formtarget);
816
817 Copy(source, t, to_copy, char);
ea60cfe8 818 if (trans) {
8aa7beb6
DM
819 /* blank out ~ or control chars, depending on trans.
820 * works on bytes not chars, so relies on not
821 * matching utf8 continuation bytes */
ea60cfe8
DM
822 U8 *s = (U8*)t;
823 U8 *send = s + to_copy;
824 while (s < send) {
8aa7beb6
DM
825 const int ch = *s;
826 if (trans == '~' ? (ch == '~') :
827#ifdef EBCDIC
828 iscntrl(ch)
829#else
830 (!(ch & ~31))
831#endif
832 )
ea60cfe8
DM
833 *s = ' ';
834 s++;
835 }
836 }
837
0d21cefe
DM
838 t += to_copy;
839 SvCUR_set(PL_formtarget, SvCUR(PL_formtarget) + to_copy);
a1137ee5 840 if (tmp)
0d21cefe 841 Safefree(tmp);
5a34cab7 842 break;
a0d0e21e 843 }
a0d0e21e 844
a1b95068
WL
845 case FF_0DECIMAL:
846 arg = *fpc++;
847#if defined(USE_LONG_DOUBLE)
10edeb5d 848 fmt = (const char *)
a701009a 849 ((arg & FORM_NUM_POINT) ?
10edeb5d 850 "%#0*.*" PERL_PRIfldbl : "%0*.*" PERL_PRIfldbl);
a1b95068 851#else
10edeb5d 852 fmt = (const char *)
a701009a 853 ((arg & FORM_NUM_POINT) ?
10edeb5d 854 "%#0*.*f" : "%0*.*f");
a1b95068
WL
855#endif
856 goto ff_dec;
a0d0e21e 857 case FF_DECIMAL:
a0d0e21e 858 arg = *fpc++;
65202027 859#if defined(USE_LONG_DOUBLE)
10edeb5d 860 fmt = (const char *)
a701009a 861 ((arg & FORM_NUM_POINT) ? "%#*.*" PERL_PRIfldbl : "%*.*" PERL_PRIfldbl);
65202027 862#else
10edeb5d 863 fmt = (const char *)
a701009a 864 ((arg & FORM_NUM_POINT) ? "%#*.*f" : "%*.*f");
65202027 865#endif
a1b95068 866 ff_dec:
784707d5
JP
867 /* If the field is marked with ^ and the value is undefined,
868 blank it out. */
a701009a 869 if ((arg & FORM_NUM_BLANK) && !SvOK(sv)) {
784707d5
JP
870 arg = fieldsize;
871 while (arg--)
872 *t++ = ' ';
873 break;
874 }
875 gotsome = TRUE;
876 value = SvNV(sv);
a1b95068 877 /* overflow evidence */
bfed75c6 878 if (num_overflow(value, fieldsize, arg)) {
a1b95068
WL
879 arg = fieldsize;
880 while (arg--)
881 *t++ = '#';
882 break;
883 }
784707d5
JP
884 /* Formats aren't yet marked for locales, so assume "yes". */
885 {
886 STORE_NUMERIC_STANDARD_SET_LOCAL();
a701009a
DM
887 arg &= ~(FORM_NUM_POINT|FORM_NUM_BLANK);
888 my_snprintf(t, SvLEN(PL_formtarget) - (t - SvPVX(PL_formtarget)), fmt, (int) fieldsize, (int) arg, value);
784707d5
JP
889 RESTORE_NUMERIC_STANDARD();
890 }
891 t += fieldsize;
892 break;
a1b95068 893
a0d0e21e
LW
894 case FF_NEWLINE:
895 f++;
f5ada144 896 while (t-- > (SvPVX(PL_formtarget) + linemark) && *t == ' ') ;
a0d0e21e
LW
897 t++;
898 *t++ = '\n';
899 break;
900
901 case FF_BLANK:
902 arg = *fpc++;
903 if (gotsome) {
904 if (arg) { /* repeat until fields exhausted? */
11f9eeaf
DM
905 fpc--;
906 goto end;
a0d0e21e
LW
907 }
908 }
909 else {
f5ada144 910 t = SvPVX(PL_formtarget) + linemark;
a0d0e21e
LW
911 lines--;
912 }
913 break;
914
915 case FF_MORE:
5a34cab7
NC
916 {
917 const char *s = chophere;
918 const char *send = item + len;
919 if (chopspace) {
af68e756 920 while (isSPACE(*s) && (s < send))
5a34cab7 921 s++;
a0d0e21e 922 }
5a34cab7
NC
923 if (s < send) {
924 char *s1;
925 arg = fieldsize - itemsize;
926 if (arg) {
927 fieldsize -= arg;
928 while (arg-- > 0)
929 *t++ = ' ';
930 }
931 s1 = t - 3;
932 if (strnEQ(s1," ",3)) {
933 while (s1 > SvPVX_const(PL_formtarget) && isSPACE(s1[-1]))
934 s1--;
935 }
936 *s1++ = '.';
937 *s1++ = '.';
938 *s1++ = '.';
a0d0e21e 939 }
5a34cab7 940 break;
a0d0e21e 941 }
a0d0e21e 942 case FF_END:
11f9eeaf 943 end:
bf2bec63 944 assert(t < SvPVX_const(PL_formtarget) + SvLEN(PL_formtarget));
a0d0e21e 945 *t = '\0';
b15aece3 946 SvCUR_set(PL_formtarget, t - SvPVX_const(PL_formtarget));
1bd51a4c
IH
947 if (targ_is_utf8)
948 SvUTF8_on(PL_formtarget);
3280af22 949 FmLINES(PL_formtarget) += lines;
a0d0e21e 950 SP = ORIGMARK;
11f9eeaf
DM
951 if (fpc[-1] == FF_BLANK)
952 RETURNOP(cLISTOP->op_first);
953 else
954 RETPUSHYES;
a0d0e21e
LW
955 }
956 }
957}
958
959PP(pp_grepstart)
960{
27da23d5 961 dVAR; dSP;
a0d0e21e
LW
962 SV *src;
963
3280af22 964 if (PL_stack_base + *PL_markstack_ptr == SP) {
a0d0e21e 965 (void)POPMARK;
54310121 966 if (GIMME_V == G_SCALAR)
6e449a3a 967 mXPUSHi(0);
533c011a 968 RETURNOP(PL_op->op_next->op_next);
a0d0e21e 969 }
3280af22 970 PL_stack_sp = PL_stack_base + *PL_markstack_ptr + 1;
897d3989
NC
971 Perl_pp_pushmark(aTHX); /* push dst */
972 Perl_pp_pushmark(aTHX); /* push src */
d343c3ef 973 ENTER_with_name("grep"); /* enter outer scope */
a0d0e21e
LW
974
975 SAVETMPS;
59f00321
RGS
976 if (PL_op->op_private & OPpGREP_LEX)
977 SAVESPTR(PAD_SVl(PL_op->op_targ));
978 else
979 SAVE_DEFSV;
d343c3ef 980 ENTER_with_name("grep_item"); /* enter inner scope */
7766f137 981 SAVEVPTR(PL_curpm);
a0d0e21e 982
3280af22 983 src = PL_stack_base[*PL_markstack_ptr];
a0d0e21e 984 SvTEMP_off(src);
59f00321
RGS
985 if (PL_op->op_private & OPpGREP_LEX)
986 PAD_SVl(PL_op->op_targ) = src;
987 else
414bf5ae 988 DEFSV_set(src);
a0d0e21e
LW
989
990 PUTBACK;
533c011a 991 if (PL_op->op_type == OP_MAPSTART)
897d3989 992 Perl_pp_pushmark(aTHX); /* push top */
533c011a 993 return ((LOGOP*)PL_op->op_next)->op_other;
a0d0e21e
LW
994}
995
a0d0e21e
LW
996PP(pp_mapwhile)
997{
27da23d5 998 dVAR; dSP;
f54cb97a 999 const I32 gimme = GIMME_V;
544f3153 1000 I32 items = (SP - PL_stack_base) - *PL_markstack_ptr; /* how many new items */
a0d0e21e
LW
1001 I32 count;
1002 I32 shift;
1003 SV** src;
ac27b0f5 1004 SV** dst;
a0d0e21e 1005
544f3153 1006 /* first, move source pointer to the next item in the source list */
3280af22 1007 ++PL_markstack_ptr[-1];
544f3153
GS
1008
1009 /* if there are new items, push them into the destination list */
4c90a460 1010 if (items && gimme != G_VOID) {
544f3153
GS
1011 /* might need to make room back there first */
1012 if (items > PL_markstack_ptr[-1] - PL_markstack_ptr[-2]) {
1013 /* XXX this implementation is very pessimal because the stack
1014 * is repeatedly extended for every set of items. Is possible
1015 * to do this without any stack extension or copying at all
1016 * by maintaining a separate list over which the map iterates
18ef8bea 1017 * (like foreach does). --gsar */
544f3153
GS
1018
1019 /* everything in the stack after the destination list moves
1020 * towards the end the stack by the amount of room needed */
1021 shift = items - (PL_markstack_ptr[-1] - PL_markstack_ptr[-2]);
1022
1023 /* items to shift up (accounting for the moved source pointer) */
1024 count = (SP - PL_stack_base) - (PL_markstack_ptr[-1] - 1);
18ef8bea
BT
1025
1026 /* This optimization is by Ben Tilly and it does
1027 * things differently from what Sarathy (gsar)
1028 * is describing. The downside of this optimization is
1029 * that leaves "holes" (uninitialized and hopefully unused areas)
1030 * to the Perl stack, but on the other hand this
1031 * shouldn't be a problem. If Sarathy's idea gets
1032 * implemented, this optimization should become
1033 * irrelevant. --jhi */
1034 if (shift < count)
1035 shift = count; /* Avoid shifting too often --Ben Tilly */
bfed75c6 1036
924508f0
GS
1037 EXTEND(SP,shift);
1038 src = SP;
1039 dst = (SP += shift);
3280af22
NIS
1040 PL_markstack_ptr[-1] += shift;
1041 *PL_markstack_ptr += shift;
544f3153 1042 while (count--)
a0d0e21e
LW
1043 *dst-- = *src--;
1044 }
544f3153 1045 /* copy the new items down to the destination list */
ac27b0f5 1046 dst = PL_stack_base + (PL_markstack_ptr[-2] += items) - 1;
22023b26 1047 if (gimme == G_ARRAY) {
b2a2a901
DM
1048 /* add returned items to the collection (making mortal copies
1049 * if necessary), then clear the current temps stack frame
1050 * *except* for those items. We do this splicing the items
1051 * into the start of the tmps frame (so some items may be on
59d53fd6 1052 * the tmps stack twice), then moving PL_tmps_floor above
b2a2a901
DM
1053 * them, then freeing the frame. That way, the only tmps that
1054 * accumulate over iterations are the return values for map.
1055 * We have to do to this way so that everything gets correctly
1056 * freed if we die during the map.
1057 */
1058 I32 tmpsbase;
1059 I32 i = items;
1060 /* make space for the slice */
1061 EXTEND_MORTAL(items);
1062 tmpsbase = PL_tmps_floor + 1;
1063 Move(PL_tmps_stack + tmpsbase,
1064 PL_tmps_stack + tmpsbase + items,
1065 PL_tmps_ix - PL_tmps_floor,
1066 SV*);
1067 PL_tmps_ix += items;
1068
1069 while (i-- > 0) {
1070 SV *sv = POPs;
1071 if (!SvTEMP(sv))
1072 sv = sv_mortalcopy(sv);
1073 *dst-- = sv;
1074 PL_tmps_stack[tmpsbase++] = SvREFCNT_inc_simple(sv);
1075 }
1076 /* clear the stack frame except for the items */
1077 PL_tmps_floor += items;
1078 FREETMPS;
1079 /* FREETMPS may have cleared the TEMP flag on some of the items */
1080 i = items;
1081 while (i-- > 0)
1082 SvTEMP_on(PL_tmps_stack[--tmpsbase]);
22023b26 1083 }
bfed75c6 1084 else {
22023b26
TP
1085 /* scalar context: we don't care about which values map returns
1086 * (we use undef here). And so we certainly don't want to do mortal
1087 * copies of meaningless values. */
1088 while (items-- > 0) {
b988aa42 1089 (void)POPs;
22023b26
TP
1090 *dst-- = &PL_sv_undef;
1091 }
b2a2a901 1092 FREETMPS;
22023b26 1093 }
a0d0e21e 1094 }
b2a2a901
DM
1095 else {
1096 FREETMPS;
1097 }
d343c3ef 1098 LEAVE_with_name("grep_item"); /* exit inner scope */
a0d0e21e
LW
1099
1100 /* All done yet? */
3280af22 1101 if (PL_markstack_ptr[-1] > *PL_markstack_ptr) {
a0d0e21e
LW
1102
1103 (void)POPMARK; /* pop top */
d343c3ef 1104 LEAVE_with_name("grep"); /* exit outer scope */
a0d0e21e 1105 (void)POPMARK; /* pop src */
3280af22 1106 items = --*PL_markstack_ptr - PL_markstack_ptr[-1];
a0d0e21e 1107 (void)POPMARK; /* pop dst */
3280af22 1108 SP = PL_stack_base + POPMARK; /* pop original mark */
54310121 1109 if (gimme == G_SCALAR) {
7cc47870
RGS
1110 if (PL_op->op_private & OPpGREP_LEX) {
1111 SV* sv = sv_newmortal();
1112 sv_setiv(sv, items);
1113 PUSHs(sv);
1114 }
1115 else {
1116 dTARGET;
1117 XPUSHi(items);
1118 }
a0d0e21e 1119 }
54310121 1120 else if (gimme == G_ARRAY)
1121 SP += items;
a0d0e21e
LW
1122 RETURN;
1123 }
1124 else {
1125 SV *src;
1126
d343c3ef 1127 ENTER_with_name("grep_item"); /* enter inner scope */
7766f137 1128 SAVEVPTR(PL_curpm);
a0d0e21e 1129
544f3153 1130 /* set $_ to the new source item */
3280af22 1131 src = PL_stack_base[PL_markstack_ptr[-1]];
a0d0e21e 1132 SvTEMP_off(src);
59f00321
RGS
1133 if (PL_op->op_private & OPpGREP_LEX)
1134 PAD_SVl(PL_op->op_targ) = src;
1135 else
414bf5ae 1136 DEFSV_set(src);
a0d0e21e
LW
1137
1138 RETURNOP(cLOGOP->op_other);
1139 }
1140}
1141
a0d0e21e
LW
1142/* Range stuff. */
1143
1144PP(pp_range)
1145{
97aff369 1146 dVAR;
a0d0e21e 1147 if (GIMME == G_ARRAY)
1a67a97c 1148 return NORMAL;
538573f7 1149 if (SvTRUEx(PAD_SV(PL_op->op_targ)))
1a67a97c 1150 return cLOGOP->op_other;
538573f7 1151 else
1a67a97c 1152 return NORMAL;
a0d0e21e
LW
1153}
1154
1155PP(pp_flip)
1156{
97aff369 1157 dVAR;
39644a26 1158 dSP;
a0d0e21e
LW
1159
1160 if (GIMME == G_ARRAY) {
1a67a97c 1161 RETURNOP(((LOGOP*)cUNOP->op_first)->op_other);
a0d0e21e
LW
1162 }
1163 else {
1164 dTOPss;
44f8325f 1165 SV * const targ = PAD_SV(PL_op->op_targ);
bfed75c6 1166 int flip = 0;
790090df 1167
bfed75c6 1168 if (PL_op->op_private & OPpFLIP_LINENUM) {
4e3399f9
YST
1169 if (GvIO(PL_last_in_gv)) {
1170 flip = SvIV(sv) == (IV)IoLINES(GvIOp(PL_last_in_gv));
1171 }
1172 else {
fafc274c 1173 GV * const gv = gv_fetchpvs(".", GV_ADD|GV_NOTQUAL, SVt_PV);
44f8325f
AL
1174 if (gv && GvSV(gv))
1175 flip = SvIV(sv) == SvIV(GvSV(gv));
4e3399f9 1176 }
bfed75c6
AL
1177 } else {
1178 flip = SvTRUE(sv);
1179 }
1180 if (flip) {
a0d0e21e 1181 sv_setiv(PAD_SV(cUNOP->op_first->op_targ), 1);
533c011a 1182 if (PL_op->op_flags & OPf_SPECIAL) {
a0d0e21e 1183 sv_setiv(targ, 1);
3e3baf6d 1184 SETs(targ);
a0d0e21e
LW
1185 RETURN;
1186 }
1187 else {
1188 sv_setiv(targ, 0);
924508f0 1189 SP--;
1a67a97c 1190 RETURNOP(((LOGOP*)cUNOP->op_first)->op_other);
a0d0e21e
LW
1191 }
1192 }
76f68e9b 1193 sv_setpvs(TARG, "");
a0d0e21e
LW
1194 SETs(targ);
1195 RETURN;
1196 }
1197}
1198
8e9bbdb9
RGS
1199/* This code tries to decide if "$left .. $right" should use the
1200 magical string increment, or if the range is numeric (we make
1201 an exception for .."0" [#18165]). AMS 20021031. */
1202
1203#define RANGE_IS_NUMERIC(left,right) ( \
b0e74086
RGS
1204 SvNIOKp(left) || (SvOK(left) && !SvPOKp(left)) || \
1205 SvNIOKp(right) || (SvOK(right) && !SvPOKp(right)) || \
e0ab1c0e 1206 (((!SvOK(left) && SvOK(right)) || ((!SvOK(left) || \
b15aece3 1207 looks_like_number(left)) && SvPOKp(left) && *SvPVX_const(left) != '0')) \
e0ab1c0e 1208 && (!SvOK(right) || looks_like_number(right))))
8e9bbdb9 1209
a0d0e21e
LW
1210PP(pp_flop)
1211{
97aff369 1212 dVAR; dSP;
a0d0e21e
LW
1213
1214 if (GIMME == G_ARRAY) {
1215 dPOPPOPssrl;
86cb7173 1216
5b295bef
RD
1217 SvGETMAGIC(left);
1218 SvGETMAGIC(right);
a0d0e21e 1219
8e9bbdb9 1220 if (RANGE_IS_NUMERIC(left,right)) {
eb578fdb 1221 IV i, j;
901017d6 1222 IV max;
f52e41ad
FC
1223 if ((SvOK(left) && SvNV_nomg(left) < IV_MIN) ||
1224 (SvOK(right) && SvNV_nomg(right) > IV_MAX))
d470f89e 1225 DIE(aTHX_ "Range iterator outside integer range");
f52e41ad
FC
1226 i = SvIV_nomg(left);
1227 max = SvIV_nomg(right);
bbce6d69 1228 if (max >= i) {
c1ab3db2
AK
1229 j = max - i + 1;
1230 EXTEND_MORTAL(j);
1231 EXTEND(SP, j);
bbce6d69 1232 }
c1ab3db2
AK
1233 else
1234 j = 0;
1235 while (j--) {
901017d6 1236 SV * const sv = sv_2mortal(newSViv(i++));
a0d0e21e
LW
1237 PUSHs(sv);
1238 }
1239 }
1240 else {
3c323193
FC
1241 STRLEN len, llen;
1242 const char * const lpv = SvPV_nomg_const(left, llen);
f52e41ad 1243 const char * const tmps = SvPV_nomg_const(right, len);
a0d0e21e 1244
3c323193 1245 SV *sv = newSVpvn_flags(lpv, llen, SvUTF8(left)|SVs_TEMP);
89ea2908 1246 while (!SvNIOKp(sv) && SvCUR(sv) <= len) {
a0d0e21e 1247 XPUSHs(sv);
b15aece3 1248 if (strEQ(SvPVX_const(sv),tmps))
89ea2908 1249 break;
a0d0e21e
LW
1250 sv = sv_2mortal(newSVsv(sv));
1251 sv_inc(sv);
1252 }
a0d0e21e
LW
1253 }
1254 }
1255 else {
1256 dTOPss;
901017d6 1257 SV * const targ = PAD_SV(cUNOP->op_first->op_targ);
4e3399f9 1258 int flop = 0;
a0d0e21e 1259 sv_inc(targ);
4e3399f9
YST
1260
1261 if (PL_op->op_private & OPpFLIP_LINENUM) {
1262 if (GvIO(PL_last_in_gv)) {
1263 flop = SvIV(sv) == (IV)IoLINES(GvIOp(PL_last_in_gv));
1264 }
1265 else {
fafc274c 1266 GV * const gv = gv_fetchpvs(".", GV_ADD|GV_NOTQUAL, SVt_PV);
4e3399f9
YST
1267 if (gv && GvSV(gv)) flop = SvIV(sv) == SvIV(GvSV(gv));
1268 }
1269 }
1270 else {
1271 flop = SvTRUE(sv);
1272 }
1273
1274 if (flop) {
a0d0e21e 1275 sv_setiv(PAD_SV(((UNOP*)cUNOP->op_first)->op_first->op_targ), 0);
396482e1 1276 sv_catpvs(targ, "E0");
a0d0e21e
LW
1277 }
1278 SETs(targ);
1279 }
1280
1281 RETURN;
1282}
1283
1284/* Control. */
1285
27da23d5 1286static const char * const context_name[] = {
515afda2 1287 "pseudo-block",
f31522f3 1288 NULL, /* CXt_WHEN never actually needs "block" */
76753e7f 1289 NULL, /* CXt_BLOCK never actually needs "block" */
f31522f3 1290 NULL, /* CXt_GIVEN never actually needs "block" */
76753e7f
NC
1291 NULL, /* CXt_LOOP_FOR never actually needs "loop" */
1292 NULL, /* CXt_LOOP_PLAIN never actually needs "loop" */
1293 NULL, /* CXt_LOOP_LAZYSV never actually needs "loop" */
1294 NULL, /* CXt_LOOP_LAZYIV never actually needs "loop" */
515afda2 1295 "subroutine",
76753e7f 1296 "format",
515afda2 1297 "eval",
515afda2 1298 "substitution",
515afda2
NC
1299};
1300
76e3520e 1301STATIC I32
5db1eb8d 1302S_dopoptolabel(pTHX_ const char *label, STRLEN len, U32 flags)
a0d0e21e 1303{
97aff369 1304 dVAR;
eb578fdb 1305 I32 i;
a0d0e21e 1306
7918f24d
NC
1307 PERL_ARGS_ASSERT_DOPOPTOLABEL;
1308
a0d0e21e 1309 for (i = cxstack_ix; i >= 0; i--) {
eb578fdb 1310 const PERL_CONTEXT * const cx = &cxstack[i];
6b35e009 1311 switch (CxTYPE(cx)) {
a0d0e21e 1312 case CXt_SUBST:
a0d0e21e 1313 case CXt_SUB:
7766f137 1314 case CXt_FORMAT:
a0d0e21e 1315 case CXt_EVAL:
0a753a76 1316 case CXt_NULL:
dcbac5bb 1317 /* diag_listed_as: Exiting subroutine via %s */
a2a5de95
NC
1318 Perl_ck_warner(aTHX_ packWARN(WARN_EXITING), "Exiting %s via %s",
1319 context_name[CxTYPE(cx)], OP_NAME(PL_op));
515afda2
NC
1320 if (CxTYPE(cx) == CXt_NULL)
1321 return -1;
1322 break;
c6fdafd0 1323 case CXt_LOOP_LAZYIV:
d01136d6 1324 case CXt_LOOP_LAZYSV:
3b719c58
NC
1325 case CXt_LOOP_FOR:
1326 case CXt_LOOP_PLAIN:
7e8f1eac 1327 {
5db1eb8d
BF
1328 STRLEN cx_label_len = 0;
1329 U32 cx_label_flags = 0;
1330 const char *cx_label = CxLABEL_len_flags(cx, &cx_label_len, &cx_label_flags);
1331 if (!cx_label || !(
1332 ( (cx_label_flags & SVf_UTF8) != (flags & SVf_UTF8) ) ?
1333 (flags & SVf_UTF8)
1334 ? (bytes_cmp_utf8(
1335 (const U8*)cx_label, cx_label_len,
1336 (const U8*)label, len) == 0)
1337 : (bytes_cmp_utf8(
1338 (const U8*)label, len,
1339 (const U8*)cx_label, cx_label_len) == 0)
eade7155
BF
1340 : (len == cx_label_len && ((cx_label == label)
1341 || memEQ(cx_label, label, len))) )) {
1c98cc53 1342 DEBUG_l(Perl_deb(aTHX_ "(poptolabel(): skipping label at cx=%ld %s)\n",
7e8f1eac 1343 (long)i, cx_label));
a0d0e21e
LW
1344 continue;
1345 }
1c98cc53 1346 DEBUG_l( Perl_deb(aTHX_ "(poptolabel(): found label at cx=%ld %s)\n", (long)i, label));
a0d0e21e 1347 return i;
7e8f1eac 1348 }
a0d0e21e
LW
1349 }
1350 }
1351 return i;
1352}
1353
0d863452
RH
1354
1355
e50aee73 1356I32
864dbfa3 1357Perl_dowantarray(pTHX)
e50aee73 1358{
97aff369 1359 dVAR;
f54cb97a 1360 const I32 gimme = block_gimme();
54310121 1361 return (gimme == G_VOID) ? G_SCALAR : gimme;
1362}
1363
1364I32
864dbfa3 1365Perl_block_gimme(pTHX)
54310121 1366{
97aff369 1367 dVAR;
06b5626a 1368 const I32 cxix = dopoptosub(cxstack_ix);
e50aee73 1369 if (cxix < 0)
46fc3d4c 1370 return G_VOID;
e50aee73 1371
54310121 1372 switch (cxstack[cxix].blk_gimme) {
d2719217
GS
1373 case G_VOID:
1374 return G_VOID;
54310121 1375 case G_SCALAR:
e50aee73 1376 return G_SCALAR;
54310121 1377 case G_ARRAY:
1378 return G_ARRAY;
1379 default:
cea2e8a9 1380 Perl_croak(aTHX_ "panic: bad gimme: %d\n", cxstack[cxix].blk_gimme);
118e2215 1381 assert(0); /* NOTREACHED */
d2719217 1382 return 0;
54310121 1383 }
e50aee73
AD
1384}
1385
78f9721b
SM
1386I32
1387Perl_is_lvalue_sub(pTHX)
1388{
97aff369 1389 dVAR;
06b5626a 1390 const I32 cxix = dopoptosub(cxstack_ix);
78f9721b
SM
1391 assert(cxix >= 0); /* We should only be called from inside subs */
1392
bafb2adc
NC
1393 if (CxLVAL(cxstack + cxix) && CvLVALUE(cxstack[cxix].blk_sub.cv))
1394 return CxLVAL(cxstack + cxix);
78f9721b
SM
1395 else
1396 return 0;
1397}
1398
777d9014
FC
1399/* only used by PUSHSUB */
1400I32
1401Perl_was_lvalue_sub(pTHX)
1402{
1403 dVAR;
1404 const I32 cxix = dopoptosub(cxstack_ix-1);
1405 assert(cxix >= 0); /* We should only be called from inside subs */
1406
1407 if (CxLVAL(cxstack + cxix) && CvLVALUE(cxstack[cxix].blk_sub.cv))
1408 return CxLVAL(cxstack + cxix);
1409 else
1410 return 0;
1411}
1412
76e3520e 1413STATIC I32
901017d6 1414S_dopoptosub_at(pTHX_ const PERL_CONTEXT *cxstk, I32 startingblock)
2c375eb9 1415{
97aff369 1416 dVAR;
a0d0e21e 1417 I32 i;
7918f24d
NC
1418
1419 PERL_ARGS_ASSERT_DOPOPTOSUB_AT;
1420
a0d0e21e 1421 for (i = startingblock; i >= 0; i--) {
eb578fdb 1422 const PERL_CONTEXT * const cx = &cxstk[i];
6b35e009 1423 switch (CxTYPE(cx)) {
a0d0e21e
LW
1424 default:
1425 continue;
1426 case CXt_EVAL:
1427 case CXt_SUB:
7766f137 1428 case CXt_FORMAT:
1c98cc53 1429 DEBUG_l( Perl_deb(aTHX_ "(dopoptosub_at(): found sub at cx=%ld)\n", (long)i));
a0d0e21e
LW
1430 return i;
1431 }
1432 }
1433 return i;
1434}
1435
76e3520e 1436STATIC I32
cea2e8a9 1437S_dopoptoeval(pTHX_ I32 startingblock)
a0d0e21e 1438{
97aff369 1439 dVAR;
a0d0e21e 1440 I32 i;
a0d0e21e 1441 for (i = startingblock; i >= 0; i--) {
eb578fdb 1442 const PERL_CONTEXT *cx = &cxstack[i];
6b35e009 1443 switch (CxTYPE(cx)) {
a0d0e21e
LW
1444 default:
1445 continue;
1446 case CXt_EVAL:
1c98cc53 1447 DEBUG_l( Perl_deb(aTHX_ "(dopoptoeval(): found eval at cx=%ld)\n", (long)i));
a0d0e21e
LW
1448 return i;
1449 }
1450 }
1451 return i;
1452}
1453
76e3520e 1454STATIC I32
cea2e8a9 1455S_dopoptoloop(pTHX_ I32 startingblock)
a0d0e21e 1456{
97aff369 1457 dVAR;
a0d0e21e 1458 I32 i;
a0d0e21e 1459 for (i = startingblock; i >= 0; i--) {
eb578fdb 1460 const PERL_CONTEXT * const cx = &cxstack[i];
6b35e009 1461 switch (CxTYPE(cx)) {
a0d0e21e 1462 case CXt_SUBST:
a0d0e21e 1463 case CXt_SUB:
7766f137 1464 case CXt_FORMAT:
a0d0e21e 1465 case CXt_EVAL:
0a753a76 1466 case CXt_NULL:
dcbac5bb 1467 /* diag_listed_as: Exiting subroutine via %s */
a2a5de95
NC
1468 Perl_ck_warner(aTHX_ packWARN(WARN_EXITING), "Exiting %s via %s",
1469 context_name[CxTYPE(cx)], OP_NAME(PL_op));
515afda2
NC
1470 if ((CxTYPE(cx)) == CXt_NULL)
1471 return -1;
1472 break;
c6fdafd0 1473 case CXt_LOOP_LAZYIV:
d01136d6 1474 case CXt_LOOP_LAZYSV:
3b719c58
NC
1475 case CXt_LOOP_FOR:
1476 case CXt_LOOP_PLAIN:
1c98cc53 1477 DEBUG_l( Perl_deb(aTHX_ "(dopoptoloop(): found loop at cx=%ld)\n", (long)i));
a0d0e21e
LW
1478 return i;
1479 }
1480 }
1481 return i;
1482}
1483
0d863452
RH
1484STATIC I32
1485S_dopoptogiven(pTHX_ I32 startingblock)
1486{
97aff369 1487 dVAR;
0d863452
RH
1488 I32 i;
1489 for (i = startingblock; i >= 0; i--) {
eb578fdb 1490 const PERL_CONTEXT *cx = &cxstack[i];
0d863452
RH
1491 switch (CxTYPE(cx)) {
1492 default:
1493 continue;
1494 case CXt_GIVEN:
1c98cc53 1495 DEBUG_l( Perl_deb(aTHX_ "(dopoptogiven(): found given at cx=%ld)\n", (long)i));
0d863452 1496 return i;
3b719c58
NC
1497 case CXt_LOOP_PLAIN:
1498 assert(!CxFOREACHDEF(cx));
1499 break;
c6fdafd0 1500 case CXt_LOOP_LAZYIV:
d01136d6 1501 case CXt_LOOP_LAZYSV:
3b719c58 1502 case CXt_LOOP_FOR:
0d863452 1503 if (CxFOREACHDEF(cx)) {
1c98cc53 1504 DEBUG_l( Perl_deb(aTHX_ "(dopoptogiven(): found foreach at cx=%ld)\n", (long)i));
0d863452
RH
1505 return i;
1506 }
1507 }
1508 }
1509 return i;
1510}
1511
1512STATIC I32
1513S_dopoptowhen(pTHX_ I32 startingblock)
1514{
97aff369 1515 dVAR;
0d863452
RH
1516 I32 i;
1517 for (i = startingblock; i >= 0; i--) {
eb578fdb 1518 const PERL_CONTEXT *cx = &cxstack[i];
0d863452
RH
1519 switch (CxTYPE(cx)) {
1520 default:
1521 continue;
1522 case CXt_WHEN:
1c98cc53 1523 DEBUG_l( Perl_deb(aTHX_ "(dopoptowhen(): found when at cx=%ld)\n", (long)i));
0d863452
RH
1524 return i;
1525 }
1526 }
1527 return i;
1528}
1529
a0d0e21e 1530void
864dbfa3 1531Perl_dounwind(pTHX_ I32 cxix)
a0d0e21e 1532{
97aff369 1533 dVAR;
a0d0e21e
LW
1534 I32 optype;
1535
f144f1e3
DM
1536 if (!PL_curstackinfo) /* can happen if die during thread cloning */
1537 return;
1538
a0d0e21e 1539 while (cxstack_ix > cxix) {
b0d9ce38 1540 SV *sv;
eb578fdb 1541 PERL_CONTEXT *cx = &cxstack[cxstack_ix];
1c98cc53 1542 DEBUG_CX("UNWIND"); \
a0d0e21e 1543 /* Note: we don't need to restore the base context info till the end. */
6b35e009 1544 switch (CxTYPE(cx)) {
c90c0ff4 1545 case CXt_SUBST:
1546 POPSUBST(cx);
1547 continue; /* not break */
a0d0e21e 1548 case CXt_SUB:
b0d9ce38
GS
1549 POPSUB(cx,sv);
1550 LEAVESUB(sv);
a0d0e21e
LW
1551 break;
1552 case CXt_EVAL:
1553 POPEVAL(cx);
1554 break;
c6fdafd0 1555 case CXt_LOOP_LAZYIV:
d01136d6 1556 case CXt_LOOP_LAZYSV:
3b719c58
NC
1557 case CXt_LOOP_FOR:
1558 case CXt_LOOP_PLAIN:
a0d0e21e
LW
1559 POPLOOP(cx);
1560 break;
0a753a76 1561 case CXt_NULL:
a0d0e21e 1562 break;
7766f137
GS
1563 case CXt_FORMAT:
1564 POPFORMAT(cx);
1565 break;
a0d0e21e 1566 }
c90c0ff4 1567 cxstack_ix--;
a0d0e21e 1568 }
1b6737cc 1569 PERL_UNUSED_VAR(optype);
a0d0e21e
LW
1570}
1571
5a844595
GS
1572void
1573Perl_qerror(pTHX_ SV *err)
1574{
97aff369 1575 dVAR;
7918f24d
NC
1576
1577 PERL_ARGS_ASSERT_QERROR;
1578
6b2fb389
DM
1579 if (PL_in_eval) {
1580 if (PL_in_eval & EVAL_KEEPERR) {
ecad31f0
BF
1581 Perl_ck_warner(aTHX_ packWARN(WARN_MISC), "\t(in cleanup) %"SVf,
1582 SVfARG(err));
6b2fb389
DM
1583 }
1584 else
1585 sv_catsv(ERRSV, err);
1586 }
5a844595
GS
1587 else if (PL_errors)
1588 sv_catsv(PL_errors, err);
1589 else
be2597df 1590 Perl_warn(aTHX_ "%"SVf, SVfARG(err));
13765c85
DM
1591 if (PL_parser)
1592 ++PL_parser->error_count;
5a844595
GS
1593}
1594
bb4c52e0 1595void
c5df3096 1596Perl_die_unwind(pTHX_ SV *msv)
a0d0e21e 1597{
27da23d5 1598 dVAR;
c5df3096 1599 SV *exceptsv = sv_mortalcopy(msv);
96d9b9cd 1600 U8 in_eval = PL_in_eval;
c5df3096 1601 PERL_ARGS_ASSERT_DIE_UNWIND;
87582a92 1602
96d9b9cd 1603 if (in_eval) {
a0d0e21e 1604 I32 cxix;
a0d0e21e 1605 I32 gimme;
a0d0e21e 1606
22a30693
Z
1607 /*
1608 * Historically, perl used to set ERRSV ($@) early in the die
1609 * process and rely on it not getting clobbered during unwinding.
1610 * That sucked, because it was liable to get clobbered, so the
1611 * setting of ERRSV used to emit the exception from eval{} has
1612 * been moved to much later, after unwinding (see just before
1613 * JMPENV_JUMP below). However, some modules were relying on the
1614 * early setting, by examining $@ during unwinding to use it as
1615 * a flag indicating whether the current unwinding was caused by
1616 * an exception. It was never a reliable flag for that purpose,
1617 * being totally open to false positives even without actual
1618 * clobberage, but was useful enough for production code to
1619 * semantically rely on it.
1620 *
1621 * We'd like to have a proper introspective interface that
1622 * explicitly describes the reason for whatever unwinding
1623 * operations are currently in progress, so that those modules
1624 * work reliably and $@ isn't further overloaded. But we don't
1625 * have one yet. In its absence, as a stopgap measure, ERRSV is
1626 * now *additionally* set here, before unwinding, to serve as the
1627 * (unreliable) flag that it used to.
1628 *
1629 * This behaviour is temporary, and should be removed when a
1630 * proper way to detect exceptional unwinding has been developed.
1631 * As of 2010-12, the authors of modules relying on the hack
1632 * are aware of the issue, because the modules failed on
1633 * perls 5.13.{1..7} which had late setting of $@ without this
1634 * early-setting hack.
1635 */
1636 if (!(in_eval & EVAL_KEEPERR)) {
1637 SvTEMP_off(exceptsv);
1638 sv_setsv(ERRSV, exceptsv);
1639 }
1640
5a844595
GS
1641 while ((cxix = dopoptoeval(cxstack_ix)) < 0
1642 && PL_curstackinfo->si_prev)
1643 {
bac4b2ad 1644 dounwind(-1);
d3acc0f7 1645 POPSTACK;
bac4b2ad 1646 }
e336de0d 1647
a0d0e21e
LW
1648 if (cxix >= 0) {
1649 I32 optype;
b6494f15 1650 SV *namesv;
eb578fdb 1651 PERL_CONTEXT *cx;
901017d6 1652 SV **newsp;
8f89e5a9
Z
1653 COP *oldcop;
1654 JMPENV *restartjmpenv;
1655 OP *restartop;
a0d0e21e
LW
1656
1657 if (cxix < cxstack_ix)
1658 dounwind(cxix);
1659
3280af22 1660 POPBLOCK(cx,PL_curpm);
6b35e009 1661 if (CxTYPE(cx) != CXt_EVAL) {
7d0994e0 1662 STRLEN msglen;
96d9b9cd 1663 const char* message = SvPVx_const(exceptsv, msglen);
10edeb5d 1664 PerlIO_write(Perl_error_log, (const char *)"panic: die ", 11);
bf49b057 1665 PerlIO_write(Perl_error_log, message, msglen);
a0d0e21e
LW
1666 my_exit(1);
1667 }
1668 POPEVAL(cx);
b6494f15 1669 namesv = cx->blk_eval.old_namesv;
8f89e5a9
Z
1670 oldcop = cx->blk_oldcop;
1671 restartjmpenv = cx->blk_eval.cur_top_env;
1672 restartop = cx->blk_eval.retop;
a0d0e21e
LW
1673
1674 if (gimme == G_SCALAR)
3280af22
NIS
1675 *++newsp = &PL_sv_undef;
1676 PL_stack_sp = newsp;
a0d0e21e
LW
1677
1678 LEAVE;
748a9306 1679
7fb6a879
GS
1680 /* LEAVE could clobber PL_curcop (see save_re_context())
1681 * XXX it might be better to find a way to avoid messing with
1682 * PL_curcop in save_re_context() instead, but this is a more
1683 * minimal fix --GSAR */
8f89e5a9 1684 PL_curcop = oldcop;
7fb6a879 1685
7a2e2cd6 1686 if (optype == OP_REQUIRE) {
b6494f15 1687 (void)hv_store(GvHVn(PL_incgv),
ecad31f0 1688 SvPVX_const(namesv),
c60dbbc3 1689 SvUTF8(namesv) ? -(I32)SvCUR(namesv) : (I32)SvCUR(namesv),
27bcc0a7 1690 &PL_sv_undef, 0);
27e90453
DM
1691 /* note that unlike pp_entereval, pp_require isn't
1692 * supposed to trap errors. So now that we've popped the
1693 * EVAL that pp_require pushed, and processed the error
1694 * message, rethrow the error */
ecad31f0
BF
1695 Perl_croak(aTHX_ "%"SVf"Compilation failed in require",
1696 SVfARG(exceptsv ? exceptsv : newSVpvs_flags("Unknown error\n",
1697 SVs_TEMP)));
7a2e2cd6 1698 }
c5df3096 1699 if (in_eval & EVAL_KEEPERR) {
ecad31f0
BF
1700 Perl_ck_warner(aTHX_ packWARN(WARN_MISC), "\t(in cleanup) %"SVf,
1701 SVfARG(exceptsv));
96d9b9cd
Z
1702 }
1703 else {
1704 sv_setsv(ERRSV, exceptsv);
1705 }
8f89e5a9
Z
1706 PL_restartjmpenv = restartjmpenv;
1707 PL_restartop = restartop;
bb4c52e0 1708 JMPENV_JUMP(3);
118e2215 1709 assert(0); /* NOTREACHED */
a0d0e21e
LW
1710 }
1711 }
87582a92 1712
96d9b9cd 1713 write_to_stderr(exceptsv);
f86702cc 1714 my_failure_exit();
118e2215 1715 assert(0); /* NOTREACHED */
a0d0e21e
LW
1716}
1717
1718PP(pp_xor)
1719{
97aff369 1720 dVAR; dSP; dPOPTOPssrl;
a0d0e21e
LW
1721 if (SvTRUE(left) != SvTRUE(right))
1722 RETSETYES;
1723 else
1724 RETSETNO;
1725}
1726
8dff4fc5
BM
1727/*
1728=for apidoc caller_cx
1729
1730The XSUB-writer's equivalent of L<caller()|perlfunc/caller>. The
1731returned C<PERL_CONTEXT> structure can be interrogated to find all the
1732information returned to Perl by C<caller>. Note that XSUBs don't get a
1733stack frame, so C<caller_cx(0, NULL)> will return information for the
1734immediately-surrounding Perl code.
1735
1736This function skips over the automatic calls to C<&DB::sub> made on the
1737behalf of the debugger. If the stack frame requested was a sub called by
1738C<DB::sub>, the return value will be the frame for the call to
1739C<DB::sub>, since that has the correct line number/etc. for the call
1740site. If I<dbcxp> is non-C<NULL>, it will be set to a pointer to the
1741frame for the sub call itself.
1742
1743=cut
1744*/
1745
1746const PERL_CONTEXT *
1747Perl_caller_cx(pTHX_ I32 count, const PERL_CONTEXT **dbcxp)
a0d0e21e 1748{
eb578fdb
KW
1749 I32 cxix = dopoptosub(cxstack_ix);
1750 const PERL_CONTEXT *cx;
1751 const PERL_CONTEXT *ccstack = cxstack;
901017d6 1752 const PERL_SI *top_si = PL_curstackinfo;
27d41816 1753
a0d0e21e 1754 for (;;) {
2c375eb9
GS
1755 /* we may be in a higher stacklevel, so dig down deeper */
1756 while (cxix < 0 && top_si->si_type != PERLSI_MAIN) {
1757 top_si = top_si->si_prev;
1758 ccstack = top_si->si_cxstack;
1759 cxix = dopoptosub_at(ccstack, top_si->si_cxix);
1760 }
8dff4fc5
BM
1761 if (cxix < 0)
1762 return NULL;
f2a7f298
DG
1763 /* caller() should not report the automatic calls to &DB::sub */
1764 if (PL_DBsub && GvCV(PL_DBsub) && cxix >= 0 &&
3280af22 1765 ccstack[cxix].blk_sub.cv == GvCV(PL_DBsub))
a0d0e21e
LW
1766 count++;
1767 if (!count--)
1768 break;
2c375eb9 1769 cxix = dopoptosub_at(ccstack, cxix - 1);
a0d0e21e 1770 }
2c375eb9
GS
1771
1772 cx = &ccstack[cxix];
8dff4fc5
BM
1773 if (dbcxp) *dbcxp = cx;
1774
7766f137 1775 if (CxTYPE(cx) == CXt_SUB || CxTYPE(cx) == CXt_FORMAT) {
f54cb97a 1776 const I32 dbcxix = dopoptosub_at(ccstack, cxix - 1);
2c375eb9 1777 /* We expect that ccstack[dbcxix] is CXt_SUB, anyway, the
06a5b730 1778 field below is defined for any cx. */
f2a7f298
DG
1779 /* caller() should not report the automatic calls to &DB::sub */
1780 if (PL_DBsub && GvCV(PL_DBsub) && dbcxix >= 0 && ccstack[dbcxix].blk_sub.cv == GvCV(PL_DBsub))
2c375eb9 1781 cx = &ccstack[dbcxix];
06a5b730 1782 }
1783
8dff4fc5
BM
1784 return cx;
1785}
1786
1787PP(pp_caller)
1788{
1789 dVAR;
1790 dSP;
eb578fdb 1791 const PERL_CONTEXT *cx;
8dff4fc5
BM
1792 const PERL_CONTEXT *dbcx;
1793 I32 gimme;
d527ce7c 1794 const HEK *stash_hek;
8dff4fc5 1795 I32 count = 0;
ce0b554b 1796 bool has_arg = MAXARG && TOPs;
8dff4fc5 1797
ce0b554b
FC
1798 if (MAXARG) {
1799 if (has_arg)
8dff4fc5 1800 count = POPi;
ce0b554b
FC
1801 else (void)POPs;
1802 }
8dff4fc5 1803
ce0b554b 1804 cx = caller_cx(count + !!(PL_op->op_private & OPpOFFBYONE), &dbcx);
8dff4fc5
BM
1805 if (!cx) {
1806 if (GIMME != G_ARRAY) {
1807 EXTEND(SP, 1);
1808 RETPUSHUNDEF;
1809 }
1810 RETURN;
1811 }
1812
fb55feef 1813 DEBUG_CX("CALLER");
d0279c7c 1814 assert(CopSTASH(cx->blk_oldcop));
e7886211
FC
1815 stash_hek = SvTYPE(CopSTASH(cx->blk_oldcop)) == SVt_PVHV
1816 ? HvNAME_HEK((HV*)CopSTASH(cx->blk_oldcop))
1817 : NULL;
a0d0e21e 1818 if (GIMME != G_ARRAY) {
27d41816 1819 EXTEND(SP, 1);
d527ce7c 1820 if (!stash_hek)
3280af22 1821 PUSHs(&PL_sv_undef);
49d8d3a1
MB
1822 else {
1823 dTARGET;
d527ce7c 1824 sv_sethek(TARG, stash_hek);
49d8d3a1
MB
1825 PUSHs(TARG);
1826 }
a0d0e21e
LW
1827 RETURN;
1828 }
a0d0e21e 1829
b3ca2e83 1830 EXTEND(SP, 11);
27d41816 1831
d527ce7c 1832 if (!stash_hek)
3280af22 1833 PUSHs(&PL_sv_undef);
d527ce7c
BF
1834 else {
1835 dTARGET;
1836 sv_sethek(TARG, stash_hek);
1837 PUSHTARG;
1838 }
6e449a3a
MHM
1839 mPUSHs(newSVpv(OutCopFILE(cx->blk_oldcop), 0));
1840 mPUSHi((I32)CopLINE(cx->blk_oldcop));
ce0b554b 1841 if (!has_arg)
a0d0e21e 1842 RETURN;
7766f137 1843 if (CxTYPE(cx) == CXt_SUB || CxTYPE(cx) == CXt_FORMAT) {
8dff4fc5 1844 GV * const cvgv = CvGV(dbcx->blk_sub.cv);
7766f137 1845 /* So is ccstack[dbcxix]. */
81ed78b2 1846 if (cvgv && isGV(cvgv)) {
561b68a9 1847 SV * const sv = newSV(0);
c445ea15 1848 gv_efullname3(sv, cvgv, NULL);
6e449a3a 1849 mPUSHs(sv);
bf38a478 1850 PUSHs(boolSV(CxHASARGS(cx)));
07b8c804
RGS
1851 }
1852 else {
84bafc02 1853 PUSHs(newSVpvs_flags("(unknown)", SVs_TEMP));
bf38a478 1854 PUSHs(boolSV(CxHASARGS(cx)));
07b8c804 1855 }
a0d0e21e
LW
1856 }
1857 else {
84bafc02 1858 PUSHs(newSVpvs_flags("(eval)", SVs_TEMP));
6e449a3a 1859 mPUSHi(0);
a0d0e21e 1860 }
54310121 1861 gimme = (I32)cx->blk_gimme;
1862 if (gimme == G_VOID)
3280af22 1863 PUSHs(&PL_sv_undef);
54310121 1864 else
98625aca 1865 PUSHs(boolSV((gimme & G_WANT) == G_ARRAY));
6b35e009 1866 if (CxTYPE(cx) == CXt_EVAL) {
811a4de9 1867 /* eval STRING */
85a64632 1868 if (CxOLD_OP_TYPE(cx) == OP_ENTEREVAL) {
19bcb54e
FC
1869 PUSHs(newSVpvn_flags(SvPVX(cx->blk_eval.cur_text),
1870 SvCUR(cx->blk_eval.cur_text)-2,
1871 SvUTF8(cx->blk_eval.cur_text)|SVs_TEMP));
3280af22 1872 PUSHs(&PL_sv_no);
0f79a09d 1873 }
811a4de9 1874 /* require */
0f79a09d 1875 else if (cx->blk_eval.old_namesv) {
6e449a3a 1876 mPUSHs(newSVsv(cx->blk_eval.old_namesv));
3280af22 1877 PUSHs(&PL_sv_yes);
06a5b730 1878 }
811a4de9
GS
1879 /* eval BLOCK (try blocks have old_namesv == 0) */
1880 else {
1881 PUSHs(&PL_sv_undef);
1882 PUSHs(&PL_sv_undef);
1883 }
4633a7c4 1884 }
a682de96
GS
1885 else {
1886 PUSHs(&PL_sv_undef);
1887 PUSHs(&PL_sv_undef);
1888 }
bafb2adc 1889 if (CxTYPE(cx) == CXt_SUB && CxHASARGS(cx)
ed094faf 1890 && CopSTASH_eq(PL_curcop, PL_debstash))
4633a7c4 1891 {
66a1b24b
AL
1892 AV * const ary = cx->blk_sub.argarray;
1893 const int off = AvARRAY(ary) - AvALLOC(ary);
a0d0e21e 1894
e1a80902 1895 Perl_init_dbargs(aTHX);
a0d0e21e 1896
3280af22
NIS
1897 if (AvMAX(PL_dbargs) < AvFILLp(ary) + off)
1898 av_extend(PL_dbargs, AvFILLp(ary) + off);
1899 Copy(AvALLOC(ary), AvARRAY(PL_dbargs), AvFILLp(ary) + 1 + off, SV*);
1900 AvFILLp(PL_dbargs) = AvFILLp(ary) + off;
a0d0e21e 1901 }
6e449a3a 1902 mPUSHi(CopHINTS_get(cx->blk_oldcop));
e476b1b5
GS
1903 {
1904 SV * mask ;
72dc9ed5 1905 STRLEN * const old_warnings = cx->blk_oldcop->cop_warnings ;
114bafba 1906
f07626ad 1907 if (old_warnings == pWARN_NONE)
e476b1b5 1908 mask = newSVpvn(WARN_NONEstring, WARNsize) ;
f07626ad
FC
1909 else if (old_warnings == pWARN_STD && (PL_dowarn & G_WARN_ON) == 0)
1910 mask = &PL_sv_undef ;
ac27b0f5 1911 else if (old_warnings == pWARN_ALL ||
75b6c4ca
RGS
1912 (old_warnings == pWARN_STD && PL_dowarn & G_WARN_ON)) {
1913 /* Get the bit mask for $warnings::Bits{all}, because
1914 * it could have been extended by warnings::register */
1915 SV **bits_all;
6673a63c 1916 HV * const bits = get_hv("warnings::Bits", 0);
017a3ce5 1917 if (bits && (bits_all=hv_fetchs(bits, "all", FALSE))) {
75b6c4ca
RGS
1918 mask = newSVsv(*bits_all);
1919 }
1920 else {
1921 mask = newSVpvn(WARN_ALLstring, WARNsize) ;
1922 }
1923 }
e476b1b5 1924 else
72dc9ed5 1925 mask = newSVpvn((char *) (old_warnings + 1), old_warnings[0]);
6e449a3a 1926 mPUSHs(mask);
e476b1b5 1927 }
b3ca2e83 1928
c28fe1ec 1929 PUSHs(cx->blk_oldcop->cop_hints_hash ?
20439bc7 1930 sv_2mortal(newRV_noinc(MUTABLE_SV(cop_hints_2hv(cx->blk_oldcop, 0))))
b3ca2e83 1931 : &PL_sv_undef);
a0d0e21e
LW
1932 RETURN;
1933}
1934
a0d0e21e
LW
1935PP(pp_reset)
1936{
97aff369 1937 dVAR;
39644a26 1938 dSP;
ca826051
FC
1939 const char * tmps;
1940 STRLEN len = 0;
1941 if (MAXARG < 1 || (!TOPs && !POPs))
1942 tmps = NULL, len = 0;
1943 else
1944 tmps = SvPVx_const(POPs, len);
1945 sv_resetpvn(tmps, len, CopSTASH(PL_curcop));
3280af22 1946 PUSHs(&PL_sv_yes);
a0d0e21e
LW
1947 RETURN;
1948}
1949
dd2155a4
DM
1950/* like pp_nextstate, but used instead when the debugger is active */
1951
a0d0e21e
LW
1952PP(pp_dbstate)
1953{
27da23d5 1954 dVAR;
533c011a 1955 PL_curcop = (COP*)PL_op;
a0d0e21e 1956 TAINT_NOT; /* Each statement is presumed innocent */
3280af22 1957 PL_stack_sp = PL_stack_base + cxstack[cxstack_ix].blk_oldsp;
a0d0e21e
LW
1958 FREETMPS;
1959
f410a211
NC
1960 PERL_ASYNC_CHECK();
1961
5df8de69
DM
1962 if (PL_op->op_flags & OPf_SPECIAL /* breakpoint */
1963 || SvIV(PL_DBsingle) || SvIV(PL_DBsignal) || SvIV(PL_DBtrace))
a0d0e21e 1964 {
39644a26 1965 dSP;
eb578fdb 1966 PERL_CONTEXT *cx;
f54cb97a 1967 const I32 gimme = G_ARRAY;
eb160463 1968 U8 hasargs;
0bd48802 1969 GV * const gv = PL_DBgv;
432d4561
JL
1970 CV * cv = NULL;
1971
1972 if (gv && isGV_with_GP(gv))
1973 cv = GvCV(gv);
a0d0e21e 1974
c2cb6f77 1975 if (!cv || (!CvROOT(cv) && !CvXSUB(cv)))
cea2e8a9 1976 DIE(aTHX_ "No DB::DB routine defined");
a0d0e21e 1977
aea4f609
DM
1978 if (CvDEPTH(cv) >= 1 && !(PL_debug & DEBUG_DB_RECURSE_FLAG))
1979 /* don't do recursive DB::DB call */
a0d0e21e 1980 return NORMAL;
748a9306 1981
a57c6685 1982 ENTER;
4633a7c4
LW
1983 SAVETMPS;
1984
3280af22 1985 SAVEI32(PL_debug);
55497cff 1986 SAVESTACK_POS();
3280af22 1987 PL_debug = 0;
748a9306 1988 hasargs = 0;
924508f0 1989 SPAGAIN;
748a9306 1990
aed2304a 1991 if (CvISXSUB(cv)) {
c127bd3a
SF
1992 PUSHMARK(SP);
1993 (void)(*CvXSUB(cv))(aTHX_ cv);
c127bd3a 1994 FREETMPS;
a57c6685 1995 LEAVE;
c127bd3a
SF
1996 return NORMAL;
1997 }
1998 else {
1999 PUSHBLOCK(cx, CXt_SUB, SP);
2000 PUSHSUB_DB(cx);
2001 cx->blk_sub.retop = PL_op->op_next;
2002 CvDEPTH(cv)++;
9d976ff5
FC
2003 if (CvDEPTH(cv) >= 2) {
2004 PERL_STACK_OVERFLOW_CHECK();
2005 pad_push(CvPADLIST(cv), CvDEPTH(cv));
2006 }
c127bd3a 2007 SAVECOMPPAD();
9d976ff5 2008 PAD_SET_CUR_NOSAVE(CvPADLIST(cv), CvDEPTH(cv));
c127bd3a
SF
2009 RETURNOP(CvSTART(cv));
2010 }
a0d0e21e
LW
2011 }
2012 else
2013 return NORMAL;
2014}
2015
b9d76716
VP
2016STATIC SV **
2017S_adjust_stack_on_leave(pTHX_ SV **newsp, SV **sp, SV **mark, I32 gimme, U32 flags)
2018{
9a214eec 2019 bool padtmp = 0;
b9d76716
VP
2020 PERL_ARGS_ASSERT_ADJUST_STACK_ON_LEAVE;
2021
9a214eec
DM
2022 if (flags & SVs_PADTMP) {
2023 flags &= ~SVs_PADTMP;
2024 padtmp = 1;
2025 }
b9d76716
VP
2026 if (gimme == G_SCALAR) {
2027 if (MARK < SP)
9a214eec
DM
2028 *++newsp = ((SvFLAGS(*SP) & flags) || (padtmp && SvPADTMP(*SP)))
2029 ? *SP : sv_mortalcopy(*SP);
b9d76716
VP
2030 else {
2031 /* MEXTEND() only updates MARK, so reuse it instead of newsp. */
2032 MARK = newsp;
2033 MEXTEND(MARK, 1);
2034 *++MARK = &PL_sv_undef;
2035 return MARK;
2036 }
2037 }
2038 else if (gimme == G_ARRAY) {
2039 /* in case LEAVE wipes old return values */
2040 while (++MARK <= SP) {
9a214eec 2041 if ((SvFLAGS(*MARK) & flags) || (padtmp && SvPADTMP(*MARK)))
b9d76716
VP
2042 *++newsp = *MARK;
2043 else {
2044 *++newsp = sv_mortalcopy(*MARK);
2045 TAINT_NOT; /* Each item is independent */
2046 }
2047 }
2048 /* When this function was called with MARK == newsp, we reach this
2049 * point with SP == newsp. */
2050 }
2051
2052 return newsp;
2053}
2054
2b9a6457
VP
2055PP(pp_enter)
2056{
2057 dVAR; dSP;
eb578fdb 2058 PERL_CONTEXT *cx;
7c2d9d03 2059 I32 gimme = GIMME_V;
2b9a6457
VP
2060
2061 ENTER_with_name("block");
2062
2063 SAVETMPS;
2064 PUSHBLOCK(cx, CXt_BLOCK, SP);
2065
2066 RETURN;
2067}
2068
2069PP(pp_leave)
2070{
2071 dVAR; dSP;
eb578fdb 2072 PERL_CONTEXT *cx;
2b9a6457
VP
2073 SV **newsp;
2074 PMOP *newpm;
2075 I32 gimme;
2076
2077 if (PL_op->op_flags & OPf_SPECIAL) {
2078 cx = &cxstack[cxstack_ix];
2079 cx->blk_oldpm = PL_curpm; /* fake block should preserve $1 et al */
2080 }
2081
2082 POPBLOCK(cx,newpm);
2083
2084 gimme = OP_GIMME(PL_op, (cxstack_ix >= 0) ? gimme : G_SCALAR);
2085
2086 TAINT_NOT;
f02ea43c 2087 SP = adjust_stack_on_leave(newsp, SP, newsp, gimme, SVs_PADTMP|SVs_TEMP);
2b9a6457
VP
2088 PL_curpm = newpm; /* Don't pop $1 et al till now */
2089
2090 LEAVE_with_name("block");
2091
2092 RETURN;
2093}
2094
a0d0e21e
LW
2095PP(pp_enteriter)
2096{
27da23d5 2097 dVAR; dSP; dMARK;
eb578fdb 2098 PERL_CONTEXT *cx;
f54cb97a 2099 const I32 gimme = GIMME_V;
df530c37 2100 void *itervar; /* location of the iteration variable */
840fe433 2101 U8 cxtype = CXt_LOOP_FOR;
a0d0e21e 2102
d343c3ef 2103 ENTER_with_name("loop1");
4633a7c4
LW
2104 SAVETMPS;
2105
aafca525
DM
2106 if (PL_op->op_targ) { /* "my" variable */
2107 if (PL_op->op_private & OPpLVAL_INTRO) { /* for my $x (...) */
14f338dc
DM
2108 SvPADSTALE_off(PAD_SVl(PL_op->op_targ));
2109 SAVESETSVFLAGS(PAD_SVl(PL_op->op_targ),
2110 SVs_PADSTALE, SVs_PADSTALE);
2111 }
09edbca0 2112 SAVEPADSVANDMORTALIZE(PL_op->op_targ);
89e00a7c 2113#ifdef USE_ITHREADS
df530c37 2114 itervar = PL_comppad;
89e00a7c 2115#else
aafca525 2116 itervar = &PAD_SVl(PL_op->op_targ);
7766f137 2117#endif
54b9620d 2118 }
aafca525 2119 else { /* symbol table variable */
159b6efe 2120 GV * const gv = MUTABLE_GV(POPs);
f83b46a0
DM
2121 SV** svp = &GvSV(gv);
2122 save_pushptrptr(gv, SvREFCNT_inc(*svp), SAVEt_GVSV);
561b68a9 2123 *svp = newSV(0);
df530c37 2124 itervar = (void *)gv;
54b9620d 2125 }
4633a7c4 2126
0d863452
RH
2127 if (PL_op->op_private & OPpITER_DEF)
2128 cxtype |= CXp_FOR_DEF;
2129
d343c3ef 2130 ENTER_with_name("loop2");
a0d0e21e 2131
7766f137 2132 PUSHBLOCK(cx, cxtype, SP);
df530c37 2133 PUSHLOOP_FOR(cx, itervar, MARK);
533c011a 2134 if (PL_op->op_flags & OPf_STACKED) {
d01136d6
BS
2135 SV *maybe_ary = POPs;
2136 if (SvTYPE(maybe_ary) != SVt_PVAV) {
89ea2908 2137 dPOPss;
d01136d6 2138 SV * const right = maybe_ary;
984a4bea
RD
2139 SvGETMAGIC(sv);
2140 SvGETMAGIC(right);
4fe3f0fa 2141 if (RANGE_IS_NUMERIC(sv,right)) {
d01136d6 2142 cx->cx_type &= ~CXTYPEMASK;
c6fdafd0
NC
2143 cx->cx_type |= CXt_LOOP_LAZYIV;
2144 /* Make sure that no-one re-orders cop.h and breaks our
2145 assumptions */
2146 assert(CxTYPE(cx) == CXt_LOOP_LAZYIV);
a2309040 2147#ifdef NV_PRESERVES_UV
f52e41ad
FC
2148 if ((SvOK(sv) && ((SvNV_nomg(sv) < (NV)IV_MIN) ||
2149 (SvNV_nomg(sv) > (NV)IV_MAX)))
a2309040 2150 ||
f52e41ad
FC
2151 (SvOK(right) && ((SvNV_nomg(right) > (NV)IV_MAX) ||
2152 (SvNV_nomg(right) < (NV)IV_MIN))))
a2309040 2153#else
f52e41ad 2154 if ((SvOK(sv) && ((SvNV_nomg(sv) <= (NV)IV_MIN)
a2309040 2155 ||
f52e41ad
FC
2156 ((SvNV_nomg(sv) > 0) &&
2157 ((SvUV_nomg(sv) > (UV)IV_MAX) ||
2158 (SvNV_nomg(sv) > (NV)UV_MAX)))))
a2309040 2159 ||
f52e41ad 2160 (SvOK(right) && ((SvNV_nomg(right) <= (NV)IV_MIN)
a2309040 2161 ||
f52e41ad
FC
2162 ((SvNV_nomg(right) > 0) &&
2163 ((SvUV_nomg(right) > (UV)IV_MAX) ||
2164 (SvNV_nomg(right) > (NV)UV_MAX))
2165 ))))
a2309040 2166#endif
076d9a11 2167 DIE(aTHX_ "Range iterator outside integer range");
f52e41ad
FC
2168 cx->blk_loop.state_u.lazyiv.cur = SvIV_nomg(sv);
2169 cx->blk_loop.state_u.lazyiv.end = SvIV_nomg(right);
d4665a05
DM
2170#ifdef DEBUGGING
2171 /* for correct -Dstv display */
2172 cx->blk_oldsp = sp - PL_stack_base;
2173#endif
89ea2908 2174 }
3f63a782 2175 else {
d01136d6
BS
2176 cx->cx_type &= ~CXTYPEMASK;
2177 cx->cx_type |= CXt_LOOP_LAZYSV;
2178 /* Make sure that no-one re-orders cop.h and breaks our
2179 assumptions */
2180 assert(CxTYPE(cx) == CXt_LOOP_LAZYSV);
2181 cx->blk_loop.state_u.lazysv.cur = newSVsv(sv);
2182 cx->blk_loop.state_u.lazysv.end = right;
2183 SvREFCNT_inc(right);
2184 (void) SvPV_force_nolen(cx->blk_loop.state_u.lazysv.cur);
267cc4a8
NC
2185 /* This will do the upgrade to SVt_PV, and warn if the value
2186 is uninitialised. */
10516c54 2187 (void) SvPV_nolen_const(right);
267cc4a8
NC
2188 /* Doing this avoids a check every time in pp_iter in pp_hot.c
2189 to replace !SvOK() with a pointer to "". */
2190 if (!SvOK(right)) {
2191 SvREFCNT_dec(right);
d01136d6 2192 cx->blk_loop.state_u.lazysv.end = &PL_sv_no;
267cc4a8 2193 }
3f63a782 2194 }
89ea2908 2195 }
d01136d6 2196 else /* SvTYPE(maybe_ary) == SVt_PVAV */ {
502c6561 2197 cx->blk_loop.state_u.ary.ary = MUTABLE_AV(maybe_ary);
d01136d6
BS
2198 SvREFCNT_inc(maybe_ary);
2199 cx->blk_loop.state_u.ary.ix =
2200 (PL_op->op_private & OPpITER_REVERSED) ?
2201 AvFILL(cx->blk_loop.state_u.ary.ary) + 1 :
2202 -1;
ef3e5ea9 2203 }
89ea2908 2204 }
d01136d6
BS
2205 else { /* iterating over items on the stack */
2206 cx->blk_loop.state_u.ary.ary = NULL; /* means to use the stack */
ef3e5ea9 2207 if (PL_op->op_private & OPpITER_REVERSED) {
d01136d6 2208 cx->blk_loop.state_u.ary.ix = cx->blk_oldsp + 1;
ef3e5ea9
NC
2209 }
2210 else {
d01136d6 2211 cx->blk_loop.state_u.ary.ix = MARK - PL_stack_base;
ef3e5ea9 2212 }
4633a7c4 2213 }
a0d0e21e
LW
2214
2215 RETURN;
2216}
2217
2218PP(pp_enterloop)
2219{
27da23d5 2220 dVAR; dSP;
eb578fdb 2221 PERL_CONTEXT *cx;
f54cb97a 2222 const I32 gimme = GIMME_V;
a0d0e21e 2223
d343c3ef 2224 ENTER_with_name("loop1");
a0d0e21e 2225 SAVETMPS;
d343c3ef 2226 ENTER_with_name("loop2");
a0d0e21e 2227
3b719c58
NC
2228 PUSHBLOCK(cx, CXt_LOOP_PLAIN, SP);
2229 PUSHLOOP_PLAIN(cx, SP);
a0d0e21e
LW
2230
2231 RETURN;
2232}
2233
2234PP(pp_leaveloop)
2235{
27da23d5 2236 dVAR; dSP;
eb578fdb 2237 PERL_CONTEXT *cx;
a0d0e21e
LW
2238 I32 gimme;
2239 SV **newsp;
2240 PMOP *newpm;
2241 SV **mark;
2242
2243 POPBLOCK(cx,newpm);
3b719c58 2244 assert(CxTYPE_is_LOOP(cx));
4fdae800 2245 mark = newsp;
a8bba7fa 2246 newsp = PL_stack_base + cx->blk_loop.resetsp;
f86702cc 2247
a1f49e72 2248 TAINT_NOT;
b9d76716 2249 SP = adjust_stack_on_leave(newsp, SP, MARK, gimme, 0);
f86702cc 2250 PUTBACK;
2251
a8bba7fa 2252 POPLOOP(cx); /* Stack values are safe: release loop vars ... */
3280af22 2253 PL_curpm = newpm; /* ... and pop $1 et al */
f86702cc 2254
d343c3ef
GG
2255 LEAVE_with_name("loop2");
2256 LEAVE_with_name("loop1");
a0d0e21e 2257
f86702cc 2258 return NORMAL;
a0d0e21e
LW
2259}
2260
3bdf583b
FC
2261STATIC void
2262S_return_lvalues(pTHX_ SV **mark, SV **sp, SV **newsp, I32 gimme,
d25b0d7b 2263 PERL_CONTEXT *cx, PMOP *newpm)
3bdf583b 2264{
80422e24 2265 const bool ref = !!(CxLVAL(cx) & OPpENTERSUB_INARGS);
3bdf583b 2266 if (gimme == G_SCALAR) {
d25b0d7b
FC
2267 if (CxLVAL(cx) && !ref) { /* Leave it as it is if we can. */
2268 SV *sv;
001de122 2269 const char *what = NULL;
d25b0d7b
FC
2270 if (MARK < SP) {
2271 assert(MARK+1 == SP);
2272 if ((SvPADTMP(TOPs) ||
2273 (SvFLAGS(TOPs) & (SVf_READONLY | SVf_FAKE))
2274 == SVf_READONLY
2275 ) &&
2276 !SvSMAGICAL(TOPs)) {
001de122 2277 what =
d25b0d7b 2278 SvREADONLY(TOPs) ? (TOPs == &PL_sv_undef) ? "undef"
001de122 2279 : "a readonly value" : "a temporary";
d25b0d7b 2280 }
001de122 2281 else goto copy_sv;
d25b0d7b
FC
2282 }
2283 else {
2284 /* sub:lvalue{} will take us here. */
001de122 2285 what = "undef";
d25b0d7b 2286 }
001de122
FC
2287 LEAVE;
2288 cxstack_ix--;
2289 POPSUB(cx,sv);
2290 PL_curpm = newpm;
2291 LEAVESUB(sv);
2292 Perl_croak(aTHX_
2293 "Can't return %s from lvalue subroutine", what
2294 );
d25b0d7b 2295 }
93905212 2296 if (MARK < SP) {
a5ad7a5a 2297 copy_sv:
3bdf583b 2298 if (cx->blk_sub.cv && CvDEPTH(cx->blk_sub.cv) > 1) {
5811c07e 2299 if (!SvPADTMP(*SP)) {
3bdf583b
FC
2300 *++newsp = SvREFCNT_inc(*SP);
2301 FREETMPS;
2302 sv_2mortal(*newsp);
5811c07e
FC
2303 }
2304 else {
2305 /* FREETMPS could clobber it */
2306 SV *sv = SvREFCNT_inc(*SP);
2307 FREETMPS;
2308 *++newsp = sv_mortalcopy(sv);
2309 SvREFCNT_dec(sv);
2310 }
3bdf583b
FC
2311 }
2312 else
e08be60b 2313 *++newsp =
5811c07e
FC
2314 SvPADTMP(*SP)
2315 ? sv_mortalcopy(*SP)
2316 : !SvTEMP(*SP)
e08be60b
FC
2317 ? sv_2mortal(SvREFCNT_inc_simple_NN(*SP))
2318 : *SP;
3bdf583b 2319 }
0d235c77
FC
2320 else {
2321 EXTEND(newsp,1);
3bdf583b 2322 *++newsp = &PL_sv_undef;
0d235c77 2323 }
0e9700df 2324 if (CxLVAL(cx) & OPpDEREF) {
767eda44
FC
2325 SvGETMAGIC(TOPs);
2326 if (!SvOK(TOPs)) {
0e9700df 2327 TOPs = vivify_ref(TOPs, CxLVAL(cx) & OPpDEREF);
767eda44
FC
2328 }
2329 }
3bdf583b
FC
2330 }
2331 else if (gimme == G_ARRAY) {
0e9700df 2332 assert (!(CxLVAL(cx) & OPpDEREF));
80422e24 2333 if (ref || !CxLVAL(cx))
e08be60b
FC
2334 while (++MARK <= SP)
2335 *++newsp =
5811c07e 2336 SvFLAGS(*MARK) & SVs_PADTMP
80422e24 2337 ? sv_mortalcopy(*MARK)
5811c07e
FC
2338 : SvTEMP(*MARK)
2339 ? *MARK
80422e24 2340 : sv_2mortal(SvREFCNT_inc_simple_NN(*MARK));
e08be60b 2341 else while (++MARK <= SP) {
d25b0d7b
FC
2342 if (*MARK != &PL_sv_undef
2343 && (SvPADTMP(*MARK)
2344 || (SvFLAGS(*MARK) & (SVf_READONLY|SVf_FAKE))
2345 == SVf_READONLY
2346 )
2347 ) {
2348 SV *sv;
2349 /* Might be flattened array after $#array = */
2350 PUTBACK;
2351 LEAVE;
2352 cxstack_ix--;
2353 POPSUB(cx,sv);
2354 PL_curpm = newpm;
2355 LEAVESUB(sv);
ae917476 2356 /* diag_listed_as: Can't return %s from lvalue subroutine */
d25b0d7b
FC
2357 Perl_croak(aTHX_
2358 "Can't return a %s from lvalue subroutine",
2359 SvREADONLY(TOPs) ? "readonly value" : "temporary");
2360 }
2361 else
4bee03f8
FC
2362 *++newsp =
2363 SvTEMP(*MARK)
2364 ? *MARK
2365 : sv_2mortal(SvREFCNT_inc_simple_NN(*MARK));
3bdf583b
FC
2366 }
2367 }
2368 PL_stack_sp = newsp;
2369}
2370
a0d0e21e
LW
2371PP(pp_return)
2372{
27da23d5 2373 dVAR; dSP; dMARK;
eb578fdb 2374 PERL_CONTEXT *cx;
f86702cc 2375 bool popsub2 = FALSE;
b45de488 2376 bool clear_errsv = FALSE;
fa1e92c4 2377 bool lval = FALSE;
a0d0e21e
LW
2378 I32 gimme;
2379 SV **newsp;
2380 PMOP *newpm;
2381 I32 optype = 0;
b6494f15 2382 SV *namesv;
b0d9ce38 2383 SV *sv;
b263a1ad 2384 OP *retop = NULL;
a0d0e21e 2385
0bd48802
AL
2386 const I32 cxix = dopoptosub(cxstack_ix);
2387
9850bf21
RH
2388 if (cxix < 0) {
2389 if (CxMULTICALL(cxstack)) { /* In this case we must be in a
2390 * sort block, which is a CXt_NULL
2391 * not a CXt_SUB */
2392 dounwind(0);
d7507f74
RH
2393 PL_stack_base[1] = *PL_stack_sp;
2394 PL_stack_sp = PL_stack_base + 1;
a0d0e21e
LW
2395 return 0;
2396 }
9850bf21
RH
2397 else
2398 DIE(aTHX_ "Can't return outside a subroutine");
a0d0e21e 2399 }
a0d0e21e
LW
2400 if (cxix < cxstack_ix)
2401 dounwind(cxix);
2402
d7507f74
RH
2403 if (CxMULTICALL(&cxstack[cxix])) {
2404 gimme = cxstack[cxix].blk_gimme;
2405 if (gimme == G_VOID)
2406 PL_stack_sp = PL_stack_base;
2407 else if (gimme == G_SCALAR) {
2408 PL_stack_base[1] = *PL_stack_sp;
2409 PL_stack_sp = PL_stack_base + 1;
2410 }
9850bf21 2411 return 0;
d7507f74 2412 }
9850bf21 2413
a0d0e21e 2414 POPBLOCK(cx,newpm);
6b35e009 2415 switch (CxTYPE(cx)) {
a0d0e21e 2416 case CXt_SUB:
f86702cc 2417 popsub2 = TRUE;
fa1e92c4 2418 lval = !!CvLVALUE(cx->blk_sub.cv);
f39bc417 2419 retop = cx->blk_sub.retop;
5dd42e15 2420 cxstack_ix++; /* preserve cx entry on stack for use by POPSUB */
a0d0e21e
LW
2421 break;
2422 case CXt_EVAL:
b45de488
GS
2423 if (!(PL_in_eval & EVAL_KEEPERR))
2424 clear_errsv = TRUE;
a0d0e21e 2425 POPEVAL(cx);
b6494f15 2426 namesv = cx->blk_eval.old_namesv;
f39bc417 2427 retop = cx->blk_eval.retop;
1d76a5c3
GS
2428 if (CxTRYBLOCK(cx))
2429 break;
748a9306
LW
2430 if (optype == OP_REQUIRE &&
2431 (MARK == SP || (gimme == G_SCALAR && !SvTRUE(*SP))) )
2432 {
54310121 2433 /* Unassume the success we assumed earlier. */
b6494f15 2434 (void)hv_delete(GvHVn(PL_incgv),
ecad31f0 2435 SvPVX_const(namesv),
c60dbbc3 2436 SvUTF8(namesv) ? -(I32)SvCUR(namesv) : (I32)SvCUR(namesv),
b6494f15
VP
2437 G_DISCARD);
2438 DIE(aTHX_ "%"SVf" did not return a true value", SVfARG(namesv));
748a9306 2439 }
a0d0e21e 2440 break;
7766f137
GS
2441 case CXt_FORMAT:
2442 POPFORMAT(cx);
f39bc417 2443 retop = cx->blk_sub.retop;
7766f137 2444 break;
a0d0e21e 2445 default:
5637ef5b 2446 DIE(aTHX_ "panic: return, type=%u", (unsigned) CxTYPE(cx));
a0d0e21e
LW
2447 }
2448
a1f49e72 2449 TAINT_NOT;
d25b0d7b 2450 if (lval) S_return_lvalues(aTHX_ MARK, SP, newsp, gimme, cx, newpm);
3bdf583b
FC
2451 else {
2452 if (gimme == G_SCALAR) {
a29cdaf0
IZ
2453 if (MARK < SP) {
2454 if (popsub2) {
a8bba7fa 2455 if (cx->blk_sub.cv && CvDEPTH(cx->blk_sub.cv) > 1) {
6f48390a
FC
2456 if (SvTEMP(TOPs) && SvREFCNT(TOPs) == 1
2457 && !SvMAGICAL(TOPs)) {
a29cdaf0
IZ
2458 *++newsp = SvREFCNT_inc(*SP);
2459 FREETMPS;
2460 sv_2mortal(*newsp);
959e3673
GS
2461 }
2462 else {
2463 sv = SvREFCNT_inc(*SP); /* FREETMPS could clobber it */
a29cdaf0 2464 FREETMPS;
959e3673
GS
2465 *++newsp = sv_mortalcopy(sv);
2466 SvREFCNT_dec(sv);
a29cdaf0 2467 }
959e3673 2468 }
6f48390a
FC
2469 else if (SvTEMP(*SP) && SvREFCNT(*SP) == 1
2470 && !SvMAGICAL(*SP)) {
767eda44 2471 *++newsp = *SP;
767eda44 2472 }
959e3673 2473 else
767eda44 2474 *++newsp = sv_mortalcopy(*SP);
959e3673
GS
2475 }
2476 else
a29cdaf0 2477 *++newsp = sv_mortalcopy(*SP);
959e3673
GS
2478 }
2479 else
3280af22 2480 *++newsp = &PL_sv_undef;
3bdf583b
FC
2481 }
2482 else if (gimme == G_ARRAY) {
a1f49e72 2483 while (++MARK <= SP) {
3ed94dc0 2484 *++newsp = popsub2 && SvTEMP(*MARK) && SvREFCNT(*MARK) == 1
6f48390a 2485 && !SvGMAGICAL(*MARK)
f86702cc 2486 ? *MARK : sv_mortalcopy(*MARK);
a1f49e72
CS
2487 TAINT_NOT; /* Each item is independent */
2488 }
3bdf583b
FC
2489 }
2490 PL_stack_sp = newsp;
a0d0e21e 2491 }
a0d0e21e 2492
5dd42e15 2493 LEAVE;
f86702cc 2494 /* Stack values are safe: */
2495 if (popsub2) {
5dd42e15 2496 cxstack_ix--;
b0d9ce38 2497 POPSUB(cx,sv); /* release CV and @_ ... */
f86702cc 2498 }
b0d9ce38 2499 else
c445ea15 2500 sv = NULL;
3280af22 2501 PL_curpm = newpm; /* ... and pop $1 et al */
f86702cc 2502
b0d9ce38 2503 LEAVESUB(sv);
8433848b 2504 if (clear_errsv) {
ab69dbc2 2505 CLEAR_ERRSV();
8433848b 2506 }
f39bc417 2507 return retop;
a0d0e21e
LW
2508}
2509
4f443c3d
FC
2510/* This duplicates parts of pp_leavesub, so that it can share code with
2511 * pp_return */
2512PP(pp_leavesublv)
2513{
2514 dVAR; dSP;
4f443c3d
FC
2515 SV **newsp;
2516 PMOP *newpm;
2517 I32 gimme;
eb578fdb 2518 PERL_CONTEXT *cx;
4f443c3d
FC
2519 SV *sv;
2520
2521 if (CxMULTICALL(&cxstack[cxstack_ix]))
2522 return 0;
2523
2524 POPBLOCK(cx,newpm);
2525 cxstack_ix++; /* temporarily protect top context */
4f443c3d
FC
2526
2527 TAINT_NOT;
2528
0d235c77 2529 S_return_lvalues(aTHX_ newsp, SP, newsp, gimme, cx, newpm);
4f443c3d
FC
2530
2531 LEAVE;
2532 cxstack_ix--;
2533 POPSUB(cx,sv); /* Stack values are safe: release CV and @_ ... */
2534 PL_curpm = newpm; /* ... and pop $1 et al */
2535
2536 LEAVESUB(sv);
2537 return cx->blk_sub.retop;
2538}
2539
1f039d60
FC
2540static I32
2541S_unwind_loop(pTHX_ const char * const opname)
a0d0e21e 2542{
1f039d60 2543 dVAR;
a0d0e21e 2544 I32 cxix;
1f039d60
FC
2545 if (PL_op->op_flags & OPf_SPECIAL) {
2546 cxix = dopoptoloop(cxstack_ix);
2547 if (cxix < 0)
2548 /* diag_listed_as: Can't "last" outside a loop block */
2549 Perl_croak(aTHX_ "Can't \"%s\" outside a loop block", opname);
2550 }
2551 else {
2552 dSP;
2553 STRLEN label_len;
2554 const char * const label =
2555 PL_op->op_flags & OPf_STACKED
2556 ? SvPV(TOPs,label_len)
2557 : (label_len = strlen(cPVOP->op_pv), cPVOP->op_pv);
2558 const U32 label_flags =
2559 PL_op->op_flags & OPf_STACKED
2560 ? SvUTF8(POPs)
2561 : (cPVOP->op_private & OPpPV_IS_UTF8) ? SVf_UTF8 : 0;
2562 PUTBACK;
2563 cxix = dopoptolabel(label, label_len, label_flags);
2564 if (cxix < 0)
2565 /* diag_listed_as: Label not found for "last %s" */
2566 Perl_croak(aTHX_ "Label not found for \"%s %"SVf"\"",
2567 opname,
2568 SVfARG(PL_op->op_flags & OPf_STACKED
2569 && !SvGMAGICAL(TOPp1s)
2570 ? TOPp1s
2571 : newSVpvn_flags(label,
2572 label_len,
2573 label_flags | SVs_TEMP)));
2574 }
2575 if (cxix < cxstack_ix)
2576 dounwind(cxix);
2577 return cxix;
2578}
2579
2580PP(pp_last)
2581{
2582 dVAR;
eb578fdb 2583 PERL_CONTEXT *cx;
f86702cc 2584 I32 pop2 = 0;
a0d0e21e 2585 I32 gimme;
8772537c 2586 I32 optype;
b263a1ad 2587 OP *nextop = NULL;
a0d0e21e
LW
2588 SV **newsp;
2589 PMOP *newpm;
a8bba7fa 2590 SV **mark;
c445ea15 2591 SV *sv = NULL;
9d4ba2ae 2592
1f039d60 2593 S_unwind_loop(aTHX_ "last");
a0d0e21e
LW
2594
2595 POPBLOCK(cx,newpm);
5dd42e15 2596 cxstack_ix++; /* temporarily protect top context */
a8bba7fa 2597 mark = newsp;
6b35e009 2598 switch (CxTYPE(cx)) {
c6fdafd0 2599 case CXt_LOOP_LAZYIV:
d01136d6 2600 case CXt_LOOP_LAZYSV:
3b719c58
NC
2601 case CXt_LOOP_FOR:
2602 case CXt_LOOP_PLAIN:
2603 pop2 = CxTYPE(cx);
a8bba7fa 2604 newsp = PL_stack_base + cx->blk_loop.resetsp;
022eaa24 2605 nextop = cx->blk_loop.my_op->op_lastop->op_next;
a0d0e21e 2606 break;
f86702cc 2607 case CXt_SUB:
f86702cc 2608 pop2 = CXt_SUB;
f39bc417 2609 nextop = cx->blk_sub.retop;
a0d0e21e 2610 break;
f86702cc 2611 case CXt_EVAL:
2612 POPEVAL(cx);
f39bc417 2613 nextop = cx->blk_eval.retop;
a0d0e21e 2614 break;
7766f137
GS
2615 case CXt_FORMAT:
2616 POPFORMAT(cx);
f39bc417 2617 nextop = cx->blk_sub.retop;
7766f137 2618 break;
a0d0e21e 2619 default:
5637ef5b 2620 DIE(aTHX_ "panic: last, type=%u", (unsigned) CxTYPE(cx));
a0d0e21e
LW
2621 }
2622
a1f49e72 2623 TAINT_NOT;
1f039d60 2624 PL_stack_sp = adjust_stack_on_leave(newsp, PL_stack_sp, MARK, gimme,
b9d76716 2625 pop2 == CXt_SUB ? SVs_TEMP : 0);
f86702cc 2626
5dd42e15
DM
2627 LEAVE;
2628 cxstack_ix--;
f86702cc 2629 /* Stack values are safe: */
2630 switch (pop2) {
c6fdafd0 2631 case CXt_LOOP_LAZYIV:
3b719c58 2632 case CXt_LOOP_PLAIN:
d01136d6 2633 case CXt_LOOP_LAZYSV:
3b719c58 2634 case CXt_LOOP_FOR:
a8bba7fa 2635 POPLOOP(cx); /* release loop vars ... */
4fdae800 2636 LEAVE;
f86702cc 2637 break;
2638 case CXt_SUB:
b0d9ce38 2639 POPSUB(cx,sv); /* release CV and @_ ... */
f86702cc 2640 break;
a0d0e21e 2641 }
3280af22 2642 PL_curpm = newpm; /* ... and pop $1 et al */
a0d0e21e 2643
b0d9ce38 2644 LEAVESUB(sv);
9d4ba2ae
AL
2645 PERL_UNUSED_VAR(optype);
2646 PERL_UNUSED_VAR(gimme);
f86702cc 2647 return nextop;
a0d0e21e
LW
2648}
2649
2650PP(pp_next)
2651{
27da23d5 2652 dVAR;
eb578fdb 2653 PERL_CONTEXT *cx;
1f039d60 2654 const I32 inner = PL_scopestack_ix;
a0d0e21e 2655
1f039d60 2656 S_unwind_loop(aTHX_ "next");
a0d0e21e 2657
85538317
GS
2658 /* clear off anything above the scope we're re-entering, but
2659 * save the rest until after a possible continue block */
1ba6ee2b 2660 TOPBLOCK(cx);
85538317
GS
2661 if (PL_scopestack_ix < inner)
2662 leave_scope(PL_scopestack[PL_scopestack_ix]);
3a1b2b9e 2663 PL_curcop = cx->blk_oldcop;
d57ce4df 2664 return (cx)->blk_loop.my_op->op_nextop;
a0d0e21e
LW
2665}
2666
2667PP(pp_redo)
2668{
27da23d5 2669 dVAR;
1f039d60 2670 const I32 cxix = S_unwind_loop(aTHX_ "redo");
eb578fdb 2671 PERL_CONTEXT *cx;
a0d0e21e 2672 I32 oldsave;
1f039d60 2673 OP* redo_op = cxstack[cxix].blk_loop.my_op->op_redoop;
a0d0e21e 2674
a034e688
DM
2675 if (redo_op->op_type == OP_ENTER) {
2676 /* pop one less context to avoid $x being freed in while (my $x..) */
2677 cxstack_ix++;
2678 assert(CxTYPE(&cxstack[cxstack_ix]) == CXt_BLOCK);
2679 redo_op = redo_op->op_next;
2680 }
2681
a0d0e21e 2682 TOPBLOCK(cx);
3280af22 2683 oldsave = PL_scopestack[PL_scopestack_ix - 1];
a0d0e21e 2684 LEAVE_SCOPE(oldsave);
936c78b5 2685 FREETMPS;
3a1b2b9e 2686 PL_curcop = cx->blk_oldcop;
a034e688 2687 return redo_op;
a0d0e21e
LW
2688}
2689
0824fdcb 2690STATIC OP *
5db1eb8d 2691S_dofindlabel(pTHX_ OP *o, const char *label, STRLEN len, U32 flags, OP **opstack, OP **oplimit)
a0d0e21e 2692{
97aff369 2693 dVAR;
a0d0e21e 2694 OP **ops = opstack;
a1894d81 2695 static const char* const too_deep = "Target of goto is too deeply nested";
a0d0e21e 2696
7918f24d
NC
2697 PERL_ARGS_ASSERT_DOFINDLABEL;
2698
fc36a67e 2699 if (ops >= oplimit)
cea2e8a9 2700 Perl_croak(aTHX_ too_deep);
11343788
MB
2701 if (o->op_type == OP_LEAVE ||
2702 o->op_type == OP_SCOPE ||
2703 o->op_type == OP_LEAVELOOP ||
33d34e4c 2704 o->op_type == OP_LEAVESUB ||
11343788 2705 o->op_type == OP_LEAVETRY)
fc36a67e 2706 {
5dc0d613 2707 *ops++ = cUNOPo->op_first;
fc36a67e 2708 if (ops >= oplimit)
cea2e8a9 2709 Perl_croak(aTHX_ too_deep);
fc36a67e 2710 }
c4aa4e48 2711 *ops = 0;
11343788 2712 if (o->op_flags & OPf_KIDS) {
aec46f14 2713 OP *kid;
a0d0e21e 2714 /* First try all the kids at this level, since that's likeliest. */
11343788 2715 for (kid = cUNOPo->op_first; kid; kid = kid->op_sibling) {
7e8f1eac 2716 if (kid->op_type == OP_NEXTSTATE || kid->op_type == OP_DBSTATE) {
5db1eb8d
BF
2717 STRLEN kid_label_len;
2718 U32 kid_label_flags;
2719 const char *kid_label = CopLABEL_len_flags(kCOP,
2720 &kid_label_len, &kid_label_flags);
2721 if (kid_label && (
2722 ( (kid_label_flags & SVf_UTF8) != (flags & SVf_UTF8) ) ?
2723 (flags & SVf_UTF8)
2724 ? (bytes_cmp_utf8(
2725 (const U8*)kid_label, kid_label_len,
2726 (const U8*)label, len) == 0)
2727 : (bytes_cmp_utf8(
2728 (const U8*)label, len,
2729 (const U8*)kid_label, kid_label_len) == 0)
eade7155
BF
2730 : ( len == kid_label_len && ((kid_label == label)
2731 || memEQ(kid_label, label, len)))))
7e8f1eac
AD
2732 return kid;
2733 }
a0d0e21e 2734 }
11343788 2735 for (kid = cUNOPo->op_first; kid; kid = kid->op_sibling) {
3280af22 2736 if (kid == PL_lastgotoprobe)
a0d0e21e 2737 continue;
ed8d0fe2
SM
2738 if (kid->op_type == OP_NEXTSTATE || kid->op_type == OP_DBSTATE) {
2739 if (ops == opstack)
2740 *ops++ = kid;
2741 else if (ops[-1]->op_type == OP_NEXTSTATE ||
2742 ops[-1]->op_type == OP_DBSTATE)
2743 ops[-1] = kid;
2744 else
2745 *ops++ = kid;
2746 }
5db1eb8d 2747 if ((o = dofindlabel(kid, label, len, flags, ops, oplimit)))
11343788 2748 return o;
a0d0e21e
LW
2749 }
2750 }
c4aa4e48 2751 *ops = 0;
a0d0e21e
LW
2752 return 0;
2753}
2754
a0d0e21e
LW
2755PP(pp_goto)
2756{
27da23d5 2757 dVAR; dSP;
cbbf8932 2758 OP *retop = NULL;
a0d0e21e 2759 I32 ix;
eb578fdb 2760 PERL_CONTEXT *cx;
fc36a67e 2761#define GOTO_DEPTH 64
2762 OP *enterops[GOTO_DEPTH];
cbbf8932 2763 const char *label = NULL;
5db1eb8d
BF
2764 STRLEN label_len = 0;
2765 U32 label_flags = 0;
bfed75c6 2766 const bool do_dump = (PL_op->op_type == OP_DUMP);
a1894d81 2767 static const char* const must_have_label = "goto must have label";
a0d0e21e 2768
533c011a 2769 if (PL_op->op_flags & OPf_STACKED) {
9d4ba2ae 2770 SV * const sv = POPs;
55b37f1c 2771 SvGETMAGIC(sv);
a0d0e21e
LW
2772
2773 /* This egregious kludge implements goto &subroutine */
2774 if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVCV) {
2775 I32 cxix;
eb578fdb 2776 PERL_CONTEXT *cx;
ea726b52 2777 CV *cv = MUTABLE_CV(SvRV(sv));
049bd5ff 2778 AV *arg = GvAV(PL_defgv);
a0d0e21e
LW
2779 I32 oldsave;
2780
e8f7dd13 2781 retry:
4aa0a1f7 2782 if (!CvROOT(cv) && !CvXSUB(cv)) {
7fc63493 2783 const GV * const gv = CvGV(cv);
e8f7dd13 2784 if (gv) {
7fc63493 2785 GV *autogv;
e8f7dd13
GS
2786 SV *tmpstr;
2787 /* autoloaded stub? */
2788 if (cv != GvCV(gv) && (cv = GvCV(gv)))
2789 goto retry;
c271df94
BF
2790 autogv = gv_autoload_pvn(GvSTASH(gv), GvNAME(gv),
2791 GvNAMELEN(gv),
2792 GvNAMEUTF8(gv) ? SVf_UTF8 : 0);
e8f7dd13
GS
2793 if (autogv && (cv = GvCV(autogv)))
2794 goto retry;
2795 tmpstr = sv_newmortal();
c445ea15 2796 gv_efullname3(tmpstr, gv, NULL);
be2597df 2797 DIE(aTHX_ "Goto undefined subroutine &%"SVf"", SVfARG(tmpstr));
4aa0a1f7 2798 }
cea2e8a9 2799 DIE(aTHX_ "Goto undefined subroutine");
4aa0a1f7
AD
2800 }
2801
a0d0e21e 2802 /* First do some returnish stuff. */
b37c2d43 2803 SvREFCNT_inc_simple_void(cv); /* avoid premature free during unwind */
71fc2216 2804 FREETMPS;
a0d0e21e
LW
2805 cxix = dopoptosub(cxstack_ix);
2806 if (cxix < 0)
110af908
FC
2807 {
2808 SvREFCNT_dec(cv);
cea2e8a9 2809 DIE(aTHX_ "Can't goto subroutine outside a subroutine");
110af908 2810 }
a0d0e21e
LW
2811 if (cxix < cxstack_ix)
2812 dounwind(cxix);
2813 TOPBLOCK(cx);
2d43a17f 2814 SPAGAIN;
564abe23 2815 /* ban goto in eval: see <20050521150056.GC20213@iabyn.com> */
2d43a17f 2816 if (CxTYPE(cx) == CXt_EVAL) {
110af908 2817 SvREFCNT_dec(cv);
c74ace89 2818 if (CxREALEVAL(cx))
00455a92 2819 /* diag_listed_as: Can't goto subroutine from an eval-%s */
c74ace89
DM
2820 DIE(aTHX_ "Can't goto subroutine from an eval-string");
2821 else
00455a92 2822 /* diag_listed_as: Can't goto subroutine from an eval-%s */
c74ace89 2823 DIE(aTHX_ "Can't goto subroutine from an eval-block");
2d43a17f 2824 }
9850bf21 2825 else if (CxMULTICALL(cx))
110af908
FC
2826 {
2827 SvREFCNT_dec(cv);
9850bf21 2828 DIE(aTHX_ "Can't goto subroutine from a sort sub (or similar callback)");
110af908 2829 }
bafb2adc 2830 if (CxTYPE(cx) == CXt_SUB && CxHASARGS(cx)) {
a0d0e21e 2831 AV* av = cx->blk_sub.argarray;
bfed75c6 2832
049bd5ff
FC
2833 /* abandon the original @_ if it got reified or if it is
2834 the same as the current @_ */
2835 if (AvREAL(av) || av == arg) {
b1464ded 2836 SvREFCNT_dec(av);
d8b46c1b 2837 av = newAV();
11ca45c0 2838 AvREIFY_only(av);
ad64d0ec 2839 PAD_SVl(0) = MUTABLE_SV(cx->blk_sub.argarray = av);
62b1ebc2 2840 }
049bd5ff 2841 else CLEAR_ARGARRAY(av);
a0d0e21e 2842 }
049bd5ff
FC
2843 /* We donate this refcount later to the callee’s pad. */
2844 SvREFCNT_inc_simple_void(arg);
6b35e009 2845 if (CxTYPE(cx) == CXt_SUB &&
b150fb22 2846 !(CvDEPTH(cx->blk_sub.cv) = cx->blk_sub.olddepth))
a0d0e21e 2847 SvREFCNT_dec(cx->blk_sub.cv);
3280af22 2848 oldsave = PL_scopestack[PL_scopestack_ix - 1];
a0d0e21e
LW
2849 LEAVE_SCOPE(oldsave);
2850
1d59c038
FC
2851 /* A destructor called during LEAVE_SCOPE could have undefined
2852 * our precious cv. See bug #99850. */
2853 if (!CvROOT(cv) && !CvXSUB(cv)) {
2854 const GV * const gv = CvGV(cv);
049bd5ff 2855 SvREFCNT_dec(arg);
1d59c038
FC
2856 if (gv) {
2857 SV * const tmpstr = sv_newmortal();
2858 gv_efullname3(tmpstr, gv, NULL);
2859 DIE(aTHX_ "Goto undefined subroutine &%"SVf"",
2860 SVfARG(tmpstr));
2861 }
2862 DIE(aTHX_ "Goto undefined subroutine");
2863 }
2864
a0d0e21e
LW
2865 /* Now do some callish stuff. */
2866 SAVETMPS;
5023d17a 2867 SAVEFREESV(cv); /* later, undo the 'avoid premature free' hack */
aed2304a 2868 if (CvISXSUB(cv)) {
b37c2d43 2869 OP* const retop = cx->blk_sub.retop;
9d63fa07
KW
2870 SV **newsp PERL_UNUSED_DECL;
2871 I32 gimme PERL_UNUSED_DECL;
049bd5ff
FC
2872 const SSize_t items = AvFILLp(arg) + 1;
2873 SV** mark;
2874
2875 /* put GvAV(defgv) back onto stack */
2876 EXTEND(SP, items+1); /* @_ could have been extended. */
2877 Copy(AvARRAY(arg), SP + 1, items, SV*);
2878 mark = SP;
2879 SP += items;
2880 if (AvREAL(arg)) {
b1464ded
DM
2881 I32 index;
2882 for (index=0; index<items; index++)
049bd5ff
FC
2883 SvREFCNT_inc_void(sv_2mortal(SP[-index]));
2884 }
2885 SvREFCNT_dec(arg);
2886 if (CxTYPE(cx) == CXt_SUB && CxHASARGS(cx)) {
2887 /* Restore old @_ */
2888 arg = GvAV(PL_defgv);
2889 GvAV(PL_defgv) = cx->blk_sub.savearray;
2890 SvREFCNT_dec(arg);
b1464ded 2891 }
1fa4e549 2892
b37c2d43
AL
2893 /* XS subs don't have a CxSUB, so pop it */
2894 POPBLOCK(cx, PL_curpm);
2895 /* Push a mark for the start of arglist */
2896 PUSHMARK(mark);
2897 PUTBACK;
2898 (void)(*CvXSUB(cv))(aTHX_ cv);
a57c6685 2899 LEAVE;
5eff7df7 2900 return retop;
a0d0e21e
LW
2901 }
2902 else {
b70d5558 2903 PADLIST * const padlist = CvPADLIST(cv);
a0d0e21e 2904 cx->blk_sub.cv = cv;
1a5b3db4 2905 cx->blk_sub.olddepth = CvDEPTH(cv);
dd2155a4 2906
a0d0e21e
LW
2907 CvDEPTH(cv)++;
2908 if (CvDEPTH(cv) < 2)
74c765eb 2909 SvREFCNT_inc_simple_void_NN(cv);
dd2155a4 2910 else {
2b9dff67 2911 if (CvDEPTH(cv) == PERL_SUB_DEPTH_WARN && ckWARN(WARN_RECURSION))
44a8e56a 2912 sub_crush_depth(cv);
26019298 2913 pad_push(padlist, CvDEPTH(cv));
a0d0e21e 2914 }
426a09cd 2915 PL_curcop = cx->blk_oldcop;
fd617465
DM
2916 SAVECOMPPAD();
2917 PAD_SET_CUR_NOSAVE(padlist, CvDEPTH(cv));
bafb2adc 2918 if (CxHASARGS(cx))
6d4ff0d2 2919 {
dd2155a4 2920 CX_CURPAD_SAVE(cx->blk_sub);
a0d0e21e 2921
049bd5ff
FC
2922 /* cx->blk_sub.argarray has no reference count, so we
2923 need something to hang on to our argument array so
2924 that cx->blk_sub.argarray does not end up pointing
2925 to freed memory as the result of undef *_. So put
2926 it in the callee’s pad, donating our refer-
2927 ence count. */
2928 SvREFCNT_dec(PAD_SVl(0));
2929 PAD_SVl(0) = (SV *)(cx->blk_sub.argarray = arg);
2930
2931 /* GvAV(PL_defgv) might have been modified on scope
2932 exit, so restore it. */
2933 if (arg != GvAV(PL_defgv)) {
2934 AV * const av = GvAV(PL_defgv);
2935 GvAV(PL_defgv) = (AV *)SvREFCNT_inc_simple(arg);
2936 SvREFCNT_dec(av);
a0d0e21e
LW
2937 }
2938 }
049bd5ff 2939 else SvREFCNT_dec(arg);
491527d0 2940 if (PERLDB_SUB) { /* Checking curstash breaks DProf. */
005a8a35 2941 Perl_get_db_sub(aTHX_ NULL, cv);
b37c2d43 2942 if (PERLDB_GOTO) {
b96d8cd9 2943 CV * const gotocv = get_cvs("DB::goto", 0);
b37c2d43
AL
2944 if (gotocv) {
2945 PUSHMARK( PL_stack_sp );
ad64d0ec 2946 call_sv(MUTABLE_SV(gotocv), G_SCALAR | G_NODEBUG);
b37c2d43
AL
2947 PL_stack_sp--;
2948 }
491527d0 2949 }
1ce6579f 2950 }
a0d0e21e
LW
2951 RETURNOP(CvSTART(cv));
2952 }
2953 }
1614b0e3 2954 else {
55b37f1c 2955 label = SvPV_nomg_const(sv, label_len);
5db1eb8d 2956 label_flags = SvUTF8(sv);
1614b0e3 2957 }
a0d0e21e 2958 }
2fc690dc 2959 else if (!(PL_op->op_flags & OPf_SPECIAL)) {
5db1eb8d
BF
2960 label = cPVOP->op_pv;
2961 label_flags = (cPVOP->op_private & OPpPV_IS_UTF8) ? SVf_UTF8 : 0;
2962 label_len = strlen(label);
2963 }
2fc690dc 2964 if (!(do_dump || label_len)) DIE(aTHX_ must_have_label);
a0d0e21e 2965
f410a211
NC
2966 PERL_ASYNC_CHECK();
2967
3532f34a 2968 if (label_len) {
cbbf8932 2969 OP *gotoprobe = NULL;
3b2447bc 2970 bool leaving_eval = FALSE;
33d34e4c 2971 bool in_block = FALSE;
cbbf8932 2972 PERL_CONTEXT *last_eval_cx = NULL;
a0d0e21e
LW
2973
2974 /* find label */
2975
d4c19fe8 2976 PL_lastgotoprobe = NULL;
a0d0e21e
LW
2977 *enterops = 0;
2978 for (ix = cxstack_ix; ix >= 0; ix--) {
2979 cx = &cxstack[ix];
6b35e009 2980 switch (CxTYPE(cx)) {
a0d0e21e 2981 case CXt_EVAL:
3b2447bc 2982 leaving_eval = TRUE;
971ecbe6 2983 if (!CxTRYBLOCK(cx)) {
a4f3a277
RH
2984 gotoprobe = (last_eval_cx ?
2985 last_eval_cx->blk_eval.old_eval_root :
2986 PL_eval_root);
2987 last_eval_cx = cx;
9c5794fe
RH
2988 break;
2989 }
2990 /* else fall through */
c6fdafd0 2991 case CXt_LOOP_LAZYIV:
d01136d6 2992 case CXt_LOOP_LAZYSV:
3b719c58
NC
2993 case CXt_LOOP_FOR:
2994 case CXt_LOOP_PLAIN:
bb5aedc1
VP
2995 case CXt_GIVEN:
2996 case CXt_WHEN:
a0d0e21e
LW
2997 gotoprobe = cx->blk_oldcop->op_sibling;
2998 break;
2999 case CXt_SUBST:
3000 continue;
3001 case CXt_BLOCK:
33d34e4c 3002 if (ix) {
a0d0e21e 3003 gotoprobe = cx->blk_oldcop->op_sibling;
33d34e4c
AE
3004 in_block = TRUE;
3005 } else
3280af22 3006 gotoprobe = PL_main_root;
a0d0e21e 3007 break;
b3933176 3008 case CXt_SUB:
9850bf21 3009 if (CvDEPTH(cx->blk_sub.cv) && !CxMULTICALL(cx)) {
b3933176
CS
3010 gotoprobe = CvROOT(cx->blk_sub.cv);
3011 break;
3012 }
3013 /* FALL THROUGH */
7766f137 3014 case CXt_FORMAT:
0a753a76 3015 case CXt_NULL:
a651a37d 3016 DIE(aTHX_ "Can't \"goto\" out of a pseudo block");
a0d0e21e
LW
3017 default:
3018 if (ix)
5637ef5b
NC
3019 DIE(aTHX_ "panic: goto, type=%u, ix=%ld",
3020 CxTYPE(cx), (long) ix);
3280af22 3021 gotoprobe = PL_main_root;
a0d0e21e
LW
3022 break;
3023 }
2b597662 3024 if (gotoprobe) {
5db1eb8d 3025 retop = dofindlabel(gotoprobe, label, label_len, label_flags,
2b597662
GS
3026 enterops, enterops + GOTO_DEPTH);
3027 if (retop)
3028 break;
eae48c89
Z
3029 if (gotoprobe->op_sibling &&
3030 gotoprobe->op_sibling->op_type == OP_UNSTACK &&
3031 gotoprobe->op_sibling->op_sibling) {
3032 retop = dofindlabel(gotoprobe->op_sibling->op_sibling,
5db1eb8d
BF
3033 label, label_len, label_flags, enterops,
3034 enterops + GOTO_DEPTH);
eae48c89
Z
3035 if (retop)
3036 break;
3037 }
2b597662 3038 }
3280af22 3039 PL_lastgotoprobe = gotoprobe;
a0d0e21e
LW
3040 }
3041 if (!retop)
5db1eb8d
BF
3042 DIE(aTHX_ "Can't find label %"SVf,
3043 SVfARG(newSVpvn_flags(label, label_len,
3044 SVs_TEMP | label_flags)));
a0d0e21e 3045
3b2447bc
RH
3046 /* if we're leaving an eval, check before we pop any frames
3047 that we're not going to punt, otherwise the error
3048 won't be caught */
3049
3050 if (leaving_eval && *enterops && enterops[1]) {
3051 I32 i;
3052 for (i = 1; enterops[i]; i++)
3053 if (enterops[i]->op_type == OP_ENTERITER)
3054 DIE(aTHX_ "Can't \"goto\" into the middle of a foreach loop");
3055 }
3056
b500e03b
GG
3057 if (*enterops && enterops[1]) {
3058 I32 i = enterops[1]->op_type == OP_ENTER && in_block ? 2 : 1;
3059 if (enterops[i])
3060 deprecate("\"goto\" to jump into a construct");
3061 }
3062
a0d0e21e
LW
3063 /* pop unwanted frames */
3064
3065 if (ix < cxstack_ix) {
3066 I32 oldsave;
3067
3068 if (ix < 0)
3069 ix = 0;
3070 dounwind(ix);
3071 TOPBLOCK(cx);
3280af22 3072 oldsave = PL_scopestack[PL_scopestack_ix];
a0d0e21e
LW
3073 LEAVE_SCOPE(oldsave);
3074 }
3075
3076 /* push wanted frames */
3077
748a9306 3078 if (*enterops && enterops[1]) {
0bd48802 3079 OP * const oldop = PL_op;
33d34e4c
AE
3080 ix = enterops[1]->op_type == OP_ENTER && in_block ? 2 : 1;
3081 for (; enterops[ix]; ix++) {
533c011a 3082 PL_op = enterops[ix];
84902520
TB
3083 /* Eventually we may want to stack the needed arguments
3084 * for each op. For now, we punt on the hard ones. */
533c011a 3085 if (PL_op->op_type == OP_ENTERITER)
894356b3 3086 DIE(aTHX_ "Can't \"goto\" into the middle of a foreach loop");
16c91539 3087 PL_op->op_ppaddr(aTHX);
a0d0e21e 3088 }
533c011a 3089 PL_op = oldop;
a0d0e21e
LW
3090 }
3091 }
3092
3093 if (do_dump) {
a5f75d66 3094#ifdef VMS
6b88bc9c 3095 if (!retop) retop = PL_main_start;
a5f75d66 3096#endif
3280af22
NIS
3097 PL_restartop = retop;
3098 PL_do_undump = TRUE;
a0d0e21e
LW
3099
3100 my_unexec();
3101
3280af22
NIS
3102 PL_restartop = 0; /* hmm, must be GNU unexec().. */
3103 PL_do_undump = FALSE;
a0d0e21e
LW
3104 }
3105
3106 RETURNOP(retop);
3107}
3108
3109PP(pp_exit)
3110{
97aff369 3111 dVAR;
39644a26 3112 dSP;
a0d0e21e
LW
3113 I32 anum;
3114
3115 if (MAXARG < 1)
3116 anum = 0;
9d3c658e
FC
3117 else if (!TOPs) {
3118 anum = 0; (void)POPs;
3119 }
ff0cee69 3120 else {
a0d0e21e 3121 anum = SvIVx(POPs);
d98f61e7
GS
3122#ifdef VMS
3123 if (anum == 1 && (PL_op->op_private & OPpEXIT_VMSISH))
ff0cee69 3124 anum = 0;
96e176bf 3125 VMSISH_HUSHED = VMSISH_HUSHED || (PL_op->op_private & OPpHUSH_VMSISH);
ff0cee69 3126#endif
3127 }
cc3604b1 3128 PL_exit_flags |= PERL_EXIT_EXPECTED;
81d86705
NC
3129#ifdef PERL_MAD
3130 /* KLUDGE: disable exit 0 in BEGIN blocks when we're just compiling */
3131 if (anum || !(PL_minus_c && PL_madskills))
3132 my_exit(anum);
3133#else
a0d0e21e 3134 my_exit(anum);
81d86705 3135#endif
3280af22 3136 PUSHs(&PL_sv_undef);
a0d0e21e
LW
3137 RETURN;
3138}
3139
a0d0e21e
LW
3140/* Eval. */
3141
0824fdcb 3142STATIC void
cea2e8a9 3143S_save_lines(pTHX_ AV *array, SV *sv)
a0d0e21e 3144{
504618e9 3145 const char *s = SvPVX_const(sv);
890ce7af 3146 const char * const send = SvPVX_const(sv) + SvCUR(sv);
504618e9 3147 I32 line = 1;
a0d0e21e 3148
7918f24d
NC
3149 PERL_ARGS_ASSERT_SAVE_LINES;
3150
a0d0e21e 3151 while (s && s < send) {
f54cb97a 3152 const char *t;
b9f83d2f 3153 SV * const tmpstr = newSV_type(SVt_PVMG);
a0d0e21e 3154
1d963ff3 3155 t = (const char *)memchr(s, '\n', send - s);
a0d0e21e
LW
3156 if (t)
3157 t++;
3158 else
3159 t = send;
3160
3161 sv_setpvn(tmpstr, s, t - s);
3162 av_store(array, line++, tmpstr);
3163 s = t;
3164 }
3165}
3166
22f16304
RU
3167/*
3168=for apidoc docatch
3169
3170Check for the cases 0 or 3 of cur_env.je_ret, only used inside an eval context.
3171
31720 is used as continue inside eval,
3173
31743 is used for a die caught by an inner eval - continue inner loop
3175
3176See cop.h: je_mustcatch, when set at any runlevel to TRUE, means eval ops must
3177establish a local jmpenv to handle exception traps.
3178
3179=cut
3180*/
0824fdcb 3181STATIC OP *
cea2e8a9 3182S_docatch(pTHX_ OP *o)
1e422769 3183{
97aff369 3184 dVAR;
6224f72b 3185 int ret;
06b5626a 3186 OP * const oldop = PL_op;
db36c5a1 3187 dJMPENV;
1e422769 3188
1e422769 3189#ifdef DEBUGGING
54310121 3190 assert(CATCH_GET == TRUE);
1e422769 3191#endif
312caa8e 3192 PL_op = o;
8bffa5f8 3193
14dd3ad8 3194 JMPENV_PUSH(ret);
6224f72b 3195 switch (ret) {
312caa8e 3196 case 0:
abd70938
DM
3197 assert(cxstack_ix >= 0);
3198 assert(CxTYPE(&cxstack[cxstack_ix]) == CXt_EVAL);
3199 cxstack[cxstack_ix].blk_eval.cur_top_env = PL_top_env;
14dd3ad8 3200 redo_body:
85aaa934 3201 CALLRUNOPS(aTHX);
312caa8e
CS
3202 break;
3203 case 3:
8bffa5f8 3204 /* die caught by an inner eval - continue inner loop */
febb3a6d
Z
3205 if (PL_restartop && PL_restartjmpenv == PL_top_env) {
3206 PL_restartjmpenv = NULL;
312caa8e
CS
3207 PL_op = PL_restartop;
3208 PL_restartop = 0;
3209 goto redo_body;
3210 }
3211 /* FALL THROUGH */
3212 default:
14dd3ad8 3213 JMPENV_POP;
533c011a 3214 PL_op = oldop;
6224f72b 3215 JMPENV_JUMP(ret);
118e2215 3216 assert(0); /* NOTREACHED */
1e422769 3217 }
14dd3ad8 3218 JMPENV_POP;
533c011a 3219 PL_op = oldop;
5f66b61c 3220 return NULL;
1e422769 3221}
3222
a3985cdc
DM
3223
3224/*
3225=for apidoc find_runcv
3226
3227Locate the CV corresponding to the currently executing sub or eval.
d819b83a
DM
3228If db_seqp is non_null, skip CVs that are in the DB package and populate
3229*db_seqp with the cop sequence number at the point that the DB:: code was
3230entered. (allows debuggers to eval in the scope of the breakpoint rather
cf525c36 3231than in the scope of the debugger itself).
a3985cdc
DM
3232
3233=cut
3234*/
3235
3236CV*
d819b83a 3237Perl_find_runcv(pTHX_ U32 *db_seqp)
a3985cdc 3238{
db4cf31d 3239 return Perl_find_runcv_where(aTHX_ 0, 0, db_seqp);
70794f7b
FC
3240}
3241
3242/* If this becomes part of the API, it might need a better name. */
3243CV *
db4cf31d 3244Perl_find_runcv_where(pTHX_ U8 cond, IV arg, U32 *db_seqp)
70794f7b 3245{
97aff369 3246 dVAR;
a3985cdc 3247 PERL_SI *si;
b4b0692a 3248 int level = 0;
a3985cdc 3249
d819b83a
DM
3250 if (db_seqp)
3251 *db_seqp = PL_curcop->cop_seq;
a3985cdc 3252 for (si = PL_curstackinfo; si; si = si->si_prev) {
06b5626a 3253 I32 ix;
a3985cdc 3254 for (ix = si->si_cxix; ix >= 0; ix--) {
06b5626a 3255 const PERL_CONTEXT *cx = &(si->si_cxstack[ix]);
70794f7b 3256 CV *cv = NULL;
d819b83a 3257 if (CxTYPE(cx) == CXt_SUB || CxTYPE(cx) == CXt_FORMAT) {
70794f7b 3258 cv = cx->blk_sub.cv;
d819b83a
DM
3259 /* skip DB:: code */
3260 if (db_seqp && PL_debstash && CvSTASH(cv) == PL_debstash) {
3261 *db_seqp = cx->blk_oldcop->cop_seq;
3262 continue;
3263 }
d819b83a 3264 }
a3985cdc 3265 else if (CxTYPE(cx) == CXt_EVAL && !CxTRYBLOCK(cx))
70794f7b
FC
3266 cv = cx->blk_eval.cv;
3267 if (cv) {
3268 switch (cond) {
db4cf31d
FC
3269 case FIND_RUNCV_padid_eq:
3270 if (!CvPADLIST(cv)
a56015b9 3271 || PadlistNAMES(CvPADLIST(cv)) != INT2PTR(PADNAMELIST *, arg))
8771da69 3272 continue;
b4b0692a
FC
3273 return cv;
3274 case FIND_RUNCV_level_eq:
db4cf31d 3275 if (level++ != arg) continue;
70794f7b
FC
3276 /* GERONIMO! */
3277 default:
3278 return cv;
3279 }
3280 }
a3985cdc
DM
3281 }
3282 }
db4cf31d 3283 return cond == FIND_RUNCV_padid_eq ? NULL : PL_main_cv;
a3985cdc
DM
3284}
3285
3286
27e90453
DM
3287/* Run yyparse() in a setjmp wrapper. Returns:
3288 * 0: yyparse() successful
3289 * 1: yyparse() failed
3290 * 3: yyparse() died
3291 */
3292STATIC int
28ac2b49 3293S_try_yyparse(pTHX_ int gramtype)
27e90453
DM
3294{
3295 int ret;
3296 dJMPENV;
3297
3298 assert(CxTYPE(&cxstack[cxstack_ix]) == CXt_EVAL);
3299 JMPENV_PUSH(ret);
3300 switch (ret) {
3301 case 0:
28ac2b49 3302 ret = yyparse(gramtype) ? 1 : 0;
27e90453
DM
3303 break;
3304 case 3:
3305 break;
3306 default:
3307 JMPENV_POP;
3308 JMPENV_JUMP(ret);
118e2215 3309 assert(0); /* NOTREACHED */
27e90453
DM
3310 }
3311 JMPENV_POP;
3312 return ret;
3313}
3314
3315
104a8185
DM
3316/* Compile a require/do or an eval ''.
3317 *
a3985cdc 3318 * outside is the lexically enclosing CV (if any) that invoked us.
104a8185
DM
3319 * seq is the current COP scope value.
3320 * hh is the saved hints hash, if any.
3321 *
410be5db 3322 * Returns a bool indicating whether the compile was successful; if so,
104a8185
DM
3323 * PL_eval_start contains the first op of the compiled code; otherwise,
3324 * pushes undef.
3325 *
3326 * This function is called from two places: pp_require and pp_entereval.
3327 * These can be distinguished by whether PL_op is entereval.
7d116edc
FC
3328 */
3329
410be5db 3330STATIC bool
104a8185 3331S_doeval(pTHX_ int gimme, CV* outside, U32 seq, HV *hh)
a0d0e21e 3332{
27da23d5 3333 dVAR; dSP;
46c461b5 3334 OP * const saveop = PL_op;
104a8185 3335 bool clear_hints = saveop->op_type != OP_ENTEREVAL;
f45b078d 3336 COP * const oldcurcop = PL_curcop;
26c9400e 3337 bool in_require = (saveop->op_type == OP_REQUIRE);
27e90453 3338 int yystatus;
676a678a 3339 CV *evalcv;
a0d0e21e 3340
27e90453 3341 PL_in_eval = (in_require
6dc8a9e4
IZ
3342 ? (EVAL_INREQUIRE | (PL_in_eval & EVAL_INEVAL))
3343 : EVAL_INEVAL);
a0d0e21e 3344
1ce6579f 3345 PUSHMARK(SP);
3346
676a678a
Z
3347 evalcv = MUTABLE_CV(newSV_type(SVt_PVCV));
3348 CvEVAL_on(evalcv);
2090ab20 3349 assert(CxTYPE(&cxstack[cxstack_ix]) == CXt_EVAL);
676a678a 3350 cxstack[cxstack_ix].blk_eval.cv = evalcv;
86a64801 3351 cxstack[cxstack_ix].blk_gimme = gimme;
2090ab20 3352
676a678a
Z
3353 CvOUTSIDE_SEQ(evalcv) = seq;
3354 CvOUTSIDE(evalcv) = MUTABLE_CV(SvREFCNT_inc_simple(outside));
a3985cdc 3355
dd2155a4 3356 /* set up a scratch pad */
a0d0e21e 3357
676a678a 3358 CvPADLIST(evalcv) = pad_new(padnew_SAVE);
cecbe010 3359 PL_op = NULL; /* avoid PL_op and PL_curpad referring to different CVs */
2c05e328 3360
07055b4c 3361
81d86705 3362 if (!PL_madskills)
676a678a 3363 SAVEMORTALIZESV(evalcv); /* must remain until end of current statement */
748a9306 3364
a0d0e21e
LW
3365 /* make sure we compile in the right package */
3366
ed094faf 3367 if (CopSTASH_ne(PL_curcop, PL_curstash)) {
03d9f026
FC
3368 SAVEGENERICSV(PL_curstash);
3369 PL_curstash = (HV *)SvREFCNT_inc_simple(CopSTASH(PL_curcop));
a0d0e21e 3370 }
3c10abe3 3371 /* XXX:ajgo do we really need to alloc an AV for begin/checkunit */
3280af22
NIS
3372 SAVESPTR(PL_beginav);
3373 PL_beginav = newAV();
3374 SAVEFREESV(PL_beginav);
3c10abe3
AG
3375 SAVESPTR(PL_unitcheckav);
3376 PL_unitcheckav = newAV();
3377 SAVEFREESV(PL_unitcheckav);
a0d0e21e 3378
81d86705 3379#ifdef PERL_MAD
9da243ce 3380 SAVEBOOL(PL_madskills);
81d86705
NC
3381 PL_madskills = 0;
3382#endif
3383
104a8185 3384 ENTER_with_name("evalcomp");
676a678a
Z
3385 SAVESPTR(PL_compcv);
3386 PL_compcv = evalcv;
3387
a0d0e21e
LW
3388 /* try to compile it */
3389
5f66b61c 3390 PL_eval_root = NULL;
3280af22 3391 PL_curcop = &PL_compiling;
26c9400e 3392 if ((saveop->op_type != OP_REQUIRE) && (saveop->op_flags & OPf_SPECIAL))
faef0170 3393 PL_in_eval |= EVAL_KEEPERR;
ab69dbc2
RGS
3394 else
3395 CLEAR_ERRSV();
27e90453 3396
377b5421
DM
3397 SAVEHINTS();
3398 if (clear_hints) {
3399 PL_hints = 0;
3400 hv_clear(GvHV(PL_hintgv));
3401 }
3402 else {
3403 PL_hints = saveop->op_private & OPpEVAL_COPHH
3404 ? oldcurcop->cop_hints : saveop->op_targ;
3405 if (hh) {
3406 /* SAVEHINTS created a new HV in PL_hintgv, which we need to GC */
3407 SvREFCNT_dec(GvHV(PL_hintgv));
3408 GvHV(PL_hintgv) = hh;
3409 }
3410 }
3411 SAVECOMPILEWARNINGS();
3412 if (clear_hints) {
3413 if (PL_dowarn & G_WARN_ALL_ON)
3414 PL_compiling.cop_warnings = pWARN_ALL ;
3415 else if (PL_dowarn & G_WARN_ALL_OFF)
3416 PL_compiling.cop_warnings = pWARN_NONE ;
3417 else
3418 PL_compiling.cop_warnings = pWARN_STD ;
3419 }
3420 else {
3421 PL_compiling.cop_warnings =
3422 DUP_WARNINGS(oldcurcop->cop_warnings);
3423 cophh_free(CopHINTHASH_get(&PL_compiling));
3424 if (Perl_cop_fetch_label(aTHX_ oldcurcop, NULL, NULL)) {
3425 /* The label, if present, is the first entry on the chain. So rather
3426 than writing a blank label in front of it (which involves an
3427 allocation), just use the next entry in the chain. */
3428 PL_compiling.cop_hints_hash
3429 = cophh_copy(oldcurcop->cop_hints_hash->refcounted_he_next);
3430 /* Check the assumption that this removed the label. */
3431 assert(Perl_cop_fetch_label(aTHX_ &PL_compiling, NULL, NULL) == NULL);
f45b078d 3432 }
377b5421
DM
3433 else
3434 PL_compiling.cop_hints_hash = cophh_copy(oldcurcop->cop_hints_hash);
3435 }
f45b078d 3436
a88d97bf 3437 CALL_BLOCK_HOOKS(bhk_eval, saveop);
52db365a 3438
27e90453
DM
3439 /* note that yyparse() may raise an exception, e.g. C<BEGIN{die}>,
3440 * so honour CATCH_GET and trap it here if necessary */
3441
28ac2b49 3442 yystatus = (!in_require && CATCH_GET) ? S_try_yyparse(aTHX_ GRAMPROG) : yyparse(GRAMPROG);
27e90453
DM
3443
3444 if (yystatus || PL_parser->error_count || !PL_eval_root) {
0c58d367 3445 SV **newsp; /* Used by POPBLOCK. */
d164302a 3446 PERL_CONTEXT *cx;
27e90453 3447 I32 optype; /* Used by POPEVAL. */
d164302a 3448 SV *namesv;
eed484f9 3449 SV *errsv = NULL;
bfed75c6 3450
d164302a
GG
3451 cx = NULL;
3452 namesv = NULL;
27e90453
DM
3453 PERL_UNUSED_VAR(newsp);
3454 PERL_UNUSED_VAR(optype);
3455
c86ffc32
DM
3456 /* note that if yystatus == 3, then the EVAL CX block has already
3457 * been popped, and various vars restored */
533c011a 3458 PL_op = saveop;
27e90453 3459 if (yystatus != 3) {
c86ffc32
DM
3460 if (PL_eval_root) {
3461 op_free(PL_eval_root);
3462 PL_eval_root = NULL;
3463 }
27e90453 3464 SP = PL_stack_base + POPMARK; /* pop original mark */
377b5421
DM
3465 POPBLOCK(cx,PL_curpm);
3466 POPEVAL(cx);
3467 namesv = cx->blk_eval.old_namesv;
bbde7ba3 3468 /* POPBLOCK renders LEAVE_with_name("evalcomp") unnecessary. */
27e90453 3469 LEAVE_with_name("eval"); /* pp_entereval knows about this LEAVE. */
cd6472fc 3470 }
9d4ba2ae 3471
eed484f9 3472 errsv = ERRSV;
27e90453 3473 if (in_require) {
b6494f15
VP
3474 if (!cx) {
3475 /* If cx is still NULL, it means that we didn't go in the
3476 * POPEVAL branch. */
3477 cx = &cxstack[cxstack_ix];
3478 assert(CxTYPE(cx) == CXt_EVAL);
3479 namesv = cx->blk_eval.old_namesv;
3480 }
3481 (void)hv_store(GvHVn(PL_incgv),
ecad31f0 3482 SvPVX_const(namesv),
c60dbbc3 3483 SvUTF8(namesv) ? -(I32)SvCUR(namesv) : (I32)SvCUR(namesv),
b6494f15 3484 &PL_sv_undef, 0);
ecad31f0 3485 Perl_croak(aTHX_ "%"SVf"Compilation failed in require",
eed484f9
DD
3486 SVfARG(errsv
3487 ? errsv
ecad31f0 3488 : newSVpvs_flags("Unknown error\n", SVs_TEMP)));
5a844595 3489 }
9d7f88dd 3490 else {
eed484f9
DD
3491 if (!*(SvPV_nolen_const(errsv))) {
3492 sv_setpvs(errsv, "Compilation error");
9d7f88dd
SR
3493 }
3494 }
2bf54cc6 3495 if (gimme != G_ARRAY) PUSHs(&PL_sv_undef);
410be5db
DM
3496 PUTBACK;
3497 return FALSE;
a0d0e21e 3498 }
104a8185
DM
3499 else
3500 LEAVE_with_name("evalcomp");
3501
57843af0 3502 CopLINE_set(&PL_compiling, 0);
104a8185 3503 SAVEFREEOP(PL_eval_root);
8be227ab 3504 cv_forget_slab(evalcv);
0c58d367 3505
a0d0e21e
LW
3506 DEBUG_x(dump_eval());
3507
55497cff 3508 /* Register with debugger: */
26c9400e 3509 if (PERLDB_INTER && saveop->op_type == OP_REQUIRE) {
b96d8cd9 3510 CV * const cv = get_cvs("DB::postponed", 0);
55497cff 3511 if (cv) {
3512 dSP;
924508f0 3513 PUSHMARK(SP);
ad64d0ec 3514 XPUSHs(MUTABLE_SV(CopFILEGV(&PL_compiling)));
55497cff 3515 PUTBACK;
ad64d0ec 3516 call_sv(MUTABLE_SV(cv), G_DISCARD);
55497cff 3517 }
3518 }
3519
8ed49485
FC
3520 if (PL_unitcheckav) {
3521 OP *es = PL_eval_start;
3c10abe3 3522 call_list(PL_scopestack_ix, PL_unitcheckav);
8ed49485
FC
3523 PL_eval_start = es;
3524 }
3c10abe3 3525
a0d0e21e
LW
3526 /* compiled okay, so do it */
3527
676a678a 3528 CvDEPTH(evalcv) = 1;
3280af22 3529 SP = PL_stack_base + POPMARK; /* pop original mark */
533c011a 3530 PL_op = saveop; /* The caller may need it. */
bc177e6b 3531 PL_parser->lex_state = LEX_NOTPARSING; /* $^S needs this. */
5dc0d613 3532
410be5db
DM
3533 PUTBACK;
3534 return TRUE;
a0d0e21e
LW
3535}
3536
a6c40364 3537STATIC PerlIO *
282b29ee 3538S_check_type_and_open(pTHX_ SV *name)
ce8abf5f
SP
3539{
3540 Stat_t st;
282b29ee
NC
3541 const char *p = SvPV_nolen_const(name);
3542 const int st_rc = PerlLIO_stat(p, &st);
df528165 3543
7918f24d
NC
3544 PERL_ARGS_ASSERT_CHECK_TYPE_AND_OPEN;
3545
6b845e56 3546 if (st_rc < 0 || S_ISDIR(st.st_mode) || S_ISBLK(st.st_mode)) {
4608196e 3547 return NULL;
ce8abf5f
SP
3548 }
3549
ccb84406 3550#if !defined(PERLIO_IS_STDIO) && !defined(USE_SFIO)
639dfab0 3551 return PerlIO_openn(aTHX_ ":", PERL_SCRIPT_MODE, -1, 0, 0, NULL, 1, &name);
ccb84406 3552#else
282b29ee 3553 return PerlIO_open(p, PERL_SCRIPT_MODE);
ccb84406 3554#endif
ce8abf5f
SP
3555}
3556
75c20bac 3557#ifndef PERL_DISABLE_PMC
ce8abf5f 3558STATIC PerlIO *
282b29ee 3559S_doopen_pm(pTHX_ SV *name)
b295d113 3560{
282b29ee
NC
3561 STRLEN namelen;
3562 const char *p = SvPV_const(name, namelen);
b295d113 3563
7918f24d
NC
3564 PERL_ARGS_ASSERT_DOOPEN_PM;
3565
282b29ee 3566 if (namelen > 3 && memEQs(p + namelen - 3, 3, ".pm")) {
eb70bb4a 3567 SV *const pmcsv = sv_newmortal();
a6c40364 3568 Stat_t pmcstat;
50b8ed39 3569
eb70bb4a 3570 SvSetSV_nosteal(pmcsv,name);
282b29ee 3571 sv_catpvn(pmcsv, "c", 1);
50b8ed39 3572
282b29ee
NC
3573 if (PerlLIO_stat(SvPV_nolen_const(pmcsv), &pmcstat) >= 0)
3574 return check_type_and_open(pmcsv);
a6c40364 3575 }
282b29ee 3576 return check_type_and_open(name);
75c20bac 3577}
7925835c 3578#else
282b29ee 3579# define doopen_pm(name) check_type_and_open(name)
7925835c 3580#endif /* !PERL_DISABLE_PMC */
b295d113 3581
a0d0e21e
LW
3582PP(pp_require)
3583{
27da23d5 3584 dVAR; dSP;
eb578fdb 3585 PERL_CONTEXT *cx;
a0d0e21e 3586 SV *sv;
5c144d81 3587 const char *name;
6132ea6c 3588 STRLEN len;
4492be7a
JM
3589 char * unixname;
3590 STRLEN unixlen;
62f5ad7a 3591#ifdef VMS
4492be7a 3592 int vms_unixname = 0;
155f4c25
CB
3593 char *unixnamebuf;
3594 char *unixdir;
3595 char *unixdirbuf;
62f5ad7a 3596#endif
c445ea15
AL
3597 const char *tryname = NULL;
3598 SV *namesv = NULL;
f54cb97a 3599 const I32 gimme = GIMME_V;
bbed91b5 3600 int filter_has_file = 0;
c445ea15 3601 PerlIO *tryrsfp = NULL;
34113e50 3602 SV *filter_cache = NULL;
c445ea15
AL
3603 SV *filter_state = NULL;
3604 SV *filter_sub = NULL;
3605 SV *hook_sv = NULL;
6ec9efec
JH
3606 SV *encoding;
3607 OP *op;
83b195e4 3608 int saved_errno;
a0d0e21e
LW
3609
3610 sv = POPs;
d7aa5382 3611 if ( (SvNIOKp(sv) || SvVOK(sv)) && PL_op->op_type != OP_DOFILE) {
d086148c 3612 sv = sv_2mortal(new_version(sv));
88010bae 3613 if (!Perl_sv_derived_from_pvn(aTHX_ PL_patchlevel, STR_WITH_LEN("version"), 0))
ac0e6a2f 3614 upg_version(PL_patchlevel, TRUE);
149c1637 3615 if (cUNOP->op_first->op_type == OP_CONST && cUNOP->op_first->op_private & OPpCONST_NOVER) {
3cacfbb9 3616 if ( vcmp(sv,PL_patchlevel) <= 0 )
468aa647 3617 DIE(aTHX_ "Perls since %"SVf" too modern--this is %"SVf", stopped",
e753e3b1
FC
3618 SVfARG(sv_2mortal(vnormal(sv))),
3619 SVfARG(sv_2mortal(vnormal(PL_patchlevel)))
3620 );
468aa647
RGS
3621 }
3622 else {
d1029faa
JP
3623 if ( vcmp(sv,PL_patchlevel) > 0 ) {
3624 I32 first = 0;
3625 AV *lav;
3626 SV * const req = SvRV(sv);
85fbaab2 3627 SV * const pv = *hv_fetchs(MUTABLE_HV(req), "original", FALSE);
d1029faa
JP
3628
3629 /* get the left hand term */
502c6561 3630 lav = MUTABLE_AV(SvRV(*hv_fetchs(MUTABLE_HV(req), "version", FALSE)));
d1029faa
JP
3631
3632 first = SvIV(*av_fetch(lav,0,0));
3633 if ( first > (int)PERL_REVISION /* probably 'use 6.0' */
85fbaab2 3634 || hv_exists(MUTABLE_HV(req), "qv", 2 ) /* qv style */
d1029faa
JP
3635 || av_len(lav) > 1 /* FP with > 3 digits */
3636 || strstr(SvPVX(pv),".0") /* FP with leading 0 */
3637 ) {
3638 DIE(aTHX_ "Perl %"SVf" required--this is only "
9d056fb0
FC
3639 "%"SVf", stopped",
3640 SVfARG(sv_2mortal(vnormal(req))),
3641 SVfARG(sv_2mortal(vnormal(PL_patchlevel)))
3642 );
d1029faa
JP
3643 }
3644 else { /* probably 'use 5.10' or 'use 5.8' */
af61dbfd 3645 SV *hintsv;
d1029faa
JP
3646 I32 second = 0;
3647
3648 if (av_len(lav)>=1)
3649 second = SvIV(*av_fetch(lav,1,0));
3650
3651 second /= second >= 600 ? 100 : 10;
af61dbfd
NC
3652 hintsv = Perl_newSVpvf(aTHX_ "v%d.%d.0",
3653 (int)first, (int)second);
d1029faa
JP
3654 upg_version(hintsv, TRUE);
3655
3656 DIE(aTHX_ "Perl %"SVf" required (did you mean %"SVf"?)"
3657 "--this is only %"SVf", stopped",
1be7d6f3
FC
3658 SVfARG(sv_2mortal(vnormal(req))),
3659 SVfARG(sv_2mortal(vnormal(sv_2mortal(hintsv)))),
3660 SVfARG(sv_2mortal(vnormal(PL_patchlevel)))
3661 );
d1029faa
JP
3662 }
3663 }
468aa647 3664 }
d7aa5382 3665
7dfde25d 3666 RETPUSHYES;
a0d0e21e 3667 }
5c144d81 3668 name = SvPV_const(sv, len);
6132ea6c 3669 if (!(name && len > 0 && *name))
cea2e8a9 3670 DIE(aTHX_ "Null filename used");
4633a7c4 3671 TAINT_PROPER("require");
4492be7a
JM
3672
3673
3674#ifdef VMS
3675 /* The key in the %ENV hash is in the syntax of file passed as the argument
3676 * usually this is in UNIX format, but sometimes in VMS format, which
3677 * can result in a module being pulled in more than once.
3678 * To prevent this, the key must be stored in UNIX format if the VMS
3679 * name can be translated to UNIX.
3680 */
155f4c25
CB
3681
3682 if ((unixnamebuf = SvPVX(sv_2mortal(newSVpv("", VMS_MAXRSS-1))))
3683 && (unixname = tounixspec(name, unixnamebuf)) != NULL) {
4492be7a
JM
3684 unixlen = strlen(unixname);
3685 vms_unixname = 1;
3686 }
3687 else
3688#endif
3689 {
3690 /* if not VMS or VMS name can not be translated to UNIX, pass it
3691 * through.
3692 */
3693 unixname = (char *) name;
3694 unixlen = len;
3695 }
44f8325f 3696 if (PL_op->op_type == OP_REQUIRE) {
4492be7a
JM
3697 SV * const * const svp = hv_fetch(GvHVn(PL_incgv),
3698 unixname, unixlen, 0);
44f8325f
AL
3699 if ( svp ) {
3700 if (*svp != &PL_sv_undef)
3701 RETPUSHYES;
3702 else
087b5369
RD
3703 DIE(aTHX_ "Attempt to reload %s aborted.\n"
3704 "Compilation failed in require", unixname);
44f8325f 3705 }
4d8b06f1 3706 }
a0d0e21e 3707
32aeab29
SM
3708 LOADING_FILE_PROBE(unixname);
3709
a0d0e21e
LW
3710 /* prepare to compile file */
3711
be4b629d 3712 if (path_is_absolute(name)) {
282b29ee 3713 /* At this point, name is SvPVX(sv) */
46fc3d4c 3714 tryname = name;
282b29ee 3715 tryrsfp = doopen_pm(sv);
bf4acbe4 3716 }
2433d39e 3717 if (!tryrsfp && !(errno == EACCES && path_is_absolute(name))) {
44f8325f 3718 AV * const ar = GvAVn(PL_incgv);
a0d0e21e 3719 I32 i;
748a9306 3720#ifdef VMS
4492be7a 3721 if (vms_unixname)
46fc3d4c 3722#endif
3723 {
d0328fd7 3724 namesv = newSV_type(SVt_PV);
46fc3d4c 3725 for (i = 0; i <= AvFILL(ar); i++) {
df528165 3726 SV * const dirsv = *av_fetch(ar, i, TRUE);
bbed91b5 3727
ad64d0ec 3728 if (SvTIED_mg((const SV *)ar, PERL_MAGIC_tied))
c38a6530 3729 mg_get(dirsv);
bbed91b5
KF
3730 if (SvROK(dirsv)) {
3731 int count;
a3b58a99 3732 SV **svp;
bbed91b5
KF
3733 SV *loader = dirsv;
3734
e14e2dc8
NC
3735 if (SvTYPE(SvRV(loader)) == SVt_PVAV
3736 && !sv_isobject(loader))
3737 {
502c6561 3738 loader = *av_fetch(MUTABLE_AV(SvRV(loader)), 0, TRUE);
bbed91b5
KF
3739 }
3740
b900a521 3741 Perl_sv_setpvf(aTHX_ namesv, "/loader/0x%"UVxf"/%s",
44f0be63 3742 PTR2UV(SvRV(dirsv)), name);
349d4f2f 3743 tryname = SvPVX_const(namesv);
c445ea15 3744 tryrsfp = NULL;
bbed91b5 3745
d343c3ef 3746 ENTER_with_name("call_INC");
bbed91b5
KF
3747 SAVETMPS;
3748 EXTEND(SP, 2);
3749
3750 PUSHMARK(SP);
3751 PUSHs(dirsv);
3752 PUSHs(sv);
3753 PUTBACK;
e982885c
NC
3754 if (sv_isobject(loader))
3755 count = call_method("INC", G_ARRAY);
3756 else
3757 count = call_sv(loader, G_ARRAY);
bbed91b5
KF
3758 SPAGAIN;
3759
3760 if (count > 0) {
3761 int i = 0;
3762 SV *arg;
3763
3764 SP -= count - 1;
3765 arg = SP[i++];
3766
34113e50
NC
3767 if (SvROK(arg) && (SvTYPE(SvRV(arg)) <= SVt_PVLV)
3768 && !isGV_with_GP(SvRV(arg))) {
3769 filter_cache = SvRV(arg);
74c765eb 3770 SvREFCNT_inc_simple_void_NN(filter_cache);
34113e50
NC
3771
3772 if (i < count) {
3773 arg = SP[i++];
3774 }
3775 }
3776
6e592b3a 3777 if (SvROK(arg) && isGV_with_GP(SvRV(arg))) {
bbed91b5
KF
3778 arg = SvRV(arg);
3779 }
3780
6e592b3a 3781 if (isGV_with_GP(arg)) {
159b6efe 3782 IO * const io = GvIO((const GV *)arg);
bbed91b5
KF
3783
3784 ++filter_has_file;
3785
3786 if (io) {
3787 tryrsfp = IoIFP(io);
0f7de14d
NC
3788 if (IoOFP(io) && IoOFP(io) != IoIFP(io)) {
3789 PerlIO_close(IoOFP(io));
bbed91b5 3790 }
0f7de14d
NC
3791 IoIFP(io) = NULL;
3792 IoOFP(io) = NULL;
bbed91b5
KF
3793 }
3794
3795 if (i < count) {
3796 arg = SP[i++];
3797 }
3798 }
3799
3800 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVCV) {
3801 filter_sub = arg;
74c765eb 3802 SvREFCNT_inc_simple_void_NN(filter_sub);
bbed91b5
KF
3803
3804 if (i < count) {
3805 filter_state = SP[i];
b37c2d43 3806 SvREFCNT_inc_simple_void(filter_state);
bbed91b5 3807 }
34113e50 3808 }
bbed91b5 3809
34113e50
NC
3810 if (!tryrsfp && (filter_cache || filter_sub)) {
3811 tryrsfp = PerlIO_open(BIT_BUCKET,
3812 PERL_SCRIPT_MODE);
bbed91b5 3813 }
1d06aecd 3814 SP--;
bbed91b5
KF
3815 }
3816
3817 PUTBACK;
3818 FREETMPS;
d343c3ef 3819 LEAVE_with_name("call_INC");
bbed91b5 3820
c5f55552
NC
3821 /* Adjust file name if the hook has set an %INC entry.
3822 This needs to happen after the FREETMPS above. */
3823 svp = hv_fetch(GvHVn(PL_incgv), name, len, 0);
3824 if (svp)
3825 tryname = SvPV_nolen_const(*svp);
3826
bbed91b5 3827 if (tryrsfp) {
89ccab8c 3828 hook_sv = dirsv;
bbed91b5
KF
3829 break;
3830 }
3831
3832 filter_has_file = 0;
34113e50
NC
3833 if (filter_cache) {
3834 SvREFCNT_dec(filter_cache);
3835 filter_cache = NULL;
3836 }
bbed91b5
KF
3837 if (filter_state) {
3838 SvREFCNT_dec(filter_state);
c445ea15 3839 filter_state = NULL;
bbed91b5
KF
3840 }
3841 if (filter_sub) {
3842 SvREFCNT_dec(filter_sub);
c445ea15 3843 filter_sub = NULL;
bbed91b5
KF
3844 }
3845 }
3846 else {
be4b629d 3847 if (!path_is_absolute(name)
be4b629d 3848 ) {
b640a14a
NC
3849 const char *dir;
3850 STRLEN dirlen;
3851
3852 if (SvOK(dirsv)) {
3853 dir = SvPV_const(dirsv, dirlen);
3854 } else {
3855 dir = "";
3856 dirlen = 0;
3857 }
3858
e37778c2 3859#ifdef VMS
155f4c25
CB
3860 if (((unixdirbuf = SvPVX(sv_2mortal(newSVpv("", VMS_MAXRSS-1)))) == NULL)
3861 || ((unixdir = tounixpath(dir, unixdirbuf)) == NULL))
bbed91b5
KF
3862 continue;
3863 sv_setpv(namesv, unixdir);
3864 sv_catpv(namesv, unixname);
e37778c2
NC
3865#else
3866# ifdef __SYMBIAN32__
27da23d5
JH
3867 if (PL_origfilename[0] &&
3868 PL_origfilename[1] == ':' &&
3869 !(dir[0] && dir[1] == ':'))
3870 Perl_sv_setpvf(aTHX_ namesv,
3871 "%c:%s\\%s",
3872 PL_origfilename[0],
3873 dir, name);
3874 else
3875 Perl_sv_setpvf(aTHX_ namesv,
3876 "%s\\%s",
3877 dir, name);
e37778c2 3878# else
b640a14a
NC
3879 /* The equivalent of
3880 Perl_sv_setpvf(aTHX_ namesv, "%s/%s", dir, name);
3881 but without the need to parse the format string, or
3882 call strlen on either pointer, and with the correct
3883 allocation up front. */
3884 {
3885 char *tmp = SvGROW(namesv, dirlen + len + 2);
3886
3887 memcpy(tmp, dir, dirlen);
3888 tmp +=dirlen;
3889 *tmp++ = '/';
3890 /* name came from an SV, so it will have a '\0' at the
3891 end that we can copy as part of this memcpy(). */
3892 memcpy(tmp, name, len + 1);
3893
3894 SvCUR_set(namesv, dirlen + len + 1);
282b29ee 3895 SvPOK_on(namesv);
b640a14a 3896 }
27da23d5 3897# endif
bf4acbe4 3898#endif
bbed91b5 3899 TAINT_PROPER("require");
349d4f2f 3900 tryname = SvPVX_const(namesv);
282b29ee 3901 tryrsfp = doopen_pm(namesv);
bbed91b5 3902 if (tryrsfp) {
e63be746
RGS
3903 if (tryname[0] == '.' && tryname[1] == '/') {
3904 ++tryname;
3905 while (*++tryname == '/');
3906 }
bbed91b5
KF
3907 break;
3908 }
2433d39e
BF
3909 else if (errno == EMFILE || errno == EACCES) {
3910 /* no point in trying other paths if out of handles;
3911 * on the other hand, if we couldn't open one of the
3912 * files, then going on with the search could lead to
3913 * unexpected results; see perl #113422
3914 */
3915 break;
3916 }
be4b629d 3917 }
46fc3d4c 3918 }
a0d0e21e
LW
3919 }
3920 }
3921 }
83b195e4 3922 saved_errno = errno; /* sv_2mortal can realloc things */
b2ef6d44 3923 sv_2mortal(namesv);
a0d0e21e 3924 if (!tryrsfp) {
533c011a 3925 if (PL_op->op_type == OP_REQUIRE) {
83b195e4 3926 if(saved_errno == EMFILE || saved_errno == EACCES) {
c9d5e35e 3927 /* diag_listed_as: Can't locate %s */
83b195e4 3928 DIE(aTHX_ "Can't locate %s: %s", name, Strerror(saved_errno));
e31de809
SP
3929 } else {
3930 if (namesv) { /* did we lookup @INC? */
44f8325f 3931 AV * const ar = GvAVn(PL_incgv);
e31de809 3932 I32 i;
1e5f02b3 3933 SV *const msg = newSVpvs_flags("", SVs_TEMP);
c9d5e35e
NC
3934 SV *const inc = newSVpvs_flags("", SVs_TEMP);
3935 for (i = 0; i <= AvFILL(ar); i++) {
3936 sv_catpvs(inc, " ");
3937 sv_catsv(inc, *av_fetch(ar, i, TRUE));
3938 }
f7ee53b5
PJ
3939 if (len >= 4 && memEQ(name + len - 3, ".pm", 4)) {
3940 const char *c, *e = name + len - 3;
3941 sv_catpv(msg, " (you may need to install the ");
3942 for (c = name; c < e; c++) {
3943 if (*c == '/') {
3944 sv_catpvn(msg, "::", 2);
3945 }
3946 else {
3947 sv_catpvn(msg, c, 1);
3948 }
3949 }
3950 sv_catpv(msg, " module)");
3951 }
3952 else if (len >= 2 && memEQ(name + len - 2, ".h", 3)) {
3953 sv_catpv(msg, " (change .h to .ph maybe?) (did you run h2ph?)");
3954 }
3955 else if (len >= 3 && memEQ(name + len - 3, ".ph", 4)) {
3956 sv_catpv(msg, " (did you run h2ph?)");
3957 }
c9d5e35e
NC
3958
3959 /* diag_listed_as: Can't locate %s */
3960 DIE(aTHX_
f7ee53b5
PJ
3961 "Can't locate %s in @INC%" SVf " (@INC contains:%" SVf ")",
3962 name, msg, inc);
c9d5e35e 3963 }
2683423c 3964 }
c9d5e35e 3965 DIE(aTHX_ "Can't locate %s", name);
a0d0e21e
LW
3966 }
3967
a3ff80c1 3968 CLEAR_ERRSV();
a0d0e21e
LW
3969 RETPUSHUNDEF;
3970 }
d8bfb8bd 3971 else
93189314 3972 SETERRNO(0, SS_NORMAL);
a0d0e21e
LW
3973
3974 /* Assume success here to prevent recursive requirement. */
238d24b4 3975 /* name is never assigned to again, so len is still strlen(name) */
d3a4e64e 3976 /* Check whether a hook in @INC has already filled %INC */
44f8325f 3977 if (!hook_sv) {
4492be7a 3978 (void)hv_store(GvHVn(PL_incgv),
b2ef6d44 3979 unixname, unixlen, newSVpv(tryname,0),0);
44f8325f 3980 } else {
4492be7a 3981 SV** const svp = hv_fetch(GvHVn(PL_incgv), unixname, unixlen, 0);
44f8325f 3982 if (!svp)
4492be7a
JM
3983 (void)hv_store(GvHVn(PL_incgv),
3984 unixname, unixlen, SvREFCNT_inc_simple(hook_sv), 0 );
d3a4e64e 3985 }
a0d0e21e 3986
d343c3ef 3987 ENTER_with_name("eval");
a0d0e21e 3988 SAVETMPS;
b2ef6d44
FC
3989 SAVECOPFILE_FREE(&PL_compiling);
3990 CopFILE_set(&PL_compiling, tryname);
8eaa0acf 3991 lex_start(NULL, tryrsfp, 0);
e50aee73 3992
34113e50 3993 if (filter_sub || filter_cache) {
4464f08e
NC
3994 /* We can use the SvPV of the filter PVIO itself as our cache, rather
3995 than hanging another SV from it. In turn, filter_add() optionally
3996 takes the SV to use as the filter (or creates a new SV if passed
3997 NULL), so simply pass in whatever value filter_cache has. */
3998 SV * const datasv = filter_add(S_run_user_filter, filter_cache);
bbed91b5 3999 IoLINES(datasv) = filter_has_file;
159b6efe
NC
4000 IoTOP_GV(datasv) = MUTABLE_GV(filter_state);
4001 IoBOTTOM_GV(datasv) = MUTABLE_GV(filter_sub);
bbed91b5
KF
4002 }
4003
4004 /* switch to eval mode */
a0d0e21e 4005 PUSHBLOCK(cx, CXt_EVAL, SP);
6b75f042 4006 PUSHEVAL(cx, name);
f39bc417 4007 cx->blk_eval.retop = PL_op->op_next;
a0d0e21e 4008
57843af0
GS
4009 SAVECOPLINE(&PL_compiling);
4010 CopLINE_set(&PL_compiling, 0);
a0d0e21e
LW
4011
4012 PUTBACK;
6ec9efec
JH
4013
4014 /* Store and reset encoding. */
4015 encoding = PL_encoding;
c445ea15 4016 PL_encoding = NULL;
6ec9efec 4017
104a8185 4018 if (doeval(gimme, NULL, PL_curcop->cop_seq, NULL))
410be5db
DM
4019 op = DOCATCH(PL_eval_start);
4020 else
4021 op = PL_op->op_next;
bfed75c6 4022
6ec9efec
JH
4023 /* Restore encoding. */
4024 PL_encoding = encoding;
4025
32aeab29
SM
4026 LOADED_FILE_PROBE(unixname);
4027
6ec9efec 4028 return op;
a0d0e21e
LW
4029}
4030
996c9baa
VP
4031/* This is a op added to hold the hints hash for
4032 pp_entereval. The hash can be modified by the code
4033 being eval'ed, so we return a copy instead. */
4034
4035PP(pp_hintseval)
4036{
4037 dVAR;
4038 dSP;
defdfed5 4039 mXPUSHs(MUTABLE_SV(hv_copy_hints_hv(MUTABLE_HV(cSVOP_sv))));
996c9baa
VP
4040 RETURN;
4041}
4042
4043
a0d0e21e
LW
4044PP(pp_entereval)
4045{
27da23d5 4046 dVAR; dSP;
eb578fdb 4047 PERL_CONTEXT *cx;
0d863452 4048 SV *sv;
890ce7af 4049 const I32 gimme = GIMME_V;
fd06b02c 4050 const U32 was = PL_breakable_sub_gen;
83ee9e09 4051 char tbuf[TYPE_DIGITS(long) + 12];
78da7625 4052 bool saved_delete = FALSE;
83ee9e09 4053 char *tmpbuf = tbuf;
a0d0e21e 4054 STRLEN len;
a3985cdc 4055 CV* runcv;
0abcdfa4 4056 U32 seq, lex_flags = 0;
c445ea15 4057 HV *saved_hh = NULL;
60d63348 4058 const bool bytes = PL_op->op_private & OPpEVAL_BYTES;
e389bba9 4059
0d863452 4060 if (PL_op->op_private & OPpEVAL_HAS_HH) {
85fbaab2 4061 saved_hh = MUTABLE_HV(SvREFCNT_inc(POPs));
0d863452 4062 }
bc344123
FC
4063 else if (PL_hints & HINT_LOCALIZE_HH || (
4064 PL_op->op_private & OPpEVAL_COPHH
4065 && PL_curcop->cop_hints & HINT_LOCALIZE_HH
4066 )) {
7d789282
FC
4067 saved_hh = cop_hints_2hv(PL_curcop, 0);
4068 hv_magic(saved_hh, NULL, PERL_MAGIC_hints);
4069 }
0d863452 4070 sv = POPs;
895b760f
DM
4071 if (!SvPOK(sv)) {
4072 /* make sure we've got a plain PV (no overload etc) before testing
4073 * for taint. Making a copy here is probably overkill, but better
4074 * safe than sorry */
0479a84a
NC
4075 STRLEN len;
4076 const char * const p = SvPV_const(sv, len);
4077
4078 sv = newSVpvn_flags(p, len, SVs_TEMP | SvUTF8(sv));
0abcdfa4 4079 lex_flags |= LEX_START_COPIED;
7d789282 4080
60d63348 4081 if (bytes && SvUTF8(sv))
7d789282
FC
4082 SvPVbyte_force(sv, len);
4083 }
60d63348 4084 else if (bytes && SvUTF8(sv)) {
e1fa07e3 4085 /* Don't modify someone else's scalar */
7d789282
FC
4086 STRLEN len;
4087 sv = newSVsv(sv);
5cefc8c1 4088 (void)sv_2mortal(sv);
7d789282 4089 SvPVbyte_force(sv,len);
0abcdfa4 4090 lex_flags |= LEX_START_COPIED;
895b760f 4091 }
a0d0e21e 4092
af2d3def 4093 TAINT_IF(SvTAINTED(sv));
748a9306 4094 TAINT_PROPER("eval");
a0d0e21e 4095
d343c3ef 4096 ENTER_with_name("eval");
0abcdfa4 4097 lex_start(sv, NULL, lex_flags | (PL_op->op_private & OPpEVAL_UNICODE
60d63348
FC
4098 ? LEX_IGNORE_UTF8_HINTS
4099 : bytes ? LEX_EVALBYTES : LEX_START_SAME_FILTER
0abcdfa4 4100 )
60d63348 4101 );
748a9306 4102 SAVETMPS;
ac27b0f5 4103
a0d0e21e
LW
4104 /* switch to eval mode */
4105
83ee9e09 4106 if (PERLDB_NAMEEVAL && CopLINE(PL_curcop)) {
8b38226b
AL
4107 SV * const temp_sv = sv_newmortal();
4108 Perl_sv_setpvf(aTHX_ temp_sv, "_<(eval %lu)[%s:%"IVdf"]",
83ee9e09
GS
4109 (unsigned long)++PL_evalseq,
4110 CopFILE(PL_curcop), (IV)CopLINE(PL_curcop));
8b38226b
AL
4111 tmpbuf = SvPVX(temp_sv);
4112 len = SvCUR(temp_sv);
83ee9e09
GS
4113 }
4114 else
d9fad198 4115 len = my_snprintf(tmpbuf, sizeof(tbuf), "_<(eval %lu)", (unsigned long)++PL_evalseq);
f4dd75d9 4116 SAVECOPFILE_FREE(&PL_compiling);
57843af0 4117 CopFILE_set(&PL_compiling, tmpbuf+2);
f4dd75d9 4118 SAVECOPLINE(&PL_compiling);
57843af0 4119 CopLINE_set(&PL_compiling, 1);
d819b83a
DM
4120 /* special case: an eval '' executed within the DB package gets lexically
4121 * placed in the first non-DB CV rather than the current CV - this
4122 * allows the debugger to execute code, find lexicals etc, in the
4123 * scope of the code being debugged. Passing &seq gets find_runcv
4124 * to do the dirty work for us */
4125 runcv = find_runcv(&seq);
a0d0e21e 4126
6b35e009 4127 PUSHBLOCK(cx, (CXt_EVAL|CXp_REAL), SP);
6b75f042 4128 PUSHEVAL(cx, 0);
f39bc417 4129 cx->blk_eval.retop = PL_op->op_next;
a0d0e21e
LW
4130
4131 /* prepare to compile string */
4132
a44e3ce2 4133 if ((PERLDB_LINE || PERLDB_SAVESRC) && PL_curstash != PL_debstash)
bdc0bf6f 4134 save_lines(CopFILEAV(&PL_compiling), PL_parser->linestr);
78da7625 4135 else {
c8cb8d55
FC
4136 /* XXX For C<eval "...">s within BEGIN {} blocks, this ends up
4137 deleting the eval's FILEGV from the stash before gv_check() runs
4138 (i.e. before run-time proper). To work around the coredump that
4139 ensues, we always turn GvMULTI_on for any globals that were
4140 introduced within evals. See force_ident(). GSAR 96-10-12 */
78da7625
FC
4141 char *const safestr = savepvn(tmpbuf, len);
4142 SAVEDELETE(PL_defstash, safestr, len);
4143 saved_delete = TRUE;
4144 }
4145
a0d0e21e 4146 PUTBACK;
f9bddea7 4147
104a8185 4148 if (doeval(gimme, runcv, seq, saved_hh)) {
f9bddea7
NC
4149 if (was != PL_breakable_sub_gen /* Some subs defined here. */
4150 ? (PERLDB_LINE || PERLDB_SAVESRC)
4151 : PERLDB_SAVESRC_NOSUBS) {
4152 /* Retain the filegv we created. */
78da7625 4153 } else if (!saved_delete) {
f9bddea7
NC
4154 char *const safestr = savepvn(tmpbuf, len);
4155 SAVEDELETE(PL_defstash, safestr, len);
4156 }
4157 return DOCATCH(PL_eval_start);
4158 } else {
486ec47a 4159 /* We have already left the scope set up earlier thanks to the LEAVE
f9bddea7 4160 in doeval(). */
eb044b10
NC
4161 if (was != PL_breakable_sub_gen /* Some subs defined here. */
4162 ? (PERLDB_LINE || PERLDB_SAVESRC)
4163 : PERLDB_SAVESRC_INVALID) {
f9bddea7 4164 /* Retain the filegv we created. */
7857f360 4165 } else if (!saved_delete) {
f9bddea7
NC
4166 (void)hv_delete(PL_defstash, tmpbuf, len, G_DISCARD);
4167 }
4168 return PL_op->op_next;
4169 }
a0d0e21e
LW
4170}
4171
4172PP(pp_leaveeval)
4173{
27da23d5 4174 dVAR; dSP;
a0d0e21e
LW
4175 SV **newsp;
4176 PMOP *newpm;
4177 I32 gimme;
eb578fdb 4178 PERL_CONTEXT *cx;
a0d0e21e 4179 OP *retop;
06b5626a 4180 const U8 save_flags = PL_op -> op_flags;
a0d0e21e 4181 I32 optype;
b6494f15 4182 SV *namesv;
676a678a 4183 CV *evalcv;
a0d0e21e 4184
011c3814 4185 PERL_ASYNC_CHECK();
a0d0e21e
LW
4186 POPBLOCK(cx,newpm);
4187 POPEVAL(cx);
b6494f15 4188 namesv = cx->blk_eval.old_namesv;
f39bc417 4189 retop = cx->blk_eval.retop;
676a678a 4190 evalcv = cx->blk_eval.cv;
a0d0e21e 4191
a1f49e72 4192 TAINT_NOT;
b9d76716
VP
4193 SP = adjust_stack_on_leave((gimme == G_VOID) ? SP : newsp, SP, newsp,
4194 gimme, SVs_TEMP);
3280af22 4195 PL_curpm = newpm; /* Don't pop $1 et al till now */
a0d0e21e 4196
4fdae800 4197#ifdef DEBUGGING
676a678a 4198 assert(CvDEPTH(evalcv) == 1);
4fdae800 4199#endif
676a678a 4200 CvDEPTH(evalcv) = 0;
4fdae800 4201
1ce6579f 4202 if (optype == OP_REQUIRE &&
924508f0 4203 !(gimme == G_SCALAR ? SvTRUE(*SP) : SP > newsp))
54310121 4204 {
1ce6579f 4205 /* Unassume the success we assumed earlier. */
b6494f15 4206 (void)hv_delete(GvHVn(PL_incgv),
ecad31f0 4207 SvPVX_const(namesv),
c60dbbc3 4208 SvUTF8(namesv) ? -(I32)SvCUR(namesv) : (I32)SvCUR(namesv),
b6494f15
VP
4209 G_DISCARD);
4210 retop = Perl_die(aTHX_ "%"SVf" did not return a true value",
4211 SVfARG(namesv));
c5df3096 4212 /* die_unwind() did LEAVE, or we won't be here */
f46d017c
GS
4213 }
4214 else {
d343c3ef 4215 LEAVE_with_name("eval");
8433848b 4216 if (!(save_flags & OPf_SPECIAL)) {
ab69dbc2 4217 CLEAR_ERRSV();
8433848b 4218 }
a0d0e21e 4219 }
a0d0e21e
LW
4220
4221 RETURNOP(retop);
4222}
4223
edb2152a
NC
4224/* Common code for Perl_call_sv and Perl_fold_constants, put here to keep it
4225 close to the related Perl_create_eval_scope. */
4226void
4227Perl_delete_eval_scope(pTHX)
a0d0e21e 4228{
edb2152a
NC
4229 SV **newsp;
4230 PMOP *newpm;
4231 I32 gimme;
eb578fdb 4232 PERL_CONTEXT *cx;
edb2152a
NC
4233 I32 optype;
4234
4235 POPBLOCK(cx,newpm);
4236 POPEVAL(cx);
4237 PL_curpm = newpm;
d343c3ef 4238 LEAVE_with_name("eval_scope");
edb2152a
NC
4239 PERL_UNUSED_VAR(newsp);
4240 PERL_UNUSED_VAR(gimme);
4241 PERL_UNUSED_VAR(optype);
4242}
a0d0e21e 4243
edb2152a
NC
4244/* Common-ish code salvaged from Perl_call_sv and pp_entertry, because it was
4245 also needed by Perl_fold_constants. */
4246PERL_CONTEXT *
4247Perl_create_eval_scope(pTHX_ U32 flags)
4248{
4249 PERL_CONTEXT *cx;
4250 const I32 gimme = GIMME_V;
4251
d343c3ef 4252 ENTER_with_name("eval_scope");
a0d0e21e
LW
4253 SAVETMPS;
4254
edb2152a 4255 PUSHBLOCK(cx, (CXt_EVAL|CXp_TRYBLOCK), PL_stack_sp);
6b75f042 4256 PUSHEVAL(cx, 0);
a0d0e21e 4257
faef0170 4258 PL_in_eval = EVAL_INEVAL;
edb2152a
NC
4259 if (flags & G_KEEPERR)
4260 PL_in_eval |= EVAL_KEEPERR;
ab69dbc2
RGS
4261 else
4262 CLEAR_ERRSV();
edb2152a
NC
4263 if (flags & G_FAKINGEVAL) {
4264 PL_eval_root = PL_op; /* Only needed so that goto works right. */
4265 }
4266 return cx;
4267}
4268
4269PP(pp_entertry)
4270{
4271 dVAR;
df528165 4272 PERL_CONTEXT * const cx = create_eval_scope(0);
edb2152a 4273 cx->blk_eval.retop = cLOGOP->op_other->op_next;
533c011a 4274 return DOCATCH(PL_op->op_next);
a0d0e21e
LW
4275}
4276
4277PP(pp_leavetry)
4278{
27da23d5 4279 dVAR; dSP;
a0d0e21e
LW
4280 SV **newsp;
4281 PMOP *newpm;
4282 I32 gimme;
eb578fdb 4283 PERL_CONTEXT *cx;
a0d0e21e
LW
4284 I32 optype;
4285
011c3814 4286 PERL_ASYNC_CHECK();
a0d0e21e
LW
4287 POPBLOCK(cx,newpm);
4288 POPEVAL(cx);
9d4ba2ae 4289 PERL_UNUSED_VAR(optype);
a0d0e21e 4290
a1f49e72 4291 TAINT_NOT;
b9d76716 4292 SP = adjust_stack_on_leave(newsp, SP, newsp, gimme, SVs_PADTMP|SVs_TEMP);
3280af22 4293 PL_curpm = newpm; /* Don't pop $1 et al till now */
a0d0e21e 4294
d343c3ef 4295 LEAVE_with_name("eval_scope");
ab69dbc2 4296 CLEAR_ERRSV();
745cf2ff 4297 RETURN;
a0d0e21e
LW
4298}
4299
0d863452
RH
4300PP(pp_entergiven)
4301{
4302 dVAR; dSP;
eb578fdb 4303 PERL_CONTEXT *cx;
0d863452
RH
4304 const I32 gimme = GIMME_V;
4305
d343c3ef 4306 ENTER_with_name("given");
0d863452
RH
4307 SAVETMPS;
4308
b5a64814
FC
4309 if (PL_op->op_targ) {
4310 SAVEPADSVANDMORTALIZE(PL_op->op_targ);
4311 SvREFCNT_dec(PAD_SVl(PL_op->op_targ));
4312 PAD_SVl(PL_op->op_targ) = SvREFCNT_inc_NN(POPs);
4313 }
4314 else {
4315 SAVE_DEFSV;
4316 DEFSV_set(POPs);
4317 }
0d863452
RH
4318
4319 PUSHBLOCK(cx, CXt_GIVEN, SP);
4320 PUSHGIVEN(cx);
4321
4322 RETURN;
4323}
4324
4325PP(pp_leavegiven)
4326{
4327 dVAR; dSP;
eb578fdb 4328 PERL_CONTEXT *cx;
0d863452
RH
4329 I32 gimme;
4330 SV **newsp;
4331 PMOP *newpm;
96a5add6 4332 PERL_UNUSED_CONTEXT;
0d863452
RH
4333
4334 POPBLOCK(cx,newpm);
4335 assert(CxTYPE(cx) == CXt_GIVEN);
0d863452 4336
25b991bf 4337 TAINT_NOT;
b9d76716 4338 SP = adjust_stack_on_leave(newsp, SP, newsp, gimme, SVs_PADTMP|SVs_TEMP);
25b991bf 4339 PL_curpm = newpm; /* Don't pop $1 et al till now */
0d863452 4340
d343c3ef 4341 LEAVE_with_name("given");
25b991bf 4342 RETURN;
0d863452
RH
4343}
4344
4345/* Helper routines used by pp_smartmatch */
4136a0f7 4346STATIC PMOP *
84679df5 4347S_make_matcher(pTHX_ REGEXP *re)
0d863452 4348{
97aff369 4349 dVAR;
0d863452 4350 PMOP *matcher = (PMOP *) newPMOP(OP_MATCH, OPf_WANT_SCALAR | OPf_STACKED);
7918f24d
NC
4351
4352 PERL_ARGS_ASSERT_MAKE_MATCHER;
4353
d6106309 4354 PM_SETRE(matcher, ReREFCNT_inc(re));
7918f24d 4355
0d863452 4356 SAVEFREEOP((OP *) matcher);
d343c3ef 4357 ENTER_with_name("matcher"); SAVETMPS;
0d863452
RH
4358 SAVEOP();
4359 return matcher;
4360}
4361
4136a0f7 4362STATIC bool
0d863452
RH
4363S_matcher_matches_sv(pTHX_ PMOP *matcher, SV *sv)
4364{
97aff369 4365 dVAR;
0d863452 4366 dSP;
7918f24d
NC
4367
4368 PERL_ARGS_ASSERT_MATCHER_MATCHES_SV;
0d863452
RH
4369
4370 PL_op = (OP *) matcher;
4371 XPUSHs(sv);
4372 PUTBACK;
897d3989 4373 (void) Perl_pp_match(aTHX);
0d863452
RH
4374 SPAGAIN;
4375 return (SvTRUEx(POPs));
4376}
4377
4136a0f7 4378STATIC void
0d863452
RH
4379S_destroy_matcher(pTHX_ PMOP *matcher)
4380{
97aff369 4381 dVAR;
7918f24d
NC
4382
4383 PERL_ARGS_ASSERT_DESTROY_MATCHER;
0d863452 4384 PERL_UNUSED_ARG(matcher);
7918f24d 4385
0d863452 4386 FREETMPS;
d343c3ef 4387 LEAVE_with_name("matcher");
0d863452
RH
4388}
4389
4390/* Do a smart match */
4391PP(pp_smartmatch)
4392{
d7c0d282 4393 DEBUG_M(Perl_deb(aTHX_ "Starting smart match resolution\n"));
be88a5c3 4394 return do_smartmatch(NULL, NULL, 0);
0d863452
RH
4395}
4396
4b021f5f
RGS
4397/* This version of do_smartmatch() implements the
4398 * table of smart matches that is found in perlsyn.
0d863452 4399 */
4136a0f7 4400STATIC OP *
be88a5c3 4401S_do_smartmatch(pTHX_ HV *seen_this, HV *seen_other, const bool copied)
0d863452 4402{
97aff369 4403 dVAR;
0d863452
RH
4404 dSP;
4405
41e726ac 4406 bool object_on_left = FALSE;
0d863452
RH
4407 SV *e = TOPs; /* e is for 'expression' */
4408 SV *d = TOPm1s; /* d is for 'default', as in PL_defgv */
a566f585 4409
6f1401dc
DM
4410 /* Take care only to invoke mg_get() once for each argument.
4411 * Currently we do this by copying the SV if it's magical. */
4412 if (d) {
be88a5c3 4413 if (!copied && SvGMAGICAL(d))
6f1401dc
DM
4414 d = sv_mortalcopy(d);
4415 }
4416 else
4417 d = &PL_sv_undef;
4418
4419 assert(e);
4420 if (SvGMAGICAL(e))
4421 e = sv_mortalcopy(e);
4422
2c9d2554 4423 /* First of all, handle overload magic of the rightmost argument */
6d743019 4424 if (SvAMAGIC(e)) {
d7c0d282
DM
4425 SV * tmpsv;
4426 DEBUG_M(Perl_deb(aTHX_ " applying rule Any-Object\n"));
4427 DEBUG_M(Perl_deb(aTHX_ " attempting overload\n"));
4428
b900a653 4429 tmpsv = amagic_call(d, e, smart_amg, AMGf_noleft);
7c41e62e
RGS
4430 if (tmpsv) {
4431 SPAGAIN;
4432 (void)POPs;
4433 SETs(tmpsv);
4434 RETURN;
4435 }
d7c0d282 4436 DEBUG_M(Perl_deb(aTHX_ " failed to run overload method; continuing...\n"));
7c41e62e 4437 }
62ec5f58 4438
0d863452
RH
4439 SP -= 2; /* Pop the values */
4440
0d863452 4441
b0138e99 4442 /* ~~ undef */
62ec5f58 4443 if (!SvOK(e)) {
d7c0d282 4444 DEBUG_M(Perl_deb(aTHX_ " applying rule Any-undef\n"));
62ec5f58 4445 if (SvOK(d))
33570f8b
RGS
4446 RETPUSHNO;
4447 else
62ec5f58 4448 RETPUSHYES;
33570f8b 4449 }
e67b97bd 4450
d7c0d282
DM
4451 if (sv_isobject(e) && (SvTYPE(SvRV(e)) != SVt_REGEXP)) {
4452 DEBUG_M(Perl_deb(aTHX_ " applying rule Any-Object\n"));
62ec5f58 4453 Perl_croak(aTHX_ "Smart matching a non-overloaded object breaks encapsulation");
d7c0d282 4454 }
41e726ac
RGS
4455 if (sv_isobject(d) && (SvTYPE(SvRV(d)) != SVt_REGEXP))
4456 object_on_left = TRUE;
62ec5f58 4457
b0138e99 4458 /* ~~ sub */
a4a197da 4459 if (SvROK(e) && SvTYPE(SvRV(e)) == SVt_PVCV) {
0d863452 4460 I32 c;
41e726ac
RGS
4461 if (object_on_left) {
4462 goto sm_any_sub; /* Treat objects like scalars */
4463 }
4464 else if (SvROK(d) && SvTYPE(SvRV(d)) == SVt_PVHV) {
a4a197da
RGS
4465 /* Test sub truth for each key */
4466 HE *he;
4467 bool andedresults = TRUE;
4468 HV *hv = (HV*) SvRV(d);
168ff818 4469 I32 numkeys = hv_iterinit(hv);
d7c0d282 4470 DEBUG_M(Perl_deb(aTHX_ " applying rule Hash-CodeRef\n"));
168ff818 4471 if (numkeys == 0)
07edf497 4472 RETPUSHYES;
a4a197da 4473 while ( (he = hv_iternext(hv)) ) {
d7c0d282 4474 DEBUG_M(Perl_deb(aTHX_ " testing hash key...\n"));
d343c3ef 4475 ENTER_with_name("smartmatch_hash_key_test");
a4a197da
RGS
4476 SAVETMPS;
4477 PUSHMARK(SP);
4478 PUSHs(hv_iterkeysv(he));
4479 PUTBACK;
4480 c = call_sv(e, G_SCALAR);
4481 SPAGAIN;
4482 if (c == 0)
4483 andedresults = FALSE;
4484 else
4485 andedresults = SvTRUEx(POPs) && andedresults;
4486 FREETMPS;
d343c3ef 4487 LEAVE_with_name("smartmatch_hash_key_test");
a4a197da
RGS
4488 }
4489 if (andedresults)
4490 RETPUSHYES;
4491 else
4492 RETPUSHNO;
4493 }
4494 else if (SvROK(d) && SvTYPE(SvRV(d)) == SVt_PVAV) {
4495 /* Test sub truth for each element */
4496 I32 i;
4497 bool andedresults = TRUE;
4498 AV *av = (AV*) SvRV(d);
4499 const I32 len = av_len(av);
d7c0d282 4500 DEBUG_M(Perl_deb(aTHX_ " applying rule Array-CodeRef\n"));
168ff818 4501 if (len == -1)
07edf497 4502 RETPUSHYES;
a4a197da
RGS
4503 for (i = 0; i <= len; ++i) {
4504 SV * const * const svp = av_fetch(av, i, FALSE);
d7c0d282 4505 DEBUG_M(Perl_deb(aTHX_ " testing array element...\n"));
d343c3ef 4506 ENTER_with_name("smartmatch_array_elem_test");
a4a197da
RGS
4507 SAVETMPS;
4508 PUSHMARK(SP);
4509 if (svp)
4510 PUSHs(*svp);
4511 PUTBACK;
4512 c = call_sv(e, G_SCALAR);
4513 SPAGAIN;
4514 if (c == 0)
4515 andedresults = FALSE;
4516 else
4517 andedresults = SvTRUEx(POPs) && andedresults;
4518 FREETMPS;
d343c3ef 4519 LEAVE_with_name("smartmatch_array_elem_test");
a4a197da
RGS
4520 }
4521 if (andedresults)
4522 RETPUSHYES;
4523 else
4524 RETPUSHNO;
4525 }
4526 else {
41e726ac 4527 sm_any_sub:
d7c0d282 4528 DEBUG_M(Perl_deb(aTHX_ " applying rule Any-CodeRef\n"));
d343c3ef 4529 ENTER_with_name("smartmatch_coderef");
a4a197da
RGS
4530 SAVETMPS;
4531 PUSHMARK(SP);
4532 PUSHs(d);
4533 PUTBACK;
4534 c = call_sv(e, G_SCALAR);
4535 SPAGAIN;
4536 if (c == 0)
4537 PUSHs(&PL_sv_no);
4538 else if (SvTEMP(TOPs))
4539 SvREFCNT_inc_void(TOPs);
4540 FREETMPS;
d343c3ef 4541 LEAVE_with_name("smartmatch_coderef");
a4a197da
RGS
4542 RETURN;
4543 }
0d863452 4544 }
b0138e99 4545 /* ~~ %hash */
61a621c6 4546 else if (SvROK(e) && SvTYPE(SvRV(e)) == SVt_PVHV) {
41e726ac
RGS
4547 if (object_on_left) {
4548 goto sm_any_hash; /* Treat objects like scalars */
4549 }
4550 else if (!SvOK(d)) {
d7c0d282 4551 DEBUG_M(Perl_deb(aTHX_ " applying rule Any-Hash ($a undef)\n"));
61a621c6
RGS
4552 RETPUSHNO;
4553 }
4554 else if (SvROK(d) && SvTYPE(SvRV(d)) == SVt_PVHV) {
0d863452
RH
4555 /* Check that the key-sets are identical */
4556 HE *he;
61a621c6 4557 HV *other_hv = MUTABLE_HV(SvRV(d));
0d863452
RH
4558 bool tied = FALSE;
4559 bool other_tied = FALSE;
4560 U32 this_key_count = 0,
4561 other_key_count = 0;
33ed63a2 4562 HV *hv = MUTABLE_HV(SvRV(e));
d7c0d282
DM
4563
4564 DEBUG_M(Perl_deb(aTHX_ " applying rule Hash-Hash\n"));
0d863452 4565 /* Tied hashes don't know how many keys they have. */
33ed63a2 4566 if (SvTIED_mg((SV*)hv, PERL_MAGIC_tied)) {
0d863452
RH
4567 tied = TRUE;
4568 }
ad64d0ec 4569 else if (SvTIED_mg((const SV *)other_hv, PERL_MAGIC_tied)) {
c445ea15 4570 HV * const temp = other_hv;
33ed63a2
RGS
4571 other_hv = hv;
4572 hv = temp;
0d863452
RH
4573 tied = TRUE;
4574 }
ad64d0ec 4575 if (SvTIED_mg((const SV *)other_hv, PERL_MAGIC_tied))
0d863452
RH
4576 other_tied = TRUE;
4577
33ed63a2 4578 if (!tied && HvUSEDKEYS((const HV *) hv) != HvUSEDKEYS(other_hv))
0d863452
RH
4579 RETPUSHNO;
4580
4581 /* The hashes have the same number of keys, so it suffices
4582 to check that one is a subset of the other. */
33ed63a2
RGS
4583 (void) hv_iterinit(hv);
4584 while ( (he = hv_iternext(hv)) ) {
b15feb55 4585 SV *key = hv_iterkeysv(he);
d7c0d282
DM
4586
4587 DEBUG_M(Perl_deb(aTHX_ " comparing hash key...\n"));
0d863452
RH
4588 ++ this_key_count;
4589
b15feb55 4590 if(!hv_exists_ent(other_hv, key, 0)) {
33ed63a2 4591 (void) hv_iterinit(hv); /* reset iterator */
0d863452
RH
4592 RETPUSHNO;
4593 }
4594 }
4595
4596 if (other_tied) {
4597 (void) hv_iterinit(other_hv);
4598 while ( hv_iternext(other_hv) )
4599 ++other_key_count;
4600 }
4601 else
4602 other_key_count = HvUSEDKEYS(other_hv);
4603
4604 if (this_key_count != other_key_count)
4605 RETPUSHNO;
4606 else
4607 RETPUSHYES;
4608 }
61a621c6
RGS
4609 else if (SvROK(d) && SvTYPE(SvRV(d)) == SVt_PVAV) {
4610 AV * const other_av = MUTABLE_AV(SvRV(d));
c445ea15 4611 const I32 other_len = av_len(other_av) + 1;
0d863452 4612 I32 i;
33ed63a2 4613 HV *hv = MUTABLE_HV(SvRV(e));
71b0fb34 4614
d7c0d282 4615 DEBUG_M(Perl_deb(aTHX_ " applying rule Array-Hash\n"));
71b0fb34 4616 for (i = 0; i < other_len; ++i) {
c445ea15 4617 SV ** const svp = av_fetch(other_av, i, FALSE);
d7c0d282 4618 DEBUG_M(Perl_deb(aTHX_ " checking for key existence...\n"));
71b0fb34 4619 if (svp) { /* ??? When can this not happen? */
b15feb55 4620 if (hv_exists_ent(hv, *svp, 0))
71b0fb34
DK
4621 RETPUSHYES;
4622 }
0d863452 4623 }
71b0fb34 4624 RETPUSHNO;
0d863452 4625 }
a566f585 4626 else if (SvROK(d) && SvTYPE(SvRV(d)) == SVt_REGEXP) {
d7c0d282 4627 DEBUG_M(Perl_deb(aTHX_ " applying rule Regex-Hash\n"));
ea0c2dbd
RGS
4628 sm_regex_hash:
4629 {
4630 PMOP * const matcher = make_matcher((REGEXP*) SvRV(d));
4631 HE *he;
4632 HV *hv = MUTABLE_HV(SvRV(e));
4633
4634 (void) hv_iterinit(hv);
4635 while ( (he = hv_iternext(hv)) ) {
d7c0d282 4636 DEBUG_M(Perl_deb(aTHX_ " testing key against pattern...\n"));
ea0c2dbd
RGS
4637 if (matcher_matches_sv(matcher, hv_iterkeysv(he))) {
4638 (void) hv_iterinit(hv);
4639 destroy_matcher(matcher);
4640 RETPUSHYES;
4641 }
0d863452 4642 }
ea0c2dbd
RGS
4643 destroy_matcher(matcher);
4644 RETPUSHNO;
0d863452 4645 }
0d863452
RH
4646 }
4647 else {
41e726ac 4648 sm_any_hash:
d7c0d282 4649 DEBUG_M(Perl_deb(aTHX_ " applying rule Any-Hash\n"));
61a621c6 4650 if (hv_exists_ent(MUTABLE_HV(SvRV(e)), d, 0))
0d863452
RH
4651 RETPUSHYES;
4652 else
4653 RETPUSHNO;
4654 }
4655 }
b0138e99
RGS
4656 /* ~~ @array */
4657 else if (SvROK(e) && SvTYPE(SvRV(e)) == SVt_PVAV) {
41e726ac
RGS
4658 if (object_on_left) {
4659 goto sm_any_array; /* Treat objects like scalars */
4660 }
4661 else if (SvROK(d) && SvTYPE(SvRV(d)) == SVt_PVHV) {
b0138e99
RGS
4662 AV * const other_av = MUTABLE_AV(SvRV(e));
4663 const I32 other_len = av_len(other_av) + 1;
4664 I32 i;
4665
d7c0d282 4666 DEBUG_M(Perl_deb(aTHX_ " applying rule Hash-Array\n"));
b0138e99
RGS
4667 for (i = 0; i < other_len; ++i) {
4668 SV ** const svp = av_fetch(other_av, i, FALSE);
d7c0d282
DM
4669
4670 DEBUG_M(Perl_deb(aTHX_ " testing for key existence...\n"));
b0138e99 4671 if (svp) { /* ??? When can this not happen? */
b15feb55 4672 if (hv_exists_ent(MUTABLE_HV(SvRV(d)), *svp, 0))
b0138e99
RGS
4673 RETPUSHYES;
4674 }
4675 }
4676 RETPUSHNO;
4677 }
4678 if (SvROK(d) && SvTYPE(SvRV(d)) == SVt_PVAV) {
4679 AV *other_av = MUTABLE_AV(SvRV(d));
d7c0d282 4680 DEBUG_M(Perl_deb(aTHX_ " applying rule Array-Array\n"));
b0138e99 4681 if (av_len(MUTABLE_AV(SvRV(e))) != av_len(other_av))
0d863452
RH
4682 RETPUSHNO;
4683 else {
4684 I32 i;
c445ea15 4685 const I32 other_len = av_len(other_av);
0d863452 4686
a0714e2c 4687 if (NULL == seen_this) {
0d863452 4688 seen_this = newHV();
ad64d0ec 4689 (void) sv_2mortal(MUTABLE_SV(seen_this));
0d863452 4690 }
a0714e2c 4691 if (NULL == seen_other) {
6bc991bf 4692 seen_other = newHV();
ad64d0ec 4693 (void) sv_2mortal(MUTABLE_SV(seen_other));
0d863452
RH
4694 }
4695 for(i = 0; i <= other_len; ++i) {
b0138e99 4696 SV * const * const this_elem = av_fetch(MUTABLE_AV(SvRV(e)), i, FALSE);
c445ea15
AL
4697 SV * const * const other_elem = av_fetch(other_av, i, FALSE);
4698
0d863452 4699 if (!this_elem || !other_elem) {
69c3dccf
RGS
4700 if ((this_elem && SvOK(*this_elem))
4701 || (other_elem && SvOK(*other_elem)))
0d863452
RH
4702 RETPUSHNO;
4703 }
365c4e3d
RGS
4704 else if (hv_exists_ent(seen_this,
4705 sv_2mortal(newSViv(PTR2IV(*this_elem))), 0) ||
4706 hv_exists_ent(seen_other,
4707 sv_2mortal(newSViv(PTR2IV(*other_elem))), 0))
0d863452
RH
4708 {
4709 if (*this_elem != *other_elem)
4710 RETPUSHNO;
4711 }
4712 else {
04fe65b0
RGS
4713 (void)hv_store_ent(seen_this,
4714 sv_2mortal(newSViv(PTR2IV(*this_elem))),
4715 &PL_sv_undef, 0);
4716 (void)hv_store_ent(seen_other,
4717 sv_2mortal(newSViv(PTR2IV(*other_elem))),
4718 &PL_sv_undef, 0);
0d863452 4719 PUSHs(*other_elem);
a566f585 4720 PUSHs(*this_elem);
0d863452
RH
4721
4722 PUTBACK;
d7c0d282 4723 DEBUG_M(Perl_deb(aTHX_ " recursively comparing array element...\n"));
be88a5c3 4724 (void) do_smartmatch(seen_this, seen_other, 0);
0d863452 4725 SPAGAIN;
d7c0d282 4726 DEBUG_M(Perl_deb(aTHX_ " recursion finished\n"));
0d863452
RH
4727
4728 if (!SvTRUEx(POPs))
4729 RETPUSHNO;
4730 }
4731 }
4732 RETPUSHYES;
4733 }
4734 }
a566f585 4735 else if (SvROK(d) && SvTYPE(SvRV(d)) == SVt_REGEXP) {
d7c0d282 4736 DEBUG_M(Perl_deb(aTHX_ " applying rule Regex-Array\n"));
ea0c2dbd
RGS
4737 sm_regex_array:
4738 {
4739 PMOP * const matcher = make_matcher((REGEXP*) SvRV(d));
4740 const I32 this_len = av_len(MUTABLE_AV(SvRV(e)));
4741 I32 i;
0d863452 4742
ea0c2dbd
RGS
4743 for(i = 0; i <= this_len; ++i) {
4744 SV * const * const svp = av_fetch(MUTABLE_AV(SvRV(e)), i, FALSE);
d7c0d282 4745 DEBUG_M(Perl_deb(aTHX_ " testing element against pattern...\n"));
ea0c2dbd
RGS
4746 if (svp && matcher_matches_sv(matcher, *svp)) {
4747 destroy_matcher(matcher);
4748 RETPUSHYES;
4749 }
0d863452 4750 }
ea0c2dbd
RGS
4751 destroy_matcher(matcher);
4752 RETPUSHNO;
0d863452 4753 }
0d863452 4754 }
015eb7b9
RGS
4755 else if (!SvOK(d)) {
4756 /* undef ~~ array */
4757 const I32 this_len = av_len(MUTABLE_AV(SvRV(e)));
0d863452
RH
4758 I32 i;
4759
d7c0d282 4760 DEBUG_M(Perl_deb(aTHX_ " applying rule Undef-Array\n"));
015eb7b9 4761 for (i = 0; i <= this_len; ++i) {
b0138e99 4762 SV * const * const svp = av_fetch(MUTABLE_AV(SvRV(e)), i, FALSE);
d7c0d282 4763 DEBUG_M(Perl_deb(aTHX_ " testing for undef element...\n"));
015eb7b9 4764 if (!svp || !SvOK(*svp))
0d863452
RH
4765 RETPUSHYES;
4766 }
4767 RETPUSHNO;
4768 }
015eb7b9 4769 else {
41e726ac
RGS
4770 sm_any_array:
4771 {
4772 I32 i;
4773 const I32 this_len = av_len(MUTABLE_AV(SvRV(e)));
0d863452 4774
d7c0d282 4775 DEBUG_M(Perl_deb(aTHX_ " applying rule Any-Array\n"));
41e726ac
RGS
4776 for (i = 0; i <= this_len; ++i) {
4777 SV * const * const svp = av_fetch(MUTABLE_AV(SvRV(e)), i, FALSE);
4778 if (!svp)
4779 continue;
015eb7b9 4780
41e726ac
RGS
4781 PUSHs(d);
4782 PUSHs(*svp);
4783 PUTBACK;
4784 /* infinite recursion isn't supposed to happen here */
d7c0d282 4785 DEBUG_M(Perl_deb(aTHX_ " recursively testing array element...\n"));
be88a5c3 4786 (void) do_smartmatch(NULL, NULL, 1);
41e726ac 4787 SPAGAIN;
d7c0d282 4788 DEBUG_M(Perl_deb(aTHX_ " recursion finished\n"));
41e726ac
RGS
4789 if (SvTRUEx(POPs))
4790 RETPUSHYES;
4791 }
4792 RETPUSHNO;
0d863452 4793 }
0d863452
RH
4794 }
4795 }
b0138e99 4796 /* ~~ qr// */
a566f585 4797 else if (SvROK(e) && SvTYPE(SvRV(e)) == SVt_REGEXP) {
ea0c2dbd
RGS
4798 if (!object_on_left && SvROK(d) && SvTYPE(SvRV(d)) == SVt_PVHV) {
4799 SV *t = d; d = e; e = t;
d7c0d282 4800 DEBUG_M(Perl_deb(aTHX_ " applying rule Hash-Regex\n"));
ea0c2dbd
RGS
4801 goto sm_regex_hash;
4802 }
4803 else if (!object_on_left && SvROK(d) && SvTYPE(SvRV(d)) == SVt_PVAV) {
4804 SV *t = d; d = e; e = t;
d7c0d282 4805 DEBUG_M(Perl_deb(aTHX_ " applying rule Array-Regex\n"));
ea0c2dbd
RGS
4806 goto sm_regex_array;
4807 }
4808 else {
4809 PMOP * const matcher = make_matcher((REGEXP*) SvRV(e));
0d863452 4810
d7c0d282 4811 DEBUG_M(Perl_deb(aTHX_ " applying rule Any-Regex\n"));
ea0c2dbd
RGS
4812 PUTBACK;
4813 PUSHs(matcher_matches_sv(matcher, d)
4814 ? &PL_sv_yes
4815 : &PL_sv_no);
4816 destroy_matcher(matcher);
4817 RETURN;
4818 }
0d863452 4819 }
b0138e99 4820 /* ~~ scalar */
2c9d2554
RGS
4821 /* See if there is overload magic on left */
4822 else if (object_on_left && SvAMAGIC(d)) {
4823 SV *tmpsv;
d7c0d282
DM
4824 DEBUG_M(Perl_deb(aTHX_ " applying rule Object-Any\n"));
4825 DEBUG_M(Perl_deb(aTHX_ " attempting overload\n"));
2c9d2554
RGS
4826 PUSHs(d); PUSHs(e);
4827 PUTBACK;
4828 tmpsv = amagic_call(d, e, smart_amg, AMGf_noright);
4829 if (tmpsv) {
4830 SPAGAIN;
4831 (void)POPs;
4832 SETs(tmpsv);
4833 RETURN;
4834 }
4835 SP -= 2;
d7c0d282 4836 DEBUG_M(Perl_deb(aTHX_ " failed to run overload method; falling back...\n"));
2c9d2554
RGS
4837 goto sm_any_scalar;
4838 }
fb51372e
RGS
4839 else if (!SvOK(d)) {
4840 /* undef ~~ scalar ; we already know that the scalar is SvOK */
d7c0d282 4841 DEBUG_M(Perl_deb(aTHX_ " applying rule undef-Any\n"));
fb51372e
RGS
4842 RETPUSHNO;
4843 }
2c9d2554
RGS
4844 else
4845 sm_any_scalar:
4846 if (SvNIOK(e) || (SvPOK(e) && looks_like_number(e) && SvNIOK(d))) {
d7c0d282
DM
4847 DEBUG_M(if (SvNIOK(e))
4848 Perl_deb(aTHX_ " applying rule Any-Num\n");
4849 else
4850 Perl_deb(aTHX_ " applying rule Num-numish\n");
4851 );
33ed63a2 4852 /* numeric comparison */
0d863452
RH
4853 PUSHs(d); PUSHs(e);
4854 PUTBACK;
a98fe34d 4855 if (CopHINTS_get(PL_curcop) & HINT_INTEGER)
897d3989 4856 (void) Perl_pp_i_eq(aTHX);
0d863452 4857 else
897d3989 4858 (void) Perl_pp_eq(aTHX);
0d863452
RH
4859 SPAGAIN;
4860 if (SvTRUEx(POPs))
4861 RETPUSHYES;
4862 else
4863 RETPUSHNO;
4864 }
4865
4866 /* As a last resort, use string comparison */
d7c0d282 4867 DEBUG_M(Perl_deb(aTHX_ " applying rule Any-Any\n"));
0d863452
RH
4868 PUSHs(d); PUSHs(e);
4869 PUTBACK;
897d3989 4870 return Perl_pp_seq(aTHX);
0d863452
RH
4871}
4872
4873PP(pp_enterwhen)
4874{
4875 dVAR; dSP;
eb578fdb 4876 PERL_CONTEXT *cx;
0d863452
RH
4877 const I32 gimme = GIMME_V;
4878
4879 /* This is essentially an optimization: if the match
4880 fails, we don't want to push a context and then
4881 pop it again right away, so we skip straight
4882 to the op that follows the leavewhen.
25b991bf 4883 RETURNOP calls PUTBACK which restores the stack pointer after the POPs.
0d863452
RH
4884 */
4885 if ((0 == (PL_op->op_flags & OPf_SPECIAL)) && !SvTRUEx(POPs))
25b991bf 4886 RETURNOP(cLOGOP->op_other->op_next);
0d863452 4887
c08f093b 4888 ENTER_with_name("when");
0d863452
RH
4889 SAVETMPS;
4890
4891 PUSHBLOCK(cx, CXt_WHEN, SP);
4892 PUSHWHEN(cx);
4893
4894 RETURN;
4895}
4896
4897PP(pp_leavewhen)
4898{
4899 dVAR; dSP;
c08f093b 4900 I32 cxix;
eb578fdb 4901 PERL_CONTEXT *cx;
c08f093b 4902 I32 gimme;
0d863452
RH
4903 SV **newsp;
4904 PMOP *newpm;
4905
c08f093b
VP
4906 cxix = dopoptogiven(cxstack_ix);
4907 if (cxix < 0)
fc7debfb
FC
4908 /* diag_listed_as: Can't "when" outside a topicalizer */
4909 DIE(aTHX_ "Can't \"%s\" outside a topicalizer",
4910 PL_op->op_flags & OPf_SPECIAL ? "default" : "when");
c08f093b 4911
0d863452
RH
4912 POPBLOCK(cx,newpm);
4913 assert(CxTYPE(cx) == CXt_WHEN);
4914
c08f093b
VP
4915 TAINT_NOT;
4916 SP = adjust_stack_on_leave(newsp, SP, newsp, gimme, SVs_PADTMP|SVs_TEMP);
0d863452
RH
4917 PL_curpm = newpm; /* pop $1 et al */
4918
c08f093b
VP
4919 LEAVE_with_name("when");
4920
4921 if (cxix < cxstack_ix)
4922 dounwind(cxix);
4923
4924 cx = &cxstack[cxix];
4925
4926 if (CxFOREACH(cx)) {
4927 /* clear off anything above the scope we're re-entering */
4928 I32 inner = PL_scopestack_ix;
4929
4930 TOPBLOCK(cx);
4931 if (PL_scopestack_ix < inner)
4932 leave_scope(PL_scopestack[PL_scopestack_ix]);
4933 PL_curcop = cx->blk_oldcop;
4934
4935 return cx->blk_loop.my_op->op_nextop;
4936 }
4937 else
b1b5a4ae 4938 RETURNOP(cx->blk_givwhen.leave_op);
0d863452
RH
4939}
4940
4941PP(pp_continue)
4942{
c08f093b 4943 dVAR; dSP;
0d863452 4944 I32 cxix;
eb578fdb 4945 PERL_CONTEXT *cx;
c08f093b
VP
4946 I32 gimme;
4947 SV **newsp;
4948 PMOP *newpm;
7be5bd17
FR
4949
4950 PERL_UNUSED_VAR(gimme);
0d863452
RH
4951
4952 cxix = dopoptowhen(cxstack_ix);
4953 if (cxix < 0)
4954 DIE(aTHX_ "Can't \"continue\" outside a when block");
c08f093b 4955
0d863452
RH
4956 if (cxix < cxstack_ix)
4957 dounwind(cxix);
4958
c08f093b
VP
4959 POPBLOCK(cx,newpm);
4960 assert(CxTYPE(cx) == CXt_WHEN);
4961
4962 SP = newsp;
4963 PL_curpm = newpm; /* pop $1 et al */
4964
4965 LEAVE_with_name("when");
4966 RETURNOP(cx->blk_givwhen.leave_op->op_next);
0d863452
RH
4967}
4968
4969PP(pp_break)
4970{
4971 dVAR;
4972 I32 cxix;
eb578fdb 4973 PERL_CONTEXT *cx;
25b991bf 4974
0d863452 4975 cxix = dopoptogiven(cxstack_ix);
c08f093b
VP
4976 if (cxix < 0)
4977 DIE(aTHX_ "Can't \"break\" outside a given block");
4978
4979 cx = &cxstack[cxix];
4980 if (CxFOREACH(cx))
0d863452
RH
4981 DIE(aTHX_ "Can't \"break\" in a loop topicalizer");
4982
4983 if (cxix < cxstack_ix)
4984 dounwind(cxix);
0d863452 4985
0787ea8a
VP
4986 /* Restore the sp at the time we entered the given block */
4987 TOPBLOCK(cx);
4988
c08f093b 4989 return cx->blk_givwhen.leave_op;
0d863452
RH
4990}
4991
74e0ddf7 4992static MAGIC *
cea2e8a9 4993S_doparseform(pTHX_ SV *sv)
a0d0e21e
LW
4994{
4995 STRLEN len;
eb578fdb
KW
4996 char *s = SvPV(sv, len);
4997 char *send;
4998 char *base = NULL; /* start of current field */
4999 I32 skipspaces = 0; /* number of contiguous spaces seen */
086b26f3
DM
5000 bool noblank = FALSE; /* ~ or ~~ seen on this line */
5001 bool repeat = FALSE; /* ~~ seen on this line */
5002 bool postspace = FALSE; /* a text field may need right padding */
dea28490 5003 U32 *fops;
eb578fdb 5004 U32 *fpc;
086b26f3 5005 U32 *linepc = NULL; /* position of last FF_LINEMARK */
eb578fdb 5006 I32 arg;
086b26f3
DM
5007 bool ischop; /* it's a ^ rather than a @ */
5008 bool unchopnum = FALSE; /* at least one @ (i.e. non-chop) num field seen */
a1b95068 5009 int maxops = 12; /* FF_LINEMARK + FF_END + 10 (\0 without preceding \n) */
3808a683
DM
5010 MAGIC *mg = NULL;
5011 SV *sv_copy;
a0d0e21e 5012
7918f24d
NC
5013 PERL_ARGS_ASSERT_DOPARSEFORM;
5014
55497cff 5015 if (len == 0)
cea2e8a9 5016 Perl_croak(aTHX_ "Null picture in formline");
ac27b0f5 5017
3808a683
DM
5018 if (SvTYPE(sv) >= SVt_PVMG) {
5019 /* This might, of course, still return NULL. */
5020 mg = mg_find(sv, PERL_MAGIC_fm);
5021 } else {
5022 sv_upgrade(sv, SVt_PVMG);
5023 }
5024
5025 if (mg) {
5026 /* still the same as previously-compiled string? */
5027 SV *old = mg->mg_obj;
5028 if ( !(!!SvUTF8(old) ^ !!SvUTF8(sv))
5029 && len == SvCUR(old)
5030 && strnEQ(SvPVX(old), SvPVX(sv), len)
b57b1734
DM
5031 ) {
5032 DEBUG_f(PerlIO_printf(Perl_debug_log,"Re-using compiled format\n"));
3808a683 5033 return mg;
b57b1734 5034 }
3808a683 5035
b57b1734 5036 DEBUG_f(PerlIO_printf(Perl_debug_log, "Re-compiling format\n"));
3808a683
DM
5037 Safefree(mg->mg_ptr);
5038 mg->mg_ptr = NULL;
5039 SvREFCNT_dec(old);
5040 mg->mg_obj = NULL;
5041 }
b57b1734
DM
5042 else {
5043 DEBUG_f(PerlIO_printf(Perl_debug_log, "Compiling format\n"));
3808a683 5044 mg = sv_magicext(sv, NULL, PERL_MAGIC_fm, &PL_vtbl_fm, NULL, 0);
b57b1734 5045 }
3808a683
DM
5046
5047 sv_copy = newSVpvn_utf8(s, len, SvUTF8(sv));
5048 s = SvPV(sv_copy, len); /* work on the copy, not the original */
5049 send = s + len;
5050
5051
815f25c6
DM
5052 /* estimate the buffer size needed */
5053 for (base = s; s <= send; s++) {
a1b95068 5054 if (*s == '\n' || *s == '@' || *s == '^')
815f25c6
DM
5055 maxops += 10;
5056 }
5057 s = base;
c445ea15 5058 base = NULL;
815f25c6 5059
a02a5408 5060 Newx(fops, maxops, U32);
a0d0e21e
LW
5061 fpc = fops;
5062
5063 if (s < send) {
5064 linepc = fpc;
5065 *fpc++ = FF_LINEMARK;
5066 noblank = repeat = FALSE;
5067 base = s;
5068 }
5069
5070 while (s <= send) {
5071 switch (*s++) {
5072 default:
5073 skipspaces = 0;
5074 continue;
5075
5076 case '~':
5077 if (*s == '~') {
5078 repeat = TRUE;
b57b1734
DM
5079 skipspaces++;
5080 s++;
a0d0e21e
LW
5081 }
5082 noblank = TRUE;
a0d0e21e
LW
5083 /* FALL THROUGH */
5084 case ' ': case '\t':
5085 skipspaces++;
5086 continue;
a1b95068
WL
5087 case 0:
5088 if (s < send) {
5089 skipspaces = 0;
5090 continue;
5091 } /* else FALL THROUGH */
5092 case '\n':
a0d0e21e
LW
5093 arg = s - base;
5094 skipspaces++;
5095 arg -= skipspaces;
5096 if (arg) {
5f05dabc 5097 if (postspace)
a0d0e21e 5098 *fpc++ = FF_SPACE;
a0d0e21e 5099 *fpc++ = FF_LITERAL;
76912796 5100 *fpc++ = (U32)arg;
a0d0e21e 5101 }
5f05dabc 5102 postspace = FALSE;
a0d0e21e
LW
5103 if (s <= send)
5104 skipspaces--;
5105 if (skipspaces) {
5106 *fpc++ = FF_SKIP;
76912796 5107 *fpc++ = (U32)skipspaces;
a0d0e21e
LW
5108 }
5109 skipspaces = 0;
5110 if (s <= send)
5111 *fpc++ = FF_NEWLINE;
5112 if (noblank) {
5113 *fpc++ = FF_BLANK;
5114 if (repeat)
5115 arg = fpc - linepc + 1;
5116 else
5117 arg = 0;
76912796 5118 *fpc++ = (U32)arg;
a0d0e21e
LW
5119 }
5120 if (s < send) {
5121 linepc = fpc;
5122 *fpc++ = FF_LINEMARK;
5123 noblank = repeat = FALSE;
5124 base = s;
5125 }
5126 else
5127 s++;
5128 continue;
5129
5130 case '@':
5131 case '^':
5132 ischop = s[-1] == '^';
5133
5134 if (postspace) {
5135 *fpc++ = FF_SPACE;
5136 postspace = FALSE;
5137 }
5138 arg = (s - base) - 1;
5139 if (arg) {
5140 *fpc++ = FF_LITERAL;
76912796 5141 *fpc++ = (U32)arg;
a0d0e21e
LW
5142 }
5143
5144 base = s - 1;
5145 *fpc++ = FF_FETCH;
086b26f3 5146 if (*s == '*') { /* @* or ^* */
a0d0e21e 5147 s++;
a1b95068
WL
5148 *fpc++ = 2; /* skip the @* or ^* */
5149 if (ischop) {
5150 *fpc++ = FF_LINESNGL;
5151 *fpc++ = FF_CHOP;
5152 } else
5153 *fpc++ = FF_LINEGLOB;
a0d0e21e 5154 }
086b26f3 5155 else if (*s == '#' || (*s == '.' && s[1] == '#')) { /* @###, ^### */
a701009a 5156 arg = ischop ? FORM_NUM_BLANK : 0;
a0d0e21e
LW
5157 base = s - 1;
5158 while (*s == '#')
5159 s++;
5160 if (*s == '.') {
06b5626a 5161 const char * const f = ++s;
a0d0e21e
LW
5162 while (*s == '#')
5163 s++;
a701009a 5164 arg |= FORM_NUM_POINT + (s - f);
a0d0e21e
LW
5165 }
5166 *fpc++ = s - base; /* fieldsize for FETCH */
5167 *fpc++ = FF_DECIMAL;
76912796 5168 *fpc++ = (U32)arg;
a1b95068 5169 unchopnum |= ! ischop;
784707d5
JP
5170 }
5171 else if (*s == '0' && s[1] == '#') { /* Zero padded decimals */
a701009a 5172 arg = ischop ? FORM_NUM_BLANK : 0;
784707d5
JP
5173 base = s - 1;
5174 s++; /* skip the '0' first */
5175 while (*s == '#')
5176 s++;
5177 if (*s == '.') {
06b5626a 5178 const char * const f = ++s;
784707d5
JP
5179 while (*s == '#')
5180 s++;
a701009a 5181 arg |= FORM_NUM_POINT + (s - f);
784707d5
JP
5182 }
5183 *fpc++ = s - base; /* fieldsize for FETCH */
5184 *fpc++ = FF_0DECIMAL;
76912796 5185 *fpc++ = (U32)arg;
a1b95068 5186 unchopnum |= ! ischop;
a0d0e21e 5187 }
086b26f3 5188 else { /* text field */
a0d0e21e
LW
5189 I32 prespace = 0;
5190 bool ismore = FALSE;
5191
5192 if (*s == '>') {
5193 while (*++s == '>') ;
5194 prespace = FF_SPACE;
5195 }
5196 else if (*s == '|') {
5197 while (*++s == '|') ;
5198 prespace = FF_HALFSPACE;
5199 postspace = TRUE;
5200 }
5201 else {
5202 if (*s == '<')
5203 while (*++s == '<') ;
5204 postspace = TRUE;
5205 }
5206 if (*s == '.' && s[1] == '.' && s[2] == '.') {
5207 s += 3;
5208 ismore = TRUE;
5209 }
5210 *fpc++ = s - base; /* fieldsize for FETCH */
5211
5212 *fpc++ = ischop ? FF_CHECKCHOP : FF_CHECKNL;
5213
5214 if (prespace)
76912796 5215 *fpc++ = (U32)prespace; /* add SPACE or HALFSPACE */
a0d0e21e
LW
5216 *fpc++ = FF_ITEM;
5217 if (ismore)
5218 *fpc++ = FF_MORE;
5219 if (ischop)
5220 *fpc++ = FF_CHOP;
5221 }
5222 base = s;
5223 skipspaces = 0;
5224 continue;
5225 }
5226 }
5227 *fpc++ = FF_END;
5228
815f25c6 5229 assert (fpc <= fops + maxops); /* ensure our buffer estimate was valid */
a0d0e21e 5230 arg = fpc - fops;
74e0ddf7 5231
3808a683 5232 mg->mg_ptr = (char *) fops;
74e0ddf7 5233 mg->mg_len = arg * sizeof(U32);
3808a683
DM
5234 mg->mg_obj = sv_copy;
5235 mg->mg_flags |= MGf_REFCOUNTED;
a1b95068 5236
bfed75c6 5237 if (unchopnum && repeat)
75f63940 5238 Perl_die(aTHX_ "Repeated format line will never terminate (~~ and @#)");
74e0ddf7
NC
5239
5240 return mg;
a1b95068
WL
5241}
5242
5243
5244STATIC bool
5245S_num_overflow(NV value, I32 fldsize, I32 frcsize)
5246{
5247 /* Can value be printed in fldsize chars, using %*.*f ? */
5248 NV pwr = 1;
5249 NV eps = 0.5;
5250 bool res = FALSE;
5251 int intsize = fldsize - (value < 0 ? 1 : 0);
5252
a701009a 5253 if (frcsize & FORM_NUM_POINT)
a1b95068 5254 intsize--;
a701009a 5255 frcsize &= ~(FORM_NUM_POINT|FORM_NUM_BLANK);
a1b95068
WL
5256 intsize -= frcsize;
5257
5258 while (intsize--) pwr *= 10.0;
5259 while (frcsize--) eps /= 10.0;
5260
5261 if( value >= 0 ){
5262 if (value + eps >= pwr)
5263 res = TRUE;
5264 } else {
5265 if (value - eps <= -pwr)
5266 res = TRUE;
5267 }
5268 return res;
a0d0e21e 5269}
4e35701f 5270
bbed91b5 5271static I32
0bd48802 5272S_run_user_filter(pTHX_ int idx, SV *buf_sv, int maxlen)
bbed91b5 5273{
27da23d5 5274 dVAR;
0bd48802 5275 SV * const datasv = FILTER_DATA(idx);
504618e9 5276 const int filter_has_file = IoLINES(datasv);
ad64d0ec
NC
5277 SV * const filter_state = MUTABLE_SV(IoTOP_GV(datasv));
5278 SV * const filter_sub = MUTABLE_SV(IoBOTTOM_GV(datasv));
941a98a0 5279 int status = 0;
ec0b63d7 5280 SV *upstream;
941a98a0 5281 STRLEN got_len;
162177c1
Z
5282 char *got_p = NULL;
5283 char *prune_from = NULL;
34113e50 5284 bool read_from_cache = FALSE;
bb7a0f54 5285 STRLEN umaxlen;
d60d2019 5286 SV *err = NULL;
bb7a0f54 5287
7918f24d
NC
5288 PERL_ARGS_ASSERT_RUN_USER_FILTER;
5289
bb7a0f54
MHM
5290 assert(maxlen >= 0);
5291 umaxlen = maxlen;
5675696b 5292
bbed91b5
KF
5293 /* I was having segfault trouble under Linux 2.2.5 after a
5294 parse error occured. (Had to hack around it with a test
13765c85 5295 for PL_parser->error_count == 0.) Solaris doesn't segfault --
bbed91b5
KF
5296 not sure where the trouble is yet. XXX */
5297
4464f08e
NC
5298 {
5299 SV *const cache = datasv;
937b367d
NC
5300 if (SvOK(cache)) {
5301 STRLEN cache_len;
5302 const char *cache_p = SvPV(cache, cache_len);
941a98a0
NC
5303 STRLEN take = 0;
5304
bb7a0f54 5305 if (umaxlen) {
941a98a0
NC
5306 /* Running in block mode and we have some cached data already.
5307 */
bb7a0f54 5308 if (cache_len >= umaxlen) {
941a98a0
NC
5309 /* In fact, so much data we don't even need to call
5310 filter_read. */
bb7a0f54 5311 take = umaxlen;
941a98a0
NC
5312 }
5313 } else {
10edeb5d
JH
5314 const char *const first_nl =
5315 (const char *)memchr(cache_p, '\n', cache_len);
941a98a0
NC
5316 if (first_nl) {
5317 take = first_nl + 1 - cache_p;
5318 }
5319 }
5320 if (take) {
5321 sv_catpvn(buf_sv, cache_p, take);
5322 sv_chop(cache, cache_p + take);
486ec47a 5323 /* Definitely not EOF */
937b367d
NC
5324 return 1;
5325 }
941a98a0 5326
937b367d 5327 sv_catsv(buf_sv, cache);
bb7a0f54
MHM
5328 if (umaxlen) {
5329 umaxlen -= cache_len;
941a98a0 5330 }
937b367d 5331 SvOK_off(cache);
34113e50 5332 read_from_cache = TRUE;
937b367d
NC
5333 }
5334 }
ec0b63d7 5335
34113e50
NC
5336 /* Filter API says that the filter appends to the contents of the buffer.
5337 Usually the buffer is "", so the details don't matter. But if it's not,
5338 then clearly what it contains is already filtered by this filter, so we
5339 don't want to pass it in a second time.
5340 I'm going to use a mortal in case the upstream filter croaks. */
ec0b63d7
NC
5341 upstream = ((SvOK(buf_sv) && sv_len(buf_sv)) || SvGMAGICAL(buf_sv))
5342 ? sv_newmortal() : buf_sv;
5343 SvUPGRADE(upstream, SVt_PV);
937b367d 5344
bbed91b5 5345 if (filter_has_file) {
67e70b33 5346 status = FILTER_READ(idx+1, upstream, 0);
bbed91b5
KF
5347 }
5348
34113e50 5349 if (filter_sub && status >= 0) {
39644a26 5350 dSP;
bbed91b5
KF
5351 int count;
5352
d343c3ef 5353 ENTER_with_name("call_filter_sub");
55b5114f 5354 SAVE_DEFSV;
bbed91b5
KF
5355 SAVETMPS;
5356 EXTEND(SP, 2);
5357
414bf5ae 5358 DEFSV_set(upstream);
bbed91b5 5359 PUSHMARK(SP);
6e449a3a 5360 mPUSHi(0);
bbed91b5
KF
5361 if (filter_state) {
5362 PUSHs(filter_state);
5363 }
5364 PUTBACK;
d60d2019 5365 count = call_sv(filter_sub, G_SCALAR|G_EVAL);
bbed91b5
KF
5366 SPAGAIN;
5367
5368 if (count > 0) {
5369 SV *out = POPs;
5370 if (SvOK(out)) {
941a98a0 5371 status = SvIV(out);
bbed91b5 5372 }
eed484f9
DD
5373 else {
5374 SV * const errsv = ERRSV;
5375 if (SvTRUE_NN(errsv))
5376 err = newSVsv(errsv);
d60d2019 5377 }
bbed91b5
KF
5378 }
5379
5380 PUTBACK;
5381 FREETMPS;
d343c3ef 5382 LEAVE_with_name("call_filter_sub");
bbed91b5
KF
5383 }
5384
b68108d9 5385 if (SvIsCOW(upstream)) sv_force_normal(upstream);
d60d2019 5386 if(!err && SvOK(upstream)) {
941a98a0 5387 got_p = SvPV(upstream, got_len);
bb7a0f54
MHM
5388 if (umaxlen) {
5389 if (got_len > umaxlen) {
5390 prune_from = got_p + umaxlen;
937b367d 5391 }
941a98a0 5392 } else {
162177c1 5393 char *const first_nl = (char *)memchr(got_p, '\n', got_len);
941a98a0
NC
5394 if (first_nl && first_nl + 1 < got_p + got_len) {
5395 /* There's a second line here... */
5396 prune_from = first_nl + 1;
937b367d 5397 }
937b367d
NC
5398 }
5399 }
d60d2019 5400 if (!err && prune_from) {
941a98a0
NC
5401 /* Oh. Too long. Stuff some in our cache. */
5402 STRLEN cached_len = got_p + got_len - prune_from;
4464f08e 5403 SV *const cache = datasv;
941a98a0 5404
4464f08e 5405 if (SvOK(cache)) {
941a98a0
NC
5406 /* Cache should be empty. */
5407 assert(!SvCUR(cache));
5408 }
5409
5410 sv_setpvn(cache, prune_from, cached_len);
5411 /* If you ask for block mode, you may well split UTF-8 characters.
5412 "If it breaks, you get to keep both parts"
5413 (Your code is broken if you don't put them back together again
5414 before something notices.) */
5415 if (SvUTF8(upstream)) {
5416 SvUTF8_on(cache);
5417 }
5418 SvCUR_set(upstream, got_len - cached_len);
162177c1 5419 *prune_from = 0;
941a98a0
NC
5420 /* Can't yet be EOF */
5421 if (status == 0)
5422 status = 1;
5423 }
937b367d 5424
34113e50
NC
5425 /* If they are at EOF but buf_sv has something in it, then they may never
5426 have touched the SV upstream, so it may be undefined. If we naively
5427 concatenate it then we get a warning about use of uninitialised value.
5428 */
d60d2019
JL
5429 if (!err && upstream != buf_sv &&
5430 (SvOK(upstream) || SvGMAGICAL(upstream))) {
937b367d
NC
5431 sv_catsv(buf_sv, upstream);
5432 }
5433
941a98a0 5434 if (status <= 0) {
bbed91b5 5435 IoLINES(datasv) = 0;
bbed91b5
KF
5436 if (filter_state) {
5437 SvREFCNT_dec(filter_state);
a0714e2c 5438 IoTOP_GV(datasv) = NULL;
bbed91b5
KF
5439 }
5440 if (filter_sub) {
5441 SvREFCNT_dec(filter_sub);
a0714e2c 5442 IoBOTTOM_GV(datasv) = NULL;
bbed91b5 5443 }
0bd48802 5444 filter_del(S_run_user_filter);
bbed91b5 5445 }
d60d2019
JL
5446
5447 if (err)
5448 croak_sv(err);
5449
34113e50
NC
5450 if (status == 0 && read_from_cache) {
5451 /* If we read some data from the cache (and by getting here it implies
5452 that we emptied the cache) then we aren't yet at EOF, and mustn't
5453 report that to our caller. */
5454 return 1;
5455 }
941a98a0 5456 return status;
bbed91b5 5457}
84d4ea48 5458
be4b629d
CN
5459/* perhaps someone can come up with a better name for
5460 this? it is not really "absolute", per se ... */
cf42f822 5461static bool
5f66b61c 5462S_path_is_absolute(const char *name)
be4b629d 5463{
7918f24d
NC
5464 PERL_ARGS_ASSERT_PATH_IS_ABSOLUTE;
5465
be4b629d 5466 if (PERL_FILE_IS_ABSOLUTE(name)
3f66cd94 5467#ifdef WIN32
36f064bc
CL
5468 || (*name == '.' && ((name[1] == '/' ||
5469 (name[1] == '.' && name[2] == '/'))
5470 || (name[1] == '\\' ||
5471 ( name[1] == '.' && name[2] == '\\')))
5472 )
5473#else
be4b629d 5474 || (*name == '.' && (name[1] == '/' ||
0bd48802 5475 (name[1] == '.' && name[2] == '/')))
36f064bc 5476#endif
0bd48802 5477 )
be4b629d
CN
5478 {
5479 return TRUE;
5480 }
5481 else
5482 return FALSE;
5483}
241d1a3b
NC
5484
5485/*
5486 * Local variables:
5487 * c-indentation-style: bsd
5488 * c-basic-offset: 4
14d04a33 5489 * indent-tabs-mode: nil
241d1a3b
NC
5490 * End:
5491 *
14d04a33 5492 * ex: set ts=8 sts=4 sw=4 et:
37442d52 5493 */