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