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