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