This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
CPAN.pm sync
[perl5.git] / pp_ctl.c
... / ...
CommitLineData
1/* pp_ctl.c
2 *
3 * Copyright (c) 1991-2002, Larry Wall
4 *
5 * You may distribute under the terms of either the GNU General Public
6 * License or the Artistic License, as specified in the README file.
7 *
8 */
9
10/*
11 * Now far ahead the Road has gone,
12 * And I must follow, if I can,
13 * Pursuing it with eager feet,
14 * Until it joins some larger way
15 * Where many paths and errands meet.
16 * And whither then? I cannot say.
17 */
18
19#include "EXTERN.h"
20#define PERL_IN_PP_CTL_C
21#include "perl.h"
22
23#ifndef WORD_ALIGN
24#define WORD_ALIGN sizeof(U16)
25#endif
26
27#define DOCATCH(o) ((CATCH_GET == TRUE) ? docatch(o) : (o))
28
29static I32 run_user_filter(pTHX_ int idx, SV *buf_sv, int maxlen);
30
31PP(pp_wantarray)
32{
33 dSP;
34 I32 cxix;
35 EXTEND(SP, 1);
36
37 cxix = dopoptosub(cxstack_ix);
38 if (cxix < 0)
39 RETPUSHUNDEF;
40
41 switch (cxstack[cxix].blk_gimme) {
42 case G_ARRAY:
43 RETPUSHYES;
44 case G_SCALAR:
45 RETPUSHNO;
46 default:
47 RETPUSHUNDEF;
48 }
49}
50
51PP(pp_regcmaybe)
52{
53 return NORMAL;
54}
55
56PP(pp_regcreset)
57{
58 /* XXXX Should store the old value to allow for tie/overload - and
59 restore in regcomp, where marked with XXXX. */
60 PL_reginterp_cnt = 0;
61 return NORMAL;
62}
63
64PP(pp_regcomp)
65{
66 dSP;
67 register PMOP *pm = (PMOP*)cLOGOP->op_other;
68 register char *t;
69 SV *tmpstr;
70 STRLEN len;
71 MAGIC *mg = Null(MAGIC*);
72
73 tmpstr = POPs;
74
75 /* prevent recompiling under /o and ithreads. */
76#if defined(USE_ITHREADS) || defined(USE_5005THREADS)
77 if (pm->op_pmflags & PMf_KEEP && PM_GETRE(pm))
78 RETURN;
79#endif
80
81 if (SvROK(tmpstr)) {
82 SV *sv = SvRV(tmpstr);
83 if(SvMAGICAL(sv))
84 mg = mg_find(sv, PERL_MAGIC_qr);
85 }
86 if (mg) {
87 regexp *re = (regexp *)mg->mg_obj;
88 ReREFCNT_dec(PM_GETRE(pm));
89 PM_SETRE(pm, ReREFCNT_inc(re));
90 }
91 else {
92 t = SvPV(tmpstr, len);
93
94 /* Check against the last compiled regexp. */
95 if (!PM_GETRE(pm) || !PM_GETRE(pm)->precomp ||
96 PM_GETRE(pm)->prelen != len ||
97 memNE(PM_GETRE(pm)->precomp, t, len))
98 {
99 if (PM_GETRE(pm)) {
100 ReREFCNT_dec(PM_GETRE(pm));
101 PM_SETRE(pm, Null(REGEXP*)); /* crucial if regcomp aborts */
102 }
103 if (PL_op->op_flags & OPf_SPECIAL)
104 PL_reginterp_cnt = I32_MAX; /* Mark as safe. */
105
106 pm->op_pmflags = pm->op_pmpermflags; /* reset case sensitivity */
107 if (DO_UTF8(tmpstr))
108 pm->op_pmdynflags |= PMdf_DYN_UTF8;
109 else {
110 pm->op_pmdynflags &= ~PMdf_DYN_UTF8;
111 if (pm->op_pmdynflags & PMdf_UTF8)
112 t = (char*)bytes_to_utf8((U8*)t, &len);
113 }
114 PM_SETRE(pm, CALLREGCOMP(aTHX_ t, t + len, pm));
115 if (!DO_UTF8(tmpstr) && (pm->op_pmdynflags & PMdf_UTF8))
116 Safefree(t);
117 PL_reginterp_cnt = 0; /* XXXX Be extra paranoid - needed
118 inside tie/overload accessors. */
119 }
120 }
121
122#ifndef INCOMPLETE_TAINTS
123 if (PL_tainting) {
124 if (PL_tainted)
125 pm->op_pmdynflags |= PMdf_TAINTED;
126 else
127 pm->op_pmdynflags &= ~PMdf_TAINTED;
128 }
129#endif
130
131 if (!PM_GETRE(pm)->prelen && PL_curpm)
132 pm = PL_curpm;
133 else if (strEQ("\\s+", PM_GETRE(pm)->precomp))
134 pm->op_pmflags |= PMf_WHITE;
135 else
136 pm->op_pmflags &= ~PMf_WHITE;
137
138 /* XXX runtime compiled output needs to move to the pad */
139 if (pm->op_pmflags & PMf_KEEP) {
140 pm->op_private &= ~OPpRUNTIME; /* no point compiling again */
141#if !defined(USE_ITHREADS) && !defined(USE_5005THREADS)
142 /* XXX can't change the optree at runtime either */
143 cLOGOP->op_first->op_next = PL_op->op_next;
144#endif
145 }
146 RETURN;
147}
148
149PP(pp_substcont)
150{
151 dSP;
152 register PMOP *pm = (PMOP*) cLOGOP->op_other;
153 register PERL_CONTEXT *cx = &cxstack[cxstack_ix];
154 register SV *dstr = cx->sb_dstr;
155 register char *s = cx->sb_s;
156 register char *m = cx->sb_m;
157 char *orig = cx->sb_orig;
158 register REGEXP *rx = cx->sb_rx;
159
160 rxres_restore(&cx->sb_rxres, rx);
161 PL_reg_match_utf8 = SvUTF8(cx->sb_targ) ? 1 : 0;
162
163 if (cx->sb_iters++) {
164 I32 saviters = cx->sb_iters;
165 if (cx->sb_iters > cx->sb_maxiters)
166 DIE(aTHX_ "Substitution loop");
167
168 if (!(cx->sb_rxtainted & 2) && SvTAINTED(TOPs))
169 cx->sb_rxtainted |= 2;
170 sv_catsv(dstr, POPs);
171
172 /* Are we done */
173 if (cx->sb_once || !CALLREGEXEC(aTHX_ rx, s, cx->sb_strend, orig,
174 s == m, cx->sb_targ, NULL,
175 ((cx->sb_rflags & REXEC_COPY_STR)
176 ? (REXEC_IGNOREPOS|REXEC_NOT_FIRST)
177 : (REXEC_COPY_STR|REXEC_IGNOREPOS|REXEC_NOT_FIRST))))
178 {
179 SV *targ = cx->sb_targ;
180
181 sv_catpvn(dstr, s, cx->sb_strend - s);
182 cx->sb_rxtainted |= RX_MATCH_TAINTED(rx);
183
184 (void)SvOOK_off(targ);
185 Safefree(SvPVX(targ));
186 SvPVX(targ) = SvPVX(dstr);
187 SvCUR_set(targ, SvCUR(dstr));
188 SvLEN_set(targ, SvLEN(dstr));
189 if (DO_UTF8(dstr))
190 SvUTF8_on(targ);
191 SvPVX(dstr) = 0;
192 sv_free(dstr);
193
194 TAINT_IF(cx->sb_rxtainted & 1);
195 PUSHs(sv_2mortal(newSViv((I32)cx->sb_iters - 1)));
196
197 (void)SvPOK_only_UTF8(targ);
198 TAINT_IF(cx->sb_rxtainted);
199 SvSETMAGIC(targ);
200 SvTAINT(targ);
201
202 LEAVE_SCOPE(cx->sb_oldsave);
203 POPSUBST(cx);
204 RETURNOP(pm->op_next);
205 }
206 cx->sb_iters = saviters;
207 }
208 if (RX_MATCH_COPIED(rx) && rx->subbeg != orig) {
209 m = s;
210 s = orig;
211 cx->sb_orig = orig = rx->subbeg;
212 s = orig + (m - s);
213 cx->sb_strend = s + (cx->sb_strend - m);
214 }
215 cx->sb_m = m = rx->startp[0] + orig;
216 if (m > s)
217 sv_catpvn(dstr, s, m-s);
218 cx->sb_s = rx->endp[0] + orig;
219 { /* Update the pos() information. */
220 SV *sv = cx->sb_targ;
221 MAGIC *mg;
222 I32 i;
223 if (SvTYPE(sv) < SVt_PVMG)
224 (void)SvUPGRADE(sv, SVt_PVMG);
225 if (!(mg = mg_find(sv, PERL_MAGIC_regex_global))) {
226 sv_magic(sv, Nullsv, PERL_MAGIC_regex_global, Nullch, 0);
227 mg = mg_find(sv, PERL_MAGIC_regex_global);
228 }
229 i = m - orig;
230 if (DO_UTF8(sv))
231 sv_pos_b2u(sv, &i);
232 mg->mg_len = i;
233 }
234 cx->sb_rxtainted |= RX_MATCH_TAINTED(rx);
235 rxres_save(&cx->sb_rxres, rx);
236 RETURNOP(pm->op_pmreplstart);
237}
238
239void
240Perl_rxres_save(pTHX_ void **rsp, REGEXP *rx)
241{
242 UV *p = (UV*)*rsp;
243 U32 i;
244
245 if (!p || p[1] < rx->nparens) {
246 i = 6 + rx->nparens * 2;
247 if (!p)
248 New(501, p, i, UV);
249 else
250 Renew(p, i, UV);
251 *rsp = (void*)p;
252 }
253
254 *p++ = PTR2UV(RX_MATCH_COPIED(rx) ? rx->subbeg : Nullch);
255 RX_MATCH_COPIED_off(rx);
256
257 *p++ = rx->nparens;
258
259 *p++ = PTR2UV(rx->subbeg);
260 *p++ = (UV)rx->sublen;
261 for (i = 0; i <= rx->nparens; ++i) {
262 *p++ = (UV)rx->startp[i];
263 *p++ = (UV)rx->endp[i];
264 }
265}
266
267void
268Perl_rxres_restore(pTHX_ void **rsp, REGEXP *rx)
269{
270 UV *p = (UV*)*rsp;
271 U32 i;
272
273 if (RX_MATCH_COPIED(rx))
274 Safefree(rx->subbeg);
275 RX_MATCH_COPIED_set(rx, *p);
276 *p++ = 0;
277
278 rx->nparens = *p++;
279
280 rx->subbeg = INT2PTR(char*,*p++);
281 rx->sublen = (I32)(*p++);
282 for (i = 0; i <= rx->nparens; ++i) {
283 rx->startp[i] = (I32)(*p++);
284 rx->endp[i] = (I32)(*p++);
285 }
286}
287
288void
289Perl_rxres_free(pTHX_ void **rsp)
290{
291 UV *p = (UV*)*rsp;
292
293 if (p) {
294 Safefree(INT2PTR(char*,*p));
295 Safefree(p);
296 *rsp = Null(void*);
297 }
298}
299
300PP(pp_formline)
301{
302 dSP; dMARK; dORIGMARK;
303 register SV *tmpForm = *++MARK;
304 register U16 *fpc;
305 register char *t;
306 register char *f;
307 register char *s;
308 register char *send;
309 register I32 arg;
310 register SV *sv = Nullsv;
311 char *item = Nullch;
312 I32 itemsize = 0;
313 I32 fieldsize = 0;
314 I32 lines = 0;
315 bool chopspace = (strchr(PL_chopset, ' ') != Nullch);
316 char *chophere = Nullch;
317 char *linemark = Nullch;
318 NV value;
319 bool gotsome = FALSE;
320 STRLEN len;
321 STRLEN fudge = SvCUR(tmpForm) * (IN_BYTES ? 1 : 3) + 1;
322 bool item_is_utf = FALSE;
323
324 if (!SvMAGICAL(tmpForm) || !SvCOMPILED(tmpForm)) {
325 if (SvREADONLY(tmpForm)) {
326 SvREADONLY_off(tmpForm);
327 doparseform(tmpForm);
328 SvREADONLY_on(tmpForm);
329 }
330 else
331 doparseform(tmpForm);
332 }
333
334 SvPV_force(PL_formtarget, len);
335 t = SvGROW(PL_formtarget, len + fudge + 1); /* XXX SvCUR bad */
336 t += len;
337 f = SvPV(tmpForm, len);
338 /* need to jump to the next word */
339 s = f + len + WORD_ALIGN - SvCUR(tmpForm) % WORD_ALIGN;
340
341 fpc = (U16*)s;
342
343 for (;;) {
344 DEBUG_f( {
345 char *name = "???";
346 arg = -1;
347 switch (*fpc) {
348 case FF_LITERAL: arg = fpc[1]; name = "LITERAL"; break;
349 case FF_BLANK: arg = fpc[1]; name = "BLANK"; break;
350 case FF_SKIP: arg = fpc[1]; name = "SKIP"; break;
351 case FF_FETCH: arg = fpc[1]; name = "FETCH"; break;
352 case FF_DECIMAL: arg = fpc[1]; name = "DECIMAL"; break;
353
354 case FF_CHECKNL: name = "CHECKNL"; break;
355 case FF_CHECKCHOP: name = "CHECKCHOP"; break;
356 case FF_SPACE: name = "SPACE"; break;
357 case FF_HALFSPACE: name = "HALFSPACE"; break;
358 case FF_ITEM: name = "ITEM"; break;
359 case FF_CHOP: name = "CHOP"; break;
360 case FF_LINEGLOB: name = "LINEGLOB"; break;
361 case FF_NEWLINE: name = "NEWLINE"; break;
362 case FF_MORE: name = "MORE"; break;
363 case FF_LINEMARK: name = "LINEMARK"; break;
364 case FF_END: name = "END"; break;
365 case FF_0DECIMAL: name = "0DECIMAL"; break;
366 }
367 if (arg >= 0)
368 PerlIO_printf(Perl_debug_log, "%-16s%ld\n", name, (long) arg);
369 else
370 PerlIO_printf(Perl_debug_log, "%-16s\n", name);
371 } );
372 switch (*fpc++) {
373 case FF_LINEMARK:
374 linemark = t;
375 lines++;
376 gotsome = FALSE;
377 break;
378
379 case FF_LITERAL:
380 arg = *fpc++;
381 while (arg--)
382 *t++ = *f++;
383 break;
384
385 case FF_SKIP:
386 f += *fpc++;
387 break;
388
389 case FF_FETCH:
390 arg = *fpc++;
391 f += arg;
392 fieldsize = arg;
393
394 if (MARK < SP)
395 sv = *++MARK;
396 else {
397 sv = &PL_sv_no;
398 if (ckWARN(WARN_SYNTAX))
399 Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "Not enough format arguments");
400 }
401 break;
402
403 case FF_CHECKNL:
404 item = s = SvPV(sv, len);
405 itemsize = len;
406 if (DO_UTF8(sv)) {
407 itemsize = sv_len_utf8(sv);
408 if (itemsize != len) {
409 I32 itembytes;
410 if (itemsize > fieldsize) {
411 itemsize = fieldsize;
412 itembytes = itemsize;
413 sv_pos_u2b(sv, &itembytes, 0);
414 }
415 else
416 itembytes = len;
417 send = chophere = s + itembytes;
418 while (s < send) {
419 if (*s & ~31)
420 gotsome = TRUE;
421 else if (*s == '\n')
422 break;
423 s++;
424 }
425 item_is_utf = TRUE;
426 itemsize = s - item;
427 sv_pos_b2u(sv, &itemsize);
428 break;
429 }
430 }
431 item_is_utf = FALSE;
432 if (itemsize > fieldsize)
433 itemsize = fieldsize;
434 send = chophere = s + itemsize;
435 while (s < send) {
436 if (*s & ~31)
437 gotsome = TRUE;
438 else if (*s == '\n')
439 break;
440 s++;
441 }
442 itemsize = s - item;
443 break;
444
445 case FF_CHECKCHOP:
446 item = s = SvPV(sv, len);
447 itemsize = len;
448 if (DO_UTF8(sv)) {
449 itemsize = sv_len_utf8(sv);
450 if (itemsize != len) {
451 I32 itembytes;
452 if (itemsize <= fieldsize) {
453 send = chophere = s + itemsize;
454 while (s < send) {
455 if (*s == '\r') {
456 itemsize = s - item;
457 break;
458 }
459 if (*s++ & ~31)
460 gotsome = TRUE;
461 }
462 }
463 else {
464 itemsize = fieldsize;
465 itembytes = itemsize;
466 sv_pos_u2b(sv, &itembytes, 0);
467 send = chophere = s + itembytes;
468 while (s < send || (s == send && isSPACE(*s))) {
469 if (isSPACE(*s)) {
470 if (chopspace)
471 chophere = s;
472 if (*s == '\r')
473 break;
474 }
475 else {
476 if (*s & ~31)
477 gotsome = TRUE;
478 if (strchr(PL_chopset, *s))
479 chophere = s + 1;
480 }
481 s++;
482 }
483 itemsize = chophere - item;
484 sv_pos_b2u(sv, &itemsize);
485 }
486 item_is_utf = TRUE;
487 break;
488 }
489 }
490 item_is_utf = FALSE;
491 if (itemsize <= fieldsize) {
492 send = chophere = s + itemsize;
493 while (s < send) {
494 if (*s == '\r') {
495 itemsize = s - item;
496 break;
497 }
498 if (*s++ & ~31)
499 gotsome = TRUE;
500 }
501 }
502 else {
503 itemsize = fieldsize;
504 send = chophere = s + itemsize;
505 while (s < send || (s == send && isSPACE(*s))) {
506 if (isSPACE(*s)) {
507 if (chopspace)
508 chophere = s;
509 if (*s == '\r')
510 break;
511 }
512 else {
513 if (*s & ~31)
514 gotsome = TRUE;
515 if (strchr(PL_chopset, *s))
516 chophere = s + 1;
517 }
518 s++;
519 }
520 itemsize = chophere - item;
521 }
522 break;
523
524 case FF_SPACE:
525 arg = fieldsize - itemsize;
526 if (arg) {
527 fieldsize -= arg;
528 while (arg-- > 0)
529 *t++ = ' ';
530 }
531 break;
532
533 case FF_HALFSPACE:
534 arg = fieldsize - itemsize;
535 if (arg) {
536 arg /= 2;
537 fieldsize -= arg;
538 while (arg-- > 0)
539 *t++ = ' ';
540 }
541 break;
542
543 case FF_ITEM:
544 arg = itemsize;
545 s = item;
546 if (item_is_utf) {
547 while (arg--) {
548 if (UTF8_IS_CONTINUED(*s)) {
549 STRLEN skip = UTF8SKIP(s);
550 switch (skip) {
551 default:
552 Move(s,t,skip,char);
553 s += skip;
554 t += skip;
555 break;
556 case 7: *t++ = *s++;
557 case 6: *t++ = *s++;
558 case 5: *t++ = *s++;
559 case 4: *t++ = *s++;
560 case 3: *t++ = *s++;
561 case 2: *t++ = *s++;
562 case 1: *t++ = *s++;
563 }
564 }
565 else {
566 if ( !((*t++ = *s++) & ~31) )
567 t[-1] = ' ';
568 }
569 }
570 break;
571 }
572 while (arg--) {
573#ifdef EBCDIC
574 int ch = *t++ = *s++;
575 if (iscntrl(ch))
576#else
577 if ( !((*t++ = *s++) & ~31) )
578#endif
579 t[-1] = ' ';
580 }
581 break;
582
583 case FF_CHOP:
584 s = chophere;
585 if (chopspace) {
586 while (*s && isSPACE(*s))
587 s++;
588 }
589 sv_chop(sv,s);
590 break;
591
592 case FF_LINEGLOB:
593 item = s = SvPV(sv, len);
594 itemsize = len;
595 item_is_utf = FALSE; /* XXX is this correct? */
596 if (itemsize) {
597 gotsome = TRUE;
598 send = s + itemsize;
599 while (s < send) {
600 if (*s++ == '\n') {
601 if (s == send)
602 itemsize--;
603 else
604 lines++;
605 }
606 }
607 SvCUR_set(PL_formtarget, t - SvPVX(PL_formtarget));
608 sv_catpvn(PL_formtarget, item, itemsize);
609 SvGROW(PL_formtarget, SvCUR(PL_formtarget) + fudge + 1);
610 t = SvPVX(PL_formtarget) + SvCUR(PL_formtarget);
611 }
612 break;
613
614 case FF_DECIMAL:
615 /* If the field is marked with ^ and the value is undefined,
616 blank it out. */
617 arg = *fpc++;
618 if ((arg & 512) && !SvOK(sv)) {
619 arg = fieldsize;
620 while (arg--)
621 *t++ = ' ';
622 break;
623 }
624 gotsome = TRUE;
625 value = SvNV(sv);
626 /* Formats aren't yet marked for locales, so assume "yes". */
627 {
628 STORE_NUMERIC_STANDARD_SET_LOCAL();
629#if defined(USE_LONG_DOUBLE)
630 if (arg & 256) {
631 sprintf(t, "%#*.*" PERL_PRIfldbl,
632 (int) fieldsize, (int) arg & 255, value);
633 } else {
634 sprintf(t, "%*.0" PERL_PRIfldbl, (int) fieldsize, value);
635 }
636#else
637 if (arg & 256) {
638 sprintf(t, "%#*.*f",
639 (int) fieldsize, (int) arg & 255, value);
640 } else {
641 sprintf(t, "%*.0f",
642 (int) fieldsize, value);
643 }
644#endif
645 RESTORE_NUMERIC_STANDARD();
646 }
647 t += fieldsize;
648 break;
649
650 case FF_0DECIMAL:
651 /* If the field is marked with ^ and the value is undefined,
652 blank it out. */
653 arg = *fpc++;
654 if ((arg & 512) && !SvOK(sv)) {
655 arg = fieldsize;
656 while (arg--)
657 *t++ = ' ';
658 break;
659 }
660 gotsome = TRUE;
661 value = SvNV(sv);
662 /* Formats aren't yet marked for locales, so assume "yes". */
663 {
664 STORE_NUMERIC_STANDARD_SET_LOCAL();
665#if defined(USE_LONG_DOUBLE)
666 if (arg & 256) {
667 sprintf(t, "%#0*.*" PERL_PRIfldbl,
668 (int) fieldsize, (int) arg & 255, value);
669/* is this legal? I don't have long doubles */
670 } else {
671 sprintf(t, "%0*.0" PERL_PRIfldbl, (int) fieldsize, value);
672 }
673#else
674 if (arg & 256) {
675 sprintf(t, "%#0*.*f",
676 (int) fieldsize, (int) arg & 255, value);
677 } else {
678 sprintf(t, "%0*.0f",
679 (int) fieldsize, value);
680 }
681#endif
682 RESTORE_NUMERIC_STANDARD();
683 }
684 t += fieldsize;
685 break;
686
687 case FF_NEWLINE:
688 f++;
689 while (t-- > linemark && *t == ' ') ;
690 t++;
691 *t++ = '\n';
692 break;
693
694 case FF_BLANK:
695 arg = *fpc++;
696 if (gotsome) {
697 if (arg) { /* repeat until fields exhausted? */
698 *t = '\0';
699 SvCUR_set(PL_formtarget, t - SvPVX(PL_formtarget));
700 lines += FmLINES(PL_formtarget);
701 if (lines == 200) {
702 arg = t - linemark;
703 if (strnEQ(linemark, linemark - arg, arg))
704 DIE(aTHX_ "Runaway format");
705 }
706 FmLINES(PL_formtarget) = lines;
707 SP = ORIGMARK;
708 RETURNOP(cLISTOP->op_first);
709 }
710 }
711 else {
712 t = linemark;
713 lines--;
714 }
715 break;
716
717 case FF_MORE:
718 s = chophere;
719 send = item + len;
720 if (chopspace) {
721 while (*s && isSPACE(*s) && s < send)
722 s++;
723 }
724 if (s < send) {
725 arg = fieldsize - itemsize;
726 if (arg) {
727 fieldsize -= arg;
728 while (arg-- > 0)
729 *t++ = ' ';
730 }
731 s = t - 3;
732 if (strnEQ(s," ",3)) {
733 while (s > SvPVX(PL_formtarget) && isSPACE(s[-1]))
734 s--;
735 }
736 *s++ = '.';
737 *s++ = '.';
738 *s++ = '.';
739 }
740 break;
741
742 case FF_END:
743 *t = '\0';
744 SvCUR_set(PL_formtarget, t - SvPVX(PL_formtarget));
745 FmLINES(PL_formtarget) += lines;
746 SP = ORIGMARK;
747 RETPUSHYES;
748 }
749 }
750}
751
752PP(pp_grepstart)
753{
754 dSP;
755 SV *src;
756
757 if (PL_stack_base + *PL_markstack_ptr == SP) {
758 (void)POPMARK;
759 if (GIMME_V == G_SCALAR)
760 XPUSHs(sv_2mortal(newSViv(0)));
761 RETURNOP(PL_op->op_next->op_next);
762 }
763 PL_stack_sp = PL_stack_base + *PL_markstack_ptr + 1;
764 pp_pushmark(); /* push dst */
765 pp_pushmark(); /* push src */
766 ENTER; /* enter outer scope */
767
768 SAVETMPS;
769 /* SAVE_DEFSV does *not* suffice here for USE_5005THREADS */
770 SAVESPTR(DEFSV);
771 ENTER; /* enter inner scope */
772 SAVEVPTR(PL_curpm);
773
774 src = PL_stack_base[*PL_markstack_ptr];
775 SvTEMP_off(src);
776 DEFSV = src;
777
778 PUTBACK;
779 if (PL_op->op_type == OP_MAPSTART)
780 pp_pushmark(); /* push top */
781 return ((LOGOP*)PL_op->op_next)->op_other;
782}
783
784PP(pp_mapstart)
785{
786 DIE(aTHX_ "panic: mapstart"); /* uses grepstart */
787}
788
789PP(pp_mapwhile)
790{
791 dSP;
792 I32 items = (SP - PL_stack_base) - *PL_markstack_ptr; /* how many new items */
793 I32 count;
794 I32 shift;
795 SV** src;
796 SV** dst;
797
798 /* first, move source pointer to the next item in the source list */
799 ++PL_markstack_ptr[-1];
800
801 /* if there are new items, push them into the destination list */
802 if (items) {
803 /* might need to make room back there first */
804 if (items > PL_markstack_ptr[-1] - PL_markstack_ptr[-2]) {
805 /* XXX this implementation is very pessimal because the stack
806 * is repeatedly extended for every set of items. Is possible
807 * to do this without any stack extension or copying at all
808 * by maintaining a separate list over which the map iterates
809 * (like foreach does). --gsar */
810
811 /* everything in the stack after the destination list moves
812 * towards the end the stack by the amount of room needed */
813 shift = items - (PL_markstack_ptr[-1] - PL_markstack_ptr[-2]);
814
815 /* items to shift up (accounting for the moved source pointer) */
816 count = (SP - PL_stack_base) - (PL_markstack_ptr[-1] - 1);
817
818 /* This optimization is by Ben Tilly and it does
819 * things differently from what Sarathy (gsar)
820 * is describing. The downside of this optimization is
821 * that leaves "holes" (uninitialized and hopefully unused areas)
822 * to the Perl stack, but on the other hand this
823 * shouldn't be a problem. If Sarathy's idea gets
824 * implemented, this optimization should become
825 * irrelevant. --jhi */
826 if (shift < count)
827 shift = count; /* Avoid shifting too often --Ben Tilly */
828
829 EXTEND(SP,shift);
830 src = SP;
831 dst = (SP += shift);
832 PL_markstack_ptr[-1] += shift;
833 *PL_markstack_ptr += shift;
834 while (count--)
835 *dst-- = *src--;
836 }
837 /* copy the new items down to the destination list */
838 dst = PL_stack_base + (PL_markstack_ptr[-2] += items) - 1;
839 while (items--)
840 *dst-- = SvTEMP(TOPs) ? POPs : sv_mortalcopy(POPs);
841 }
842 LEAVE; /* exit inner scope */
843
844 /* All done yet? */
845 if (PL_markstack_ptr[-1] > *PL_markstack_ptr) {
846 I32 gimme = GIMME_V;
847
848 (void)POPMARK; /* pop top */
849 LEAVE; /* exit outer scope */
850 (void)POPMARK; /* pop src */
851 items = --*PL_markstack_ptr - PL_markstack_ptr[-1];
852 (void)POPMARK; /* pop dst */
853 SP = PL_stack_base + POPMARK; /* pop original mark */
854 if (gimme == G_SCALAR) {
855 dTARGET;
856 XPUSHi(items);
857 }
858 else if (gimme == G_ARRAY)
859 SP += items;
860 RETURN;
861 }
862 else {
863 SV *src;
864
865 ENTER; /* enter inner scope */
866 SAVEVPTR(PL_curpm);
867
868 /* set $_ to the new source item */
869 src = PL_stack_base[PL_markstack_ptr[-1]];
870 SvTEMP_off(src);
871 DEFSV = src;
872
873 RETURNOP(cLOGOP->op_other);
874 }
875}
876
877/* Range stuff. */
878
879PP(pp_range)
880{
881 if (GIMME == G_ARRAY)
882 return NORMAL;
883 if (SvTRUEx(PAD_SV(PL_op->op_targ)))
884 return cLOGOP->op_other;
885 else
886 return NORMAL;
887}
888
889PP(pp_flip)
890{
891 dSP;
892
893 if (GIMME == G_ARRAY) {
894 RETURNOP(((LOGOP*)cUNOP->op_first)->op_other);
895 }
896 else {
897 dTOPss;
898 SV *targ = PAD_SV(PL_op->op_targ);
899 int flip = 0;
900
901 if (PL_op->op_private & OPpFLIP_LINENUM) {
902 if (GvIO(PL_last_in_gv)) {
903 flip = SvIV(sv) == (IV)IoLINES(GvIOp(PL_last_in_gv));
904 }
905 else {
906 GV *gv = gv_fetchpv(".", TRUE, SVt_PV);
907 if (gv && GvSV(gv)) flip = SvIV(sv) == SvIV(GvSV(gv));
908 }
909 } else {
910 flip = SvTRUE(sv);
911 }
912 if (flip) {
913 sv_setiv(PAD_SV(cUNOP->op_first->op_targ), 1);
914 if (PL_op->op_flags & OPf_SPECIAL) {
915 sv_setiv(targ, 1);
916 SETs(targ);
917 RETURN;
918 }
919 else {
920 sv_setiv(targ, 0);
921 SP--;
922 RETURNOP(((LOGOP*)cUNOP->op_first)->op_other);
923 }
924 }
925 sv_setpv(TARG, "");
926 SETs(targ);
927 RETURN;
928 }
929}
930
931PP(pp_flop)
932{
933 dSP;
934
935 if (GIMME == G_ARRAY) {
936 dPOPPOPssrl;
937 register I32 i, j;
938 register SV *sv;
939 I32 max;
940
941 if (SvGMAGICAL(left))
942 mg_get(left);
943 if (SvGMAGICAL(right))
944 mg_get(right);
945
946 if (SvNIOKp(left) || !SvPOKp(left) ||
947 SvNIOKp(right) || !SvPOKp(right) ||
948 (looks_like_number(left) && *SvPVX(left) != '0' &&
949 looks_like_number(right) && *SvPVX(right) != '0'))
950 {
951 if (SvNV(left) < IV_MIN || SvNV(right) > IV_MAX)
952 DIE(aTHX_ "Range iterator outside integer range");
953 i = SvIV(left);
954 max = SvIV(right);
955 if (max >= i) {
956 j = max - i + 1;
957 EXTEND_MORTAL(j);
958 EXTEND(SP, j);
959 }
960 else
961 j = 0;
962 while (j--) {
963 sv = sv_2mortal(newSViv(i++));
964 PUSHs(sv);
965 }
966 }
967 else {
968 SV *final = sv_mortalcopy(right);
969 STRLEN len, n_a;
970 char *tmps = SvPV(final, len);
971
972 sv = sv_mortalcopy(left);
973 SvPV_force(sv,n_a);
974 while (!SvNIOKp(sv) && SvCUR(sv) <= len) {
975 XPUSHs(sv);
976 if (strEQ(SvPVX(sv),tmps))
977 break;
978 sv = sv_2mortal(newSVsv(sv));
979 sv_inc(sv);
980 }
981 }
982 }
983 else {
984 dTOPss;
985 SV *targ = PAD_SV(cUNOP->op_first->op_targ);
986 int flop = 0;
987 sv_inc(targ);
988
989 if (PL_op->op_private & OPpFLIP_LINENUM) {
990 if (GvIO(PL_last_in_gv)) {
991 flop = SvIV(sv) == (IV)IoLINES(GvIOp(PL_last_in_gv));
992 }
993 else {
994 GV *gv = gv_fetchpv(".", TRUE, SVt_PV);
995 if (gv && GvSV(gv)) flop = SvIV(sv) == SvIV(GvSV(gv));
996 }
997 }
998 else {
999 flop = SvTRUE(sv);
1000 }
1001
1002 if (flop) {
1003 sv_setiv(PAD_SV(((UNOP*)cUNOP->op_first)->op_first->op_targ), 0);
1004 sv_catpv(targ, "E0");
1005 }
1006 SETs(targ);
1007 }
1008
1009 RETURN;
1010}
1011
1012/* Control. */
1013
1014STATIC I32
1015S_dopoptolabel(pTHX_ char *label)
1016{
1017 register I32 i;
1018 register PERL_CONTEXT *cx;
1019
1020 for (i = cxstack_ix; i >= 0; i--) {
1021 cx = &cxstack[i];
1022 switch (CxTYPE(cx)) {
1023 case CXt_SUBST:
1024 if (ckWARN(WARN_EXITING))
1025 Perl_warner(aTHX_ packWARN(WARN_EXITING), "Exiting substitution via %s",
1026 OP_NAME(PL_op));
1027 break;
1028 case CXt_SUB:
1029 if (ckWARN(WARN_EXITING))
1030 Perl_warner(aTHX_ packWARN(WARN_EXITING), "Exiting subroutine via %s",
1031 OP_NAME(PL_op));
1032 break;
1033 case CXt_FORMAT:
1034 if (ckWARN(WARN_EXITING))
1035 Perl_warner(aTHX_ packWARN(WARN_EXITING), "Exiting format via %s",
1036 OP_NAME(PL_op));
1037 break;
1038 case CXt_EVAL:
1039 if (ckWARN(WARN_EXITING))
1040 Perl_warner(aTHX_ packWARN(WARN_EXITING), "Exiting eval via %s",
1041 OP_NAME(PL_op));
1042 break;
1043 case CXt_NULL:
1044 if (ckWARN(WARN_EXITING))
1045 Perl_warner(aTHX_ packWARN(WARN_EXITING), "Exiting pseudo-block via %s",
1046 OP_NAME(PL_op));
1047 return -1;
1048 case CXt_LOOP:
1049 if (!cx->blk_loop.label ||
1050 strNE(label, cx->blk_loop.label) ) {
1051 DEBUG_l(Perl_deb(aTHX_ "(Skipping label #%ld %s)\n",
1052 (long)i, cx->blk_loop.label));
1053 continue;
1054 }
1055 DEBUG_l( Perl_deb(aTHX_ "(Found label #%ld %s)\n", (long)i, label));
1056 return i;
1057 }
1058 }
1059 return i;
1060}
1061
1062I32
1063Perl_dowantarray(pTHX)
1064{
1065 I32 gimme = block_gimme();
1066 return (gimme == G_VOID) ? G_SCALAR : gimme;
1067}
1068
1069I32
1070Perl_block_gimme(pTHX)
1071{
1072 I32 cxix;
1073
1074 cxix = dopoptosub(cxstack_ix);
1075 if (cxix < 0)
1076 return G_VOID;
1077
1078 switch (cxstack[cxix].blk_gimme) {
1079 case G_VOID:
1080 return G_VOID;
1081 case G_SCALAR:
1082 return G_SCALAR;
1083 case G_ARRAY:
1084 return G_ARRAY;
1085 default:
1086 Perl_croak(aTHX_ "panic: bad gimme: %d\n", cxstack[cxix].blk_gimme);
1087 /* NOTREACHED */
1088 return 0;
1089 }
1090}
1091
1092I32
1093Perl_is_lvalue_sub(pTHX)
1094{
1095 I32 cxix;
1096
1097 cxix = dopoptosub(cxstack_ix);
1098 assert(cxix >= 0); /* We should only be called from inside subs */
1099
1100 if (cxstack[cxix].blk_sub.lval && CvLVALUE(cxstack[cxix].blk_sub.cv))
1101 return cxstack[cxix].blk_sub.lval;
1102 else
1103 return 0;
1104}
1105
1106STATIC I32
1107S_dopoptosub(pTHX_ I32 startingblock)
1108{
1109 return dopoptosub_at(cxstack, startingblock);
1110}
1111
1112STATIC I32
1113S_dopoptosub_at(pTHX_ PERL_CONTEXT *cxstk, I32 startingblock)
1114{
1115 I32 i;
1116 register PERL_CONTEXT *cx;
1117 for (i = startingblock; i >= 0; i--) {
1118 cx = &cxstk[i];
1119 switch (CxTYPE(cx)) {
1120 default:
1121 continue;
1122 case CXt_EVAL:
1123 case CXt_SUB:
1124 case CXt_FORMAT:
1125 DEBUG_l( Perl_deb(aTHX_ "(Found sub #%ld)\n", (long)i));
1126 return i;
1127 }
1128 }
1129 return i;
1130}
1131
1132STATIC I32
1133S_dopoptoeval(pTHX_ I32 startingblock)
1134{
1135 I32 i;
1136 register PERL_CONTEXT *cx;
1137 for (i = startingblock; i >= 0; i--) {
1138 cx = &cxstack[i];
1139 switch (CxTYPE(cx)) {
1140 default:
1141 continue;
1142 case CXt_EVAL:
1143 DEBUG_l( Perl_deb(aTHX_ "(Found eval #%ld)\n", (long)i));
1144 return i;
1145 }
1146 }
1147 return i;
1148}
1149
1150STATIC I32
1151S_dopoptoloop(pTHX_ I32 startingblock)
1152{
1153 I32 i;
1154 register PERL_CONTEXT *cx;
1155 for (i = startingblock; i >= 0; i--) {
1156 cx = &cxstack[i];
1157 switch (CxTYPE(cx)) {
1158 case CXt_SUBST:
1159 if (ckWARN(WARN_EXITING))
1160 Perl_warner(aTHX_ packWARN(WARN_EXITING), "Exiting substitution via %s",
1161 OP_NAME(PL_op));
1162 break;
1163 case CXt_SUB:
1164 if (ckWARN(WARN_EXITING))
1165 Perl_warner(aTHX_ packWARN(WARN_EXITING), "Exiting subroutine via %s",
1166 OP_NAME(PL_op));
1167 break;
1168 case CXt_FORMAT:
1169 if (ckWARN(WARN_EXITING))
1170 Perl_warner(aTHX_ packWARN(WARN_EXITING), "Exiting format via %s",
1171 OP_NAME(PL_op));
1172 break;
1173 case CXt_EVAL:
1174 if (ckWARN(WARN_EXITING))
1175 Perl_warner(aTHX_ packWARN(WARN_EXITING), "Exiting eval via %s",
1176 OP_NAME(PL_op));
1177 break;
1178 case CXt_NULL:
1179 if (ckWARN(WARN_EXITING))
1180 Perl_warner(aTHX_ packWARN(WARN_EXITING), "Exiting pseudo-block via %s",
1181 OP_NAME(PL_op));
1182 return -1;
1183 case CXt_LOOP:
1184 DEBUG_l( Perl_deb(aTHX_ "(Found loop #%ld)\n", (long)i));
1185 return i;
1186 }
1187 }
1188 return i;
1189}
1190
1191void
1192Perl_dounwind(pTHX_ I32 cxix)
1193{
1194 register PERL_CONTEXT *cx;
1195 I32 optype;
1196
1197 while (cxstack_ix > cxix) {
1198 SV *sv;
1199 cx = &cxstack[cxstack_ix];
1200 DEBUG_l(PerlIO_printf(Perl_debug_log, "Unwinding block %ld, type %s\n",
1201 (long) cxstack_ix, PL_block_type[CxTYPE(cx)]));
1202 /* Note: we don't need to restore the base context info till the end. */
1203 switch (CxTYPE(cx)) {
1204 case CXt_SUBST:
1205 POPSUBST(cx);
1206 continue; /* not break */
1207 case CXt_SUB:
1208 POPSUB(cx,sv);
1209 LEAVESUB(sv);
1210 break;
1211 case CXt_EVAL:
1212 POPEVAL(cx);
1213 break;
1214 case CXt_LOOP:
1215 POPLOOP(cx);
1216 break;
1217 case CXt_NULL:
1218 break;
1219 case CXt_FORMAT:
1220 POPFORMAT(cx);
1221 break;
1222 }
1223 cxstack_ix--;
1224 }
1225}
1226
1227void
1228Perl_qerror(pTHX_ SV *err)
1229{
1230 if (PL_in_eval)
1231 sv_catsv(ERRSV, err);
1232 else if (PL_errors)
1233 sv_catsv(PL_errors, err);
1234 else
1235 Perl_warn(aTHX_ "%"SVf, err);
1236 ++PL_error_count;
1237}
1238
1239OP *
1240Perl_die_where(pTHX_ char *message, STRLEN msglen)
1241{
1242 STRLEN n_a;
1243 IO *io;
1244 MAGIC *mg;
1245
1246 if (PL_in_eval) {
1247 I32 cxix;
1248 register PERL_CONTEXT *cx;
1249 I32 gimme;
1250 SV **newsp;
1251
1252 if (message) {
1253 if (PL_in_eval & EVAL_KEEPERR) {
1254 static char prefix[] = "\t(in cleanup) ";
1255 SV *err = ERRSV;
1256 char *e = Nullch;
1257 if (!SvPOK(err))
1258 sv_setpv(err,"");
1259 else if (SvCUR(err) >= sizeof(prefix)+msglen-1) {
1260 e = SvPV(err, n_a);
1261 e += n_a - msglen;
1262 if (*e != *message || strNE(e,message))
1263 e = Nullch;
1264 }
1265 if (!e) {
1266 SvGROW(err, SvCUR(err)+sizeof(prefix)+msglen);
1267 sv_catpvn(err, prefix, sizeof(prefix)-1);
1268 sv_catpvn(err, message, msglen);
1269 if (ckWARN(WARN_MISC)) {
1270 STRLEN start = SvCUR(err)-msglen-sizeof(prefix)+1;
1271 Perl_warner(aTHX_ packWARN(WARN_MISC), SvPVX(err)+start);
1272 }
1273 }
1274 }
1275 else {
1276 sv_setpvn(ERRSV, message, msglen);
1277 }
1278 }
1279 else
1280 message = SvPVx(ERRSV, msglen);
1281
1282 while ((cxix = dopoptoeval(cxstack_ix)) < 0
1283 && PL_curstackinfo->si_prev)
1284 {
1285 dounwind(-1);
1286 POPSTACK;
1287 }
1288
1289 if (cxix >= 0) {
1290 I32 optype;
1291
1292 if (cxix < cxstack_ix)
1293 dounwind(cxix);
1294
1295 POPBLOCK(cx,PL_curpm);
1296 if (CxTYPE(cx) != CXt_EVAL) {
1297 PerlIO_write(Perl_error_log, "panic: die ", 11);
1298 PerlIO_write(Perl_error_log, message, msglen);
1299 my_exit(1);
1300 }
1301 POPEVAL(cx);
1302
1303 if (gimme == G_SCALAR)
1304 *++newsp = &PL_sv_undef;
1305 PL_stack_sp = newsp;
1306
1307 LEAVE;
1308
1309 /* LEAVE could clobber PL_curcop (see save_re_context())
1310 * XXX it might be better to find a way to avoid messing with
1311 * PL_curcop in save_re_context() instead, but this is a more
1312 * minimal fix --GSAR */
1313 PL_curcop = cx->blk_oldcop;
1314
1315 if (optype == OP_REQUIRE) {
1316 char* msg = SvPVx(ERRSV, n_a);
1317 DIE(aTHX_ "%sCompilation failed in require",
1318 *msg ? msg : "Unknown error\n");
1319 }
1320 return pop_return();
1321 }
1322 }
1323 if (!message)
1324 message = SvPVx(ERRSV, msglen);
1325
1326 /* if STDERR is tied, print to it instead */
1327 if (PL_stderrgv && (io = GvIOp(PL_stderrgv))
1328 && (mg = SvTIED_mg((SV*)io, PERL_MAGIC_tiedscalar))) {
1329 dSP; ENTER;
1330 PUSHMARK(SP);
1331 XPUSHs(SvTIED_obj((SV*)io, mg));
1332 XPUSHs(sv_2mortal(newSVpvn(message, msglen)));
1333 PUTBACK;
1334 call_method("PRINT", G_SCALAR);
1335 LEAVE;
1336 }
1337 else {
1338#ifdef USE_SFIO
1339 /* SFIO can really mess with your errno */
1340 int e = errno;
1341#endif
1342 PerlIO *serr = Perl_error_log;
1343
1344 PERL_WRITE_MSG_TO_CONSOLE(serr, message, msglen);
1345 (void)PerlIO_flush(serr);
1346#ifdef USE_SFIO
1347 errno = e;
1348#endif
1349 }
1350 my_failure_exit();
1351 /* NOTREACHED */
1352 return 0;
1353}
1354
1355PP(pp_xor)
1356{
1357 dSP; dPOPTOPssrl;
1358 if (SvTRUE(left) != SvTRUE(right))
1359 RETSETYES;
1360 else
1361 RETSETNO;
1362}
1363
1364PP(pp_andassign)
1365{
1366 dSP;
1367 if (!SvTRUE(TOPs))
1368 RETURN;
1369 else
1370 RETURNOP(cLOGOP->op_other);
1371}
1372
1373PP(pp_orassign)
1374{
1375 dSP;
1376 if (SvTRUE(TOPs))
1377 RETURN;
1378 else
1379 RETURNOP(cLOGOP->op_other);
1380}
1381
1382PP(pp_caller)
1383{
1384 dSP;
1385 register I32 cxix = dopoptosub(cxstack_ix);
1386 register PERL_CONTEXT *cx;
1387 register PERL_CONTEXT *ccstack = cxstack;
1388 PERL_SI *top_si = PL_curstackinfo;
1389 I32 dbcxix;
1390 I32 gimme;
1391 char *stashname;
1392 SV *sv;
1393 I32 count = 0;
1394
1395 if (MAXARG)
1396 count = POPi;
1397
1398 for (;;) {
1399 /* we may be in a higher stacklevel, so dig down deeper */
1400 while (cxix < 0 && top_si->si_type != PERLSI_MAIN) {
1401 top_si = top_si->si_prev;
1402 ccstack = top_si->si_cxstack;
1403 cxix = dopoptosub_at(ccstack, top_si->si_cxix);
1404 }
1405 if (cxix < 0) {
1406 if (GIMME != G_ARRAY) {
1407 EXTEND(SP, 1);
1408 RETPUSHUNDEF;
1409 }
1410 RETURN;
1411 }
1412 if (PL_DBsub && cxix >= 0 &&
1413 ccstack[cxix].blk_sub.cv == GvCV(PL_DBsub))
1414 count++;
1415 if (!count--)
1416 break;
1417 cxix = dopoptosub_at(ccstack, cxix - 1);
1418 }
1419
1420 cx = &ccstack[cxix];
1421 if (CxTYPE(cx) == CXt_SUB || CxTYPE(cx) == CXt_FORMAT) {
1422 dbcxix = dopoptosub_at(ccstack, cxix - 1);
1423 /* We expect that ccstack[dbcxix] is CXt_SUB, anyway, the
1424 field below is defined for any cx. */
1425 if (PL_DBsub && dbcxix >= 0 && ccstack[dbcxix].blk_sub.cv == GvCV(PL_DBsub))
1426 cx = &ccstack[dbcxix];
1427 }
1428
1429 stashname = CopSTASHPV(cx->blk_oldcop);
1430 if (GIMME != G_ARRAY) {
1431 EXTEND(SP, 1);
1432 if (!stashname)
1433 PUSHs(&PL_sv_undef);
1434 else {
1435 dTARGET;
1436 sv_setpv(TARG, stashname);
1437 PUSHs(TARG);
1438 }
1439 RETURN;
1440 }
1441
1442 EXTEND(SP, 10);
1443
1444 if (!stashname)
1445 PUSHs(&PL_sv_undef);
1446 else
1447 PUSHs(sv_2mortal(newSVpv(stashname, 0)));
1448 PUSHs(sv_2mortal(newSVpv(OutCopFILE(cx->blk_oldcop), 0)));
1449 PUSHs(sv_2mortal(newSViv((I32)CopLINE(cx->blk_oldcop))));
1450 if (!MAXARG)
1451 RETURN;
1452 if (CxTYPE(cx) == CXt_SUB || CxTYPE(cx) == CXt_FORMAT) {
1453 /* So is ccstack[dbcxix]. */
1454 sv = NEWSV(49, 0);
1455 gv_efullname3(sv, CvGV(ccstack[cxix].blk_sub.cv), Nullch);
1456 PUSHs(sv_2mortal(sv));
1457 PUSHs(sv_2mortal(newSViv((I32)cx->blk_sub.hasargs)));
1458 }
1459 else {
1460 PUSHs(sv_2mortal(newSVpvn("(eval)",6)));
1461 PUSHs(sv_2mortal(newSViv(0)));
1462 }
1463 gimme = (I32)cx->blk_gimme;
1464 if (gimme == G_VOID)
1465 PUSHs(&PL_sv_undef);
1466 else
1467 PUSHs(sv_2mortal(newSViv(gimme & G_ARRAY)));
1468 if (CxTYPE(cx) == CXt_EVAL) {
1469 /* eval STRING */
1470 if (cx->blk_eval.old_op_type == OP_ENTEREVAL) {
1471 PUSHs(cx->blk_eval.cur_text);
1472 PUSHs(&PL_sv_no);
1473 }
1474 /* require */
1475 else if (cx->blk_eval.old_namesv) {
1476 PUSHs(sv_2mortal(newSVsv(cx->blk_eval.old_namesv)));
1477 PUSHs(&PL_sv_yes);
1478 }
1479 /* eval BLOCK (try blocks have old_namesv == 0) */
1480 else {
1481 PUSHs(&PL_sv_undef);
1482 PUSHs(&PL_sv_undef);
1483 }
1484 }
1485 else {
1486 PUSHs(&PL_sv_undef);
1487 PUSHs(&PL_sv_undef);
1488 }
1489 if (CxTYPE(cx) == CXt_SUB && cx->blk_sub.hasargs
1490 && CopSTASH_eq(PL_curcop, PL_debstash))
1491 {
1492 AV *ary = cx->blk_sub.argarray;
1493 int off = AvARRAY(ary) - AvALLOC(ary);
1494
1495 if (!PL_dbargs) {
1496 GV* tmpgv;
1497 PL_dbargs = GvAV(gv_AVadd(tmpgv = gv_fetchpv("DB::args", TRUE,
1498 SVt_PVAV)));
1499 GvMULTI_on(tmpgv);
1500 AvREAL_off(PL_dbargs); /* XXX should be REIFY (see av.h) */
1501 }
1502
1503 if (AvMAX(PL_dbargs) < AvFILLp(ary) + off)
1504 av_extend(PL_dbargs, AvFILLp(ary) + off);
1505 Copy(AvALLOC(ary), AvARRAY(PL_dbargs), AvFILLp(ary) + 1 + off, SV*);
1506 AvFILLp(PL_dbargs) = AvFILLp(ary) + off;
1507 }
1508 /* XXX only hints propagated via op_private are currently
1509 * visible (others are not easily accessible, since they
1510 * use the global PL_hints) */
1511 PUSHs(sv_2mortal(newSViv((I32)cx->blk_oldcop->op_private &
1512 HINT_PRIVATE_MASK)));
1513 {
1514 SV * mask ;
1515 SV * old_warnings = cx->blk_oldcop->cop_warnings ;
1516
1517 if (old_warnings == pWARN_NONE ||
1518 (old_warnings == pWARN_STD && (PL_dowarn & G_WARN_ON) == 0))
1519 mask = newSVpvn(WARN_NONEstring, WARNsize) ;
1520 else if (old_warnings == pWARN_ALL ||
1521 (old_warnings == pWARN_STD && PL_dowarn & G_WARN_ON))
1522 mask = newSVpvn(WARN_ALLstring, WARNsize) ;
1523 else
1524 mask = newSVsv(old_warnings);
1525 PUSHs(sv_2mortal(mask));
1526 }
1527 RETURN;
1528}
1529
1530PP(pp_reset)
1531{
1532 dSP;
1533 char *tmps;
1534 STRLEN n_a;
1535
1536 if (MAXARG < 1)
1537 tmps = "";
1538 else
1539 tmps = POPpx;
1540 sv_reset(tmps, CopSTASH(PL_curcop));
1541 PUSHs(&PL_sv_yes);
1542 RETURN;
1543}
1544
1545PP(pp_lineseq)
1546{
1547 return NORMAL;
1548}
1549
1550PP(pp_dbstate)
1551{
1552 PL_curcop = (COP*)PL_op;
1553 TAINT_NOT; /* Each statement is presumed innocent */
1554 PL_stack_sp = PL_stack_base + cxstack[cxstack_ix].blk_oldsp;
1555 FREETMPS;
1556
1557 if (PL_op->op_private || SvIV(PL_DBsingle) || SvIV(PL_DBsignal) || SvIV(PL_DBtrace))
1558 {
1559 dSP;
1560 register CV *cv;
1561 register PERL_CONTEXT *cx;
1562 I32 gimme = G_ARRAY;
1563 I32 hasargs;
1564 GV *gv;
1565
1566 gv = PL_DBgv;
1567 cv = GvCV(gv);
1568 if (!cv)
1569 DIE(aTHX_ "No DB::DB routine defined");
1570
1571 if (CvDEPTH(cv) >= 1 && !(PL_debug & DEBUG_DB_RECURSE_FLAG))
1572 /* don't do recursive DB::DB call */
1573 return NORMAL;
1574
1575 ENTER;
1576 SAVETMPS;
1577
1578 SAVEI32(PL_debug);
1579 SAVESTACK_POS();
1580 PL_debug = 0;
1581 hasargs = 0;
1582 SPAGAIN;
1583
1584 push_return(PL_op->op_next);
1585 PUSHBLOCK(cx, CXt_SUB, SP);
1586 PUSHSUB(cx);
1587 CvDEPTH(cv)++;
1588 (void)SvREFCNT_inc(cv);
1589 SAVEVPTR(PL_curpad);
1590 PL_curpad = AvARRAY((AV*)*av_fetch(CvPADLIST(cv),1,FALSE));
1591 RETURNOP(CvSTART(cv));
1592 }
1593 else
1594 return NORMAL;
1595}
1596
1597PP(pp_scope)
1598{
1599 return NORMAL;
1600}
1601
1602PP(pp_enteriter)
1603{
1604 dSP; dMARK;
1605 register PERL_CONTEXT *cx;
1606 I32 gimme = GIMME_V;
1607 SV **svp;
1608 U32 cxtype = CXt_LOOP;
1609#ifdef USE_ITHREADS
1610 void *iterdata;
1611#endif
1612
1613 ENTER;
1614 SAVETMPS;
1615
1616#ifdef USE_5005THREADS
1617 if (PL_op->op_flags & OPf_SPECIAL) {
1618 svp = &THREADSV(PL_op->op_targ); /* per-thread variable */
1619 SAVEGENERICSV(*svp);
1620 *svp = NEWSV(0,0);
1621 }
1622 else
1623#endif /* USE_5005THREADS */
1624 if (PL_op->op_targ) {
1625#ifndef USE_ITHREADS
1626 svp = &PL_curpad[PL_op->op_targ]; /* "my" variable */
1627 SAVESPTR(*svp);
1628#else
1629 SAVEPADSV(PL_op->op_targ);
1630 iterdata = INT2PTR(void*, PL_op->op_targ);
1631 cxtype |= CXp_PADVAR;
1632#endif
1633 }
1634 else {
1635 GV *gv = (GV*)POPs;
1636 svp = &GvSV(gv); /* symbol table variable */
1637 SAVEGENERICSV(*svp);
1638 *svp = NEWSV(0,0);
1639#ifdef USE_ITHREADS
1640 iterdata = (void*)gv;
1641#endif
1642 }
1643
1644 ENTER;
1645
1646 PUSHBLOCK(cx, cxtype, SP);
1647#ifdef USE_ITHREADS
1648 PUSHLOOP(cx, iterdata, MARK);
1649#else
1650 PUSHLOOP(cx, svp, MARK);
1651#endif
1652 if (PL_op->op_flags & OPf_STACKED) {
1653 cx->blk_loop.iterary = (AV*)SvREFCNT_inc(POPs);
1654 if (SvTYPE(cx->blk_loop.iterary) != SVt_PVAV) {
1655 dPOPss;
1656 if (SvNIOKp(sv) || !SvPOKp(sv) ||
1657 SvNIOKp(cx->blk_loop.iterary) || !SvPOKp(cx->blk_loop.iterary) ||
1658 (looks_like_number(sv) && *SvPVX(sv) != '0' &&
1659 looks_like_number((SV*)cx->blk_loop.iterary) &&
1660 *SvPVX(cx->blk_loop.iterary) != '0'))
1661 {
1662 if (SvNV(sv) < IV_MIN ||
1663 SvNV((SV*)cx->blk_loop.iterary) >= IV_MAX)
1664 DIE(aTHX_ "Range iterator outside integer range");
1665 cx->blk_loop.iterix = SvIV(sv);
1666 cx->blk_loop.itermax = SvIV((SV*)cx->blk_loop.iterary);
1667 }
1668 else
1669 cx->blk_loop.iterlval = newSVsv(sv);
1670 }
1671 }
1672 else {
1673 cx->blk_loop.iterary = PL_curstack;
1674 AvFILLp(PL_curstack) = SP - PL_stack_base;
1675 cx->blk_loop.iterix = MARK - PL_stack_base;
1676 }
1677
1678 RETURN;
1679}
1680
1681PP(pp_enterloop)
1682{
1683 dSP;
1684 register PERL_CONTEXT *cx;
1685 I32 gimme = GIMME_V;
1686
1687 ENTER;
1688 SAVETMPS;
1689 ENTER;
1690
1691 PUSHBLOCK(cx, CXt_LOOP, SP);
1692 PUSHLOOP(cx, 0, SP);
1693
1694 RETURN;
1695}
1696
1697PP(pp_leaveloop)
1698{
1699 dSP;
1700 register PERL_CONTEXT *cx;
1701 I32 gimme;
1702 SV **newsp;
1703 PMOP *newpm;
1704 SV **mark;
1705
1706 POPBLOCK(cx,newpm);
1707 mark = newsp;
1708 newsp = PL_stack_base + cx->blk_loop.resetsp;
1709
1710 TAINT_NOT;
1711 if (gimme == G_VOID)
1712 ; /* do nothing */
1713 else if (gimme == G_SCALAR) {
1714 if (mark < SP)
1715 *++newsp = sv_mortalcopy(*SP);
1716 else
1717 *++newsp = &PL_sv_undef;
1718 }
1719 else {
1720 while (mark < SP) {
1721 *++newsp = sv_mortalcopy(*++mark);
1722 TAINT_NOT; /* Each item is independent */
1723 }
1724 }
1725 SP = newsp;
1726 PUTBACK;
1727
1728 POPLOOP(cx); /* Stack values are safe: release loop vars ... */
1729 PL_curpm = newpm; /* ... and pop $1 et al */
1730
1731 LEAVE;
1732 LEAVE;
1733
1734 return NORMAL;
1735}
1736
1737PP(pp_return)
1738{
1739 dSP; dMARK;
1740 I32 cxix;
1741 register PERL_CONTEXT *cx;
1742 bool popsub2 = FALSE;
1743 bool clear_errsv = FALSE;
1744 I32 gimme;
1745 SV **newsp;
1746 PMOP *newpm;
1747 I32 optype = 0;
1748 SV *sv;
1749
1750 if (PL_curstackinfo->si_type == PERLSI_SORT) {
1751 if (cxstack_ix == PL_sortcxix
1752 || dopoptosub(cxstack_ix) <= PL_sortcxix)
1753 {
1754 if (cxstack_ix > PL_sortcxix)
1755 dounwind(PL_sortcxix);
1756 AvARRAY(PL_curstack)[1] = *SP;
1757 PL_stack_sp = PL_stack_base + 1;
1758 return 0;
1759 }
1760 }
1761
1762 cxix = dopoptosub(cxstack_ix);
1763 if (cxix < 0)
1764 DIE(aTHX_ "Can't return outside a subroutine");
1765 if (cxix < cxstack_ix)
1766 dounwind(cxix);
1767
1768 POPBLOCK(cx,newpm);
1769 switch (CxTYPE(cx)) {
1770 case CXt_SUB:
1771 popsub2 = TRUE;
1772 break;
1773 case CXt_EVAL:
1774 if (!(PL_in_eval & EVAL_KEEPERR))
1775 clear_errsv = TRUE;
1776 POPEVAL(cx);
1777 if (CxTRYBLOCK(cx))
1778 break;
1779 lex_end();
1780 if (optype == OP_REQUIRE &&
1781 (MARK == SP || (gimme == G_SCALAR && !SvTRUE(*SP))) )
1782 {
1783 /* Unassume the success we assumed earlier. */
1784 SV *nsv = cx->blk_eval.old_namesv;
1785 (void)hv_delete(GvHVn(PL_incgv), SvPVX(nsv), SvCUR(nsv), G_DISCARD);
1786 DIE(aTHX_ "%s did not return a true value", SvPVX(nsv));
1787 }
1788 break;
1789 case CXt_FORMAT:
1790 POPFORMAT(cx);
1791 break;
1792 default:
1793 DIE(aTHX_ "panic: return");
1794 }
1795
1796 TAINT_NOT;
1797 if (gimme == G_SCALAR) {
1798 if (MARK < SP) {
1799 if (popsub2) {
1800 if (cx->blk_sub.cv && CvDEPTH(cx->blk_sub.cv) > 1) {
1801 if (SvTEMP(TOPs)) {
1802 *++newsp = SvREFCNT_inc(*SP);
1803 FREETMPS;
1804 sv_2mortal(*newsp);
1805 }
1806 else {
1807 sv = SvREFCNT_inc(*SP); /* FREETMPS could clobber it */
1808 FREETMPS;
1809 *++newsp = sv_mortalcopy(sv);
1810 SvREFCNT_dec(sv);
1811 }
1812 }
1813 else
1814 *++newsp = (SvTEMP(*SP)) ? *SP : sv_mortalcopy(*SP);
1815 }
1816 else
1817 *++newsp = sv_mortalcopy(*SP);
1818 }
1819 else
1820 *++newsp = &PL_sv_undef;
1821 }
1822 else if (gimme == G_ARRAY) {
1823 while (++MARK <= SP) {
1824 *++newsp = (popsub2 && SvTEMP(*MARK))
1825 ? *MARK : sv_mortalcopy(*MARK);
1826 TAINT_NOT; /* Each item is independent */
1827 }
1828 }
1829 PL_stack_sp = newsp;
1830
1831 /* Stack values are safe: */
1832 if (popsub2) {
1833 POPSUB(cx,sv); /* release CV and @_ ... */
1834 }
1835 else
1836 sv = Nullsv;
1837 PL_curpm = newpm; /* ... and pop $1 et al */
1838
1839 LEAVE;
1840 LEAVESUB(sv);
1841 if (clear_errsv)
1842 sv_setpv(ERRSV,"");
1843 return pop_return();
1844}
1845
1846PP(pp_last)
1847{
1848 dSP;
1849 I32 cxix;
1850 register PERL_CONTEXT *cx;
1851 I32 pop2 = 0;
1852 I32 gimme;
1853 I32 optype;
1854 OP *nextop;
1855 SV **newsp;
1856 PMOP *newpm;
1857 SV **mark;
1858 SV *sv = Nullsv;
1859
1860 if (PL_op->op_flags & OPf_SPECIAL) {
1861 cxix = dopoptoloop(cxstack_ix);
1862 if (cxix < 0)
1863 DIE(aTHX_ "Can't \"last\" outside a loop block");
1864 }
1865 else {
1866 cxix = dopoptolabel(cPVOP->op_pv);
1867 if (cxix < 0)
1868 DIE(aTHX_ "Label not found for \"last %s\"", cPVOP->op_pv);
1869 }
1870 if (cxix < cxstack_ix)
1871 dounwind(cxix);
1872
1873 POPBLOCK(cx,newpm);
1874 mark = newsp;
1875 switch (CxTYPE(cx)) {
1876 case CXt_LOOP:
1877 pop2 = CXt_LOOP;
1878 newsp = PL_stack_base + cx->blk_loop.resetsp;
1879 nextop = cx->blk_loop.last_op->op_next;
1880 break;
1881 case CXt_SUB:
1882 pop2 = CXt_SUB;
1883 nextop = pop_return();
1884 break;
1885 case CXt_EVAL:
1886 POPEVAL(cx);
1887 nextop = pop_return();
1888 break;
1889 case CXt_FORMAT:
1890 POPFORMAT(cx);
1891 nextop = pop_return();
1892 break;
1893 default:
1894 DIE(aTHX_ "panic: last");
1895 }
1896
1897 TAINT_NOT;
1898 if (gimme == G_SCALAR) {
1899 if (MARK < SP)
1900 *++newsp = ((pop2 == CXt_SUB) && SvTEMP(*SP))
1901 ? *SP : sv_mortalcopy(*SP);
1902 else
1903 *++newsp = &PL_sv_undef;
1904 }
1905 else if (gimme == G_ARRAY) {
1906 while (++MARK <= SP) {
1907 *++newsp = ((pop2 == CXt_SUB) && SvTEMP(*MARK))
1908 ? *MARK : sv_mortalcopy(*MARK);
1909 TAINT_NOT; /* Each item is independent */
1910 }
1911 }
1912 SP = newsp;
1913 PUTBACK;
1914
1915 /* Stack values are safe: */
1916 switch (pop2) {
1917 case CXt_LOOP:
1918 POPLOOP(cx); /* release loop vars ... */
1919 LEAVE;
1920 break;
1921 case CXt_SUB:
1922 POPSUB(cx,sv); /* release CV and @_ ... */
1923 break;
1924 }
1925 PL_curpm = newpm; /* ... and pop $1 et al */
1926
1927 LEAVE;
1928 LEAVESUB(sv);
1929 return nextop;
1930}
1931
1932PP(pp_next)
1933{
1934 I32 cxix;
1935 register PERL_CONTEXT *cx;
1936 I32 inner;
1937
1938 if (PL_op->op_flags & OPf_SPECIAL) {
1939 cxix = dopoptoloop(cxstack_ix);
1940 if (cxix < 0)
1941 DIE(aTHX_ "Can't \"next\" outside a loop block");
1942 }
1943 else {
1944 cxix = dopoptolabel(cPVOP->op_pv);
1945 if (cxix < 0)
1946 DIE(aTHX_ "Label not found for \"next %s\"", cPVOP->op_pv);
1947 }
1948 if (cxix < cxstack_ix)
1949 dounwind(cxix);
1950
1951 /* clear off anything above the scope we're re-entering, but
1952 * save the rest until after a possible continue block */
1953 inner = PL_scopestack_ix;
1954 TOPBLOCK(cx);
1955 if (PL_scopestack_ix < inner)
1956 leave_scope(PL_scopestack[PL_scopestack_ix]);
1957 return cx->blk_loop.next_op;
1958}
1959
1960PP(pp_redo)
1961{
1962 I32 cxix;
1963 register PERL_CONTEXT *cx;
1964 I32 oldsave;
1965
1966 if (PL_op->op_flags & OPf_SPECIAL) {
1967 cxix = dopoptoloop(cxstack_ix);
1968 if (cxix < 0)
1969 DIE(aTHX_ "Can't \"redo\" outside a loop block");
1970 }
1971 else {
1972 cxix = dopoptolabel(cPVOP->op_pv);
1973 if (cxix < 0)
1974 DIE(aTHX_ "Label not found for \"redo %s\"", cPVOP->op_pv);
1975 }
1976 if (cxix < cxstack_ix)
1977 dounwind(cxix);
1978
1979 TOPBLOCK(cx);
1980 oldsave = PL_scopestack[PL_scopestack_ix - 1];
1981 LEAVE_SCOPE(oldsave);
1982 return cx->blk_loop.redo_op;
1983}
1984
1985STATIC OP *
1986S_dofindlabel(pTHX_ OP *o, char *label, OP **opstack, OP **oplimit)
1987{
1988 OP *kid = Nullop;
1989 OP **ops = opstack;
1990 static char too_deep[] = "Target of goto is too deeply nested";
1991
1992 if (ops >= oplimit)
1993 Perl_croak(aTHX_ too_deep);
1994 if (o->op_type == OP_LEAVE ||
1995 o->op_type == OP_SCOPE ||
1996 o->op_type == OP_LEAVELOOP ||
1997 o->op_type == OP_LEAVETRY)
1998 {
1999 *ops++ = cUNOPo->op_first;
2000 if (ops >= oplimit)
2001 Perl_croak(aTHX_ too_deep);
2002 }
2003 *ops = 0;
2004 if (o->op_flags & OPf_KIDS) {
2005 /* First try all the kids at this level, since that's likeliest. */
2006 for (kid = cUNOPo->op_first; kid; kid = kid->op_sibling) {
2007 if ((kid->op_type == OP_NEXTSTATE || kid->op_type == OP_DBSTATE) &&
2008 kCOP->cop_label && strEQ(kCOP->cop_label, label))
2009 return kid;
2010 }
2011 for (kid = cUNOPo->op_first; kid; kid = kid->op_sibling) {
2012 if (kid == PL_lastgotoprobe)
2013 continue;
2014 if ((kid->op_type == OP_NEXTSTATE || kid->op_type == OP_DBSTATE) &&
2015 (ops == opstack ||
2016 (ops[-1]->op_type != OP_NEXTSTATE &&
2017 ops[-1]->op_type != OP_DBSTATE)))
2018 *ops++ = kid;
2019 if ((o = dofindlabel(kid, label, ops, oplimit)))
2020 return o;
2021 }
2022 }
2023 *ops = 0;
2024 return 0;
2025}
2026
2027PP(pp_dump)
2028{
2029 return pp_goto();
2030 /*NOTREACHED*/
2031}
2032
2033PP(pp_goto)
2034{
2035 dSP;
2036 OP *retop = 0;
2037 I32 ix;
2038 register PERL_CONTEXT *cx;
2039#define GOTO_DEPTH 64
2040 OP *enterops[GOTO_DEPTH];
2041 char *label;
2042 int do_dump = (PL_op->op_type == OP_DUMP);
2043 static char must_have_label[] = "goto must have label";
2044
2045 label = 0;
2046 if (PL_op->op_flags & OPf_STACKED) {
2047 SV *sv = POPs;
2048 STRLEN n_a;
2049
2050 /* This egregious kludge implements goto &subroutine */
2051 if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVCV) {
2052 I32 cxix;
2053 register PERL_CONTEXT *cx;
2054 CV* cv = (CV*)SvRV(sv);
2055 SV** mark;
2056 I32 items = 0;
2057 I32 oldsave;
2058
2059 retry:
2060 if (!CvROOT(cv) && !CvXSUB(cv)) {
2061 GV *gv = CvGV(cv);
2062 GV *autogv;
2063 if (gv) {
2064 SV *tmpstr;
2065 /* autoloaded stub? */
2066 if (cv != GvCV(gv) && (cv = GvCV(gv)))
2067 goto retry;
2068 autogv = gv_autoload4(GvSTASH(gv), GvNAME(gv),
2069 GvNAMELEN(gv), FALSE);
2070 if (autogv && (cv = GvCV(autogv)))
2071 goto retry;
2072 tmpstr = sv_newmortal();
2073 gv_efullname3(tmpstr, gv, Nullch);
2074 DIE(aTHX_ "Goto undefined subroutine &%s",SvPVX(tmpstr));
2075 }
2076 DIE(aTHX_ "Goto undefined subroutine");
2077 }
2078
2079 /* First do some returnish stuff. */
2080 cxix = dopoptosub(cxstack_ix);
2081 if (cxix < 0)
2082 DIE(aTHX_ "Can't goto subroutine outside a subroutine");
2083 if (cxix < cxstack_ix)
2084 dounwind(cxix);
2085 TOPBLOCK(cx);
2086 if (CxREALEVAL(cx))
2087 DIE(aTHX_ "Can't goto subroutine from an eval-string");
2088 mark = PL_stack_sp;
2089 if (CxTYPE(cx) == CXt_SUB && cx->blk_sub.hasargs) {
2090 /* put @_ back onto stack */
2091 AV* av = cx->blk_sub.argarray;
2092
2093 items = AvFILLp(av) + 1;
2094 PL_stack_sp++;
2095 EXTEND(PL_stack_sp, items); /* @_ could have been extended. */
2096 Copy(AvARRAY(av), PL_stack_sp, items, SV*);
2097 PL_stack_sp += items;
2098#ifndef USE_5005THREADS
2099 SvREFCNT_dec(GvAV(PL_defgv));
2100 GvAV(PL_defgv) = cx->blk_sub.savearray;
2101#endif /* USE_5005THREADS */
2102 /* abandon @_ if it got reified */
2103 if (AvREAL(av)) {
2104 (void)sv_2mortal((SV*)av); /* delay until return */
2105 av = newAV();
2106 av_extend(av, items-1);
2107 AvFLAGS(av) = AVf_REIFY;
2108 PL_curpad[0] = (SV*)(cx->blk_sub.argarray = av);
2109 }
2110 }
2111 else if (CvXSUB(cv)) { /* put GvAV(defgv) back onto stack */
2112 AV* av;
2113#ifdef USE_5005THREADS
2114 av = (AV*)PL_curpad[0];
2115#else
2116 av = GvAV(PL_defgv);
2117#endif
2118 items = AvFILLp(av) + 1;
2119 PL_stack_sp++;
2120 EXTEND(PL_stack_sp, items); /* @_ could have been extended. */
2121 Copy(AvARRAY(av), PL_stack_sp, items, SV*);
2122 PL_stack_sp += items;
2123 }
2124 if (CxTYPE(cx) == CXt_SUB &&
2125 !(CvDEPTH(cx->blk_sub.cv) = cx->blk_sub.olddepth))
2126 SvREFCNT_dec(cx->blk_sub.cv);
2127 oldsave = PL_scopestack[PL_scopestack_ix - 1];
2128 LEAVE_SCOPE(oldsave);
2129
2130 /* Now do some callish stuff. */
2131 SAVETMPS;
2132 if (CvXSUB(cv)) {
2133#ifdef PERL_XSUB_OLDSTYLE
2134 if (CvOLDSTYLE(cv)) {
2135 I32 (*fp3)(int,int,int);
2136 while (SP > mark) {
2137 SP[1] = SP[0];
2138 SP--;
2139 }
2140 fp3 = (I32(*)(int,int,int))CvXSUB(cv);
2141 items = (*fp3)(CvXSUBANY(cv).any_i32,
2142 mark - PL_stack_base + 1,
2143 items);
2144 SP = PL_stack_base + items;
2145 }
2146 else
2147#endif /* PERL_XSUB_OLDSTYLE */
2148 {
2149 SV **newsp;
2150 I32 gimme;
2151
2152 PL_stack_sp--; /* There is no cv arg. */
2153 /* Push a mark for the start of arglist */
2154 PUSHMARK(mark);
2155 (void)(*CvXSUB(cv))(aTHX_ cv);
2156 /* Pop the current context like a decent sub should */
2157 POPBLOCK(cx, PL_curpm);
2158 /* Do _not_ use PUTBACK, keep the XSUB's return stack! */
2159 }
2160 LEAVE;
2161 return pop_return();
2162 }
2163 else {
2164 AV* padlist = CvPADLIST(cv);
2165 SV** svp = AvARRAY(padlist);
2166 if (CxTYPE(cx) == CXt_EVAL) {
2167 PL_in_eval = cx->blk_eval.old_in_eval;
2168 PL_eval_root = cx->blk_eval.old_eval_root;
2169 cx->cx_type = CXt_SUB;
2170 cx->blk_sub.hasargs = 0;
2171 }
2172 cx->blk_sub.cv = cv;
2173 cx->blk_sub.olddepth = CvDEPTH(cv);
2174 CvDEPTH(cv)++;
2175 if (CvDEPTH(cv) < 2)
2176 (void)SvREFCNT_inc(cv);
2177 else { /* save temporaries on recursion? */
2178 if (CvDEPTH(cv) == 100 && ckWARN(WARN_RECURSION))
2179 sub_crush_depth(cv);
2180 if (CvDEPTH(cv) > AvFILLp(padlist)) {
2181 AV *newpad = newAV();
2182 SV **oldpad = AvARRAY(svp[CvDEPTH(cv)-1]);
2183 I32 ix = AvFILLp((AV*)svp[1]);
2184 I32 names_fill = AvFILLp((AV*)svp[0]);
2185 svp = AvARRAY(svp[0]);
2186 for ( ;ix > 0; ix--) {
2187 if (names_fill >= ix && svp[ix] != &PL_sv_undef) {
2188 char *name = SvPVX(svp[ix]);
2189 if ((SvFLAGS(svp[ix]) & SVf_FAKE)
2190 || *name == '&')
2191 {
2192 /* outer lexical or anon code */
2193 av_store(newpad, ix,
2194 SvREFCNT_inc(oldpad[ix]) );
2195 }
2196 else { /* our own lexical */
2197 if (*name == '@')
2198 av_store(newpad, ix, sv = (SV*)newAV());
2199 else if (*name == '%')
2200 av_store(newpad, ix, sv = (SV*)newHV());
2201 else
2202 av_store(newpad, ix, sv = NEWSV(0,0));
2203 SvPADMY_on(sv);
2204 }
2205 }
2206 else if (IS_PADGV(oldpad[ix]) || IS_PADCONST(oldpad[ix])) {
2207 av_store(newpad, ix, sv = SvREFCNT_inc(oldpad[ix]));
2208 }
2209 else {
2210 av_store(newpad, ix, sv = NEWSV(0,0));
2211 SvPADTMP_on(sv);
2212 }
2213 }
2214 if (cx->blk_sub.hasargs) {
2215 AV* av = newAV();
2216 av_extend(av, 0);
2217 av_store(newpad, 0, (SV*)av);
2218 AvFLAGS(av) = AVf_REIFY;
2219 }
2220 av_store(padlist, CvDEPTH(cv), (SV*)newpad);
2221 AvFILLp(padlist) = CvDEPTH(cv);
2222 svp = AvARRAY(padlist);
2223 }
2224 }
2225#ifdef USE_5005THREADS
2226 if (!cx->blk_sub.hasargs) {
2227 AV* av = (AV*)PL_curpad[0];
2228
2229 items = AvFILLp(av) + 1;
2230 if (items) {
2231 /* Mark is at the end of the stack. */
2232 EXTEND(SP, items);
2233 Copy(AvARRAY(av), SP + 1, items, SV*);
2234 SP += items;
2235 PUTBACK ;
2236 }
2237 }
2238#endif /* USE_5005THREADS */
2239 SAVEVPTR(PL_curpad);
2240 PL_curpad = AvARRAY((AV*)svp[CvDEPTH(cv)]);
2241#ifndef USE_5005THREADS
2242 if (cx->blk_sub.hasargs)
2243#endif /* USE_5005THREADS */
2244 {
2245 AV* av = (AV*)PL_curpad[0];
2246 SV** ary;
2247
2248#ifndef USE_5005THREADS
2249 cx->blk_sub.savearray = GvAV(PL_defgv);
2250 GvAV(PL_defgv) = (AV*)SvREFCNT_inc(av);
2251#endif /* USE_5005THREADS */
2252 cx->blk_sub.oldcurpad = PL_curpad;
2253 cx->blk_sub.argarray = av;
2254 ++mark;
2255
2256 if (items >= AvMAX(av) + 1) {
2257 ary = AvALLOC(av);
2258 if (AvARRAY(av) != ary) {
2259 AvMAX(av) += AvARRAY(av) - AvALLOC(av);
2260 SvPVX(av) = (char*)ary;
2261 }
2262 if (items >= AvMAX(av) + 1) {
2263 AvMAX(av) = items - 1;
2264 Renew(ary,items+1,SV*);
2265 AvALLOC(av) = ary;
2266 SvPVX(av) = (char*)ary;
2267 }
2268 }
2269 Copy(mark,AvARRAY(av),items,SV*);
2270 AvFILLp(av) = items - 1;
2271 assert(!AvREAL(av));
2272 while (items--) {
2273 if (*mark)
2274 SvTEMP_off(*mark);
2275 mark++;
2276 }
2277 }
2278 if (PERLDB_SUB) { /* Checking curstash breaks DProf. */
2279 /*
2280 * We do not care about using sv to call CV;
2281 * it's for informational purposes only.
2282 */
2283 SV *sv = GvSV(PL_DBsub);
2284 CV *gotocv;
2285
2286 if (PERLDB_SUB_NN) {
2287 SvIVX(sv) = PTR2IV(cv); /* Already upgraded, saved */
2288 } else {
2289 save_item(sv);
2290 gv_efullname3(sv, CvGV(cv), Nullch);
2291 }
2292 if ( PERLDB_GOTO
2293 && (gotocv = get_cv("DB::goto", FALSE)) ) {
2294 PUSHMARK( PL_stack_sp );
2295 call_sv((SV*)gotocv, G_SCALAR | G_NODEBUG);
2296 PL_stack_sp--;
2297 }
2298 }
2299 RETURNOP(CvSTART(cv));
2300 }
2301 }
2302 else {
2303 label = SvPV(sv,n_a);
2304 if (!(do_dump || *label))
2305 DIE(aTHX_ must_have_label);
2306 }
2307 }
2308 else if (PL_op->op_flags & OPf_SPECIAL) {
2309 if (! do_dump)
2310 DIE(aTHX_ must_have_label);
2311 }
2312 else
2313 label = cPVOP->op_pv;
2314
2315 if (label && *label) {
2316 OP *gotoprobe = 0;
2317 bool leaving_eval = FALSE;
2318 PERL_CONTEXT *last_eval_cx = 0;
2319
2320 /* find label */
2321
2322 PL_lastgotoprobe = 0;
2323 *enterops = 0;
2324 for (ix = cxstack_ix; ix >= 0; ix--) {
2325 cx = &cxstack[ix];
2326 switch (CxTYPE(cx)) {
2327 case CXt_EVAL:
2328 leaving_eval = TRUE;
2329 if (CxREALEVAL(cx)) {
2330 gotoprobe = (last_eval_cx ?
2331 last_eval_cx->blk_eval.old_eval_root :
2332 PL_eval_root);
2333 last_eval_cx = cx;
2334 break;
2335 }
2336 /* else fall through */
2337 case CXt_LOOP:
2338 gotoprobe = cx->blk_oldcop->op_sibling;
2339 break;
2340 case CXt_SUBST:
2341 continue;
2342 case CXt_BLOCK:
2343 if (ix)
2344 gotoprobe = cx->blk_oldcop->op_sibling;
2345 else
2346 gotoprobe = PL_main_root;
2347 break;
2348 case CXt_SUB:
2349 if (CvDEPTH(cx->blk_sub.cv)) {
2350 gotoprobe = CvROOT(cx->blk_sub.cv);
2351 break;
2352 }
2353 /* FALL THROUGH */
2354 case CXt_FORMAT:
2355 case CXt_NULL:
2356 DIE(aTHX_ "Can't \"goto\" out of a pseudo block");
2357 default:
2358 if (ix)
2359 DIE(aTHX_ "panic: goto");
2360 gotoprobe = PL_main_root;
2361 break;
2362 }
2363 if (gotoprobe) {
2364 retop = dofindlabel(gotoprobe, label,
2365 enterops, enterops + GOTO_DEPTH);
2366 if (retop)
2367 break;
2368 }
2369 PL_lastgotoprobe = gotoprobe;
2370 }
2371 if (!retop)
2372 DIE(aTHX_ "Can't find label %s", label);
2373
2374 /* if we're leaving an eval, check before we pop any frames
2375 that we're not going to punt, otherwise the error
2376 won't be caught */
2377
2378 if (leaving_eval && *enterops && enterops[1]) {
2379 I32 i;
2380 for (i = 1; enterops[i]; i++)
2381 if (enterops[i]->op_type == OP_ENTERITER)
2382 DIE(aTHX_ "Can't \"goto\" into the middle of a foreach loop");
2383 }
2384
2385 /* pop unwanted frames */
2386
2387 if (ix < cxstack_ix) {
2388 I32 oldsave;
2389
2390 if (ix < 0)
2391 ix = 0;
2392 dounwind(ix);
2393 TOPBLOCK(cx);
2394 oldsave = PL_scopestack[PL_scopestack_ix];
2395 LEAVE_SCOPE(oldsave);
2396 }
2397
2398 /* push wanted frames */
2399
2400 if (*enterops && enterops[1]) {
2401 OP *oldop = PL_op;
2402 for (ix = 1; enterops[ix]; ix++) {
2403 PL_op = enterops[ix];
2404 /* Eventually we may want to stack the needed arguments
2405 * for each op. For now, we punt on the hard ones. */
2406 if (PL_op->op_type == OP_ENTERITER)
2407 DIE(aTHX_ "Can't \"goto\" into the middle of a foreach loop");
2408 CALL_FPTR(PL_op->op_ppaddr)(aTHX);
2409 }
2410 PL_op = oldop;
2411 }
2412 }
2413
2414 if (do_dump) {
2415#ifdef VMS
2416 if (!retop) retop = PL_main_start;
2417#endif
2418 PL_restartop = retop;
2419 PL_do_undump = TRUE;
2420
2421 my_unexec();
2422
2423 PL_restartop = 0; /* hmm, must be GNU unexec().. */
2424 PL_do_undump = FALSE;
2425 }
2426
2427 RETURNOP(retop);
2428}
2429
2430PP(pp_exit)
2431{
2432 dSP;
2433 I32 anum;
2434
2435 if (MAXARG < 1)
2436 anum = 0;
2437 else {
2438 anum = SvIVx(POPs);
2439#ifdef VMS
2440 if (anum == 1 && (PL_op->op_private & OPpEXIT_VMSISH))
2441 anum = 0;
2442 VMSISH_HUSHED = VMSISH_HUSHED || (PL_op->op_private & OPpHUSH_VMSISH);
2443#endif
2444 }
2445 PL_exit_flags |= PERL_EXIT_EXPECTED;
2446 my_exit(anum);
2447 PUSHs(&PL_sv_undef);
2448 RETURN;
2449}
2450
2451#ifdef NOTYET
2452PP(pp_nswitch)
2453{
2454 dSP;
2455 NV value = SvNVx(GvSV(cCOP->cop_gv));
2456 register I32 match = I_32(value);
2457
2458 if (value < 0.0) {
2459 if (((NV)match) > value)
2460 --match; /* was fractional--truncate other way */
2461 }
2462 match -= cCOP->uop.scop.scop_offset;
2463 if (match < 0)
2464 match = 0;
2465 else if (match > cCOP->uop.scop.scop_max)
2466 match = cCOP->uop.scop.scop_max;
2467 PL_op = cCOP->uop.scop.scop_next[match];
2468 RETURNOP(PL_op);
2469}
2470
2471PP(pp_cswitch)
2472{
2473 dSP;
2474 register I32 match;
2475
2476 if (PL_multiline)
2477 PL_op = PL_op->op_next; /* can't assume anything */
2478 else {
2479 STRLEN n_a;
2480 match = *(SvPVx(GvSV(cCOP->cop_gv), n_a)) & 255;
2481 match -= cCOP->uop.scop.scop_offset;
2482 if (match < 0)
2483 match = 0;
2484 else if (match > cCOP->uop.scop.scop_max)
2485 match = cCOP->uop.scop.scop_max;
2486 PL_op = cCOP->uop.scop.scop_next[match];
2487 }
2488 RETURNOP(PL_op);
2489}
2490#endif
2491
2492/* Eval. */
2493
2494STATIC void
2495S_save_lines(pTHX_ AV *array, SV *sv)
2496{
2497 register char *s = SvPVX(sv);
2498 register char *send = SvPVX(sv) + SvCUR(sv);
2499 register char *t;
2500 register I32 line = 1;
2501
2502 while (s && s < send) {
2503 SV *tmpstr = NEWSV(85,0);
2504
2505 sv_upgrade(tmpstr, SVt_PVMG);
2506 t = strchr(s, '\n');
2507 if (t)
2508 t++;
2509 else
2510 t = send;
2511
2512 sv_setpvn(tmpstr, s, t - s);
2513 av_store(array, line++, tmpstr);
2514 s = t;
2515 }
2516}
2517
2518#ifdef PERL_FLEXIBLE_EXCEPTIONS
2519STATIC void *
2520S_docatch_body(pTHX_ va_list args)
2521{
2522 return docatch_body();
2523}
2524#endif
2525
2526STATIC void *
2527S_docatch_body(pTHX)
2528{
2529 CALLRUNOPS(aTHX);
2530 return NULL;
2531}
2532
2533STATIC OP *
2534S_docatch(pTHX_ OP *o)
2535{
2536 int ret;
2537 OP *oldop = PL_op;
2538 OP *retop;
2539 volatile PERL_SI *cursi = PL_curstackinfo;
2540 dJMPENV;
2541
2542#ifdef DEBUGGING
2543 assert(CATCH_GET == TRUE);
2544#endif
2545 PL_op = o;
2546
2547 /* Normally, the leavetry at the end of this block of ops will
2548 * pop an op off the return stack and continue there. By setting
2549 * the op to Nullop, we force an exit from the inner runops()
2550 * loop. DAPM.
2551 */
2552 retop = pop_return();
2553 push_return(Nullop);
2554
2555#ifdef PERL_FLEXIBLE_EXCEPTIONS
2556 redo_body:
2557 CALLPROTECT(aTHX_ pcur_env, &ret, MEMBER_TO_FPTR(S_docatch_body));
2558#else
2559 JMPENV_PUSH(ret);
2560#endif
2561 switch (ret) {
2562 case 0:
2563#ifndef PERL_FLEXIBLE_EXCEPTIONS
2564 redo_body:
2565 docatch_body();
2566#endif
2567 break;
2568 case 3:
2569 /* die caught by an inner eval - continue inner loop */
2570 if (PL_restartop && cursi == PL_curstackinfo) {
2571 PL_op = PL_restartop;
2572 PL_restartop = 0;
2573 goto redo_body;
2574 }
2575 /* a die in this eval - continue in outer loop */
2576 if (!PL_restartop)
2577 break;
2578 /* FALL THROUGH */
2579 default:
2580 JMPENV_POP;
2581 PL_op = oldop;
2582 JMPENV_JUMP(ret);
2583 /* NOTREACHED */
2584 }
2585 JMPENV_POP;
2586 PL_op = oldop;
2587 return retop;
2588}
2589
2590OP *
2591Perl_sv_compile_2op(pTHX_ SV *sv, OP** startop, char *code, AV** avp)
2592/* sv Text to convert to OP tree. */
2593/* startop op_free() this to undo. */
2594/* code Short string id of the caller. */
2595{
2596 dSP; /* Make POPBLOCK work. */
2597 PERL_CONTEXT *cx;
2598 SV **newsp;
2599 I32 gimme = 0; /* SUSPECT - INITIALZE TO WHAT? NI-S */
2600 I32 optype;
2601 OP dummy;
2602 OP *rop;
2603 char tbuf[TYPE_DIGITS(long) + 12 + 10];
2604 char *tmpbuf = tbuf;
2605 char *safestr;
2606
2607 ENTER;
2608 lex_start(sv);
2609 SAVETMPS;
2610 /* switch to eval mode */
2611
2612 if (PL_curcop == &PL_compiling) {
2613 SAVECOPSTASH_FREE(&PL_compiling);
2614 CopSTASH_set(&PL_compiling, PL_curstash);
2615 }
2616 if (PERLDB_NAMEEVAL && CopLINE(PL_curcop)) {
2617 SV *sv = sv_newmortal();
2618 Perl_sv_setpvf(aTHX_ sv, "_<(%.10seval %lu)[%s:%"IVdf"]",
2619 code, (unsigned long)++PL_evalseq,
2620 CopFILE(PL_curcop), (IV)CopLINE(PL_curcop));
2621 tmpbuf = SvPVX(sv);
2622 }
2623 else
2624 sprintf(tmpbuf, "_<(%.10s_eval %lu)", code, (unsigned long)++PL_evalseq);
2625 SAVECOPFILE_FREE(&PL_compiling);
2626 CopFILE_set(&PL_compiling, tmpbuf+2);
2627 SAVECOPLINE(&PL_compiling);
2628 CopLINE_set(&PL_compiling, 1);
2629 /* XXX For C<eval "...">s within BEGIN {} blocks, this ends up
2630 deleting the eval's FILEGV from the stash before gv_check() runs
2631 (i.e. before run-time proper). To work around the coredump that
2632 ensues, we always turn GvMULTI_on for any globals that were
2633 introduced within evals. See force_ident(). GSAR 96-10-12 */
2634 safestr = savepv(tmpbuf);
2635 SAVEDELETE(PL_defstash, safestr, strlen(safestr));
2636 SAVEHINTS();
2637#ifdef OP_IN_REGISTER
2638 PL_opsave = op;
2639#else
2640 SAVEVPTR(PL_op);
2641#endif
2642 PL_hints &= HINT_UTF8;
2643
2644 PL_op = &dummy;
2645 PL_op->op_type = OP_ENTEREVAL;
2646 PL_op->op_flags = 0; /* Avoid uninit warning. */
2647 PUSHBLOCK(cx, CXt_EVAL|(PL_curcop == &PL_compiling ? 0 : CXp_REAL), SP);
2648 PUSHEVAL(cx, 0, Nullgv);
2649 rop = doeval(G_SCALAR, startop);
2650 POPBLOCK(cx,PL_curpm);
2651 POPEVAL(cx);
2652
2653 (*startop)->op_type = OP_NULL;
2654 (*startop)->op_ppaddr = PL_ppaddr[OP_NULL];
2655 lex_end();
2656 *avp = (AV*)SvREFCNT_inc(PL_comppad);
2657 LEAVE;
2658 if (PL_curcop == &PL_compiling)
2659 PL_compiling.op_private = PL_hints;
2660#ifdef OP_IN_REGISTER
2661 op = PL_opsave;
2662#endif
2663 return rop;
2664}
2665
2666/* With USE_5005THREADS, eval_owner must be held on entry to doeval */
2667STATIC OP *
2668S_doeval(pTHX_ int gimme, OP** startop)
2669{
2670 dSP;
2671 OP *saveop = PL_op;
2672 CV *caller;
2673 AV* comppadlist;
2674 I32 i;
2675
2676 PL_in_eval = ((saveop && saveop->op_type == OP_REQUIRE)
2677 ? (EVAL_INREQUIRE | (PL_in_eval & EVAL_INEVAL))
2678 : EVAL_INEVAL);
2679
2680 PUSHMARK(SP);
2681
2682 /* set up a scratch pad */
2683
2684 SAVEI32(PL_padix);
2685 SAVEVPTR(PL_curpad);
2686 SAVESPTR(PL_comppad);
2687 SAVESPTR(PL_comppad_name);
2688 SAVEI32(PL_comppad_name_fill);
2689 SAVEI32(PL_min_intro_pending);
2690 SAVEI32(PL_max_intro_pending);
2691
2692 caller = PL_compcv;
2693 for (i = cxstack_ix - 1; i >= 0; i--) {
2694 PERL_CONTEXT *cx = &cxstack[i];
2695 if (CxTYPE(cx) == CXt_EVAL)
2696 break;
2697 else if (CxTYPE(cx) == CXt_SUB || CxTYPE(cx) == CXt_FORMAT) {
2698 caller = cx->blk_sub.cv;
2699 break;
2700 }
2701 }
2702
2703 SAVESPTR(PL_compcv);
2704 PL_compcv = (CV*)NEWSV(1104,0);
2705 sv_upgrade((SV *)PL_compcv, SVt_PVCV);
2706 CvEVAL_on(PL_compcv);
2707 assert(CxTYPE(&cxstack[cxstack_ix]) == CXt_EVAL);
2708 cxstack[cxstack_ix].blk_eval.cv = PL_compcv;
2709
2710#ifdef USE_5005THREADS
2711 CvOWNER(PL_compcv) = 0;
2712 New(666, CvMUTEXP(PL_compcv), 1, perl_mutex);
2713 MUTEX_INIT(CvMUTEXP(PL_compcv));
2714#endif /* USE_5005THREADS */
2715
2716 PL_comppad = newAV();
2717 av_push(PL_comppad, Nullsv);
2718 PL_curpad = AvARRAY(PL_comppad);
2719 PL_comppad_name = newAV();
2720 PL_comppad_name_fill = 0;
2721 PL_min_intro_pending = 0;
2722 PL_padix = 0;
2723#ifdef USE_5005THREADS
2724 av_store(PL_comppad_name, 0, newSVpvn("@_", 2));
2725 PL_curpad[0] = (SV*)newAV();
2726 SvPADMY_on(PL_curpad[0]); /* XXX Needed? */
2727#endif /* USE_5005THREADS */
2728
2729 comppadlist = newAV();
2730 AvREAL_off(comppadlist);
2731 av_store(comppadlist, 0, (SV*)PL_comppad_name);
2732 av_store(comppadlist, 1, (SV*)PL_comppad);
2733 CvPADLIST(PL_compcv) = comppadlist;
2734
2735 if (!saveop ||
2736 (saveop->op_type != OP_REQUIRE && saveop->op_type != OP_DOFILE))
2737 {
2738 CvOUTSIDE(PL_compcv) = (CV*)SvREFCNT_inc(caller);
2739 }
2740
2741 SAVEMORTALIZESV(PL_compcv); /* must remain until end of current statement */
2742
2743 /* make sure we compile in the right package */
2744
2745 if (CopSTASH_ne(PL_curcop, PL_curstash)) {
2746 SAVESPTR(PL_curstash);
2747 PL_curstash = CopSTASH(PL_curcop);
2748 }
2749 SAVESPTR(PL_beginav);
2750 PL_beginav = newAV();
2751 SAVEFREESV(PL_beginav);
2752 SAVEI32(PL_error_count);
2753
2754 /* try to compile it */
2755
2756 PL_eval_root = Nullop;
2757 PL_error_count = 0;
2758 PL_curcop = &PL_compiling;
2759 PL_curcop->cop_arybase = 0;
2760 if (saveop && saveop->op_flags & OPf_SPECIAL)
2761 PL_in_eval |= EVAL_KEEPERR;
2762 else
2763 sv_setpv(ERRSV,"");
2764 if (yyparse() || PL_error_count || !PL_eval_root) {
2765 SV **newsp;
2766 I32 gimme;
2767 PERL_CONTEXT *cx;
2768 I32 optype = 0; /* Might be reset by POPEVAL. */
2769 STRLEN n_a;
2770
2771 PL_op = saveop;
2772 if (PL_eval_root) {
2773 op_free(PL_eval_root);
2774 PL_eval_root = Nullop;
2775 }
2776 SP = PL_stack_base + POPMARK; /* pop original mark */
2777 if (!startop) {
2778 POPBLOCK(cx,PL_curpm);
2779 POPEVAL(cx);
2780 pop_return();
2781 }
2782 lex_end();
2783 LEAVE;
2784 if (optype == OP_REQUIRE) {
2785 char* msg = SvPVx(ERRSV, n_a);
2786 DIE(aTHX_ "%sCompilation failed in require",
2787 *msg ? msg : "Unknown error\n");
2788 }
2789 else if (startop) {
2790 char* msg = SvPVx(ERRSV, n_a);
2791
2792 POPBLOCK(cx,PL_curpm);
2793 POPEVAL(cx);
2794 Perl_croak(aTHX_ "%sCompilation failed in regexp",
2795 (*msg ? msg : "Unknown error\n"));
2796 }
2797#ifdef USE_5005THREADS
2798 MUTEX_LOCK(&PL_eval_mutex);
2799 PL_eval_owner = 0;
2800 COND_SIGNAL(&PL_eval_cond);
2801 MUTEX_UNLOCK(&PL_eval_mutex);
2802#endif /* USE_5005THREADS */
2803 RETPUSHUNDEF;
2804 }
2805 CopLINE_set(&PL_compiling, 0);
2806 if (startop) {
2807 *startop = PL_eval_root;
2808 SvREFCNT_dec(CvOUTSIDE(PL_compcv));
2809 CvOUTSIDE(PL_compcv) = Nullcv;
2810 } else
2811 SAVEFREEOP(PL_eval_root);
2812 if (gimme & G_VOID)
2813 scalarvoid(PL_eval_root);
2814 else if (gimme & G_ARRAY)
2815 list(PL_eval_root);
2816 else
2817 scalar(PL_eval_root);
2818
2819 DEBUG_x(dump_eval());
2820
2821 /* Register with debugger: */
2822 if (PERLDB_INTER && saveop->op_type == OP_REQUIRE) {
2823 CV *cv = get_cv("DB::postponed", FALSE);
2824 if (cv) {
2825 dSP;
2826 PUSHMARK(SP);
2827 XPUSHs((SV*)CopFILEGV(&PL_compiling));
2828 PUTBACK;
2829 call_sv((SV*)cv, G_DISCARD);
2830 }
2831 }
2832
2833 /* compiled okay, so do it */
2834
2835 CvDEPTH(PL_compcv) = 1;
2836 SP = PL_stack_base + POPMARK; /* pop original mark */
2837 PL_op = saveop; /* The caller may need it. */
2838 PL_lex_state = LEX_NOTPARSING; /* $^S needs this. */
2839#ifdef USE_5005THREADS
2840 MUTEX_LOCK(&PL_eval_mutex);
2841 PL_eval_owner = 0;
2842 COND_SIGNAL(&PL_eval_cond);
2843 MUTEX_UNLOCK(&PL_eval_mutex);
2844#endif /* USE_5005THREADS */
2845
2846 RETURNOP(PL_eval_start);
2847}
2848
2849STATIC PerlIO *
2850S_doopen_pmc(pTHX_ const char *name, const char *mode)
2851{
2852 STRLEN namelen = strlen(name);
2853 PerlIO *fp;
2854
2855 if (namelen > 3 && strEQ(name + namelen - 3, ".pm")) {
2856 SV *pmcsv = Perl_newSVpvf(aTHX_ "%s%c", name, 'c');
2857 char *pmc = SvPV_nolen(pmcsv);
2858 Stat_t pmstat;
2859 Stat_t pmcstat;
2860 if (PerlLIO_stat(pmc, &pmcstat) < 0) {
2861 fp = PerlIO_open(name, mode);
2862 }
2863 else {
2864 if (PerlLIO_stat(name, &pmstat) < 0 ||
2865 pmstat.st_mtime < pmcstat.st_mtime)
2866 {
2867 fp = PerlIO_open(pmc, mode);
2868 }
2869 else {
2870 fp = PerlIO_open(name, mode);
2871 }
2872 }
2873 SvREFCNT_dec(pmcsv);
2874 }
2875 else {
2876 fp = PerlIO_open(name, mode);
2877 }
2878 return fp;
2879}
2880
2881PP(pp_require)
2882{
2883 dSP;
2884 register PERL_CONTEXT *cx;
2885 SV *sv;
2886 char *name;
2887 STRLEN len;
2888 char *tryname = Nullch;
2889 SV *namesv = Nullsv;
2890 SV** svp;
2891 I32 gimme = GIMME_V;
2892 PerlIO *tryrsfp = 0;
2893 STRLEN n_a;
2894 int filter_has_file = 0;
2895 GV *filter_child_proc = 0;
2896 SV *filter_state = 0;
2897 SV *filter_sub = 0;
2898 SV *hook_sv = 0;
2899 SV *encoding;
2900 OP *op;
2901
2902 sv = POPs;
2903 if (SvNIOKp(sv) && PL_op->op_type != OP_DOFILE) {
2904 if (SvPOK(sv) && SvNOK(sv) && SvNV(sv)) { /* require v5.6.1 */
2905 UV rev = 0, ver = 0, sver = 0;
2906 STRLEN len;
2907 U8 *s = (U8*)SvPVX(sv);
2908 U8 *end = (U8*)SvPVX(sv) + SvCUR(sv);
2909 if (s < end) {
2910 rev = utf8n_to_uvchr(s, end - s, &len, 0);
2911 s += len;
2912 if (s < end) {
2913 ver = utf8n_to_uvchr(s, end - s, &len, 0);
2914 s += len;
2915 if (s < end)
2916 sver = utf8n_to_uvchr(s, end - s, &len, 0);
2917 }
2918 }
2919 if (PERL_REVISION < rev
2920 || (PERL_REVISION == rev
2921 && (PERL_VERSION < ver
2922 || (PERL_VERSION == ver
2923 && PERL_SUBVERSION < sver))))
2924 {
2925 DIE(aTHX_ "Perl v%"UVuf".%"UVuf".%"UVuf" required--this is only "
2926 "v%d.%d.%d, stopped", rev, ver, sver, PERL_REVISION,
2927 PERL_VERSION, PERL_SUBVERSION);
2928 }
2929 if (ckWARN(WARN_PORTABLE))
2930 Perl_warner(aTHX_ packWARN(WARN_PORTABLE),
2931 "v-string in use/require non-portable");
2932 RETPUSHYES;
2933 }
2934 else if (!SvPOKp(sv)) { /* require 5.005_03 */
2935 if ((NV)PERL_REVISION + ((NV)PERL_VERSION/(NV)1000)
2936 + ((NV)PERL_SUBVERSION/(NV)1000000)
2937 + 0.00000099 < SvNV(sv))
2938 {
2939 NV nrev = SvNV(sv);
2940 UV rev = (UV)nrev;
2941 NV nver = (nrev - rev) * 1000;
2942 UV ver = (UV)(nver + 0.0009);
2943 NV nsver = (nver - ver) * 1000;
2944 UV sver = (UV)(nsver + 0.0009);
2945
2946 /* help out with the "use 5.6" confusion */
2947 if (sver == 0 && (rev > 5 || (rev == 5 && ver >= 100))) {
2948 DIE(aTHX_ "Perl v%"UVuf".%"UVuf".%"UVuf" required--"
2949 "this is only v%d.%d.%d, stopped"
2950 " (did you mean v%"UVuf".%03"UVuf"?)",
2951 rev, ver, sver, PERL_REVISION, PERL_VERSION,
2952 PERL_SUBVERSION, rev, ver/100);
2953 }
2954 else {
2955 DIE(aTHX_ "Perl v%"UVuf".%"UVuf".%"UVuf" required--"
2956 "this is only v%d.%d.%d, stopped",
2957 rev, ver, sver, PERL_REVISION, PERL_VERSION,
2958 PERL_SUBVERSION);
2959 }
2960 }
2961 RETPUSHYES;
2962 }
2963 }
2964 name = SvPV(sv, len);
2965 if (!(name && len > 0 && *name))
2966 DIE(aTHX_ "Null filename used");
2967 TAINT_PROPER("require");
2968 if (PL_op->op_type == OP_REQUIRE &&
2969 (svp = hv_fetch(GvHVn(PL_incgv), name, len, 0)) &&
2970 *svp != &PL_sv_undef)
2971 RETPUSHYES;
2972
2973 /* prepare to compile file */
2974
2975 if (path_is_absolute(name)) {
2976 tryname = name;
2977 tryrsfp = doopen_pmc(name,PERL_SCRIPT_MODE);
2978 }
2979 if (!tryrsfp) {
2980 AV *ar = GvAVn(PL_incgv);
2981 I32 i;
2982#ifdef VMS
2983 char *unixname;
2984 if ((unixname = tounixspec(name, Nullch)) != Nullch)
2985#endif
2986 {
2987 namesv = NEWSV(806, 0);
2988 for (i = 0; i <= AvFILL(ar); i++) {
2989 SV *dirsv = *av_fetch(ar, i, TRUE);
2990
2991 if (SvROK(dirsv)) {
2992 int count;
2993 SV *loader = dirsv;
2994
2995 if (SvTYPE(SvRV(loader)) == SVt_PVAV
2996 && !sv_isobject(loader))
2997 {
2998 loader = *av_fetch((AV *)SvRV(loader), 0, TRUE);
2999 }
3000
3001 Perl_sv_setpvf(aTHX_ namesv, "/loader/0x%"UVxf"/%s",
3002 PTR2UV(SvRV(dirsv)), name);
3003 tryname = SvPVX(namesv);
3004 tryrsfp = 0;
3005
3006 ENTER;
3007 SAVETMPS;
3008 EXTEND(SP, 2);
3009
3010 PUSHMARK(SP);
3011 PUSHs(dirsv);
3012 PUSHs(sv);
3013 PUTBACK;
3014 if (sv_isobject(loader))
3015 count = call_method("INC", G_ARRAY);
3016 else
3017 count = call_sv(loader, G_ARRAY);
3018 SPAGAIN;
3019
3020 if (count > 0) {
3021 int i = 0;
3022 SV *arg;
3023
3024 SP -= count - 1;
3025 arg = SP[i++];
3026
3027 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVGV) {
3028 arg = SvRV(arg);
3029 }
3030
3031 if (SvTYPE(arg) == SVt_PVGV) {
3032 IO *io = GvIO((GV *)arg);
3033
3034 ++filter_has_file;
3035
3036 if (io) {
3037 tryrsfp = IoIFP(io);
3038 if (IoTYPE(io) == IoTYPE_PIPE) {
3039 /* reading from a child process doesn't
3040 nest -- when returning from reading
3041 the inner module, the outer one is
3042 unreadable (closed?) I've tried to
3043 save the gv to manage the lifespan of
3044 the pipe, but this didn't help. XXX */
3045 filter_child_proc = (GV *)arg;
3046 (void)SvREFCNT_inc(filter_child_proc);
3047 }
3048 else {
3049 if (IoOFP(io) && IoOFP(io) != IoIFP(io)) {
3050 PerlIO_close(IoOFP(io));
3051 }
3052 IoIFP(io) = Nullfp;
3053 IoOFP(io) = Nullfp;
3054 }
3055 }
3056
3057 if (i < count) {
3058 arg = SP[i++];
3059 }
3060 }
3061
3062 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVCV) {
3063 filter_sub = arg;
3064 (void)SvREFCNT_inc(filter_sub);
3065
3066 if (i < count) {
3067 filter_state = SP[i];
3068 (void)SvREFCNT_inc(filter_state);
3069 }
3070
3071 if (tryrsfp == 0) {
3072 tryrsfp = PerlIO_open("/dev/null",
3073 PERL_SCRIPT_MODE);
3074 }
3075 }
3076 }
3077
3078 PUTBACK;
3079 FREETMPS;
3080 LEAVE;
3081
3082 if (tryrsfp) {
3083 hook_sv = dirsv;
3084 break;
3085 }
3086
3087 filter_has_file = 0;
3088 if (filter_child_proc) {
3089 SvREFCNT_dec(filter_child_proc);
3090 filter_child_proc = 0;
3091 }
3092 if (filter_state) {
3093 SvREFCNT_dec(filter_state);
3094 filter_state = 0;
3095 }
3096 if (filter_sub) {
3097 SvREFCNT_dec(filter_sub);
3098 filter_sub = 0;
3099 }
3100 }
3101 else {
3102 if (!path_is_absolute(name)
3103#ifdef MACOS_TRADITIONAL
3104 /* We consider paths of the form :a:b ambiguous and interpret them first
3105 as global then as local
3106 */
3107 || (*name == ':' && name[1] != ':' && strchr(name+2, ':'))
3108#endif
3109 ) {
3110 char *dir = SvPVx(dirsv, n_a);
3111#ifdef MACOS_TRADITIONAL
3112 char buf[256];
3113 Perl_sv_setpvf(aTHX_ namesv, "%s%s", MacPerl_CanonDir(dir, buf), name+(name[0] == ':'));
3114#else
3115#ifdef VMS
3116 char *unixdir;
3117 if ((unixdir = tounixpath(dir, Nullch)) == Nullch)
3118 continue;
3119 sv_setpv(namesv, unixdir);
3120 sv_catpv(namesv, unixname);
3121#else
3122 Perl_sv_setpvf(aTHX_ namesv, "%s/%s", dir, name);
3123#endif
3124#endif
3125 TAINT_PROPER("require");
3126 tryname = SvPVX(namesv);
3127#ifdef MACOS_TRADITIONAL
3128 {
3129 /* Convert slashes in the name part, but not the directory part, to colons */
3130 char * colon;
3131 for (colon = tryname+strlen(dir); colon = strchr(colon, '/'); )
3132 *colon++ = ':';
3133 }
3134#endif
3135 tryrsfp = doopen_pmc(tryname, PERL_SCRIPT_MODE);
3136 if (tryrsfp) {
3137 if (tryname[0] == '.' && tryname[1] == '/')
3138 tryname += 2;
3139 break;
3140 }
3141 }
3142 }
3143 }
3144 }
3145 }
3146 SAVECOPFILE_FREE(&PL_compiling);
3147 CopFILE_set(&PL_compiling, tryrsfp ? tryname : name);
3148 SvREFCNT_dec(namesv);
3149 if (!tryrsfp) {
3150 if (PL_op->op_type == OP_REQUIRE) {
3151 char *msgstr = name;
3152 if (namesv) { /* did we lookup @INC? */
3153 SV *msg = sv_2mortal(newSVpv(msgstr,0));
3154 SV *dirmsgsv = NEWSV(0, 0);
3155 AV *ar = GvAVn(PL_incgv);
3156 I32 i;
3157 sv_catpvn(msg, " in @INC", 8);
3158 if (instr(SvPVX(msg), ".h "))
3159 sv_catpv(msg, " (change .h to .ph maybe?)");
3160 if (instr(SvPVX(msg), ".ph "))
3161 sv_catpv(msg, " (did you run h2ph?)");
3162 sv_catpv(msg, " (@INC contains:");
3163 for (i = 0; i <= AvFILL(ar); i++) {
3164 char *dir = SvPVx(*av_fetch(ar, i, TRUE), n_a);
3165 Perl_sv_setpvf(aTHX_ dirmsgsv, " %s", dir);
3166 sv_catsv(msg, dirmsgsv);
3167 }
3168 sv_catpvn(msg, ")", 1);
3169 SvREFCNT_dec(dirmsgsv);
3170 msgstr = SvPV_nolen(msg);
3171 }
3172 DIE(aTHX_ "Can't locate %s", msgstr);
3173 }
3174
3175 RETPUSHUNDEF;
3176 }
3177 else
3178 SETERRNO(0, SS$_NORMAL);
3179
3180 /* Assume success here to prevent recursive requirement. */
3181 len = strlen(name);
3182 /* Check whether a hook in @INC has already filled %INC */
3183 if (!hook_sv || !(svp = hv_fetch(GvHVn(PL_incgv), name, len, 0))) {
3184 (void)hv_store(GvHVn(PL_incgv), name, len,
3185 (hook_sv ? SvREFCNT_inc(hook_sv)
3186 : newSVpv(CopFILE(&PL_compiling), 0)),
3187 0 );
3188 }
3189
3190 ENTER;
3191 SAVETMPS;
3192 lex_start(sv_2mortal(newSVpvn("",0)));
3193 SAVEGENERICSV(PL_rsfp_filters);
3194 PL_rsfp_filters = Nullav;
3195
3196 PL_rsfp = tryrsfp;
3197 SAVEHINTS();
3198 PL_hints = 0;
3199 SAVESPTR(PL_compiling.cop_warnings);
3200 if (PL_dowarn & G_WARN_ALL_ON)
3201 PL_compiling.cop_warnings = pWARN_ALL ;
3202 else if (PL_dowarn & G_WARN_ALL_OFF)
3203 PL_compiling.cop_warnings = pWARN_NONE ;
3204 else if (PL_taint_warn)
3205 PL_compiling.cop_warnings = newSVpvn(WARN_TAINTstring, WARNsize);
3206 else
3207 PL_compiling.cop_warnings = pWARN_STD ;
3208 SAVESPTR(PL_compiling.cop_io);
3209 PL_compiling.cop_io = Nullsv;
3210
3211 if (filter_sub || filter_child_proc) {
3212 SV *datasv = filter_add(run_user_filter, Nullsv);
3213 IoLINES(datasv) = filter_has_file;
3214 IoFMT_GV(datasv) = (GV *)filter_child_proc;
3215 IoTOP_GV(datasv) = (GV *)filter_state;
3216 IoBOTTOM_GV(datasv) = (GV *)filter_sub;
3217 }
3218
3219 /* switch to eval mode */
3220 push_return(PL_op->op_next);
3221 PUSHBLOCK(cx, CXt_EVAL, SP);
3222 PUSHEVAL(cx, name, Nullgv);
3223
3224 SAVECOPLINE(&PL_compiling);
3225 CopLINE_set(&PL_compiling, 0);
3226
3227 PUTBACK;
3228#ifdef USE_5005THREADS
3229 MUTEX_LOCK(&PL_eval_mutex);
3230 if (PL_eval_owner && PL_eval_owner != thr)
3231 while (PL_eval_owner)
3232 COND_WAIT(&PL_eval_cond, &PL_eval_mutex);
3233 PL_eval_owner = thr;
3234 MUTEX_UNLOCK(&PL_eval_mutex);
3235#endif /* USE_5005THREADS */
3236
3237 /* Store and reset encoding. */
3238 encoding = PL_encoding;
3239 PL_encoding = Nullsv;
3240
3241 op = DOCATCH(doeval(gimme, NULL));
3242
3243 /* Restore encoding. */
3244 PL_encoding = encoding;
3245
3246 return op;
3247}
3248
3249PP(pp_dofile)
3250{
3251 return pp_require();
3252}
3253
3254PP(pp_entereval)
3255{
3256 dSP;
3257 register PERL_CONTEXT *cx;
3258 dPOPss;
3259 I32 gimme = GIMME_V, was = PL_sub_generation;
3260 char tbuf[TYPE_DIGITS(long) + 12];
3261 char *tmpbuf = tbuf;
3262 char *safestr;
3263 STRLEN len;
3264 OP *ret;
3265
3266 if (!SvPV(sv,len) || !len)
3267 RETPUSHUNDEF;
3268 TAINT_PROPER("eval");
3269
3270 ENTER;
3271 lex_start(sv);
3272 SAVETMPS;
3273
3274 /* switch to eval mode */
3275
3276 if (PERLDB_NAMEEVAL && CopLINE(PL_curcop)) {
3277 SV *sv = sv_newmortal();
3278 Perl_sv_setpvf(aTHX_ sv, "_<(eval %lu)[%s:%"IVdf"]",
3279 (unsigned long)++PL_evalseq,
3280 CopFILE(PL_curcop), (IV)CopLINE(PL_curcop));
3281 tmpbuf = SvPVX(sv);
3282 }
3283 else
3284 sprintf(tmpbuf, "_<(eval %lu)", (unsigned long)++PL_evalseq);
3285 SAVECOPFILE_FREE(&PL_compiling);
3286 CopFILE_set(&PL_compiling, tmpbuf+2);
3287 SAVECOPLINE(&PL_compiling);
3288 CopLINE_set(&PL_compiling, 1);
3289 /* XXX For C<eval "...">s within BEGIN {} blocks, this ends up
3290 deleting the eval's FILEGV from the stash before gv_check() runs
3291 (i.e. before run-time proper). To work around the coredump that
3292 ensues, we always turn GvMULTI_on for any globals that were
3293 introduced within evals. See force_ident(). GSAR 96-10-12 */
3294 safestr = savepv(tmpbuf);
3295 SAVEDELETE(PL_defstash, safestr, strlen(safestr));
3296 SAVEHINTS();
3297 PL_hints = PL_op->op_targ;
3298 SAVESPTR(PL_compiling.cop_warnings);
3299 if (specialWARN(PL_curcop->cop_warnings))
3300 PL_compiling.cop_warnings = PL_curcop->cop_warnings;
3301 else {
3302 PL_compiling.cop_warnings = newSVsv(PL_curcop->cop_warnings);
3303 SAVEFREESV(PL_compiling.cop_warnings);
3304 }
3305 SAVESPTR(PL_compiling.cop_io);
3306 if (specialCopIO(PL_curcop->cop_io))
3307 PL_compiling.cop_io = PL_curcop->cop_io;
3308 else {
3309 PL_compiling.cop_io = newSVsv(PL_curcop->cop_io);
3310 SAVEFREESV(PL_compiling.cop_io);
3311 }
3312
3313 push_return(PL_op->op_next);
3314 PUSHBLOCK(cx, (CXt_EVAL|CXp_REAL), SP);
3315 PUSHEVAL(cx, 0, Nullgv);
3316
3317 /* prepare to compile string */
3318
3319 if (PERLDB_LINE && PL_curstash != PL_debstash)
3320 save_lines(CopFILEAV(&PL_compiling), PL_linestr);
3321 PUTBACK;
3322#ifdef USE_5005THREADS
3323 MUTEX_LOCK(&PL_eval_mutex);
3324 if (PL_eval_owner && PL_eval_owner != thr)
3325 while (PL_eval_owner)
3326 COND_WAIT(&PL_eval_cond, &PL_eval_mutex);
3327 PL_eval_owner = thr;
3328 MUTEX_UNLOCK(&PL_eval_mutex);
3329#endif /* USE_5005THREADS */
3330 ret = doeval(gimme, NULL);
3331 if (PERLDB_INTER && was != PL_sub_generation /* Some subs defined here. */
3332 && ret != PL_op->op_next) { /* Successive compilation. */
3333 strcpy(safestr, "_<(eval )"); /* Anything fake and short. */
3334 }
3335 return DOCATCH(ret);
3336}
3337
3338PP(pp_leaveeval)
3339{
3340 dSP;
3341 register SV **mark;
3342 SV **newsp;
3343 PMOP *newpm;
3344 I32 gimme;
3345 register PERL_CONTEXT *cx;
3346 OP *retop;
3347 U8 save_flags = PL_op -> op_flags;
3348 I32 optype;
3349
3350 POPBLOCK(cx,newpm);
3351 POPEVAL(cx);
3352 retop = pop_return();
3353
3354 TAINT_NOT;
3355 if (gimme == G_VOID)
3356 MARK = newsp;
3357 else if (gimme == G_SCALAR) {
3358 MARK = newsp + 1;
3359 if (MARK <= SP) {
3360 if (SvFLAGS(TOPs) & SVs_TEMP)
3361 *MARK = TOPs;
3362 else
3363 *MARK = sv_mortalcopy(TOPs);
3364 }
3365 else {
3366 MEXTEND(mark,0);
3367 *MARK = &PL_sv_undef;
3368 }
3369 SP = MARK;
3370 }
3371 else {
3372 /* in case LEAVE wipes old return values */
3373 for (mark = newsp + 1; mark <= SP; mark++) {
3374 if (!(SvFLAGS(*mark) & SVs_TEMP)) {
3375 *mark = sv_mortalcopy(*mark);
3376 TAINT_NOT; /* Each item is independent */
3377 }
3378 }
3379 }
3380 PL_curpm = newpm; /* Don't pop $1 et al till now */
3381
3382#ifdef DEBUGGING
3383 assert(CvDEPTH(PL_compcv) == 1);
3384#endif
3385 CvDEPTH(PL_compcv) = 0;
3386 lex_end();
3387
3388 if (optype == OP_REQUIRE &&
3389 !(gimme == G_SCALAR ? SvTRUE(*SP) : SP > newsp))
3390 {
3391 /* Unassume the success we assumed earlier. */
3392 SV *nsv = cx->blk_eval.old_namesv;
3393 (void)hv_delete(GvHVn(PL_incgv), SvPVX(nsv), SvCUR(nsv), G_DISCARD);
3394 retop = Perl_die(aTHX_ "%s did not return a true value", SvPVX(nsv));
3395 /* die_where() did LEAVE, or we won't be here */
3396 }
3397 else {
3398 LEAVE;
3399 if (!(save_flags & OPf_SPECIAL))
3400 sv_setpv(ERRSV,"");
3401 }
3402
3403 RETURNOP(retop);
3404}
3405
3406PP(pp_entertry)
3407{
3408 dSP;
3409 register PERL_CONTEXT *cx;
3410 I32 gimme = GIMME_V;
3411
3412 ENTER;
3413 SAVETMPS;
3414
3415 push_return(cLOGOP->op_other->op_next);
3416 PUSHBLOCK(cx, (CXt_EVAL|CXp_TRYBLOCK), SP);
3417 PUSHEVAL(cx, 0, 0);
3418
3419 PL_in_eval = EVAL_INEVAL;
3420 sv_setpv(ERRSV,"");
3421 PUTBACK;
3422 return DOCATCH(PL_op->op_next);
3423}
3424
3425PP(pp_leavetry)
3426{
3427 dSP;
3428 register SV **mark;
3429 SV **newsp;
3430 PMOP *newpm;
3431 OP* retop;
3432 I32 gimme;
3433 register PERL_CONTEXT *cx;
3434 I32 optype;
3435
3436 POPBLOCK(cx,newpm);
3437 POPEVAL(cx);
3438 retop = pop_return();
3439
3440 TAINT_NOT;
3441 if (gimme == G_VOID)
3442 SP = newsp;
3443 else if (gimme == G_SCALAR) {
3444 MARK = newsp + 1;
3445 if (MARK <= SP) {
3446 if (SvFLAGS(TOPs) & (SVs_PADTMP|SVs_TEMP))
3447 *MARK = TOPs;
3448 else
3449 *MARK = sv_mortalcopy(TOPs);
3450 }
3451 else {
3452 MEXTEND(mark,0);
3453 *MARK = &PL_sv_undef;
3454 }
3455 SP = MARK;
3456 }
3457 else {
3458 /* in case LEAVE wipes old return values */
3459 for (mark = newsp + 1; mark <= SP; mark++) {
3460 if (!(SvFLAGS(*mark) & (SVs_PADTMP|SVs_TEMP))) {
3461 *mark = sv_mortalcopy(*mark);
3462 TAINT_NOT; /* Each item is independent */
3463 }
3464 }
3465 }
3466 PL_curpm = newpm; /* Don't pop $1 et al till now */
3467
3468 LEAVE;
3469 sv_setpv(ERRSV,"");
3470 RETURNOP(retop);
3471}
3472
3473STATIC void
3474S_doparseform(pTHX_ SV *sv)
3475{
3476 STRLEN len;
3477 register char *s = SvPV_force(sv, len);
3478 register char *send = s + len;
3479 register char *base = Nullch;
3480 register I32 skipspaces = 0;
3481 bool noblank = FALSE;
3482 bool repeat = FALSE;
3483 bool postspace = FALSE;
3484 U16 *fops;
3485 register U16 *fpc;
3486 U16 *linepc = 0;
3487 register I32 arg;
3488 bool ischop;
3489
3490 if (len == 0)
3491 Perl_croak(aTHX_ "Null picture in formline");
3492
3493 New(804, fops, (send - s)*3+10, U16); /* Almost certainly too long... */
3494 fpc = fops;
3495
3496 if (s < send) {
3497 linepc = fpc;
3498 *fpc++ = FF_LINEMARK;
3499 noblank = repeat = FALSE;
3500 base = s;
3501 }
3502
3503 while (s <= send) {
3504 switch (*s++) {
3505 default:
3506 skipspaces = 0;
3507 continue;
3508
3509 case '~':
3510 if (*s == '~') {
3511 repeat = TRUE;
3512 *s = ' ';
3513 }
3514 noblank = TRUE;
3515 s[-1] = ' ';
3516 /* FALL THROUGH */
3517 case ' ': case '\t':
3518 skipspaces++;
3519 continue;
3520
3521 case '\n': case 0:
3522 arg = s - base;
3523 skipspaces++;
3524 arg -= skipspaces;
3525 if (arg) {
3526 if (postspace)
3527 *fpc++ = FF_SPACE;
3528 *fpc++ = FF_LITERAL;
3529 *fpc++ = arg;
3530 }
3531 postspace = FALSE;
3532 if (s <= send)
3533 skipspaces--;
3534 if (skipspaces) {
3535 *fpc++ = FF_SKIP;
3536 *fpc++ = skipspaces;
3537 }
3538 skipspaces = 0;
3539 if (s <= send)
3540 *fpc++ = FF_NEWLINE;
3541 if (noblank) {
3542 *fpc++ = FF_BLANK;
3543 if (repeat)
3544 arg = fpc - linepc + 1;
3545 else
3546 arg = 0;
3547 *fpc++ = arg;
3548 }
3549 if (s < send) {
3550 linepc = fpc;
3551 *fpc++ = FF_LINEMARK;
3552 noblank = repeat = FALSE;
3553 base = s;
3554 }
3555 else
3556 s++;
3557 continue;
3558
3559 case '@':
3560 case '^':
3561 ischop = s[-1] == '^';
3562
3563 if (postspace) {
3564 *fpc++ = FF_SPACE;
3565 postspace = FALSE;
3566 }
3567 arg = (s - base) - 1;
3568 if (arg) {
3569 *fpc++ = FF_LITERAL;
3570 *fpc++ = arg;
3571 }
3572
3573 base = s - 1;
3574 *fpc++ = FF_FETCH;
3575 if (*s == '*') {
3576 s++;
3577 *fpc++ = 0;
3578 *fpc++ = FF_LINEGLOB;
3579 }
3580 else if (*s == '#' || (*s == '.' && s[1] == '#')) {
3581 arg = ischop ? 512 : 0;
3582 base = s - 1;
3583 while (*s == '#')
3584 s++;
3585 if (*s == '.') {
3586 char *f;
3587 s++;
3588 f = s;
3589 while (*s == '#')
3590 s++;
3591 arg |= 256 + (s - f);
3592 }
3593 *fpc++ = s - base; /* fieldsize for FETCH */
3594 *fpc++ = FF_DECIMAL;
3595 *fpc++ = arg;
3596 }
3597 else if (*s == '0' && s[1] == '#') { /* Zero padded decimals */
3598 arg = ischop ? 512 : 0;
3599 base = s - 1;
3600 s++; /* skip the '0' first */
3601 while (*s == '#')
3602 s++;
3603 if (*s == '.') {
3604 char *f;
3605 s++;
3606 f = s;
3607 while (*s == '#')
3608 s++;
3609 arg |= 256 + (s - f);
3610 }
3611 *fpc++ = s - base; /* fieldsize for FETCH */
3612 *fpc++ = FF_0DECIMAL;
3613 *fpc++ = arg;
3614 }
3615 else {
3616 I32 prespace = 0;
3617 bool ismore = FALSE;
3618
3619 if (*s == '>') {
3620 while (*++s == '>') ;
3621 prespace = FF_SPACE;
3622 }
3623 else if (*s == '|') {
3624 while (*++s == '|') ;
3625 prespace = FF_HALFSPACE;
3626 postspace = TRUE;
3627 }
3628 else {
3629 if (*s == '<')
3630 while (*++s == '<') ;
3631 postspace = TRUE;
3632 }
3633 if (*s == '.' && s[1] == '.' && s[2] == '.') {
3634 s += 3;
3635 ismore = TRUE;
3636 }
3637 *fpc++ = s - base; /* fieldsize for FETCH */
3638
3639 *fpc++ = ischop ? FF_CHECKCHOP : FF_CHECKNL;
3640
3641 if (prespace)
3642 *fpc++ = prespace;
3643 *fpc++ = FF_ITEM;
3644 if (ismore)
3645 *fpc++ = FF_MORE;
3646 if (ischop)
3647 *fpc++ = FF_CHOP;
3648 }
3649 base = s;
3650 skipspaces = 0;
3651 continue;
3652 }
3653 }
3654 *fpc++ = FF_END;
3655
3656 arg = fpc - fops;
3657 { /* need to jump to the next word */
3658 int z;
3659 z = WORD_ALIGN - SvCUR(sv) % WORD_ALIGN;
3660 SvGROW(sv, SvCUR(sv) + z + arg * sizeof(U16) + 4);
3661 s = SvPVX(sv) + SvCUR(sv) + z;
3662 }
3663 Copy(fops, s, arg, U16);
3664 Safefree(fops);
3665 sv_magic(sv, Nullsv, PERL_MAGIC_fm, Nullch, 0);
3666 SvCOMPILED_on(sv);
3667}
3668
3669static I32
3670run_user_filter(pTHX_ int idx, SV *buf_sv, int maxlen)
3671{
3672 SV *datasv = FILTER_DATA(idx);
3673 int filter_has_file = IoLINES(datasv);
3674 GV *filter_child_proc = (GV *)IoFMT_GV(datasv);
3675 SV *filter_state = (SV *)IoTOP_GV(datasv);
3676 SV *filter_sub = (SV *)IoBOTTOM_GV(datasv);
3677 int len = 0;
3678
3679 /* I was having segfault trouble under Linux 2.2.5 after a
3680 parse error occured. (Had to hack around it with a test
3681 for PL_error_count == 0.) Solaris doesn't segfault --
3682 not sure where the trouble is yet. XXX */
3683
3684 if (filter_has_file) {
3685 len = FILTER_READ(idx+1, buf_sv, maxlen);
3686 }
3687
3688 if (filter_sub && len >= 0) {
3689 dSP;
3690 int count;
3691
3692 ENTER;
3693 SAVE_DEFSV;
3694 SAVETMPS;
3695 EXTEND(SP, 2);
3696
3697 DEFSV = buf_sv;
3698 PUSHMARK(SP);
3699 PUSHs(sv_2mortal(newSViv(maxlen)));
3700 if (filter_state) {
3701 PUSHs(filter_state);
3702 }
3703 PUTBACK;
3704 count = call_sv(filter_sub, G_SCALAR);
3705 SPAGAIN;
3706
3707 if (count > 0) {
3708 SV *out = POPs;
3709 if (SvOK(out)) {
3710 len = SvIV(out);
3711 }
3712 }
3713
3714 PUTBACK;
3715 FREETMPS;
3716 LEAVE;
3717 }
3718
3719 if (len <= 0) {
3720 IoLINES(datasv) = 0;
3721 if (filter_child_proc) {
3722 SvREFCNT_dec(filter_child_proc);
3723 IoFMT_GV(datasv) = Nullgv;
3724 }
3725 if (filter_state) {
3726 SvREFCNT_dec(filter_state);
3727 IoTOP_GV(datasv) = Nullgv;
3728 }
3729 if (filter_sub) {
3730 SvREFCNT_dec(filter_sub);
3731 IoBOTTOM_GV(datasv) = Nullgv;
3732 }
3733 filter_del(run_user_filter);
3734 }
3735
3736 return len;
3737}
3738
3739/* perhaps someone can come up with a better name for
3740 this? it is not really "absolute", per se ... */
3741static bool
3742S_path_is_absolute(pTHX_ char *name)
3743{
3744 if (PERL_FILE_IS_ABSOLUTE(name)
3745#ifdef MACOS_TRADITIONAL
3746 || (*name == ':' && name[1] != ':' && strchr(name+2, ':')))
3747#else
3748 || (*name == '.' && (name[1] == '/' ||
3749 (name[1] == '.' && name[2] == '/'))))
3750#endif
3751 {
3752 return TRUE;
3753 }
3754 else
3755 return FALSE;
3756}