This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
- Use the same regexp as in change #30395 to parse subroutine
[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,
fdf8c088 4 * 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 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;
e357fc67 180 else if (PM_GETRE(pm)->extflags & RXf_WHITE)
17cbf7cc 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
be2597df 1469 Perl_warn(aTHX_ "%"SVf, SVfARG(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);
be2597df 2031 DIE(aTHX_ "%"SVf" did not return a true value", SVfARG(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);
be2597df 2339 DIE(aTHX_ "Goto undefined subroutine &%"SVf"", SVfARG(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;
b9f83d2f 2661 SV * const tmpstr = newSV_type(SVt_PVMG);
a0d0e21e 2662
a0d0e21e
LW
2663 t = strchr(s, '\n');
2664 if (t)
2665 t++;
2666 else
2667 t = send;
2668
2669 sv_setpvn(tmpstr, s, t - s);
2670 av_store(array, line++, tmpstr);
2671 s = t;
2672 }
2673}
2674
901017d6 2675STATIC void
14dd3ad8
GS
2676S_docatch_body(pTHX)
2677{
97aff369 2678 dVAR;
cea2e8a9 2679 CALLRUNOPS(aTHX);
901017d6 2680 return;
312caa8e
CS
2681}
2682
0824fdcb 2683STATIC OP *
cea2e8a9 2684S_docatch(pTHX_ OP *o)
1e422769 2685{
97aff369 2686 dVAR;
6224f72b 2687 int ret;
06b5626a 2688 OP * const oldop = PL_op;
db36c5a1 2689 dJMPENV;
1e422769 2690
1e422769 2691#ifdef DEBUGGING
54310121 2692 assert(CATCH_GET == TRUE);
1e422769 2693#endif
312caa8e 2694 PL_op = o;
8bffa5f8 2695
14dd3ad8 2696 JMPENV_PUSH(ret);
6224f72b 2697 switch (ret) {
312caa8e 2698 case 0:
abd70938
DM
2699 assert(cxstack_ix >= 0);
2700 assert(CxTYPE(&cxstack[cxstack_ix]) == CXt_EVAL);
2701 cxstack[cxstack_ix].blk_eval.cur_top_env = PL_top_env;
14dd3ad8
GS
2702 redo_body:
2703 docatch_body();
312caa8e
CS
2704 break;
2705 case 3:
8bffa5f8 2706 /* die caught by an inner eval - continue inner loop */
abd70938
DM
2707
2708 /* NB XXX we rely on the old popped CxEVAL still being at the top
2709 * of the stack; the way die_where() currently works, this
2710 * assumption is valid. In theory The cur_top_env value should be
2711 * returned in another global, the way retop (aka PL_restartop)
2712 * is. */
2713 assert(CxTYPE(&cxstack[cxstack_ix+1]) == CXt_EVAL);
2714
2715 if (PL_restartop
2716 && cxstack[cxstack_ix+1].blk_eval.cur_top_env == PL_top_env)
2717 {
312caa8e
CS
2718 PL_op = PL_restartop;
2719 PL_restartop = 0;
2720 goto redo_body;
2721 }
2722 /* FALL THROUGH */
2723 default:
14dd3ad8 2724 JMPENV_POP;
533c011a 2725 PL_op = oldop;
6224f72b 2726 JMPENV_JUMP(ret);
1e422769 2727 /* NOTREACHED */
1e422769 2728 }
14dd3ad8 2729 JMPENV_POP;
533c011a 2730 PL_op = oldop;
5f66b61c 2731 return NULL;
1e422769 2732}
2733
c277df42 2734OP *
bfed75c6 2735Perl_sv_compile_2op(pTHX_ SV *sv, OP** startop, const char *code, PAD** padp)
c277df42
IZ
2736/* sv Text to convert to OP tree. */
2737/* startop op_free() this to undo. */
2738/* code Short string id of the caller. */
2739{
f7997f86 2740 /* FIXME - how much of this code is common with pp_entereval? */
27da23d5 2741 dVAR; dSP; /* Make POPBLOCK work. */
c277df42
IZ
2742 PERL_CONTEXT *cx;
2743 SV **newsp;
b094c71d 2744 I32 gimme = G_VOID;
c277df42
IZ
2745 I32 optype;
2746 OP dummy;
155aba94 2747 OP *rop;
83ee9e09
GS
2748 char tbuf[TYPE_DIGITS(long) + 12 + 10];
2749 char *tmpbuf = tbuf;
c277df42 2750 char *safestr;
a3985cdc 2751 int runtime;
601f1833 2752 CV* runcv = NULL; /* initialise to avoid compiler warnings */
f7997f86 2753 STRLEN len;
c277df42
IZ
2754
2755 ENTER;
2756 lex_start(sv);
2757 SAVETMPS;
2758 /* switch to eval mode */
2759
923e4eb5 2760 if (IN_PERL_COMPILETIME) {
f4dd75d9 2761 SAVECOPSTASH_FREE(&PL_compiling);
11faa288 2762 CopSTASH_set(&PL_compiling, PL_curstash);
cbce877f 2763 }
83ee9e09 2764 if (PERLDB_NAMEEVAL && CopLINE(PL_curcop)) {
9d4ba2ae 2765 SV * const sv = sv_newmortal();
83ee9e09
GS
2766 Perl_sv_setpvf(aTHX_ sv, "_<(%.10seval %lu)[%s:%"IVdf"]",
2767 code, (unsigned long)++PL_evalseq,
2768 CopFILE(PL_curcop), (IV)CopLINE(PL_curcop));
2769 tmpbuf = SvPVX(sv);
fc009855 2770 len = SvCUR(sv);
83ee9e09
GS
2771 }
2772 else
d9fad198
JH
2773 len = my_snprintf(tmpbuf, sizeof(tbuf), "_<(%.10s_eval %lu)", code,
2774 (unsigned long)++PL_evalseq);
f4dd75d9 2775 SAVECOPFILE_FREE(&PL_compiling);
57843af0 2776 CopFILE_set(&PL_compiling, tmpbuf+2);
f4dd75d9 2777 SAVECOPLINE(&PL_compiling);
57843af0 2778 CopLINE_set(&PL_compiling, 1);
c277df42
IZ
2779 /* XXX For C<eval "...">s within BEGIN {} blocks, this ends up
2780 deleting the eval's FILEGV from the stash before gv_check() runs
2781 (i.e. before run-time proper). To work around the coredump that
2782 ensues, we always turn GvMULTI_on for any globals that were
2783 introduced within evals. See force_ident(). GSAR 96-10-12 */
f7997f86
NC
2784 safestr = savepvn(tmpbuf, len);
2785 SAVEDELETE(PL_defstash, safestr, len);
b3ac6de7 2786 SAVEHINTS();
d1ca3daa 2787#ifdef OP_IN_REGISTER
6b88bc9c 2788 PL_opsave = op;
d1ca3daa 2789#else
7766f137 2790 SAVEVPTR(PL_op);
d1ca3daa 2791#endif
c277df42 2792
a3985cdc 2793 /* we get here either during compilation, or via pp_regcomp at runtime */
923e4eb5 2794 runtime = IN_PERL_RUNTIME;
a3985cdc 2795 if (runtime)
d819b83a 2796 runcv = find_runcv(NULL);
a3985cdc 2797
533c011a 2798 PL_op = &dummy;
13b51b79 2799 PL_op->op_type = OP_ENTEREVAL;
533c011a 2800 PL_op->op_flags = 0; /* Avoid uninit warning. */
923e4eb5 2801 PUSHBLOCK(cx, CXt_EVAL|(IN_PERL_COMPILETIME ? 0 : CXp_REAL), SP);
a0714e2c 2802 PUSHEVAL(cx, 0, NULL);
a3985cdc
DM
2803
2804 if (runtime)
2805 rop = doeval(G_SCALAR, startop, runcv, PL_curcop->cop_seq);
2806 else
2807 rop = doeval(G_SCALAR, startop, PL_compcv, PL_cop_seqmax);
13b51b79 2808 POPBLOCK(cx,PL_curpm);
e84b9f1f 2809 POPEVAL(cx);
c277df42
IZ
2810
2811 (*startop)->op_type = OP_NULL;
22c35a8c 2812 (*startop)->op_ppaddr = PL_ppaddr[OP_NULL];
c277df42 2813 lex_end();
f3548bdc 2814 /* XXX DAPM do this properly one year */
b37c2d43 2815 *padp = (AV*)SvREFCNT_inc_simple(PL_comppad);
c277df42 2816 LEAVE;
923e4eb5 2817 if (IN_PERL_COMPILETIME)
623e6609 2818 CopHINTS_set(&PL_compiling, PL_hints);
d1ca3daa 2819#ifdef OP_IN_REGISTER
6b88bc9c 2820 op = PL_opsave;
d1ca3daa 2821#endif
9d4ba2ae
AL
2822 PERL_UNUSED_VAR(newsp);
2823 PERL_UNUSED_VAR(optype);
2824
c277df42
IZ
2825 return rop;
2826}
2827
a3985cdc
DM
2828
2829/*
2830=for apidoc find_runcv
2831
2832Locate the CV corresponding to the currently executing sub or eval.
d819b83a
DM
2833If db_seqp is non_null, skip CVs that are in the DB package and populate
2834*db_seqp with the cop sequence number at the point that the DB:: code was
2835entered. (allows debuggers to eval in the scope of the breakpoint rather
cf525c36 2836than in the scope of the debugger itself).
a3985cdc
DM
2837
2838=cut
2839*/
2840
2841CV*
d819b83a 2842Perl_find_runcv(pTHX_ U32 *db_seqp)
a3985cdc 2843{
97aff369 2844 dVAR;
a3985cdc 2845 PERL_SI *si;
a3985cdc 2846
d819b83a
DM
2847 if (db_seqp)
2848 *db_seqp = PL_curcop->cop_seq;
a3985cdc 2849 for (si = PL_curstackinfo; si; si = si->si_prev) {
06b5626a 2850 I32 ix;
a3985cdc 2851 for (ix = si->si_cxix; ix >= 0; ix--) {
06b5626a 2852 const PERL_CONTEXT *cx = &(si->si_cxstack[ix]);
d819b83a 2853 if (CxTYPE(cx) == CXt_SUB || CxTYPE(cx) == CXt_FORMAT) {
1b6737cc 2854 CV * const cv = cx->blk_sub.cv;
d819b83a
DM
2855 /* skip DB:: code */
2856 if (db_seqp && PL_debstash && CvSTASH(cv) == PL_debstash) {
2857 *db_seqp = cx->blk_oldcop->cop_seq;
2858 continue;
2859 }
2860 return cv;
2861 }
a3985cdc
DM
2862 else if (CxTYPE(cx) == CXt_EVAL && !CxTRYBLOCK(cx))
2863 return PL_compcv;
2864 }
2865 }
2866 return PL_main_cv;
2867}
2868
2869
2870/* Compile a require/do, an eval '', or a /(?{...})/.
2871 * In the last case, startop is non-null, and contains the address of
2872 * a pointer that should be set to the just-compiled code.
2873 * outside is the lexically enclosing CV (if any) that invoked us.
2874 */
2875
0824fdcb 2876STATIC OP *
a3985cdc 2877S_doeval(pTHX_ int gimme, OP** startop, CV* outside, U32 seq)
a0d0e21e 2878{
27da23d5 2879 dVAR; dSP;
46c461b5 2880 OP * const saveop = PL_op;
a0d0e21e 2881
6dc8a9e4
IZ
2882 PL_in_eval = ((saveop && saveop->op_type == OP_REQUIRE)
2883 ? (EVAL_INREQUIRE | (PL_in_eval & EVAL_INEVAL))
2884 : EVAL_INEVAL);
a0d0e21e 2885
1ce6579f 2886 PUSHMARK(SP);
2887
3280af22 2888 SAVESPTR(PL_compcv);
b9f83d2f 2889 PL_compcv = (CV*)newSV_type(SVt_PVCV);
1aff0e91 2890 CvEVAL_on(PL_compcv);
2090ab20
JH
2891 assert(CxTYPE(&cxstack[cxstack_ix]) == CXt_EVAL);
2892 cxstack[cxstack_ix].blk_eval.cv = PL_compcv;
2893
a3985cdc 2894 CvOUTSIDE_SEQ(PL_compcv) = seq;
b37c2d43 2895 CvOUTSIDE(PL_compcv) = (CV*)SvREFCNT_inc_simple(outside);
a3985cdc 2896
dd2155a4 2897 /* set up a scratch pad */
a0d0e21e 2898
dd2155a4 2899 CvPADLIST(PL_compcv) = pad_new(padnew_SAVE);
cecbe010 2900 PL_op = NULL; /* avoid PL_op and PL_curpad referring to different CVs */
2c05e328 2901
07055b4c 2902
81d86705
NC
2903 if (!PL_madskills)
2904 SAVEMORTALIZESV(PL_compcv); /* must remain until end of current statement */
748a9306 2905
a0d0e21e
LW
2906 /* make sure we compile in the right package */
2907
ed094faf 2908 if (CopSTASH_ne(PL_curcop, PL_curstash)) {
3280af22 2909 SAVESPTR(PL_curstash);
ed094faf 2910 PL_curstash = CopSTASH(PL_curcop);
a0d0e21e 2911 }
3c10abe3 2912 /* XXX:ajgo do we really need to alloc an AV for begin/checkunit */
3280af22
NIS
2913 SAVESPTR(PL_beginav);
2914 PL_beginav = newAV();
2915 SAVEFREESV(PL_beginav);
3c10abe3
AG
2916 SAVESPTR(PL_unitcheckav);
2917 PL_unitcheckav = newAV();
2918 SAVEFREESV(PL_unitcheckav);
24944567 2919 SAVEI32(PL_error_count);
a0d0e21e 2920
81d86705
NC
2921#ifdef PERL_MAD
2922 SAVEI32(PL_madskills);
2923 PL_madskills = 0;
2924#endif
2925
a0d0e21e
LW
2926 /* try to compile it */
2927
5f66b61c 2928 PL_eval_root = NULL;
3280af22
NIS
2929 PL_error_count = 0;
2930 PL_curcop = &PL_compiling;
fc15ae8f 2931 CopARYBASE_set(PL_curcop, 0);
5f66b61c 2932 if (saveop && (saveop->op_type != OP_REQUIRE) && (saveop->op_flags & OPf_SPECIAL))
faef0170 2933 PL_in_eval |= EVAL_KEEPERR;
1ce6579f 2934 else
c69006e4 2935 sv_setpvn(ERRSV,"",0);
3280af22 2936 if (yyparse() || PL_error_count || !PL_eval_root) {
0c58d367 2937 SV **newsp; /* Used by POPBLOCK. */
9d4ba2ae 2938 PERL_CONTEXT *cx = &cxstack[cxstack_ix];
c277df42 2939 I32 optype = 0; /* Might be reset by POPEVAL. */
9d4ba2ae 2940 const char *msg;
bfed75c6 2941
533c011a 2942 PL_op = saveop;
3280af22
NIS
2943 if (PL_eval_root) {
2944 op_free(PL_eval_root);
5f66b61c 2945 PL_eval_root = NULL;
a0d0e21e 2946 }
3280af22 2947 SP = PL_stack_base + POPMARK; /* pop original mark */
c277df42 2948 if (!startop) {
3280af22 2949 POPBLOCK(cx,PL_curpm);
c277df42 2950 POPEVAL(cx);
c277df42 2951 }
a0d0e21e
LW
2952 lex_end();
2953 LEAVE;
9d4ba2ae
AL
2954
2955 msg = SvPVx_nolen_const(ERRSV);
7a2e2cd6 2956 if (optype == OP_REQUIRE) {
b464bac0 2957 const SV * const nsv = cx->blk_eval.old_namesv;
504618e9 2958 (void)hv_store(GvHVn(PL_incgv), SvPVX_const(nsv), SvCUR(nsv),
27bcc0a7 2959 &PL_sv_undef, 0);
5a844595
GS
2960 DIE(aTHX_ "%sCompilation failed in require",
2961 *msg ? msg : "Unknown error\n");
2962 }
2963 else if (startop) {
3280af22 2964 POPBLOCK(cx,PL_curpm);
c277df42 2965 POPEVAL(cx);
5a844595
GS
2966 Perl_croak(aTHX_ "%sCompilation failed in regexp",
2967 (*msg ? msg : "Unknown error\n"));
7a2e2cd6 2968 }
9d7f88dd 2969 else {
9d7f88dd 2970 if (!*msg) {
6502358f 2971 sv_setpvs(ERRSV, "Compilation error");
9d7f88dd
SR
2972 }
2973 }
9d4ba2ae 2974 PERL_UNUSED_VAR(newsp);
a0d0e21e
LW
2975 RETPUSHUNDEF;
2976 }
57843af0 2977 CopLINE_set(&PL_compiling, 0);
c277df42 2978 if (startop) {
3280af22 2979 *startop = PL_eval_root;
c277df42 2980 } else
3280af22 2981 SAVEFREEOP(PL_eval_root);
0c58d367
RGS
2982
2983 /* Set the context for this new optree.
2984 * If the last op is an OP_REQUIRE, force scalar context.
2985 * Otherwise, propagate the context from the eval(). */
2986 if (PL_eval_root->op_type == OP_LEAVEEVAL
2987 && cUNOPx(PL_eval_root)->op_first->op_type == OP_LINESEQ
2988 && cLISTOPx(cUNOPx(PL_eval_root)->op_first)->op_last->op_type
2989 == OP_REQUIRE)
2990 scalar(PL_eval_root);
2991 else if (gimme & G_VOID)
3280af22 2992 scalarvoid(PL_eval_root);
54310121 2993 else if (gimme & G_ARRAY)
3280af22 2994 list(PL_eval_root);
a0d0e21e 2995 else
3280af22 2996 scalar(PL_eval_root);
a0d0e21e
LW
2997
2998 DEBUG_x(dump_eval());
2999
55497cff 3000 /* Register with debugger: */
6482a30d 3001 if (PERLDB_INTER && saveop && saveop->op_type == OP_REQUIRE) {
890ce7af 3002 CV * const cv = get_cv("DB::postponed", FALSE);
55497cff 3003 if (cv) {
3004 dSP;
924508f0 3005 PUSHMARK(SP);
cc49e20b 3006 XPUSHs((SV*)CopFILEGV(&PL_compiling));
55497cff 3007 PUTBACK;
864dbfa3 3008 call_sv((SV*)cv, G_DISCARD);
55497cff 3009 }
3010 }
3011
3c10abe3
AG
3012 if (PL_unitcheckav)
3013 call_list(PL_scopestack_ix, PL_unitcheckav);
3014
a0d0e21e
LW
3015 /* compiled okay, so do it */
3016
3280af22
NIS
3017 CvDEPTH(PL_compcv) = 1;
3018 SP = PL_stack_base + POPMARK; /* pop original mark */
533c011a 3019 PL_op = saveop; /* The caller may need it. */
6dc8a9e4 3020 PL_lex_state = LEX_NOTPARSING; /* $^S needs this. */
5dc0d613 3021
3280af22 3022 RETURNOP(PL_eval_start);
a0d0e21e
LW
3023}
3024
a6c40364 3025STATIC PerlIO *
74d5ed12 3026S_check_type_and_open(pTHX_ const char *name, const char *mode)
ce8abf5f
SP
3027{
3028 Stat_t st;
c445ea15 3029 const int st_rc = PerlLIO_stat(name, &st);
df528165 3030
6b845e56 3031 if (st_rc < 0 || S_ISDIR(st.st_mode) || S_ISBLK(st.st_mode)) {
4608196e 3032 return NULL;
ce8abf5f
SP
3033 }
3034
ce8abf5f
SP
3035 return PerlIO_open(name, mode);
3036}
3037
3038STATIC PerlIO *
7925835c 3039S_doopen_pm(pTHX_ const char *name, const char *mode)
b295d113 3040{
7925835c 3041#ifndef PERL_DISABLE_PMC
f54cb97a 3042 const STRLEN namelen = strlen(name);
b295d113
TH
3043 PerlIO *fp;
3044
7894fbab 3045 if (namelen > 3 && strEQ(name + namelen - 3, ".pm")) {
9d4ba2ae 3046 SV * const pmcsv = Perl_newSVpvf(aTHX_ "%s%c", name, 'c');
349d4f2f 3047 const char * const pmc = SvPV_nolen_const(pmcsv);
a6c40364
GS
3048 Stat_t pmcstat;
3049 if (PerlLIO_stat(pmc, &pmcstat) < 0) {
85e8f315 3050 fp = check_type_and_open(name, mode);
a6c40364
GS
3051 }
3052 else {
a91233bf 3053 fp = check_type_and_open(pmc, mode);
b295d113 3054 }
a6c40364
GS
3055 SvREFCNT_dec(pmcsv);
3056 }
3057 else {
85e8f315 3058 fp = check_type_and_open(name, mode);
b295d113 3059 }
b295d113 3060 return fp;
7925835c 3061#else
85e8f315 3062 return check_type_and_open(name, mode);
7925835c 3063#endif /* !PERL_DISABLE_PMC */
b295d113
TH
3064}
3065
a0d0e21e
LW
3066PP(pp_require)
3067{
27da23d5 3068 dVAR; dSP;
c09156bb 3069 register PERL_CONTEXT *cx;
a0d0e21e 3070 SV *sv;
5c144d81 3071 const char *name;
6132ea6c 3072 STRLEN len;
c445ea15
AL
3073 const char *tryname = NULL;
3074 SV *namesv = NULL;
f54cb97a 3075 const I32 gimme = GIMME_V;
bbed91b5 3076 int filter_has_file = 0;
c445ea15 3077 PerlIO *tryrsfp = NULL;
34113e50 3078 SV *filter_cache = NULL;
c445ea15
AL
3079 SV *filter_state = NULL;
3080 SV *filter_sub = NULL;
3081 SV *hook_sv = NULL;
6ec9efec
JH
3082 SV *encoding;
3083 OP *op;
a0d0e21e
LW
3084
3085 sv = POPs;
d7aa5382
JP
3086 if ( (SvNIOKp(sv) || SvVOK(sv)) && PL_op->op_type != OP_DOFILE) {
3087 if ( SvVOK(sv) && ckWARN(WARN_PORTABLE) ) /* require v5.6.1 */
9014280d 3088 Perl_warner(aTHX_ packWARN(WARN_PORTABLE),
e3407aba 3089 "v-string in use/require non-portable");
d7aa5382
JP
3090
3091 sv = new_version(sv);
3092 if (!sv_derived_from(PL_patchlevel, "version"))
2593c6c6 3093 upg_version(PL_patchlevel);
149c1637 3094 if (cUNOP->op_first->op_type == OP_CONST && cUNOP->op_first->op_private & OPpCONST_NOVER) {
3cacfbb9 3095 if ( vcmp(sv,PL_patchlevel) <= 0 )
468aa647 3096 DIE(aTHX_ "Perls since %"SVf" too modern--this is %"SVf", stopped",
be2597df 3097 SVfARG(vnormal(sv)), SVfARG(vnormal(PL_patchlevel)));
468aa647
RGS
3098 }
3099 else {
3100 if ( vcmp(sv,PL_patchlevel) > 0 )
3101 DIE(aTHX_ "Perl %"SVf" required--this is only %"SVf", stopped",
be2597df 3102 SVfARG(vnormal(sv)), SVfARG(vnormal(PL_patchlevel)));
468aa647 3103 }
d7aa5382 3104
4305d8ab 3105 RETPUSHYES;
a0d0e21e 3106 }
5c144d81 3107 name = SvPV_const(sv, len);
6132ea6c 3108 if (!(name && len > 0 && *name))
cea2e8a9 3109 DIE(aTHX_ "Null filename used");
4633a7c4 3110 TAINT_PROPER("require");
44f8325f 3111 if (PL_op->op_type == OP_REQUIRE) {
0bd48802 3112 SV * const * const svp = hv_fetch(GvHVn(PL_incgv), name, len, 0);
44f8325f
AL
3113 if ( svp ) {
3114 if (*svp != &PL_sv_undef)
3115 RETPUSHYES;
3116 else
3117 DIE(aTHX_ "Compilation failed in require");
3118 }
4d8b06f1 3119 }
a0d0e21e
LW
3120
3121 /* prepare to compile file */
3122
be4b629d 3123 if (path_is_absolute(name)) {
46fc3d4c 3124 tryname = name;
7925835c 3125 tryrsfp = doopen_pm(name,PERL_SCRIPT_MODE);
bf4acbe4 3126 }
67627c52
JH
3127#ifdef MACOS_TRADITIONAL
3128 if (!tryrsfp) {
3129 char newname[256];
3130
3131 MacPerl_CanonDir(name, newname, 1);
3132 if (path_is_absolute(newname)) {
3133 tryname = newname;
7925835c 3134 tryrsfp = doopen_pm(newname,PERL_SCRIPT_MODE);
67627c52
JH
3135 }
3136 }
3137#endif
be4b629d 3138 if (!tryrsfp) {
44f8325f 3139 AV * const ar = GvAVn(PL_incgv);
a0d0e21e 3140 I32 i;
748a9306 3141#ifdef VMS
46fc3d4c 3142 char *unixname;
c445ea15 3143 if ((unixname = tounixspec(name, NULL)) != NULL)
46fc3d4c 3144#endif
3145 {
561b68a9 3146 namesv = newSV(0);
46fc3d4c 3147 for (i = 0; i <= AvFILL(ar); i++) {
df528165 3148 SV * const dirsv = *av_fetch(ar, i, TRUE);
bbed91b5 3149
c38a6530
RD
3150 if (SvTIED_mg((SV*)ar, PERL_MAGIC_tied))
3151 mg_get(dirsv);
bbed91b5
KF
3152 if (SvROK(dirsv)) {
3153 int count;
a3b58a99 3154 SV **svp;
bbed91b5
KF
3155 SV *loader = dirsv;
3156
e14e2dc8
NC
3157 if (SvTYPE(SvRV(loader)) == SVt_PVAV
3158 && !sv_isobject(loader))
3159 {
bbed91b5
KF
3160 loader = *av_fetch((AV *)SvRV(loader), 0, TRUE);
3161 }
3162
b900a521 3163 Perl_sv_setpvf(aTHX_ namesv, "/loader/0x%"UVxf"/%s",
44f0be63 3164 PTR2UV(SvRV(dirsv)), name);
349d4f2f 3165 tryname = SvPVX_const(namesv);
c445ea15 3166 tryrsfp = NULL;
bbed91b5
KF
3167
3168 ENTER;
3169 SAVETMPS;
3170 EXTEND(SP, 2);
3171
3172 PUSHMARK(SP);
3173 PUSHs(dirsv);
3174 PUSHs(sv);
3175 PUTBACK;
e982885c
NC
3176 if (sv_isobject(loader))
3177 count = call_method("INC", G_ARRAY);
3178 else
3179 count = call_sv(loader, G_ARRAY);
bbed91b5
KF
3180 SPAGAIN;
3181
a3b58a99
RGS
3182 /* Adjust file name if the hook has set an %INC entry */
3183 svp = hv_fetch(GvHVn(PL_incgv), name, len, 0);
3184 if (svp)
3185 tryname = SvPVX_const(*svp);
3186
bbed91b5
KF
3187 if (count > 0) {
3188 int i = 0;
3189 SV *arg;
3190
3191 SP -= count - 1;
3192 arg = SP[i++];
3193
34113e50
NC
3194 if (SvROK(arg) && (SvTYPE(SvRV(arg)) <= SVt_PVLV)
3195 && !isGV_with_GP(SvRV(arg))) {
3196 filter_cache = SvRV(arg);
74c765eb 3197 SvREFCNT_inc_simple_void_NN(filter_cache);
34113e50
NC
3198
3199 if (i < count) {
3200 arg = SP[i++];
3201 }
3202 }
3203
bbed91b5
KF
3204 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVGV) {
3205 arg = SvRV(arg);
3206 }
3207
3208 if (SvTYPE(arg) == SVt_PVGV) {
df528165 3209 IO * const io = GvIO((GV *)arg);
bbed91b5
KF
3210
3211 ++filter_has_file;
3212
3213 if (io) {
3214 tryrsfp = IoIFP(io);
0f7de14d
NC
3215 if (IoOFP(io) && IoOFP(io) != IoIFP(io)) {
3216 PerlIO_close(IoOFP(io));
bbed91b5 3217 }
0f7de14d
NC
3218 IoIFP(io) = NULL;
3219 IoOFP(io) = NULL;
bbed91b5
KF
3220 }
3221
3222 if (i < count) {
3223 arg = SP[i++];
3224 }
3225 }
3226
3227 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVCV) {
3228 filter_sub = arg;
74c765eb 3229 SvREFCNT_inc_simple_void_NN(filter_sub);
bbed91b5
KF
3230
3231 if (i < count) {
3232 filter_state = SP[i];
b37c2d43 3233 SvREFCNT_inc_simple_void(filter_state);
bbed91b5 3234 }
34113e50 3235 }
bbed91b5 3236
34113e50
NC
3237 if (!tryrsfp && (filter_cache || filter_sub)) {
3238 tryrsfp = PerlIO_open(BIT_BUCKET,
3239 PERL_SCRIPT_MODE);
bbed91b5 3240 }
1d06aecd 3241 SP--;
bbed91b5
KF
3242 }
3243
3244 PUTBACK;
3245 FREETMPS;
3246 LEAVE;
3247
3248 if (tryrsfp) {
89ccab8c 3249 hook_sv = dirsv;
bbed91b5
KF
3250 break;
3251 }
3252
3253 filter_has_file = 0;
34113e50
NC
3254 if (filter_cache) {
3255 SvREFCNT_dec(filter_cache);
3256 filter_cache = NULL;
3257 }
bbed91b5
KF
3258 if (filter_state) {
3259 SvREFCNT_dec(filter_state);
c445ea15 3260 filter_state = NULL;
bbed91b5
KF
3261 }
3262 if (filter_sub) {
3263 SvREFCNT_dec(filter_sub);
c445ea15 3264 filter_sub = NULL;
bbed91b5
KF
3265 }
3266 }
3267 else {
be4b629d
CN
3268 if (!path_is_absolute(name)
3269#ifdef MACOS_TRADITIONAL
3270 /* We consider paths of the form :a:b ambiguous and interpret them first
3271 as global then as local
3272 */
3273 || (*name == ':' && name[1] != ':' && strchr(name+2, ':'))
3274#endif
3275 ) {
0510663f 3276 const char *dir = SvPVx_nolen_const(dirsv);
bf4acbe4 3277#ifdef MACOS_TRADITIONAL
67627c52
JH
3278 char buf1[256];
3279 char buf2[256];
3280
3281 MacPerl_CanonDir(name, buf2, 1);
3282 Perl_sv_setpvf(aTHX_ namesv, "%s%s", MacPerl_CanonDir(dir, buf1, 0), buf2+(buf2[0] == ':'));
bf4acbe4 3283#else
27da23d5 3284# ifdef VMS
bbed91b5 3285 char *unixdir;
c445ea15 3286 if ((unixdir = tounixpath(dir, NULL)) == NULL)
bbed91b5
KF
3287 continue;
3288 sv_setpv(namesv, unixdir);
3289 sv_catpv(namesv, unixname);
27da23d5 3290# else
a0fd4948 3291# ifdef __SYMBIAN32__
27da23d5
JH
3292 if (PL_origfilename[0] &&
3293 PL_origfilename[1] == ':' &&
3294 !(dir[0] && dir[1] == ':'))
3295 Perl_sv_setpvf(aTHX_ namesv,
3296 "%c:%s\\%s",
3297 PL_origfilename[0],
3298 dir, name);
3299 else
3300 Perl_sv_setpvf(aTHX_ namesv,
3301 "%s\\%s",
3302 dir, name);
3303# else
bbed91b5 3304 Perl_sv_setpvf(aTHX_ namesv, "%s/%s", dir, name);
27da23d5
JH
3305# endif
3306# endif
bf4acbe4 3307#endif
bbed91b5 3308 TAINT_PROPER("require");
349d4f2f 3309 tryname = SvPVX_const(namesv);
7925835c 3310 tryrsfp = doopen_pm(tryname, PERL_SCRIPT_MODE);
bbed91b5
KF
3311 if (tryrsfp) {
3312 if (tryname[0] == '.' && tryname[1] == '/')
3313 tryname += 2;
3314 break;
3315 }
ff806af2
DM
3316 else if (errno == EMFILE)
3317 /* no point in trying other paths if out of handles */
3318 break;
be4b629d 3319 }
46fc3d4c 3320 }
a0d0e21e
LW
3321 }
3322 }
3323 }
f4dd75d9 3324 SAVECOPFILE_FREE(&PL_compiling);
57843af0 3325 CopFILE_set(&PL_compiling, tryrsfp ? tryname : name);
46fc3d4c 3326 SvREFCNT_dec(namesv);
a0d0e21e 3327 if (!tryrsfp) {
533c011a 3328 if (PL_op->op_type == OP_REQUIRE) {
5c144d81 3329 const char *msgstr = name;
e31de809 3330 if(errno == EMFILE) {
b9b739dc
NC
3331 SV * const msg
3332 = sv_2mortal(Perl_newSVpvf(aTHX_ "%s: %s", msgstr,
3333 Strerror(errno)));
349d4f2f 3334 msgstr = SvPV_nolen_const(msg);
e31de809
SP
3335 } else {
3336 if (namesv) { /* did we lookup @INC? */
44f8325f 3337 AV * const ar = GvAVn(PL_incgv);
e31de809 3338 I32 i;
b8f04b1b
NC
3339 SV * const msg = sv_2mortal(Perl_newSVpvf(aTHX_
3340 "%s in @INC%s%s (@INC contains:",
3341 msgstr,
3342 (instr(msgstr, ".h ")
3343 ? " (change .h to .ph maybe?)" : ""),
3344 (instr(msgstr, ".ph ")
3345 ? " (did you run h2ph?)" : "")
3346 ));
3347
e31de809 3348 for (i = 0; i <= AvFILL(ar); i++) {
396482e1 3349 sv_catpvs(msg, " ");
b8f04b1b 3350 sv_catsv(msg, *av_fetch(ar, i, TRUE));
e31de809 3351 }
396482e1 3352 sv_catpvs(msg, ")");
e31de809
SP
3353 msgstr = SvPV_nolen_const(msg);
3354 }
2683423c 3355 }
ea071790 3356 DIE(aTHX_ "Can't locate %s", msgstr);
a0d0e21e
LW
3357 }
3358
3359 RETPUSHUNDEF;
3360 }
d8bfb8bd 3361 else
93189314 3362 SETERRNO(0, SS_NORMAL);
a0d0e21e
LW
3363
3364 /* Assume success here to prevent recursive requirement. */
238d24b4 3365 /* name is never assigned to again, so len is still strlen(name) */
d3a4e64e 3366 /* Check whether a hook in @INC has already filled %INC */
44f8325f
AL
3367 if (!hook_sv) {
3368 (void)hv_store(GvHVn(PL_incgv), name, len, newSVpv(CopFILE(&PL_compiling),0),0);
3369 } else {
3370 SV** const svp = hv_fetch(GvHVn(PL_incgv), name, len, 0);
3371 if (!svp)
b37c2d43 3372 (void)hv_store(GvHVn(PL_incgv), name, len, SvREFCNT_inc_simple(hook_sv), 0 );
d3a4e64e 3373 }
a0d0e21e
LW
3374
3375 ENTER;
3376 SAVETMPS;
10efb74f 3377 lex_start(NULL);
b9d12d37 3378 SAVEGENERICSV(PL_rsfp_filters);
7d49f689 3379 PL_rsfp_filters = NULL;
e50aee73 3380
3280af22 3381 PL_rsfp = tryrsfp;
b3ac6de7 3382 SAVEHINTS();
3280af22 3383 PL_hints = 0;
68da3b2f 3384 SAVECOMPILEWARNINGS();
0453d815 3385 if (PL_dowarn & G_WARN_ALL_ON)
d3a7d8c7 3386 PL_compiling.cop_warnings = pWARN_ALL ;
0453d815 3387 else if (PL_dowarn & G_WARN_ALL_OFF)
d3a7d8c7 3388 PL_compiling.cop_warnings = pWARN_NONE ;
ac27b0f5 3389 else
d3a7d8c7 3390 PL_compiling.cop_warnings = pWARN_STD ;
a0d0e21e 3391
34113e50 3392 if (filter_sub || filter_cache) {
c445ea15 3393 SV * const datasv = filter_add(S_run_user_filter, NULL);
bbed91b5 3394 IoLINES(datasv) = filter_has_file;
bbed91b5
KF
3395 IoTOP_GV(datasv) = (GV *)filter_state;
3396 IoBOTTOM_GV(datasv) = (GV *)filter_sub;
34113e50 3397 IoFMT_GV(datasv) = (GV *)filter_cache;
bbed91b5
KF
3398 }
3399
3400 /* switch to eval mode */
a0d0e21e 3401 PUSHBLOCK(cx, CXt_EVAL, SP);
a0714e2c 3402 PUSHEVAL(cx, name, NULL);
f39bc417 3403 cx->blk_eval.retop = PL_op->op_next;
a0d0e21e 3404
57843af0
GS
3405 SAVECOPLINE(&PL_compiling);
3406 CopLINE_set(&PL_compiling, 0);
a0d0e21e
LW
3407
3408 PUTBACK;
6ec9efec
JH
3409
3410 /* Store and reset encoding. */
3411 encoding = PL_encoding;
c445ea15 3412 PL_encoding = NULL;
6ec9efec 3413
601f1833 3414 op = DOCATCH(doeval(gimme, NULL, NULL, PL_curcop->cop_seq));
bfed75c6 3415
6ec9efec
JH
3416 /* Restore encoding. */
3417 PL_encoding = encoding;
3418
3419 return op;
a0d0e21e
LW
3420}
3421
a0d0e21e
LW
3422PP(pp_entereval)
3423{
27da23d5 3424 dVAR; dSP;
c09156bb 3425 register PERL_CONTEXT *cx;
0d863452 3426 SV *sv;
890ce7af
AL
3427 const I32 gimme = GIMME_V;
3428 const I32 was = PL_sub_generation;
83ee9e09
GS
3429 char tbuf[TYPE_DIGITS(long) + 12];
3430 char *tmpbuf = tbuf;
fc36a67e 3431 char *safestr;
a0d0e21e 3432 STRLEN len;
55497cff 3433 OP *ret;
a3985cdc 3434 CV* runcv;
d819b83a 3435 U32 seq;
c445ea15 3436 HV *saved_hh = NULL;
e80fed9d 3437 const char * const fakestr = "_<(eval )";
e80fed9d 3438 const int fakelen = 9 + 1;
0d863452
RH
3439
3440 if (PL_op->op_private & OPpEVAL_HAS_HH) {
3441 saved_hh = (HV*) SvREFCNT_inc(POPs);
3442 }
3443 sv = POPs;
a0d0e21e 3444
af2d3def 3445 TAINT_IF(SvTAINTED(sv));
748a9306 3446 TAINT_PROPER("eval");
a0d0e21e
LW
3447
3448 ENTER;
a0d0e21e 3449 lex_start(sv);
748a9306 3450 SAVETMPS;
ac27b0f5 3451
a0d0e21e
LW
3452 /* switch to eval mode */
3453
83ee9e09 3454 if (PERLDB_NAMEEVAL && CopLINE(PL_curcop)) {
8b38226b
AL
3455 SV * const temp_sv = sv_newmortal();
3456 Perl_sv_setpvf(aTHX_ temp_sv, "_<(eval %lu)[%s:%"IVdf"]",
83ee9e09
GS
3457 (unsigned long)++PL_evalseq,
3458 CopFILE(PL_curcop), (IV)CopLINE(PL_curcop));
8b38226b
AL
3459 tmpbuf = SvPVX(temp_sv);
3460 len = SvCUR(temp_sv);
83ee9e09
GS
3461 }
3462 else
d9fad198 3463 len = my_snprintf(tmpbuf, sizeof(tbuf), "_<(eval %lu)", (unsigned long)++PL_evalseq);
f4dd75d9 3464 SAVECOPFILE_FREE(&PL_compiling);
57843af0 3465 CopFILE_set(&PL_compiling, tmpbuf+2);
f4dd75d9 3466 SAVECOPLINE(&PL_compiling);
57843af0 3467 CopLINE_set(&PL_compiling, 1);
55497cff 3468 /* XXX For C<eval "...">s within BEGIN {} blocks, this ends up
3469 deleting the eval's FILEGV from the stash before gv_check() runs
3470 (i.e. before run-time proper). To work around the coredump that
3471 ensues, we always turn GvMULTI_on for any globals that were
3472 introduced within evals. See force_ident(). GSAR 96-10-12 */
f7997f86
NC
3473 safestr = savepvn(tmpbuf, len);
3474 SAVEDELETE(PL_defstash, safestr, len);
b3ac6de7 3475 SAVEHINTS();
533c011a 3476 PL_hints = PL_op->op_targ;
0d863452
RH
3477 if (saved_hh)
3478 GvHV(PL_hintgv) = saved_hh;
68da3b2f 3479 SAVECOMPILEWARNINGS();
72dc9ed5 3480 PL_compiling.cop_warnings = DUP_WARNINGS(PL_curcop->cop_warnings);
c28fe1ec
NC
3481 if (PL_compiling.cop_hints_hash) {
3482 Perl_refcounted_he_free(aTHX_ PL_compiling.cop_hints_hash);
a24d89c9 3483 }
c28fe1ec
NC
3484 PL_compiling.cop_hints_hash = PL_curcop->cop_hints_hash;
3485 if (PL_compiling.cop_hints_hash) {
cbb1fbea 3486 HINTS_REFCNT_LOCK;
c28fe1ec 3487 PL_compiling.cop_hints_hash->refcounted_he_refcnt++;
cbb1fbea 3488 HINTS_REFCNT_UNLOCK;
a24d89c9 3489 }
d819b83a
DM
3490 /* special case: an eval '' executed within the DB package gets lexically
3491 * placed in the first non-DB CV rather than the current CV - this
3492 * allows the debugger to execute code, find lexicals etc, in the
3493 * scope of the code being debugged. Passing &seq gets find_runcv
3494 * to do the dirty work for us */
3495 runcv = find_runcv(&seq);
a0d0e21e 3496
6b35e009 3497 PUSHBLOCK(cx, (CXt_EVAL|CXp_REAL), SP);
a0714e2c 3498 PUSHEVAL(cx, 0, NULL);
f39bc417 3499 cx->blk_eval.retop = PL_op->op_next;
a0d0e21e
LW
3500
3501 /* prepare to compile string */
3502
3280af22 3503 if (PERLDB_LINE && PL_curstash != PL_debstash)
cc49e20b 3504 save_lines(CopFILEAV(&PL_compiling), PL_linestr);
a0d0e21e 3505 PUTBACK;
d819b83a 3506 ret = doeval(gimme, NULL, runcv, seq);
eb160463 3507 if (PERLDB_INTER && was != (I32)PL_sub_generation /* Some subs defined here. */
533c011a 3508 && ret != PL_op->op_next) { /* Successive compilation. */
e80fed9d 3509 /* Copy in anything fake and short. */
28f0d0ec 3510 my_strlcpy(safestr, fakestr, fakelen);
55497cff 3511 }
1e422769 3512 return DOCATCH(ret);
a0d0e21e
LW
3513}
3514
3515PP(pp_leaveeval)
3516{
27da23d5 3517 dVAR; dSP;
a0d0e21e
LW
3518 register SV **mark;
3519 SV **newsp;
3520 PMOP *newpm;
3521 I32 gimme;
c09156bb 3522 register PERL_CONTEXT *cx;
a0d0e21e 3523 OP *retop;
06b5626a 3524 const U8 save_flags = PL_op -> op_flags;
a0d0e21e
LW
3525 I32 optype;
3526
3527 POPBLOCK(cx,newpm);
3528 POPEVAL(cx);
f39bc417 3529 retop = cx->blk_eval.retop;
a0d0e21e 3530
a1f49e72 3531 TAINT_NOT;
54310121 3532 if (gimme == G_VOID)
3533 MARK = newsp;
3534 else if (gimme == G_SCALAR) {
3535 MARK = newsp + 1;
3536 if (MARK <= SP) {
3537 if (SvFLAGS(TOPs) & SVs_TEMP)
3538 *MARK = TOPs;
3539 else
3540 *MARK = sv_mortalcopy(TOPs);
3541 }
a0d0e21e 3542 else {
54310121 3543 MEXTEND(mark,0);
3280af22 3544 *MARK = &PL_sv_undef;
a0d0e21e 3545 }
a7ec2b44 3546 SP = MARK;
a0d0e21e
LW
3547 }
3548 else {
a1f49e72
CS
3549 /* in case LEAVE wipes old return values */
3550 for (mark = newsp + 1; mark <= SP; mark++) {
3551 if (!(SvFLAGS(*mark) & SVs_TEMP)) {
a0d0e21e 3552 *mark = sv_mortalcopy(*mark);
a1f49e72
CS
3553 TAINT_NOT; /* Each item is independent */
3554 }
3555 }
a0d0e21e 3556 }
3280af22 3557 PL_curpm = newpm; /* Don't pop $1 et al till now */
a0d0e21e 3558
4fdae800 3559#ifdef DEBUGGING
3280af22 3560 assert(CvDEPTH(PL_compcv) == 1);
4fdae800 3561#endif
3280af22 3562 CvDEPTH(PL_compcv) = 0;
f46d017c 3563 lex_end();
4fdae800 3564
1ce6579f 3565 if (optype == OP_REQUIRE &&
924508f0 3566 !(gimme == G_SCALAR ? SvTRUE(*SP) : SP > newsp))
54310121 3567 {
1ce6579f 3568 /* Unassume the success we assumed earlier. */
901017d6 3569 SV * const nsv = cx->blk_eval.old_namesv;
b15aece3 3570 (void)hv_delete(GvHVn(PL_incgv), SvPVX_const(nsv), SvCUR(nsv), G_DISCARD);
be2597df 3571 retop = Perl_die(aTHX_ "%"SVf" did not return a true value", SVfARG(nsv));
f46d017c
GS
3572 /* die_where() did LEAVE, or we won't be here */
3573 }
3574 else {
3575 LEAVE;
3576 if (!(save_flags & OPf_SPECIAL))
c69006e4 3577 sv_setpvn(ERRSV,"",0);
a0d0e21e 3578 }
a0d0e21e
LW
3579
3580 RETURNOP(retop);
3581}
3582
edb2152a
NC
3583/* Common code for Perl_call_sv and Perl_fold_constants, put here to keep it
3584 close to the related Perl_create_eval_scope. */
3585void
3586Perl_delete_eval_scope(pTHX)
a0d0e21e 3587{
edb2152a
NC
3588 SV **newsp;
3589 PMOP *newpm;
3590 I32 gimme;
c09156bb 3591 register PERL_CONTEXT *cx;
edb2152a
NC
3592 I32 optype;
3593
3594 POPBLOCK(cx,newpm);
3595 POPEVAL(cx);
3596 PL_curpm = newpm;
3597 LEAVE;
3598 PERL_UNUSED_VAR(newsp);
3599 PERL_UNUSED_VAR(gimme);
3600 PERL_UNUSED_VAR(optype);
3601}
a0d0e21e 3602
edb2152a
NC
3603/* Common-ish code salvaged from Perl_call_sv and pp_entertry, because it was
3604 also needed by Perl_fold_constants. */
3605PERL_CONTEXT *
3606Perl_create_eval_scope(pTHX_ U32 flags)
3607{
3608 PERL_CONTEXT *cx;
3609 const I32 gimme = GIMME_V;
3610
a0d0e21e
LW
3611 ENTER;
3612 SAVETMPS;
3613
edb2152a 3614 PUSHBLOCK(cx, (CXt_EVAL|CXp_TRYBLOCK), PL_stack_sp);
a0d0e21e 3615 PUSHEVAL(cx, 0, 0);
a0d0e21e 3616
faef0170 3617 PL_in_eval = EVAL_INEVAL;
edb2152a
NC
3618 if (flags & G_KEEPERR)
3619 PL_in_eval |= EVAL_KEEPERR;
3620 else
3621 sv_setpvn(ERRSV,"",0);
3622 if (flags & G_FAKINGEVAL) {
3623 PL_eval_root = PL_op; /* Only needed so that goto works right. */
3624 }
3625 return cx;
3626}
3627
3628PP(pp_entertry)
3629{
3630 dVAR;
df528165 3631 PERL_CONTEXT * const cx = create_eval_scope(0);
edb2152a 3632 cx->blk_eval.retop = cLOGOP->op_other->op_next;
533c011a 3633 return DOCATCH(PL_op->op_next);
a0d0e21e
LW
3634}
3635
3636PP(pp_leavetry)
3637{
27da23d5 3638 dVAR; dSP;
a0d0e21e
LW
3639 SV **newsp;
3640 PMOP *newpm;
3641 I32 gimme;
c09156bb 3642 register PERL_CONTEXT *cx;
a0d0e21e
LW
3643 I32 optype;
3644
3645 POPBLOCK(cx,newpm);
3646 POPEVAL(cx);
9d4ba2ae 3647 PERL_UNUSED_VAR(optype);
a0d0e21e 3648
a1f49e72 3649 TAINT_NOT;
54310121 3650 if (gimme == G_VOID)
3651 SP = newsp;
3652 else if (gimme == G_SCALAR) {
c445ea15 3653 register SV **mark;
54310121 3654 MARK = newsp + 1;
3655 if (MARK <= SP) {
3656 if (SvFLAGS(TOPs) & (SVs_PADTMP|SVs_TEMP))
3657 *MARK = TOPs;
3658 else
3659 *MARK = sv_mortalcopy(TOPs);
3660 }
a0d0e21e 3661 else {
54310121 3662 MEXTEND(mark,0);
3280af22 3663 *MARK = &PL_sv_undef;
a0d0e21e
LW
3664 }
3665 SP = MARK;
3666 }
3667 else {
a1f49e72 3668 /* in case LEAVE wipes old return values */
c445ea15 3669 register SV **mark;
a1f49e72
CS
3670 for (mark = newsp + 1; mark <= SP; mark++) {
3671 if (!(SvFLAGS(*mark) & (SVs_PADTMP|SVs_TEMP))) {
a0d0e21e 3672 *mark = sv_mortalcopy(*mark);
a1f49e72
CS
3673 TAINT_NOT; /* Each item is independent */
3674 }
3675 }
a0d0e21e 3676 }
3280af22 3677 PL_curpm = newpm; /* Don't pop $1 et al till now */
a0d0e21e
LW
3678
3679 LEAVE;
c69006e4 3680 sv_setpvn(ERRSV,"",0);
745cf2ff 3681 RETURN;
a0d0e21e
LW
3682}
3683
0d863452
RH
3684PP(pp_entergiven)
3685{
3686 dVAR; dSP;
3687 register PERL_CONTEXT *cx;
3688 const I32 gimme = GIMME_V;
3689
3690 ENTER;
3691 SAVETMPS;
3692
3693 if (PL_op->op_targ == 0) {
c445ea15 3694 SV ** const defsv_p = &GvSV(PL_defgv);
0d863452
RH
3695 *defsv_p = newSVsv(POPs);
3696 SAVECLEARSV(*defsv_p);
3697 }
3698 else
3699 sv_setsv(PAD_SV(PL_op->op_targ), POPs);
3700
3701 PUSHBLOCK(cx, CXt_GIVEN, SP);
3702 PUSHGIVEN(cx);
3703
3704 RETURN;
3705}
3706
3707PP(pp_leavegiven)
3708{
3709 dVAR; dSP;
3710 register PERL_CONTEXT *cx;
3711 I32 gimme;
3712 SV **newsp;
3713 PMOP *newpm;
96a5add6 3714 PERL_UNUSED_CONTEXT;
0d863452
RH
3715
3716 POPBLOCK(cx,newpm);
3717 assert(CxTYPE(cx) == CXt_GIVEN);
0d863452
RH
3718
3719 SP = newsp;
3720 PUTBACK;
3721
3722 PL_curpm = newpm; /* pop $1 et al */
3723
3724 LEAVE;
3725
3726 return NORMAL;
3727}
3728
3729/* Helper routines used by pp_smartmatch */
3730STATIC
3731PMOP *
3732S_make_matcher(pTHX_ regexp *re)
3733{
97aff369 3734 dVAR;
0d863452
RH
3735 PMOP *matcher = (PMOP *) newPMOP(OP_MATCH, OPf_WANT_SCALAR | OPf_STACKED);
3736 PM_SETRE(matcher, ReREFCNT_inc(re));
3737
3738 SAVEFREEOP((OP *) matcher);
3739 ENTER; SAVETMPS;
3740 SAVEOP();
3741 return matcher;
3742}
3743
3744STATIC
3745bool
3746S_matcher_matches_sv(pTHX_ PMOP *matcher, SV *sv)
3747{
97aff369 3748 dVAR;
0d863452
RH
3749 dSP;
3750
3751 PL_op = (OP *) matcher;
3752 XPUSHs(sv);
3753 PUTBACK;
3754 (void) pp_match();
3755 SPAGAIN;
3756 return (SvTRUEx(POPs));
3757}
3758
3759STATIC
3760void
3761S_destroy_matcher(pTHX_ PMOP *matcher)
3762{
97aff369 3763 dVAR;
0d863452
RH
3764 PERL_UNUSED_ARG(matcher);
3765 FREETMPS;
3766 LEAVE;
3767}
3768
3769/* Do a smart match */
3770PP(pp_smartmatch)
3771{
a0714e2c 3772 return do_smartmatch(NULL, NULL);
0d863452
RH
3773}
3774
4b021f5f
RGS
3775/* This version of do_smartmatch() implements the
3776 * table of smart matches that is found in perlsyn.
0d863452
RH
3777 */
3778STATIC
3779OP *
3780S_do_smartmatch(pTHX_ HV *seen_this, HV *seen_other)
3781{
97aff369 3782 dVAR;
0d863452
RH
3783 dSP;
3784
3785 SV *e = TOPs; /* e is for 'expression' */
3786 SV *d = TOPm1s; /* d is for 'default', as in PL_defgv */
10edeb5d 3787 SV *This, *Other; /* 'This' (and Other to match) to play with C++ */
0d863452
RH
3788 MAGIC *mg;
3789 regexp *this_regex, *other_regex;
3790
3791# define NOT_EMPTY_PROTO(cv) (!SvPOK(cv) || SvCUR(cv) == 0)
3792
3793# define SM_REF(type) ( \
10edeb5d
JH
3794 (SvROK(d) && (SvTYPE(This = SvRV(d)) == SVt_##type) && (Other = e)) \
3795 || (SvROK(e) && (SvTYPE(This = SvRV(e)) == SVt_##type) && (Other = d)))
0d863452
RH
3796
3797# define SM_CV_NEP /* Find a code ref without an empty prototype */ \
10edeb5d
JH
3798 ((SvROK(d) && (SvTYPE(This = SvRV(d)) == SVt_PVCV) \
3799 && NOT_EMPTY_PROTO(This) && (Other = e)) \
3800 || (SvROK(e) && (SvTYPE(This = SvRV(e)) == SVt_PVCV) \
3801 && NOT_EMPTY_PROTO(This) && (Other = d)))
0d863452
RH
3802
3803# define SM_REGEX ( \
10edeb5d
JH
3804 (SvROK(d) && SvMAGICAL(This = SvRV(d)) \
3805 && (mg = mg_find(This, PERL_MAGIC_qr)) \
0d863452 3806 && (this_regex = (regexp *)mg->mg_obj) \
10edeb5d 3807 && (Other = e)) \
0d863452 3808 || \
10edeb5d
JH
3809 (SvROK(e) && SvMAGICAL(This = SvRV(e)) \
3810 && (mg = mg_find(This, PERL_MAGIC_qr)) \
0d863452 3811 && (this_regex = (regexp *)mg->mg_obj) \
10edeb5d 3812 && (Other = d)) )
0d863452
RH
3813
3814
3815# define SM_OTHER_REF(type) \
10edeb5d 3816 (SvROK(Other) && SvTYPE(SvRV(Other)) == SVt_##type)
0d863452 3817
10edeb5d
JH
3818# define SM_OTHER_REGEX (SvROK(Other) && SvMAGICAL(SvRV(Other)) \
3819 && (mg = mg_find(SvRV(Other), PERL_MAGIC_qr)) \
0d863452
RH
3820 && (other_regex = (regexp *)mg->mg_obj))
3821
3822
3823# define SM_SEEN_THIS(sv) hv_exists_ent(seen_this, \
98f4023c 3824 sv_2mortal(newSViv(PTR2IV(sv))), 0)
0d863452
RH
3825
3826# define SM_SEEN_OTHER(sv) hv_exists_ent(seen_other, \
98f4023c 3827 sv_2mortal(newSViv(PTR2IV(sv))), 0)
0d863452
RH
3828
3829 tryAMAGICbinSET(smart, 0);
3830
3831 SP -= 2; /* Pop the values */
3832
3833 /* Take care only to invoke mg_get() once for each argument.
3834 * Currently we do this by copying the SV if it's magical. */
3835 if (d) {
3836 if (SvGMAGICAL(d))
3837 d = sv_mortalcopy(d);
3838 }
3839 else
3840 d = &PL_sv_undef;
3841
3842 assert(e);
3843 if (SvGMAGICAL(e))
3844 e = sv_mortalcopy(e);
3845
3846 if (SM_CV_NEP) {
3847 I32 c;
3848
10edeb5d 3849 if ( SM_OTHER_REF(PVCV) && NOT_EMPTY_PROTO(SvRV(Other)) )
0d863452 3850 {
10edeb5d 3851 if (This == SvRV(Other))
0d863452
RH
3852 RETPUSHYES;
3853 else
3854 RETPUSHNO;
3855 }
3856
3857 ENTER;
3858 SAVETMPS;
3859 PUSHMARK(SP);
10edeb5d 3860 PUSHs(Other);
0d863452 3861 PUTBACK;
10edeb5d 3862 c = call_sv(This, G_SCALAR);
0d863452
RH
3863 SPAGAIN;
3864 if (c == 0)
3865 PUSHs(&PL_sv_no);
3866 else if (SvTEMP(TOPs))
df528165 3867 SvREFCNT_inc_void(TOPs);
0d863452
RH
3868 FREETMPS;
3869 LEAVE;
3870 RETURN;
3871 }
3872 else if (SM_REF(PVHV)) {
3873 if (SM_OTHER_REF(PVHV)) {
3874 /* Check that the key-sets are identical */
3875 HE *he;
10edeb5d 3876 HV *other_hv = (HV *) SvRV(Other);
0d863452
RH
3877 bool tied = FALSE;
3878 bool other_tied = FALSE;
3879 U32 this_key_count = 0,
3880 other_key_count = 0;
3881
3882 /* Tied hashes don't know how many keys they have. */
10edeb5d 3883 if (SvTIED_mg(This, PERL_MAGIC_tied)) {
0d863452
RH
3884 tied = TRUE;
3885 }
3886 else if (SvTIED_mg((SV *) other_hv, PERL_MAGIC_tied)) {
c445ea15 3887 HV * const temp = other_hv;
10edeb5d
JH
3888 other_hv = (HV *) This;
3889 This = (SV *) temp;
0d863452
RH
3890 tied = TRUE;
3891 }
3892 if (SvTIED_mg((SV *) other_hv, PERL_MAGIC_tied))
3893 other_tied = TRUE;
3894
10edeb5d 3895 if (!tied && HvUSEDKEYS((HV *) This) != HvUSEDKEYS(other_hv))
0d863452
RH
3896 RETPUSHNO;
3897
3898 /* The hashes have the same number of keys, so it suffices
3899 to check that one is a subset of the other. */
10edeb5d
JH
3900 (void) hv_iterinit((HV *) This);
3901 while ( (he = hv_iternext((HV *) This)) ) {
0d863452 3902 I32 key_len;
c445ea15 3903 char * const key = hv_iterkey(he, &key_len);
0d863452
RH
3904
3905 ++ this_key_count;
3906
3907 if(!hv_exists(other_hv, key, key_len)) {
10edeb5d 3908 (void) hv_iterinit((HV *) This); /* reset iterator */
0d863452
RH
3909 RETPUSHNO;
3910 }
3911 }
3912
3913 if (other_tied) {
3914 (void) hv_iterinit(other_hv);
3915 while ( hv_iternext(other_hv) )
3916 ++other_key_count;
3917 }
3918 else
3919 other_key_count = HvUSEDKEYS(other_hv);
3920
3921 if (this_key_count != other_key_count)
3922 RETPUSHNO;
3923 else
3924 RETPUSHYES;
3925 }
3926 else if (SM_OTHER_REF(PVAV)) {
10edeb5d 3927 AV * const other_av = (AV *) SvRV(Other);
c445ea15 3928 const I32 other_len = av_len(other_av) + 1;
0d863452
RH
3929 I32 i;
3930
10edeb5d 3931 if (HvUSEDKEYS((HV *) This) != other_len)
0d863452
RH
3932 RETPUSHNO;
3933
3934 for(i = 0; i < other_len; ++i) {
c445ea15 3935 SV ** const svp = av_fetch(other_av, i, FALSE);
0d863452
RH
3936 char *key;
3937 STRLEN key_len;
3938
3939 if (!svp) /* ??? When can this happen? */
3940 RETPUSHNO;
3941
3942 key = SvPV(*svp, key_len);
10edeb5d 3943 if(!hv_exists((HV *) This, key, key_len))
0d863452
RH
3944 RETPUSHNO;
3945 }
3946 RETPUSHYES;
3947 }
3948 else if (SM_OTHER_REGEX) {
c445ea15 3949 PMOP * const matcher = make_matcher(other_regex);
0d863452
RH
3950 HE *he;
3951
10edeb5d
JH
3952 (void) hv_iterinit((HV *) This);
3953 while ( (he = hv_iternext((HV *) This)) ) {
0d863452 3954 if (matcher_matches_sv(matcher, hv_iterkeysv(he))) {
10edeb5d 3955 (void) hv_iterinit((HV *) This);
0d863452
RH
3956 destroy_matcher(matcher);
3957 RETPUSHYES;
3958 }
3959 }
3960 destroy_matcher(matcher);
3961 RETPUSHNO;
3962 }
3963 else {
10edeb5d 3964 if (hv_exists_ent((HV *) This, Other, 0))
0d863452
RH
3965 RETPUSHYES;
3966 else
3967 RETPUSHNO;
3968 }
3969 }
3970 else if (SM_REF(PVAV)) {
3971 if (SM_OTHER_REF(PVAV)) {
10edeb5d
JH
3972 AV *other_av = (AV *) SvRV(Other);
3973 if (av_len((AV *) This) != av_len(other_av))
0d863452
RH
3974 RETPUSHNO;
3975 else {
3976 I32 i;
c445ea15 3977 const I32 other_len = av_len(other_av);
0d863452 3978
a0714e2c 3979 if (NULL == seen_this) {
0d863452
RH
3980 seen_this = newHV();
3981 (void) sv_2mortal((SV *) seen_this);
3982 }
a0714e2c 3983 if (NULL == seen_other) {
0d863452
RH
3984 seen_this = newHV();
3985 (void) sv_2mortal((SV *) seen_other);
3986 }
3987 for(i = 0; i <= other_len; ++i) {
10edeb5d 3988 SV * const * const this_elem = av_fetch((AV *)This, i, FALSE);
c445ea15
AL
3989 SV * const * const other_elem = av_fetch(other_av, i, FALSE);
3990
0d863452
RH
3991 if (!this_elem || !other_elem) {
3992 if (this_elem || other_elem)
3993 RETPUSHNO;
3994 }
3995 else if (SM_SEEN_THIS(*this_elem)
3996 || SM_SEEN_OTHER(*other_elem))
3997 {
3998 if (*this_elem != *other_elem)
3999 RETPUSHNO;
4000 }
4001 else {
4002 hv_store_ent(seen_this,
98f4023c 4003 sv_2mortal(newSViv(PTR2IV(*this_elem))),
0d863452
RH
4004 &PL_sv_undef, 0);
4005 hv_store_ent(seen_other,
98f4023c 4006 sv_2mortal(newSViv(PTR2IV(*other_elem))),
0d863452
RH
4007 &PL_sv_undef, 0);
4008 PUSHs(*this_elem);
4009 PUSHs(*other_elem);
4010
4011 PUTBACK;
4012 (void) do_smartmatch(seen_this, seen_other);
4013 SPAGAIN;
4014
4015 if (!SvTRUEx(POPs))
4016 RETPUSHNO;
4017 }
4018 }
4019 RETPUSHYES;
4020 }
4021 }
4022 else if (SM_OTHER_REGEX) {
c445ea15 4023 PMOP * const matcher = make_matcher(other_regex);
10edeb5d 4024 const I32 this_len = av_len((AV *) This);
0d863452 4025 I32 i;
0d863452
RH
4026
4027 for(i = 0; i <= this_len; ++i) {
10edeb5d 4028 SV * const * const svp = av_fetch((AV *)This, i, FALSE);
0d863452
RH
4029 if (svp && matcher_matches_sv(matcher, *svp)) {
4030 destroy_matcher(matcher);
4031 RETPUSHYES;
4032 }
4033 }
4034 destroy_matcher(matcher);
4035 RETPUSHNO;
4036 }
10edeb5d 4037 else if (SvIOK(Other) || SvNOK(Other)) {
0d863452
RH
4038 I32 i;
4039
10edeb5d
JH
4040 for(i = 0; i <= AvFILL((AV *) This); ++i) {
4041 SV * const * const svp = av_fetch((AV *)This, i, FALSE);
0d863452
RH
4042 if (!svp)
4043 continue;
4044
10edeb5d 4045 PUSHs(Other);
0d863452
RH
4046 PUSHs(*svp);
4047 PUTBACK;
a98fe34d 4048 if (CopHINTS_get(PL_curcop) & HINT_INTEGER)
0d863452
RH
4049 (void) pp_i_eq();
4050 else
4051 (void) pp_eq();
4052 SPAGAIN;
4053 if (SvTRUEx(POPs))
4054 RETPUSHYES;
4055 }
4056 RETPUSHNO;
4057 }
10edeb5d
JH
4058 else if (SvPOK(Other)) {
4059 const I32 this_len = av_len((AV *) This);
0d863452 4060 I32 i;
0d863452
RH
4061
4062 for(i = 0; i <= this_len; ++i) {
10edeb5d 4063 SV * const * const svp = av_fetch((AV *)This, i, FALSE);
0d863452
RH
4064 if (!svp)
4065 continue;
4066
10edeb5d 4067 PUSHs(Other);
0d863452
RH
4068 PUSHs(*svp);
4069 PUTBACK;
4070 (void) pp_seq();
4071 SPAGAIN;
4072 if (SvTRUEx(POPs))
4073 RETPUSHYES;
4074 }
4075 RETPUSHNO;
4076 }
4077 }
4078 else if (!SvOK(d) || !SvOK(e)) {
4079 if (!SvOK(d) && !SvOK(e))
4080 RETPUSHYES;
4081 else
4082 RETPUSHNO;
4083 }
4084 else if (SM_REGEX) {
c445ea15 4085 PMOP * const matcher = make_matcher(this_regex);
0d863452
RH
4086
4087 PUTBACK;
10edeb5d 4088 PUSHs(matcher_matches_sv(matcher, Other)
0d863452
RH
4089 ? &PL_sv_yes
4090 : &PL_sv_no);
4091 destroy_matcher(matcher);
4092 RETURN;
4093 }
4094 else if (SM_REF(PVCV)) {
4095 I32 c;
4096 /* This must be a null-prototyped sub, because we
4097 already checked for the other kind. */
4098
4099 ENTER;
4100 SAVETMPS;
4101 PUSHMARK(SP);
4102 PUTBACK;
10edeb5d 4103 c = call_sv(This, G_SCALAR);
0d863452
RH
4104 SPAGAIN;
4105 if (c == 0)
4106 PUSHs(&PL_sv_undef);
4107 else if (SvTEMP(TOPs))
df528165 4108 SvREFCNT_inc_void(TOPs);
0d863452
RH
4109
4110 if (SM_OTHER_REF(PVCV)) {
4111 /* This one has to be null-proto'd too.
4112 Call both of 'em, and compare the results */
4113 PUSHMARK(SP);
10edeb5d 4114 c = call_sv(SvRV(Other), G_SCALAR);
0d863452
RH
4115 SPAGAIN;
4116 if (c == 0)
4117 PUSHs(&PL_sv_undef);
4118 else if (SvTEMP(TOPs))
df528165 4119 SvREFCNT_inc_void(TOPs);
0d863452
RH
4120 FREETMPS;
4121 LEAVE;
4122 PUTBACK;
4123 return pp_eq();
4124 }
4125
4126 FREETMPS;
4127 LEAVE;
4128 RETURN;
4129 }
10edeb5d
JH
4130 else if ( ((SvIOK(d) || SvNOK(d)) && (This = d) && (Other = e))
4131 || ((SvIOK(e) || SvNOK(e)) && (This = e) && (Other = d)) )
0d863452 4132 {
10edeb5d 4133 if (SvPOK(Other) && !looks_like_number(Other)) {
0d863452
RH
4134 /* String comparison */
4135 PUSHs(d); PUSHs(e);
4136 PUTBACK;
4137 return pp_seq();
4138 }
4139 /* Otherwise, numeric comparison */
4140 PUSHs(d); PUSHs(e);
4141 PUTBACK;
a98fe34d 4142 if (CopHINTS_get(PL_curcop) & HINT_INTEGER)
0d863452
RH
4143 (void) pp_i_eq();
4144 else
4145 (void) pp_eq();
4146 SPAGAIN;
4147 if (SvTRUEx(POPs))
4148 RETPUSHYES;
4149 else
4150 RETPUSHNO;
4151 }
4152
4153 /* As a last resort, use string comparison */
4154 PUSHs(d); PUSHs(e);
4155 PUTBACK;
4156 return pp_seq();
4157}
4158
4159PP(pp_enterwhen)
4160{
4161 dVAR; dSP;
4162 register PERL_CONTEXT *cx;
4163 const I32 gimme = GIMME_V;
4164
4165 /* This is essentially an optimization: if the match
4166 fails, we don't want to push a context and then
4167 pop it again right away, so we skip straight
4168 to the op that follows the leavewhen.
4169 */
4170 if ((0 == (PL_op->op_flags & OPf_SPECIAL)) && !SvTRUEx(POPs))
4171 return cLOGOP->op_other->op_next;
4172
4173 ENTER;
4174 SAVETMPS;
4175
4176 PUSHBLOCK(cx, CXt_WHEN, SP);
4177 PUSHWHEN(cx);
4178
4179 RETURN;
4180}
4181
4182PP(pp_leavewhen)
4183{
4184 dVAR; dSP;
4185 register PERL_CONTEXT *cx;
4186 I32 gimme;
4187 SV **newsp;
4188 PMOP *newpm;
4189
4190 POPBLOCK(cx,newpm);
4191 assert(CxTYPE(cx) == CXt_WHEN);
4192
4193 SP = newsp;
4194 PUTBACK;
4195
4196 PL_curpm = newpm; /* pop $1 et al */
4197
4198 LEAVE;
4199 return NORMAL;
4200}
4201
4202PP(pp_continue)
4203{
4204 dVAR;
4205 I32 cxix;
4206 register PERL_CONTEXT *cx;
4207 I32 inner;
4208
4209 cxix = dopoptowhen(cxstack_ix);
4210 if (cxix < 0)
4211 DIE(aTHX_ "Can't \"continue\" outside a when block");
4212 if (cxix < cxstack_ix)
4213 dounwind(cxix);
4214
4215 /* clear off anything above the scope we're re-entering */
4216 inner = PL_scopestack_ix;
4217 TOPBLOCK(cx);
4218 if (PL_scopestack_ix < inner)
4219 leave_scope(PL_scopestack[PL_scopestack_ix]);
4220 PL_curcop = cx->blk_oldcop;
4221 return cx->blk_givwhen.leave_op;
4222}
4223
4224PP(pp_break)
4225{
4226 dVAR;
4227 I32 cxix;
4228 register PERL_CONTEXT *cx;
4229 I32 inner;
4230
4231 cxix = dopoptogiven(cxstack_ix);
4232 if (cxix < 0) {
4233 if (PL_op->op_flags & OPf_SPECIAL)
4234 DIE(aTHX_ "Can't use when() outside a topicalizer");
4235 else
4236 DIE(aTHX_ "Can't \"break\" outside a given block");
4237 }
4238 if (CxFOREACH(&cxstack[cxix]) && (0 == (PL_op->op_flags & OPf_SPECIAL)))
4239 DIE(aTHX_ "Can't \"break\" in a loop topicalizer");
4240
4241 if (cxix < cxstack_ix)
4242 dounwind(cxix);
4243
4244 /* clear off anything above the scope we're re-entering */
4245 inner = PL_scopestack_ix;
4246 TOPBLOCK(cx);
4247 if (PL_scopestack_ix < inner)
4248 leave_scope(PL_scopestack[PL_scopestack_ix]);
4249 PL_curcop = cx->blk_oldcop;
4250
4251 if (CxFOREACH(cx))
022eaa24 4252 return CX_LOOP_NEXTOP_GET(cx);
0d863452
RH
4253 else
4254 return cx->blk_givwhen.leave_op;
4255}
4256
a1b95068 4257STATIC OP *
cea2e8a9 4258S_doparseform(pTHX_ SV *sv)
a0d0e21e
LW
4259{
4260 STRLEN len;
4261 register char *s = SvPV_force(sv, len);
c445ea15
AL
4262 register char * const send = s + len;
4263 register char *base = NULL;
a0d0e21e 4264 register I32 skipspaces = 0;
9c5ffd7c
JH
4265 bool noblank = FALSE;
4266 bool repeat = FALSE;
a0d0e21e 4267 bool postspace = FALSE;
dea28490
JJ
4268 U32 *fops;
4269 register U32 *fpc;
cbbf8932 4270 U32 *linepc = NULL;
a0d0e21e
LW
4271 register I32 arg;
4272 bool ischop;
a1b95068
WL
4273 bool unchopnum = FALSE;
4274 int maxops = 12; /* FF_LINEMARK + FF_END + 10 (\0 without preceding \n) */
a0d0e21e 4275
55497cff 4276 if (len == 0)
cea2e8a9 4277 Perl_croak(aTHX_ "Null picture in formline");
ac27b0f5 4278
815f25c6
DM
4279 /* estimate the buffer size needed */
4280 for (base = s; s <= send; s++) {
a1b95068 4281 if (*s == '\n' || *s == '@' || *s == '^')
815f25c6
DM
4282 maxops += 10;
4283 }
4284 s = base;
c445ea15 4285 base = NULL;
815f25c6 4286
a02a5408 4287 Newx(fops, maxops, U32);
a0d0e21e
LW
4288 fpc = fops;
4289
4290 if (s < send) {
4291 linepc = fpc;
4292 *fpc++ = FF_LINEMARK;
4293 noblank = repeat = FALSE;
4294 base = s;
4295 }
4296
4297 while (s <= send) {
4298 switch (*s++) {
4299 default:
4300 skipspaces = 0;
4301 continue;
4302
4303 case '~':
4304 if (*s == '~') {
4305 repeat = TRUE;
4306 *s = ' ';
4307 }
4308 noblank = TRUE;
4309 s[-1] = ' ';
4310 /* FALL THROUGH */
4311 case ' ': case '\t':
4312 skipspaces++;
4313 continue;
a1b95068
WL
4314 case 0:
4315 if (s < send) {
4316 skipspaces = 0;
4317 continue;
4318 } /* else FALL THROUGH */
4319 case '\n':
a0d0e21e
LW
4320 arg = s - base;
4321 skipspaces++;
4322 arg -= skipspaces;
4323 if (arg) {
5f05dabc 4324 if (postspace)
a0d0e21e 4325 *fpc++ = FF_SPACE;
a0d0e21e 4326 *fpc++ = FF_LITERAL;
eb160463 4327 *fpc++ = (U16)arg;
a0d0e21e 4328 }
5f05dabc 4329 postspace = FALSE;
a0d0e21e
LW
4330 if (s <= send)
4331 skipspaces--;
4332 if (skipspaces) {
4333 *fpc++ = FF_SKIP;
eb160463 4334 *fpc++ = (U16)skipspaces;
a0d0e21e
LW
4335 }
4336 skipspaces = 0;
4337 if (s <= send)
4338 *fpc++ = FF_NEWLINE;
4339 if (noblank) {
4340 *fpc++ = FF_BLANK;
4341 if (repeat)
4342 arg = fpc - linepc + 1;
4343 else
4344 arg = 0;
eb160463 4345 *fpc++ = (U16)arg;
a0d0e21e
LW
4346 }
4347 if (s < send) {
4348 linepc = fpc;
4349 *fpc++ = FF_LINEMARK;
4350 noblank = repeat = FALSE;
4351 base = s;
4352 }
4353 else
4354 s++;
4355 continue;
4356
4357 case '@':
4358 case '^':
4359 ischop = s[-1] == '^';
4360
4361 if (postspace) {
4362 *fpc++ = FF_SPACE;
4363 postspace = FALSE;
4364 }
4365 arg = (s - base) - 1;
4366 if (arg) {
4367 *fpc++ = FF_LITERAL;
eb160463 4368 *fpc++ = (U16)arg;
a0d0e21e
LW
4369 }
4370
4371 base = s - 1;
4372 *fpc++ = FF_FETCH;
4373 if (*s == '*') {
4374 s++;
a1b95068
WL
4375 *fpc++ = 2; /* skip the @* or ^* */
4376 if (ischop) {
4377 *fpc++ = FF_LINESNGL;
4378 *fpc++ = FF_CHOP;
4379 } else
4380 *fpc++ = FF_LINEGLOB;
a0d0e21e
LW
4381 }
4382 else if (*s == '#' || (*s == '.' && s[1] == '#')) {
4383 arg = ischop ? 512 : 0;
4384 base = s - 1;
4385 while (*s == '#')
4386 s++;
4387 if (*s == '.') {
06b5626a 4388 const char * const f = ++s;
a0d0e21e
LW
4389 while (*s == '#')
4390 s++;
4391 arg |= 256 + (s - f);
4392 }
4393 *fpc++ = s - base; /* fieldsize for FETCH */
4394 *fpc++ = FF_DECIMAL;
eb160463 4395 *fpc++ = (U16)arg;
a1b95068 4396 unchopnum |= ! ischop;
784707d5
JP
4397 }
4398 else if (*s == '0' && s[1] == '#') { /* Zero padded decimals */
4399 arg = ischop ? 512 : 0;
4400 base = s - 1;
4401 s++; /* skip the '0' first */
4402 while (*s == '#')
4403 s++;
4404 if (*s == '.') {
06b5626a 4405 const char * const f = ++s;
784707d5
JP
4406 while (*s == '#')
4407 s++;
4408 arg |= 256 + (s - f);
4409 }
4410 *fpc++ = s - base; /* fieldsize for FETCH */
4411 *fpc++ = FF_0DECIMAL;
eb160463 4412 *fpc++ = (U16)arg;
a1b95068 4413 unchopnum |= ! ischop;
a0d0e21e
LW
4414 }
4415 else {
4416 I32 prespace = 0;
4417 bool ismore = FALSE;
4418
4419 if (*s == '>') {
4420 while (*++s == '>') ;
4421 prespace = FF_SPACE;
4422 }
4423 else if (*s == '|') {
4424 while (*++s == '|') ;
4425 prespace = FF_HALFSPACE;
4426 postspace = TRUE;
4427 }
4428 else {
4429 if (*s == '<')
4430 while (*++s == '<') ;
4431 postspace = TRUE;
4432 }
4433 if (*s == '.' && s[1] == '.' && s[2] == '.') {
4434 s += 3;
4435 ismore = TRUE;
4436 }
4437 *fpc++ = s - base; /* fieldsize for FETCH */
4438
4439 *fpc++ = ischop ? FF_CHECKCHOP : FF_CHECKNL;
4440
4441 if (prespace)
eb160463 4442 *fpc++ = (U16)prespace;
a0d0e21e
LW
4443 *fpc++ = FF_ITEM;
4444 if (ismore)
4445 *fpc++ = FF_MORE;
4446 if (ischop)
4447 *fpc++ = FF_CHOP;
4448 }
4449 base = s;
4450 skipspaces = 0;
4451 continue;
4452 }
4453 }
4454 *fpc++ = FF_END;
4455
815f25c6 4456 assert (fpc <= fops + maxops); /* ensure our buffer estimate was valid */
a0d0e21e
LW
4457 arg = fpc - fops;
4458 { /* need to jump to the next word */
4459 int z;
4460 z = WORD_ALIGN - SvCUR(sv) % WORD_ALIGN;
dea28490 4461 SvGROW(sv, SvCUR(sv) + z + arg * sizeof(U32) + 4);
a0d0e21e
LW
4462 s = SvPVX(sv) + SvCUR(sv) + z;
4463 }
dea28490 4464 Copy(fops, s, arg, U32);
a0d0e21e 4465 Safefree(fops);
c445ea15 4466 sv_magic(sv, NULL, PERL_MAGIC_fm, NULL, 0);
a0d0e21e 4467 SvCOMPILED_on(sv);
a1b95068 4468
bfed75c6 4469 if (unchopnum && repeat)
a1b95068
WL
4470 DIE(aTHX_ "Repeated format line will never terminate (~~ and @#)");
4471 return 0;
4472}
4473
4474
4475STATIC bool
4476S_num_overflow(NV value, I32 fldsize, I32 frcsize)
4477{
4478 /* Can value be printed in fldsize chars, using %*.*f ? */
4479 NV pwr = 1;
4480 NV eps = 0.5;
4481 bool res = FALSE;
4482 int intsize = fldsize - (value < 0 ? 1 : 0);
4483
4484 if (frcsize & 256)
4485 intsize--;
4486 frcsize &= 255;
4487 intsize -= frcsize;
4488
4489 while (intsize--) pwr *= 10.0;
4490 while (frcsize--) eps /= 10.0;
4491
4492 if( value >= 0 ){
4493 if (value + eps >= pwr)
4494 res = TRUE;
4495 } else {
4496 if (value - eps <= -pwr)
4497 res = TRUE;
4498 }
4499 return res;
a0d0e21e 4500}
4e35701f 4501
bbed91b5 4502static I32
0bd48802 4503S_run_user_filter(pTHX_ int idx, SV *buf_sv, int maxlen)
bbed91b5 4504{
27da23d5 4505 dVAR;
0bd48802 4506 SV * const datasv = FILTER_DATA(idx);
504618e9 4507 const int filter_has_file = IoLINES(datasv);
0bd48802
AL
4508 SV * const filter_state = (SV *)IoTOP_GV(datasv);
4509 SV * const filter_sub = (SV *)IoBOTTOM_GV(datasv);
941a98a0 4510 int status = 0;
ec0b63d7 4511 SV *upstream;
941a98a0 4512 STRLEN got_len;
95b63a38 4513 const char *got_p = NULL;
941a98a0 4514 const char *prune_from = NULL;
34113e50 4515 bool read_from_cache = FALSE;
bb7a0f54
MHM
4516 STRLEN umaxlen;
4517
4518 assert(maxlen >= 0);
4519 umaxlen = maxlen;
5675696b 4520
bbed91b5
KF
4521 /* I was having segfault trouble under Linux 2.2.5 after a
4522 parse error occured. (Had to hack around it with a test
4523 for PL_error_count == 0.) Solaris doesn't segfault --
4524 not sure where the trouble is yet. XXX */
4525
941a98a0 4526 if (IoFMT_GV(datasv)) {
937b367d
NC
4527 SV *const cache = (SV *)IoFMT_GV(datasv);
4528 if (SvOK(cache)) {
4529 STRLEN cache_len;
4530 const char *cache_p = SvPV(cache, cache_len);
941a98a0
NC
4531 STRLEN take = 0;
4532
bb7a0f54 4533 if (umaxlen) {
941a98a0
NC
4534 /* Running in block mode and we have some cached data already.
4535 */
bb7a0f54 4536 if (cache_len >= umaxlen) {
941a98a0
NC
4537 /* In fact, so much data we don't even need to call
4538 filter_read. */
bb7a0f54 4539 take = umaxlen;
941a98a0
NC
4540 }
4541 } else {
10edeb5d
JH
4542 const char *const first_nl =
4543 (const char *)memchr(cache_p, '\n', cache_len);
941a98a0
NC
4544 if (first_nl) {
4545 take = first_nl + 1 - cache_p;
4546 }
4547 }
4548 if (take) {
4549 sv_catpvn(buf_sv, cache_p, take);
4550 sv_chop(cache, cache_p + take);
937b367d
NC
4551 /* Definately not EOF */
4552 return 1;
4553 }
941a98a0 4554
937b367d 4555 sv_catsv(buf_sv, cache);
bb7a0f54
MHM
4556 if (umaxlen) {
4557 umaxlen -= cache_len;
941a98a0 4558 }
937b367d 4559 SvOK_off(cache);
34113e50 4560 read_from_cache = TRUE;
937b367d
NC
4561 }
4562 }
ec0b63d7 4563
34113e50
NC
4564 /* Filter API says that the filter appends to the contents of the buffer.
4565 Usually the buffer is "", so the details don't matter. But if it's not,
4566 then clearly what it contains is already filtered by this filter, so we
4567 don't want to pass it in a second time.
4568 I'm going to use a mortal in case the upstream filter croaks. */
ec0b63d7
NC
4569 upstream = ((SvOK(buf_sv) && sv_len(buf_sv)) || SvGMAGICAL(buf_sv))
4570 ? sv_newmortal() : buf_sv;
4571 SvUPGRADE(upstream, SVt_PV);
937b367d 4572
bbed91b5 4573 if (filter_has_file) {
67e70b33 4574 status = FILTER_READ(idx+1, upstream, 0);
bbed91b5
KF
4575 }
4576
34113e50 4577 if (filter_sub && status >= 0) {
39644a26 4578 dSP;
bbed91b5
KF
4579 int count;
4580
4581 ENTER;
4582 SAVE_DEFSV;
4583 SAVETMPS;
4584 EXTEND(SP, 2);
4585
5675696b 4586 DEFSV = upstream;
bbed91b5 4587 PUSHMARK(SP);
67e70b33 4588 PUSHs(sv_2mortal(newSViv(0)));
bbed91b5
KF
4589 if (filter_state) {
4590 PUSHs(filter_state);
4591 }
4592 PUTBACK;
4593 count = call_sv(filter_sub, G_SCALAR);
4594 SPAGAIN;
4595
4596 if (count > 0) {
4597 SV *out = POPs;
4598 if (SvOK(out)) {
941a98a0 4599 status = SvIV(out);
bbed91b5
KF
4600 }
4601 }
4602
4603 PUTBACK;
4604 FREETMPS;
4605 LEAVE;
4606 }
4607
941a98a0
NC
4608 if(SvOK(upstream)) {
4609 got_p = SvPV(upstream, got_len);
bb7a0f54
MHM
4610 if (umaxlen) {
4611 if (got_len > umaxlen) {
4612 prune_from = got_p + umaxlen;
937b367d 4613 }
941a98a0 4614 } else {
10edeb5d
JH
4615 const char *const first_nl =
4616 (const char *)memchr(got_p, '\n', got_len);
941a98a0
NC
4617 if (first_nl && first_nl + 1 < got_p + got_len) {
4618 /* There's a second line here... */
4619 prune_from = first_nl + 1;
937b367d 4620 }
937b367d
NC
4621 }
4622 }
941a98a0
NC
4623 if (prune_from) {
4624 /* Oh. Too long. Stuff some in our cache. */
4625 STRLEN cached_len = got_p + got_len - prune_from;
4626 SV *cache = (SV *)IoFMT_GV(datasv);
4627
4628 if (!cache) {
bb7a0f54 4629 IoFMT_GV(datasv) = (GV*) (cache = newSV(got_len - umaxlen));
941a98a0
NC
4630 } else if (SvOK(cache)) {
4631 /* Cache should be empty. */
4632 assert(!SvCUR(cache));
4633 }
4634
4635 sv_setpvn(cache, prune_from, cached_len);
4636 /* If you ask for block mode, you may well split UTF-8 characters.
4637 "If it breaks, you get to keep both parts"
4638 (Your code is broken if you don't put them back together again
4639 before something notices.) */
4640 if (SvUTF8(upstream)) {
4641 SvUTF8_on(cache);
4642 }
4643 SvCUR_set(upstream, got_len - cached_len);
4644 /* Can't yet be EOF */
4645 if (status == 0)
4646 status = 1;
4647 }
937b367d 4648
34113e50
NC
4649 /* If they are at EOF but buf_sv has something in it, then they may never
4650 have touched the SV upstream, so it may be undefined. If we naively
4651 concatenate it then we get a warning about use of uninitialised value.
4652 */
4653 if (upstream != buf_sv && (SvOK(upstream) || SvGMAGICAL(upstream))) {
937b367d
NC
4654 sv_catsv(buf_sv, upstream);
4655 }
4656
941a98a0 4657 if (status <= 0) {
bbed91b5 4658 IoLINES(datasv) = 0;
937b367d 4659 SvREFCNT_dec(IoFMT_GV(datasv));
bbed91b5
KF
4660 if (filter_state) {
4661 SvREFCNT_dec(filter_state);
a0714e2c 4662 IoTOP_GV(datasv) = NULL;
bbed91b5
KF
4663 }
4664 if (filter_sub) {
4665 SvREFCNT_dec(filter_sub);
a0714e2c 4666 IoBOTTOM_GV(datasv) = NULL;
bbed91b5 4667 }
0bd48802 4668 filter_del(S_run_user_filter);
bbed91b5 4669 }
34113e50
NC
4670 if (status == 0 && read_from_cache) {
4671 /* If we read some data from the cache (and by getting here it implies
4672 that we emptied the cache) then we aren't yet at EOF, and mustn't
4673 report that to our caller. */
4674 return 1;
4675 }
941a98a0 4676 return status;
bbed91b5 4677}
84d4ea48 4678
be4b629d
CN
4679/* perhaps someone can come up with a better name for
4680 this? it is not really "absolute", per se ... */
cf42f822 4681static bool
5f66b61c 4682S_path_is_absolute(const char *name)
be4b629d
CN
4683{
4684 if (PERL_FILE_IS_ABSOLUTE(name)
4685#ifdef MACOS_TRADITIONAL
0bd48802 4686 || (*name == ':')
be4b629d
CN
4687#else
4688 || (*name == '.' && (name[1] == '/' ||
0bd48802 4689 (name[1] == '.' && name[2] == '/')))
be4b629d 4690#endif
0bd48802 4691 )
be4b629d
CN
4692 {
4693 return TRUE;
4694 }
4695 else
4696 return FALSE;
4697}
241d1a3b
NC
4698
4699/*
4700 * Local variables:
4701 * c-indentation-style: bsd
4702 * c-basic-offset: 4
4703 * indent-tabs-mode: t
4704 * End:
4705 *
37442d52
RGS
4706 * ex: set ts=8 sts=4 sw=4 noet:
4707 */