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