xref: /openbsd-src/gnu/usr.bin/perl/pp_ctl.c (revision 8500990981f885cbe5e6a4958549cacc238b5ae6)
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 
29 static I32 run_user_filter(pTHX_ int idx, SV *buf_sv, int maxlen);
30 
31 PP(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 
51 PP(pp_regcmaybe)
52 {
53     return NORMAL;
54 }
55 
56 PP(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 
64 PP(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 != (I32)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 
149 PP(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 
239 void
240 Perl_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 
267 void
268 Perl_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 
288 void
289 Perl_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 
300 PP(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 != (I32)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 != (I32)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 
752 PP(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 
784 PP(pp_mapstart)
785 {
786     DIE(aTHX_ "panic: mapstart");	/* uses grepstart */
787 }
788 
789 PP(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 
879 PP(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 
889 PP(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 
931 PP(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 
1014 STATIC I32
1015 S_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 
1062 I32
1063 Perl_dowantarray(pTHX)
1064 {
1065     I32 gimme = block_gimme();
1066     return (gimme == G_VOID) ? G_SCALAR : gimme;
1067 }
1068 
1069 I32
1070 Perl_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 
1092 I32
1093 Perl_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 
1106 STATIC I32
1107 S_dopoptosub(pTHX_ I32 startingblock)
1108 {
1109     return dopoptosub_at(cxstack, startingblock);
1110 }
1111 
1112 STATIC I32
1113 S_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 
1132 STATIC I32
1133 S_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 
1150 STATIC I32
1151 S_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 
1191 void
1192 Perl_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 
1227 void
1228 Perl_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 
1239 OP *
1240 Perl_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 
1355 PP(pp_xor)
1356 {
1357     dSP; dPOPTOPssrl;
1358     if (SvTRUE(left) != SvTRUE(right))
1359 	RETSETYES;
1360     else
1361 	RETSETNO;
1362 }
1363 
1364 PP(pp_andassign)
1365 {
1366     dSP;
1367     if (!SvTRUE(TOPs))
1368 	RETURN;
1369     else
1370 	RETURNOP(cLOGOP->op_other);
1371 }
1372 
1373 PP(pp_orassign)
1374 {
1375     dSP;
1376     if (SvTRUE(TOPs))
1377 	RETURN;
1378     else
1379 	RETURNOP(cLOGOP->op_other);
1380 }
1381 
1382 PP(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 	GV *cvgv = CvGV(ccstack[cxix].blk_sub.cv);
1454 	/* So is ccstack[dbcxix]. */
1455 	if (isGV(cvgv)) {
1456 	    sv = NEWSV(49, 0);
1457 	    gv_efullname3(sv, cvgv, Nullch);
1458 	    PUSHs(sv_2mortal(sv));
1459 	    PUSHs(sv_2mortal(newSViv((I32)cx->blk_sub.hasargs)));
1460 	}
1461 	else {
1462 	    PUSHs(sv_2mortal(newSVpvn("(unknown)",9)));
1463 	    PUSHs(sv_2mortal(newSViv((I32)cx->blk_sub.hasargs)));
1464 	}
1465     }
1466     else {
1467 	PUSHs(sv_2mortal(newSVpvn("(eval)",6)));
1468 	PUSHs(sv_2mortal(newSViv(0)));
1469     }
1470     gimme = (I32)cx->blk_gimme;
1471     if (gimme == G_VOID)
1472 	PUSHs(&PL_sv_undef);
1473     else
1474 	PUSHs(sv_2mortal(newSViv(gimme & G_ARRAY)));
1475     if (CxTYPE(cx) == CXt_EVAL) {
1476 	/* eval STRING */
1477 	if (cx->blk_eval.old_op_type == OP_ENTEREVAL) {
1478 	    PUSHs(cx->blk_eval.cur_text);
1479 	    PUSHs(&PL_sv_no);
1480 	}
1481 	/* require */
1482 	else if (cx->blk_eval.old_namesv) {
1483 	    PUSHs(sv_2mortal(newSVsv(cx->blk_eval.old_namesv)));
1484 	    PUSHs(&PL_sv_yes);
1485 	}
1486 	/* eval BLOCK (try blocks have old_namesv == 0) */
1487 	else {
1488 	    PUSHs(&PL_sv_undef);
1489 	    PUSHs(&PL_sv_undef);
1490 	}
1491     }
1492     else {
1493 	PUSHs(&PL_sv_undef);
1494 	PUSHs(&PL_sv_undef);
1495     }
1496     if (CxTYPE(cx) == CXt_SUB && cx->blk_sub.hasargs
1497 	&& CopSTASH_eq(PL_curcop, PL_debstash))
1498     {
1499 	AV *ary = cx->blk_sub.argarray;
1500 	int off = AvARRAY(ary) - AvALLOC(ary);
1501 
1502 	if (!PL_dbargs) {
1503 	    GV* tmpgv;
1504 	    PL_dbargs = GvAV(gv_AVadd(tmpgv = gv_fetchpv("DB::args", TRUE,
1505 				SVt_PVAV)));
1506 	    GvMULTI_on(tmpgv);
1507 	    AvREAL_off(PL_dbargs);	/* XXX should be REIFY (see av.h) */
1508 	}
1509 
1510 	if (AvMAX(PL_dbargs) < AvFILLp(ary) + off)
1511 	    av_extend(PL_dbargs, AvFILLp(ary) + off);
1512 	Copy(AvALLOC(ary), AvARRAY(PL_dbargs), AvFILLp(ary) + 1 + off, SV*);
1513 	AvFILLp(PL_dbargs) = AvFILLp(ary) + off;
1514     }
1515     /* XXX only hints propagated via op_private are currently
1516      * visible (others are not easily accessible, since they
1517      * use the global PL_hints) */
1518     PUSHs(sv_2mortal(newSViv((I32)cx->blk_oldcop->op_private &
1519 			     HINT_PRIVATE_MASK)));
1520     {
1521 	SV * mask ;
1522 	SV * old_warnings = cx->blk_oldcop->cop_warnings ;
1523 
1524 	if  (old_warnings == pWARN_NONE ||
1525 		(old_warnings == pWARN_STD && (PL_dowarn & G_WARN_ON) == 0))
1526             mask = newSVpvn(WARN_NONEstring, WARNsize) ;
1527         else if (old_warnings == pWARN_ALL ||
1528 		  (old_warnings == pWARN_STD && PL_dowarn & G_WARN_ON))
1529             mask = newSVpvn(WARN_ALLstring, WARNsize) ;
1530         else
1531             mask = newSVsv(old_warnings);
1532         PUSHs(sv_2mortal(mask));
1533     }
1534     RETURN;
1535 }
1536 
1537 PP(pp_reset)
1538 {
1539     dSP;
1540     char *tmps;
1541     STRLEN n_a;
1542 
1543     if (MAXARG < 1)
1544 	tmps = "";
1545     else
1546 	tmps = POPpx;
1547     sv_reset(tmps, CopSTASH(PL_curcop));
1548     PUSHs(&PL_sv_yes);
1549     RETURN;
1550 }
1551 
1552 PP(pp_lineseq)
1553 {
1554     return NORMAL;
1555 }
1556 
1557 PP(pp_dbstate)
1558 {
1559     PL_curcop = (COP*)PL_op;
1560     TAINT_NOT;		/* Each statement is presumed innocent */
1561     PL_stack_sp = PL_stack_base + cxstack[cxstack_ix].blk_oldsp;
1562     FREETMPS;
1563 
1564     if (PL_op->op_private || SvIV(PL_DBsingle) || SvIV(PL_DBsignal) || SvIV(PL_DBtrace))
1565     {
1566 	dSP;
1567 	register CV *cv;
1568 	register PERL_CONTEXT *cx;
1569 	I32 gimme = G_ARRAY;
1570 	U8 hasargs;
1571 	GV *gv;
1572 
1573 	gv = PL_DBgv;
1574 	cv = GvCV(gv);
1575 	if (!cv)
1576 	    DIE(aTHX_ "No DB::DB routine defined");
1577 
1578 	if (CvDEPTH(cv) >= 1 && !(PL_debug & DEBUG_DB_RECURSE_FLAG))
1579 	    /* don't do recursive DB::DB call */
1580 	    return NORMAL;
1581 
1582 	ENTER;
1583 	SAVETMPS;
1584 
1585 	SAVEI32(PL_debug);
1586 	SAVESTACK_POS();
1587 	PL_debug = 0;
1588 	hasargs = 0;
1589 	SPAGAIN;
1590 
1591 	push_return(PL_op->op_next);
1592 	PUSHBLOCK(cx, CXt_SUB, SP);
1593 	PUSHSUB(cx);
1594 	CvDEPTH(cv)++;
1595 	(void)SvREFCNT_inc(cv);
1596 	SAVEVPTR(PL_curpad);
1597 	PL_curpad = AvARRAY((AV*)*av_fetch(CvPADLIST(cv),1,FALSE));
1598 	RETURNOP(CvSTART(cv));
1599     }
1600     else
1601 	return NORMAL;
1602 }
1603 
1604 PP(pp_scope)
1605 {
1606     return NORMAL;
1607 }
1608 
1609 PP(pp_enteriter)
1610 {
1611     dSP; dMARK;
1612     register PERL_CONTEXT *cx;
1613     I32 gimme = GIMME_V;
1614     SV **svp;
1615     U32 cxtype = CXt_LOOP;
1616 #ifdef USE_ITHREADS
1617     void *iterdata;
1618 #endif
1619 
1620     ENTER;
1621     SAVETMPS;
1622 
1623 #ifdef USE_5005THREADS
1624     if (PL_op->op_flags & OPf_SPECIAL) {
1625 	svp = &THREADSV(PL_op->op_targ);	/* per-thread variable */
1626 	SAVEGENERICSV(*svp);
1627 	*svp = NEWSV(0,0);
1628     }
1629     else
1630 #endif /* USE_5005THREADS */
1631     if (PL_op->op_targ) {
1632 #ifndef USE_ITHREADS
1633 	svp = &PL_curpad[PL_op->op_targ];		/* "my" variable */
1634 	SAVESPTR(*svp);
1635 #else
1636 	SAVEPADSV(PL_op->op_targ);
1637 	iterdata = INT2PTR(void*, PL_op->op_targ);
1638 	cxtype |= CXp_PADVAR;
1639 #endif
1640     }
1641     else {
1642 	GV *gv = (GV*)POPs;
1643 	svp = &GvSV(gv);			/* symbol table variable */
1644 	SAVEGENERICSV(*svp);
1645 	*svp = NEWSV(0,0);
1646 #ifdef USE_ITHREADS
1647 	iterdata = (void*)gv;
1648 #endif
1649     }
1650 
1651     ENTER;
1652 
1653     PUSHBLOCK(cx, cxtype, SP);
1654 #ifdef USE_ITHREADS
1655     PUSHLOOP(cx, iterdata, MARK);
1656 #else
1657     PUSHLOOP(cx, svp, MARK);
1658 #endif
1659     if (PL_op->op_flags & OPf_STACKED) {
1660 	cx->blk_loop.iterary = (AV*)SvREFCNT_inc(POPs);
1661 	if (SvTYPE(cx->blk_loop.iterary) != SVt_PVAV) {
1662 	    dPOPss;
1663 	    if (SvNIOKp(sv) || !SvPOKp(sv) ||
1664 		SvNIOKp(cx->blk_loop.iterary) || !SvPOKp(cx->blk_loop.iterary) ||
1665 		(looks_like_number(sv) && *SvPVX(sv) != '0' &&
1666 		 looks_like_number((SV*)cx->blk_loop.iterary) &&
1667 		 *SvPVX(cx->blk_loop.iterary) != '0'))
1668 	    {
1669 		 if (SvNV(sv) < IV_MIN ||
1670 		     SvNV((SV*)cx->blk_loop.iterary) >= IV_MAX)
1671 		     DIE(aTHX_ "Range iterator outside integer range");
1672 		 cx->blk_loop.iterix = SvIV(sv);
1673 		 cx->blk_loop.itermax = SvIV((SV*)cx->blk_loop.iterary);
1674 	    }
1675 	    else
1676 		cx->blk_loop.iterlval = newSVsv(sv);
1677 	}
1678     }
1679     else {
1680 	cx->blk_loop.iterary = PL_curstack;
1681 	AvFILLp(PL_curstack) = SP - PL_stack_base;
1682 	cx->blk_loop.iterix = MARK - PL_stack_base;
1683     }
1684 
1685     RETURN;
1686 }
1687 
1688 PP(pp_enterloop)
1689 {
1690     dSP;
1691     register PERL_CONTEXT *cx;
1692     I32 gimme = GIMME_V;
1693 
1694     ENTER;
1695     SAVETMPS;
1696     ENTER;
1697 
1698     PUSHBLOCK(cx, CXt_LOOP, SP);
1699     PUSHLOOP(cx, 0, SP);
1700 
1701     RETURN;
1702 }
1703 
1704 PP(pp_leaveloop)
1705 {
1706     dSP;
1707     register PERL_CONTEXT *cx;
1708     I32 gimme;
1709     SV **newsp;
1710     PMOP *newpm;
1711     SV **mark;
1712 
1713     POPBLOCK(cx,newpm);
1714     mark = newsp;
1715     newsp = PL_stack_base + cx->blk_loop.resetsp;
1716 
1717     TAINT_NOT;
1718     if (gimme == G_VOID)
1719 	; /* do nothing */
1720     else if (gimme == G_SCALAR) {
1721 	if (mark < SP)
1722 	    *++newsp = sv_mortalcopy(*SP);
1723 	else
1724 	    *++newsp = &PL_sv_undef;
1725     }
1726     else {
1727 	while (mark < SP) {
1728 	    *++newsp = sv_mortalcopy(*++mark);
1729 	    TAINT_NOT;		/* Each item is independent */
1730 	}
1731     }
1732     SP = newsp;
1733     PUTBACK;
1734 
1735     POPLOOP(cx);	/* Stack values are safe: release loop vars ... */
1736     PL_curpm = newpm;	/* ... and pop $1 et al */
1737 
1738     LEAVE;
1739     LEAVE;
1740 
1741     return NORMAL;
1742 }
1743 
1744 PP(pp_return)
1745 {
1746     dSP; dMARK;
1747     I32 cxix;
1748     register PERL_CONTEXT *cx;
1749     bool popsub2 = FALSE;
1750     bool clear_errsv = FALSE;
1751     I32 gimme;
1752     SV **newsp;
1753     PMOP *newpm;
1754     I32 optype = 0;
1755     SV *sv;
1756 
1757     if (PL_curstackinfo->si_type == PERLSI_SORT) {
1758 	if (cxstack_ix == PL_sortcxix
1759 	    || dopoptosub(cxstack_ix) <= PL_sortcxix)
1760 	{
1761 	    if (cxstack_ix > PL_sortcxix)
1762 		dounwind(PL_sortcxix);
1763 	    AvARRAY(PL_curstack)[1] = *SP;
1764 	    PL_stack_sp = PL_stack_base + 1;
1765 	    return 0;
1766 	}
1767     }
1768 
1769     cxix = dopoptosub(cxstack_ix);
1770     if (cxix < 0)
1771 	DIE(aTHX_ "Can't return outside a subroutine");
1772     if (cxix < cxstack_ix)
1773 	dounwind(cxix);
1774 
1775     POPBLOCK(cx,newpm);
1776     switch (CxTYPE(cx)) {
1777     case CXt_SUB:
1778 	popsub2 = TRUE;
1779 	break;
1780     case CXt_EVAL:
1781 	if (!(PL_in_eval & EVAL_KEEPERR))
1782 	    clear_errsv = TRUE;
1783 	POPEVAL(cx);
1784 	if (CxTRYBLOCK(cx))
1785 	    break;
1786 	lex_end();
1787 	if (optype == OP_REQUIRE &&
1788 	    (MARK == SP || (gimme == G_SCALAR && !SvTRUE(*SP))) )
1789 	{
1790 	    /* Unassume the success we assumed earlier. */
1791 	    SV *nsv = cx->blk_eval.old_namesv;
1792 	    (void)hv_delete(GvHVn(PL_incgv), SvPVX(nsv), SvCUR(nsv), G_DISCARD);
1793 	    DIE(aTHX_ "%s did not return a true value", SvPVX(nsv));
1794 	}
1795 	break;
1796     case CXt_FORMAT:
1797 	POPFORMAT(cx);
1798 	break;
1799     default:
1800 	DIE(aTHX_ "panic: return");
1801     }
1802 
1803     TAINT_NOT;
1804     if (gimme == G_SCALAR) {
1805 	if (MARK < SP) {
1806 	    if (popsub2) {
1807 		if (cx->blk_sub.cv && CvDEPTH(cx->blk_sub.cv) > 1) {
1808 		    if (SvTEMP(TOPs)) {
1809 			*++newsp = SvREFCNT_inc(*SP);
1810 			FREETMPS;
1811 			sv_2mortal(*newsp);
1812 		    }
1813 		    else {
1814 			sv = SvREFCNT_inc(*SP);	/* FREETMPS could clobber it */
1815 			FREETMPS;
1816 			*++newsp = sv_mortalcopy(sv);
1817 			SvREFCNT_dec(sv);
1818 		    }
1819 		}
1820 		else
1821 		    *++newsp = (SvTEMP(*SP)) ? *SP : sv_mortalcopy(*SP);
1822 	    }
1823 	    else
1824 		*++newsp = sv_mortalcopy(*SP);
1825 	}
1826 	else
1827 	    *++newsp = &PL_sv_undef;
1828     }
1829     else if (gimme == G_ARRAY) {
1830 	while (++MARK <= SP) {
1831 	    *++newsp = (popsub2 && SvTEMP(*MARK))
1832 			? *MARK : sv_mortalcopy(*MARK);
1833 	    TAINT_NOT;		/* Each item is independent */
1834 	}
1835     }
1836     PL_stack_sp = newsp;
1837 
1838     /* Stack values are safe: */
1839     if (popsub2) {
1840 	POPSUB(cx,sv);	/* release CV and @_ ... */
1841     }
1842     else
1843 	sv = Nullsv;
1844     PL_curpm = newpm;	/* ... and pop $1 et al */
1845 
1846     LEAVE;
1847     LEAVESUB(sv);
1848     if (clear_errsv)
1849 	sv_setpv(ERRSV,"");
1850     return pop_return();
1851 }
1852 
1853 PP(pp_last)
1854 {
1855     dSP;
1856     I32 cxix;
1857     register PERL_CONTEXT *cx;
1858     I32 pop2 = 0;
1859     I32 gimme;
1860     I32 optype;
1861     OP *nextop;
1862     SV **newsp;
1863     PMOP *newpm;
1864     SV **mark;
1865     SV *sv = Nullsv;
1866 
1867     if (PL_op->op_flags & OPf_SPECIAL) {
1868 	cxix = dopoptoloop(cxstack_ix);
1869 	if (cxix < 0)
1870 	    DIE(aTHX_ "Can't \"last\" outside a loop block");
1871     }
1872     else {
1873 	cxix = dopoptolabel(cPVOP->op_pv);
1874 	if (cxix < 0)
1875 	    DIE(aTHX_ "Label not found for \"last %s\"", cPVOP->op_pv);
1876     }
1877     if (cxix < cxstack_ix)
1878 	dounwind(cxix);
1879 
1880     POPBLOCK(cx,newpm);
1881     mark = newsp;
1882     switch (CxTYPE(cx)) {
1883     case CXt_LOOP:
1884 	pop2 = CXt_LOOP;
1885 	newsp = PL_stack_base + cx->blk_loop.resetsp;
1886 	nextop = cx->blk_loop.last_op->op_next;
1887 	break;
1888     case CXt_SUB:
1889 	pop2 = CXt_SUB;
1890 	nextop = pop_return();
1891 	break;
1892     case CXt_EVAL:
1893 	POPEVAL(cx);
1894 	nextop = pop_return();
1895 	break;
1896     case CXt_FORMAT:
1897 	POPFORMAT(cx);
1898 	nextop = pop_return();
1899 	break;
1900     default:
1901 	DIE(aTHX_ "panic: last");
1902     }
1903 
1904     TAINT_NOT;
1905     if (gimme == G_SCALAR) {
1906 	if (MARK < SP)
1907 	    *++newsp = ((pop2 == CXt_SUB) && SvTEMP(*SP))
1908 			? *SP : sv_mortalcopy(*SP);
1909 	else
1910 	    *++newsp = &PL_sv_undef;
1911     }
1912     else if (gimme == G_ARRAY) {
1913 	while (++MARK <= SP) {
1914 	    *++newsp = ((pop2 == CXt_SUB) && SvTEMP(*MARK))
1915 			? *MARK : sv_mortalcopy(*MARK);
1916 	    TAINT_NOT;		/* Each item is independent */
1917 	}
1918     }
1919     SP = newsp;
1920     PUTBACK;
1921 
1922     /* Stack values are safe: */
1923     switch (pop2) {
1924     case CXt_LOOP:
1925 	POPLOOP(cx);	/* release loop vars ... */
1926 	LEAVE;
1927 	break;
1928     case CXt_SUB:
1929 	POPSUB(cx,sv);	/* release CV and @_ ... */
1930 	break;
1931     }
1932     PL_curpm = newpm;	/* ... and pop $1 et al */
1933 
1934     LEAVE;
1935     LEAVESUB(sv);
1936     return nextop;
1937 }
1938 
1939 PP(pp_next)
1940 {
1941     I32 cxix;
1942     register PERL_CONTEXT *cx;
1943     I32 inner;
1944 
1945     if (PL_op->op_flags & OPf_SPECIAL) {
1946 	cxix = dopoptoloop(cxstack_ix);
1947 	if (cxix < 0)
1948 	    DIE(aTHX_ "Can't \"next\" outside a loop block");
1949     }
1950     else {
1951 	cxix = dopoptolabel(cPVOP->op_pv);
1952 	if (cxix < 0)
1953 	    DIE(aTHX_ "Label not found for \"next %s\"", cPVOP->op_pv);
1954     }
1955     if (cxix < cxstack_ix)
1956 	dounwind(cxix);
1957 
1958     /* clear off anything above the scope we're re-entering, but
1959      * save the rest until after a possible continue block */
1960     inner = PL_scopestack_ix;
1961     TOPBLOCK(cx);
1962     if (PL_scopestack_ix < inner)
1963 	leave_scope(PL_scopestack[PL_scopestack_ix]);
1964     return cx->blk_loop.next_op;
1965 }
1966 
1967 PP(pp_redo)
1968 {
1969     I32 cxix;
1970     register PERL_CONTEXT *cx;
1971     I32 oldsave;
1972 
1973     if (PL_op->op_flags & OPf_SPECIAL) {
1974 	cxix = dopoptoloop(cxstack_ix);
1975 	if (cxix < 0)
1976 	    DIE(aTHX_ "Can't \"redo\" outside a loop block");
1977     }
1978     else {
1979 	cxix = dopoptolabel(cPVOP->op_pv);
1980 	if (cxix < 0)
1981 	    DIE(aTHX_ "Label not found for \"redo %s\"", cPVOP->op_pv);
1982     }
1983     if (cxix < cxstack_ix)
1984 	dounwind(cxix);
1985 
1986     TOPBLOCK(cx);
1987     oldsave = PL_scopestack[PL_scopestack_ix - 1];
1988     LEAVE_SCOPE(oldsave);
1989     return cx->blk_loop.redo_op;
1990 }
1991 
1992 STATIC OP *
1993 S_dofindlabel(pTHX_ OP *o, char *label, OP **opstack, OP **oplimit)
1994 {
1995     OP *kid = Nullop;
1996     OP **ops = opstack;
1997     static char too_deep[] = "Target of goto is too deeply nested";
1998 
1999     if (ops >= oplimit)
2000 	Perl_croak(aTHX_ too_deep);
2001     if (o->op_type == OP_LEAVE ||
2002 	o->op_type == OP_SCOPE ||
2003 	o->op_type == OP_LEAVELOOP ||
2004 	o->op_type == OP_LEAVETRY)
2005     {
2006 	*ops++ = cUNOPo->op_first;
2007 	if (ops >= oplimit)
2008 	    Perl_croak(aTHX_ too_deep);
2009     }
2010     *ops = 0;
2011     if (o->op_flags & OPf_KIDS) {
2012 	/* First try all the kids at this level, since that's likeliest. */
2013 	for (kid = cUNOPo->op_first; kid; kid = kid->op_sibling) {
2014 	    if ((kid->op_type == OP_NEXTSTATE || kid->op_type == OP_DBSTATE) &&
2015 		    kCOP->cop_label && strEQ(kCOP->cop_label, label))
2016 		return kid;
2017 	}
2018 	for (kid = cUNOPo->op_first; kid; kid = kid->op_sibling) {
2019 	    if (kid == PL_lastgotoprobe)
2020 		continue;
2021 	    if ((kid->op_type == OP_NEXTSTATE || kid->op_type == OP_DBSTATE) &&
2022 		(ops == opstack ||
2023 		 (ops[-1]->op_type != OP_NEXTSTATE &&
2024 		  ops[-1]->op_type != OP_DBSTATE)))
2025 		*ops++ = kid;
2026 	    if ((o = dofindlabel(kid, label, ops, oplimit)))
2027 		return o;
2028 	}
2029     }
2030     *ops = 0;
2031     return 0;
2032 }
2033 
2034 PP(pp_dump)
2035 {
2036     return pp_goto();
2037     /*NOTREACHED*/
2038 }
2039 
2040 PP(pp_goto)
2041 {
2042     dSP;
2043     OP *retop = 0;
2044     I32 ix;
2045     register PERL_CONTEXT *cx;
2046 #define GOTO_DEPTH 64
2047     OP *enterops[GOTO_DEPTH];
2048     char *label;
2049     int do_dump = (PL_op->op_type == OP_DUMP);
2050     static char must_have_label[] = "goto must have label";
2051 
2052     label = 0;
2053     if (PL_op->op_flags & OPf_STACKED) {
2054 	SV *sv = POPs;
2055 	STRLEN n_a;
2056 
2057 	/* This egregious kludge implements goto &subroutine */
2058 	if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVCV) {
2059 	    I32 cxix;
2060 	    register PERL_CONTEXT *cx;
2061 	    CV* cv = (CV*)SvRV(sv);
2062 	    SV** mark;
2063 	    I32 items = 0;
2064 	    I32 oldsave;
2065 
2066 	retry:
2067 	    if (!CvROOT(cv) && !CvXSUB(cv)) {
2068 		GV *gv = CvGV(cv);
2069 		GV *autogv;
2070 		if (gv) {
2071 		    SV *tmpstr;
2072 		    /* autoloaded stub? */
2073 		    if (cv != GvCV(gv) && (cv = GvCV(gv)))
2074 			goto retry;
2075 		    autogv = gv_autoload4(GvSTASH(gv), GvNAME(gv),
2076 					  GvNAMELEN(gv), FALSE);
2077 		    if (autogv && (cv = GvCV(autogv)))
2078 			goto retry;
2079 		    tmpstr = sv_newmortal();
2080 		    gv_efullname3(tmpstr, gv, Nullch);
2081 		    DIE(aTHX_ "Goto undefined subroutine &%s",SvPVX(tmpstr));
2082 		}
2083 		DIE(aTHX_ "Goto undefined subroutine");
2084 	    }
2085 
2086 	    /* First do some returnish stuff. */
2087 	    cxix = dopoptosub(cxstack_ix);
2088 	    if (cxix < 0)
2089 		DIE(aTHX_ "Can't goto subroutine outside a subroutine");
2090 	    if (cxix < cxstack_ix)
2091 		dounwind(cxix);
2092 	    TOPBLOCK(cx);
2093 	    if (CxREALEVAL(cx))
2094 		DIE(aTHX_ "Can't goto subroutine from an eval-string");
2095 	    mark = PL_stack_sp;
2096 	    if (CxTYPE(cx) == CXt_SUB && cx->blk_sub.hasargs) {
2097 		/* put @_ back onto stack */
2098 		AV* av = cx->blk_sub.argarray;
2099 
2100 		items = AvFILLp(av) + 1;
2101 		PL_stack_sp++;
2102 		EXTEND(PL_stack_sp, items); /* @_ could have been extended. */
2103 		Copy(AvARRAY(av), PL_stack_sp, items, SV*);
2104 		PL_stack_sp += items;
2105 #ifndef USE_5005THREADS
2106 		SvREFCNT_dec(GvAV(PL_defgv));
2107 		GvAV(PL_defgv) = cx->blk_sub.savearray;
2108 #endif /* USE_5005THREADS */
2109 		/* abandon @_ if it got reified */
2110 		if (AvREAL(av)) {
2111 		    (void)sv_2mortal((SV*)av);	/* delay until return */
2112 		    av = newAV();
2113 		    av_extend(av, items-1);
2114 		    AvFLAGS(av) = AVf_REIFY;
2115 		    PL_curpad[0] = (SV*)(cx->blk_sub.argarray = av);
2116 		}
2117 	    }
2118 	    else if (CvXSUB(cv)) {	/* put GvAV(defgv) back onto stack */
2119 		AV* av;
2120 #ifdef USE_5005THREADS
2121 		av = (AV*)PL_curpad[0];
2122 #else
2123 		av = GvAV(PL_defgv);
2124 #endif
2125 		items = AvFILLp(av) + 1;
2126 		PL_stack_sp++;
2127 		EXTEND(PL_stack_sp, items); /* @_ could have been extended. */
2128 		Copy(AvARRAY(av), PL_stack_sp, items, SV*);
2129 		PL_stack_sp += items;
2130 	    }
2131 	    if (CxTYPE(cx) == CXt_SUB &&
2132 		!(CvDEPTH(cx->blk_sub.cv) = cx->blk_sub.olddepth))
2133 		SvREFCNT_dec(cx->blk_sub.cv);
2134 	    oldsave = PL_scopestack[PL_scopestack_ix - 1];
2135 	    LEAVE_SCOPE(oldsave);
2136 
2137 	    /* Now do some callish stuff. */
2138 	    SAVETMPS;
2139 	    if (CvXSUB(cv)) {
2140 #ifdef PERL_XSUB_OLDSTYLE
2141 		if (CvOLDSTYLE(cv)) {
2142 		    I32 (*fp3)(int,int,int);
2143 		    while (SP > mark) {
2144 			SP[1] = SP[0];
2145 			SP--;
2146 		    }
2147 		    fp3 = (I32(*)(int,int,int))CvXSUB(cv);
2148 		    items = (*fp3)(CvXSUBANY(cv).any_i32,
2149 		                   mark - PL_stack_base + 1,
2150 				   items);
2151 		    SP = PL_stack_base + items;
2152 		}
2153 		else
2154 #endif /* PERL_XSUB_OLDSTYLE */
2155 		{
2156 		    SV **newsp;
2157 		    I32 gimme;
2158 
2159 		    PL_stack_sp--;		/* There is no cv arg. */
2160 		    /* Push a mark for the start of arglist */
2161 		    PUSHMARK(mark);
2162 		    (void)(*CvXSUB(cv))(aTHX_ cv);
2163 		    /* Pop the current context like a decent sub should */
2164 		    POPBLOCK(cx, PL_curpm);
2165 		    /* Do _not_ use PUTBACK, keep the XSUB's return stack! */
2166 		}
2167 		LEAVE;
2168 		return pop_return();
2169 	    }
2170 	    else {
2171 		AV* padlist = CvPADLIST(cv);
2172 		SV** svp = AvARRAY(padlist);
2173 		if (CxTYPE(cx) == CXt_EVAL) {
2174 		    PL_in_eval = cx->blk_eval.old_in_eval;
2175 		    PL_eval_root = cx->blk_eval.old_eval_root;
2176 		    cx->cx_type = CXt_SUB;
2177 		    cx->blk_sub.hasargs = 0;
2178 		}
2179 		cx->blk_sub.cv = cv;
2180 		cx->blk_sub.olddepth = (U16)CvDEPTH(cv);
2181 		CvDEPTH(cv)++;
2182 		if (CvDEPTH(cv) < 2)
2183 		    (void)SvREFCNT_inc(cv);
2184 		else {	/* save temporaries on recursion? */
2185 		    if (CvDEPTH(cv) == 100 && ckWARN(WARN_RECURSION))
2186 			sub_crush_depth(cv);
2187 		    if (CvDEPTH(cv) > AvFILLp(padlist)) {
2188 			AV *newpad = newAV();
2189 			SV **oldpad = AvARRAY(svp[CvDEPTH(cv)-1]);
2190 			I32 ix = AvFILLp((AV*)svp[1]);
2191 			I32 names_fill = AvFILLp((AV*)svp[0]);
2192 			svp = AvARRAY(svp[0]);
2193 			for ( ;ix > 0; ix--) {
2194 			    if (names_fill >= ix && svp[ix] != &PL_sv_undef) {
2195 				char *name = SvPVX(svp[ix]);
2196 				if ((SvFLAGS(svp[ix]) & SVf_FAKE)
2197 				    || *name == '&')
2198 				{
2199 				    /* outer lexical or anon code */
2200 				    av_store(newpad, ix,
2201 					SvREFCNT_inc(oldpad[ix]) );
2202 				}
2203 				else {		/* our own lexical */
2204 				    if (*name == '@')
2205 					av_store(newpad, ix, sv = (SV*)newAV());
2206 				    else if (*name == '%')
2207 					av_store(newpad, ix, sv = (SV*)newHV());
2208 				    else
2209 					av_store(newpad, ix, sv = NEWSV(0,0));
2210 				    SvPADMY_on(sv);
2211 				}
2212 			    }
2213 			    else if (IS_PADGV(oldpad[ix]) || IS_PADCONST(oldpad[ix])) {
2214 				av_store(newpad, ix, sv = SvREFCNT_inc(oldpad[ix]));
2215 			    }
2216 			    else {
2217 				av_store(newpad, ix, sv = NEWSV(0,0));
2218 				SvPADTMP_on(sv);
2219 			    }
2220 			}
2221 			if (cx->blk_sub.hasargs) {
2222 			    AV* av = newAV();
2223 			    av_extend(av, 0);
2224 			    av_store(newpad, 0, (SV*)av);
2225 			    AvFLAGS(av) = AVf_REIFY;
2226 			}
2227 			av_store(padlist, CvDEPTH(cv), (SV*)newpad);
2228 			AvFILLp(padlist) = CvDEPTH(cv);
2229 			svp = AvARRAY(padlist);
2230 		    }
2231 		}
2232 #ifdef USE_5005THREADS
2233 		if (!cx->blk_sub.hasargs) {
2234 		    AV* av = (AV*)PL_curpad[0];
2235 
2236 		    items = AvFILLp(av) + 1;
2237 		    if (items) {
2238 			/* Mark is at the end of the stack. */
2239 			EXTEND(SP, items);
2240 			Copy(AvARRAY(av), SP + 1, items, SV*);
2241 			SP += items;
2242 			PUTBACK ;
2243 		    }
2244 		}
2245 #endif /* USE_5005THREADS */
2246 		SAVEVPTR(PL_curpad);
2247 		PL_curpad = AvARRAY((AV*)svp[CvDEPTH(cv)]);
2248 #ifndef USE_5005THREADS
2249 		if (cx->blk_sub.hasargs)
2250 #endif /* USE_5005THREADS */
2251 		{
2252 		    AV* av = (AV*)PL_curpad[0];
2253 		    SV** ary;
2254 
2255 #ifndef USE_5005THREADS
2256 		    cx->blk_sub.savearray = GvAV(PL_defgv);
2257 		    GvAV(PL_defgv) = (AV*)SvREFCNT_inc(av);
2258 #endif /* USE_5005THREADS */
2259 		    cx->blk_sub.oldcurpad = PL_curpad;
2260 		    cx->blk_sub.argarray = av;
2261 		    ++mark;
2262 
2263 		    if (items >= AvMAX(av) + 1) {
2264 			ary = AvALLOC(av);
2265 			if (AvARRAY(av) != ary) {
2266 			    AvMAX(av) += AvARRAY(av) - AvALLOC(av);
2267 			    SvPVX(av) = (char*)ary;
2268 			}
2269 			if (items >= AvMAX(av) + 1) {
2270 			    AvMAX(av) = items - 1;
2271 			    Renew(ary,items+1,SV*);
2272 			    AvALLOC(av) = ary;
2273 			    SvPVX(av) = (char*)ary;
2274 			}
2275 		    }
2276 		    Copy(mark,AvARRAY(av),items,SV*);
2277 		    AvFILLp(av) = items - 1;
2278 		    assert(!AvREAL(av));
2279 		    while (items--) {
2280 			if (*mark)
2281 			    SvTEMP_off(*mark);
2282 			mark++;
2283 		    }
2284 		}
2285 		if (PERLDB_SUB) {	/* Checking curstash breaks DProf. */
2286 		    /*
2287 		     * We do not care about using sv to call CV;
2288 		     * it's for informational purposes only.
2289 		     */
2290 		    SV *sv = GvSV(PL_DBsub);
2291 		    CV *gotocv;
2292 
2293 		    if (PERLDB_SUB_NN) {
2294 			SvIVX(sv) = PTR2IV(cv); /* Already upgraded, saved */
2295 		    } else {
2296 			save_item(sv);
2297 			gv_efullname3(sv, CvGV(cv), Nullch);
2298 		    }
2299 		    if (  PERLDB_GOTO
2300 			  && (gotocv = get_cv("DB::goto", FALSE)) ) {
2301 			PUSHMARK( PL_stack_sp );
2302 			call_sv((SV*)gotocv, G_SCALAR | G_NODEBUG);
2303 			PL_stack_sp--;
2304 		    }
2305 		}
2306 		RETURNOP(CvSTART(cv));
2307 	    }
2308 	}
2309 	else {
2310 	    label = SvPV(sv,n_a);
2311 	    if (!(do_dump || *label))
2312 		DIE(aTHX_ must_have_label);
2313 	}
2314     }
2315     else if (PL_op->op_flags & OPf_SPECIAL) {
2316 	if (! do_dump)
2317 	    DIE(aTHX_ must_have_label);
2318     }
2319     else
2320 	label = cPVOP->op_pv;
2321 
2322     if (label && *label) {
2323 	OP *gotoprobe = 0;
2324 	bool leaving_eval = FALSE;
2325         PERL_CONTEXT *last_eval_cx = 0;
2326 
2327 	/* find label */
2328 
2329 	PL_lastgotoprobe = 0;
2330 	*enterops = 0;
2331 	for (ix = cxstack_ix; ix >= 0; ix--) {
2332 	    cx = &cxstack[ix];
2333 	    switch (CxTYPE(cx)) {
2334 	    case CXt_EVAL:
2335 		leaving_eval = TRUE;
2336                 if (CxREALEVAL(cx)) {
2337 		    gotoprobe = (last_eval_cx ?
2338 				last_eval_cx->blk_eval.old_eval_root :
2339 				PL_eval_root);
2340 		    last_eval_cx = cx;
2341 		    break;
2342                 }
2343                 /* else fall through */
2344 	    case CXt_LOOP:
2345 		gotoprobe = cx->blk_oldcop->op_sibling;
2346 		break;
2347 	    case CXt_SUBST:
2348 		continue;
2349 	    case CXt_BLOCK:
2350 		if (ix)
2351 		    gotoprobe = cx->blk_oldcop->op_sibling;
2352 		else
2353 		    gotoprobe = PL_main_root;
2354 		break;
2355 	    case CXt_SUB:
2356 		if (CvDEPTH(cx->blk_sub.cv)) {
2357 		    gotoprobe = CvROOT(cx->blk_sub.cv);
2358 		    break;
2359 		}
2360 		/* FALL THROUGH */
2361 	    case CXt_FORMAT:
2362 	    case CXt_NULL:
2363 		DIE(aTHX_ "Can't \"goto\" out of a pseudo block");
2364 	    default:
2365 		if (ix)
2366 		    DIE(aTHX_ "panic: goto");
2367 		gotoprobe = PL_main_root;
2368 		break;
2369 	    }
2370 	    if (gotoprobe) {
2371 		retop = dofindlabel(gotoprobe, label,
2372 				    enterops, enterops + GOTO_DEPTH);
2373 		if (retop)
2374 		    break;
2375 	    }
2376 	    PL_lastgotoprobe = gotoprobe;
2377 	}
2378 	if (!retop)
2379 	    DIE(aTHX_ "Can't find label %s", label);
2380 
2381 	/* if we're leaving an eval, check before we pop any frames
2382            that we're not going to punt, otherwise the error
2383 	   won't be caught */
2384 
2385 	if (leaving_eval && *enterops && enterops[1]) {
2386 	    I32 i;
2387             for (i = 1; enterops[i]; i++)
2388                 if (enterops[i]->op_type == OP_ENTERITER)
2389                     DIE(aTHX_ "Can't \"goto\" into the middle of a foreach loop");
2390 	}
2391 
2392 	/* pop unwanted frames */
2393 
2394 	if (ix < cxstack_ix) {
2395 	    I32 oldsave;
2396 
2397 	    if (ix < 0)
2398 		ix = 0;
2399 	    dounwind(ix);
2400 	    TOPBLOCK(cx);
2401 	    oldsave = PL_scopestack[PL_scopestack_ix];
2402 	    LEAVE_SCOPE(oldsave);
2403 	}
2404 
2405 	/* push wanted frames */
2406 
2407 	if (*enterops && enterops[1]) {
2408 	    OP *oldop = PL_op;
2409 	    for (ix = 1; enterops[ix]; ix++) {
2410 		PL_op = enterops[ix];
2411 		/* Eventually we may want to stack the needed arguments
2412 		 * for each op.  For now, we punt on the hard ones. */
2413 		if (PL_op->op_type == OP_ENTERITER)
2414 		    DIE(aTHX_ "Can't \"goto\" into the middle of a foreach loop");
2415 		CALL_FPTR(PL_op->op_ppaddr)(aTHX);
2416 	    }
2417 	    PL_op = oldop;
2418 	}
2419     }
2420 
2421     if (do_dump) {
2422 #ifdef VMS
2423 	if (!retop) retop = PL_main_start;
2424 #endif
2425 	PL_restartop = retop;
2426 	PL_do_undump = TRUE;
2427 
2428 	my_unexec();
2429 
2430 	PL_restartop = 0;		/* hmm, must be GNU unexec().. */
2431 	PL_do_undump = FALSE;
2432     }
2433 
2434     RETURNOP(retop);
2435 }
2436 
2437 PP(pp_exit)
2438 {
2439     dSP;
2440     I32 anum;
2441 
2442     if (MAXARG < 1)
2443 	anum = 0;
2444     else {
2445 	anum = SvIVx(POPs);
2446 #ifdef VMS
2447         if (anum == 1 && (PL_op->op_private & OPpEXIT_VMSISH))
2448 	    anum = 0;
2449         VMSISH_HUSHED  = VMSISH_HUSHED || (PL_op->op_private & OPpHUSH_VMSISH);
2450 #endif
2451     }
2452     PL_exit_flags |= PERL_EXIT_EXPECTED;
2453     my_exit(anum);
2454     PUSHs(&PL_sv_undef);
2455     RETURN;
2456 }
2457 
2458 #ifdef NOTYET
2459 PP(pp_nswitch)
2460 {
2461     dSP;
2462     NV value = SvNVx(GvSV(cCOP->cop_gv));
2463     register I32 match = I_32(value);
2464 
2465     if (value < 0.0) {
2466 	if (((NV)match) > value)
2467 	    --match;		/* was fractional--truncate other way */
2468     }
2469     match -= cCOP->uop.scop.scop_offset;
2470     if (match < 0)
2471 	match = 0;
2472     else if (match > cCOP->uop.scop.scop_max)
2473 	match = cCOP->uop.scop.scop_max;
2474     PL_op = cCOP->uop.scop.scop_next[match];
2475     RETURNOP(PL_op);
2476 }
2477 
2478 PP(pp_cswitch)
2479 {
2480     dSP;
2481     register I32 match;
2482 
2483     if (PL_multiline)
2484 	PL_op = PL_op->op_next;			/* can't assume anything */
2485     else {
2486 	STRLEN n_a;
2487 	match = *(SvPVx(GvSV(cCOP->cop_gv), n_a)) & 255;
2488 	match -= cCOP->uop.scop.scop_offset;
2489 	if (match < 0)
2490 	    match = 0;
2491 	else if (match > cCOP->uop.scop.scop_max)
2492 	    match = cCOP->uop.scop.scop_max;
2493 	PL_op = cCOP->uop.scop.scop_next[match];
2494     }
2495     RETURNOP(PL_op);
2496 }
2497 #endif
2498 
2499 /* Eval. */
2500 
2501 STATIC void
2502 S_save_lines(pTHX_ AV *array, SV *sv)
2503 {
2504     register char *s = SvPVX(sv);
2505     register char *send = SvPVX(sv) + SvCUR(sv);
2506     register char *t;
2507     register I32 line = 1;
2508 
2509     while (s && s < send) {
2510 	SV *tmpstr = NEWSV(85,0);
2511 
2512 	sv_upgrade(tmpstr, SVt_PVMG);
2513 	t = strchr(s, '\n');
2514 	if (t)
2515 	    t++;
2516 	else
2517 	    t = send;
2518 
2519 	sv_setpvn(tmpstr, s, t - s);
2520 	av_store(array, line++, tmpstr);
2521 	s = t;
2522     }
2523 }
2524 
2525 #ifdef PERL_FLEXIBLE_EXCEPTIONS
2526 STATIC void *
2527 S_docatch_body(pTHX_ va_list args)
2528 {
2529     return docatch_body();
2530 }
2531 #endif
2532 
2533 STATIC void *
2534 S_docatch_body(pTHX)
2535 {
2536     CALLRUNOPS(aTHX);
2537     return NULL;
2538 }
2539 
2540 STATIC OP *
2541 S_docatch(pTHX_ OP *o)
2542 {
2543     int ret;
2544     OP *oldop = PL_op;
2545     OP *retop;
2546     volatile PERL_SI *cursi = PL_curstackinfo;
2547     dJMPENV;
2548 
2549 #ifdef DEBUGGING
2550     assert(CATCH_GET == TRUE);
2551 #endif
2552     PL_op = o;
2553 
2554     /* Normally, the leavetry at the end of this block of ops will
2555      * pop an op off the return stack and continue there. By setting
2556      * the op to Nullop, we force an exit from the inner runops()
2557      * loop. DAPM.
2558      */
2559     retop = pop_return();
2560     push_return(Nullop);
2561 
2562 #ifdef PERL_FLEXIBLE_EXCEPTIONS
2563  redo_body:
2564     CALLPROTECT(aTHX_ pcur_env, &ret, MEMBER_TO_FPTR(S_docatch_body));
2565 #else
2566     JMPENV_PUSH(ret);
2567 #endif
2568     switch (ret) {
2569     case 0:
2570 #ifndef PERL_FLEXIBLE_EXCEPTIONS
2571  redo_body:
2572 	docatch_body();
2573 #endif
2574 	break;
2575     case 3:
2576 	/* die caught by an inner eval - continue inner loop */
2577 	if (PL_restartop && cursi == PL_curstackinfo) {
2578 	    PL_op = PL_restartop;
2579 	    PL_restartop = 0;
2580 	    goto redo_body;
2581 	}
2582 	/* a die in this eval - continue in outer loop */
2583 	if (!PL_restartop)
2584 	    break;
2585 	/* FALL THROUGH */
2586     default:
2587 	JMPENV_POP;
2588 	PL_op = oldop;
2589 	JMPENV_JUMP(ret);
2590 	/* NOTREACHED */
2591     }
2592     JMPENV_POP;
2593     PL_op = oldop;
2594     return retop;
2595 }
2596 
2597 OP *
2598 Perl_sv_compile_2op(pTHX_ SV *sv, OP** startop, char *code, AV** avp)
2599 /* sv Text to convert to OP tree. */
2600 /* startop op_free() this to undo. */
2601 /* code Short string id of the caller. */
2602 {
2603     dSP;				/* Make POPBLOCK work. */
2604     PERL_CONTEXT *cx;
2605     SV **newsp;
2606     I32 gimme = 0;   /* SUSPECT - INITIALZE TO WHAT?  NI-S */
2607     I32 optype;
2608     OP dummy;
2609     OP *rop;
2610     char tbuf[TYPE_DIGITS(long) + 12 + 10];
2611     char *tmpbuf = tbuf;
2612     char *safestr;
2613 
2614     ENTER;
2615     lex_start(sv);
2616     SAVETMPS;
2617     /* switch to eval mode */
2618 
2619     if (PL_curcop == &PL_compiling) {
2620 	SAVECOPSTASH_FREE(&PL_compiling);
2621 	CopSTASH_set(&PL_compiling, PL_curstash);
2622     }
2623     if (PERLDB_NAMEEVAL && CopLINE(PL_curcop)) {
2624 	SV *sv = sv_newmortal();
2625 	Perl_sv_setpvf(aTHX_ sv, "_<(%.10seval %lu)[%s:%"IVdf"]",
2626 		       code, (unsigned long)++PL_evalseq,
2627 		       CopFILE(PL_curcop), (IV)CopLINE(PL_curcop));
2628 	tmpbuf = SvPVX(sv);
2629     }
2630     else
2631 	sprintf(tmpbuf, "_<(%.10s_eval %lu)", code, (unsigned long)++PL_evalseq);
2632     SAVECOPFILE_FREE(&PL_compiling);
2633     CopFILE_set(&PL_compiling, tmpbuf+2);
2634     SAVECOPLINE(&PL_compiling);
2635     CopLINE_set(&PL_compiling, 1);
2636     /* XXX For C<eval "...">s within BEGIN {} blocks, this ends up
2637        deleting the eval's FILEGV from the stash before gv_check() runs
2638        (i.e. before run-time proper). To work around the coredump that
2639        ensues, we always turn GvMULTI_on for any globals that were
2640        introduced within evals. See force_ident(). GSAR 96-10-12 */
2641     safestr = savepv(tmpbuf);
2642     SAVEDELETE(PL_defstash, safestr, strlen(safestr));
2643     SAVEHINTS();
2644 #ifdef OP_IN_REGISTER
2645     PL_opsave = op;
2646 #else
2647     SAVEVPTR(PL_op);
2648 #endif
2649     PL_hints &= HINT_UTF8;
2650 
2651     PL_op = &dummy;
2652     PL_op->op_type = OP_ENTEREVAL;
2653     PL_op->op_flags = 0;			/* Avoid uninit warning. */
2654     PUSHBLOCK(cx, CXt_EVAL|(PL_curcop == &PL_compiling ? 0 : CXp_REAL), SP);
2655     PUSHEVAL(cx, 0, Nullgv);
2656     rop = doeval(G_SCALAR, startop);
2657     POPBLOCK(cx,PL_curpm);
2658     POPEVAL(cx);
2659 
2660     (*startop)->op_type = OP_NULL;
2661     (*startop)->op_ppaddr = PL_ppaddr[OP_NULL];
2662     lex_end();
2663     *avp = (AV*)SvREFCNT_inc(PL_comppad);
2664     LEAVE;
2665     if (PL_curcop == &PL_compiling)
2666 	PL_compiling.op_private = (U8)(PL_hints & HINT_PRIVATE_MASK);
2667 #ifdef OP_IN_REGISTER
2668     op = PL_opsave;
2669 #endif
2670     return rop;
2671 }
2672 
2673 /* With USE_5005THREADS, eval_owner must be held on entry to doeval */
2674 STATIC OP *
2675 S_doeval(pTHX_ int gimme, OP** startop)
2676 {
2677     dSP;
2678     OP *saveop = PL_op;
2679     CV *caller;
2680     AV* comppadlist;
2681     I32 i;
2682 
2683     PL_in_eval = ((saveop && saveop->op_type == OP_REQUIRE)
2684 		  ? (EVAL_INREQUIRE | (PL_in_eval & EVAL_INEVAL))
2685 		  : EVAL_INEVAL);
2686 
2687     PUSHMARK(SP);
2688 
2689     /* set up a scratch pad */
2690 
2691     SAVEI32(PL_padix);
2692     SAVEVPTR(PL_curpad);
2693     SAVESPTR(PL_comppad);
2694     SAVESPTR(PL_comppad_name);
2695     SAVEI32(PL_comppad_name_fill);
2696     SAVEI32(PL_min_intro_pending);
2697     SAVEI32(PL_max_intro_pending);
2698 
2699     caller = PL_compcv;
2700     for (i = cxstack_ix - 1; i >= 0; i--) {
2701 	PERL_CONTEXT *cx = &cxstack[i];
2702 	if (CxTYPE(cx) == CXt_EVAL)
2703 	    break;
2704 	else if (CxTYPE(cx) == CXt_SUB || CxTYPE(cx) == CXt_FORMAT) {
2705 	    caller = cx->blk_sub.cv;
2706 	    break;
2707 	}
2708     }
2709 
2710     SAVESPTR(PL_compcv);
2711     PL_compcv = (CV*)NEWSV(1104,0);
2712     sv_upgrade((SV *)PL_compcv, SVt_PVCV);
2713     CvEVAL_on(PL_compcv);
2714     assert(CxTYPE(&cxstack[cxstack_ix]) == CXt_EVAL);
2715     cxstack[cxstack_ix].blk_eval.cv = PL_compcv;
2716 
2717 #ifdef USE_5005THREADS
2718     CvOWNER(PL_compcv) = 0;
2719     New(666, CvMUTEXP(PL_compcv), 1, perl_mutex);
2720     MUTEX_INIT(CvMUTEXP(PL_compcv));
2721 #endif /* USE_5005THREADS */
2722 
2723     PL_comppad = newAV();
2724     av_push(PL_comppad, Nullsv);
2725     PL_curpad = AvARRAY(PL_comppad);
2726     PL_comppad_name = newAV();
2727     PL_comppad_name_fill = 0;
2728     PL_min_intro_pending = 0;
2729     PL_padix = 0;
2730 #ifdef USE_5005THREADS
2731     av_store(PL_comppad_name, 0, newSVpvn("@_", 2));
2732     PL_curpad[0] = (SV*)newAV();
2733     SvPADMY_on(PL_curpad[0]);	/* XXX Needed? */
2734 #endif /* USE_5005THREADS */
2735 
2736     comppadlist = newAV();
2737     AvREAL_off(comppadlist);
2738     av_store(comppadlist, 0, (SV*)PL_comppad_name);
2739     av_store(comppadlist, 1, (SV*)PL_comppad);
2740     CvPADLIST(PL_compcv) = comppadlist;
2741 
2742     if (!saveop ||
2743 	(saveop->op_type != OP_REQUIRE && saveop->op_type != OP_DOFILE))
2744     {
2745 	CvOUTSIDE(PL_compcv) = (CV*)SvREFCNT_inc(caller);
2746     }
2747 
2748     SAVEMORTALIZESV(PL_compcv);	/* must remain until end of current statement */
2749 
2750     /* make sure we compile in the right package */
2751 
2752     if (CopSTASH_ne(PL_curcop, PL_curstash)) {
2753 	SAVESPTR(PL_curstash);
2754 	PL_curstash = CopSTASH(PL_curcop);
2755     }
2756     SAVESPTR(PL_beginav);
2757     PL_beginav = newAV();
2758     SAVEFREESV(PL_beginav);
2759     SAVEI32(PL_error_count);
2760 
2761     /* try to compile it */
2762 
2763     PL_eval_root = Nullop;
2764     PL_error_count = 0;
2765     PL_curcop = &PL_compiling;
2766     PL_curcop->cop_arybase = 0;
2767     if (saveop && saveop->op_flags & OPf_SPECIAL)
2768 	PL_in_eval |= EVAL_KEEPERR;
2769     else
2770 	sv_setpv(ERRSV,"");
2771     if (yyparse() || PL_error_count || !PL_eval_root) {
2772 	SV **newsp;
2773 	I32 gimme;
2774 	PERL_CONTEXT *cx;
2775 	I32 optype = 0;			/* Might be reset by POPEVAL. */
2776 	STRLEN n_a;
2777 
2778 	PL_op = saveop;
2779 	if (PL_eval_root) {
2780 	    op_free(PL_eval_root);
2781 	    PL_eval_root = Nullop;
2782 	}
2783 	SP = PL_stack_base + POPMARK;		/* pop original mark */
2784 	if (!startop) {
2785 	    POPBLOCK(cx,PL_curpm);
2786 	    POPEVAL(cx);
2787 	    pop_return();
2788 	}
2789 	lex_end();
2790 	LEAVE;
2791 	if (optype == OP_REQUIRE) {
2792 	    char* msg = SvPVx(ERRSV, n_a);
2793 	    DIE(aTHX_ "%sCompilation failed in require",
2794 		*msg ? msg : "Unknown error\n");
2795 	}
2796 	else if (startop) {
2797 	    char* msg = SvPVx(ERRSV, n_a);
2798 
2799 	    POPBLOCK(cx,PL_curpm);
2800 	    POPEVAL(cx);
2801 	    Perl_croak(aTHX_ "%sCompilation failed in regexp",
2802 		       (*msg ? msg : "Unknown error\n"));
2803 	}
2804 #ifdef USE_5005THREADS
2805 	MUTEX_LOCK(&PL_eval_mutex);
2806 	PL_eval_owner = 0;
2807 	COND_SIGNAL(&PL_eval_cond);
2808 	MUTEX_UNLOCK(&PL_eval_mutex);
2809 #endif /* USE_5005THREADS */
2810 	RETPUSHUNDEF;
2811     }
2812     CopLINE_set(&PL_compiling, 0);
2813     if (startop) {
2814 	*startop = PL_eval_root;
2815 	SvREFCNT_dec(CvOUTSIDE(PL_compcv));
2816 	CvOUTSIDE(PL_compcv) = Nullcv;
2817     } else
2818 	SAVEFREEOP(PL_eval_root);
2819     if (gimme & G_VOID)
2820 	scalarvoid(PL_eval_root);
2821     else if (gimme & G_ARRAY)
2822 	list(PL_eval_root);
2823     else
2824 	scalar(PL_eval_root);
2825 
2826     DEBUG_x(dump_eval());
2827 
2828     /* Register with debugger: */
2829     if (PERLDB_INTER && saveop->op_type == OP_REQUIRE) {
2830 	CV *cv = get_cv("DB::postponed", FALSE);
2831 	if (cv) {
2832 	    dSP;
2833 	    PUSHMARK(SP);
2834 	    XPUSHs((SV*)CopFILEGV(&PL_compiling));
2835 	    PUTBACK;
2836 	    call_sv((SV*)cv, G_DISCARD);
2837 	}
2838     }
2839 
2840     /* compiled okay, so do it */
2841 
2842     CvDEPTH(PL_compcv) = 1;
2843     SP = PL_stack_base + POPMARK;		/* pop original mark */
2844     PL_op = saveop;			/* The caller may need it. */
2845     PL_lex_state = LEX_NOTPARSING;	/* $^S needs this. */
2846 #ifdef USE_5005THREADS
2847     MUTEX_LOCK(&PL_eval_mutex);
2848     PL_eval_owner = 0;
2849     COND_SIGNAL(&PL_eval_cond);
2850     MUTEX_UNLOCK(&PL_eval_mutex);
2851 #endif /* USE_5005THREADS */
2852 
2853     RETURNOP(PL_eval_start);
2854 }
2855 
2856 STATIC PerlIO *
2857 S_doopen_pmc(pTHX_ const char *name, const char *mode)
2858 {
2859     STRLEN namelen = strlen(name);
2860     PerlIO *fp;
2861 
2862     if (namelen > 3 && strEQ(name + namelen - 3, ".pm")) {
2863 	SV *pmcsv = Perl_newSVpvf(aTHX_ "%s%c", name, 'c');
2864 	char *pmc = SvPV_nolen(pmcsv);
2865 	Stat_t pmstat;
2866 	Stat_t pmcstat;
2867 	if (PerlLIO_stat(pmc, &pmcstat) < 0) {
2868 	    fp = PerlIO_open(name, mode);
2869 	}
2870 	else {
2871 	    if (PerlLIO_stat(name, &pmstat) < 0 ||
2872 	        pmstat.st_mtime < pmcstat.st_mtime)
2873 	    {
2874 		fp = PerlIO_open(pmc, mode);
2875 	    }
2876 	    else {
2877 		fp = PerlIO_open(name, mode);
2878 	    }
2879 	}
2880 	SvREFCNT_dec(pmcsv);
2881     }
2882     else {
2883 	fp = PerlIO_open(name, mode);
2884     }
2885     return fp;
2886 }
2887 
2888 PP(pp_require)
2889 {
2890     dSP;
2891     register PERL_CONTEXT *cx;
2892     SV *sv;
2893     char *name;
2894     STRLEN len;
2895     char *tryname = Nullch;
2896     SV *namesv = Nullsv;
2897     SV** svp;
2898     I32 gimme = GIMME_V;
2899     PerlIO *tryrsfp = 0;
2900     STRLEN n_a;
2901     int filter_has_file = 0;
2902     GV *filter_child_proc = 0;
2903     SV *filter_state = 0;
2904     SV *filter_sub = 0;
2905     SV *hook_sv = 0;
2906     SV *encoding;
2907     OP *op;
2908 
2909     sv = POPs;
2910     if (SvNIOKp(sv) && PL_op->op_type != OP_DOFILE) {
2911 	if (SvPOK(sv) && SvNOK(sv) && SvNV(sv)) {		/* require v5.6.1 */
2912 	    UV rev = 0, ver = 0, sver = 0;
2913 	    STRLEN len;
2914 	    U8 *s = (U8*)SvPVX(sv);
2915 	    U8 *end = (U8*)SvPVX(sv) + SvCUR(sv);
2916 	    if (s < end) {
2917 		rev = utf8n_to_uvchr(s, end - s, &len, 0);
2918 		s += len;
2919 		if (s < end) {
2920 		    ver = utf8n_to_uvchr(s, end - s, &len, 0);
2921 		    s += len;
2922 		    if (s < end)
2923 			sver = utf8n_to_uvchr(s, end - s, &len, 0);
2924 		}
2925 	    }
2926 	    if (PERL_REVISION < rev
2927 		|| (PERL_REVISION == rev
2928 		    && (PERL_VERSION < ver
2929 			|| (PERL_VERSION == ver
2930 			    && PERL_SUBVERSION < sver))))
2931 	    {
2932 		DIE(aTHX_ "Perl v%"UVuf".%"UVuf".%"UVuf" required--this is only "
2933 		    "v%d.%d.%d, stopped", rev, ver, sver, PERL_REVISION,
2934 		    PERL_VERSION, PERL_SUBVERSION);
2935 	    }
2936 	    if (ckWARN(WARN_PORTABLE))
2937 		Perl_warner(aTHX_ packWARN(WARN_PORTABLE),
2938                         "v-string in use/require non-portable");
2939 	    RETPUSHYES;
2940 	}
2941 	else if (!SvPOKp(sv)) {			/* require 5.005_03 */
2942 	    if ((NV)PERL_REVISION + ((NV)PERL_VERSION/(NV)1000)
2943 		+ ((NV)PERL_SUBVERSION/(NV)1000000)
2944 		+ 0.00000099 < SvNV(sv))
2945 	    {
2946 		NV nrev = SvNV(sv);
2947 		UV rev = (UV)nrev;
2948 		NV nver = (nrev - rev) * 1000;
2949 		UV ver = (UV)(nver + 0.0009);
2950 		NV nsver = (nver - ver) * 1000;
2951 		UV sver = (UV)(nsver + 0.0009);
2952 
2953 		/* help out with the "use 5.6" confusion */
2954 		if (sver == 0 && (rev > 5 || (rev == 5 && ver >= 100))) {
2955 		    DIE(aTHX_ "Perl v%"UVuf".%"UVuf".%"UVuf" required"
2956 			" (did you mean v%"UVuf".%03"UVuf"?)--"
2957 			"this is only v%d.%d.%d, stopped",
2958 			rev, ver, sver, rev, ver/100,
2959 			PERL_REVISION, PERL_VERSION, PERL_SUBVERSION);
2960 		}
2961 		else {
2962 		    DIE(aTHX_ "Perl v%"UVuf".%"UVuf".%"UVuf" required--"
2963 			"this is only v%d.%d.%d, stopped",
2964 			rev, ver, sver, PERL_REVISION, PERL_VERSION,
2965 			PERL_SUBVERSION);
2966 		}
2967 	    }
2968 	    RETPUSHYES;
2969 	}
2970     }
2971     name = SvPV(sv, len);
2972     if (!(name && len > 0 && *name))
2973 	DIE(aTHX_ "Null filename used");
2974     TAINT_PROPER("require");
2975     if (PL_op->op_type == OP_REQUIRE &&
2976       (svp = hv_fetch(GvHVn(PL_incgv), name, len, 0)) &&
2977       *svp != &PL_sv_undef)
2978 	RETPUSHYES;
2979 
2980     /* prepare to compile file */
2981 
2982     if (path_is_absolute(name)) {
2983 	tryname = name;
2984 	tryrsfp = doopen_pmc(name,PERL_SCRIPT_MODE);
2985     }
2986 #ifdef MACOS_TRADITIONAL
2987     if (!tryrsfp) {
2988 	char newname[256];
2989 
2990 	MacPerl_CanonDir(name, newname, 1);
2991 	if (path_is_absolute(newname)) {
2992 	    tryname = newname;
2993 	    tryrsfp = doopen_pmc(newname,PERL_SCRIPT_MODE);
2994 	}
2995     }
2996 #endif
2997     if (!tryrsfp) {
2998 	AV *ar = GvAVn(PL_incgv);
2999 	I32 i;
3000 #ifdef VMS
3001 	char *unixname;
3002 	if ((unixname = tounixspec(name, Nullch)) != Nullch)
3003 #endif
3004 	{
3005 	    namesv = NEWSV(806, 0);
3006 	    for (i = 0; i <= AvFILL(ar); i++) {
3007 		SV *dirsv = *av_fetch(ar, i, TRUE);
3008 
3009 		if (SvROK(dirsv)) {
3010 		    int count;
3011 		    SV *loader = dirsv;
3012 
3013 		    if (SvTYPE(SvRV(loader)) == SVt_PVAV
3014 			&& !sv_isobject(loader))
3015 		    {
3016 			loader = *av_fetch((AV *)SvRV(loader), 0, TRUE);
3017 		    }
3018 
3019 		    Perl_sv_setpvf(aTHX_ namesv, "/loader/0x%"UVxf"/%s",
3020 				   PTR2UV(SvRV(dirsv)), name);
3021 		    tryname = SvPVX(namesv);
3022 		    tryrsfp = 0;
3023 
3024 		    ENTER;
3025 		    SAVETMPS;
3026 		    EXTEND(SP, 2);
3027 
3028 		    PUSHMARK(SP);
3029 		    PUSHs(dirsv);
3030 		    PUSHs(sv);
3031 		    PUTBACK;
3032 		    if (sv_isobject(loader))
3033 			count = call_method("INC", G_ARRAY);
3034 		    else
3035 			count = call_sv(loader, G_ARRAY);
3036 		    SPAGAIN;
3037 
3038 		    if (count > 0) {
3039 			int i = 0;
3040 			SV *arg;
3041 
3042 			SP -= count - 1;
3043 			arg = SP[i++];
3044 
3045 			if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVGV) {
3046 			    arg = SvRV(arg);
3047 			}
3048 
3049 			if (SvTYPE(arg) == SVt_PVGV) {
3050 			    IO *io = GvIO((GV *)arg);
3051 
3052 			    ++filter_has_file;
3053 
3054 			    if (io) {
3055 				tryrsfp = IoIFP(io);
3056 				if (IoTYPE(io) == IoTYPE_PIPE) {
3057 				    /* reading from a child process doesn't
3058 				       nest -- when returning from reading
3059 				       the inner module, the outer one is
3060 				       unreadable (closed?)  I've tried to
3061 				       save the gv to manage the lifespan of
3062 				       the pipe, but this didn't help. XXX */
3063 				    filter_child_proc = (GV *)arg;
3064 				    (void)SvREFCNT_inc(filter_child_proc);
3065 				}
3066 				else {
3067 				    if (IoOFP(io) && IoOFP(io) != IoIFP(io)) {
3068 					PerlIO_close(IoOFP(io));
3069 				    }
3070 				    IoIFP(io) = Nullfp;
3071 				    IoOFP(io) = Nullfp;
3072 				}
3073 			    }
3074 
3075 			    if (i < count) {
3076 				arg = SP[i++];
3077 			    }
3078 			}
3079 
3080 			if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVCV) {
3081 			    filter_sub = arg;
3082 			    (void)SvREFCNT_inc(filter_sub);
3083 
3084 			    if (i < count) {
3085 				filter_state = SP[i];
3086 				(void)SvREFCNT_inc(filter_state);
3087 			    }
3088 
3089 			    if (tryrsfp == 0) {
3090 				tryrsfp = PerlIO_open("/dev/null",
3091 						      PERL_SCRIPT_MODE);
3092 			    }
3093 			}
3094 		    }
3095 
3096 		    PUTBACK;
3097 		    FREETMPS;
3098 		    LEAVE;
3099 
3100 		    if (tryrsfp) {
3101 			hook_sv = dirsv;
3102 			break;
3103 		    }
3104 
3105 		    filter_has_file = 0;
3106 		    if (filter_child_proc) {
3107 			SvREFCNT_dec(filter_child_proc);
3108 			filter_child_proc = 0;
3109 		    }
3110 		    if (filter_state) {
3111 			SvREFCNT_dec(filter_state);
3112 			filter_state = 0;
3113 		    }
3114 		    if (filter_sub) {
3115 			SvREFCNT_dec(filter_sub);
3116 			filter_sub = 0;
3117 		    }
3118 		}
3119 		else {
3120 		  if (!path_is_absolute(name)
3121 #ifdef MACOS_TRADITIONAL
3122 			/* We consider paths of the form :a:b ambiguous and interpret them first
3123 			   as global then as local
3124 			*/
3125 			|| (*name == ':' && name[1] != ':' && strchr(name+2, ':'))
3126 #endif
3127 		  ) {
3128 		    char *dir = SvPVx(dirsv, n_a);
3129 #ifdef MACOS_TRADITIONAL
3130 		    char buf1[256];
3131 		    char buf2[256];
3132 
3133 		    MacPerl_CanonDir(name, buf2, 1);
3134 		    Perl_sv_setpvf(aTHX_ namesv, "%s%s", MacPerl_CanonDir(dir, buf1, 0), buf2+(buf2[0] == ':'));
3135 #else
3136 #ifdef VMS
3137 		    char *unixdir;
3138 		    if ((unixdir = tounixpath(dir, Nullch)) == Nullch)
3139 			continue;
3140 		    sv_setpv(namesv, unixdir);
3141 		    sv_catpv(namesv, unixname);
3142 #else
3143 		    Perl_sv_setpvf(aTHX_ namesv, "%s/%s", dir, name);
3144 #endif
3145 #endif
3146 		    TAINT_PROPER("require");
3147 		    tryname = SvPVX(namesv);
3148 		    tryrsfp = doopen_pmc(tryname, PERL_SCRIPT_MODE);
3149 		    if (tryrsfp) {
3150 			if (tryname[0] == '.' && tryname[1] == '/')
3151 			    tryname += 2;
3152 			break;
3153 		    }
3154 		  }
3155 		}
3156 	    }
3157 	}
3158     }
3159     SAVECOPFILE_FREE(&PL_compiling);
3160     CopFILE_set(&PL_compiling, tryrsfp ? tryname : name);
3161     SvREFCNT_dec(namesv);
3162     if (!tryrsfp) {
3163 	if (PL_op->op_type == OP_REQUIRE) {
3164 	    char *msgstr = name;
3165 	    if (namesv) {			/* did we lookup @INC? */
3166 		SV *msg = sv_2mortal(newSVpv(msgstr,0));
3167 		SV *dirmsgsv = NEWSV(0, 0);
3168 		AV *ar = GvAVn(PL_incgv);
3169 		I32 i;
3170 		sv_catpvn(msg, " in @INC", 8);
3171 		if (instr(SvPVX(msg), ".h "))
3172 		    sv_catpv(msg, " (change .h to .ph maybe?)");
3173 		if (instr(SvPVX(msg), ".ph "))
3174 		    sv_catpv(msg, " (did you run h2ph?)");
3175 		sv_catpv(msg, " (@INC contains:");
3176 		for (i = 0; i <= AvFILL(ar); i++) {
3177 		    char *dir = SvPVx(*av_fetch(ar, i, TRUE), n_a);
3178 		    Perl_sv_setpvf(aTHX_ dirmsgsv, " %s", dir);
3179 		    sv_catsv(msg, dirmsgsv);
3180 		}
3181 		sv_catpvn(msg, ")", 1);
3182 		SvREFCNT_dec(dirmsgsv);
3183 		msgstr = SvPV_nolen(msg);
3184 	    }
3185 	    DIE(aTHX_ "Can't locate %s", msgstr);
3186 	}
3187 
3188 	RETPUSHUNDEF;
3189     }
3190     else
3191 	SETERRNO(0, SS$_NORMAL);
3192 
3193     /* Assume success here to prevent recursive requirement. */
3194     len = strlen(name);
3195     /* Check whether a hook in @INC has already filled %INC */
3196     if (!hook_sv || !(svp = hv_fetch(GvHVn(PL_incgv), name, len, 0))) {
3197 	(void)hv_store(GvHVn(PL_incgv), name, len,
3198 		       (hook_sv ? SvREFCNT_inc(hook_sv)
3199 				: newSVpv(CopFILE(&PL_compiling), 0)),
3200 		       0 );
3201     }
3202 
3203     ENTER;
3204     SAVETMPS;
3205     lex_start(sv_2mortal(newSVpvn("",0)));
3206     SAVEGENERICSV(PL_rsfp_filters);
3207     PL_rsfp_filters = Nullav;
3208 
3209     PL_rsfp = tryrsfp;
3210     SAVEHINTS();
3211     PL_hints = 0;
3212     SAVESPTR(PL_compiling.cop_warnings);
3213     if (PL_dowarn & G_WARN_ALL_ON)
3214         PL_compiling.cop_warnings = pWARN_ALL ;
3215     else if (PL_dowarn & G_WARN_ALL_OFF)
3216         PL_compiling.cop_warnings = pWARN_NONE ;
3217     else if (PL_taint_warn)
3218         PL_compiling.cop_warnings = newSVpvn(WARN_TAINTstring, WARNsize);
3219     else
3220         PL_compiling.cop_warnings = pWARN_STD ;
3221     SAVESPTR(PL_compiling.cop_io);
3222     PL_compiling.cop_io = Nullsv;
3223 
3224     if (filter_sub || filter_child_proc) {
3225 	SV *datasv = filter_add(run_user_filter, Nullsv);
3226 	IoLINES(datasv) = filter_has_file;
3227 	IoFMT_GV(datasv) = (GV *)filter_child_proc;
3228 	IoTOP_GV(datasv) = (GV *)filter_state;
3229 	IoBOTTOM_GV(datasv) = (GV *)filter_sub;
3230     }
3231 
3232     /* switch to eval mode */
3233     push_return(PL_op->op_next);
3234     PUSHBLOCK(cx, CXt_EVAL, SP);
3235     PUSHEVAL(cx, name, Nullgv);
3236 
3237     SAVECOPLINE(&PL_compiling);
3238     CopLINE_set(&PL_compiling, 0);
3239 
3240     PUTBACK;
3241 #ifdef USE_5005THREADS
3242     MUTEX_LOCK(&PL_eval_mutex);
3243     if (PL_eval_owner && PL_eval_owner != thr)
3244 	while (PL_eval_owner)
3245 	    COND_WAIT(&PL_eval_cond, &PL_eval_mutex);
3246     PL_eval_owner = thr;
3247     MUTEX_UNLOCK(&PL_eval_mutex);
3248 #endif /* USE_5005THREADS */
3249 
3250     /* Store and reset encoding. */
3251     encoding = PL_encoding;
3252     PL_encoding = Nullsv;
3253 
3254     op = DOCATCH(doeval(gimme, NULL));
3255 
3256     /* Restore encoding. */
3257     PL_encoding = encoding;
3258 
3259     return op;
3260 }
3261 
3262 PP(pp_dofile)
3263 {
3264     return pp_require();
3265 }
3266 
3267 PP(pp_entereval)
3268 {
3269     dSP;
3270     register PERL_CONTEXT *cx;
3271     dPOPss;
3272     I32 gimme = GIMME_V, was = PL_sub_generation;
3273     char tbuf[TYPE_DIGITS(long) + 12];
3274     char *tmpbuf = tbuf;
3275     char *safestr;
3276     STRLEN len;
3277     OP *ret;
3278 
3279     if (!SvPV(sv,len))
3280 	RETPUSHUNDEF;
3281     TAINT_PROPER("eval");
3282 
3283     ENTER;
3284     lex_start(sv);
3285     SAVETMPS;
3286 
3287     /* switch to eval mode */
3288 
3289     if (PERLDB_NAMEEVAL && CopLINE(PL_curcop)) {
3290 	SV *sv = sv_newmortal();
3291 	Perl_sv_setpvf(aTHX_ sv, "_<(eval %lu)[%s:%"IVdf"]",
3292 		       (unsigned long)++PL_evalseq,
3293 		       CopFILE(PL_curcop), (IV)CopLINE(PL_curcop));
3294 	tmpbuf = SvPVX(sv);
3295     }
3296     else
3297 	sprintf(tmpbuf, "_<(eval %lu)", (unsigned long)++PL_evalseq);
3298     SAVECOPFILE_FREE(&PL_compiling);
3299     CopFILE_set(&PL_compiling, tmpbuf+2);
3300     SAVECOPLINE(&PL_compiling);
3301     CopLINE_set(&PL_compiling, 1);
3302     /* XXX For C<eval "...">s within BEGIN {} blocks, this ends up
3303        deleting the eval's FILEGV from the stash before gv_check() runs
3304        (i.e. before run-time proper). To work around the coredump that
3305        ensues, we always turn GvMULTI_on for any globals that were
3306        introduced within evals. See force_ident(). GSAR 96-10-12 */
3307     safestr = savepv(tmpbuf);
3308     SAVEDELETE(PL_defstash, safestr, strlen(safestr));
3309     SAVEHINTS();
3310     PL_hints = PL_op->op_targ;
3311     SAVESPTR(PL_compiling.cop_warnings);
3312     if (specialWARN(PL_curcop->cop_warnings))
3313         PL_compiling.cop_warnings = PL_curcop->cop_warnings;
3314     else {
3315         PL_compiling.cop_warnings = newSVsv(PL_curcop->cop_warnings);
3316         SAVEFREESV(PL_compiling.cop_warnings);
3317     }
3318     SAVESPTR(PL_compiling.cop_io);
3319     if (specialCopIO(PL_curcop->cop_io))
3320         PL_compiling.cop_io = PL_curcop->cop_io;
3321     else {
3322         PL_compiling.cop_io = newSVsv(PL_curcop->cop_io);
3323         SAVEFREESV(PL_compiling.cop_io);
3324     }
3325 
3326     push_return(PL_op->op_next);
3327     PUSHBLOCK(cx, (CXt_EVAL|CXp_REAL), SP);
3328     PUSHEVAL(cx, 0, Nullgv);
3329 
3330     /* prepare to compile string */
3331 
3332     if (PERLDB_LINE && PL_curstash != PL_debstash)
3333 	save_lines(CopFILEAV(&PL_compiling), PL_linestr);
3334     PUTBACK;
3335 #ifdef USE_5005THREADS
3336     MUTEX_LOCK(&PL_eval_mutex);
3337     if (PL_eval_owner && PL_eval_owner != thr)
3338 	while (PL_eval_owner)
3339 	    COND_WAIT(&PL_eval_cond, &PL_eval_mutex);
3340     PL_eval_owner = thr;
3341     MUTEX_UNLOCK(&PL_eval_mutex);
3342 #endif /* USE_5005THREADS */
3343     ret = doeval(gimme, NULL);
3344     if (PERLDB_INTER && was != (I32)PL_sub_generation /* Some subs defined here. */
3345 	&& ret != PL_op->op_next) {	/* Successive compilation. */
3346 	strcpy(safestr, "_<(eval )");	/* Anything fake and short. */
3347     }
3348     return DOCATCH(ret);
3349 }
3350 
3351 PP(pp_leaveeval)
3352 {
3353     dSP;
3354     register SV **mark;
3355     SV **newsp;
3356     PMOP *newpm;
3357     I32 gimme;
3358     register PERL_CONTEXT *cx;
3359     OP *retop;
3360     U8 save_flags = PL_op -> op_flags;
3361     I32 optype;
3362 
3363     POPBLOCK(cx,newpm);
3364     POPEVAL(cx);
3365     retop = pop_return();
3366 
3367     TAINT_NOT;
3368     if (gimme == G_VOID)
3369 	MARK = newsp;
3370     else if (gimme == G_SCALAR) {
3371 	MARK = newsp + 1;
3372 	if (MARK <= SP) {
3373 	    if (SvFLAGS(TOPs) & SVs_TEMP)
3374 		*MARK = TOPs;
3375 	    else
3376 		*MARK = sv_mortalcopy(TOPs);
3377 	}
3378 	else {
3379 	    MEXTEND(mark,0);
3380 	    *MARK = &PL_sv_undef;
3381 	}
3382 	SP = MARK;
3383     }
3384     else {
3385 	/* in case LEAVE wipes old return values */
3386 	for (mark = newsp + 1; mark <= SP; mark++) {
3387 	    if (!(SvFLAGS(*mark) & SVs_TEMP)) {
3388 		*mark = sv_mortalcopy(*mark);
3389 		TAINT_NOT;	/* Each item is independent */
3390 	    }
3391 	}
3392     }
3393     PL_curpm = newpm;	/* Don't pop $1 et al till now */
3394 
3395 #ifdef DEBUGGING
3396     assert(CvDEPTH(PL_compcv) == 1);
3397 #endif
3398     CvDEPTH(PL_compcv) = 0;
3399     lex_end();
3400 
3401     if (optype == OP_REQUIRE &&
3402 	!(gimme == G_SCALAR ? SvTRUE(*SP) : SP > newsp))
3403     {
3404 	/* Unassume the success we assumed earlier. */
3405 	SV *nsv = cx->blk_eval.old_namesv;
3406 	(void)hv_delete(GvHVn(PL_incgv), SvPVX(nsv), SvCUR(nsv), G_DISCARD);
3407 	retop = Perl_die(aTHX_ "%s did not return a true value", SvPVX(nsv));
3408 	/* die_where() did LEAVE, or we won't be here */
3409     }
3410     else {
3411 	LEAVE;
3412 	if (!(save_flags & OPf_SPECIAL))
3413 	    sv_setpv(ERRSV,"");
3414     }
3415 
3416     RETURNOP(retop);
3417 }
3418 
3419 PP(pp_entertry)
3420 {
3421     dSP;
3422     register PERL_CONTEXT *cx;
3423     I32 gimme = GIMME_V;
3424 
3425     ENTER;
3426     SAVETMPS;
3427 
3428     push_return(cLOGOP->op_other->op_next);
3429     PUSHBLOCK(cx, (CXt_EVAL|CXp_TRYBLOCK), SP);
3430     PUSHEVAL(cx, 0, 0);
3431 
3432     PL_in_eval = EVAL_INEVAL;
3433     sv_setpv(ERRSV,"");
3434     PUTBACK;
3435     return DOCATCH(PL_op->op_next);
3436 }
3437 
3438 PP(pp_leavetry)
3439 {
3440     dSP;
3441     register SV **mark;
3442     SV **newsp;
3443     PMOP *newpm;
3444     OP* retop;
3445     I32 gimme;
3446     register PERL_CONTEXT *cx;
3447     I32 optype;
3448 
3449     POPBLOCK(cx,newpm);
3450     POPEVAL(cx);
3451     retop = pop_return();
3452 
3453     TAINT_NOT;
3454     if (gimme == G_VOID)
3455 	SP = newsp;
3456     else if (gimme == G_SCALAR) {
3457 	MARK = newsp + 1;
3458 	if (MARK <= SP) {
3459 	    if (SvFLAGS(TOPs) & (SVs_PADTMP|SVs_TEMP))
3460 		*MARK = TOPs;
3461 	    else
3462 		*MARK = sv_mortalcopy(TOPs);
3463 	}
3464 	else {
3465 	    MEXTEND(mark,0);
3466 	    *MARK = &PL_sv_undef;
3467 	}
3468 	SP = MARK;
3469     }
3470     else {
3471 	/* in case LEAVE wipes old return values */
3472 	for (mark = newsp + 1; mark <= SP; mark++) {
3473 	    if (!(SvFLAGS(*mark) & (SVs_PADTMP|SVs_TEMP))) {
3474 		*mark = sv_mortalcopy(*mark);
3475 		TAINT_NOT;	/* Each item is independent */
3476 	    }
3477 	}
3478     }
3479     PL_curpm = newpm;	/* Don't pop $1 et al till now */
3480 
3481     LEAVE;
3482     sv_setpv(ERRSV,"");
3483     RETURNOP(retop);
3484 }
3485 
3486 STATIC void
3487 S_doparseform(pTHX_ SV *sv)
3488 {
3489     STRLEN len;
3490     register char *s = SvPV_force(sv, len);
3491     register char *send = s + len;
3492     register char *base = Nullch;
3493     register I32 skipspaces = 0;
3494     bool noblank   = FALSE;
3495     bool repeat    = FALSE;
3496     bool postspace = FALSE;
3497     U16 *fops;
3498     register U16 *fpc;
3499     U16 *linepc = 0;
3500     register I32 arg;
3501     bool ischop;
3502 
3503     if (len == 0)
3504 	Perl_croak(aTHX_ "Null picture in formline");
3505 
3506     New(804, fops, (send - s)*3+10, U16);    /* Almost certainly too long... */
3507     fpc = fops;
3508 
3509     if (s < send) {
3510 	linepc = fpc;
3511 	*fpc++ = FF_LINEMARK;
3512 	noblank = repeat = FALSE;
3513 	base = s;
3514     }
3515 
3516     while (s <= send) {
3517 	switch (*s++) {
3518 	default:
3519 	    skipspaces = 0;
3520 	    continue;
3521 
3522 	case '~':
3523 	    if (*s == '~') {
3524 		repeat = TRUE;
3525 		*s = ' ';
3526 	    }
3527 	    noblank = TRUE;
3528 	    s[-1] = ' ';
3529 	    /* FALL THROUGH */
3530 	case ' ': case '\t':
3531 	    skipspaces++;
3532 	    continue;
3533 
3534 	case '\n': case 0:
3535 	    arg = s - base;
3536 	    skipspaces++;
3537 	    arg -= skipspaces;
3538 	    if (arg) {
3539 		if (postspace)
3540 		    *fpc++ = FF_SPACE;
3541 		*fpc++ = FF_LITERAL;
3542 		*fpc++ = (U16)arg;
3543 	    }
3544 	    postspace = FALSE;
3545 	    if (s <= send)
3546 		skipspaces--;
3547 	    if (skipspaces) {
3548 		*fpc++ = FF_SKIP;
3549 		*fpc++ = (U16)skipspaces;
3550 	    }
3551 	    skipspaces = 0;
3552 	    if (s <= send)
3553 		*fpc++ = FF_NEWLINE;
3554 	    if (noblank) {
3555 		*fpc++ = FF_BLANK;
3556 		if (repeat)
3557 		    arg = fpc - linepc + 1;
3558 		else
3559 		    arg = 0;
3560 		*fpc++ = (U16)arg;
3561 	    }
3562 	    if (s < send) {
3563 		linepc = fpc;
3564 		*fpc++ = FF_LINEMARK;
3565 		noblank = repeat = FALSE;
3566 		base = s;
3567 	    }
3568 	    else
3569 		s++;
3570 	    continue;
3571 
3572 	case '@':
3573 	case '^':
3574 	    ischop = s[-1] == '^';
3575 
3576 	    if (postspace) {
3577 		*fpc++ = FF_SPACE;
3578 		postspace = FALSE;
3579 	    }
3580 	    arg = (s - base) - 1;
3581 	    if (arg) {
3582 		*fpc++ = FF_LITERAL;
3583 		*fpc++ = (U16)arg;
3584 	    }
3585 
3586 	    base = s - 1;
3587 	    *fpc++ = FF_FETCH;
3588 	    if (*s == '*') {
3589 		s++;
3590 		*fpc++ = 0;
3591 		*fpc++ = FF_LINEGLOB;
3592 	    }
3593 	    else if (*s == '#' || (*s == '.' && s[1] == '#')) {
3594 		arg = ischop ? 512 : 0;
3595 		base = s - 1;
3596 		while (*s == '#')
3597 		    s++;
3598 		if (*s == '.') {
3599 		    char *f;
3600 		    s++;
3601 		    f = s;
3602 		    while (*s == '#')
3603 			s++;
3604 		    arg |= 256 + (s - f);
3605 		}
3606 		*fpc++ = s - base;		/* fieldsize for FETCH */
3607 		*fpc++ = FF_DECIMAL;
3608                 *fpc++ = (U16)arg;
3609             }
3610             else if (*s == '0' && s[1] == '#') {  /* Zero padded decimals */
3611                 arg = ischop ? 512 : 0;
3612 		base = s - 1;
3613                 s++;                                /* skip the '0' first */
3614                 while (*s == '#')
3615                     s++;
3616                 if (*s == '.') {
3617                     char *f;
3618                     s++;
3619                     f = s;
3620                     while (*s == '#')
3621                         s++;
3622                     arg |= 256 + (s - f);
3623                 }
3624                 *fpc++ = s - base;                /* fieldsize for FETCH */
3625                 *fpc++ = FF_0DECIMAL;
3626 		*fpc++ = (U16)arg;
3627 	    }
3628 	    else {
3629 		I32 prespace = 0;
3630 		bool ismore = FALSE;
3631 
3632 		if (*s == '>') {
3633 		    while (*++s == '>') ;
3634 		    prespace = FF_SPACE;
3635 		}
3636 		else if (*s == '|') {
3637 		    while (*++s == '|') ;
3638 		    prespace = FF_HALFSPACE;
3639 		    postspace = TRUE;
3640 		}
3641 		else {
3642 		    if (*s == '<')
3643 			while (*++s == '<') ;
3644 		    postspace = TRUE;
3645 		}
3646 		if (*s == '.' && s[1] == '.' && s[2] == '.') {
3647 		    s += 3;
3648 		    ismore = TRUE;
3649 		}
3650 		*fpc++ = s - base;		/* fieldsize for FETCH */
3651 
3652 		*fpc++ = ischop ? FF_CHECKCHOP : FF_CHECKNL;
3653 
3654 		if (prespace)
3655 		    *fpc++ = (U16)prespace;
3656 		*fpc++ = FF_ITEM;
3657 		if (ismore)
3658 		    *fpc++ = FF_MORE;
3659 		if (ischop)
3660 		    *fpc++ = FF_CHOP;
3661 	    }
3662 	    base = s;
3663 	    skipspaces = 0;
3664 	    continue;
3665 	}
3666     }
3667     *fpc++ = FF_END;
3668 
3669     arg = fpc - fops;
3670     { /* need to jump to the next word */
3671         int z;
3672 	z = WORD_ALIGN - SvCUR(sv) % WORD_ALIGN;
3673 	SvGROW(sv, SvCUR(sv) + z + arg * sizeof(U16) + 4);
3674 	s = SvPVX(sv) + SvCUR(sv) + z;
3675     }
3676     Copy(fops, s, arg, U16);
3677     Safefree(fops);
3678     sv_magic(sv, Nullsv, PERL_MAGIC_fm, Nullch, 0);
3679     SvCOMPILED_on(sv);
3680 }
3681 
3682 static I32
3683 run_user_filter(pTHX_ int idx, SV *buf_sv, int maxlen)
3684 {
3685     SV *datasv = FILTER_DATA(idx);
3686     int filter_has_file = IoLINES(datasv);
3687     GV *filter_child_proc = (GV *)IoFMT_GV(datasv);
3688     SV *filter_state = (SV *)IoTOP_GV(datasv);
3689     SV *filter_sub = (SV *)IoBOTTOM_GV(datasv);
3690     int len = 0;
3691 
3692     /* I was having segfault trouble under Linux 2.2.5 after a
3693        parse error occured.  (Had to hack around it with a test
3694        for PL_error_count == 0.)  Solaris doesn't segfault --
3695        not sure where the trouble is yet.  XXX */
3696 
3697     if (filter_has_file) {
3698 	len = FILTER_READ(idx+1, buf_sv, maxlen);
3699     }
3700 
3701     if (filter_sub && len >= 0) {
3702 	dSP;
3703 	int count;
3704 
3705 	ENTER;
3706 	SAVE_DEFSV;
3707 	SAVETMPS;
3708 	EXTEND(SP, 2);
3709 
3710 	DEFSV = buf_sv;
3711 	PUSHMARK(SP);
3712 	PUSHs(sv_2mortal(newSViv(maxlen)));
3713 	if (filter_state) {
3714 	    PUSHs(filter_state);
3715 	}
3716 	PUTBACK;
3717 	count = call_sv(filter_sub, G_SCALAR);
3718 	SPAGAIN;
3719 
3720 	if (count > 0) {
3721 	    SV *out = POPs;
3722 	    if (SvOK(out)) {
3723 		len = SvIV(out);
3724 	    }
3725 	}
3726 
3727 	PUTBACK;
3728 	FREETMPS;
3729 	LEAVE;
3730     }
3731 
3732     if (len <= 0) {
3733 	IoLINES(datasv) = 0;
3734 	if (filter_child_proc) {
3735 	    SvREFCNT_dec(filter_child_proc);
3736 	    IoFMT_GV(datasv) = Nullgv;
3737 	}
3738 	if (filter_state) {
3739 	    SvREFCNT_dec(filter_state);
3740 	    IoTOP_GV(datasv) = Nullgv;
3741 	}
3742 	if (filter_sub) {
3743 	    SvREFCNT_dec(filter_sub);
3744 	    IoBOTTOM_GV(datasv) = Nullgv;
3745 	}
3746 	filter_del(run_user_filter);
3747     }
3748 
3749     return len;
3750 }
3751 
3752 /* perhaps someone can come up with a better name for
3753    this?  it is not really "absolute", per se ... */
3754 static bool
3755 S_path_is_absolute(pTHX_ char *name)
3756 {
3757     if (PERL_FILE_IS_ABSOLUTE(name)
3758 #ifdef MACOS_TRADITIONAL
3759 	|| (*name == ':'))
3760 #else
3761 	|| (*name == '.' && (name[1] == '/' ||
3762 			     (name[1] == '.' && name[2] == '/'))))
3763 #endif
3764     {
3765 	return TRUE;
3766     }
3767     else
3768     	return FALSE;
3769 }
3770