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