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