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