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