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