xref: /onnv-gate/usr/src/cmd/perl/5.8.4/distrib/pp_hot.c (revision 0:68f95e015346)
1 /*    pp_hot.c
2  *
3  *    Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
4  *    2000, 2001, 2002, 2003, 2004, by Larry Wall and others
5  *
6  *    You may distribute under the terms of either the GNU General Public
7  *    License or the Artistic License, as specified in the README file.
8  *
9  */
10 
11 /*
12  * Then he heard Merry change the note, and up went the Horn-cry of Buckland,
13  * shaking the air.
14  *
15  *            Awake!  Awake!  Fear, Fire, Foes!  Awake!
16  *                     Fire, Foes!  Awake!
17  */
18 
19 #include "EXTERN.h"
20 #define PERL_IN_PP_HOT_C
21 #include "perl.h"
22 
23 /* Hot code. */
24 
25 #ifdef USE_5005THREADS
26 static void unset_cvowner(pTHX_ void *cvarg);
27 #endif /* USE_5005THREADS */
28 
PP(pp_const)29 PP(pp_const)
30 {
31     dSP;
32     XPUSHs(cSVOP_sv);
33     RETURN;
34 }
35 
PP(pp_nextstate)36 PP(pp_nextstate)
37 {
38     PL_curcop = (COP*)PL_op;
39     TAINT_NOT;		/* Each statement is presumed innocent */
40     PL_stack_sp = PL_stack_base + cxstack[cxstack_ix].blk_oldsp;
41     FREETMPS;
42     return NORMAL;
43 }
44 
PP(pp_gvsv)45 PP(pp_gvsv)
46 {
47     dSP;
48     EXTEND(SP,1);
49     if (PL_op->op_private & OPpLVAL_INTRO)
50 	PUSHs(save_scalar(cGVOP_gv));
51     else
52 	PUSHs(GvSV(cGVOP_gv));
53     RETURN;
54 }
55 
PP(pp_null)56 PP(pp_null)
57 {
58     return NORMAL;
59 }
60 
PP(pp_setstate)61 PP(pp_setstate)
62 {
63     PL_curcop = (COP*)PL_op;
64     return NORMAL;
65 }
66 
PP(pp_pushmark)67 PP(pp_pushmark)
68 {
69     PUSHMARK(PL_stack_sp);
70     return NORMAL;
71 }
72 
PP(pp_stringify)73 PP(pp_stringify)
74 {
75     dSP; dTARGET;
76     sv_copypv(TARG,TOPs);
77     SETTARG;
78     RETURN;
79 }
80 
PP(pp_gv)81 PP(pp_gv)
82 {
83     dSP;
84     XPUSHs((SV*)cGVOP_gv);
85     RETURN;
86 }
87 
PP(pp_and)88 PP(pp_and)
89 {
90     dSP;
91     if (!SvTRUE(TOPs))
92 	RETURN;
93     else {
94 	--SP;
95 	RETURNOP(cLOGOP->op_other);
96     }
97 }
98 
PP(pp_sassign)99 PP(pp_sassign)
100 {
101     dSP; dPOPTOPssrl;
102 
103     if (PL_op->op_private & OPpASSIGN_BACKWARDS) {
104 	SV *temp;
105 	temp = left; left = right; right = temp;
106     }
107     if (PL_tainting && PL_tainted && !SvTAINTED(left))
108 	TAINT_NOT;
109     SvSetMagicSV(right, left);
110     SETs(right);
111     RETURN;
112 }
113 
PP(pp_cond_expr)114 PP(pp_cond_expr)
115 {
116     dSP;
117     if (SvTRUEx(POPs))
118 	RETURNOP(cLOGOP->op_other);
119     else
120 	RETURNOP(cLOGOP->op_next);
121 }
122 
PP(pp_unstack)123 PP(pp_unstack)
124 {
125     I32 oldsave;
126     TAINT_NOT;		/* Each statement is presumed innocent */
127     PL_stack_sp = PL_stack_base + cxstack[cxstack_ix].blk_oldsp;
128     FREETMPS;
129     oldsave = PL_scopestack[PL_scopestack_ix - 1];
130     LEAVE_SCOPE(oldsave);
131     return NORMAL;
132 }
133 
PP(pp_concat)134 PP(pp_concat)
135 {
136   dSP; dATARGET; tryAMAGICbin(concat,opASSIGN);
137   {
138     dPOPTOPssrl;
139     STRLEN llen;
140     char* lpv;
141     bool lbyte;
142     STRLEN rlen;
143     char* rpv = SvPV(right, rlen);	/* mg_get(right) happens here */
144     bool rbyte = !DO_UTF8(right), rcopied = FALSE;
145 
146     if (TARG == right && right != left) {
147 	right = sv_2mortal(newSVpvn(rpv, rlen));
148 	rpv = SvPV(right, rlen);	/* no point setting UTF-8 here */
149 	rcopied = TRUE;
150     }
151 
152     if (TARG != left) {
153 	lpv = SvPV(left, llen);		/* mg_get(left) may happen here */
154 	lbyte = !DO_UTF8(left);
155 	sv_setpvn(TARG, lpv, llen);
156 	if (!lbyte)
157 	    SvUTF8_on(TARG);
158 	else
159 	    SvUTF8_off(TARG);
160     }
161     else { /* TARG == left */
162 	if (SvGMAGICAL(left))
163 	    mg_get(left);		/* or mg_get(left) may happen here */
164 	if (!SvOK(TARG))
165 	    sv_setpv(left, "");
166 	lpv = SvPV_nomg(left, llen);
167 	lbyte = !DO_UTF8(left);
168 	if (IN_BYTES)
169 	    SvUTF8_off(TARG);
170     }
171 
172 #if defined(PERL_Y2KWARN)
173     if ((SvIOK(right) || SvNOK(right)) && ckWARN(WARN_Y2K) && SvOK(TARG)) {
174 	if (llen >= 2 && lpv[llen - 2] == '1' && lpv[llen - 1] == '9'
175 	    && (llen == 2 || !isDIGIT(lpv[llen - 3])))
176 	{
177 	    Perl_warner(aTHX_ packWARN(WARN_Y2K), "Possible Y2K bug: %s",
178 			"about to append an integer to '19'");
179 	}
180     }
181 #endif
182 
183     if (lbyte != rbyte) {
184 	if (lbyte)
185 	    sv_utf8_upgrade_nomg(TARG);
186 	else {
187 	    if (!rcopied)
188 		right = sv_2mortal(newSVpvn(rpv, rlen));
189 	    sv_utf8_upgrade_nomg(right);
190 	    rpv = SvPV(right, rlen);
191 	}
192     }
193     sv_catpvn_nomg(TARG, rpv, rlen);
194 
195     SETTARG;
196     RETURN;
197   }
198 }
199 
PP(pp_padsv)200 PP(pp_padsv)
201 {
202     dSP; dTARGET;
203     XPUSHs(TARG);
204     if (PL_op->op_flags & OPf_MOD) {
205 	if (PL_op->op_private & OPpLVAL_INTRO)
206 	    SAVECLEARSV(PAD_SVl(PL_op->op_targ));
207         else if (PL_op->op_private & OPpDEREF) {
208 	    PUTBACK;
209 	    vivify_ref(PAD_SVl(PL_op->op_targ), PL_op->op_private & OPpDEREF);
210 	    SPAGAIN;
211 	}
212     }
213     RETURN;
214 }
215 
PP(pp_readline)216 PP(pp_readline)
217 {
218     tryAMAGICunTARGET(iter, 0);
219     PL_last_in_gv = (GV*)(*PL_stack_sp--);
220     if (SvTYPE(PL_last_in_gv) != SVt_PVGV) {
221 	if (SvROK(PL_last_in_gv) && SvTYPE(SvRV(PL_last_in_gv)) == SVt_PVGV)
222 	    PL_last_in_gv = (GV*)SvRV(PL_last_in_gv);
223 	else {
224 	    dSP;
225 	    XPUSHs((SV*)PL_last_in_gv);
226 	    PUTBACK;
227 	    pp_rv2gv();
228 	    PL_last_in_gv = (GV*)(*PL_stack_sp--);
229 	}
230     }
231     return do_readline();
232 }
233 
PP(pp_eq)234 PP(pp_eq)
235 {
236     dSP; tryAMAGICbinSET(eq,0);
237 #ifndef NV_PRESERVES_UV
238     if (SvROK(TOPs) && !SvAMAGIC(TOPs) && SvROK(TOPm1s) && !SvAMAGIC(TOPm1s)) {
239         SP--;
240 	SETs(boolSV(SvRV(TOPs) == SvRV(TOPp1s)));
241 	RETURN;
242     }
243 #endif
244 #ifdef PERL_PRESERVE_IVUV
245     SvIV_please(TOPs);
246     if (SvIOK(TOPs)) {
247 	/* Unless the left argument is integer in range we are going
248 	   to have to use NV maths. Hence only attempt to coerce the
249 	   right argument if we know the left is integer.  */
250       SvIV_please(TOPm1s);
251 	if (SvIOK(TOPm1s)) {
252 	    bool auvok = SvUOK(TOPm1s);
253 	    bool buvok = SvUOK(TOPs);
254 
255 	    if (auvok == buvok) { /* ## IV == IV or UV == UV ## */
256                 /* Casting IV to UV before comparison isn't going to matter
257                    on 2s complement. On 1s complement or sign&magnitude
258                    (if we have any of them) it could to make negative zero
259                    differ from normal zero. As I understand it. (Need to
260                    check - is negative zero implementation defined behaviour
261                    anyway?). NWC  */
262 		UV buv = SvUVX(POPs);
263 		UV auv = SvUVX(TOPs);
264 
265 		SETs(boolSV(auv == buv));
266 		RETURN;
267 	    }
268 	    {			/* ## Mixed IV,UV ## */
269                 SV *ivp, *uvp;
270 		IV iv;
271 
272 		/* == is commutative so doesn't matter which is left or right */
273 		if (auvok) {
274 		    /* top of stack (b) is the iv */
275                     ivp = *SP;
276                     uvp = *--SP;
277                 } else {
278                     uvp = *SP;
279                     ivp = *--SP;
280                 }
281                 iv = SvIVX(ivp);
282                 if (iv < 0) {
283                     /* As uv is a UV, it's >0, so it cannot be == */
284                     SETs(&PL_sv_no);
285                     RETURN;
286                 }
287 		/* we know iv is >= 0 */
288 		SETs(boolSV((UV)iv == SvUVX(uvp)));
289 		RETURN;
290 	    }
291 	}
292     }
293 #endif
294     {
295       dPOPnv;
296       SETs(boolSV(TOPn == value));
297       RETURN;
298     }
299 }
300 
PP(pp_preinc)301 PP(pp_preinc)
302 {
303     dSP;
304     if (SvTYPE(TOPs) > SVt_PVLV)
305 	DIE(aTHX_ PL_no_modify);
306     if (!SvREADONLY(TOPs) && SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)
307         && SvIVX(TOPs) != IV_MAX)
308     {
309 	++SvIVX(TOPs);
310 	SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
311     }
312     else /* Do all the PERL_PRESERVE_IVUV conditionals in sv_inc */
313 	sv_inc(TOPs);
314     SvSETMAGIC(TOPs);
315     return NORMAL;
316 }
317 
PP(pp_or)318 PP(pp_or)
319 {
320     dSP;
321     if (SvTRUE(TOPs))
322 	RETURN;
323     else {
324 	--SP;
325 	RETURNOP(cLOGOP->op_other);
326     }
327 }
328 
PP(pp_add)329 PP(pp_add)
330 {
331     dSP; dATARGET; bool useleft; tryAMAGICbin(add,opASSIGN);
332     useleft = USE_LEFT(TOPm1s);
333 #ifdef PERL_PRESERVE_IVUV
334     /* We must see if we can perform the addition with integers if possible,
335        as the integer code detects overflow while the NV code doesn't.
336        If either argument hasn't had a numeric conversion yet attempt to get
337        the IV. It's important to do this now, rather than just assuming that
338        it's not IOK as a PV of "9223372036854775806" may not take well to NV
339        addition, and an SV which is NOK, NV=6.0 ought to be coerced to
340        integer in case the second argument is IV=9223372036854775806
341        We can (now) rely on sv_2iv to do the right thing, only setting the
342        public IOK flag if the value in the NV (or PV) slot is truly integer.
343 
344        A side effect is that this also aggressively prefers integer maths over
345        fp maths for integer values.
346 
347        How to detect overflow?
348 
349        C 99 section 6.2.6.1 says
350 
351        The range of nonnegative values of a signed integer type is a subrange
352        of the corresponding unsigned integer type, and the representation of
353        the same value in each type is the same. A computation involving
354        unsigned operands can never overflow, because a result that cannot be
355        represented by the resulting unsigned integer type is reduced modulo
356        the number that is one greater than the largest value that can be
357        represented by the resulting type.
358 
359        (the 9th paragraph)
360 
361        which I read as "unsigned ints wrap."
362 
363        signed integer overflow seems to be classed as "exception condition"
364 
365        If an exceptional condition occurs during the evaluation of an
366        expression (that is, if the result is not mathematically defined or not
367        in the range of representable values for its type), the behavior is
368        undefined.
369 
370        (6.5, the 5th paragraph)
371 
372        I had assumed that on 2s complement machines signed arithmetic would
373        wrap, hence coded pp_add and pp_subtract on the assumption that
374        everything perl builds on would be happy.  After much wailing and
375        gnashing of teeth it would seem that irix64 knows its ANSI spec well,
376        knows that it doesn't need to, and doesn't.  Bah.  Anyway, the all-
377        unsigned code below is actually shorter than the old code. :-)
378     */
379 
380     SvIV_please(TOPs);
381     if (SvIOK(TOPs)) {
382 	/* Unless the left argument is integer in range we are going to have to
383 	   use NV maths. Hence only attempt to coerce the right argument if
384 	   we know the left is integer.  */
385 	register UV auv = 0;
386 	bool auvok = FALSE;
387 	bool a_valid = 0;
388 
389 	if (!useleft) {
390 	    auv = 0;
391 	    a_valid = auvok = 1;
392 	    /* left operand is undef, treat as zero. + 0 is identity,
393 	       Could SETi or SETu right now, but space optimise by not adding
394 	       lots of code to speed up what is probably a rarish case.  */
395 	} else {
396 	    /* Left operand is defined, so is it IV? */
397 	    SvIV_please(TOPm1s);
398 	    if (SvIOK(TOPm1s)) {
399 		if ((auvok = SvUOK(TOPm1s)))
400 		    auv = SvUVX(TOPm1s);
401 		else {
402 		    register IV aiv = SvIVX(TOPm1s);
403 		    if (aiv >= 0) {
404 			auv = aiv;
405 			auvok = 1;	/* Now acting as a sign flag.  */
406 		    } else { /* 2s complement assumption for IV_MIN */
407 			auv = (UV)-aiv;
408 		    }
409 		}
410 		a_valid = 1;
411 	    }
412 	}
413 	if (a_valid) {
414 	    bool result_good = 0;
415 	    UV result;
416 	    register UV buv;
417 	    bool buvok = SvUOK(TOPs);
418 
419 	    if (buvok)
420 		buv = SvUVX(TOPs);
421 	    else {
422 		register IV biv = SvIVX(TOPs);
423 		if (biv >= 0) {
424 		    buv = biv;
425 		    buvok = 1;
426 		} else
427 		    buv = (UV)-biv;
428 	    }
429 	    /* ?uvok if value is >= 0. basically, flagged as UV if it's +ve,
430 	       else "IV" now, independent of how it came in.
431 	       if a, b represents positive, A, B negative, a maps to -A etc
432 	       a + b =>  (a + b)
433 	       A + b => -(a - b)
434 	       a + B =>  (a - b)
435 	       A + B => -(a + b)
436 	       all UV maths. negate result if A negative.
437 	       add if signs same, subtract if signs differ. */
438 
439 	    if (auvok ^ buvok) {
440 		/* Signs differ.  */
441 		if (auv >= buv) {
442 		    result = auv - buv;
443 		    /* Must get smaller */
444 		    if (result <= auv)
445 			result_good = 1;
446 		} else {
447 		    result = buv - auv;
448 		    if (result <= buv) {
449 			/* result really should be -(auv-buv). as its negation
450 			   of true value, need to swap our result flag  */
451 			auvok = !auvok;
452 			result_good = 1;
453 		    }
454 		}
455 	    } else {
456 		/* Signs same */
457 		result = auv + buv;
458 		if (result >= auv)
459 		    result_good = 1;
460 	    }
461 	    if (result_good) {
462 		SP--;
463 		if (auvok)
464 		    SETu( result );
465 		else {
466 		    /* Negate result */
467 		    if (result <= (UV)IV_MIN)
468 			SETi( -(IV)result );
469 		    else {
470 			/* result valid, but out of range for IV.  */
471 			SETn( -(NV)result );
472 		    }
473 		}
474 		RETURN;
475 	    } /* Overflow, drop through to NVs.  */
476 	}
477     }
478 #endif
479     {
480 	dPOPnv;
481 	if (!useleft) {
482 	    /* left operand is undef, treat as zero. + 0.0 is identity. */
483 	    SETn(value);
484 	    RETURN;
485 	}
486 	SETn( value + TOPn );
487 	RETURN;
488     }
489 }
490 
PP(pp_aelemfast)491 PP(pp_aelemfast)
492 {
493     dSP;
494     AV *av = PL_op->op_flags & OPf_SPECIAL ?
495 		(AV*)PAD_SV(PL_op->op_targ) : GvAV(cGVOP_gv);
496     U32 lval = PL_op->op_flags & OPf_MOD;
497     SV** svp = av_fetch(av, PL_op->op_private, lval);
498     SV *sv = (svp ? *svp : &PL_sv_undef);
499     EXTEND(SP, 1);
500     if (!lval && SvGMAGICAL(sv))	/* see note in pp_helem() */
501 	sv = sv_mortalcopy(sv);
502     PUSHs(sv);
503     RETURN;
504 }
505 
PP(pp_join)506 PP(pp_join)
507 {
508     dSP; dMARK; dTARGET;
509     MARK++;
510     do_join(TARG, *MARK, MARK, SP);
511     SP = MARK;
512     SETs(TARG);
513     RETURN;
514 }
515 
PP(pp_pushre)516 PP(pp_pushre)
517 {
518     dSP;
519 #ifdef DEBUGGING
520     /*
521      * We ass_u_me that LvTARGOFF() comes first, and that two STRLENs
522      * will be enough to hold an OP*.
523      */
524     SV* sv = sv_newmortal();
525     sv_upgrade(sv, SVt_PVLV);
526     LvTYPE(sv) = '/';
527     Copy(&PL_op, &LvTARGOFF(sv), 1, OP*);
528     XPUSHs(sv);
529 #else
530     XPUSHs((SV*)PL_op);
531 #endif
532     RETURN;
533 }
534 
535 /* Oversized hot code. */
536 
PP(pp_print)537 PP(pp_print)
538 {
539     dSP; dMARK; dORIGMARK;
540     GV *gv;
541     IO *io;
542     register PerlIO *fp;
543     MAGIC *mg;
544 
545     if (PL_op->op_flags & OPf_STACKED)
546 	gv = (GV*)*++MARK;
547     else
548 	gv = PL_defoutgv;
549 
550     if (gv && (io = GvIO(gv))
551 	&& (mg = SvTIED_mg((SV*)io, PERL_MAGIC_tiedscalar)))
552     {
553       had_magic:
554 	if (MARK == ORIGMARK) {
555 	    /* If using default handle then we need to make space to
556 	     * pass object as 1st arg, so move other args up ...
557 	     */
558 	    MEXTEND(SP, 1);
559 	    ++MARK;
560 	    Move(MARK, MARK + 1, (SP - MARK) + 1, SV*);
561 	    ++SP;
562 	}
563 	PUSHMARK(MARK - 1);
564 	*MARK = SvTIED_obj((SV*)io, mg);
565 	PUTBACK;
566 	ENTER;
567 	call_method("PRINT", G_SCALAR);
568 	LEAVE;
569 	SPAGAIN;
570 	MARK = ORIGMARK + 1;
571 	*MARK = *SP;
572 	SP = MARK;
573 	RETURN;
574     }
575     if (!(io = GvIO(gv))) {
576         if ((GvEGV(gv)) && (io = GvIO(GvEGV(gv)))
577 	    && (mg = SvTIED_mg((SV*)io, PERL_MAGIC_tiedscalar)))
578             goto had_magic;
579 	if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
580 	    report_evil_fh(gv, io, PL_op->op_type);
581 	SETERRNO(EBADF,RMS_IFI);
582 	goto just_say_no;
583     }
584     else if (!(fp = IoOFP(io))) {
585 	if (ckWARN2(WARN_CLOSED, WARN_IO))  {
586 	    if (IoIFP(io))
587 		report_evil_fh(gv, io, OP_phoney_INPUT_ONLY);
588 	    else if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
589 		report_evil_fh(gv, io, PL_op->op_type);
590 	}
591 	SETERRNO(EBADF,IoIFP(io)?RMS_FAC:RMS_IFI);
592 	goto just_say_no;
593     }
594     else {
595 	MARK++;
596 	if (PL_ofs_sv && SvOK(PL_ofs_sv)) {
597 	    while (MARK <= SP) {
598 		if (!do_print(*MARK, fp))
599 		    break;
600 		MARK++;
601 		if (MARK <= SP) {
602 		    if (!do_print(PL_ofs_sv, fp)) { /* $, */
603 			MARK--;
604 			break;
605 		    }
606 		}
607 	    }
608 	}
609 	else {
610 	    while (MARK <= SP) {
611 		if (!do_print(*MARK, fp))
612 		    break;
613 		MARK++;
614 	    }
615 	}
616 	if (MARK <= SP)
617 	    goto just_say_no;
618 	else {
619 	    if (PL_ors_sv && SvOK(PL_ors_sv))
620 		if (!do_print(PL_ors_sv, fp)) /* $\ */
621 		    goto just_say_no;
622 
623 	    if (IoFLAGS(io) & IOf_FLUSH)
624 		if (PerlIO_flush(fp) == EOF)
625 		    goto just_say_no;
626 	}
627     }
628     SP = ORIGMARK;
629     PUSHs(&PL_sv_yes);
630     RETURN;
631 
632   just_say_no:
633     SP = ORIGMARK;
634     PUSHs(&PL_sv_undef);
635     RETURN;
636 }
637 
PP(pp_rv2av)638 PP(pp_rv2av)
639 {
640     dSP; dTOPss;
641     AV *av;
642 
643     if (SvROK(sv)) {
644       wasref:
645 	tryAMAGICunDEREF(to_av);
646 
647 	av = (AV*)SvRV(sv);
648 	if (SvTYPE(av) != SVt_PVAV)
649 	    DIE(aTHX_ "Not an ARRAY reference");
650 	if (PL_op->op_flags & OPf_REF) {
651 	    SETs((SV*)av);
652 	    RETURN;
653 	}
654 	else if (LVRET) {
655 	    if (GIMME == G_SCALAR)
656 		Perl_croak(aTHX_ "Can't return array to lvalue scalar context");
657 	    SETs((SV*)av);
658 	    RETURN;
659 	}
660 	else if (PL_op->op_flags & OPf_MOD
661 		&& PL_op->op_private & OPpLVAL_INTRO)
662 	    Perl_croak(aTHX_ PL_no_localize_ref);
663     }
664     else {
665 	if (SvTYPE(sv) == SVt_PVAV) {
666 	    av = (AV*)sv;
667 	    if (PL_op->op_flags & OPf_REF) {
668 		SETs((SV*)av);
669 		RETURN;
670 	    }
671 	    else if (LVRET) {
672 		if (GIMME == G_SCALAR)
673 		    Perl_croak(aTHX_ "Can't return array to lvalue"
674 			       " scalar context");
675 		SETs((SV*)av);
676 		RETURN;
677 	    }
678 	}
679 	else {
680 	    GV *gv;
681 
682 	    if (SvTYPE(sv) != SVt_PVGV) {
683 		char *sym;
684 		STRLEN len;
685 
686 		if (SvGMAGICAL(sv)) {
687 		    mg_get(sv);
688 		    if (SvROK(sv))
689 			goto wasref;
690 		}
691 		if (!SvOK(sv)) {
692 		    if (PL_op->op_flags & OPf_REF ||
693 		      PL_op->op_private & HINT_STRICT_REFS)
694 			DIE(aTHX_ PL_no_usym, "an ARRAY");
695 		    if (ckWARN(WARN_UNINITIALIZED))
696 			report_uninit();
697 		    if (GIMME == G_ARRAY) {
698 			(void)POPs;
699 			RETURN;
700 		    }
701 		    RETSETUNDEF;
702 		}
703 		sym = SvPV(sv,len);
704 		if ((PL_op->op_flags & OPf_SPECIAL) &&
705 		    !(PL_op->op_flags & OPf_MOD))
706 		{
707 		    gv = (GV*)gv_fetchpv(sym, FALSE, SVt_PVAV);
708 		    if (!gv
709 			&& (!is_gv_magical(sym,len,0)
710 			    || !(gv = (GV*)gv_fetchpv(sym, TRUE, SVt_PVAV))))
711 		    {
712 			RETSETUNDEF;
713 		    }
714 		}
715 		else {
716 		    if (PL_op->op_private & HINT_STRICT_REFS)
717 			DIE(aTHX_ PL_no_symref, sym, "an ARRAY");
718 		    gv = (GV*)gv_fetchpv(sym, TRUE, SVt_PVAV);
719 		}
720 	    }
721 	    else {
722 		gv = (GV*)sv;
723 	    }
724 	    av = GvAVn(gv);
725 	    if (PL_op->op_private & OPpLVAL_INTRO)
726 		av = save_ary(gv);
727 	    if (PL_op->op_flags & OPf_REF) {
728 		SETs((SV*)av);
729 		RETURN;
730 	    }
731 	    else if (LVRET) {
732 		if (GIMME == G_SCALAR)
733 		    Perl_croak(aTHX_ "Can't return array to lvalue"
734 			       " scalar context");
735 		SETs((SV*)av);
736 		RETURN;
737 	    }
738 	}
739     }
740 
741     if (GIMME == G_ARRAY) {
742 	I32 maxarg = AvFILL(av) + 1;
743 	(void)POPs;			/* XXXX May be optimized away? */
744 	EXTEND(SP, maxarg);
745 	if (SvRMAGICAL(av)) {
746 	    U32 i;
747 	    for (i=0; i < (U32)maxarg; i++) {
748 		SV **svp = av_fetch(av, i, FALSE);
749 		/* See note in pp_helem, and bug id #27839 */
750 		SP[i+1] = svp
751 		    ? SvGMAGICAL(*svp) ? sv_mortalcopy(*svp) : *svp
752 		    : &PL_sv_undef;
753 	    }
754 	}
755 	else {
756 	    Copy(AvARRAY(av), SP+1, maxarg, SV*);
757 	}
758 	SP += maxarg;
759     }
760     else if (GIMME_V == G_SCALAR) {
761 	dTARGET;
762 	I32 maxarg = AvFILL(av) + 1;
763 	SETi(maxarg);
764     }
765     RETURN;
766 }
767 
PP(pp_rv2hv)768 PP(pp_rv2hv)
769 {
770     dSP; dTOPss;
771     HV *hv;
772     I32 gimme = GIMME_V;
773 
774     if (SvROK(sv)) {
775       wasref:
776 	tryAMAGICunDEREF(to_hv);
777 
778 	hv = (HV*)SvRV(sv);
779 	if (SvTYPE(hv) != SVt_PVHV && SvTYPE(hv) != SVt_PVAV)
780 	    DIE(aTHX_ "Not a HASH reference");
781 	if (PL_op->op_flags & OPf_REF) {
782 	    SETs((SV*)hv);
783 	    RETURN;
784 	}
785 	else if (LVRET) {
786 	    if (gimme != G_ARRAY)
787 		Perl_croak(aTHX_ "Can't return hash to lvalue scalar context");
788 	    SETs((SV*)hv);
789 	    RETURN;
790 	}
791 	else if (PL_op->op_flags & OPf_MOD
792 		&& PL_op->op_private & OPpLVAL_INTRO)
793 	    Perl_croak(aTHX_ PL_no_localize_ref);
794     }
795     else {
796 	if (SvTYPE(sv) == SVt_PVHV || SvTYPE(sv) == SVt_PVAV) {
797 	    hv = (HV*)sv;
798 	    if (PL_op->op_flags & OPf_REF) {
799 		SETs((SV*)hv);
800 		RETURN;
801 	    }
802 	    else if (LVRET) {
803 		if (gimme != G_ARRAY)
804 		    Perl_croak(aTHX_ "Can't return hash to lvalue"
805 			       " scalar context");
806 		SETs((SV*)hv);
807 		RETURN;
808 	    }
809 	}
810 	else {
811 	    GV *gv;
812 
813 	    if (SvTYPE(sv) != SVt_PVGV) {
814 		char *sym;
815 		STRLEN len;
816 
817 		if (SvGMAGICAL(sv)) {
818 		    mg_get(sv);
819 		    if (SvROK(sv))
820 			goto wasref;
821 		}
822 		if (!SvOK(sv)) {
823 		    if (PL_op->op_flags & OPf_REF ||
824 		      PL_op->op_private & HINT_STRICT_REFS)
825 			DIE(aTHX_ PL_no_usym, "a HASH");
826 		    if (ckWARN(WARN_UNINITIALIZED))
827 			report_uninit();
828 		    if (gimme == G_ARRAY) {
829 			SP--;
830 			RETURN;
831 		    }
832 		    RETSETUNDEF;
833 		}
834 		sym = SvPV(sv,len);
835 		if ((PL_op->op_flags & OPf_SPECIAL) &&
836 		    !(PL_op->op_flags & OPf_MOD))
837 		{
838 		    gv = (GV*)gv_fetchpv(sym, FALSE, SVt_PVHV);
839 		    if (!gv
840 			&& (!is_gv_magical(sym,len,0)
841 			    || !(gv = (GV*)gv_fetchpv(sym, TRUE, SVt_PVHV))))
842 		    {
843 			RETSETUNDEF;
844 		    }
845 		}
846 		else {
847 		    if (PL_op->op_private & HINT_STRICT_REFS)
848 			DIE(aTHX_ PL_no_symref, sym, "a HASH");
849 		    gv = (GV*)gv_fetchpv(sym, TRUE, SVt_PVHV);
850 		}
851 	    }
852 	    else {
853 		gv = (GV*)sv;
854 	    }
855 	    hv = GvHVn(gv);
856 	    if (PL_op->op_private & OPpLVAL_INTRO)
857 		hv = save_hash(gv);
858 	    if (PL_op->op_flags & OPf_REF) {
859 		SETs((SV*)hv);
860 		RETURN;
861 	    }
862 	    else if (LVRET) {
863 		if (gimme != G_ARRAY)
864 		    Perl_croak(aTHX_ "Can't return hash to lvalue"
865 			       " scalar context");
866 		SETs((SV*)hv);
867 		RETURN;
868 	    }
869 	}
870     }
871 
872     if (gimme == G_ARRAY) { /* array wanted */
873 	*PL_stack_sp = (SV*)hv;
874 	return do_kv();
875     }
876     else if (gimme == G_SCALAR) {
877 	dTARGET;
878 
879 	if (SvTYPE(hv) == SVt_PVAV)
880 	    hv = avhv_keys((AV*)hv);
881 
882 	TARG = Perl_hv_scalar(aTHX_ hv);
883 	SETTARG;
884     }
885     RETURN;
886 }
887 
888 STATIC int
S_do_maybe_phash(pTHX_ AV * ary,SV ** lelem,SV ** firstlelem,SV ** relem,SV ** lastrelem)889 S_do_maybe_phash(pTHX_ AV *ary, SV **lelem, SV **firstlelem, SV **relem,
890 		 SV **lastrelem)
891 {
892     OP *leftop;
893     I32 i;
894 
895     leftop = ((BINOP*)PL_op)->op_last;
896     assert(leftop);
897     assert(leftop->op_type == OP_NULL && leftop->op_targ == OP_LIST);
898     leftop = ((LISTOP*)leftop)->op_first;
899     assert(leftop);
900     /* Skip PUSHMARK and each element already assigned to. */
901     for (i = lelem - firstlelem; i > 0; i--) {
902 	leftop = leftop->op_sibling;
903 	assert(leftop);
904     }
905     if (leftop->op_type != OP_RV2HV)
906 	return 0;
907 
908     /* pseudohash */
909     if (av_len(ary) > 0)
910 	av_fill(ary, 0);		/* clear all but the fields hash */
911     if (lastrelem >= relem) {
912 	while (relem < lastrelem) {	/* gobble up all the rest */
913 	    SV *tmpstr;
914 	    assert(relem[0]);
915 	    assert(relem[1]);
916 	    /* Avoid a memory leak when avhv_store_ent dies. */
917 	    tmpstr = sv_newmortal();
918 	    sv_setsv(tmpstr,relem[1]);	/* value */
919 	    relem[1] = tmpstr;
920 	    if (avhv_store_ent(ary,relem[0],tmpstr,0))
921 		(void)SvREFCNT_inc(tmpstr);
922 	    if (SvMAGICAL(ary) != 0 && SvSMAGICAL(tmpstr))
923 		mg_set(tmpstr);
924 	    relem += 2;
925 	    TAINT_NOT;
926 	}
927     }
928     if (relem == lastrelem)
929 	return 1;
930     return 2;
931 }
932 
933 STATIC void
S_do_oddball(pTHX_ HV * hash,SV ** relem,SV ** firstrelem)934 S_do_oddball(pTHX_ HV *hash, SV **relem, SV **firstrelem)
935 {
936     if (*relem) {
937 	SV *tmpstr;
938 	if (ckWARN(WARN_MISC)) {
939 	    if (relem == firstrelem &&
940 		SvROK(*relem) &&
941 		(SvTYPE(SvRV(*relem)) == SVt_PVAV ||
942 		 SvTYPE(SvRV(*relem)) == SVt_PVHV))
943 	    {
944 		Perl_warner(aTHX_ packWARN(WARN_MISC),
945 			    "Reference found where even-sized list expected");
946 	    }
947 	    else
948 		Perl_warner(aTHX_ packWARN(WARN_MISC),
949 			    "Odd number of elements in hash assignment");
950 	}
951 	if (SvTYPE(hash) == SVt_PVAV) {
952 	    /* pseudohash */
953 	    tmpstr = sv_newmortal();
954 	    if (avhv_store_ent((AV*)hash,*relem,tmpstr,0))
955 		(void)SvREFCNT_inc(tmpstr);
956 	    if (SvMAGICAL(hash) && SvSMAGICAL(tmpstr))
957 		mg_set(tmpstr);
958 	}
959 	else {
960 	    HE *didstore;
961 	    tmpstr = NEWSV(29,0);
962 	    didstore = hv_store_ent(hash,*relem,tmpstr,0);
963 	    if (SvMAGICAL(hash)) {
964 		if (SvSMAGICAL(tmpstr))
965 		    mg_set(tmpstr);
966 		if (!didstore)
967 		    sv_2mortal(tmpstr);
968 	    }
969 	}
970 	TAINT_NOT;
971     }
972 }
973 
PP(pp_aassign)974 PP(pp_aassign)
975 {
976     dSP;
977     SV **lastlelem = PL_stack_sp;
978     SV **lastrelem = PL_stack_base + POPMARK;
979     SV **firstrelem = PL_stack_base + POPMARK + 1;
980     SV **firstlelem = lastrelem + 1;
981 
982     register SV **relem;
983     register SV **lelem;
984 
985     register SV *sv;
986     register AV *ary;
987 
988     I32 gimme;
989     HV *hash;
990     I32 i;
991     int magic;
992     int duplicates = 0;
993     SV **firsthashrelem = 0;	/* "= 0" keeps gcc 2.95 quiet  */
994 
995 
996     PL_delaymagic = DM_DELAY;		/* catch simultaneous items */
997     gimme = GIMME_V;
998 
999     /* If there's a common identifier on both sides we have to take
1000      * special care that assigning the identifier on the left doesn't
1001      * clobber a value on the right that's used later in the list.
1002      */
1003     if (PL_op->op_private & (OPpASSIGN_COMMON)) {
1004 	EXTEND_MORTAL(lastrelem - firstrelem + 1);
1005 	for (relem = firstrelem; relem <= lastrelem; relem++) {
1006 	    /*SUPPRESS 560*/
1007 	    if ((sv = *relem)) {
1008 		TAINT_NOT;	/* Each item is independent */
1009 		*relem = sv_mortalcopy(sv);
1010 	    }
1011 	}
1012     }
1013 
1014     relem = firstrelem;
1015     lelem = firstlelem;
1016     ary = Null(AV*);
1017     hash = Null(HV*);
1018 
1019     while (lelem <= lastlelem) {
1020 	TAINT_NOT;		/* Each item stands on its own, taintwise. */
1021 	sv = *lelem++;
1022 	switch (SvTYPE(sv)) {
1023 	case SVt_PVAV:
1024 	    ary = (AV*)sv;
1025 	    magic = SvMAGICAL(ary) != 0;
1026 	    if (PL_op->op_private & OPpASSIGN_HASH) {
1027 		switch (do_maybe_phash(ary, lelem, firstlelem, relem,
1028 				       lastrelem))
1029 		{
1030 		case 0:
1031 		    goto normal_array;
1032 		case 1:
1033 		    do_oddball((HV*)ary, relem, firstrelem);
1034 		}
1035 		relem = lastrelem + 1;
1036 		break;
1037 	    }
1038 	normal_array:
1039 	    av_clear(ary);
1040 	    av_extend(ary, lastrelem - relem);
1041 	    i = 0;
1042 	    while (relem <= lastrelem) {	/* gobble up all the rest */
1043 		SV **didstore;
1044 		sv = NEWSV(28,0);
1045 		assert(*relem);
1046 		sv_setsv(sv,*relem);
1047 		*(relem++) = sv;
1048 		didstore = av_store(ary,i++,sv);
1049 		if (magic) {
1050 		    if (SvSMAGICAL(sv))
1051 			mg_set(sv);
1052 		    if (!didstore)
1053 			sv_2mortal(sv);
1054 		}
1055 		TAINT_NOT;
1056 	    }
1057 	    break;
1058 	case SVt_PVHV: {				/* normal hash */
1059 		SV *tmpstr;
1060 
1061 		hash = (HV*)sv;
1062 		magic = SvMAGICAL(hash) != 0;
1063 		hv_clear(hash);
1064 		firsthashrelem = relem;
1065 
1066 		while (relem < lastrelem) {	/* gobble up all the rest */
1067 		    HE *didstore;
1068 		    if (*relem)
1069 			sv = *(relem++);
1070 		    else
1071 			sv = &PL_sv_no, relem++;
1072 		    tmpstr = NEWSV(29,0);
1073 		    if (*relem)
1074 			sv_setsv(tmpstr,*relem);	/* value */
1075 		    *(relem++) = tmpstr;
1076 		    if (gimme != G_VOID && hv_exists_ent(hash, sv, 0))
1077 			/* key overwrites an existing entry */
1078 			duplicates += 2;
1079 		    didstore = hv_store_ent(hash,sv,tmpstr,0);
1080 		    if (magic) {
1081 			if (SvSMAGICAL(tmpstr))
1082 			    mg_set(tmpstr);
1083 			if (!didstore)
1084 			    sv_2mortal(tmpstr);
1085 		    }
1086 		    TAINT_NOT;
1087 		}
1088 		if (relem == lastrelem) {
1089 		    do_oddball(hash, relem, firstrelem);
1090 		    relem++;
1091 		}
1092 	    }
1093 	    break;
1094 	default:
1095 	    if (SvIMMORTAL(sv)) {
1096 		if (relem <= lastrelem)
1097 		    relem++;
1098 		break;
1099 	    }
1100 	    if (relem <= lastrelem) {
1101 		sv_setsv(sv, *relem);
1102 		*(relem++) = sv;
1103 	    }
1104 	    else
1105 		sv_setsv(sv, &PL_sv_undef);
1106 	    SvSETMAGIC(sv);
1107 	    break;
1108 	}
1109     }
1110     if (PL_delaymagic & ~DM_DELAY) {
1111 	if (PL_delaymagic & DM_UID) {
1112 #ifdef HAS_SETRESUID
1113 	    (void)setresuid((PL_delaymagic & DM_RUID) ? PL_uid  : (Uid_t)-1,
1114 			    (PL_delaymagic & DM_EUID) ? PL_euid : (Uid_t)-1,
1115 			    (Uid_t)-1);
1116 #else
1117 #  ifdef HAS_SETREUID
1118 	    (void)setreuid((PL_delaymagic & DM_RUID) ? PL_uid  : (Uid_t)-1,
1119 			   (PL_delaymagic & DM_EUID) ? PL_euid : (Uid_t)-1);
1120 #  else
1121 #    ifdef HAS_SETRUID
1122 	    if ((PL_delaymagic & DM_UID) == DM_RUID) {
1123 		(void)setruid(PL_uid);
1124 		PL_delaymagic &= ~DM_RUID;
1125 	    }
1126 #    endif /* HAS_SETRUID */
1127 #    ifdef HAS_SETEUID
1128 	    if ((PL_delaymagic & DM_UID) == DM_EUID) {
1129 		(void)seteuid(PL_euid);
1130 		PL_delaymagic &= ~DM_EUID;
1131 	    }
1132 #    endif /* HAS_SETEUID */
1133 	    if (PL_delaymagic & DM_UID) {
1134 		if (PL_uid != PL_euid)
1135 		    DIE(aTHX_ "No setreuid available");
1136 		(void)PerlProc_setuid(PL_uid);
1137 	    }
1138 #  endif /* HAS_SETREUID */
1139 #endif /* HAS_SETRESUID */
1140 	    PL_uid = PerlProc_getuid();
1141 	    PL_euid = PerlProc_geteuid();
1142 	}
1143 	if (PL_delaymagic & DM_GID) {
1144 #ifdef HAS_SETRESGID
1145 	    (void)setresgid((PL_delaymagic & DM_RGID) ? PL_gid  : (Gid_t)-1,
1146 			    (PL_delaymagic & DM_EGID) ? PL_egid : (Gid_t)-1,
1147 			    (Gid_t)-1);
1148 #else
1149 #  ifdef HAS_SETREGID
1150 	    (void)setregid((PL_delaymagic & DM_RGID) ? PL_gid  : (Gid_t)-1,
1151 			   (PL_delaymagic & DM_EGID) ? PL_egid : (Gid_t)-1);
1152 #  else
1153 #    ifdef HAS_SETRGID
1154 	    if ((PL_delaymagic & DM_GID) == DM_RGID) {
1155 		(void)setrgid(PL_gid);
1156 		PL_delaymagic &= ~DM_RGID;
1157 	    }
1158 #    endif /* HAS_SETRGID */
1159 #    ifdef HAS_SETEGID
1160 	    if ((PL_delaymagic & DM_GID) == DM_EGID) {
1161 		(void)setegid(PL_egid);
1162 		PL_delaymagic &= ~DM_EGID;
1163 	    }
1164 #    endif /* HAS_SETEGID */
1165 	    if (PL_delaymagic & DM_GID) {
1166 		if (PL_gid != PL_egid)
1167 		    DIE(aTHX_ "No setregid available");
1168 		(void)PerlProc_setgid(PL_gid);
1169 	    }
1170 #  endif /* HAS_SETREGID */
1171 #endif /* HAS_SETRESGID */
1172 	    PL_gid = PerlProc_getgid();
1173 	    PL_egid = PerlProc_getegid();
1174 	}
1175 	PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
1176     }
1177     PL_delaymagic = 0;
1178 
1179     if (gimme == G_VOID)
1180 	SP = firstrelem - 1;
1181     else if (gimme == G_SCALAR) {
1182 	dTARGET;
1183 	SP = firstrelem;
1184 	SETi(lastrelem - firstrelem + 1 - duplicates);
1185     }
1186     else {
1187 	if (ary)
1188 	    SP = lastrelem;
1189 	else if (hash) {
1190 	    if (duplicates) {
1191 		/* Removes from the stack the entries which ended up as
1192 		 * duplicated keys in the hash (fix for [perl #24380]) */
1193 		Move(firsthashrelem + duplicates,
1194 			firsthashrelem, duplicates, SV**);
1195 		lastrelem -= duplicates;
1196 	    }
1197 	    SP = lastrelem;
1198 	}
1199 	else
1200 	    SP = firstrelem + (lastlelem - firstlelem);
1201 	lelem = firstlelem + (relem - firstrelem);
1202 	while (relem <= SP)
1203 	    *relem++ = (lelem <= lastlelem) ? *lelem++ : &PL_sv_undef;
1204     }
1205     RETURN;
1206 }
1207 
PP(pp_qr)1208 PP(pp_qr)
1209 {
1210     dSP;
1211     register PMOP *pm = cPMOP;
1212     SV *rv = sv_newmortal();
1213     SV *sv = newSVrv(rv, "Regexp");
1214     if (pm->op_pmdynflags & PMdf_TAINTED)
1215         SvTAINTED_on(rv);
1216     sv_magic(sv,(SV*)ReREFCNT_inc(PM_GETRE(pm)), PERL_MAGIC_qr,0,0);
1217     RETURNX(PUSHs(rv));
1218 }
1219 
PP(pp_match)1220 PP(pp_match)
1221 {
1222     dSP; dTARG;
1223     register PMOP *pm = cPMOP;
1224     PMOP *dynpm = pm;
1225     register char *t;
1226     register char *s;
1227     char *strend;
1228     I32 global;
1229     I32 r_flags = REXEC_CHECKED;
1230     char *truebase;			/* Start of string  */
1231     register REGEXP *rx = PM_GETRE(pm);
1232     bool rxtainted;
1233     I32 gimme = GIMME;
1234     STRLEN len;
1235     I32 minmatch = 0;
1236     I32 oldsave = PL_savestack_ix;
1237     I32 update_minmatch = 1;
1238     I32 had_zerolen = 0;
1239 
1240     if (PL_op->op_flags & OPf_STACKED)
1241 	TARG = POPs;
1242     else {
1243 	TARG = DEFSV;
1244 	EXTEND(SP,1);
1245     }
1246 
1247     PUTBACK;				/* EVAL blocks need stack_sp. */
1248     s = SvPV(TARG, len);
1249     strend = s + len;
1250     if (!s)
1251 	DIE(aTHX_ "panic: pp_match");
1252     rxtainted = ((pm->op_pmdynflags & PMdf_TAINTED) ||
1253 		 (PL_tainted && (pm->op_pmflags & PMf_RETAINT)));
1254     TAINT_NOT;
1255 
1256     RX_MATCH_UTF8_set(rx, DO_UTF8(TARG));
1257 
1258     /* PMdf_USED is set after a ?? matches once */
1259     if (pm->op_pmdynflags & PMdf_USED) {
1260       failure:
1261 	if (gimme == G_ARRAY)
1262 	    RETURN;
1263 	RETPUSHNO;
1264     }
1265 
1266     /* empty pattern special-cased to use last successful pattern if possible */
1267     if (!rx->prelen && PL_curpm) {
1268 	pm = PL_curpm;
1269 	rx = PM_GETRE(pm);
1270     }
1271 
1272     if (rx->minlen > (I32)len)
1273 	goto failure;
1274 
1275     truebase = t = s;
1276 
1277     /* XXXX What part of this is needed with true \G-support? */
1278     if ((global = dynpm->op_pmflags & PMf_GLOBAL)) {
1279 	rx->startp[0] = -1;
1280 	if (SvTYPE(TARG) >= SVt_PVMG && SvMAGIC(TARG)) {
1281 	    MAGIC* mg = mg_find(TARG, PERL_MAGIC_regex_global);
1282 	    if (mg && mg->mg_len >= 0) {
1283 		if (!(rx->reganch & ROPT_GPOS_SEEN))
1284 		    rx->endp[0] = rx->startp[0] = mg->mg_len;
1285 		else if (rx->reganch & ROPT_ANCH_GPOS) {
1286 		    r_flags |= REXEC_IGNOREPOS;
1287 		    rx->endp[0] = rx->startp[0] = mg->mg_len;
1288 		}
1289 		minmatch = (mg->mg_flags & MGf_MINMATCH);
1290 		update_minmatch = 0;
1291 	    }
1292 	}
1293     }
1294     if ((!global && rx->nparens)
1295 	    || SvTEMP(TARG) || PL_sawampersand)
1296 	r_flags |= REXEC_COPY_STR;
1297     if (SvSCREAM(TARG))
1298 	r_flags |= REXEC_SCREAM;
1299 
1300     if (pm->op_pmflags & (PMf_MULTILINE|PMf_SINGLELINE)) {
1301 	SAVEINT(PL_multiline);
1302 	PL_multiline = pm->op_pmflags & PMf_MULTILINE;
1303     }
1304 
1305 play_it_again:
1306     if (global && rx->startp[0] != -1) {
1307 	t = s = rx->endp[0] + truebase;
1308 	if ((s + rx->minlen) > strend)
1309 	    goto nope;
1310 	if (update_minmatch++)
1311 	    minmatch = had_zerolen;
1312     }
1313     if (rx->reganch & RE_USE_INTUIT &&
1314 	DO_UTF8(TARG) == ((rx->reganch & ROPT_UTF8) != 0)) {
1315 	PL_bostr = truebase;
1316 	s = CALLREG_INTUIT_START(aTHX_ rx, TARG, s, strend, r_flags, NULL);
1317 
1318 	if (!s)
1319 	    goto nope;
1320 	if ( (rx->reganch & ROPT_CHECK_ALL)
1321 	     && !PL_sawampersand
1322 	     && ((rx->reganch & ROPT_NOSCAN)
1323 		 || !((rx->reganch & RE_INTUIT_TAIL)
1324 		      && (r_flags & REXEC_SCREAM)))
1325 	     && !SvROK(TARG))	/* Cannot trust since INTUIT cannot guess ^ */
1326 	    goto yup;
1327     }
1328     if (CALLREGEXEC(aTHX_ rx, s, strend, truebase, minmatch, TARG, NULL, r_flags))
1329     {
1330 	PL_curpm = pm;
1331 	if (dynpm->op_pmflags & PMf_ONCE)
1332 	    dynpm->op_pmdynflags |= PMdf_USED;
1333 	goto gotcha;
1334     }
1335     else
1336 	goto ret_no;
1337     /*NOTREACHED*/
1338 
1339   gotcha:
1340     if (rxtainted)
1341 	RX_MATCH_TAINTED_on(rx);
1342     TAINT_IF(RX_MATCH_TAINTED(rx));
1343     if (gimme == G_ARRAY) {
1344 	I32 nparens, i, len;
1345 
1346 	nparens = rx->nparens;
1347 	if (global && !nparens)
1348 	    i = 1;
1349 	else
1350 	    i = 0;
1351 	SPAGAIN;			/* EVAL blocks could move the stack. */
1352 	EXTEND(SP, nparens + i);
1353 	EXTEND_MORTAL(nparens + i);
1354 	for (i = !i; i <= nparens; i++) {
1355 	    PUSHs(sv_newmortal());
1356 	    /*SUPPRESS 560*/
1357 	    if ((rx->startp[i] != -1) && rx->endp[i] != -1 ) {
1358 		len = rx->endp[i] - rx->startp[i];
1359 		s = rx->startp[i] + truebase;
1360 	        if (rx->endp[i] < 0 || rx->startp[i] < 0 ||
1361 		    len < 0 || len > strend - s)
1362 		    DIE(aTHX_ "panic: pp_match start/end pointers");
1363 		sv_setpvn(*SP, s, len);
1364 		if (DO_UTF8(TARG) && is_utf8_string((U8*)s, len))
1365 		    SvUTF8_on(*SP);
1366 	    }
1367 	}
1368 	if (global) {
1369 	    if (dynpm->op_pmflags & PMf_CONTINUE) {
1370 		MAGIC* mg = 0;
1371 		if (SvTYPE(TARG) >= SVt_PVMG && SvMAGIC(TARG))
1372 		    mg = mg_find(TARG, PERL_MAGIC_regex_global);
1373 		if (!mg) {
1374 		    sv_magic(TARG, (SV*)0, PERL_MAGIC_regex_global, Nullch, 0);
1375 		    mg = mg_find(TARG, PERL_MAGIC_regex_global);
1376 		}
1377 		if (rx->startp[0] != -1) {
1378 		    mg->mg_len = rx->endp[0];
1379 		    if (rx->startp[0] == rx->endp[0])
1380 			mg->mg_flags |= MGf_MINMATCH;
1381 		    else
1382 			mg->mg_flags &= ~MGf_MINMATCH;
1383 		}
1384 	    }
1385 	    had_zerolen = (rx->startp[0] != -1
1386 			   && rx->startp[0] == rx->endp[0]);
1387 	    PUTBACK;			/* EVAL blocks may use stack */
1388 	    r_flags |= REXEC_IGNOREPOS | REXEC_NOT_FIRST;
1389 	    goto play_it_again;
1390 	}
1391 	else if (!nparens)
1392 	    XPUSHs(&PL_sv_yes);
1393 	LEAVE_SCOPE(oldsave);
1394 	RETURN;
1395     }
1396     else {
1397 	if (global) {
1398 	    MAGIC* mg = 0;
1399 	    if (SvTYPE(TARG) >= SVt_PVMG && SvMAGIC(TARG))
1400 		mg = mg_find(TARG, PERL_MAGIC_regex_global);
1401 	    if (!mg) {
1402 		sv_magic(TARG, (SV*)0, PERL_MAGIC_regex_global, Nullch, 0);
1403 		mg = mg_find(TARG, PERL_MAGIC_regex_global);
1404 	    }
1405 	    if (rx->startp[0] != -1) {
1406 		mg->mg_len = rx->endp[0];
1407 		if (rx->startp[0] == rx->endp[0])
1408 		    mg->mg_flags |= MGf_MINMATCH;
1409 		else
1410 		    mg->mg_flags &= ~MGf_MINMATCH;
1411 	    }
1412 	}
1413 	LEAVE_SCOPE(oldsave);
1414 	RETPUSHYES;
1415     }
1416 
1417 yup:					/* Confirmed by INTUIT */
1418     if (rxtainted)
1419 	RX_MATCH_TAINTED_on(rx);
1420     TAINT_IF(RX_MATCH_TAINTED(rx));
1421     PL_curpm = pm;
1422     if (dynpm->op_pmflags & PMf_ONCE)
1423 	dynpm->op_pmdynflags |= PMdf_USED;
1424     if (RX_MATCH_COPIED(rx))
1425 	Safefree(rx->subbeg);
1426     RX_MATCH_COPIED_off(rx);
1427     rx->subbeg = Nullch;
1428     if (global) {
1429 	rx->subbeg = truebase;
1430 	rx->startp[0] = s - truebase;
1431 	if (RX_MATCH_UTF8(rx)) {
1432 	    char *t = (char*)utf8_hop((U8*)s, rx->minlen);
1433 	    rx->endp[0] = t - truebase;
1434 	}
1435 	else {
1436 	    rx->endp[0] = s - truebase + rx->minlen;
1437 	}
1438 	rx->sublen = strend - truebase;
1439 	goto gotcha;
1440     }
1441     if (PL_sawampersand) {
1442 	I32 off;
1443 
1444 	rx->subbeg = savepvn(t, strend - t);
1445 	rx->sublen = strend - t;
1446 	RX_MATCH_COPIED_on(rx);
1447 	off = rx->startp[0] = s - t;
1448 	rx->endp[0] = off + rx->minlen;
1449     }
1450     else {			/* startp/endp are used by @- @+. */
1451 	rx->startp[0] = s - truebase;
1452 	rx->endp[0] = s - truebase + rx->minlen;
1453     }
1454     rx->nparens = rx->lastparen = rx->lastcloseparen = 0;	/* used by @-, @+, and $^N */
1455     LEAVE_SCOPE(oldsave);
1456     RETPUSHYES;
1457 
1458 nope:
1459 ret_no:
1460     if (global && !(dynpm->op_pmflags & PMf_CONTINUE)) {
1461 	if (SvTYPE(TARG) >= SVt_PVMG && SvMAGIC(TARG)) {
1462 	    MAGIC* mg = mg_find(TARG, PERL_MAGIC_regex_global);
1463 	    if (mg)
1464 		mg->mg_len = -1;
1465 	}
1466     }
1467     LEAVE_SCOPE(oldsave);
1468     if (gimme == G_ARRAY)
1469 	RETURN;
1470     RETPUSHNO;
1471 }
1472 
1473 OP *
Perl_do_readline(pTHX)1474 Perl_do_readline(pTHX)
1475 {
1476     dSP; dTARGETSTACKED;
1477     register SV *sv;
1478     STRLEN tmplen = 0;
1479     STRLEN offset;
1480     PerlIO *fp;
1481     register IO *io = GvIO(PL_last_in_gv);
1482     register I32 type = PL_op->op_type;
1483     I32 gimme = GIMME_V;
1484     MAGIC *mg;
1485 
1486     if (io && (mg = SvTIED_mg((SV*)io, PERL_MAGIC_tiedscalar))) {
1487 	PUSHMARK(SP);
1488 	XPUSHs(SvTIED_obj((SV*)io, mg));
1489 	PUTBACK;
1490 	ENTER;
1491 	call_method("READLINE", gimme);
1492 	LEAVE;
1493 	SPAGAIN;
1494 	if (gimme == G_SCALAR) {
1495 	    SV* result = POPs;
1496 	    SvSetSV_nosteal(TARG, result);
1497 	    PUSHTARG;
1498 	}
1499 	RETURN;
1500     }
1501     fp = Nullfp;
1502     if (io) {
1503 	fp = IoIFP(io);
1504 	if (!fp) {
1505 	    if (IoFLAGS(io) & IOf_ARGV) {
1506 		if (IoFLAGS(io) & IOf_START) {
1507 		    IoLINES(io) = 0;
1508 		    if (av_len(GvAVn(PL_last_in_gv)) < 0) {
1509 			IoFLAGS(io) &= ~IOf_START;
1510 			do_open(PL_last_in_gv,"-",1,FALSE,O_RDONLY,0,Nullfp);
1511 			sv_setpvn(GvSV(PL_last_in_gv), "-", 1);
1512 			SvSETMAGIC(GvSV(PL_last_in_gv));
1513 			fp = IoIFP(io);
1514 			goto have_fp;
1515 		    }
1516 		}
1517 		fp = nextargv(PL_last_in_gv);
1518 		if (!fp) { /* Note: fp != IoIFP(io) */
1519 		    (void)do_close(PL_last_in_gv, FALSE); /* now it does*/
1520 		}
1521 	    }
1522 	    else if (type == OP_GLOB)
1523 		fp = Perl_start_glob(aTHX_ POPs, io);
1524 	}
1525 	else if (type == OP_GLOB)
1526 	    SP--;
1527 	else if (ckWARN(WARN_IO) && IoTYPE(io) == IoTYPE_WRONLY) {
1528 	    report_evil_fh(PL_last_in_gv, io, OP_phoney_OUTPUT_ONLY);
1529 	}
1530     }
1531     if (!fp) {
1532 	if (ckWARN2(WARN_GLOB, WARN_CLOSED)
1533 		&& (!io || !(IoFLAGS(io) & IOf_START))) {
1534 	    if (type == OP_GLOB)
1535 		Perl_warner(aTHX_ packWARN(WARN_GLOB),
1536 			    "glob failed (can't start child: %s)",
1537 			    Strerror(errno));
1538 	    else
1539 		report_evil_fh(PL_last_in_gv, io, PL_op->op_type);
1540 	}
1541 	if (gimme == G_SCALAR) {
1542 	    /* undef TARG, and push that undefined value */
1543 	    if (type != OP_RCATLINE) {
1544 	        SV_CHECK_THINKFIRST(TARG);
1545 	        (void)SvOK_off(TARG);
1546 	    }
1547 	    PUSHTARG;
1548 	}
1549 	RETURN;
1550     }
1551   have_fp:
1552     if (gimme == G_SCALAR) {
1553 	sv = TARG;
1554 	if (SvROK(sv))
1555 	    sv_unref(sv);
1556 	(void)SvUPGRADE(sv, SVt_PV);
1557 	tmplen = SvLEN(sv);	/* remember if already alloced */
1558 	if (!tmplen && !SvREADONLY(sv))
1559 	    Sv_Grow(sv, 80);	/* try short-buffering it */
1560 	offset = 0;
1561 	if (type == OP_RCATLINE && SvOK(sv)) {
1562 	    if (!SvPOK(sv)) {
1563 		STRLEN n_a;
1564 		(void)SvPV_force(sv, n_a);
1565 	    }
1566 	    offset = SvCUR(sv);
1567 	}
1568     }
1569     else {
1570 	sv = sv_2mortal(NEWSV(57, 80));
1571 	offset = 0;
1572     }
1573 
1574     /* This should not be marked tainted if the fp is marked clean */
1575 #define MAYBE_TAINT_LINE(io, sv) \
1576     if (!(IoFLAGS(io) & IOf_UNTAINT)) { \
1577 	TAINT;				\
1578 	SvTAINTED_on(sv);		\
1579     }
1580 
1581 /* delay EOF state for a snarfed empty file */
1582 #define SNARF_EOF(gimme,rs,io,sv) \
1583     (gimme != G_SCALAR || SvCUR(sv)					\
1584      || (IoFLAGS(io) & IOf_NOLINE) || !RsSNARF(rs))
1585 
1586     for (;;) {
1587 	PUTBACK;
1588 	if (!sv_gets(sv, fp, offset)
1589 	    && (type == OP_GLOB
1590 		|| SNARF_EOF(gimme, PL_rs, io, sv)
1591 		|| PerlIO_error(fp)))
1592 	{
1593 	    PerlIO_clearerr(fp);
1594 	    if (IoFLAGS(io) & IOf_ARGV) {
1595 		fp = nextargv(PL_last_in_gv);
1596 		if (fp)
1597 		    continue;
1598 		(void)do_close(PL_last_in_gv, FALSE);
1599 	    }
1600 	    else if (type == OP_GLOB) {
1601 		if (!do_close(PL_last_in_gv, FALSE) && ckWARN(WARN_GLOB)) {
1602 		    Perl_warner(aTHX_ packWARN(WARN_GLOB),
1603 			   "glob failed (child exited with status %d%s)",
1604 			   (int)(STATUS_CURRENT >> 8),
1605 			   (STATUS_CURRENT & 0x80) ? ", core dumped" : "");
1606 		}
1607 	    }
1608 	    if (gimme == G_SCALAR) {
1609 		if (type != OP_RCATLINE) {
1610 		    SV_CHECK_THINKFIRST(TARG);
1611 		    (void)SvOK_off(TARG);
1612 		}
1613 		SPAGAIN;
1614 		PUSHTARG;
1615 	    }
1616 	    MAYBE_TAINT_LINE(io, sv);
1617 	    RETURN;
1618 	}
1619 	MAYBE_TAINT_LINE(io, sv);
1620 	IoLINES(io)++;
1621 	IoFLAGS(io) |= IOf_NOLINE;
1622 	SvSETMAGIC(sv);
1623 	SPAGAIN;
1624 	XPUSHs(sv);
1625 	if (type == OP_GLOB) {
1626 	    char *tmps;
1627 
1628 	    if (SvCUR(sv) > 0 && SvCUR(PL_rs) > 0) {
1629 		tmps = SvEND(sv) - 1;
1630 		if (*tmps == *SvPVX(PL_rs)) {
1631 		    *tmps = '\0';
1632 		    SvCUR(sv)--;
1633 		}
1634 	    }
1635 	    for (tmps = SvPVX(sv); *tmps; tmps++)
1636 		if (!isALPHA(*tmps) && !isDIGIT(*tmps) &&
1637 		    strchr("$&*(){}[]'\";\\|?<>~`", *tmps))
1638 			break;
1639 	    if (*tmps && PerlLIO_lstat(SvPVX(sv), &PL_statbuf) < 0) {
1640 		(void)POPs;		/* Unmatched wildcard?  Chuck it... */
1641 		continue;
1642 	    }
1643 	} else if (SvUTF8(sv)) { /* OP_READLINE, OP_RCATLINE */
1644 	     U8 *s = (U8*)SvPVX(sv) + offset;
1645 	     STRLEN len = SvCUR(sv) - offset;
1646 	     U8 *f;
1647 
1648 	     if (ckWARN(WARN_UTF8) &&
1649 		 !Perl_is_utf8_string_loc(aTHX_ s, len, &f))
1650 		  /* Emulate :encoding(utf8) warning in the same case. */
1651 		  Perl_warner(aTHX_ packWARN(WARN_UTF8),
1652 			      "utf8 \"\\x%02X\" does not map to Unicode",
1653 			      f < (U8*)SvEND(sv) ? *f : 0);
1654 	}
1655 	if (gimme == G_ARRAY) {
1656 	    if (SvLEN(sv) - SvCUR(sv) > 20) {
1657 		SvLEN_set(sv, SvCUR(sv)+1);
1658 		Renew(SvPVX(sv), SvLEN(sv), char);
1659 	    }
1660 	    sv = sv_2mortal(NEWSV(58, 80));
1661 	    continue;
1662 	}
1663 	else if (gimme == G_SCALAR && !tmplen && SvLEN(sv) - SvCUR(sv) > 80) {
1664 	    /* try to reclaim a bit of scalar space (only on 1st alloc) */
1665 	    if (SvCUR(sv) < 60)
1666 		SvLEN_set(sv, 80);
1667 	    else
1668 		SvLEN_set(sv, SvCUR(sv)+40);	/* allow some slop */
1669 	    Renew(SvPVX(sv), SvLEN(sv), char);
1670 	}
1671 	RETURN;
1672     }
1673 }
1674 
PP(pp_enter)1675 PP(pp_enter)
1676 {
1677     dSP;
1678     register PERL_CONTEXT *cx;
1679     I32 gimme = OP_GIMME(PL_op, -1);
1680 
1681     if (gimme == -1) {
1682 	if (cxstack_ix >= 0)
1683 	    gimme = cxstack[cxstack_ix].blk_gimme;
1684 	else
1685 	    gimme = G_SCALAR;
1686     }
1687 
1688     ENTER;
1689 
1690     SAVETMPS;
1691     PUSHBLOCK(cx, CXt_BLOCK, SP);
1692 
1693     RETURN;
1694 }
1695 
PP(pp_helem)1696 PP(pp_helem)
1697 {
1698     dSP;
1699     HE* he;
1700     SV **svp;
1701     SV *keysv = POPs;
1702     HV *hv = (HV*)POPs;
1703     U32 lval = PL_op->op_flags & OPf_MOD || LVRET;
1704     U32 defer = PL_op->op_private & OPpLVAL_DEFER;
1705     SV *sv;
1706     U32 hash = (SvFAKE(keysv) && SvREADONLY(keysv)) ? SvUVX(keysv) : 0;
1707     I32 preeminent = 0;
1708 
1709     if (SvTYPE(hv) == SVt_PVHV) {
1710 	if (PL_op->op_private & OPpLVAL_INTRO) {
1711 	    MAGIC *mg;
1712 	    HV *stash;
1713 	    /* does the element we're localizing already exist? */
1714 	    preeminent =
1715 		/* can we determine whether it exists? */
1716 		(    !SvRMAGICAL(hv)
1717 		  || mg_find((SV*)hv, PERL_MAGIC_env)
1718 		  || (     (mg = mg_find((SV*)hv, PERL_MAGIC_tied))
1719 			/* Try to preserve the existenceness of a tied hash
1720 			 * element by using EXISTS and DELETE if possible.
1721 			 * Fallback to FETCH and STORE otherwise */
1722 			&& (stash = SvSTASH(SvRV(SvTIED_obj((SV*)hv, mg))))
1723 			&& gv_fetchmethod_autoload(stash, "EXISTS", TRUE)
1724 			&& gv_fetchmethod_autoload(stash, "DELETE", TRUE)
1725 		    )
1726 		) ? hv_exists_ent(hv, keysv, 0) : 1;
1727 
1728 	}
1729 	he = hv_fetch_ent(hv, keysv, lval && !defer, hash);
1730 	svp = he ? &HeVAL(he) : 0;
1731     }
1732     else if (SvTYPE(hv) == SVt_PVAV) {
1733 	if (PL_op->op_private & OPpLVAL_INTRO)
1734 	    DIE(aTHX_ "Can't localize pseudo-hash element");
1735 	svp = avhv_fetch_ent((AV*)hv, keysv, lval && !defer, hash);
1736     }
1737     else {
1738 	RETPUSHUNDEF;
1739     }
1740     if (lval) {
1741 	if (!svp || *svp == &PL_sv_undef) {
1742 	    SV* lv;
1743 	    SV* key2;
1744 	    if (!defer) {
1745 		STRLEN n_a;
1746 		DIE(aTHX_ PL_no_helem, SvPV(keysv, n_a));
1747 	    }
1748 	    lv = sv_newmortal();
1749 	    sv_upgrade(lv, SVt_PVLV);
1750 	    LvTYPE(lv) = 'y';
1751 	    sv_magic(lv, key2 = newSVsv(keysv), PERL_MAGIC_defelem, Nullch, 0);
1752 	    SvREFCNT_dec(key2);	/* sv_magic() increments refcount */
1753 	    LvTARG(lv) = SvREFCNT_inc(hv);
1754 	    LvTARGLEN(lv) = 1;
1755 	    PUSHs(lv);
1756 	    RETURN;
1757 	}
1758 	if (PL_op->op_private & OPpLVAL_INTRO) {
1759 	    if (HvNAME(hv) && isGV(*svp))
1760 		save_gp((GV*)*svp, !(PL_op->op_flags & OPf_SPECIAL));
1761 	    else {
1762 		if (!preeminent) {
1763 		    STRLEN keylen;
1764 		    char *key = SvPV(keysv, keylen);
1765 		    SAVEDELETE(hv, savepvn(key,keylen), keylen);
1766 		} else
1767 		    save_helem(hv, keysv, svp);
1768             }
1769 	}
1770 	else if (PL_op->op_private & OPpDEREF)
1771 	    vivify_ref(*svp, PL_op->op_private & OPpDEREF);
1772     }
1773     sv = (svp ? *svp : &PL_sv_undef);
1774     /* This makes C<local $tied{foo} = $tied{foo}> possible.
1775      * Pushing the magical RHS on to the stack is useless, since
1776      * that magic is soon destined to be misled by the local(),
1777      * and thus the later pp_sassign() will fail to mg_get() the
1778      * old value.  This should also cure problems with delayed
1779      * mg_get()s.  GSAR 98-07-03 */
1780     if (!lval && SvGMAGICAL(sv))
1781 	sv = sv_mortalcopy(sv);
1782     PUSHs(sv);
1783     RETURN;
1784 }
1785 
PP(pp_leave)1786 PP(pp_leave)
1787 {
1788     dSP;
1789     register PERL_CONTEXT *cx;
1790     register SV **mark;
1791     SV **newsp;
1792     PMOP *newpm;
1793     I32 gimme;
1794 
1795     if (PL_op->op_flags & OPf_SPECIAL) {
1796 	cx = &cxstack[cxstack_ix];
1797 	cx->blk_oldpm = PL_curpm;	/* fake block should preserve $1 et al */
1798     }
1799 
1800     POPBLOCK(cx,newpm);
1801 
1802     gimme = OP_GIMME(PL_op, -1);
1803     if (gimme == -1) {
1804 	if (cxstack_ix >= 0)
1805 	    gimme = cxstack[cxstack_ix].blk_gimme;
1806 	else
1807 	    gimme = G_SCALAR;
1808     }
1809 
1810     TAINT_NOT;
1811     if (gimme == G_VOID)
1812 	SP = newsp;
1813     else if (gimme == G_SCALAR) {
1814 	MARK = newsp + 1;
1815 	if (MARK <= SP) {
1816 	    if (SvFLAGS(TOPs) & (SVs_PADTMP|SVs_TEMP))
1817 		*MARK = TOPs;
1818 	    else
1819 		*MARK = sv_mortalcopy(TOPs);
1820 	} else {
1821 	    MEXTEND(mark,0);
1822 	    *MARK = &PL_sv_undef;
1823 	}
1824 	SP = MARK;
1825     }
1826     else if (gimme == G_ARRAY) {
1827 	/* in case LEAVE wipes old return values */
1828 	for (mark = newsp + 1; mark <= SP; mark++) {
1829 	    if (!(SvFLAGS(*mark) & (SVs_PADTMP|SVs_TEMP))) {
1830 		*mark = sv_mortalcopy(*mark);
1831 		TAINT_NOT;	/* Each item is independent */
1832 	    }
1833 	}
1834     }
1835     PL_curpm = newpm;	/* Don't pop $1 et al till now */
1836 
1837     LEAVE;
1838 
1839     RETURN;
1840 }
1841 
PP(pp_iter)1842 PP(pp_iter)
1843 {
1844     dSP;
1845     register PERL_CONTEXT *cx;
1846     SV* sv;
1847     AV* av;
1848     SV **itersvp;
1849 
1850     EXTEND(SP, 1);
1851     cx = &cxstack[cxstack_ix];
1852     if (CxTYPE(cx) != CXt_LOOP)
1853 	DIE(aTHX_ "panic: pp_iter");
1854 
1855     itersvp = CxITERVAR(cx);
1856     av = cx->blk_loop.iterary;
1857     if (SvTYPE(av) != SVt_PVAV) {
1858 	/* iterate ($min .. $max) */
1859 	if (cx->blk_loop.iterlval) {
1860 	    /* string increment */
1861 	    register SV* cur = cx->blk_loop.iterlval;
1862 	    STRLEN maxlen = 0;
1863 	    char *max = SvOK((SV*)av) ? SvPV((SV*)av, maxlen) : "";
1864 	    if (!SvNIOK(cur) && SvCUR(cur) <= maxlen) {
1865 #ifndef USE_5005THREADS			  /* don't risk potential race */
1866 		if (SvREFCNT(*itersvp) == 1 && !SvMAGICAL(*itersvp)) {
1867 		    /* safe to reuse old SV */
1868 		    sv_setsv(*itersvp, cur);
1869 		}
1870 		else
1871 #endif
1872 		{
1873 		    /* we need a fresh SV every time so that loop body sees a
1874 		     * completely new SV for closures/references to work as
1875 		     * they used to */
1876 		    SvREFCNT_dec(*itersvp);
1877 		    *itersvp = newSVsv(cur);
1878 		}
1879 		if (strEQ(SvPVX(cur), max))
1880 		    sv_setiv(cur, 0); /* terminate next time */
1881 		else
1882 		    sv_inc(cur);
1883 		RETPUSHYES;
1884 	    }
1885 	    RETPUSHNO;
1886 	}
1887 	/* integer increment */
1888 	if (cx->blk_loop.iterix > cx->blk_loop.itermax)
1889 	    RETPUSHNO;
1890 
1891 #ifndef USE_5005THREADS			  /* don't risk potential race */
1892 	if (SvREFCNT(*itersvp) == 1 && !SvMAGICAL(*itersvp)) {
1893 	    /* safe to reuse old SV */
1894 	    sv_setiv(*itersvp, cx->blk_loop.iterix++);
1895 	}
1896 	else
1897 #endif
1898 	{
1899 	    /* we need a fresh SV every time so that loop body sees a
1900 	     * completely new SV for closures/references to work as they
1901 	     * used to */
1902 	    SvREFCNT_dec(*itersvp);
1903 	    *itersvp = newSViv(cx->blk_loop.iterix++);
1904 	}
1905 	RETPUSHYES;
1906     }
1907 
1908     /* iterate array */
1909     if (cx->blk_loop.iterix >= (av == PL_curstack ? cx->blk_oldsp : AvFILL(av)))
1910 	RETPUSHNO;
1911 
1912     SvREFCNT_dec(*itersvp);
1913 
1914     if (SvMAGICAL(av) || AvREIFY(av)) {
1915 	SV **svp = av_fetch(av, ++cx->blk_loop.iterix, FALSE);
1916 	if (svp)
1917 	    sv = *svp;
1918 	else
1919 	    sv = Nullsv;
1920     }
1921     else {
1922 	sv = AvARRAY(av)[++cx->blk_loop.iterix];
1923     }
1924     if (sv && SvREFCNT(sv) == 0) {
1925 	*itersvp = Nullsv;
1926 	Perl_croak(aTHX_ "Use of freed value in iteration");
1927     }
1928 
1929     if (sv)
1930 	SvTEMP_off(sv);
1931     else
1932 	sv = &PL_sv_undef;
1933     if (av != PL_curstack && sv == &PL_sv_undef) {
1934 	SV *lv = cx->blk_loop.iterlval;
1935 	if (lv && SvREFCNT(lv) > 1) {
1936 	    SvREFCNT_dec(lv);
1937 	    lv = Nullsv;
1938 	}
1939 	if (lv)
1940 	    SvREFCNT_dec(LvTARG(lv));
1941 	else {
1942 	    lv = cx->blk_loop.iterlval = NEWSV(26, 0);
1943 	    sv_upgrade(lv, SVt_PVLV);
1944 	    LvTYPE(lv) = 'y';
1945 	    sv_magic(lv, Nullsv, PERL_MAGIC_defelem, Nullch, 0);
1946 	}
1947 	LvTARG(lv) = SvREFCNT_inc(av);
1948 	LvTARGOFF(lv) = cx->blk_loop.iterix;
1949 	LvTARGLEN(lv) = (STRLEN)UV_MAX;
1950 	sv = (SV*)lv;
1951     }
1952 
1953     *itersvp = SvREFCNT_inc(sv);
1954     RETPUSHYES;
1955 }
1956 
PP(pp_subst)1957 PP(pp_subst)
1958 {
1959     dSP; dTARG;
1960     register PMOP *pm = cPMOP;
1961     PMOP *rpm = pm;
1962     register SV *dstr;
1963     register char *s;
1964     char *strend;
1965     register char *m;
1966     char *c;
1967     register char *d;
1968     STRLEN clen;
1969     I32 iters = 0;
1970     I32 maxiters;
1971     register I32 i;
1972     bool once;
1973     bool rxtainted;
1974     char *orig;
1975     I32 r_flags;
1976     register REGEXP *rx = PM_GETRE(pm);
1977     STRLEN len;
1978     int force_on_match = 0;
1979     I32 oldsave = PL_savestack_ix;
1980     STRLEN slen;
1981     bool doutf8 = FALSE;
1982     SV *nsv = Nullsv;
1983 
1984     /* known replacement string? */
1985     dstr = (pm->op_pmflags & PMf_CONST) ? POPs : Nullsv;
1986     if (PL_op->op_flags & OPf_STACKED)
1987 	TARG = POPs;
1988     else {
1989 	TARG = DEFSV;
1990 	EXTEND(SP,1);
1991     }
1992 
1993     if (SvFAKE(TARG) && SvREADONLY(TARG))
1994 	sv_force_normal(TARG);
1995     if (SvREADONLY(TARG)
1996 	|| (SvTYPE(TARG) > SVt_PVLV
1997 	    && !(SvTYPE(TARG) == SVt_PVGV && SvFAKE(TARG))))
1998 	DIE(aTHX_ PL_no_modify);
1999     PUTBACK;
2000 
2001     s = SvPV(TARG, len);
2002     if (!SvPOKp(TARG) || SvTYPE(TARG) == SVt_PVGV)
2003 	force_on_match = 1;
2004     rxtainted = ((pm->op_pmdynflags & PMdf_TAINTED) ||
2005 		 (PL_tainted && (pm->op_pmflags & PMf_RETAINT)));
2006     if (PL_tainted)
2007 	rxtainted |= 2;
2008     TAINT_NOT;
2009 
2010     RX_MATCH_UTF8_set(rx, DO_UTF8(TARG));
2011 
2012   force_it:
2013     if (!pm || !s)
2014 	DIE(aTHX_ "panic: pp_subst");
2015 
2016     strend = s + len;
2017     slen = RX_MATCH_UTF8(rx) ? utf8_length((U8*)s, (U8*)strend) : len;
2018     maxiters = 2 * slen + 10;	/* We can match twice at each
2019 				   position, once with zero-length,
2020 				   second time with non-zero. */
2021 
2022     if (!rx->prelen && PL_curpm) {
2023 	pm = PL_curpm;
2024 	rx = PM_GETRE(pm);
2025     }
2026     r_flags = (rx->nparens || SvTEMP(TARG) || PL_sawampersand)
2027 		? REXEC_COPY_STR : 0;
2028     if (SvSCREAM(TARG))
2029 	r_flags |= REXEC_SCREAM;
2030     if (pm->op_pmflags & (PMf_MULTILINE|PMf_SINGLELINE)) {
2031 	SAVEINT(PL_multiline);
2032 	PL_multiline = pm->op_pmflags & PMf_MULTILINE;
2033     }
2034     orig = m = s;
2035     if (rx->reganch & RE_USE_INTUIT) {
2036 	PL_bostr = orig;
2037 	s = CALLREG_INTUIT_START(aTHX_ rx, TARG, s, strend, r_flags, NULL);
2038 
2039 	if (!s)
2040 	    goto nope;
2041 	/* How to do it in subst? */
2042 /*	if ( (rx->reganch & ROPT_CHECK_ALL)
2043 	     && !PL_sawampersand
2044 	     && ((rx->reganch & ROPT_NOSCAN)
2045 		 || !((rx->reganch & RE_INTUIT_TAIL)
2046 		      && (r_flags & REXEC_SCREAM))))
2047 	    goto yup;
2048 */
2049     }
2050 
2051     /* only replace once? */
2052     once = !(rpm->op_pmflags & PMf_GLOBAL);
2053 
2054     /* known replacement string? */
2055     if (dstr) {
2056 	/* replacement needing upgrading? */
2057 	if (DO_UTF8(TARG) && !doutf8) {
2058 	     nsv = sv_newmortal();
2059 	     SvSetSV(nsv, dstr);
2060 	     if (PL_encoding)
2061 		  sv_recode_to_utf8(nsv, PL_encoding);
2062 	     else
2063 		  sv_utf8_upgrade(nsv);
2064 	     c = SvPV(nsv, clen);
2065 	     doutf8 = TRUE;
2066 	}
2067 	else {
2068 	    c = SvPV(dstr, clen);
2069 	    doutf8 = DO_UTF8(dstr);
2070 	}
2071     }
2072     else {
2073         c = Nullch;
2074 	doutf8 = FALSE;
2075     }
2076 
2077     /* can do inplace substitution? */
2078     if (c && (I32)clen <= rx->minlen && (once || !(r_flags & REXEC_COPY_STR))
2079 	&& !(rx->reganch & ROPT_LOOKBEHIND_SEEN)
2080 	&& (!doutf8 || SvUTF8(TARG))) {
2081 	if (!CALLREGEXEC(aTHX_ rx, s, strend, orig, 0, TARG, NULL,
2082 			 r_flags | REXEC_CHECKED))
2083 	{
2084 	    SPAGAIN;
2085 	    PUSHs(&PL_sv_no);
2086 	    LEAVE_SCOPE(oldsave);
2087 	    RETURN;
2088 	}
2089 	if (force_on_match) {
2090 	    force_on_match = 0;
2091 	    s = SvPV_force(TARG, len);
2092 	    goto force_it;
2093 	}
2094 	d = s;
2095 	PL_curpm = pm;
2096 	SvSCREAM_off(TARG);	/* disable possible screamer */
2097 	if (once) {
2098 	    rxtainted |= RX_MATCH_TAINTED(rx);
2099 	    m = orig + rx->startp[0];
2100 	    d = orig + rx->endp[0];
2101 	    s = orig;
2102 	    if (m - s > strend - d) {  /* faster to shorten from end */
2103 		if (clen) {
2104 		    Copy(c, m, clen, char);
2105 		    m += clen;
2106 		}
2107 		i = strend - d;
2108 		if (i > 0) {
2109 		    Move(d, m, i, char);
2110 		    m += i;
2111 		}
2112 		*m = '\0';
2113 		SvCUR_set(TARG, m - s);
2114 	    }
2115 	    /*SUPPRESS 560*/
2116 	    else if ((i = m - s)) {	/* faster from front */
2117 		d -= clen;
2118 		m = d;
2119 		sv_chop(TARG, d-i);
2120 		s += i;
2121 		while (i--)
2122 		    *--d = *--s;
2123 		if (clen)
2124 		    Copy(c, m, clen, char);
2125 	    }
2126 	    else if (clen) {
2127 		d -= clen;
2128 		sv_chop(TARG, d);
2129 		Copy(c, d, clen, char);
2130 	    }
2131 	    else {
2132 		sv_chop(TARG, d);
2133 	    }
2134 	    TAINT_IF(rxtainted & 1);
2135 	    SPAGAIN;
2136 	    PUSHs(&PL_sv_yes);
2137 	}
2138 	else {
2139 	    do {
2140 		if (iters++ > maxiters)
2141 		    DIE(aTHX_ "Substitution loop");
2142 		rxtainted |= RX_MATCH_TAINTED(rx);
2143 		m = rx->startp[0] + orig;
2144 		/*SUPPRESS 560*/
2145 		if ((i = m - s)) {
2146 		    if (s != d)
2147 			Move(s, d, i, char);
2148 		    d += i;
2149 		}
2150 		if (clen) {
2151 		    Copy(c, d, clen, char);
2152 		    d += clen;
2153 		}
2154 		s = rx->endp[0] + orig;
2155 	    } while (CALLREGEXEC(aTHX_ rx, s, strend, orig, s == m,
2156 				 TARG, NULL,
2157 				 /* don't match same null twice */
2158 				 REXEC_NOT_FIRST|REXEC_IGNOREPOS));
2159 	    if (s != d) {
2160 		i = strend - s;
2161 		SvCUR_set(TARG, d - SvPVX(TARG) + i);
2162 		Move(s, d, i+1, char);		/* include the NUL */
2163 	    }
2164 	    TAINT_IF(rxtainted & 1);
2165 	    SPAGAIN;
2166 	    PUSHs(sv_2mortal(newSViv((I32)iters)));
2167 	}
2168 	(void)SvPOK_only_UTF8(TARG);
2169 	TAINT_IF(rxtainted);
2170 	if (SvSMAGICAL(TARG)) {
2171 	    PUTBACK;
2172 	    mg_set(TARG);
2173 	    SPAGAIN;
2174 	}
2175 	SvTAINT(TARG);
2176 	if (doutf8)
2177 	    SvUTF8_on(TARG);
2178 	LEAVE_SCOPE(oldsave);
2179 	RETURN;
2180     }
2181 
2182     if (CALLREGEXEC(aTHX_ rx, s, strend, orig, 0, TARG, NULL,
2183 		    r_flags | REXEC_CHECKED))
2184     {
2185 	if (force_on_match) {
2186 	    force_on_match = 0;
2187 	    s = SvPV_force(TARG, len);
2188 	    goto force_it;
2189 	}
2190 	rxtainted |= RX_MATCH_TAINTED(rx);
2191 	dstr = NEWSV(25, len);
2192 	sv_setpvn(dstr, m, s-m);
2193 	if (DO_UTF8(TARG))
2194 	    SvUTF8_on(dstr);
2195 	PL_curpm = pm;
2196 	if (!c) {
2197 	    register PERL_CONTEXT *cx;
2198 	    SPAGAIN;
2199 	    ReREFCNT_inc(rx);
2200 	    PUSHSUBST(cx);
2201 	    RETURNOP(cPMOP->op_pmreplroot);
2202 	}
2203 	r_flags |= REXEC_IGNOREPOS | REXEC_NOT_FIRST;
2204 	do {
2205 	    if (iters++ > maxiters)
2206 		DIE(aTHX_ "Substitution loop");
2207 	    rxtainted |= RX_MATCH_TAINTED(rx);
2208 	    if (RX_MATCH_COPIED(rx) && rx->subbeg != orig) {
2209 		m = s;
2210 		s = orig;
2211 		orig = rx->subbeg;
2212 		s = orig + (m - s);
2213 		strend = s + (strend - m);
2214 	    }
2215 	    m = rx->startp[0] + orig;
2216 	    if (doutf8 && !SvUTF8(dstr))
2217 		sv_catpvn_utf8_upgrade(dstr, s, m - s, nsv);
2218             else
2219 		sv_catpvn(dstr, s, m-s);
2220 	    s = rx->endp[0] + orig;
2221 	    if (clen)
2222 		sv_catpvn(dstr, c, clen);
2223 	    if (once)
2224 		break;
2225 	} while (CALLREGEXEC(aTHX_ rx, s, strend, orig, s == m,
2226 			     TARG, NULL, r_flags));
2227 	if (doutf8 && !DO_UTF8(TARG))
2228 	    sv_catpvn_utf8_upgrade(dstr, s, strend - s, nsv);
2229 	else
2230 	    sv_catpvn(dstr, s, strend - s);
2231 
2232 	(void)SvOOK_off(TARG);
2233 	if (SvLEN(TARG))
2234 	    Safefree(SvPVX(TARG));
2235 	SvPVX(TARG) = SvPVX(dstr);
2236 	SvCUR_set(TARG, SvCUR(dstr));
2237 	SvLEN_set(TARG, SvLEN(dstr));
2238 	doutf8 |= DO_UTF8(dstr);
2239 	SvPVX(dstr) = 0;
2240 	sv_free(dstr);
2241 
2242 	TAINT_IF(rxtainted & 1);
2243 	SPAGAIN;
2244 	PUSHs(sv_2mortal(newSViv((I32)iters)));
2245 
2246 	(void)SvPOK_only(TARG);
2247 	if (doutf8)
2248 	    SvUTF8_on(TARG);
2249 	TAINT_IF(rxtainted);
2250 	SvSETMAGIC(TARG);
2251 	SvTAINT(TARG);
2252 	LEAVE_SCOPE(oldsave);
2253 	RETURN;
2254     }
2255     goto ret_no;
2256 
2257 nope:
2258 ret_no:
2259     SPAGAIN;
2260     PUSHs(&PL_sv_no);
2261     LEAVE_SCOPE(oldsave);
2262     RETURN;
2263 }
2264 
PP(pp_grepwhile)2265 PP(pp_grepwhile)
2266 {
2267     dSP;
2268 
2269     if (SvTRUEx(POPs))
2270 	PL_stack_base[PL_markstack_ptr[-1]++] = PL_stack_base[*PL_markstack_ptr];
2271     ++*PL_markstack_ptr;
2272     LEAVE;					/* exit inner scope */
2273 
2274     /* All done yet? */
2275     if (PL_stack_base + *PL_markstack_ptr > SP) {
2276 	I32 items;
2277 	I32 gimme = GIMME_V;
2278 
2279 	LEAVE;					/* exit outer scope */
2280 	(void)POPMARK;				/* pop src */
2281 	items = --*PL_markstack_ptr - PL_markstack_ptr[-1];
2282 	(void)POPMARK;				/* pop dst */
2283 	SP = PL_stack_base + POPMARK;		/* pop original mark */
2284 	if (gimme == G_SCALAR) {
2285 	    dTARGET;
2286 	    XPUSHi(items);
2287 	}
2288 	else if (gimme == G_ARRAY)
2289 	    SP += items;
2290 	RETURN;
2291     }
2292     else {
2293 	SV *src;
2294 
2295 	ENTER;					/* enter inner scope */
2296 	SAVEVPTR(PL_curpm);
2297 
2298 	src = PL_stack_base[*PL_markstack_ptr];
2299 	SvTEMP_off(src);
2300 	DEFSV = src;
2301 
2302 	RETURNOP(cLOGOP->op_other);
2303     }
2304 }
2305 
PP(pp_leavesub)2306 PP(pp_leavesub)
2307 {
2308     dSP;
2309     SV **mark;
2310     SV **newsp;
2311     PMOP *newpm;
2312     I32 gimme;
2313     register PERL_CONTEXT *cx;
2314     SV *sv;
2315 
2316     POPBLOCK(cx,newpm);
2317     cxstack_ix++; /* temporarily protect top context */
2318 
2319     TAINT_NOT;
2320     if (gimme == G_SCALAR) {
2321 	MARK = newsp + 1;
2322 	if (MARK <= SP) {
2323 	    if (cx->blk_sub.cv && CvDEPTH(cx->blk_sub.cv) > 1) {
2324 		if (SvTEMP(TOPs)) {
2325 		    *MARK = SvREFCNT_inc(TOPs);
2326 		    FREETMPS;
2327 		    sv_2mortal(*MARK);
2328 		}
2329 		else {
2330 		    sv = SvREFCNT_inc(TOPs);	/* FREETMPS could clobber it */
2331 		    FREETMPS;
2332 		    *MARK = sv_mortalcopy(sv);
2333 		    SvREFCNT_dec(sv);
2334 		}
2335 	    }
2336 	    else
2337 		*MARK = SvTEMP(TOPs) ? TOPs : sv_mortalcopy(TOPs);
2338 	}
2339 	else {
2340 	    MEXTEND(MARK, 0);
2341 	    *MARK = &PL_sv_undef;
2342 	}
2343 	SP = MARK;
2344     }
2345     else if (gimme == G_ARRAY) {
2346 	for (MARK = newsp + 1; MARK <= SP; MARK++) {
2347 	    if (!SvTEMP(*MARK)) {
2348 		*MARK = sv_mortalcopy(*MARK);
2349 		TAINT_NOT;	/* Each item is independent */
2350 	    }
2351 	}
2352     }
2353     PUTBACK;
2354 
2355     LEAVE;
2356     cxstack_ix--;
2357     POPSUB(cx,sv);	/* Stack values are safe: release CV and @_ ... */
2358     PL_curpm = newpm;	/* ... and pop $1 et al */
2359 
2360     LEAVESUB(sv);
2361     return pop_return();
2362 }
2363 
2364 /* This duplicates the above code because the above code must not
2365  * get any slower by more conditions */
PP(pp_leavesublv)2366 PP(pp_leavesublv)
2367 {
2368     dSP;
2369     SV **mark;
2370     SV **newsp;
2371     PMOP *newpm;
2372     I32 gimme;
2373     register PERL_CONTEXT *cx;
2374     SV *sv;
2375 
2376     POPBLOCK(cx,newpm);
2377     cxstack_ix++; /* temporarily protect top context */
2378 
2379     TAINT_NOT;
2380 
2381     if (cx->blk_sub.lval & OPpENTERSUB_INARGS) {
2382 	/* We are an argument to a function or grep().
2383 	 * This kind of lvalueness was legal before lvalue
2384 	 * subroutines too, so be backward compatible:
2385 	 * cannot report errors.  */
2386 
2387 	/* Scalar context *is* possible, on the LHS of -> only,
2388 	 * as in f()->meth().  But this is not an lvalue. */
2389 	if (gimme == G_SCALAR)
2390 	    goto temporise;
2391 	if (gimme == G_ARRAY) {
2392 	    if (!CvLVALUE(cx->blk_sub.cv))
2393 		goto temporise_array;
2394 	    EXTEND_MORTAL(SP - newsp);
2395 	    for (mark = newsp + 1; mark <= SP; mark++) {
2396 		if (SvTEMP(*mark))
2397 		    /* empty */ ;
2398 		else if (SvFLAGS(*mark) & (SVs_PADTMP | SVf_READONLY))
2399 		    *mark = sv_mortalcopy(*mark);
2400 		else {
2401 		    /* Can be a localized value subject to deletion. */
2402 		    PL_tmps_stack[++PL_tmps_ix] = *mark;
2403 		    (void)SvREFCNT_inc(*mark);
2404 		}
2405 	    }
2406 	}
2407     }
2408     else if (cx->blk_sub.lval) {     /* Leave it as it is if we can. */
2409 	/* Here we go for robustness, not for speed, so we change all
2410 	 * the refcounts so the caller gets a live guy. Cannot set
2411 	 * TEMP, so sv_2mortal is out of question. */
2412 	if (!CvLVALUE(cx->blk_sub.cv)) {
2413 	    LEAVE;
2414 	    cxstack_ix--;
2415 	    POPSUB(cx,sv);
2416 	    PL_curpm = newpm;
2417 	    LEAVESUB(sv);
2418 	    DIE(aTHX_ "Can't modify non-lvalue subroutine call");
2419 	}
2420 	if (gimme == G_SCALAR) {
2421 	    MARK = newsp + 1;
2422 	    EXTEND_MORTAL(1);
2423 	    if (MARK == SP) {
2424 		if (SvFLAGS(TOPs) & (SVs_TEMP | SVs_PADTMP | SVf_READONLY)) {
2425 		    LEAVE;
2426 		    cxstack_ix--;
2427 		    POPSUB(cx,sv);
2428 		    PL_curpm = newpm;
2429 		    LEAVESUB(sv);
2430 		    DIE(aTHX_ "Can't return %s from lvalue subroutine",
2431 			SvREADONLY(TOPs) ? (TOPs == &PL_sv_undef) ? "undef"
2432 			: "a readonly value" : "a temporary");
2433 		}
2434 		else {                  /* Can be a localized value
2435 					 * subject to deletion. */
2436 		    PL_tmps_stack[++PL_tmps_ix] = *mark;
2437 		    (void)SvREFCNT_inc(*mark);
2438 		}
2439 	    }
2440 	    else {			/* Should not happen? */
2441 		LEAVE;
2442 		cxstack_ix--;
2443 		POPSUB(cx,sv);
2444 		PL_curpm = newpm;
2445 		LEAVESUB(sv);
2446 		DIE(aTHX_ "%s returned from lvalue subroutine in scalar context",
2447 		    (MARK > SP ? "Empty array" : "Array"));
2448 	    }
2449 	    SP = MARK;
2450 	}
2451 	else if (gimme == G_ARRAY) {
2452 	    EXTEND_MORTAL(SP - newsp);
2453 	    for (mark = newsp + 1; mark <= SP; mark++) {
2454 		if (*mark != &PL_sv_undef
2455 		    && SvFLAGS(*mark) & (SVs_TEMP | SVs_PADTMP | SVf_READONLY)) {
2456 		    /* Might be flattened array after $#array =  */
2457 		    PUTBACK;
2458 		    LEAVE;
2459 		    cxstack_ix--;
2460 		    POPSUB(cx,sv);
2461 		    PL_curpm = newpm;
2462 		    LEAVESUB(sv);
2463 		    DIE(aTHX_ "Can't return a %s from lvalue subroutine",
2464 			SvREADONLY(TOPs) ? "readonly value" : "temporary");
2465 		}
2466 		else {
2467 		    /* Can be a localized value subject to deletion. */
2468 		    PL_tmps_stack[++PL_tmps_ix] = *mark;
2469 		    (void)SvREFCNT_inc(*mark);
2470 		}
2471 	    }
2472 	}
2473     }
2474     else {
2475 	if (gimme == G_SCALAR) {
2476 	  temporise:
2477 	    MARK = newsp + 1;
2478 	    if (MARK <= SP) {
2479 		if (cx->blk_sub.cv && CvDEPTH(cx->blk_sub.cv) > 1) {
2480 		    if (SvTEMP(TOPs)) {
2481 			*MARK = SvREFCNT_inc(TOPs);
2482 			FREETMPS;
2483 			sv_2mortal(*MARK);
2484 		    }
2485 		    else {
2486 			sv = SvREFCNT_inc(TOPs); /* FREETMPS could clobber it */
2487 			FREETMPS;
2488 			*MARK = sv_mortalcopy(sv);
2489 			SvREFCNT_dec(sv);
2490 		    }
2491 		}
2492 		else
2493 		    *MARK = SvTEMP(TOPs) ? TOPs : sv_mortalcopy(TOPs);
2494 	    }
2495 	    else {
2496 		MEXTEND(MARK, 0);
2497 		*MARK = &PL_sv_undef;
2498 	    }
2499 	    SP = MARK;
2500 	}
2501 	else if (gimme == G_ARRAY) {
2502 	  temporise_array:
2503 	    for (MARK = newsp + 1; MARK <= SP; MARK++) {
2504 		if (!SvTEMP(*MARK)) {
2505 		    *MARK = sv_mortalcopy(*MARK);
2506 		    TAINT_NOT;  /* Each item is independent */
2507 		}
2508 	    }
2509 	}
2510     }
2511     PUTBACK;
2512 
2513     LEAVE;
2514     cxstack_ix--;
2515     POPSUB(cx,sv);	/* Stack values are safe: release CV and @_ ... */
2516     PL_curpm = newpm;	/* ... and pop $1 et al */
2517 
2518     LEAVESUB(sv);
2519     return pop_return();
2520 }
2521 
2522 
2523 STATIC CV *
S_get_db_sub(pTHX_ SV ** svp,CV * cv)2524 S_get_db_sub(pTHX_ SV **svp, CV *cv)
2525 {
2526     SV *dbsv = GvSV(PL_DBsub);
2527 
2528     if (!PERLDB_SUB_NN) {
2529 	GV *gv = CvGV(cv);
2530 
2531 	save_item(dbsv);
2532 	if ( (CvFLAGS(cv) & (CVf_ANON | CVf_CLONED))
2533 	     || strEQ(GvNAME(gv), "END")
2534 	     || ((GvCV(gv) != cv) && /* Could be imported, and old sub redefined. */
2535 		 !( (SvTYPE(*svp) == SVt_PVGV) && (GvCV((GV*)*svp) == cv)
2536 		    && (gv = (GV*)*svp) ))) {
2537 	    /* Use GV from the stack as a fallback. */
2538 	    /* GV is potentially non-unique, or contain different CV. */
2539 	    SV *tmp = newRV((SV*)cv);
2540 	    sv_setsv(dbsv, tmp);
2541 	    SvREFCNT_dec(tmp);
2542 	}
2543 	else {
2544 	    gv_efullname3(dbsv, gv, Nullch);
2545 	}
2546     }
2547     else {
2548 	(void)SvUPGRADE(dbsv, SVt_PVIV);
2549 	(void)SvIOK_on(dbsv);
2550 	SAVEIV(SvIVX(dbsv));
2551 	SvIVX(dbsv) = PTR2IV(cv);	/* Do it the quickest way  */
2552     }
2553 
2554     if (CvXSUB(cv))
2555 	PL_curcopdb = PL_curcop;
2556     cv = GvCV(PL_DBsub);
2557     return cv;
2558 }
2559 
PP(pp_entersub)2560 PP(pp_entersub)
2561 {
2562     dSP; dPOPss;
2563     GV *gv;
2564     HV *stash;
2565     register CV *cv;
2566     register PERL_CONTEXT *cx;
2567     I32 gimme;
2568     bool hasargs = (PL_op->op_flags & OPf_STACKED) != 0;
2569 
2570     if (!sv)
2571 	DIE(aTHX_ "Not a CODE reference");
2572     switch (SvTYPE(sv)) {
2573     default:
2574 	if (!SvROK(sv)) {
2575 	    char *sym;
2576 	    STRLEN n_a;
2577 
2578 	    if (sv == &PL_sv_yes) {		/* unfound import, ignore */
2579 		if (hasargs)
2580 		    SP = PL_stack_base + POPMARK;
2581 		RETURN;
2582 	    }
2583 	    if (SvGMAGICAL(sv)) {
2584 		mg_get(sv);
2585 		if (SvROK(sv))
2586 		    goto got_rv;
2587 		sym = SvPOKp(sv) ? SvPVX(sv) : Nullch;
2588 	    }
2589 	    else
2590 		sym = SvPV(sv, n_a);
2591 	    if (!sym)
2592 		DIE(aTHX_ PL_no_usym, "a subroutine");
2593 	    if (PL_op->op_private & HINT_STRICT_REFS)
2594 		DIE(aTHX_ PL_no_symref, sym, "a subroutine");
2595 	    cv = get_cv(sym, TRUE);
2596 	    break;
2597 	}
2598   got_rv:
2599 	{
2600 	    SV **sp = &sv;		/* Used in tryAMAGICunDEREF macro. */
2601 	    tryAMAGICunDEREF(to_cv);
2602 	}
2603 	cv = (CV*)SvRV(sv);
2604 	if (SvTYPE(cv) == SVt_PVCV)
2605 	    break;
2606 	/* FALL THROUGH */
2607     case SVt_PVHV:
2608     case SVt_PVAV:
2609 	DIE(aTHX_ "Not a CODE reference");
2610     case SVt_PVCV:
2611 	cv = (CV*)sv;
2612 	break;
2613     case SVt_PVGV:
2614 	if (!(cv = GvCVu((GV*)sv)))
2615 	    cv = sv_2cv(sv, &stash, &gv, FALSE);
2616 	if (!cv) {
2617 	    ENTER;
2618 	    SAVETMPS;
2619 	    goto try_autoload;
2620 	}
2621 	break;
2622     }
2623 
2624     ENTER;
2625     SAVETMPS;
2626 
2627   retry:
2628     if (!CvROOT(cv) && !CvXSUB(cv)) {
2629 	GV* autogv;
2630 	SV* sub_name;
2631 
2632 	/* anonymous or undef'd function leaves us no recourse */
2633 	if (CvANON(cv) || !(gv = CvGV(cv)))
2634 	    DIE(aTHX_ "Undefined subroutine called");
2635 
2636 	/* autoloaded stub? */
2637 	if (cv != GvCV(gv)) {
2638 	    cv = GvCV(gv);
2639 	}
2640 	/* should call AUTOLOAD now? */
2641 	else {
2642 try_autoload:
2643 	    if ((autogv = gv_autoload4(GvSTASH(gv), GvNAME(gv), GvNAMELEN(gv),
2644 				   FALSE)))
2645 	    {
2646 		cv = GvCV(autogv);
2647 	    }
2648 	    /* sorry */
2649 	    else {
2650 		sub_name = sv_newmortal();
2651 		gv_efullname3(sub_name, gv, Nullch);
2652 		DIE(aTHX_ "Undefined subroutine &%"SVf" called", sub_name);
2653 	    }
2654 	}
2655 	if (!cv)
2656 	    DIE(aTHX_ "Not a CODE reference");
2657 	goto retry;
2658     }
2659 
2660     gimme = GIMME_V;
2661     if ((PL_op->op_private & OPpENTERSUB_DB) && GvCV(PL_DBsub) && !CvNODEBUG(cv)) {
2662 	cv = get_db_sub(&sv, cv);
2663 	if (!cv)
2664 	    DIE(aTHX_ "No DBsub routine");
2665     }
2666 
2667 #ifdef USE_5005THREADS
2668     /*
2669      * First we need to check if the sub or method requires locking.
2670      * If so, we gain a lock on the CV, the first argument or the
2671      * stash (for static methods), as appropriate. This has to be
2672      * inline because for FAKE_THREADS, COND_WAIT inlines code to
2673      * reschedule by returning a new op.
2674      */
2675     MUTEX_LOCK(CvMUTEXP(cv));
2676     if (CvFLAGS(cv) & CVf_LOCKED) {
2677 	MAGIC *mg;
2678 	if (CvFLAGS(cv) & CVf_METHOD) {
2679 	    if (SP > PL_stack_base + TOPMARK)
2680 		sv = *(PL_stack_base + TOPMARK + 1);
2681 	    else {
2682 		AV *av = (AV*)PAD_SVl(0);
2683 		if (hasargs || !av || AvFILLp(av) < 0
2684 		    || !(sv = AvARRAY(av)[0]))
2685 		{
2686 		    MUTEX_UNLOCK(CvMUTEXP(cv));
2687 		    DIE(aTHX_ "no argument for locked method call");
2688 		}
2689 	    }
2690 	    if (SvROK(sv))
2691 		sv = SvRV(sv);
2692 	    else {
2693 		STRLEN len;
2694 		char *stashname = SvPV(sv, len);
2695 		sv = (SV*)gv_stashpvn(stashname, len, TRUE);
2696 	    }
2697 	}
2698 	else {
2699 	    sv = (SV*)cv;
2700 	}
2701 	MUTEX_UNLOCK(CvMUTEXP(cv));
2702 	mg = condpair_magic(sv);
2703 	MUTEX_LOCK(MgMUTEXP(mg));
2704 	if (MgOWNER(mg) == thr)
2705 	    MUTEX_UNLOCK(MgMUTEXP(mg));
2706 	else {
2707 	    while (MgOWNER(mg))
2708 		COND_WAIT(MgOWNERCONDP(mg), MgMUTEXP(mg));
2709 	    MgOWNER(mg) = thr;
2710 	    DEBUG_S(PerlIO_printf(Perl_debug_log, "%p: pp_entersub lock %p\n",
2711 				  thr, sv));
2712 	    MUTEX_UNLOCK(MgMUTEXP(mg));
2713 	    SAVEDESTRUCTOR_X(Perl_unlock_condpair, sv);
2714 	}
2715 	MUTEX_LOCK(CvMUTEXP(cv));
2716     }
2717     /*
2718      * Now we have permission to enter the sub, we must distinguish
2719      * four cases. (0) It's an XSUB (in which case we don't care
2720      * about ownership); (1) it's ours already (and we're recursing);
2721      * (2) it's free (but we may already be using a cached clone);
2722      * (3) another thread owns it. Case (1) is easy: we just use it.
2723      * Case (2) means we look for a clone--if we have one, use it
2724      * otherwise grab ownership of cv. Case (3) means we look for a
2725      * clone (for non-XSUBs) and have to create one if we don't
2726      * already have one.
2727      * Why look for a clone in case (2) when we could just grab
2728      * ownership of cv straight away? Well, we could be recursing,
2729      * i.e. we originally tried to enter cv while another thread
2730      * owned it (hence we used a clone) but it has been freed up
2731      * and we're now recursing into it. It may or may not be "better"
2732      * to use the clone but at least CvDEPTH can be trusted.
2733      */
2734     if (CvOWNER(cv) == thr || CvXSUB(cv))
2735 	MUTEX_UNLOCK(CvMUTEXP(cv));
2736     else {
2737 	/* Case (2) or (3) */
2738 	SV **svp;
2739 
2740 	/*
2741 	 * XXX Might it be better to release CvMUTEXP(cv) while we
2742      	 * do the hv_fetch? We might find someone has pinched it
2743      	 * when we look again, in which case we would be in case
2744      	 * (3) instead of (2) so we'd have to clone. Would the fact
2745      	 * that we released the mutex more quickly make up for this?
2746      	 */
2747 	if ((svp = hv_fetch(thr->cvcache, (char *)cv, sizeof(cv), FALSE)))
2748 	{
2749 	    /* We already have a clone to use */
2750 	    MUTEX_UNLOCK(CvMUTEXP(cv));
2751 	    cv = *(CV**)svp;
2752 	    DEBUG_S(PerlIO_printf(Perl_debug_log,
2753 				  "entersub: %p already has clone %p:%s\n",
2754 				  thr, cv, SvPEEK((SV*)cv)));
2755 	    CvOWNER(cv) = thr;
2756 	    SvREFCNT_inc(cv);
2757 	    if (CvDEPTH(cv) == 0)
2758 		SAVEDESTRUCTOR_X(unset_cvowner, (void*) cv);
2759 	}
2760 	else {
2761 	    /* (2) => grab ownership of cv. (3) => make clone */
2762 	    if (!CvOWNER(cv)) {
2763 		CvOWNER(cv) = thr;
2764 		SvREFCNT_inc(cv);
2765 		MUTEX_UNLOCK(CvMUTEXP(cv));
2766 		DEBUG_S(PerlIO_printf(Perl_debug_log,
2767 			    "entersub: %p grabbing %p:%s in stash %s\n",
2768 			    thr, cv, SvPEEK((SV*)cv), CvSTASH(cv) ?
2769 	    			HvNAME(CvSTASH(cv)) : "(none)"));
2770 	    }
2771 	    else {
2772 		/* Make a new clone. */
2773 		CV *clonecv;
2774 		SvREFCNT_inc(cv); /* don't let it vanish from under us */
2775 		MUTEX_UNLOCK(CvMUTEXP(cv));
2776 		DEBUG_S((PerlIO_printf(Perl_debug_log,
2777 				       "entersub: %p cloning %p:%s\n",
2778 				       thr, cv, SvPEEK((SV*)cv))));
2779 		/*
2780 	    	 * We're creating a new clone so there's no race
2781 		 * between the original MUTEX_UNLOCK and the
2782 		 * SvREFCNT_inc since no one will be trying to undef
2783 		 * it out from underneath us. At least, I don't think
2784 		 * there's a race...
2785 		 */
2786 	     	clonecv = cv_clone(cv);
2787     		SvREFCNT_dec(cv); /* finished with this */
2788 		hv_store(thr->cvcache, (char*)cv, sizeof(cv), (SV*)clonecv,0);
2789 		CvOWNER(clonecv) = thr;
2790 		cv = clonecv;
2791 		SvREFCNT_inc(cv);
2792 	    }
2793 	    DEBUG_S(if (CvDEPTH(cv) != 0)
2794 			PerlIO_printf(Perl_debug_log, "depth %ld != 0\n",
2795                                      CvDEPTH(cv)));
2796 	    SAVEDESTRUCTOR_X(unset_cvowner, (void*) cv);
2797 	}
2798     }
2799 #endif /* USE_5005THREADS */
2800 
2801     if (CvXSUB(cv)) {
2802 #ifdef PERL_XSUB_OLDSTYLE
2803 	if (CvOLDSTYLE(cv)) {
2804 	    I32 (*fp3)(int,int,int);
2805 	    dMARK;
2806 	    register I32 items = SP - MARK;
2807 					/* We dont worry to copy from @_. */
2808 	    while (SP > mark) {
2809 		SP[1] = SP[0];
2810 		SP--;
2811 	    }
2812 	    PL_stack_sp = mark + 1;
2813 	    fp3 = (I32(*)(int,int,int))CvXSUB(cv);
2814 	    items = (*fp3)(CvXSUBANY(cv).any_i32,
2815 			   MARK - PL_stack_base + 1,
2816 			   items);
2817 	    PL_stack_sp = PL_stack_base + items;
2818 	}
2819 	else
2820 #endif /* PERL_XSUB_OLDSTYLE */
2821 	{
2822 	    I32 markix = TOPMARK;
2823 
2824 	    PUTBACK;
2825 
2826 	    if (!hasargs) {
2827 		/* Need to copy @_ to stack. Alternative may be to
2828 		 * switch stack to @_, and copy return values
2829 		 * back. This would allow popping @_ in XSUB, e.g.. XXXX */
2830 		AV* av;
2831 		I32 items;
2832 #ifdef USE_5005THREADS
2833 		av = (AV*)PAD_SVl(0);
2834 #else
2835 		av = GvAV(PL_defgv);
2836 #endif /* USE_5005THREADS */
2837 		items = AvFILLp(av) + 1;   /* @_ is not tieable */
2838 
2839 		if (items) {
2840 		    /* Mark is at the end of the stack. */
2841 		    EXTEND(SP, items);
2842 		    Copy(AvARRAY(av), SP + 1, items, SV*);
2843 		    SP += items;
2844 		    PUTBACK ;
2845 		}
2846 	    }
2847 	    /* We assume first XSUB in &DB::sub is the called one. */
2848 	    if (PL_curcopdb) {
2849 		SAVEVPTR(PL_curcop);
2850 		PL_curcop = PL_curcopdb;
2851 		PL_curcopdb = NULL;
2852 	    }
2853 	    /* Do we need to open block here? XXXX */
2854 	    (void)(*CvXSUB(cv))(aTHX_ cv);
2855 
2856 	    /* Enforce some sanity in scalar context. */
2857 	    if (gimme == G_SCALAR && ++markix != PL_stack_sp - PL_stack_base ) {
2858 		if (markix > PL_stack_sp - PL_stack_base)
2859 		    *(PL_stack_base + markix) = &PL_sv_undef;
2860 		else
2861 		    *(PL_stack_base + markix) = *PL_stack_sp;
2862 		PL_stack_sp = PL_stack_base + markix;
2863 	    }
2864 	}
2865 	LEAVE;
2866 	return NORMAL;
2867     }
2868     else {
2869 	dMARK;
2870 	register I32 items = SP - MARK;
2871 	AV* padlist = CvPADLIST(cv);
2872 	push_return(PL_op->op_next);
2873 	PUSHBLOCK(cx, CXt_SUB, MARK);
2874 	PUSHSUB(cx);
2875 	CvDEPTH(cv)++;
2876 	/* XXX This would be a natural place to set C<PL_compcv = cv> so
2877 	 * that eval'' ops within this sub know the correct lexical space.
2878 	 * Owing the speed considerations, we choose instead to search for
2879 	 * the cv using find_runcv() when calling doeval().
2880 	 */
2881 	if (CvDEPTH(cv) >= 2) {
2882 	    PERL_STACK_OVERFLOW_CHECK();
2883 	    pad_push(padlist, CvDEPTH(cv), 1);
2884 	}
2885 #ifdef USE_5005THREADS
2886 	if (!hasargs) {
2887 	    AV* av = (AV*)PAD_SVl(0);
2888 
2889 	    items = AvFILLp(av) + 1;
2890 	    if (items) {
2891 		/* Mark is at the end of the stack. */
2892 		EXTEND(SP, items);
2893 		Copy(AvARRAY(av), SP + 1, items, SV*);
2894 		SP += items;
2895 		PUTBACK ;
2896 	    }
2897 	}
2898 #endif /* USE_5005THREADS */
2899 	PAD_SET_CUR(padlist, CvDEPTH(cv));
2900 #ifndef USE_5005THREADS
2901 	if (hasargs)
2902 #endif /* USE_5005THREADS */
2903 	{
2904 	    AV* av;
2905 	    SV** ary;
2906 
2907 #if 0
2908 	    DEBUG_S(PerlIO_printf(Perl_debug_log,
2909 	    			  "%p entersub preparing @_\n", thr));
2910 #endif
2911 	    av = (AV*)PAD_SVl(0);
2912 	    if (AvREAL(av)) {
2913 		/* @_ is normally not REAL--this should only ever
2914 		 * happen when DB::sub() calls things that modify @_ */
2915 		av_clear(av);
2916 		AvREAL_off(av);
2917 		AvREIFY_on(av);
2918 	    }
2919 #ifndef USE_5005THREADS
2920 	    cx->blk_sub.savearray = GvAV(PL_defgv);
2921 	    GvAV(PL_defgv) = (AV*)SvREFCNT_inc(av);
2922 #endif /* USE_5005THREADS */
2923 	    CX_CURPAD_SAVE(cx->blk_sub);
2924 	    cx->blk_sub.argarray = av;
2925 	    ++MARK;
2926 
2927 	    if (items > AvMAX(av) + 1) {
2928 		ary = AvALLOC(av);
2929 		if (AvARRAY(av) != ary) {
2930 		    AvMAX(av) += AvARRAY(av) - AvALLOC(av);
2931 		    SvPVX(av) = (char*)ary;
2932 		}
2933 		if (items > AvMAX(av) + 1) {
2934 		    AvMAX(av) = items - 1;
2935 		    Renew(ary,items,SV*);
2936 		    AvALLOC(av) = ary;
2937 		    SvPVX(av) = (char*)ary;
2938 		}
2939 	    }
2940 	    Copy(MARK,AvARRAY(av),items,SV*);
2941 	    AvFILLp(av) = items - 1;
2942 
2943 	    while (items--) {
2944 		if (*MARK)
2945 		    SvTEMP_off(*MARK);
2946 		MARK++;
2947 	    }
2948 	}
2949 	/* warning must come *after* we fully set up the context
2950 	 * stuff so that __WARN__ handlers can safely dounwind()
2951 	 * if they want to
2952 	 */
2953 	if (CvDEPTH(cv) == 100 && ckWARN(WARN_RECURSION)
2954 	    && !(PERLDB_SUB && cv == GvCV(PL_DBsub)))
2955 	    sub_crush_depth(cv);
2956 #if 0
2957 	DEBUG_S(PerlIO_printf(Perl_debug_log,
2958 			      "%p entersub returning %p\n", thr, CvSTART(cv)));
2959 #endif
2960 	RETURNOP(CvSTART(cv));
2961     }
2962 }
2963 
2964 void
Perl_sub_crush_depth(pTHX_ CV * cv)2965 Perl_sub_crush_depth(pTHX_ CV *cv)
2966 {
2967     if (CvANON(cv))
2968 	Perl_warner(aTHX_ packWARN(WARN_RECURSION), "Deep recursion on anonymous subroutine");
2969     else {
2970 	SV* tmpstr = sv_newmortal();
2971 	gv_efullname3(tmpstr, CvGV(cv), Nullch);
2972 	Perl_warner(aTHX_ packWARN(WARN_RECURSION), "Deep recursion on subroutine \"%"SVf"\"",
2973 		tmpstr);
2974     }
2975 }
2976 
PP(pp_aelem)2977 PP(pp_aelem)
2978 {
2979     dSP;
2980     SV** svp;
2981     SV* elemsv = POPs;
2982     IV elem = SvIV(elemsv);
2983     AV* av = (AV*)POPs;
2984     U32 lval = PL_op->op_flags & OPf_MOD || LVRET;
2985     U32 defer = (PL_op->op_private & OPpLVAL_DEFER) && (elem > AvFILL(av));
2986     SV *sv;
2987 
2988     if (SvROK(elemsv) && !SvGAMAGIC(elemsv) && ckWARN(WARN_MISC))
2989 	Perl_warner(aTHX_ packWARN(WARN_MISC), "Use of reference \"%"SVf"\" as array index", elemsv);
2990     if (elem > 0)
2991 	elem -= PL_curcop->cop_arybase;
2992     if (SvTYPE(av) != SVt_PVAV)
2993 	RETPUSHUNDEF;
2994     svp = av_fetch(av, elem, lval && !defer);
2995     if (lval) {
2996 	if (!svp || *svp == &PL_sv_undef) {
2997 	    SV* lv;
2998 	    if (!defer)
2999 		DIE(aTHX_ PL_no_aelem, elem);
3000 	    lv = sv_newmortal();
3001 	    sv_upgrade(lv, SVt_PVLV);
3002 	    LvTYPE(lv) = 'y';
3003 	    sv_magic(lv, Nullsv, PERL_MAGIC_defelem, Nullch, 0);
3004 	    LvTARG(lv) = SvREFCNT_inc(av);
3005 	    LvTARGOFF(lv) = elem;
3006 	    LvTARGLEN(lv) = 1;
3007 	    PUSHs(lv);
3008 	    RETURN;
3009 	}
3010 	if (PL_op->op_private & OPpLVAL_INTRO)
3011 	    save_aelem(av, elem, svp);
3012 	else if (PL_op->op_private & OPpDEREF)
3013 	    vivify_ref(*svp, PL_op->op_private & OPpDEREF);
3014     }
3015     sv = (svp ? *svp : &PL_sv_undef);
3016     if (!lval && SvGMAGICAL(sv))	/* see note in pp_helem() */
3017 	sv = sv_mortalcopy(sv);
3018     PUSHs(sv);
3019     RETURN;
3020 }
3021 
3022 void
Perl_vivify_ref(pTHX_ SV * sv,U32 to_what)3023 Perl_vivify_ref(pTHX_ SV *sv, U32 to_what)
3024 {
3025     if (SvGMAGICAL(sv))
3026 	mg_get(sv);
3027     if (!SvOK(sv)) {
3028 	if (SvREADONLY(sv))
3029 	    Perl_croak(aTHX_ PL_no_modify);
3030 	if (SvTYPE(sv) < SVt_RV)
3031 	    sv_upgrade(sv, SVt_RV);
3032 	else if (SvTYPE(sv) >= SVt_PV) {
3033 	    (void)SvOOK_off(sv);
3034 	    Safefree(SvPVX(sv));
3035 	    SvLEN(sv) = SvCUR(sv) = 0;
3036 	}
3037 	switch (to_what) {
3038 	case OPpDEREF_SV:
3039 	    SvRV(sv) = NEWSV(355,0);
3040 	    break;
3041 	case OPpDEREF_AV:
3042 	    SvRV(sv) = (SV*)newAV();
3043 	    break;
3044 	case OPpDEREF_HV:
3045 	    SvRV(sv) = (SV*)newHV();
3046 	    break;
3047 	}
3048 	SvROK_on(sv);
3049 	SvSETMAGIC(sv);
3050     }
3051 }
3052 
PP(pp_method)3053 PP(pp_method)
3054 {
3055     dSP;
3056     SV* sv = TOPs;
3057 
3058     if (SvROK(sv)) {
3059 	SV* rsv = SvRV(sv);
3060 	if (SvTYPE(rsv) == SVt_PVCV) {
3061 	    SETs(rsv);
3062 	    RETURN;
3063 	}
3064     }
3065 
3066     SETs(method_common(sv, Null(U32*)));
3067     RETURN;
3068 }
3069 
PP(pp_method_named)3070 PP(pp_method_named)
3071 {
3072     dSP;
3073     SV* sv = cSVOP_sv;
3074     U32 hash = SvUVX(sv);
3075 
3076     XPUSHs(method_common(sv, &hash));
3077     RETURN;
3078 }
3079 
3080 STATIC SV *
S_method_common(pTHX_ SV * meth,U32 * hashp)3081 S_method_common(pTHX_ SV* meth, U32* hashp)
3082 {
3083     SV* sv;
3084     SV* ob;
3085     GV* gv;
3086     HV* stash;
3087     char* name;
3088     STRLEN namelen;
3089     char* packname = 0;
3090     SV *packsv = Nullsv;
3091     STRLEN packlen;
3092 
3093     name = SvPV(meth, namelen);
3094     sv = *(PL_stack_base + TOPMARK + 1);
3095 
3096     if (!sv)
3097 	Perl_croak(aTHX_ "Can't call method \"%s\" on an undefined value", name);
3098 
3099     if (SvGMAGICAL(sv))
3100 	mg_get(sv);
3101     if (SvROK(sv))
3102 	ob = (SV*)SvRV(sv);
3103     else {
3104 	GV* iogv;
3105 
3106 	/* this isn't a reference */
3107 	packname = Nullch;
3108 
3109         if(SvOK(sv) && (packname = SvPV(sv, packlen))) {
3110           HE* he;
3111 	  he = hv_fetch_ent(PL_stashcache, sv, 0, 0);
3112           if (he) {
3113             stash = INT2PTR(HV*,SvIV(HeVAL(he)));
3114             goto fetch;
3115           }
3116         }
3117 
3118 	if (!SvOK(sv) ||
3119 	    !(packname) ||
3120 	    !(iogv = gv_fetchpv(packname, FALSE, SVt_PVIO)) ||
3121 	    !(ob=(SV*)GvIO(iogv)))
3122 	{
3123 	    /* this isn't the name of a filehandle either */
3124 	    if (!packname ||
3125 		((UTF8_IS_START(*packname) && DO_UTF8(sv))
3126 		    ? !isIDFIRST_utf8((U8*)packname)
3127 		    : !isIDFIRST(*packname)
3128 		))
3129 	    {
3130 		Perl_croak(aTHX_ "Can't call method \"%s\" %s", name,
3131 			   SvOK(sv) ? "without a package or object reference"
3132 				    : "on an undefined value");
3133 	    }
3134 	    /* assume it's a package name */
3135 	    stash = gv_stashpvn(packname, packlen, FALSE);
3136 	    if (!stash)
3137 		packsv = sv;
3138             else {
3139 	        SV* ref = newSViv(PTR2IV(stash));
3140 	        hv_store(PL_stashcache, packname, packlen, ref, 0);
3141 	    }
3142 	    goto fetch;
3143 	}
3144 	/* it _is_ a filehandle name -- replace with a reference */
3145 	*(PL_stack_base + TOPMARK + 1) = sv_2mortal(newRV((SV*)iogv));
3146     }
3147 
3148     /* if we got here, ob should be a reference or a glob */
3149     if (!ob || !(SvOBJECT(ob)
3150 		 || (SvTYPE(ob) == SVt_PVGV && (ob = (SV*)GvIO((GV*)ob))
3151 		     && SvOBJECT(ob))))
3152     {
3153 	Perl_croak(aTHX_ "Can't call method \"%s\" on unblessed reference",
3154 		   name);
3155     }
3156 
3157     stash = SvSTASH(ob);
3158 
3159   fetch:
3160     /* NOTE: stash may be null, hope hv_fetch_ent and
3161        gv_fetchmethod can cope (it seems they can) */
3162 
3163     /* shortcut for simple names */
3164     if (hashp) {
3165 	HE* he = hv_fetch_ent(stash, meth, 0, *hashp);
3166 	if (he) {
3167 	    gv = (GV*)HeVAL(he);
3168 	    if (isGV(gv) && GvCV(gv) &&
3169 		(!GvCVGEN(gv) || GvCVGEN(gv) == PL_sub_generation))
3170 		return (SV*)GvCV(gv);
3171 	}
3172     }
3173 
3174     gv = gv_fetchmethod(stash ? stash : (HV*)packsv, name);
3175 
3176     if (!gv) {
3177 	/* This code tries to figure out just what went wrong with
3178 	   gv_fetchmethod.  It therefore needs to duplicate a lot of
3179 	   the internals of that function.  We can't move it inside
3180 	   Perl_gv_fetchmethod_autoload(), however, since that would
3181 	   cause UNIVERSAL->can("NoSuchPackage::foo") to croak, and we
3182 	   don't want that.
3183 	*/
3184 	char* leaf = name;
3185 	char* sep = Nullch;
3186 	char* p;
3187 
3188 	for (p = name; *p; p++) {
3189 	    if (*p == '\'')
3190 		sep = p, leaf = p + 1;
3191 	    else if (*p == ':' && *(p + 1) == ':')
3192 		sep = p, leaf = p + 2;
3193 	}
3194 	if (!sep || ((sep - name) == 5 && strnEQ(name, "SUPER", 5))) {
3195 	    /* the method name is unqualified or starts with SUPER:: */
3196 	    packname = sep ? CopSTASHPV(PL_curcop) :
3197 		stash ? HvNAME(stash) : packname;
3198 	    packlen = strlen(packname);
3199 	}
3200 	else {
3201 	    /* the method name is qualified */
3202 	    packname = name;
3203 	    packlen = sep - name;
3204 	}
3205 
3206 	/* we're relying on gv_fetchmethod not autovivifying the stash */
3207 	if (gv_stashpvn(packname, packlen, FALSE)) {
3208 	    Perl_croak(aTHX_
3209 		       "Can't locate object method \"%s\" via package \"%.*s\"",
3210 		       leaf, (int)packlen, packname);
3211 	}
3212 	else {
3213 	    Perl_croak(aTHX_
3214 		       "Can't locate object method \"%s\" via package \"%.*s\""
3215 		       " (perhaps you forgot to load \"%.*s\"?)",
3216 		       leaf, (int)packlen, packname, (int)packlen, packname);
3217 	}
3218     }
3219     return isGV(gv) ? (SV*)GvCV(gv) : (SV*)gv;
3220 }
3221 
3222 #ifdef USE_5005THREADS
3223 static void
unset_cvowner(pTHX_ void * cvarg)3224 unset_cvowner(pTHX_ void *cvarg)
3225 {
3226     register CV* cv = (CV *) cvarg;
3227 
3228     DEBUG_S((PerlIO_printf(Perl_debug_log, "%p unsetting CvOWNER of %p:%s\n",
3229 			   thr, cv, SvPEEK((SV*)cv))));
3230     MUTEX_LOCK(CvMUTEXP(cv));
3231     DEBUG_S(if (CvDEPTH(cv) != 0)
3232 		PerlIO_printf(Perl_debug_log, "depth %ld != 0\n",
3233                              CvDEPTH(cv)));
3234     assert(thr == CvOWNER(cv));
3235     CvOWNER(cv) = 0;
3236     MUTEX_UNLOCK(CvMUTEXP(cv));
3237     SvREFCNT_dec(cv);
3238 }
3239 #endif /* USE_5005THREADS */
3240