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