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