d6cb1aa091b102149510c41427e8f9c52a4c482c
[perl.git] / pp_hot.c
1 /*    pp_hot.c
2  *
3  *    Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
4  *    2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 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  *     [p.1007 of _The Lord of the Rings_, VI/viii: "The Scouring of the Shire"]
19  */
20
21 /* This file contains 'hot' pp ("push/pop") functions that
22  * execute the opcodes that make up a perl program. A typical pp function
23  * expects to find its arguments on the stack, and usually pushes its
24  * results onto the stack, hence the 'pp' terminology. Each OP structure
25  * contains a pointer to the relevant pp_foo() function.
26  *
27  * By 'hot', we mean common ops whose execution speed is critical.
28  * By gathering them together into a single file, we encourage
29  * CPU cache hits on hot code. Also it could be taken as a warning not to
30  * change any code in this file unless you're sure it won't affect
31  * performance.
32  */
33
34 #include "EXTERN.h"
35 #define PERL_IN_PP_HOT_C
36 #include "perl.h"
37
38 /* Hot code. */
39
40 PP(pp_const)
41 {
42     dSP;
43     XPUSHs(cSVOP_sv);
44     RETURN;
45 }
46
47 PP(pp_nextstate)
48 {
49     PL_curcop = (COP*)PL_op;
50     TAINT_NOT;          /* Each statement is presumed innocent */
51     PL_stack_sp = PL_stack_base + CX_CUR()->blk_oldsp;
52     FREETMPS;
53     PERL_ASYNC_CHECK();
54     return NORMAL;
55 }
56
57 PP(pp_gvsv)
58 {
59     dSP;
60     EXTEND(SP,1);
61     if (UNLIKELY(PL_op->op_private & OPpLVAL_INTRO))
62         PUSHs(save_scalar(cGVOP_gv));
63     else
64         PUSHs(GvSVn(cGVOP_gv));
65     RETURN;
66 }
67
68
69 /* also used for: pp_lineseq() pp_regcmaybe() pp_scalar() pp_scope() */
70
71 PP(pp_null)
72 {
73     return NORMAL;
74 }
75
76 /* This is sometimes called directly by pp_coreargs, pp_grepstart and
77    amagic_call. */
78 PP(pp_pushmark)
79 {
80     PUSHMARK(PL_stack_sp);
81     return NORMAL;
82 }
83
84 PP(pp_stringify)
85 {
86     dSP; dTARGET;
87     SV * const sv = TOPs;
88     SETs(TARG);
89     sv_copypv(TARG, sv);
90     SvSETMAGIC(TARG);
91     /* no PUTBACK, SETs doesn't inc/dec SP */
92     return NORMAL;
93 }
94
95 PP(pp_gv)
96 {
97     dSP;
98     XPUSHs(MUTABLE_SV(cGVOP_gv));
99     RETURN;
100 }
101
102
103 /* also used for: pp_andassign() */
104
105 PP(pp_and)
106 {
107     PERL_ASYNC_CHECK();
108     {
109         /* SP is not used to remove a variable that is saved across the
110           sv_2bool_flags call in SvTRUE_NN, if a RISC/CISC or low/high machine
111           register or load/store vs direct mem ops macro is introduced, this
112           should be a define block between direct PL_stack_sp and dSP operations,
113           presently, using PL_stack_sp is bias towards CISC cpus */
114         SV * const sv = *PL_stack_sp;
115         if (!SvTRUE_NN(sv))
116             return NORMAL;
117         else {
118             if (PL_op->op_type == OP_AND)
119                 --PL_stack_sp;
120             return cLOGOP->op_other;
121         }
122     }
123 }
124
125 PP(pp_sassign)
126 {
127     dSP;
128     /* sassign keeps its args in the optree traditionally backwards.
129        So we pop them differently.
130     */
131     SV *left = POPs; SV *right = TOPs;
132
133     if (PL_op->op_private & OPpASSIGN_BACKWARDS) {
134         SV * const temp = left;
135         left = right; right = temp;
136     }
137     assert(TAINTING_get || !TAINT_get);
138     if (UNLIKELY(TAINT_get) && !SvTAINTED(right))
139         TAINT_NOT;
140     if (UNLIKELY(PL_op->op_private & OPpASSIGN_CV_TO_GV)) {
141         /* *foo =\&bar */
142         SV * const cv = SvRV(right);
143         const U32 cv_type = SvTYPE(cv);
144         const bool is_gv = isGV_with_GP(left);
145         const bool got_coderef = cv_type == SVt_PVCV || cv_type == SVt_PVFM;
146
147         if (!got_coderef) {
148             assert(SvROK(cv));
149         }
150
151         /* Can do the optimisation if left (LVALUE) is not a typeglob,
152            right (RVALUE) is a reference to something, and we're in void
153            context. */
154         if (!got_coderef && !is_gv && GIMME_V == G_VOID) {
155             /* Is the target symbol table currently empty?  */
156             GV * const gv = gv_fetchsv_nomg(left, GV_NOINIT, SVt_PVGV);
157             if (SvTYPE(gv) != SVt_PVGV && !SvOK(gv)) {
158                 /* Good. Create a new proxy constant subroutine in the target.
159                    The gv becomes a(nother) reference to the constant.  */
160                 SV *const value = SvRV(cv);
161
162                 SvUPGRADE(MUTABLE_SV(gv), SVt_IV);
163                 SvPCS_IMPORTED_on(gv);
164                 SvRV_set(gv, value);
165                 SvREFCNT_inc_simple_void(value);
166                 SETs(left);
167                 RETURN;
168             }
169         }
170
171         /* Need to fix things up.  */
172         if (!is_gv) {
173             /* Need to fix GV.  */
174             left = MUTABLE_SV(gv_fetchsv_nomg(left,GV_ADD, SVt_PVGV));
175         }
176
177         if (!got_coderef) {
178             /* We've been returned a constant rather than a full subroutine,
179                but they expect a subroutine reference to apply.  */
180             if (SvROK(cv)) {
181                 ENTER_with_name("sassign_coderef");
182                 SvREFCNT_inc_void(SvRV(cv));
183                 /* newCONSTSUB takes a reference count on the passed in SV
184                    from us.  We set the name to NULL, otherwise we get into
185                    all sorts of fun as the reference to our new sub is
186                    donated to the GV that we're about to assign to.
187                 */
188                 SvRV_set(right, MUTABLE_SV(newCONSTSUB(GvSTASH(left), NULL,
189                                                       SvRV(cv))));
190                 SvREFCNT_dec_NN(cv);
191                 LEAVE_with_name("sassign_coderef");
192             } else {
193                 /* What can happen for the corner case *{"BONK"} = \&{"BONK"};
194                    is that
195                    First:   ops for \&{"BONK"}; return us the constant in the
196                             symbol table
197                    Second:  ops for *{"BONK"} cause that symbol table entry
198                             (and our reference to it) to be upgraded from RV
199                             to typeblob)
200                    Thirdly: We get here. cv is actually PVGV now, and its
201                             GvCV() is actually the subroutine we're looking for
202
203                    So change the reference so that it points to the subroutine
204                    of that typeglob, as that's what they were after all along.
205                 */
206                 GV *const upgraded = MUTABLE_GV(cv);
207                 CV *const source = GvCV(upgraded);
208
209                 assert(source);
210                 assert(CvFLAGS(source) & CVf_CONST);
211
212                 SvREFCNT_inc_simple_void_NN(source);
213                 SvREFCNT_dec_NN(upgraded);
214                 SvRV_set(right, MUTABLE_SV(source));
215             }
216         }
217
218     }
219     if (
220       UNLIKELY(SvTEMP(left)) && !SvSMAGICAL(left) && SvREFCNT(left) == 1 &&
221       (!isGV_with_GP(left) || SvFAKE(left)) && ckWARN(WARN_MISC)
222     )
223         Perl_warner(aTHX_
224             packWARN(WARN_MISC), "Useless assignment to a temporary"
225         );
226     SvSetMagicSV(left, right);
227     SETs(left);
228     RETURN;
229 }
230
231 PP(pp_cond_expr)
232 {
233     dSP;
234     PERL_ASYNC_CHECK();
235     if (SvTRUEx(POPs))
236         RETURNOP(cLOGOP->op_other);
237     else
238         RETURNOP(cLOGOP->op_next);
239 }
240
241 PP(pp_unstack)
242 {
243     PERL_CONTEXT *cx;
244     PERL_ASYNC_CHECK();
245     TAINT_NOT;          /* Each statement is presumed innocent */
246     cx  = CX_CUR();
247     PL_stack_sp = PL_stack_base + cx->blk_oldsp;
248     FREETMPS;
249     if (!(PL_op->op_flags & OPf_SPECIAL)) {
250         assert(CxTYPE(cx) == CXt_BLOCK || CxTYPE_is_LOOP(cx));
251         CX_LEAVE_SCOPE(cx);
252     }
253     return NORMAL;
254 }
255
256 PP(pp_concat)
257 {
258   dSP; dATARGET; tryAMAGICbin_MG(concat_amg, AMGf_assign);
259   {
260     dPOPTOPssrl;
261     bool lbyte;
262     STRLEN rlen;
263     const char *rpv = NULL;
264     bool rbyte = FALSE;
265     bool rcopied = FALSE;
266
267     if (TARG == right && right != left) { /* $r = $l.$r */
268         rpv = SvPV_nomg_const(right, rlen);
269         rbyte = !DO_UTF8(right);
270         right = newSVpvn_flags(rpv, rlen, SVs_TEMP);
271         rpv = SvPV_const(right, rlen);  /* no point setting UTF-8 here */
272         rcopied = TRUE;
273     }
274
275     if (TARG != left) { /* not $l .= $r */
276         STRLEN llen;
277         const char* const lpv = SvPV_nomg_const(left, llen);
278         lbyte = !DO_UTF8(left);
279         sv_setpvn(TARG, lpv, llen);
280         if (!lbyte)
281             SvUTF8_on(TARG);
282         else
283             SvUTF8_off(TARG);
284     }
285     else { /* $l .= $r   and   left == TARG */
286         if (!SvOK(left)) {
287             if (left == right && ckWARN(WARN_UNINITIALIZED)) /* $l .= $l */
288                 report_uninit(right);
289             sv_setpvs(left, "");
290         }
291         else {
292             SvPV_force_nomg_nolen(left);
293         }
294         lbyte = !DO_UTF8(left);
295         if (IN_BYTES)
296             SvUTF8_off(left);
297     }
298
299     if (!rcopied) {
300         rpv = SvPV_nomg_const(right, rlen);
301         rbyte = !DO_UTF8(right);
302     }
303     if (lbyte != rbyte) {
304         if (lbyte)
305             sv_utf8_upgrade_nomg(TARG);
306         else {
307             if (!rcopied)
308                 right = newSVpvn_flags(rpv, rlen, SVs_TEMP);
309             sv_utf8_upgrade_nomg(right);
310             rpv = SvPV_nomg_const(right, rlen);
311         }
312     }
313     sv_catpvn_nomg(TARG, rpv, rlen);
314
315     SETTARG;
316     RETURN;
317   }
318 }
319
320 /* push the elements of av onto the stack.
321  * XXX Note that padav has similar code but without the mg_get().
322  * I suspect that the mg_get is no longer needed, but while padav
323  * differs, it can't share this function */
324
325 STATIC void
326 S_pushav(pTHX_ AV* const av)
327 {
328     dSP;
329     const SSize_t maxarg = AvFILL(av) + 1;
330     EXTEND(SP, maxarg);
331     if (UNLIKELY(SvRMAGICAL(av))) {
332         PADOFFSET i;
333         for (i=0; i < (PADOFFSET)maxarg; i++) {
334             SV ** const svp = av_fetch(av, i, FALSE);
335             /* See note in pp_helem, and bug id #27839 */
336             SP[i+1] = svp
337                 ? SvGMAGICAL(*svp) ? (mg_get(*svp), *svp) : *svp
338                 : &PL_sv_undef;
339         }
340     }
341     else {
342         PADOFFSET i;
343         for (i=0; i < (PADOFFSET)maxarg; i++) {
344             SV * const sv = AvARRAY(av)[i];
345             SP[i+1] = LIKELY(sv) ? sv : &PL_sv_undef;
346         }
347     }
348     SP += maxarg;
349     PUTBACK;
350 }
351
352
353 /* ($lex1,@lex2,...)   or my ($lex1,@lex2,...)  */
354
355 PP(pp_padrange)
356 {
357     dSP;
358     PADOFFSET base = PL_op->op_targ;
359     int count = (int)(PL_op->op_private) & OPpPADRANGE_COUNTMASK;
360     int i;
361     if (PL_op->op_flags & OPf_SPECIAL) {
362         /* fake the RHS of my ($x,$y,..) = @_ */
363         PUSHMARK(SP);
364         S_pushav(aTHX_ GvAVn(PL_defgv));
365         SPAGAIN;
366     }
367
368     /* note, this is only skipped for compile-time-known void cxt */
369     if ((PL_op->op_flags & OPf_WANT) != OPf_WANT_VOID) {
370         EXTEND(SP, count);
371         PUSHMARK(SP);
372         for (i = 0; i <count; i++)
373             *++SP = PAD_SV(base+i);
374     }
375     if (PL_op->op_private & OPpLVAL_INTRO) {
376         SV **svp = &(PAD_SVl(base));
377         const UV payload = (UV)(
378                       (base << (OPpPADRANGE_COUNTSHIFT + SAVE_TIGHT_SHIFT))
379                     | (count << SAVE_TIGHT_SHIFT)
380                     | SAVEt_CLEARPADRANGE);
381         STATIC_ASSERT_STMT(OPpPADRANGE_COUNTMASK + 1 == (1 << OPpPADRANGE_COUNTSHIFT));
382         assert((payload >> (OPpPADRANGE_COUNTSHIFT+SAVE_TIGHT_SHIFT)) == base);
383         {
384             dSS_ADD;
385             SS_ADD_UV(payload);
386             SS_ADD_END(1);
387         }
388
389         for (i = 0; i <count; i++)
390             SvPADSTALE_off(*svp++); /* mark lexical as active */
391     }
392     RETURN;
393 }
394
395
396 PP(pp_padsv)
397 {
398     dSP;
399     EXTEND(SP, 1);
400     {
401         OP * const op = PL_op;
402         /* access PL_curpad once */
403         SV ** const padentry = &(PAD_SVl(op->op_targ));
404         {
405             dTARG;
406             TARG = *padentry;
407             PUSHs(TARG);
408             PUTBACK; /* no pop/push after this, TOPs ok */
409         }
410         if (op->op_flags & OPf_MOD) {
411             if (op->op_private & OPpLVAL_INTRO)
412                 if (!(op->op_private & OPpPAD_STATE))
413                     save_clearsv(padentry);
414             if (op->op_private & OPpDEREF) {
415                 /* TOPs is equivalent to TARG here.  Using TOPs (SP) rather
416                    than TARG reduces the scope of TARG, so it does not
417                    span the call to save_clearsv, resulting in smaller
418                    machine code. */
419                 TOPs = vivify_ref(TOPs, op->op_private & OPpDEREF);
420             }
421         }
422         return op->op_next;
423     }
424 }
425
426 PP(pp_readline)
427 {
428     dSP;
429     if (TOPs) {
430         SvGETMAGIC(TOPs);
431         tryAMAGICunTARGETlist(iter_amg, 0);
432         PL_last_in_gv = MUTABLE_GV(*PL_stack_sp--);
433     }
434     else PL_last_in_gv = PL_argvgv, PL_stack_sp--;
435     if (!isGV_with_GP(PL_last_in_gv)) {
436         if (SvROK(PL_last_in_gv) && isGV_with_GP(SvRV(PL_last_in_gv)))
437             PL_last_in_gv = MUTABLE_GV(SvRV(PL_last_in_gv));
438         else {
439             dSP;
440             XPUSHs(MUTABLE_SV(PL_last_in_gv));
441             PUTBACK;
442             Perl_pp_rv2gv(aTHX);
443             PL_last_in_gv = MUTABLE_GV(*PL_stack_sp--);
444             if (PL_last_in_gv == (GV *)&PL_sv_undef)
445                 PL_last_in_gv = NULL;
446             else
447                 assert(isGV_with_GP(PL_last_in_gv));
448         }
449     }
450     return do_readline();
451 }
452
453 PP(pp_eq)
454 {
455     dSP;
456     SV *left, *right;
457
458     tryAMAGICbin_MG(eq_amg, AMGf_set|AMGf_numeric);
459     right = POPs;
460     left  = TOPs;
461     SETs(boolSV(
462         (SvIOK_notUV(left) && SvIOK_notUV(right))
463         ? (SvIVX(left) == SvIVX(right))
464         : ( do_ncmp(left, right) == 0)
465     ));
466     RETURN;
467 }
468
469
470 /* also used for: pp_i_preinc() */
471
472 PP(pp_preinc)
473 {
474     SV *sv = *PL_stack_sp;
475
476     if (LIKELY(((sv->sv_flags &
477                         (SVf_THINKFIRST|SVs_GMG|SVf_IVisUV|
478                          SVf_IOK|SVf_NOK|SVf_POK|SVp_NOK|SVp_POK|SVf_ROK))
479                 == SVf_IOK))
480         && SvIVX(sv) != IV_MAX)
481     {
482         SvIV_set(sv, SvIVX(sv) + 1);
483     }
484     else /* Do all the PERL_PRESERVE_IVUV and hard cases in sv_inc */
485         sv_inc(sv);
486     SvSETMAGIC(sv);
487     return NORMAL;
488 }
489
490
491 /* also used for: pp_i_predec() */
492
493 PP(pp_predec)
494 {
495     SV *sv = *PL_stack_sp;
496
497     if (LIKELY(((sv->sv_flags &
498                         (SVf_THINKFIRST|SVs_GMG|SVf_IVisUV|
499                          SVf_IOK|SVf_NOK|SVf_POK|SVp_NOK|SVp_POK|SVf_ROK))
500                 == SVf_IOK))
501         && SvIVX(sv) != IV_MIN)
502     {
503         SvIV_set(sv, SvIVX(sv) - 1);
504     }
505     else /* Do all the PERL_PRESERVE_IVUV and hard cases  in sv_dec */
506         sv_dec(sv);
507     SvSETMAGIC(sv);
508     return NORMAL;
509 }
510
511
512 /* also used for: pp_orassign() */
513
514 PP(pp_or)
515 {
516     dSP;
517     PERL_ASYNC_CHECK();
518     if (SvTRUE(TOPs))
519         RETURN;
520     else {
521         if (PL_op->op_type == OP_OR)
522             --SP;
523         RETURNOP(cLOGOP->op_other);
524     }
525 }
526
527
528 /* also used for: pp_dor() pp_dorassign() */
529
530 PP(pp_defined)
531 {
532     dSP;
533     SV* sv;
534     bool defined;
535     const int op_type = PL_op->op_type;
536     const bool is_dor = (op_type == OP_DOR || op_type == OP_DORASSIGN);
537
538     if (is_dor) {
539         PERL_ASYNC_CHECK();
540         sv = TOPs;
541         if (UNLIKELY(!sv || !SvANY(sv))) {
542             if (op_type == OP_DOR)
543                 --SP;
544             RETURNOP(cLOGOP->op_other);
545         }
546     }
547     else {
548         /* OP_DEFINED */
549         sv = POPs;
550         if (UNLIKELY(!sv || !SvANY(sv)))
551             RETPUSHNO;
552     }
553
554     defined = FALSE;
555     switch (SvTYPE(sv)) {
556     case SVt_PVAV:
557         if (AvMAX(sv) >= 0 || SvGMAGICAL(sv) || (SvRMAGICAL(sv) && mg_find(sv, PERL_MAGIC_tied)))
558             defined = TRUE;
559         break;
560     case SVt_PVHV:
561         if (HvARRAY(sv) || SvGMAGICAL(sv) || (SvRMAGICAL(sv) && mg_find(sv, PERL_MAGIC_tied)))
562             defined = TRUE;
563         break;
564     case SVt_PVCV:
565         if (CvROOT(sv) || CvXSUB(sv))
566             defined = TRUE;
567         break;
568     default:
569         SvGETMAGIC(sv);
570         if (SvOK(sv))
571             defined = TRUE;
572         break;
573     }
574
575     if (is_dor) {
576         if(defined) 
577             RETURN; 
578         if(op_type == OP_DOR)
579             --SP;
580         RETURNOP(cLOGOP->op_other);
581     }
582     /* assuming OP_DEFINED */
583     if(defined) 
584         RETPUSHYES;
585     RETPUSHNO;
586 }
587
588
589
590 PP(pp_add)
591 {
592     dSP; dATARGET; bool useleft; SV *svl, *svr;
593
594     tryAMAGICbin_MG(add_amg, AMGf_assign|AMGf_numeric);
595     svr = TOPs;
596     svl = TOPm1s;
597
598 #ifdef PERL_PRESERVE_IVUV
599
600     /* special-case some simple common cases */
601     if (!((svl->sv_flags|svr->sv_flags) & (SVf_IVisUV|SVs_GMG))) {
602         IV il, ir;
603         U32 flags = (svl->sv_flags & svr->sv_flags);
604         if (flags & SVf_IOK) {
605             /* both args are simple IVs */
606             UV topl, topr;
607             il = SvIVX(svl);
608             ir = SvIVX(svr);
609           do_iv:
610             topl = ((UV)il) >> (UVSIZE * 8 - 2);
611             topr = ((UV)ir) >> (UVSIZE * 8 - 2);
612
613             /* if both are in a range that can't under/overflow, do a
614              * simple integer add: if the top of both numbers
615              * are 00  or 11, then it's safe */
616             if (!( ((topl+1) | (topr+1)) & 2)) {
617                 SP--;
618                 TARGi(il + ir, 0); /* args not GMG, so can't be tainted */
619                 SETs(TARG);
620                 RETURN;
621             }
622             goto generic;
623         }
624         else if (flags & SVf_NOK) {
625             /* both args are NVs */
626             NV nl = SvNVX(svl);
627             NV nr = SvNVX(svr);
628
629             if (
630 #if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
631                 !Perl_isnan(nl) && nl == (NV)(il = (IV)nl)
632                 && !Perl_isnan(nr) && nr == (NV)(ir = (IV)nr)
633 #else
634                 nl == (NV)(il = (IV)nl) && nr == (NV)(ir = (IV)nr)
635 #endif
636                 )
637                 /* nothing was lost by converting to IVs */
638                 goto do_iv;
639             SP--;
640             TARGn(nl + nr, 0); /* args not GMG, so can't be tainted */
641             SETs(TARG);
642             RETURN;
643         }
644     }
645
646   generic:
647
648     useleft = USE_LEFT(svl);
649     /* We must see if we can perform the addition with integers if possible,
650        as the integer code detects overflow while the NV code doesn't.
651        If either argument hasn't had a numeric conversion yet attempt to get
652        the IV. It's important to do this now, rather than just assuming that
653        it's not IOK as a PV of "9223372036854775806" may not take well to NV
654        addition, and an SV which is NOK, NV=6.0 ought to be coerced to
655        integer in case the second argument is IV=9223372036854775806
656        We can (now) rely on sv_2iv to do the right thing, only setting the
657        public IOK flag if the value in the NV (or PV) slot is truly integer.
658
659        A side effect is that this also aggressively prefers integer maths over
660        fp maths for integer values.
661
662        How to detect overflow?
663
664        C 99 section 6.2.6.1 says
665
666        The range of nonnegative values of a signed integer type is a subrange
667        of the corresponding unsigned integer type, and the representation of
668        the same value in each type is the same. A computation involving
669        unsigned operands can never overflow, because a result that cannot be
670        represented by the resulting unsigned integer type is reduced modulo
671        the number that is one greater than the largest value that can be
672        represented by the resulting type.
673
674        (the 9th paragraph)
675
676        which I read as "unsigned ints wrap."
677
678        signed integer overflow seems to be classed as "exception condition"
679
680        If an exceptional condition occurs during the evaluation of an
681        expression (that is, if the result is not mathematically defined or not
682        in the range of representable values for its type), the behavior is
683        undefined.
684
685        (6.5, the 5th paragraph)
686
687        I had assumed that on 2s complement machines signed arithmetic would
688        wrap, hence coded pp_add and pp_subtract on the assumption that
689        everything perl builds on would be happy.  After much wailing and
690        gnashing of teeth it would seem that irix64 knows its ANSI spec well,
691        knows that it doesn't need to, and doesn't.  Bah.  Anyway, the all-
692        unsigned code below is actually shorter than the old code. :-)
693     */
694
695     if (SvIV_please_nomg(svr)) {
696         /* Unless the left argument is integer in range we are going to have to
697            use NV maths. Hence only attempt to coerce the right argument if
698            we know the left is integer.  */
699         UV auv = 0;
700         bool auvok = FALSE;
701         bool a_valid = 0;
702
703         if (!useleft) {
704             auv = 0;
705             a_valid = auvok = 1;
706             /* left operand is undef, treat as zero. + 0 is identity,
707                Could SETi or SETu right now, but space optimise by not adding
708                lots of code to speed up what is probably a rarish case.  */
709         } else {
710             /* Left operand is defined, so is it IV? */
711             if (SvIV_please_nomg(svl)) {
712                 if ((auvok = SvUOK(svl)))
713                     auv = SvUVX(svl);
714                 else {
715                     const IV aiv = SvIVX(svl);
716                     if (aiv >= 0) {
717                         auv = aiv;
718                         auvok = 1;      /* Now acting as a sign flag.  */
719                     } else {
720                         auv = (aiv == IV_MIN) ? (UV)aiv : (UV)(-aiv);
721                     }
722                 }
723                 a_valid = 1;
724             }
725         }
726         if (a_valid) {
727             bool result_good = 0;
728             UV result;
729             UV buv;
730             bool buvok = SvUOK(svr);
731         
732             if (buvok)
733                 buv = SvUVX(svr);
734             else {
735                 const IV biv = SvIVX(svr);
736                 if (biv >= 0) {
737                     buv = biv;
738                     buvok = 1;
739                 } else
740                     buv = (biv == IV_MIN) ? (UV)biv : (UV)(-biv);
741             }
742             /* ?uvok if value is >= 0. basically, flagged as UV if it's +ve,
743                else "IV" now, independent of how it came in.
744                if a, b represents positive, A, B negative, a maps to -A etc
745                a + b =>  (a + b)
746                A + b => -(a - b)
747                a + B =>  (a - b)
748                A + B => -(a + b)
749                all UV maths. negate result if A negative.
750                add if signs same, subtract if signs differ. */
751
752             if (auvok ^ buvok) {
753                 /* Signs differ.  */
754                 if (auv >= buv) {
755                     result = auv - buv;
756                     /* Must get smaller */
757                     if (result <= auv)
758                         result_good = 1;
759                 } else {
760                     result = buv - auv;
761                     if (result <= buv) {
762                         /* result really should be -(auv-buv). as its negation
763                            of true value, need to swap our result flag  */
764                         auvok = !auvok;
765                         result_good = 1;
766                     }
767                 }
768             } else {
769                 /* Signs same */
770                 result = auv + buv;
771                 if (result >= auv)
772                     result_good = 1;
773             }
774             if (result_good) {
775                 SP--;
776                 if (auvok)
777                     SETu( result );
778                 else {
779                     /* Negate result */
780                     if (result <= (UV)IV_MIN)
781                         SETi(result == (UV)IV_MIN
782                                 ? IV_MIN : -(IV)result);
783                     else {
784                         /* result valid, but out of range for IV.  */
785                         SETn( -(NV)result );
786                     }
787                 }
788                 RETURN;
789             } /* Overflow, drop through to NVs.  */
790         }
791     }
792
793 #else
794     useleft = USE_LEFT(svl);
795 #endif
796
797     {
798         NV value = SvNV_nomg(svr);
799         (void)POPs;
800         if (!useleft) {
801             /* left operand is undef, treat as zero. + 0.0 is identity. */
802             SETn(value);
803             RETURN;
804         }
805         SETn( value + SvNV_nomg(svl) );
806         RETURN;
807     }
808 }
809
810
811 /* also used for: pp_aelemfast_lex() */
812
813 PP(pp_aelemfast)
814 {
815     dSP;
816     AV * const av = PL_op->op_type == OP_AELEMFAST_LEX
817         ? MUTABLE_AV(PAD_SV(PL_op->op_targ)) : GvAVn(cGVOP_gv);
818     const U32 lval = PL_op->op_flags & OPf_MOD;
819     SV** const svp = av_fetch(av, (I8)PL_op->op_private, lval);
820     SV *sv = (svp ? *svp : &PL_sv_undef);
821
822     if (UNLIKELY(!svp && lval))
823         DIE(aTHX_ PL_no_aelem, (int)(I8)PL_op->op_private);
824
825     EXTEND(SP, 1);
826     if (!lval && SvRMAGICAL(av) && SvGMAGICAL(sv)) /* see note in pp_helem() */
827         mg_get(sv);
828     PUSHs(sv);
829     RETURN;
830 }
831
832 PP(pp_join)
833 {
834     dSP; dMARK; dTARGET;
835     MARK++;
836     do_join(TARG, *MARK, MARK, SP);
837     SP = MARK;
838     SETs(TARG);
839     RETURN;
840 }
841
842 PP(pp_pushre)
843 {
844     dSP;
845 #ifdef DEBUGGING
846     /*
847      * We ass_u_me that LvTARGOFF() comes first, and that two STRLENs
848      * will be enough to hold an OP*.
849      */
850     SV* const sv = sv_newmortal();
851     sv_upgrade(sv, SVt_PVLV);
852     LvTYPE(sv) = '/';
853     Copy(&PL_op, &LvTARGOFF(sv), 1, OP*);
854     XPUSHs(sv);
855 #else
856     XPUSHs(MUTABLE_SV(PL_op));
857 #endif
858     RETURN;
859 }
860
861 /* Oversized hot code. */
862
863 /* also used for: pp_say() */
864
865 PP(pp_print)
866 {
867     dSP; dMARK; dORIGMARK;
868     PerlIO *fp;
869     MAGIC *mg;
870     GV * const gv
871         = (PL_op->op_flags & OPf_STACKED) ? MUTABLE_GV(*++MARK) : PL_defoutgv;
872     IO *io = GvIO(gv);
873
874     if (io
875         && (mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar)))
876     {
877       had_magic:
878         if (MARK == ORIGMARK) {
879             /* If using default handle then we need to make space to
880              * pass object as 1st arg, so move other args up ...
881              */
882             MEXTEND(SP, 1);
883             ++MARK;
884             Move(MARK, MARK + 1, (SP - MARK) + 1, SV*);
885             ++SP;
886         }
887         return Perl_tied_method(aTHX_ SV_CONST(PRINT), mark - 1, MUTABLE_SV(io),
888                                 mg,
889                                 (G_SCALAR | TIED_METHOD_ARGUMENTS_ON_STACK
890                                  | (PL_op->op_type == OP_SAY
891                                     ? TIED_METHOD_SAY : 0)), sp - mark);
892     }
893     if (!io) {
894         if ( gv && GvEGVx(gv) && (io = GvIO(GvEGV(gv)))
895             && (mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar)))
896             goto had_magic;
897         report_evil_fh(gv);
898         SETERRNO(EBADF,RMS_IFI);
899         goto just_say_no;
900     }
901     else if (!(fp = IoOFP(io))) {
902         if (IoIFP(io))
903             report_wrongway_fh(gv, '<');
904         else
905             report_evil_fh(gv);
906         SETERRNO(EBADF,IoIFP(io)?RMS_FAC:RMS_IFI);
907         goto just_say_no;
908     }
909     else {
910         SV * const ofs = GvSV(PL_ofsgv); /* $, */
911         MARK++;
912         if (ofs && (SvGMAGICAL(ofs) || SvOK(ofs))) {
913             while (MARK <= SP) {
914                 if (!do_print(*MARK, fp))
915                     break;
916                 MARK++;
917                 if (MARK <= SP) {
918                     /* don't use 'ofs' here - it may be invalidated by magic callbacks */
919                     if (!do_print(GvSV(PL_ofsgv), fp)) {
920                         MARK--;
921                         break;
922                     }
923                 }
924             }
925         }
926         else {
927             while (MARK <= SP) {
928                 if (!do_print(*MARK, fp))
929                     break;
930                 MARK++;
931             }
932         }
933         if (MARK <= SP)
934             goto just_say_no;
935         else {
936             if (PL_op->op_type == OP_SAY) {
937                 if (PerlIO_write(fp, "\n", 1) == 0 || PerlIO_error(fp))
938                     goto just_say_no;
939             }
940             else if (PL_ors_sv && SvOK(PL_ors_sv))
941                 if (!do_print(PL_ors_sv, fp)) /* $\ */
942                     goto just_say_no;
943
944             if (IoFLAGS(io) & IOf_FLUSH)
945                 if (PerlIO_flush(fp) == EOF)
946                     goto just_say_no;
947         }
948     }
949     SP = ORIGMARK;
950     XPUSHs(&PL_sv_yes);
951     RETURN;
952
953   just_say_no:
954     SP = ORIGMARK;
955     XPUSHs(&PL_sv_undef);
956     RETURN;
957 }
958
959
960 /* also used for: pp_rv2hv() */
961 /* also called directly by pp_lvavref */
962
963 PP(pp_rv2av)
964 {
965     dSP; dTOPss;
966     const U8 gimme = GIMME_V;
967     static const char an_array[] = "an ARRAY";
968     static const char a_hash[] = "a HASH";
969     const bool is_pp_rv2av = PL_op->op_type == OP_RV2AV
970                           || PL_op->op_type == OP_LVAVREF;
971     const svtype type = is_pp_rv2av ? SVt_PVAV : SVt_PVHV;
972
973     SvGETMAGIC(sv);
974     if (SvROK(sv)) {
975         if (UNLIKELY(SvAMAGIC(sv))) {
976             sv = amagic_deref_call(sv, is_pp_rv2av ? to_av_amg : to_hv_amg);
977         }
978         sv = SvRV(sv);
979         if (UNLIKELY(SvTYPE(sv) != type))
980             /* diag_listed_as: Not an ARRAY reference */
981             DIE(aTHX_ "Not %s reference", is_pp_rv2av ? an_array : a_hash);
982         else if (UNLIKELY(PL_op->op_flags & OPf_MOD
983                 && PL_op->op_private & OPpLVAL_INTRO))
984             Perl_croak(aTHX_ "%s", PL_no_localize_ref);
985     }
986     else if (UNLIKELY(SvTYPE(sv) != type)) {
987             GV *gv;
988         
989             if (!isGV_with_GP(sv)) {
990                 gv = Perl_softref2xv(aTHX_ sv, is_pp_rv2av ? an_array : a_hash,
991                                      type, &sp);
992                 if (!gv)
993                     RETURN;
994             }
995             else {
996                 gv = MUTABLE_GV(sv);
997             }
998             sv = is_pp_rv2av ? MUTABLE_SV(GvAVn(gv)) : MUTABLE_SV(GvHVn(gv));
999             if (PL_op->op_private & OPpLVAL_INTRO)
1000                 sv = is_pp_rv2av ? MUTABLE_SV(save_ary(gv)) : MUTABLE_SV(save_hash(gv));
1001     }
1002     if (PL_op->op_flags & OPf_REF) {
1003                 SETs(sv);
1004                 RETURN;
1005     }
1006     else if (UNLIKELY(PL_op->op_private & OPpMAYBE_LVSUB)) {
1007               const I32 flags = is_lvalue_sub();
1008               if (flags && !(flags & OPpENTERSUB_INARGS)) {
1009                 if (gimme != G_ARRAY)
1010                     goto croak_cant_return;
1011                 SETs(sv);
1012                 RETURN;
1013               }
1014     }
1015
1016     if (is_pp_rv2av) {
1017         AV *const av = MUTABLE_AV(sv);
1018         /* The guts of pp_rv2av  */
1019         if (gimme == G_ARRAY) {
1020             SP--;
1021             PUTBACK;
1022             S_pushav(aTHX_ av);
1023             SPAGAIN;
1024         }
1025         else if (gimme == G_SCALAR) {
1026             dTARGET;
1027             const SSize_t maxarg = AvFILL(av) + 1;
1028             SETi(maxarg);
1029         }
1030     } else {
1031         /* The guts of pp_rv2hv  */
1032         if (gimme == G_ARRAY) { /* array wanted */
1033             *PL_stack_sp = sv;
1034             return Perl_do_kv(aTHX);
1035         }
1036         else if ((PL_op->op_private & OPpTRUEBOOL
1037               || (  PL_op->op_private & OPpMAYBE_TRUEBOOL
1038                  && block_gimme() == G_VOID  ))
1039               && (!SvRMAGICAL(sv) || !mg_find(sv, PERL_MAGIC_tied)))
1040             SETs(HvUSEDKEYS(sv) ? &PL_sv_yes : sv_2mortal(newSViv(0)));
1041         else if (gimme == G_SCALAR) {
1042             dTARG;
1043             TARG = Perl_hv_scalar(aTHX_ MUTABLE_HV(sv));
1044             SETTARG;
1045         }
1046     }
1047     RETURN;
1048
1049  croak_cant_return:
1050     Perl_croak(aTHX_ "Can't return %s to lvalue scalar context",
1051                is_pp_rv2av ? "array" : "hash");
1052     RETURN;
1053 }
1054
1055 STATIC void
1056 S_do_oddball(pTHX_ SV **oddkey, SV **firstkey)
1057 {
1058     PERL_ARGS_ASSERT_DO_ODDBALL;
1059
1060     if (*oddkey) {
1061         if (ckWARN(WARN_MISC)) {
1062             const char *err;
1063             if (oddkey == firstkey &&
1064                 SvROK(*oddkey) &&
1065                 (SvTYPE(SvRV(*oddkey)) == SVt_PVAV ||
1066                  SvTYPE(SvRV(*oddkey)) == SVt_PVHV))
1067             {
1068                 err = "Reference found where even-sized list expected";
1069             }
1070             else
1071                 err = "Odd number of elements in hash assignment";
1072             Perl_warner(aTHX_ packWARN(WARN_MISC), "%s", err);
1073         }
1074
1075     }
1076 }
1077
1078
1079 /* Do a mark and sweep with the SVf_BREAK flag to detect elements which
1080  * are common to both the LHS and RHS of an aassign, and replace them
1081  * with copies. All these copies are made before the actual list assign is
1082  * done.
1083  *
1084  * For example in ($a,$b) = ($b,$a), assigning the value of the first RHS
1085  * element ($b) to the first LH element ($a), modifies $a; when the
1086  * second assignment is done, the second RH element now has the wrong
1087  * value. So we initially replace the RHS with ($b, mortalcopy($a)).
1088  * Note that we don't need to make a mortal copy of $b.
1089  *
1090  * The algorithm below works by, for every RHS element, mark the
1091  * corresponding LHS target element with SVf_BREAK. Then if the RHS
1092  * element is found with SVf_BREAK set, it means it would have been
1093  * modified, so make a copy.
1094  * Note that by scanning both LHS and RHS in lockstep, we avoid
1095  * unnecessary copies (like $b above) compared with a naive
1096  * "mark all LHS; copy all marked RHS; unmark all LHS".
1097  *
1098  * If the LHS element is a 'my' declaration' and has a refcount of 1, then
1099  * it can't be common and can be skipped.
1100  *
1101  * On DEBUGGING builds it takes an extra boolean, fake. If true, it means
1102  * that we thought we didn't need to call S_aassign_copy_common(), but we
1103  * have anyway for sanity checking. If we find we need to copy, then panic.
1104  */
1105
1106 PERL_STATIC_INLINE void
1107 S_aassign_copy_common(pTHX_ SV **firstlelem, SV **lastlelem,
1108         SV **firstrelem, SV **lastrelem
1109 #ifdef DEBUGGING
1110         , bool fake
1111 #endif
1112 )
1113 {
1114     dVAR;
1115     SV **relem;
1116     SV **lelem;
1117     SSize_t lcount = lastlelem - firstlelem + 1;
1118     bool marked = FALSE; /* have we marked any LHS with SVf_BREAK ? */
1119     bool const do_rc1 = cBOOL(PL_op->op_private & OPpASSIGN_COMMON_RC1);
1120     bool copy_all = FALSE;
1121
1122     assert(!PL_in_clean_all); /* SVf_BREAK not already in use */
1123     assert(firstlelem < lastlelem); /* at least 2 LH elements */
1124     assert(firstrelem < lastrelem); /* at least 2 RH elements */
1125
1126
1127     lelem = firstlelem;
1128     /* we never have to copy the first RH element; it can't be corrupted
1129      * by assigning something to the corresponding first LH element.
1130      * So this scan does in a loop: mark LHS[N]; test RHS[N+1]
1131      */
1132     relem = firstrelem + 1;
1133
1134     for (; relem <= lastrelem; relem++) {
1135         SV *svr;
1136
1137         /* mark next LH element */
1138
1139         if (--lcount >= 0) {
1140             SV *svl = *lelem++;
1141
1142             if (UNLIKELY(!svl)) {/* skip AV alias marker */
1143                 assert (lelem <= lastlelem);
1144                 svl = *lelem++;
1145                 lcount--;
1146             }
1147
1148             assert(svl);
1149             if (SvSMAGICAL(svl)) {
1150                 copy_all = TRUE;
1151             }
1152             if (SvTYPE(svl) == SVt_PVAV || SvTYPE(svl) == SVt_PVHV) {
1153                 if (!marked)
1154                     return;
1155                 /* this LH element will consume all further args;
1156                  * no need to mark any further LH elements (if any).
1157                  * But we still need to scan any remaining RHS elements;
1158                  * set lcount negative to distinguish from  lcount == 0,
1159                  * so the loop condition continues being true
1160                  */
1161                 lcount = -1;
1162                 lelem--; /* no need to unmark this element */
1163             }
1164             else if (!(do_rc1 && SvREFCNT(svl) == 1) && svl != &PL_sv_undef) {
1165                 assert(!SvIMMORTAL(svl));
1166                 SvFLAGS(svl) |= SVf_BREAK;
1167                 marked = TRUE;
1168             }
1169             else if (!marked) {
1170                 /* don't check RH element if no SVf_BREAK flags set yet */
1171                 if (!lcount)
1172                     break;
1173                 continue;
1174             }
1175         }
1176
1177         /* see if corresponding RH element needs copying */
1178
1179         assert(marked);
1180         svr = *relem;
1181         assert(svr);
1182
1183         if (UNLIKELY(SvFLAGS(svr) & (SVf_BREAK|SVs_GMG) || copy_all)) {
1184
1185 #ifdef DEBUGGING
1186             if (fake) {
1187                 /* op_dump(PL_op); */
1188                 Perl_croak(aTHX_
1189                     "panic: aassign skipped needed copy of common RH elem %"
1190                         UVuf, (UV)(relem - firstrelem));
1191             }
1192 #endif
1193
1194             TAINT_NOT;  /* Each item is independent */
1195
1196             /* Dear TODO test in t/op/sort.t, I love you.
1197                (It's relying on a panic, not a "semi-panic" from newSVsv()
1198                and then an assertion failure below.)  */
1199             if (UNLIKELY(SvIS_FREED(svr))) {
1200                 Perl_croak(aTHX_ "panic: attempt to copy freed scalar %p",
1201                            (void*)svr);
1202             }
1203             /* avoid break flag while copying; otherwise COW etc
1204              * disabled... */
1205             SvFLAGS(svr) &= ~SVf_BREAK;
1206             /* Not newSVsv(), as it does not allow copy-on-write,
1207                resulting in wasteful copies.
1208                Also, we use SV_NOSTEAL in case the SV is used more than
1209                once, e.g.  (...) = (f())[0,0]
1210                Where the same SV appears twice on the RHS without a ref
1211                count bump.  (Although I suspect that the SV won't be
1212                stealable here anyway - DAPM).
1213                */
1214             *relem = sv_mortalcopy_flags(svr,
1215                                 SV_GMAGIC|SV_DO_COW_SVSETSV|SV_NOSTEAL);
1216             /* ... but restore afterwards in case it's needed again,
1217              * e.g. ($a,$b,$c) = (1,$a,$a)
1218              */
1219             SvFLAGS(svr) |= SVf_BREAK;
1220         }
1221
1222         if (!lcount)
1223             break;
1224     }
1225
1226     if (!marked)
1227         return;
1228
1229     /*unmark LHS */
1230
1231     while (lelem > firstlelem) {
1232         SV * const svl = *(--lelem);
1233         if (svl)
1234             SvFLAGS(svl) &= ~SVf_BREAK;
1235     }
1236 }
1237
1238
1239
1240 PP(pp_aassign)
1241 {
1242     dVAR; dSP;
1243     SV **lastlelem = PL_stack_sp;
1244     SV **lastrelem = PL_stack_base + POPMARK;
1245     SV **firstrelem = PL_stack_base + POPMARK + 1;
1246     SV **firstlelem = lastrelem + 1;
1247
1248     SV **relem;
1249     SV **lelem;
1250
1251     SV *sv;
1252     AV *ary;
1253
1254     U8 gimme;
1255     HV *hash;
1256     SSize_t i;
1257     int magic;
1258     U32 lval;
1259     /* PL_delaymagic is restored by JUMPENV_POP on dieing, so we
1260      * only need to save locally, not on the save stack */
1261     U16 old_delaymagic = PL_delaymagic;
1262 #ifdef DEBUGGING
1263     bool fake = 0;
1264 #endif
1265
1266     PL_delaymagic = DM_DELAY;           /* catch simultaneous items */
1267
1268     /* If there's a common identifier on both sides we have to take
1269      * special care that assigning the identifier on the left doesn't
1270      * clobber a value on the right that's used later in the list.
1271      */
1272
1273     /* at least 2 LH and RH elements, or commonality isn't an issue */
1274     if (firstlelem < lastlelem && firstrelem < lastrelem) {
1275         for (relem = firstrelem+1; relem <= lastrelem; relem++) {
1276             if (SvGMAGICAL(*relem))
1277                 goto do_scan;
1278         }
1279         for (lelem = firstlelem; lelem <= lastlelem; lelem++) {
1280             if (*lelem && SvSMAGICAL(*lelem))
1281                 goto do_scan;
1282         }
1283         if ( PL_op->op_private & (OPpASSIGN_COMMON_SCALAR|OPpASSIGN_COMMON_RC1) ) {
1284             if (PL_op->op_private & OPpASSIGN_COMMON_RC1) {
1285                 /* skip the scan if all scalars have a ref count of 1 */
1286                 for (lelem = firstlelem; lelem <= lastlelem; lelem++) {
1287                     sv = *lelem;
1288                     if (!sv || SvREFCNT(sv) == 1)
1289                         continue;
1290                     if (SvTYPE(sv) != SVt_PVAV && SvTYPE(sv) != SVt_PVAV)
1291                         goto do_scan;
1292                     break;
1293                 }
1294             }
1295             else {
1296             do_scan:
1297                 S_aassign_copy_common(aTHX_
1298                                       firstlelem, lastlelem, firstrelem, lastrelem
1299 #ifdef DEBUGGING
1300                     , fake
1301 #endif
1302                 );
1303             }
1304         }
1305     }
1306 #ifdef DEBUGGING
1307     else {
1308         /* on debugging builds, do the scan even if we've concluded we
1309          * don't need to, then panic if we find commonality. Note that the
1310          * scanner assumes at least 2 elements */
1311         if (firstlelem < lastlelem && firstrelem < lastrelem) {
1312             fake = 1;
1313             goto do_scan;
1314         }
1315     }
1316 #endif
1317
1318     gimme = GIMME_V;
1319     lval = (gimme == G_ARRAY) ? (PL_op->op_flags & OPf_MOD || LVRET) : 0;
1320
1321     relem = firstrelem;
1322     lelem = firstlelem;
1323     ary = NULL;
1324     hash = NULL;
1325
1326     while (LIKELY(lelem <= lastlelem)) {
1327         bool alias = FALSE;
1328         TAINT_NOT;              /* Each item stands on its own, taintwise. */
1329         sv = *lelem++;
1330         if (UNLIKELY(!sv)) {
1331             alias = TRUE;
1332             sv = *lelem++;
1333             ASSUME(SvTYPE(sv) == SVt_PVAV);
1334         }
1335         switch (SvTYPE(sv)) {
1336         case SVt_PVAV: {
1337             bool already_copied = FALSE;
1338             ary = MUTABLE_AV(sv);
1339             magic = SvMAGICAL(ary) != 0;
1340             ENTER;
1341             SAVEFREESV(SvREFCNT_inc_simple_NN(sv));
1342
1343             /* We need to clear ary. The is a danger that if we do this,
1344              * elements on the RHS may be prematurely freed, e.g.
1345              *   @a = ($a[0]);
1346              * In the case of possible commonality, make a copy of each
1347              * RHS SV *before* clearing the array, and add a reference
1348              * from the tmps stack, so that it doesn't leak on death.
1349              * Otherwise, make a copy of each RHS SV only as we're storing
1350              * it into the array - that way we don't have to worry about
1351              * it being leaked if we die, but don't incur the cost of
1352              * mortalising everything.
1353              */
1354
1355             if (   (PL_op->op_private & OPpASSIGN_COMMON_AGG)
1356                 && (relem <= lastrelem)
1357                 && (magic || AvFILL(ary) != -1))
1358             {
1359                 SV **svp;
1360                 EXTEND_MORTAL(lastrelem - relem + 1);
1361                 for (svp = relem; svp <= lastrelem; svp++) {
1362                     /* see comment in S_aassign_copy_common about SV_NOSTEAL */
1363                     *svp = sv_mortalcopy_flags(*svp,
1364                             SV_GMAGIC|SV_DO_COW_SVSETSV|SV_NOSTEAL);
1365                     TAINT_NOT;
1366                 }
1367                 already_copied = TRUE;
1368             }
1369
1370             av_clear(ary);
1371             if (relem <= lastrelem)
1372                 av_extend(ary, lastrelem - relem);
1373
1374             i = 0;
1375             while (relem <= lastrelem) {        /* gobble up all the rest */
1376                 SV **didstore;
1377                 if (LIKELY(!alias)) {
1378                     if (already_copied)
1379                         sv = *relem;
1380                     else {
1381                         if (LIKELY(*relem))
1382                             /* before newSV, in case it dies */
1383                             SvGETMAGIC(*relem);
1384                         sv = newSV(0);
1385                         /* see comment in S_aassign_copy_common about
1386                          * SV_NOSTEAL */
1387                         sv_setsv_flags(sv, *relem,
1388                                     (SV_DO_COW_SVSETSV|SV_NOSTEAL));
1389                         *relem = sv;
1390                     }
1391                 }
1392                 else {
1393                     if (!already_copied)
1394                         SvGETMAGIC(*relem);
1395                     if (!SvROK(*relem))
1396                         DIE(aTHX_ "Assigned value is not a reference");
1397                     if (SvTYPE(SvRV(*relem)) > SVt_PVLV)
1398                    /* diag_listed_as: Assigned value is not %s reference */
1399                         DIE(aTHX_
1400                            "Assigned value is not a SCALAR reference");
1401                     if (lval && !already_copied)
1402                         *relem = sv_mortalcopy(*relem);
1403                     /* XXX else check for weak refs?  */
1404                     sv = SvREFCNT_inc_NN(SvRV(*relem));
1405                 }
1406                 relem++;
1407                 if (already_copied)
1408                     SvREFCNT_inc_simple_void_NN(sv); /* undo mortal free */
1409                 didstore = av_store(ary,i++,sv);
1410                 if (magic) {
1411                     if (!didstore)
1412                         sv_2mortal(sv);
1413                     if (SvSMAGICAL(sv))
1414                         mg_set(sv);
1415                 }
1416                 TAINT_NOT;
1417             }
1418             if (UNLIKELY(PL_delaymagic & DM_ARRAY_ISA))
1419                 SvSETMAGIC(MUTABLE_SV(ary));
1420             LEAVE;
1421             break;
1422         }
1423
1424         case SVt_PVHV: {                                /* normal hash */
1425                 SV *tmpstr;
1426                 int odd;
1427                 int duplicates = 0;
1428                 SV** topelem = relem;
1429                 SV **firsthashrelem = relem;
1430                 bool already_copied = FALSE;
1431
1432                 hash = MUTABLE_HV(sv);
1433                 magic = SvMAGICAL(hash) != 0;
1434
1435                 odd = ((lastrelem - firsthashrelem)&1)? 0 : 1;
1436                 if (UNLIKELY(odd)) {
1437                     do_oddball(lastrelem, firsthashrelem);
1438                     /* we have firstlelem to reuse, it's not needed anymore
1439                      */
1440                     *(lastrelem+1) = &PL_sv_undef;
1441                 }
1442
1443                 ENTER;
1444                 SAVEFREESV(SvREFCNT_inc_simple_NN(sv));
1445
1446                 /* We need to clear hash. The is a danger that if we do this,
1447                  * elements on the RHS may be prematurely freed, e.g.
1448                  *   %h = (foo => $h{bar});
1449                  * In the case of possible commonality, make a copy of each
1450                  * RHS SV *before* clearing the hash, and add a reference
1451                  * from the tmps stack, so that it doesn't leak on death.
1452                  */
1453
1454                 if (   (PL_op->op_private & OPpASSIGN_COMMON_AGG)
1455                     && (relem <= lastrelem)
1456                     && (magic || HvUSEDKEYS(hash)))
1457                 {
1458                     SV **svp;
1459                     EXTEND_MORTAL(lastrelem - relem + 1);
1460                     for (svp = relem; svp <= lastrelem; svp++) {
1461                         *svp = sv_mortalcopy_flags(*svp,
1462                                 SV_GMAGIC|SV_DO_COW_SVSETSV|SV_NOSTEAL);
1463                         TAINT_NOT;
1464                     }
1465                     already_copied = TRUE;
1466                 }
1467
1468                 hv_clear(hash);
1469
1470                 while (LIKELY(relem < lastrelem+odd)) { /* gobble up all the rest */
1471                     HE *didstore;
1472                     assert(*relem);
1473                     /* Copy the key if aassign is called in lvalue context,
1474                        to avoid having the next op modify our rhs.  Copy
1475                        it also if it is gmagical, lest it make the
1476                        hv_store_ent call below croak, leaking the value. */
1477                     sv = (lval || SvGMAGICAL(*relem)) && !already_copied
1478                          ? sv_mortalcopy(*relem)
1479                          : *relem;
1480                     relem++;
1481                     assert(*relem);
1482                     if (already_copied)
1483                         tmpstr = *relem++;
1484                     else {
1485                         SvGETMAGIC(*relem);
1486                         tmpstr = newSV(0);
1487                         sv_setsv_nomg(tmpstr,*relem++); /* value */
1488                     }
1489
1490                     if (gimme == G_ARRAY) {
1491                         if (hv_exists_ent(hash, sv, 0))
1492                             /* key overwrites an existing entry */
1493                             duplicates += 2;
1494                         else {
1495                             /* copy element back: possibly to an earlier
1496                              * stack location if we encountered dups earlier,
1497                              * possibly to a later stack location if odd */
1498                             *topelem++ = sv;
1499                             *topelem++ = tmpstr;
1500                         }
1501                     }
1502                     if (already_copied)
1503                         SvREFCNT_inc_simple_void_NN(tmpstr); /* undo mortal free */
1504                     didstore = hv_store_ent(hash,sv,tmpstr,0);
1505                     if (magic) {
1506                         if (!didstore) sv_2mortal(tmpstr);
1507                         SvSETMAGIC(tmpstr);
1508                     }
1509                     TAINT_NOT;
1510                 }
1511                 LEAVE;
1512                 if (duplicates && gimme == G_ARRAY) {
1513                     /* at this point we have removed the duplicate key/value
1514                      * pairs from the stack, but the remaining values may be
1515                      * wrong; i.e. with (a 1 a 2 b 3) on the stack we've removed
1516                      * the (a 2), but the stack now probably contains
1517                      * (a <freed> b 3), because { hv_save(a,1); hv_save(a,2) }
1518                      * obliterates the earlier key. So refresh all values. */
1519                     lastrelem -= duplicates;
1520                     relem = firsthashrelem;
1521                     while (relem < lastrelem+odd) {
1522                         HE *he;
1523                         he = hv_fetch_ent(hash, *relem++, 0, 0);
1524                         *relem++ = (he ? HeVAL(he) : &PL_sv_undef);
1525                     }
1526                 }
1527                 if (odd && gimme == G_ARRAY) lastrelem++;
1528             }
1529             break;
1530         default:
1531             if (SvIMMORTAL(sv)) {
1532                 if (relem <= lastrelem)
1533                     relem++;
1534                 break;
1535             }
1536             if (relem <= lastrelem) {
1537                 if (UNLIKELY(
1538                   SvTEMP(sv) && !SvSMAGICAL(sv) && SvREFCNT(sv) == 1 &&
1539                   (!isGV_with_GP(sv) || SvFAKE(sv)) && ckWARN(WARN_MISC)
1540                 ))
1541                     Perl_warner(aTHX_
1542                        packWARN(WARN_MISC),
1543                       "Useless assignment to a temporary"
1544                     );
1545                 sv_setsv(sv, *relem);
1546                 *(relem++) = sv;
1547             }
1548             else
1549                 sv_setsv(sv, &PL_sv_undef);
1550             SvSETMAGIC(sv);
1551             break;
1552         }
1553     }
1554     if (UNLIKELY(PL_delaymagic & ~DM_DELAY)) {
1555         /* Will be used to set PL_tainting below */
1556         Uid_t tmp_uid  = PerlProc_getuid();
1557         Uid_t tmp_euid = PerlProc_geteuid();
1558         Gid_t tmp_gid  = PerlProc_getgid();
1559         Gid_t tmp_egid = PerlProc_getegid();
1560
1561         /* XXX $> et al currently silently ignore failures */
1562         if (PL_delaymagic & DM_UID) {
1563 #ifdef HAS_SETRESUID
1564             PERL_UNUSED_RESULT(
1565                setresuid((PL_delaymagic & DM_RUID) ? PL_delaymagic_uid  : (Uid_t)-1,
1566                          (PL_delaymagic & DM_EUID) ? PL_delaymagic_euid : (Uid_t)-1,
1567                          (Uid_t)-1));
1568 #else
1569 #  ifdef HAS_SETREUID
1570             PERL_UNUSED_RESULT(
1571                 setreuid((PL_delaymagic & DM_RUID) ? PL_delaymagic_uid  : (Uid_t)-1,
1572                          (PL_delaymagic & DM_EUID) ? PL_delaymagic_euid : (Uid_t)-1));
1573 #  else
1574 #    ifdef HAS_SETRUID
1575             if ((PL_delaymagic & DM_UID) == DM_RUID) {
1576                 PERL_UNUSED_RESULT(setruid(PL_delaymagic_uid));
1577                 PL_delaymagic &= ~DM_RUID;
1578             }
1579 #    endif /* HAS_SETRUID */
1580 #    ifdef HAS_SETEUID
1581             if ((PL_delaymagic & DM_UID) == DM_EUID) {
1582                 PERL_UNUSED_RESULT(seteuid(PL_delaymagic_euid));
1583                 PL_delaymagic &= ~DM_EUID;
1584             }
1585 #    endif /* HAS_SETEUID */
1586             if (PL_delaymagic & DM_UID) {
1587                 if (PL_delaymagic_uid != PL_delaymagic_euid)
1588                     DIE(aTHX_ "No setreuid available");
1589                 PERL_UNUSED_RESULT(PerlProc_setuid(PL_delaymagic_uid));
1590             }
1591 #  endif /* HAS_SETREUID */
1592 #endif /* HAS_SETRESUID */
1593
1594             tmp_uid  = PerlProc_getuid();
1595             tmp_euid = PerlProc_geteuid();
1596         }
1597         /* XXX $> et al currently silently ignore failures */
1598         if (PL_delaymagic & DM_GID) {
1599 #ifdef HAS_SETRESGID
1600             PERL_UNUSED_RESULT(
1601                 setresgid((PL_delaymagic & DM_RGID) ? PL_delaymagic_gid  : (Gid_t)-1,
1602                           (PL_delaymagic & DM_EGID) ? PL_delaymagic_egid : (Gid_t)-1,
1603                           (Gid_t)-1));
1604 #else
1605 #  ifdef HAS_SETREGID
1606             PERL_UNUSED_RESULT(
1607                 setregid((PL_delaymagic & DM_RGID) ? PL_delaymagic_gid  : (Gid_t)-1,
1608                          (PL_delaymagic & DM_EGID) ? PL_delaymagic_egid : (Gid_t)-1));
1609 #  else
1610 #    ifdef HAS_SETRGID
1611             if ((PL_delaymagic & DM_GID) == DM_RGID) {
1612                 PERL_UNUSED_RESULT(setrgid(PL_delaymagic_gid));
1613                 PL_delaymagic &= ~DM_RGID;
1614             }
1615 #    endif /* HAS_SETRGID */
1616 #    ifdef HAS_SETEGID
1617             if ((PL_delaymagic & DM_GID) == DM_EGID) {
1618                 PERL_UNUSED_RESULT(setegid(PL_delaymagic_egid));
1619                 PL_delaymagic &= ~DM_EGID;
1620             }
1621 #    endif /* HAS_SETEGID */
1622             if (PL_delaymagic & DM_GID) {
1623                 if (PL_delaymagic_gid != PL_delaymagic_egid)
1624                     DIE(aTHX_ "No setregid available");
1625                 PERL_UNUSED_RESULT(PerlProc_setgid(PL_delaymagic_gid));
1626             }
1627 #  endif /* HAS_SETREGID */
1628 #endif /* HAS_SETRESGID */
1629
1630             tmp_gid  = PerlProc_getgid();
1631             tmp_egid = PerlProc_getegid();
1632         }
1633         TAINTING_set( TAINTING_get | (tmp_uid && (tmp_euid != tmp_uid || tmp_egid != tmp_gid)) );
1634 #ifdef NO_TAINT_SUPPORT
1635         PERL_UNUSED_VAR(tmp_uid);
1636         PERL_UNUSED_VAR(tmp_euid);
1637         PERL_UNUSED_VAR(tmp_gid);
1638         PERL_UNUSED_VAR(tmp_egid);
1639 #endif
1640     }
1641     PL_delaymagic = old_delaymagic;
1642
1643     if (gimme == G_VOID)
1644         SP = firstrelem - 1;
1645     else if (gimme == G_SCALAR) {
1646         dTARGET;
1647         SP = firstrelem;
1648         SETi(lastrelem - firstrelem + 1);
1649     }
1650     else {
1651         if (ary || hash)
1652             /* note that in this case *firstlelem may have been overwritten
1653                by sv_undef in the odd hash case */
1654             SP = lastrelem;
1655         else {
1656             SP = firstrelem + (lastlelem - firstlelem);
1657             lelem = firstlelem + (relem - firstrelem);
1658             while (relem <= SP)
1659                 *relem++ = (lelem <= lastlelem) ? *lelem++ : &PL_sv_undef;
1660         }
1661     }
1662
1663     RETURN;
1664 }
1665
1666 PP(pp_qr)
1667 {
1668     dSP;
1669     PMOP * const pm = cPMOP;
1670     REGEXP * rx = PM_GETRE(pm);
1671     SV * const pkg = rx ? CALLREG_PACKAGE(rx) : NULL;
1672     SV * const rv = sv_newmortal();
1673     CV **cvp;
1674     CV *cv;
1675
1676     SvUPGRADE(rv, SVt_IV);
1677     /* For a subroutine describing itself as "This is a hacky workaround" I'm
1678        loathe to use it here, but it seems to be the right fix. Or close.
1679        The key part appears to be that it's essential for pp_qr to return a new
1680        object (SV), which implies that there needs to be an effective way to
1681        generate a new SV from the existing SV that is pre-compiled in the
1682        optree.  */
1683     SvRV_set(rv, MUTABLE_SV(reg_temp_copy(NULL, rx)));
1684     SvROK_on(rv);
1685
1686     cvp = &( ReANY((REGEXP *)SvRV(rv))->qr_anoncv);
1687     if (UNLIKELY((cv = *cvp) && CvCLONE(*cvp))) {
1688         *cvp = cv_clone(cv);
1689         SvREFCNT_dec_NN(cv);
1690     }
1691
1692     if (pkg) {
1693         HV *const stash = gv_stashsv(pkg, GV_ADD);
1694         SvREFCNT_dec_NN(pkg);
1695         (void)sv_bless(rv, stash);
1696     }
1697
1698     if (UNLIKELY(RX_ISTAINTED(rx))) {
1699         SvTAINTED_on(rv);
1700         SvTAINTED_on(SvRV(rv));
1701     }
1702     XPUSHs(rv);
1703     RETURN;
1704 }
1705
1706 PP(pp_match)
1707 {
1708     dSP; dTARG;
1709     PMOP *pm = cPMOP;
1710     PMOP *dynpm = pm;
1711     const char *s;
1712     const char *strend;
1713     SSize_t curpos = 0; /* initial pos() or current $+[0] */
1714     I32 global;
1715     U8 r_flags = 0;
1716     const char *truebase;                       /* Start of string  */
1717     REGEXP *rx = PM_GETRE(pm);
1718     bool rxtainted;
1719     const U8 gimme = GIMME_V;
1720     STRLEN len;
1721     const I32 oldsave = PL_savestack_ix;
1722     I32 had_zerolen = 0;
1723     MAGIC *mg = NULL;
1724
1725     if (PL_op->op_flags & OPf_STACKED)
1726         TARG = POPs;
1727     else if (ARGTARG)
1728         GETTARGET;
1729     else {
1730         TARG = DEFSV;
1731         EXTEND(SP,1);
1732     }
1733
1734     PUTBACK;                            /* EVAL blocks need stack_sp. */
1735     /* Skip get-magic if this is a qr// clone, because regcomp has
1736        already done it. */
1737     truebase = ReANY(rx)->mother_re
1738          ? SvPV_nomg_const(TARG, len)
1739          : SvPV_const(TARG, len);
1740     if (!truebase)
1741         DIE(aTHX_ "panic: pp_match");
1742     strend = truebase + len;
1743     rxtainted = (RX_ISTAINTED(rx) ||
1744                  (TAINT_get && (pm->op_pmflags & PMf_RETAINT)));
1745     TAINT_NOT;
1746
1747     /* We need to know this in case we fail out early - pos() must be reset */
1748     global = dynpm->op_pmflags & PMf_GLOBAL;
1749
1750     /* PMdf_USED is set after a ?? matches once */
1751     if (
1752 #ifdef USE_ITHREADS
1753         SvREADONLY(PL_regex_pad[pm->op_pmoffset])
1754 #else
1755         pm->op_pmflags & PMf_USED
1756 #endif
1757     ) {
1758         DEBUG_r(PerlIO_printf(Perl_debug_log, "?? already matched once"));
1759         goto nope;
1760     }
1761
1762     /* empty pattern special-cased to use last successful pattern if
1763        possible, except for qr// */
1764     if (!ReANY(rx)->mother_re && !RX_PRELEN(rx)
1765      && PL_curpm) {
1766         pm = PL_curpm;
1767         rx = PM_GETRE(pm);
1768     }
1769
1770     if (RX_MINLEN(rx) >= 0 && (STRLEN)RX_MINLEN(rx) > len) {
1771         DEBUG_r(PerlIO_printf(Perl_debug_log, "String shorter than min possible regex match (%"
1772                                               UVuf" < %"IVdf")\n",
1773                                               (UV)len, (IV)RX_MINLEN(rx)));
1774         goto nope;
1775     }
1776
1777     /* get pos() if //g */
1778     if (global) {
1779         mg = mg_find_mglob(TARG);
1780         if (mg && mg->mg_len >= 0) {
1781             curpos = MgBYTEPOS(mg, TARG, truebase, len);
1782             /* last time pos() was set, it was zero-length match */
1783             if (mg->mg_flags & MGf_MINMATCH)
1784                 had_zerolen = 1;
1785         }
1786     }
1787
1788 #ifdef PERL_SAWAMPERSAND
1789     if (       RX_NPARENS(rx)
1790             || PL_sawampersand
1791             || (RX_EXTFLAGS(rx) & (RXf_EVAL_SEEN|RXf_PMf_KEEPCOPY))
1792             || (dynpm->op_pmflags & PMf_KEEPCOPY)
1793     )
1794 #endif
1795     {
1796         r_flags |= (REXEC_COPY_STR|REXEC_COPY_SKIP_PRE);
1797         /* in @a =~ /(.)/g, we iterate multiple times, but copy the buffer
1798          * only on the first iteration. Therefore we need to copy $' as well
1799          * as $&, to make the rest of the string available for captures in
1800          * subsequent iterations */
1801         if (! (global && gimme == G_ARRAY))
1802             r_flags |= REXEC_COPY_SKIP_POST;
1803     };
1804 #ifdef PERL_SAWAMPERSAND
1805     if (dynpm->op_pmflags & PMf_KEEPCOPY)
1806         /* handle KEEPCOPY in pmop but not rx, eg $r=qr/a/; /$r/p */
1807         r_flags &= ~(REXEC_COPY_SKIP_PRE|REXEC_COPY_SKIP_POST);
1808 #endif
1809
1810     s = truebase;
1811
1812   play_it_again:
1813     if (global)
1814         s = truebase + curpos;
1815
1816     if (!CALLREGEXEC(rx, (char*)s, (char *)strend, (char*)truebase,
1817                      had_zerolen, TARG, NULL, r_flags))
1818         goto nope;
1819
1820     PL_curpm = pm;
1821     if (dynpm->op_pmflags & PMf_ONCE)
1822 #ifdef USE_ITHREADS
1823         SvREADONLY_on(PL_regex_pad[dynpm->op_pmoffset]);
1824 #else
1825         dynpm->op_pmflags |= PMf_USED;
1826 #endif
1827
1828     if (rxtainted)
1829         RX_MATCH_TAINTED_on(rx);
1830     TAINT_IF(RX_MATCH_TAINTED(rx));
1831
1832     /* update pos */
1833
1834     if (global && (gimme != G_ARRAY || (dynpm->op_pmflags & PMf_CONTINUE))) {
1835         if (!mg)
1836             mg = sv_magicext_mglob(TARG);
1837         MgBYTEPOS_set(mg, TARG, truebase, RX_OFFS(rx)[0].end);
1838         if (RX_ZERO_LEN(rx))
1839             mg->mg_flags |= MGf_MINMATCH;
1840         else
1841             mg->mg_flags &= ~MGf_MINMATCH;
1842     }
1843
1844     if ((!RX_NPARENS(rx) && !global) || gimme != G_ARRAY) {
1845         LEAVE_SCOPE(oldsave);
1846         RETPUSHYES;
1847     }
1848
1849     /* push captures on stack */
1850
1851     {
1852         const I32 nparens = RX_NPARENS(rx);
1853         I32 i = (global && !nparens) ? 1 : 0;
1854
1855         SPAGAIN;                        /* EVAL blocks could move the stack. */
1856         EXTEND(SP, nparens + i);
1857         EXTEND_MORTAL(nparens + i);
1858         for (i = !i; i <= nparens; i++) {
1859             PUSHs(sv_newmortal());
1860             if (LIKELY((RX_OFFS(rx)[i].start != -1)
1861                      && RX_OFFS(rx)[i].end   != -1 ))
1862             {
1863                 const I32 len = RX_OFFS(rx)[i].end - RX_OFFS(rx)[i].start;
1864                 const char * const s = RX_OFFS(rx)[i].start + truebase;
1865                 if (UNLIKELY(RX_OFFS(rx)[i].end < 0 || RX_OFFS(rx)[i].start < 0
1866                         || len < 0 || len > strend - s))
1867                     DIE(aTHX_ "panic: pp_match start/end pointers, i=%ld, "
1868                         "start=%ld, end=%ld, s=%p, strend=%p, len=%"UVuf,
1869                         (long) i, (long) RX_OFFS(rx)[i].start,
1870                         (long)RX_OFFS(rx)[i].end, s, strend, (UV) len);
1871                 sv_setpvn(*SP, s, len);
1872                 if (DO_UTF8(TARG) && is_utf8_string((U8*)s, len))
1873                     SvUTF8_on(*SP);
1874             }
1875         }
1876         if (global) {
1877             curpos = (UV)RX_OFFS(rx)[0].end;
1878             had_zerolen = RX_ZERO_LEN(rx);
1879             PUTBACK;                    /* EVAL blocks may use stack */
1880             r_flags |= REXEC_IGNOREPOS | REXEC_NOT_FIRST;
1881             goto play_it_again;
1882         }
1883         LEAVE_SCOPE(oldsave);
1884         RETURN;
1885     }
1886     NOT_REACHED; /* NOTREACHED */
1887
1888   nope:
1889     if (global && !(dynpm->op_pmflags & PMf_CONTINUE)) {
1890         if (!mg)
1891             mg = mg_find_mglob(TARG);
1892         if (mg)
1893             mg->mg_len = -1;
1894     }
1895     LEAVE_SCOPE(oldsave);
1896     if (gimme == G_ARRAY)
1897         RETURN;
1898     RETPUSHNO;
1899 }
1900
1901 OP *
1902 Perl_do_readline(pTHX)
1903 {
1904     dSP; dTARGETSTACKED;
1905     SV *sv;
1906     STRLEN tmplen = 0;
1907     STRLEN offset;
1908     PerlIO *fp;
1909     IO * const io = GvIO(PL_last_in_gv);
1910     const I32 type = PL_op->op_type;
1911     const U8 gimme = GIMME_V;
1912
1913     if (io) {
1914         const MAGIC *const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1915         if (mg) {
1916             Perl_tied_method(aTHX_ SV_CONST(READLINE), SP, MUTABLE_SV(io), mg, gimme, 0);
1917             if (gimme == G_SCALAR) {
1918                 SPAGAIN;
1919                 SvSetSV_nosteal(TARG, TOPs);
1920                 SETTARG;
1921             }
1922             return NORMAL;
1923         }
1924     }
1925     fp = NULL;
1926     if (io) {
1927         fp = IoIFP(io);
1928         if (!fp) {
1929             if (IoFLAGS(io) & IOf_ARGV) {
1930                 if (IoFLAGS(io) & IOf_START) {
1931                     IoLINES(io) = 0;
1932                     if (av_tindex(GvAVn(PL_last_in_gv)) < 0) {
1933                         IoFLAGS(io) &= ~IOf_START;
1934                         do_open6(PL_last_in_gv, "-", 1, NULL, NULL, 0);
1935                         SvTAINTED_off(GvSVn(PL_last_in_gv)); /* previous tainting irrelevant */
1936                         sv_setpvs(GvSVn(PL_last_in_gv), "-");
1937                         SvSETMAGIC(GvSV(PL_last_in_gv));
1938                         fp = IoIFP(io);
1939                         goto have_fp;
1940                     }
1941                 }
1942                 fp = nextargv(PL_last_in_gv, PL_op->op_flags & OPf_SPECIAL);
1943                 if (!fp) { /* Note: fp != IoIFP(io) */
1944                     (void)do_close(PL_last_in_gv, FALSE); /* now it does*/
1945                 }
1946             }
1947             else if (type == OP_GLOB)
1948                 fp = Perl_start_glob(aTHX_ POPs, io);
1949         }
1950         else if (type == OP_GLOB)
1951             SP--;
1952         else if (IoTYPE(io) == IoTYPE_WRONLY) {
1953             report_wrongway_fh(PL_last_in_gv, '>');
1954         }
1955     }
1956     if (!fp) {
1957         if ((!io || !(IoFLAGS(io) & IOf_START))
1958             && ckWARN(WARN_CLOSED)
1959             && type != OP_GLOB)
1960         {
1961             report_evil_fh(PL_last_in_gv);
1962         }
1963         if (gimme == G_SCALAR) {
1964             /* undef TARG, and push that undefined value */
1965             if (type != OP_RCATLINE) {
1966                 sv_setsv(TARG,NULL);
1967             }
1968             PUSHTARG;
1969         }
1970         RETURN;
1971     }
1972   have_fp:
1973     if (gimme == G_SCALAR) {
1974         sv = TARG;
1975         if (type == OP_RCATLINE && SvGMAGICAL(sv))
1976             mg_get(sv);
1977         if (SvROK(sv)) {
1978             if (type == OP_RCATLINE)
1979                 SvPV_force_nomg_nolen(sv);
1980             else
1981                 sv_unref(sv);
1982         }
1983         else if (isGV_with_GP(sv)) {
1984             SvPV_force_nomg_nolen(sv);
1985         }
1986         SvUPGRADE(sv, SVt_PV);
1987         tmplen = SvLEN(sv);     /* remember if already alloced */
1988         if (!tmplen && !SvREADONLY(sv) && !SvIsCOW(sv)) {
1989             /* try short-buffering it. Please update t/op/readline.t
1990              * if you change the growth length.
1991              */
1992             Sv_Grow(sv, 80);
1993         }
1994         offset = 0;
1995         if (type == OP_RCATLINE && SvOK(sv)) {
1996             if (!SvPOK(sv)) {
1997                 SvPV_force_nomg_nolen(sv);
1998             }
1999             offset = SvCUR(sv);
2000         }
2001     }
2002     else {
2003         sv = sv_2mortal(newSV(80));
2004         offset = 0;
2005     }
2006
2007     /* This should not be marked tainted if the fp is marked clean */
2008 #define MAYBE_TAINT_LINE(io, sv) \
2009     if (!(IoFLAGS(io) & IOf_UNTAINT)) { \
2010         TAINT;                          \
2011         SvTAINTED_on(sv);               \
2012     }
2013
2014 /* delay EOF state for a snarfed empty file */
2015 #define SNARF_EOF(gimme,rs,io,sv) \
2016     (gimme != G_SCALAR || SvCUR(sv)                                     \
2017      || (IoFLAGS(io) & IOf_NOLINE) || !RsSNARF(rs))
2018
2019     for (;;) {
2020         PUTBACK;
2021         if (!sv_gets(sv, fp, offset)
2022             && (type == OP_GLOB
2023                 || SNARF_EOF(gimme, PL_rs, io, sv)
2024                 || PerlIO_error(fp)))
2025         {
2026             PerlIO_clearerr(fp);
2027             if (IoFLAGS(io) & IOf_ARGV) {
2028                 fp = nextargv(PL_last_in_gv, PL_op->op_flags & OPf_SPECIAL);
2029                 if (fp)
2030                     continue;
2031                 (void)do_close(PL_last_in_gv, FALSE);
2032             }
2033             else if (type == OP_GLOB) {
2034                 if (!do_close(PL_last_in_gv, FALSE)) {
2035                     Perl_ck_warner(aTHX_ packWARN(WARN_GLOB),
2036                                    "glob failed (child exited with status %d%s)",
2037                                    (int)(STATUS_CURRENT >> 8),
2038                                    (STATUS_CURRENT & 0x80) ? ", core dumped" : "");
2039                 }
2040             }
2041             if (gimme == G_SCALAR) {
2042                 if (type != OP_RCATLINE) {
2043                     SV_CHECK_THINKFIRST_COW_DROP(TARG);
2044                     SvOK_off(TARG);
2045                 }
2046                 SPAGAIN;
2047                 PUSHTARG;
2048             }
2049             MAYBE_TAINT_LINE(io, sv);
2050             RETURN;
2051         }
2052         MAYBE_TAINT_LINE(io, sv);
2053         IoLINES(io)++;
2054         IoFLAGS(io) |= IOf_NOLINE;
2055         SvSETMAGIC(sv);
2056         SPAGAIN;
2057         XPUSHs(sv);
2058         if (type == OP_GLOB) {
2059             const char *t1;
2060             Stat_t statbuf;
2061
2062             if (SvCUR(sv) > 0 && SvCUR(PL_rs) > 0) {
2063                 char * const tmps = SvEND(sv) - 1;
2064                 if (*tmps == *SvPVX_const(PL_rs)) {
2065                     *tmps = '\0';
2066                     SvCUR_set(sv, SvCUR(sv) - 1);
2067                 }
2068             }
2069             for (t1 = SvPVX_const(sv); *t1; t1++)
2070 #ifdef __VMS
2071                 if (strchr("*%?", *t1))
2072 #else
2073                 if (strchr("$&*(){}[]'\";\\|?<>~`", *t1))
2074 #endif
2075                         break;
2076             if (*t1 && PerlLIO_lstat(SvPVX_const(sv), &statbuf) < 0) {
2077                 (void)POPs;             /* Unmatched wildcard?  Chuck it... */
2078                 continue;
2079             }
2080         } else if (SvUTF8(sv)) { /* OP_READLINE, OP_RCATLINE */
2081              if (ckWARN(WARN_UTF8)) {
2082                 const U8 * const s = (const U8*)SvPVX_const(sv) + offset;
2083                 const STRLEN len = SvCUR(sv) - offset;
2084                 const U8 *f;
2085
2086                 if (!is_utf8_string_loc(s, len, &f))
2087                     /* Emulate :encoding(utf8) warning in the same case. */
2088                     Perl_warner(aTHX_ packWARN(WARN_UTF8),
2089                                 "utf8 \"\\x%02X\" does not map to Unicode",
2090                                 f < (U8*)SvEND(sv) ? *f : 0);
2091              }
2092         }
2093         if (gimme == G_ARRAY) {
2094             if (SvLEN(sv) - SvCUR(sv) > 20) {
2095                 SvPV_shrink_to_cur(sv);
2096             }
2097             sv = sv_2mortal(newSV(80));
2098             continue;
2099         }
2100         else if (gimme == G_SCALAR && !tmplen && SvLEN(sv) - SvCUR(sv) > 80) {
2101             /* try to reclaim a bit of scalar space (only on 1st alloc) */
2102             const STRLEN new_len
2103                 = SvCUR(sv) < 60 ? 80 : SvCUR(sv)+40; /* allow some slop */
2104             SvPV_renew(sv, new_len);
2105         }
2106         RETURN;
2107     }
2108 }
2109
2110 PP(pp_helem)
2111 {
2112     dSP;
2113     HE* he;
2114     SV **svp;
2115     SV * const keysv = POPs;
2116     HV * const hv = MUTABLE_HV(POPs);
2117     const U32 lval = PL_op->op_flags & OPf_MOD || LVRET;
2118     const U32 defer = PL_op->op_private & OPpLVAL_DEFER;
2119     SV *sv;
2120     const bool localizing = PL_op->op_private & OPpLVAL_INTRO;
2121     bool preeminent = TRUE;
2122
2123     if (SvTYPE(hv) != SVt_PVHV)
2124         RETPUSHUNDEF;
2125
2126     if (localizing) {
2127         MAGIC *mg;
2128         HV *stash;
2129
2130         /* If we can determine whether the element exist,
2131          * Try to preserve the existenceness of a tied hash
2132          * element by using EXISTS and DELETE if possible.
2133          * Fallback to FETCH and STORE otherwise. */
2134         if (SvCANEXISTDELETE(hv))
2135             preeminent = hv_exists_ent(hv, keysv, 0);
2136     }
2137
2138     he = hv_fetch_ent(hv, keysv, lval && !defer, 0);
2139     svp = he ? &HeVAL(he) : NULL;
2140     if (lval) {
2141         if (!svp || !*svp || *svp == &PL_sv_undef) {
2142             SV* lv;
2143             SV* key2;
2144             if (!defer) {
2145                 DIE(aTHX_ PL_no_helem_sv, SVfARG(keysv));
2146             }
2147             lv = sv_newmortal();
2148             sv_upgrade(lv, SVt_PVLV);
2149             LvTYPE(lv) = 'y';
2150             sv_magic(lv, key2 = newSVsv(keysv), PERL_MAGIC_defelem, NULL, 0);
2151             SvREFCNT_dec_NN(key2);      /* sv_magic() increments refcount */
2152             LvTARG(lv) = SvREFCNT_inc_simple_NN(hv);
2153             LvTARGLEN(lv) = 1;
2154             PUSHs(lv);
2155             RETURN;
2156         }
2157         if (localizing) {
2158             if (HvNAME_get(hv) && isGV(*svp))
2159                 save_gp(MUTABLE_GV(*svp), !(PL_op->op_flags & OPf_SPECIAL));
2160             else if (preeminent)
2161                 save_helem_flags(hv, keysv, svp,
2162                      (PL_op->op_flags & OPf_SPECIAL) ? 0 : SAVEf_SETMAGIC);
2163             else
2164                 SAVEHDELETE(hv, keysv);
2165         }
2166         else if (PL_op->op_private & OPpDEREF) {
2167             PUSHs(vivify_ref(*svp, PL_op->op_private & OPpDEREF));
2168             RETURN;
2169         }
2170     }
2171     sv = (svp && *svp ? *svp : &PL_sv_undef);
2172     /* Originally this did a conditional C<sv = sv_mortalcopy(sv)>; this
2173      * was to make C<local $tied{foo} = $tied{foo}> possible.
2174      * However, it seems no longer to be needed for that purpose, and
2175      * introduced a new bug: stuff like C<while ($hash{taintedval} =~ /.../g>
2176      * would loop endlessly since the pos magic is getting set on the
2177      * mortal copy and lost. However, the copy has the effect of
2178      * triggering the get magic, and losing it altogether made things like
2179      * c<$tied{foo};> in void context no longer do get magic, which some
2180      * code relied on. Also, delayed triggering of magic on @+ and friends
2181      * meant the original regex may be out of scope by now. So as a
2182      * compromise, do the get magic here. (The MGf_GSKIP flag will stop it
2183      * being called too many times). */
2184     if (!lval && SvRMAGICAL(hv) && SvGMAGICAL(sv))
2185         mg_get(sv);
2186     PUSHs(sv);
2187     RETURN;
2188 }
2189
2190
2191 /* a stripped-down version of Perl_softref2xv() for use by
2192  * pp_multideref(), which doesn't use PL_op->op_flags */
2193
2194 STATIC GV *
2195 S_softref2xv_lite(pTHX_ SV *const sv, const char *const what,
2196                 const svtype type)
2197 {
2198     if (PL_op->op_private & HINT_STRICT_REFS) {
2199         if (SvOK(sv))
2200             Perl_die(aTHX_ PL_no_symref_sv, sv,
2201                      (SvPOKp(sv) && SvCUR(sv)>32 ? "..." : ""), what);
2202         else
2203             Perl_die(aTHX_ PL_no_usym, what);
2204     }
2205     if (!SvOK(sv))
2206         Perl_die(aTHX_ PL_no_usym, what);
2207     return gv_fetchsv_nomg(sv, GV_ADD, type);
2208 }
2209
2210
2211 /* Handle one or more aggregate derefs and array/hash indexings, e.g.
2212  * $h->{foo}  or  $a[0]{$key}[$i]  or  f()->[1]
2213  *
2214  * op_aux points to an array of unions of UV / IV / SV* / PADOFFSET.
2215  * Each of these either contains a set of actions, or an argument, such as
2216  * an IV to use as an array index, or a lexical var to retrieve.
2217  * Several actions re stored per UV; we keep shifting new actions off the
2218  * one UV, and only reload when it becomes zero.
2219  */
2220
2221 PP(pp_multideref)
2222 {
2223     SV *sv = NULL; /* init to avoid spurious 'may be used uninitialized' */
2224     UNOP_AUX_item *items = cUNOP_AUXx(PL_op)->op_aux;
2225     UV actions = items->uv;
2226
2227     assert(actions);
2228     /* this tells find_uninit_var() where we're up to */
2229     PL_multideref_pc = items;
2230
2231     while (1) {
2232         /* there are three main classes of action; the first retrieve
2233          * the initial AV or HV from a variable or the stack; the second
2234          * does the equivalent of an unrolled (/DREFAV, rv2av, aelem),
2235          * the third an unrolled (/DREFHV, rv2hv, helem).
2236          */
2237         switch (actions & MDEREF_ACTION_MASK) {
2238
2239         case MDEREF_reload:
2240             actions = (++items)->uv;
2241             continue;
2242
2243         case MDEREF_AV_padav_aelem:                 /* $lex[...] */
2244             sv = PAD_SVl((++items)->pad_offset);
2245             goto do_AV_aelem;
2246
2247         case MDEREF_AV_gvav_aelem:                  /* $pkg[...] */
2248             sv = UNOP_AUX_item_sv(++items);
2249             assert(isGV_with_GP(sv));
2250             sv = (SV*)GvAVn((GV*)sv);
2251             goto do_AV_aelem;
2252
2253         case MDEREF_AV_pop_rv2av_aelem:             /* expr->[...] */
2254             {
2255                 dSP;
2256                 sv = POPs;
2257                 PUTBACK;
2258                 goto do_AV_rv2av_aelem;
2259             }
2260
2261         case MDEREF_AV_gvsv_vivify_rv2av_aelem:     /* $pkg->[...] */
2262             sv = UNOP_AUX_item_sv(++items);
2263             assert(isGV_with_GP(sv));
2264             sv = GvSVn((GV*)sv);
2265             goto do_AV_vivify_rv2av_aelem;
2266
2267         case MDEREF_AV_padsv_vivify_rv2av_aelem:     /* $lex->[...] */
2268             sv = PAD_SVl((++items)->pad_offset);
2269             /* FALLTHROUGH */
2270
2271         do_AV_vivify_rv2av_aelem:
2272         case MDEREF_AV_vivify_rv2av_aelem:           /* vivify, ->[...] */
2273             /* this is the OPpDEREF action normally found at the end of
2274              * ops like aelem, helem, rv2sv */
2275             sv = vivify_ref(sv, OPpDEREF_AV);
2276             /* FALLTHROUGH */
2277
2278         do_AV_rv2av_aelem:
2279             /* this is basically a copy of pp_rv2av when it just has the
2280              * sKR/1 flags */
2281             SvGETMAGIC(sv);
2282             if (LIKELY(SvROK(sv))) {
2283                 if (UNLIKELY(SvAMAGIC(sv))) {
2284                     sv = amagic_deref_call(sv, to_av_amg);
2285                 }
2286                 sv = SvRV(sv);
2287                 if (UNLIKELY(SvTYPE(sv) != SVt_PVAV))
2288                     DIE(aTHX_ "Not an ARRAY reference");
2289             }
2290             else if (SvTYPE(sv) != SVt_PVAV) {
2291                 if (!isGV_with_GP(sv))
2292                     sv = (SV*)S_softref2xv_lite(aTHX_ sv, "an ARRAY", SVt_PVAV);
2293                 sv = MUTABLE_SV(GvAVn((GV*)sv));
2294             }
2295             /* FALLTHROUGH */
2296
2297         do_AV_aelem:
2298             {
2299                 /* retrieve the key; this may be either a lexical or package
2300                  * var (whose index/ptr is stored as an item) or a signed
2301                  * integer constant stored as an item.
2302                  */
2303                 SV *elemsv;
2304                 IV elem = 0; /* to shut up stupid compiler warnings */
2305
2306
2307                 assert(SvTYPE(sv) == SVt_PVAV);
2308
2309                 switch (actions & MDEREF_INDEX_MASK) {
2310                 case MDEREF_INDEX_none:
2311                     goto finish;
2312                 case MDEREF_INDEX_const:
2313                     elem  = (++items)->iv;
2314                     break;
2315                 case MDEREF_INDEX_padsv:
2316                     elemsv = PAD_SVl((++items)->pad_offset);
2317                     goto check_elem;
2318                 case MDEREF_INDEX_gvsv:
2319                     elemsv = UNOP_AUX_item_sv(++items);
2320                     assert(isGV_with_GP(elemsv));
2321                     elemsv = GvSVn((GV*)elemsv);
2322                 check_elem:
2323                     if (UNLIKELY(SvROK(elemsv) && !SvGAMAGIC(elemsv)
2324                                             && ckWARN(WARN_MISC)))
2325                         Perl_warner(aTHX_ packWARN(WARN_MISC),
2326                                 "Use of reference \"%"SVf"\" as array index",
2327                                 SVfARG(elemsv));
2328                     /* the only time that S_find_uninit_var() needs this
2329                      * is to determine which index value triggered the
2330                      * undef warning. So just update it here. Note that
2331                      * since we don't save and restore this var (e.g. for
2332                      * tie or overload execution), its value will be
2333                      * meaningless apart from just here */
2334                     PL_multideref_pc = items;
2335                     elem = SvIV(elemsv);
2336                     break;
2337                 }
2338
2339
2340                 /* this is basically a copy of pp_aelem with OPpDEREF skipped */
2341
2342                 if (!(actions & MDEREF_FLAG_last)) {
2343                     SV** svp = av_fetch((AV*)sv, elem, 1);
2344                     if (!svp || ! (sv=*svp))
2345                         DIE(aTHX_ PL_no_aelem, elem);
2346                     break;
2347                 }
2348
2349                 if (PL_op->op_private &
2350                     (OPpMULTIDEREF_EXISTS|OPpMULTIDEREF_DELETE))
2351                 {
2352                     if (PL_op->op_private & OPpMULTIDEREF_EXISTS) {
2353                         sv = av_exists((AV*)sv, elem) ? &PL_sv_yes : &PL_sv_no;
2354                     }
2355                     else {
2356                         I32 discard = (GIMME_V == G_VOID) ? G_DISCARD : 0;
2357                         sv = av_delete((AV*)sv, elem, discard);
2358                         if (discard)
2359                             return NORMAL;
2360                         if (!sv)
2361                             sv = &PL_sv_undef;
2362                     }
2363                 }
2364                 else {
2365                     const U32 lval = PL_op->op_flags & OPf_MOD || LVRET;
2366                     const U32 defer = PL_op->op_private & OPpLVAL_DEFER;
2367                     const bool localizing = PL_op->op_private & OPpLVAL_INTRO;
2368                     bool preeminent = TRUE;
2369                     AV *const av = (AV*)sv;
2370                     SV** svp;
2371
2372                     if (UNLIKELY(localizing)) {
2373                         MAGIC *mg;
2374                         HV *stash;
2375
2376                         /* If we can determine whether the element exist,
2377                          * Try to preserve the existenceness of a tied array
2378                          * element by using EXISTS and DELETE if possible.
2379                          * Fallback to FETCH and STORE otherwise. */
2380                         if (SvCANEXISTDELETE(av))
2381                             preeminent = av_exists(av, elem);
2382                     }
2383
2384                     svp = av_fetch(av, elem, lval && !defer);
2385
2386                     if (lval) {
2387                         if (!svp || !(sv = *svp)) {
2388                             IV len;
2389                             if (!defer)
2390                                 DIE(aTHX_ PL_no_aelem, elem);
2391                             len = av_tindex(av);
2392                             sv = sv_2mortal(newSVavdefelem(av,
2393                             /* Resolve a negative index now, unless it points
2394                              * before the beginning of the array, in which
2395                              * case record it for error reporting in
2396                              * magic_setdefelem. */
2397                                 elem < 0 && len + elem >= 0
2398                                     ? len + elem : elem, 1));
2399                         }
2400                         else {
2401                             if (UNLIKELY(localizing)) {
2402                                 if (preeminent) {
2403                                     save_aelem(av, elem, svp);
2404                                     sv = *svp; /* may have changed */
2405                                 }
2406                                 else
2407                                     SAVEADELETE(av, elem);
2408                             }
2409                         }
2410                     }
2411                     else {
2412                         sv = (svp ? *svp : &PL_sv_undef);
2413                         /* see note in pp_helem() */
2414                         if (SvRMAGICAL(av) && SvGMAGICAL(sv))
2415                             mg_get(sv);
2416                     }
2417                 }
2418
2419             }
2420           finish:
2421             {
2422                 dSP;
2423                 XPUSHs(sv);
2424                 RETURN;
2425             }
2426             /* NOTREACHED */
2427
2428
2429
2430
2431         case MDEREF_HV_padhv_helem:                 /* $lex{...} */
2432             sv = PAD_SVl((++items)->pad_offset);
2433             goto do_HV_helem;
2434
2435         case MDEREF_HV_gvhv_helem:                  /* $pkg{...} */
2436             sv = UNOP_AUX_item_sv(++items);
2437             assert(isGV_with_GP(sv));
2438             sv = (SV*)GvHVn((GV*)sv);
2439             goto do_HV_helem;
2440
2441         case MDEREF_HV_pop_rv2hv_helem:             /* expr->{...} */
2442             {
2443                 dSP;
2444                 sv = POPs;
2445                 PUTBACK;
2446                 goto do_HV_rv2hv_helem;
2447             }
2448
2449         case MDEREF_HV_gvsv_vivify_rv2hv_helem:     /* $pkg->{...} */
2450             sv = UNOP_AUX_item_sv(++items);
2451             assert(isGV_with_GP(sv));
2452             sv = GvSVn((GV*)sv);
2453             goto do_HV_vivify_rv2hv_helem;
2454
2455         case MDEREF_HV_padsv_vivify_rv2hv_helem:    /* $lex->{...} */
2456             sv = PAD_SVl((++items)->pad_offset);
2457             /* FALLTHROUGH */
2458
2459         do_HV_vivify_rv2hv_helem:
2460         case MDEREF_HV_vivify_rv2hv_helem:           /* vivify, ->{...} */
2461             /* this is the OPpDEREF action normally found at the end of
2462              * ops like aelem, helem, rv2sv */
2463             sv = vivify_ref(sv, OPpDEREF_HV);
2464             /* FALLTHROUGH */
2465
2466         do_HV_rv2hv_helem:
2467             /* this is basically a copy of pp_rv2hv when it just has the
2468              * sKR/1 flags (and pp_rv2hv is aliased to pp_rv2av) */
2469
2470             SvGETMAGIC(sv);
2471             if (LIKELY(SvROK(sv))) {
2472                 if (UNLIKELY(SvAMAGIC(sv))) {
2473                     sv = amagic_deref_call(sv, to_hv_amg);
2474                 }
2475                 sv = SvRV(sv);
2476                 if (UNLIKELY(SvTYPE(sv) != SVt_PVHV))
2477                     DIE(aTHX_ "Not a HASH reference");
2478             }
2479             else if (SvTYPE(sv) != SVt_PVHV) {
2480                 if (!isGV_with_GP(sv))
2481                     sv = (SV*)S_softref2xv_lite(aTHX_ sv, "a HASH", SVt_PVHV);
2482                 sv = MUTABLE_SV(GvHVn((GV*)sv));
2483             }
2484             /* FALLTHROUGH */
2485
2486         do_HV_helem:
2487             {
2488                 /* retrieve the key; this may be either a lexical / package
2489                  * var or a string constant, whose index/ptr is stored as an
2490                  * item
2491                  */
2492                 SV *keysv = NULL; /* to shut up stupid compiler warnings */
2493
2494                 assert(SvTYPE(sv) == SVt_PVHV);
2495
2496                 switch (actions & MDEREF_INDEX_MASK) {
2497                 case MDEREF_INDEX_none:
2498                     goto finish;
2499
2500                 case MDEREF_INDEX_const:
2501                     keysv = UNOP_AUX_item_sv(++items);
2502                     break;
2503
2504                 case MDEREF_INDEX_padsv:
2505                     keysv = PAD_SVl((++items)->pad_offset);
2506                     break;
2507
2508                 case MDEREF_INDEX_gvsv:
2509                     keysv = UNOP_AUX_item_sv(++items);
2510                     keysv = GvSVn((GV*)keysv);
2511                     break;
2512                 }
2513
2514                 /* see comment above about setting this var */
2515                 PL_multideref_pc = items;
2516
2517
2518                 /* ensure that candidate CONSTs have been HEKified */
2519                 assert(   ((actions & MDEREF_INDEX_MASK) != MDEREF_INDEX_const)
2520                        || SvTYPE(keysv) >= SVt_PVMG
2521                        || !SvOK(keysv)
2522                        || SvROK(keysv)
2523                        || SvIsCOW_shared_hash(keysv));
2524
2525                 /* this is basically a copy of pp_helem with OPpDEREF skipped */
2526
2527                 if (!(actions & MDEREF_FLAG_last)) {
2528                     HE *he = hv_fetch_ent((HV*)sv, keysv, 1, 0);
2529                     if (!he || !(sv=HeVAL(he)) || sv == &PL_sv_undef)
2530                         DIE(aTHX_ PL_no_helem_sv, SVfARG(keysv));
2531                     break;
2532                 }
2533
2534                 if (PL_op->op_private &
2535                     (OPpMULTIDEREF_EXISTS|OPpMULTIDEREF_DELETE))
2536                 {
2537                     if (PL_op->op_private & OPpMULTIDEREF_EXISTS) {
2538                         sv = hv_exists_ent((HV*)sv, keysv, 0)
2539                                                 ? &PL_sv_yes : &PL_sv_no;
2540                     }
2541                     else {
2542                         I32 discard = (GIMME_V == G_VOID) ? G_DISCARD : 0;
2543                         sv = hv_delete_ent((HV*)sv, keysv, discard, 0);
2544                         if (discard)
2545                             return NORMAL;
2546                         if (!sv)
2547                             sv = &PL_sv_undef;
2548                     }
2549                 }
2550                 else {
2551                     const U32 lval = PL_op->op_flags & OPf_MOD || LVRET;
2552                     const U32 defer = PL_op->op_private & OPpLVAL_DEFER;
2553                     const bool localizing = PL_op->op_private & OPpLVAL_INTRO;
2554                     bool preeminent = TRUE;
2555                     SV **svp;
2556                     HV * const hv = (HV*)sv;
2557                     HE* he;
2558
2559                     if (UNLIKELY(localizing)) {
2560                         MAGIC *mg;
2561                         HV *stash;
2562
2563                         /* If we can determine whether the element exist,
2564                          * Try to preserve the existenceness of a tied hash
2565                          * element by using EXISTS and DELETE if possible.
2566                          * Fallback to FETCH and STORE otherwise. */
2567                         if (SvCANEXISTDELETE(hv))
2568                             preeminent = hv_exists_ent(hv, keysv, 0);
2569                     }
2570
2571                     he = hv_fetch_ent(hv, keysv, lval && !defer, 0);
2572                     svp = he ? &HeVAL(he) : NULL;
2573
2574
2575                     if (lval) {
2576                         if (!svp || !(sv = *svp) || sv == &PL_sv_undef) {
2577                             SV* lv;
2578                             SV* key2;
2579                             if (!defer)
2580                                 DIE(aTHX_ PL_no_helem_sv, SVfARG(keysv));
2581                             lv = sv_newmortal();
2582                             sv_upgrade(lv, SVt_PVLV);
2583                             LvTYPE(lv) = 'y';
2584                             sv_magic(lv, key2 = newSVsv(keysv),
2585                                                 PERL_MAGIC_defelem, NULL, 0);
2586                             /* sv_magic() increments refcount */
2587                             SvREFCNT_dec_NN(key2);
2588                             LvTARG(lv) = SvREFCNT_inc_simple_NN(hv);
2589                             LvTARGLEN(lv) = 1;
2590                             sv = lv;
2591                         }
2592                         else {
2593                             if (localizing) {
2594                                 if (HvNAME_get(hv) && isGV(sv))
2595                                     save_gp(MUTABLE_GV(sv),
2596                                         !(PL_op->op_flags & OPf_SPECIAL));
2597                                 else if (preeminent) {
2598                                     save_helem_flags(hv, keysv, svp,
2599                                          (PL_op->op_flags & OPf_SPECIAL)
2600                                             ? 0 : SAVEf_SETMAGIC);
2601                                     sv = *svp; /* may have changed */
2602                                 }
2603                                 else
2604                                     SAVEHDELETE(hv, keysv);
2605                             }
2606                         }
2607                     }
2608                     else {
2609                         sv = (svp && *svp ? *svp : &PL_sv_undef);
2610                         /* see note in pp_helem() */
2611                         if (SvRMAGICAL(hv) && SvGMAGICAL(sv))
2612                             mg_get(sv);
2613                     }
2614                 }
2615                 goto finish;
2616             }
2617
2618         } /* switch */
2619
2620         actions >>= MDEREF_SHIFT;
2621     } /* while */
2622     /* NOTREACHED */
2623 }
2624
2625
2626 PP(pp_iter)
2627 {
2628     PERL_CONTEXT *cx;
2629     SV *oldsv;
2630     SV **itersvp;
2631     SV *retsv;
2632
2633     SV *sv;
2634     AV *av;
2635     IV ix;
2636     IV inc;
2637
2638     cx = CX_CUR();
2639     itersvp = CxITERVAR(cx);
2640     assert(itersvp);
2641
2642     switch (CxTYPE(cx)) {
2643
2644     case CXt_LOOP_LAZYSV: /* string increment */
2645     {
2646         SV* cur = cx->blk_loop.state_u.lazysv.cur;
2647         SV *end = cx->blk_loop.state_u.lazysv.end;
2648         /* If the maximum is !SvOK(), pp_enteriter substitutes PL_sv_no.
2649            It has SvPVX of "" and SvCUR of 0, which is what we want.  */
2650         STRLEN maxlen = 0;
2651         const char *max = SvPV_const(end, maxlen);
2652         if (UNLIKELY(SvNIOK(cur) || SvCUR(cur) > maxlen))
2653             goto retno;
2654
2655         oldsv = *itersvp;
2656         /* NB: on the first iteration, oldsv will have a ref count of at
2657          * least 2 (one extra from blk_loop.itersave), so the GV or pad
2658          * slot will get localised; on subsequent iterations the RC==1
2659          * optimisation may kick in and the SV will be reused. */
2660          if (oldsv && LIKELY(SvREFCNT(oldsv) == 1 && !SvMAGICAL(oldsv))) {
2661             /* safe to reuse old SV */
2662             sv_setsv(oldsv, cur);
2663         }
2664         else
2665         {
2666             /* we need a fresh SV every time so that loop body sees a
2667              * completely new SV for closures/references to work as
2668              * they used to */
2669             *itersvp = newSVsv(cur);
2670             SvREFCNT_dec(oldsv);
2671         }
2672         if (strEQ(SvPVX_const(cur), max))
2673             sv_setiv(cur, 0); /* terminate next time */
2674         else
2675             sv_inc(cur);
2676         break;
2677     }
2678
2679     case CXt_LOOP_LAZYIV: /* integer increment */
2680     {
2681         IV cur = cx->blk_loop.state_u.lazyiv.cur;
2682         if (UNLIKELY(cur > cx->blk_loop.state_u.lazyiv.end))
2683             goto retno;
2684
2685         oldsv = *itersvp;
2686         /* see NB comment above */
2687         if (oldsv && LIKELY(SvREFCNT(oldsv) == 1 && !SvMAGICAL(oldsv))) {
2688             /* safe to reuse old SV */
2689
2690             if (    (SvFLAGS(oldsv) & (SVTYPEMASK|SVf_THINKFIRST|SVf_IVisUV))
2691                  == SVt_IV)
2692             {
2693                 /* Cheap SvIOK_only().
2694                  * Assert that flags which SvIOK_only() would test or
2695                  * clear can't be set, because we're SVt_IV */
2696                 assert(!(SvFLAGS(oldsv) &
2697                     (SVf_OOK|SVf_UTF8|(SVf_OK & ~(SVf_IOK|SVp_IOK)))));
2698                 SvFLAGS(oldsv) |= (SVf_IOK|SVp_IOK);
2699                 /* SvIV_set() where sv_any points to head */
2700                 oldsv->sv_u.svu_iv = cur;
2701
2702             }
2703             else
2704                 sv_setiv(oldsv, cur);
2705         }
2706         else
2707         {
2708             /* we need a fresh SV every time so that loop body sees a
2709              * completely new SV for closures/references to work as they
2710              * used to */
2711             *itersvp = newSViv(cur);
2712             SvREFCNT_dec(oldsv);
2713         }
2714
2715         if (UNLIKELY(cur == IV_MAX)) {
2716             /* Handle end of range at IV_MAX */
2717             cx->blk_loop.state_u.lazyiv.end = IV_MIN;
2718         } else
2719             ++cx->blk_loop.state_u.lazyiv.cur;
2720         break;
2721     }
2722
2723     case CXt_LOOP_LIST: /* for (1,2,3) */
2724
2725         assert(OPpITER_REVERSED == 2); /* so inc becomes -1 or 1 */
2726         inc = 1 - (PL_op->op_private & OPpITER_REVERSED);
2727         ix = (cx->blk_loop.state_u.stack.ix += inc);
2728         if (UNLIKELY(inc > 0
2729                         ? ix > cx->blk_oldsp
2730                         : ix <= cx->blk_loop.state_u.stack.basesp)
2731         )
2732             goto retno;
2733
2734         sv = PL_stack_base[ix];
2735         av = NULL;
2736         goto loop_ary_common;
2737
2738     case CXt_LOOP_ARY: /* for (@ary) */
2739
2740         av = cx->blk_loop.state_u.ary.ary;
2741         inc = 1 - (PL_op->op_private & OPpITER_REVERSED);
2742         ix = (cx->blk_loop.state_u.ary.ix += inc);
2743         if (UNLIKELY(inc > 0
2744                         ? ix > AvFILL(av)
2745                         : ix < 0)
2746         )
2747             goto retno;
2748
2749         if (UNLIKELY(SvRMAGICAL(av))) {
2750             SV * const * const svp = av_fetch(av, ix, FALSE);
2751             sv = svp ? *svp : NULL;
2752         }
2753         else {
2754             sv = AvARRAY(av)[ix];
2755         }
2756
2757       loop_ary_common:
2758
2759         if (UNLIKELY(cx->cx_type & CXp_FOR_LVREF)) {
2760             SvSetMagicSV(*itersvp, sv);
2761             break;
2762         }
2763
2764         if (LIKELY(sv)) {
2765             if (UNLIKELY(SvIS_FREED(sv))) {
2766                 *itersvp = NULL;
2767                 Perl_croak(aTHX_ "Use of freed value in iteration");
2768             }
2769             if (SvPADTMP(sv)) {
2770                 sv = newSVsv(sv);
2771             }
2772             else {
2773                 SvTEMP_off(sv);
2774                 SvREFCNT_inc_simple_void_NN(sv);
2775             }
2776         }
2777         else if (av) {
2778             sv = newSVavdefelem(av, ix, 0);
2779         }
2780         else
2781             sv = &PL_sv_undef;
2782
2783         oldsv = *itersvp;
2784         *itersvp = sv;
2785         SvREFCNT_dec(oldsv);
2786         break;
2787
2788     default:
2789         DIE(aTHX_ "panic: pp_iter, type=%u", CxTYPE(cx));
2790     }
2791
2792     retsv = &PL_sv_yes;
2793     if (0) {
2794       retno:
2795         retsv = &PL_sv_no;
2796     }
2797     /* pp_enteriter should have pre-extended the stack */
2798     assert(PL_stack_sp < PL_stack_max);
2799     *++PL_stack_sp =retsv;
2800
2801     return PL_op->op_next;
2802 }
2803
2804 /*
2805 A description of how taint works in pattern matching and substitution.
2806
2807 This is all conditional on NO_TAINT_SUPPORT not being defined. Under
2808 NO_TAINT_SUPPORT, taint-related operations should become no-ops.
2809
2810 While the pattern is being assembled/concatenated and then compiled,
2811 PL_tainted will get set (via TAINT_set) if any component of the pattern
2812 is tainted, e.g. /.*$tainted/.  At the end of pattern compilation,
2813 the RXf_TAINTED flag is set on the pattern if PL_tainted is set (via
2814 TAINT_get).  It will also be set if any component of the pattern matches
2815 based on locale-dependent behavior.
2816
2817 When the pattern is copied, e.g. $r = qr/..../, the SV holding the ref to
2818 the pattern is marked as tainted. This means that subsequent usage, such
2819 as /x$r/, will set PL_tainted using TAINT_set, and thus RXf_TAINTED,
2820 on the new pattern too.
2821
2822 RXf_TAINTED_SEEN is used post-execution by the get magic code
2823 of $1 et al to indicate whether the returned value should be tainted.
2824 It is the responsibility of the caller of the pattern (i.e. pp_match,
2825 pp_subst etc) to set this flag for any other circumstances where $1 needs
2826 to be tainted.
2827
2828 The taint behaviour of pp_subst (and pp_substcont) is quite complex.
2829
2830 There are three possible sources of taint
2831     * the source string
2832     * the pattern (both compile- and run-time, RXf_TAINTED / RXf_TAINTED_SEEN)
2833     * the replacement string (or expression under /e)
2834     
2835 There are four destinations of taint and they are affected by the sources
2836 according to the rules below:
2837
2838     * the return value (not including /r):
2839         tainted by the source string and pattern, but only for the
2840         number-of-iterations case; boolean returns aren't tainted;
2841     * the modified string (or modified copy under /r):
2842         tainted by the source string, pattern, and replacement strings;
2843     * $1 et al:
2844         tainted by the pattern, and under 'use re "taint"', by the source
2845         string too;
2846     * PL_taint - i.e. whether subsequent code (e.g. in a /e block) is tainted:
2847         should always be unset before executing subsequent code.
2848
2849 The overall action of pp_subst is:
2850
2851     * at the start, set bits in rxtainted indicating the taint status of
2852         the various sources.
2853
2854     * After each pattern execution, update the SUBST_TAINT_PAT bit in
2855         rxtainted if RXf_TAINTED_SEEN has been set, to indicate that the
2856         pattern has subsequently become tainted via locale ops.
2857
2858     * If control is being passed to pp_substcont to execute a /e block,
2859         save rxtainted in the CXt_SUBST block, for future use by
2860         pp_substcont.
2861
2862     * Whenever control is being returned to perl code (either by falling
2863         off the "end" of pp_subst/pp_substcont, or by entering a /e block),
2864         use the flag bits in rxtainted to make all the appropriate types of
2865         destination taint visible; e.g. set RXf_TAINTED_SEEN so that $1
2866         et al will appear tainted.
2867
2868 pp_match is just a simpler version of the above.
2869
2870 */
2871
2872 PP(pp_subst)
2873 {
2874     dSP; dTARG;
2875     PMOP *pm = cPMOP;
2876     PMOP *rpm = pm;
2877     char *s;
2878     char *strend;
2879     const char *c;
2880     STRLEN clen;
2881     SSize_t iters = 0;
2882     SSize_t maxiters;
2883     bool once;
2884     U8 rxtainted = 0; /* holds various SUBST_TAINT_* flag bits.
2885                         See "how taint works" above */
2886     char *orig;
2887     U8 r_flags;
2888     REGEXP *rx = PM_GETRE(pm);
2889     STRLEN len;
2890     int force_on_match = 0;
2891     const I32 oldsave = PL_savestack_ix;
2892     STRLEN slen;
2893     bool doutf8 = FALSE; /* whether replacement is in utf8 */
2894 #ifdef PERL_ANY_COW
2895     bool was_cow;
2896 #endif
2897     SV *nsv = NULL;
2898     /* known replacement string? */
2899     SV *dstr = (pm->op_pmflags & PMf_CONST) ? POPs : NULL;
2900
2901     PERL_ASYNC_CHECK();
2902
2903     if (PL_op->op_flags & OPf_STACKED)
2904         TARG = POPs;
2905     else if (ARGTARG)
2906         GETTARGET;
2907     else {
2908         TARG = DEFSV;
2909         EXTEND(SP,1);
2910     }
2911
2912     SvGETMAGIC(TARG); /* must come before cow check */
2913 #ifdef PERL_ANY_COW
2914     /* note that a string might get converted to COW during matching */
2915     was_cow = cBOOL(SvIsCOW(TARG));
2916 #endif
2917     if (!(rpm->op_pmflags & PMf_NONDESTRUCT)) {
2918 #ifndef PERL_ANY_COW
2919         if (SvIsCOW(TARG))
2920             sv_force_normal_flags(TARG,0);
2921 #endif
2922         if ((SvREADONLY(TARG)
2923                 || ( ((SvTYPE(TARG) == SVt_PVGV && isGV_with_GP(TARG))
2924                       || SvTYPE(TARG) > SVt_PVLV)
2925                      && !(SvTYPE(TARG) == SVt_PVGV && SvFAKE(TARG)))))
2926             Perl_croak_no_modify();
2927     }
2928     PUTBACK;
2929
2930     orig = SvPV_nomg(TARG, len);
2931     /* note we don't (yet) force the var into being a string; if we fail
2932      * to match, we leave as-is; on successful match however, we *will*
2933      * coerce into a string, then repeat the match */
2934     if (!SvPOKp(TARG) || SvTYPE(TARG) == SVt_PVGV || SvVOK(TARG))
2935         force_on_match = 1;
2936
2937     /* only replace once? */
2938     once = !(rpm->op_pmflags & PMf_GLOBAL);
2939
2940     /* See "how taint works" above */
2941     if (TAINTING_get) {
2942         rxtainted  = (
2943             (SvTAINTED(TARG) ? SUBST_TAINT_STR : 0)
2944           | (RX_ISTAINTED(rx) ? SUBST_TAINT_PAT : 0)
2945           | ((pm->op_pmflags & PMf_RETAINT) ? SUBST_TAINT_RETAINT : 0)
2946           | ((once && !(rpm->op_pmflags & PMf_NONDESTRUCT))
2947                 ? SUBST_TAINT_BOOLRET : 0));
2948         TAINT_NOT;
2949     }
2950
2951   force_it:
2952     if (!pm || !orig)
2953         DIE(aTHX_ "panic: pp_subst, pm=%p, orig=%p", pm, orig);
2954
2955     strend = orig + len;
2956     slen = DO_UTF8(TARG) ? utf8_length((U8*)orig, (U8*)strend) : len;
2957     maxiters = 2 * slen + 10;   /* We can match twice at each
2958                                    position, once with zero-length,
2959                                    second time with non-zero. */
2960
2961     if (!RX_PRELEN(rx) && PL_curpm
2962      && !ReANY(rx)->mother_re) {
2963         pm = PL_curpm;
2964         rx = PM_GETRE(pm);
2965     }
2966
2967 #ifdef PERL_SAWAMPERSAND
2968     r_flags = (    RX_NPARENS(rx)
2969                 || PL_sawampersand
2970                 || (RX_EXTFLAGS(rx) & (RXf_EVAL_SEEN|RXf_PMf_KEEPCOPY))
2971                 || (rpm->op_pmflags & PMf_KEEPCOPY)
2972               )
2973           ? REXEC_COPY_STR
2974           : 0;
2975 #else
2976     r_flags = REXEC_COPY_STR;
2977 #endif
2978
2979     if (!CALLREGEXEC(rx, orig, strend, orig, 0, TARG, NULL, r_flags))
2980     {
2981         SPAGAIN;
2982         PUSHs(rpm->op_pmflags & PMf_NONDESTRUCT ? TARG : &PL_sv_no);
2983         LEAVE_SCOPE(oldsave);
2984         RETURN;
2985     }
2986     PL_curpm = pm;
2987
2988     /* known replacement string? */
2989     if (dstr) {
2990         /* replacement needing upgrading? */
2991         if (DO_UTF8(TARG) && !doutf8) {
2992              nsv = sv_newmortal();
2993              SvSetSV(nsv, dstr);
2994              if (IN_ENCODING)
2995                   sv_recode_to_utf8(nsv, _get_encoding());
2996              else
2997                   sv_utf8_upgrade(nsv);
2998              c = SvPV_const(nsv, clen);
2999              doutf8 = TRUE;
3000         }
3001         else {
3002             c = SvPV_const(dstr, clen);
3003             doutf8 = DO_UTF8(dstr);
3004         }
3005
3006         if (SvTAINTED(dstr))
3007             rxtainted |= SUBST_TAINT_REPL;
3008     }
3009     else {
3010         c = NULL;
3011         doutf8 = FALSE;
3012     }
3013     
3014     /* can do inplace substitution? */
3015     if (c
3016 #ifdef PERL_ANY_COW
3017         && !was_cow
3018 #endif
3019         && (I32)clen <= RX_MINLENRET(rx)
3020         && (  once
3021            || !(r_flags & REXEC_COPY_STR)
3022            || (!SvGMAGICAL(dstr) && !(RX_EXTFLAGS(rx) & RXf_EVAL_SEEN))
3023            )
3024         && !(RX_EXTFLAGS(rx) & RXf_NO_INPLACE_SUBST)
3025         && (!doutf8 || SvUTF8(TARG))
3026         && !(rpm->op_pmflags & PMf_NONDESTRUCT))
3027     {
3028
3029 #ifdef PERL_ANY_COW
3030         /* string might have got converted to COW since we set was_cow */
3031         if (SvIsCOW(TARG)) {
3032           if (!force_on_match)
3033             goto have_a_cow;
3034           assert(SvVOK(TARG));
3035         }
3036 #endif
3037         if (force_on_match) {
3038             /* redo the first match, this time with the orig var
3039              * forced into being a string */
3040             force_on_match = 0;
3041             orig = SvPV_force_nomg(TARG, len);
3042             goto force_it;
3043         }
3044
3045         if (once) {
3046             char *d, *m;
3047             if (RX_MATCH_TAINTED(rx)) /* run time pattern taint, eg locale */
3048                 rxtainted |= SUBST_TAINT_PAT;
3049             m = orig + RX_OFFS(rx)[0].start;
3050             d = orig + RX_OFFS(rx)[0].end;
3051             s = orig;
3052             if (m - s > strend - d) {  /* faster to shorten from end */
3053                 I32 i;
3054                 if (clen) {
3055                     Copy(c, m, clen, char);
3056                     m += clen;
3057                 }
3058                 i = strend - d;
3059                 if (i > 0) {
3060                     Move(d, m, i, char);
3061                     m += i;
3062                 }
3063                 *m = '\0';
3064                 SvCUR_set(TARG, m - s);
3065             }
3066             else {      /* faster from front */
3067                 I32 i = m - s;
3068                 d -= clen;
3069                 if (i > 0)
3070                     Move(s, d - i, i, char);
3071                 sv_chop(TARG, d-i);
3072                 if (clen)
3073                     Copy(c, d, clen, char);
3074             }
3075             SPAGAIN;
3076             PUSHs(&PL_sv_yes);
3077         }
3078         else {
3079             char *d, *m;
3080             d = s = RX_OFFS(rx)[0].start + orig;
3081             do {
3082                 I32 i;
3083                 if (UNLIKELY(iters++ > maxiters))
3084                     DIE(aTHX_ "Substitution loop");
3085                 if (UNLIKELY(RX_MATCH_TAINTED(rx))) /* run time pattern taint, eg locale */
3086                     rxtainted |= SUBST_TAINT_PAT;
3087                 m = RX_OFFS(rx)[0].start + orig;
3088                 if ((i = m - s)) {
3089                     if (s != d)
3090                         Move(s, d, i, char);
3091                     d += i;
3092                 }
3093                 if (clen) {
3094                     Copy(c, d, clen, char);
3095                     d += clen;
3096                 }
3097                 s = RX_OFFS(rx)[0].end + orig;
3098             } while (CALLREGEXEC(rx, s, strend, orig,
3099                                  s == m, /* don't match same null twice */
3100                                  TARG, NULL,
3101                      REXEC_NOT_FIRST|REXEC_IGNOREPOS|REXEC_FAIL_ON_UNDERFLOW));
3102             if (s != d) {
3103                 I32 i = strend - s;
3104                 SvCUR_set(TARG, d - SvPVX_const(TARG) + i);
3105                 Move(s, d, i+1, char);          /* include the NUL */
3106             }
3107             SPAGAIN;
3108             mPUSHi(iters);
3109         }
3110     }
3111     else {
3112         bool first;
3113         char *m;
3114         SV *repl;
3115         if (force_on_match) {
3116             /* redo the first match, this time with the orig var
3117              * forced into being a string */
3118             force_on_match = 0;
3119             if (rpm->op_pmflags & PMf_NONDESTRUCT) {
3120                 /* I feel that it should be possible to avoid this mortal copy
3121                    given that the code below copies into a new destination.
3122                    However, I suspect it isn't worth the complexity of
3123                    unravelling the C<goto force_it> for the small number of
3124                    cases where it would be viable to drop into the copy code. */
3125                 TARG = sv_2mortal(newSVsv(TARG));
3126             }
3127             orig = SvPV_force_nomg(TARG, len);
3128             goto force_it;
3129         }
3130 #ifdef PERL_ANY_COW
3131       have_a_cow:
3132 #endif
3133         if (RX_MATCH_TAINTED(rx)) /* run time pattern taint, eg locale */
3134             rxtainted |= SUBST_TAINT_PAT;
3135         repl = dstr;
3136         s = RX_OFFS(rx)[0].start + orig;
3137         dstr = newSVpvn_flags(orig, s-orig,
3138                     SVs_TEMP | (DO_UTF8(TARG) ? SVf_UTF8 : 0));
3139         if (!c) {
3140             PERL_CONTEXT *cx;
3141             SPAGAIN;
3142             m = orig;
3143             /* note that a whole bunch of local vars are saved here for
3144              * use by pp_substcont: here's a list of them in case you're
3145              * searching for places in this sub that uses a particular var:
3146              * iters maxiters r_flags oldsave rxtainted orig dstr targ
3147              * s m strend rx once */
3148             CX_PUSHSUBST(cx);
3149             RETURNOP(cPMOP->op_pmreplrootu.op_pmreplroot);
3150         }
3151         first = TRUE;
3152         do {
3153             if (UNLIKELY(iters++ > maxiters))
3154                 DIE(aTHX_ "Substitution loop");
3155             if (UNLIKELY(RX_MATCH_TAINTED(rx)))
3156                 rxtainted |= SUBST_TAINT_PAT;
3157             if (RX_MATCH_COPIED(rx) && RX_SUBBEG(rx) != orig) {
3158                 char *old_s    = s;
3159                 char *old_orig = orig;
3160                 assert(RX_SUBOFFSET(rx) == 0);
3161
3162                 orig = RX_SUBBEG(rx);
3163                 s = orig + (old_s - old_orig);
3164                 strend = s + (strend - old_s);
3165             }
3166             m = RX_OFFS(rx)[0].start + orig;
3167             sv_catpvn_nomg_maybeutf8(dstr, s, m - s, DO_UTF8(TARG));
3168             s = RX_OFFS(rx)[0].end + orig;
3169             if (first) {
3170                 /* replacement already stringified */
3171               if (clen)
3172                 sv_catpvn_nomg_maybeutf8(dstr, c, clen, doutf8);
3173               first = FALSE;
3174             }
3175             else {
3176                 if (IN_ENCODING) {
3177                     if (!nsv) nsv = sv_newmortal();
3178                     sv_copypv(nsv, repl);
3179                     if (!DO_UTF8(nsv)) sv_recode_to_utf8(nsv, _get_encoding());
3180                     sv_catsv(dstr, nsv);
3181                 }
3182                 else sv_catsv(dstr, repl);
3183                 if (UNLIKELY(SvTAINTED(repl)))
3184                     rxtainted |= SUBST_TAINT_REPL;
3185             }
3186             if (once)
3187                 break;
3188         } while (CALLREGEXEC(rx, s, strend, orig,
3189                              s == m,    /* Yields minend of 0 or 1 */
3190                              TARG, NULL,
3191                     REXEC_NOT_FIRST|REXEC_IGNOREPOS|REXEC_FAIL_ON_UNDERFLOW));
3192         assert(strend >= s);
3193         sv_catpvn_nomg_maybeutf8(dstr, s, strend - s, DO_UTF8(TARG));
3194
3195         if (rpm->op_pmflags & PMf_NONDESTRUCT) {
3196             /* From here on down we're using the copy, and leaving the original
3197                untouched.  */
3198             TARG = dstr;
3199             SPAGAIN;
3200             PUSHs(dstr);
3201         } else {
3202 #ifdef PERL_ANY_COW
3203             /* The match may make the string COW. If so, brilliant, because
3204                that's just saved us one malloc, copy and free - the regexp has
3205                donated the old buffer, and we malloc an entirely new one, rather
3206                than the regexp malloc()ing a buffer and copying our original,
3207                only for us to throw it away here during the substitution.  */
3208             if (SvIsCOW(TARG)) {
3209                 sv_force_normal_flags(TARG, SV_COW_DROP_PV);
3210             } else
3211 #endif
3212             {
3213                 SvPV_free(TARG);
3214             }
3215             SvPV_set(TARG, SvPVX(dstr));
3216             SvCUR_set(TARG, SvCUR(dstr));
3217             SvLEN_set(TARG, SvLEN(dstr));
3218             SvFLAGS(TARG) |= SvUTF8(dstr);
3219             SvPV_set(dstr, NULL);
3220
3221             SPAGAIN;
3222             mPUSHi(iters);
3223         }
3224     }
3225
3226     if (!(rpm->op_pmflags & PMf_NONDESTRUCT)) {
3227         (void)SvPOK_only_UTF8(TARG);
3228     }
3229
3230     /* See "how taint works" above */
3231     if (TAINTING_get) {
3232         if ((rxtainted & SUBST_TAINT_PAT) ||
3233             ((rxtainted & (SUBST_TAINT_STR|SUBST_TAINT_RETAINT)) ==
3234                                 (SUBST_TAINT_STR|SUBST_TAINT_RETAINT))
3235         )
3236             (RX_MATCH_TAINTED_on(rx)); /* taint $1 et al */
3237
3238         if (!(rxtainted & SUBST_TAINT_BOOLRET)
3239             && (rxtainted & (SUBST_TAINT_STR|SUBST_TAINT_PAT))
3240         )
3241             SvTAINTED_on(TOPs);  /* taint return value */
3242         else
3243             SvTAINTED_off(TOPs);  /* may have got tainted earlier */
3244
3245         /* needed for mg_set below */
3246         TAINT_set(
3247           cBOOL(rxtainted & (SUBST_TAINT_STR|SUBST_TAINT_PAT|SUBST_TAINT_REPL))
3248         );
3249         SvTAINT(TARG);
3250     }
3251     SvSETMAGIC(TARG); /* PL_tainted must be correctly set for this mg_set */
3252     TAINT_NOT;
3253     LEAVE_SCOPE(oldsave);
3254     RETURN;
3255 }
3256
3257 PP(pp_grepwhile)
3258 {
3259     dSP;
3260
3261     if (SvTRUEx(POPs))
3262         PL_stack_base[PL_markstack_ptr[-1]++] = PL_stack_base[*PL_markstack_ptr];
3263     ++*PL_markstack_ptr;
3264     FREETMPS;
3265     LEAVE_with_name("grep_item");                                       /* exit inner scope */
3266
3267     /* All done yet? */
3268     if (UNLIKELY(PL_stack_base + *PL_markstack_ptr > SP)) {
3269         I32 items;
3270         const U8 gimme = GIMME_V;
3271
3272         LEAVE_with_name("grep");                                        /* exit outer scope */
3273         (void)POPMARK;                          /* pop src */
3274         items = --*PL_markstack_ptr - PL_markstack_ptr[-1];
3275         (void)POPMARK;                          /* pop dst */
3276         SP = PL_stack_base + POPMARK;           /* pop original mark */
3277         if (gimme == G_SCALAR) {
3278                 dTARGET;
3279                 XPUSHi(items);
3280         }
3281         else if (gimme == G_ARRAY)
3282             SP += items;
3283         RETURN;
3284     }
3285     else {
3286         SV *src;
3287
3288         ENTER_with_name("grep_item");                                   /* enter inner scope */
3289         SAVEVPTR(PL_curpm);
3290
3291         src = PL_stack_base[TOPMARK];
3292         if (SvPADTMP(src)) {
3293             src = PL_stack_base[TOPMARK] = sv_mortalcopy(src);
3294             PL_tmps_floor++;
3295         }
3296         SvTEMP_off(src);
3297         DEFSV_set(src);
3298
3299         RETURNOP(cLOGOP->op_other);
3300     }
3301 }
3302
3303 /* leave_adjust_stacks():
3304  *
3305  * Process a scope's return args (in the range from_sp+1 .. PL_stack_sp),
3306  * positioning them at to_sp+1 onwards, and do the equivalent of a
3307  * FREEMPS and TAINT_NOT.
3308  *
3309  * Not intended to be called in void context.
3310  *
3311  * When leaving a sub, eval, do{} or other scope, the things that need
3312  * doing to process the return args are:
3313  *    * in scalar context, only return the last arg (or PL_sv_undef if none);
3314  *    * for the types of return that return copies of their args (such
3315  *      as rvalue sub return), make a mortal copy of every return arg,
3316  *      except where we can optimise the copy away without it being
3317  *      semantically visible;
3318  *    * make sure that the arg isn't prematurely freed; in the case of an
3319  *      arg not copied, this may involve mortalising it. For example, in
3320  *      C<sub f { my $x = ...; $x }>, $x would be freed when we do
3321  *      CX_LEAVE_SCOPE(cx) unless it's protected or copied.
3322  *
3323  * What condition to use when deciding whether to pass the arg through
3324  * or make a copy, is determined by the 'pass' arg; its valid values are:
3325  *   0: rvalue sub/eval exit
3326  *   1: other rvalue scope exit
3327  *   2: :lvalue sub exit in rvalue context
3328  *   3: :lvalue sub exit in lvalue context and other lvalue scope exits
3329  *
3330  * There is a big issue with doing a FREETMPS. We would like to free any
3331  * temps created by the last statement which the sub executed, rather than
3332  * leaving them for the caller. In a situation where a sub call isn't
3333  * soon followed by a nextstate (e.g. nested recursive calls, a la
3334  * fibonacci()), temps can accumulate, causing memory and performance
3335  * issues.
3336  *
3337  * On the other hand, we don't want to free any TEMPs which are keeping
3338  * alive any return args that we skipped copying; nor do we wish to undo
3339  * any mortalising done here.
3340  *
3341  * The solution is to split the temps stack frame into two, with a cut
3342  * point delineating the two halves. We arrange that by the end of this
3343  * function, all the temps stack frame entries we wish to keep are in the
3344  * range  PL_tmps_floor+1.. tmps_base-1, while the ones to free now are in
3345  * the range  tmps_base .. PL_tmps_ix.  During the course of this
3346  * function, tmps_base starts off as PL_tmps_floor+1, then increases
3347  * whenever we find or create a temp that we know should be kept. In
3348  * general the stuff above tmps_base is undecided until we reach the end,
3349  * and we may need a sort stage for that.
3350  *
3351  * To determine whether a TEMP is keeping a return arg alive, every
3352  * arg that is kept rather than copied and which has the SvTEMP flag
3353  * set, has the flag temporarily unset, to mark it. At the end we scan
3354  * the temps stack frame above the cut for entries without SvTEMP and
3355  * keep them, while turning SvTEMP on again. Note that if we die before
3356  * the SvTEMPs flags are set again, its safe: at worst, subsequent use of
3357  * those SVs may be slightly less efficient.
3358  *
3359  * In practice various optimisations for some common cases mean we can
3360  * avoid most of the scanning and swapping about with the temps stack.
3361  */
3362
3363 void
3364 Perl_leave_adjust_stacks(pTHX_ SV **from_sp, SV **to_sp, U8 gimme, int pass)
3365 {
3366     dVAR;
3367     dSP;
3368     SSize_t tmps_base; /* lowest index into tmps stack that needs freeing now */
3369     SSize_t nargs;
3370
3371     PERL_ARGS_ASSERT_LEAVE_ADJUST_STACKS;
3372
3373     TAINT_NOT;
3374
3375     if (gimme == G_ARRAY) {
3376         nargs = SP - from_sp;
3377         from_sp++;
3378     }
3379     else {
3380         assert(gimme == G_SCALAR);
3381         if (UNLIKELY(from_sp >= SP)) {
3382             /* no return args */
3383             assert(from_sp == SP);
3384             EXTEND(SP, 1);
3385             *++SP = &PL_sv_undef;
3386             to_sp = SP;
3387             nargs   = 0;
3388         }
3389         else {
3390             from_sp = SP;
3391             nargs   = 1;
3392         }
3393     }
3394
3395     /* common code for G_SCALAR and G_ARRAY */
3396
3397     tmps_base = PL_tmps_floor + 1;
3398
3399     assert(nargs >= 0);
3400     if (nargs) {
3401         /* pointer version of tmps_base. Not safe across temp stack
3402          * reallocs. */
3403         SV **tmps_basep;
3404
3405         EXTEND_MORTAL(nargs); /* one big extend for worst-case scenario */
3406         tmps_basep = PL_tmps_stack + tmps_base;
3407
3408         /* process each return arg */
3409
3410         do {
3411             SV *sv = *from_sp++;
3412
3413             assert(PL_tmps_ix + nargs < PL_tmps_max);
3414 #ifdef DEBUGGING
3415             /* PADTMPs with container set magic shouldn't appear in the
3416              * wild. This assert is more important for pp_leavesublv(),
3417              * but by testing for it here, we're more likely to catch
3418              * bad cases (what with :lvalue subs not being widely
3419              * deployed). The two issues are that for something like
3420              *     sub :lvalue { $tied{foo} }
3421              * or
3422              *     sub :lvalue { substr($foo,1,2) }
3423              * pp_leavesublv() will croak if the sub returns a PADTMP,
3424              * and currently functions like pp_substr() return a mortal
3425              * rather than using their PADTMP when returning a PVLV.
3426              * This is because the PVLV will hold a ref to $foo,
3427              * so $foo would get delayed in being freed while
3428              * the PADTMP SV remained in the PAD.
3429              * So if this assert fails it means either:
3430              *  1) there is pp code similar to pp_substr that is
3431              *     returning a PADTMP instead of a mortal, and probably
3432              *     needs fixing, or
3433              *  2) pp_leavesublv is making unwarranted assumptions
3434              *     about always croaking on a PADTMP
3435              */
3436             if (SvPADTMP(sv) && SvSMAGICAL(sv)) {
3437                 MAGIC *mg;
3438                 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
3439                     assert(PERL_MAGIC_TYPE_IS_VALUE_MAGIC(mg->mg_type));
3440                 }
3441             }
3442 #endif
3443
3444             if (
3445                pass == 0 ? (SvTEMP(sv) && !SvMAGICAL(sv) && SvREFCNT(sv) == 1)
3446              : pass == 1 ? ((SvTEMP(sv) || SvPADTMP(sv)) && !SvMAGICAL(sv) && SvREFCNT(sv) == 1)
3447              : pass == 2 ? (!SvPADTMP(sv))
3448              : 1)
3449             {
3450                 /* pass through: skip copy for logic or optimisation
3451                  * reasons; instead mortalise it, except that ... */
3452                 *++to_sp = sv;
3453
3454                 if (SvTEMP(sv)) {
3455                     /* ... since this SV is an SvTEMP , we don't need to
3456                      * re-mortalise it; instead we just need to ensure
3457                      * that its existing entry in the temps stack frame
3458                      * ends up below the cut and so avoids being freed
3459                      * this time round. We mark it as needing to be kept
3460                      * by temporarily unsetting SvTEMP; then at the end,
3461                      * we shuffle any !SvTEMP entries on the tmps stack
3462                      * back below the cut.
3463                      * However, there's a significant chance that there's
3464                      * a 1:1 correspondence between the first few (or all)
3465                      * elements in the return args stack frame and those
3466                      * in the temps stack frame; e,g.:
3467                      *      sub f { ....; map {...} .... },
3468                      * or if we're exiting multiple scopes and one of the
3469                      * inner scopes has already made mortal copies of each
3470                      * return arg.
3471                      *
3472                      * If so, this arg sv will correspond to the next item
3473                      * on the tmps stack above the cut, and so can be kept
3474                      * merely by moving the cut boundary up one, rather
3475                      * than messing with SvTEMP.  If all args are 1:1 then
3476                      * we can avoid the sorting stage below completely.
3477                      *
3478                      * If there are no items above the cut on the tmps
3479                      * stack, then the SvTEMP must comne from an item
3480                      * below the cut, so there's nothing to do.
3481                      */
3482                     if (tmps_basep <= &PL_tmps_stack[PL_tmps_ix]) {
3483                         if (sv == *tmps_basep)
3484                             tmps_basep++;
3485                         else
3486                             SvTEMP_off(sv);
3487                     }
3488                 }
3489                 else if (!SvPADTMP(sv)) {
3490                     /* mortalise arg to avoid it being freed during save
3491                      * stack unwinding. Pad tmps don't need mortalising as
3492                      * they're never freed. This is the equivalent of
3493                      * sv_2mortal(SvREFCNT_inc(sv)), except that:
3494                      *  * it assumes that the temps stack has already been
3495                      *    extended;
3496                      *  * it puts the new item at the cut rather than at
3497                      *    ++PL_tmps_ix, moving the previous occupant there
3498                      *    instead.
3499                      */
3500                     if (!SvIMMORTAL(sv)) {
3501                         SvREFCNT_inc_simple_void_NN(sv);
3502                         SvTEMP_on(sv);
3503                         /* Note that if there's nothing above the cut,
3504                          * this copies the garbage one slot above
3505                          * PL_tmps_ix onto itself. This is harmless (the
3506                          * stack's already been extended), but might in
3507                          * theory trigger warnings from tools like ASan
3508                          */
3509                         PL_tmps_stack[++PL_tmps_ix] = *tmps_basep;
3510                         *tmps_basep++ = sv;
3511                     }
3512                 }
3513             }
3514             else {
3515                 /* Make a mortal copy of the SV.
3516                  * The following code is the equivalent of sv_mortalcopy()
3517                  * except that:
3518                  *  * it assumes the temps stack has already been extended;
3519                  *  * it optimises the copying for some simple SV types;
3520                  *  * it puts the new item at the cut rather than at
3521                  *    ++PL_tmps_ix, moving the previous occupant there
3522                  *    instead.
3523                  */
3524                 SV *newsv = newSV(0);
3525
3526                 PL_tmps_stack[++PL_tmps_ix] = *tmps_basep;
3527                 /* put it on the tmps stack early so it gets freed if we die */
3528                 *tmps_basep++ = newsv;
3529                 *++to_sp = newsv;
3530
3531                 if (SvTYPE(sv) <= SVt_IV) {
3532                     /* arg must be one of undef, IV/UV, or RV: skip
3533                      * sv_setsv_flags() and do the copy directly */
3534                     U32 dstflags;
3535                     U32 srcflags = SvFLAGS(sv);
3536
3537                     assert(!SvGMAGICAL(sv));
3538                     if (srcflags & (SVf_IOK|SVf_ROK)) {
3539                         SET_SVANY_FOR_BODYLESS_IV(newsv);
3540
3541                         if (srcflags & SVf_ROK) {
3542                             newsv->sv_u.svu_rv = SvREFCNT_inc(SvRV(sv));
3543                             /* SV type plus flags */
3544                             dstflags = (SVt_IV|SVf_ROK|SVs_TEMP);
3545                         }
3546                         else {
3547                             /* both src and dst are <= SVt_IV, so sv_any
3548                              * points to the head; so access the heads
3549                              * directly rather than going via sv_any.
3550                              */
3551                             assert(    &(sv->sv_u.svu_iv)
3552                                     == &(((XPVIV*) SvANY(sv))->xiv_iv));
3553                             assert(    &(newsv->sv_u.svu_iv)
3554                                     == &(((XPVIV*) SvANY(newsv))->xiv_iv));
3555                             newsv->sv_u.svu_iv = sv->sv_u.svu_iv;
3556                             /* SV type plus flags */
3557                             dstflags = (SVt_IV|SVf_IOK|SVp_IOK|SVs_TEMP
3558                                             |(srcflags & SVf_IVisUV));
3559                         }
3560                     }
3561                     else {
3562                         assert(!(srcflags & SVf_OK));
3563                         dstflags = (SVt_NULL|SVs_TEMP); /* SV type plus flags */
3564                     }
3565                     SvFLAGS(newsv) = dstflags;
3566
3567                 }
3568                 else {
3569                     /* do the full sv_setsv() */
3570                     SSize_t old_base;
3571
3572                     SvTEMP_on(newsv);
3573                     old_base = tmps_basep - PL_tmps_stack;
3574                     SvGETMAGIC(sv);
3575                     sv_setsv_flags(newsv, sv, SV_DO_COW_SVSETSV);
3576                     /* the mg_get or sv_setsv might have created new temps
3577                      * or realloced the tmps stack; regrow and reload */
3578                     EXTEND_MORTAL(nargs);
3579                     tmps_basep = PL_tmps_stack + old_base;
3580                     TAINT_NOT;  /* Each item is independent */
3581                 }
3582
3583             }
3584         } while (--nargs);
3585
3586         /* If there are any temps left above the cut, we need to sort
3587          * them into those to keep and those to free. The only ones to
3588          * keep are those for which we've temporarily unset SvTEMP.
3589          * Work inwards from the two ends at tmps_basep .. PL_tmps_ix,
3590          * swapping pairs as necessary. Stop when we meet in the middle.
3591          */
3592         {
3593             SV **top = PL_tmps_stack + PL_tmps_ix;
3594             while (tmps_basep <= top) {
3595                 SV *sv = *top;
3596                 if (SvTEMP(sv))
3597                     top--;
3598                 else {
3599                     SvTEMP_on(sv);
3600                     *top = *tmps_basep;
3601                     *tmps_basep = sv;
3602                     tmps_basep++;
3603                 }
3604             }
3605         }
3606
3607         tmps_base = tmps_basep - PL_tmps_stack;
3608     }
3609
3610     PL_stack_sp = to_sp;
3611
3612     /* unrolled FREETMPS() but using tmps_base-1 rather than PL_tmps_floor */
3613     while (PL_tmps_ix >= tmps_base) {
3614         SV* const sv = PL_tmps_stack[PL_tmps_ix--];
3615 #ifdef PERL_POISON
3616         PoisonWith(PL_tmps_stack + PL_tmps_ix + 1, 1, SV *, 0xAB);
3617 #endif
3618         if (LIKELY(sv)) {
3619             SvTEMP_off(sv);
3620             SvREFCNT_dec_NN(sv); /* note, can modify tmps_ix!!! */
3621         }
3622     }
3623 }
3624
3625
3626 /* also tail-called by pp_return */
3627
3628 PP(pp_leavesub)
3629 {
3630     U8 gimme;
3631     PERL_CONTEXT *cx;
3632     SV **oldsp;
3633     OP *retop;
3634
3635     cx = CX_CUR();
3636     assert(CxTYPE(cx) == CXt_SUB);
3637
3638     if (CxMULTICALL(cx)) {
3639         /* entry zero of a stack is always PL_sv_undef, which
3640          * simplifies converting a '()' return into undef in scalar context */
3641         assert(PL_stack_sp > PL_stack_base || *PL_stack_base == &PL_sv_undef);
3642         return 0;
3643     }
3644
3645     gimme = cx->blk_gimme;
3646     oldsp = PL_stack_base + cx->blk_oldsp; /* last arg of previous frame */
3647
3648     if (gimme == G_VOID)
3649         PL_stack_sp = oldsp;
3650     else
3651         leave_adjust_stacks(oldsp, oldsp, gimme, 0);
3652
3653     CX_LEAVE_SCOPE(cx);
3654     cx_popsub(cx);      /* Stack values are safe: release CV and @_ ... */
3655     cx_popblock(cx);
3656     retop = cx->blk_sub.retop;
3657     CX_POP(cx);
3658
3659     return retop;
3660 }
3661
3662
3663 /* clear (if possible) or abandon the current @_. If 'abandon' is true,
3664  * forces an abandon */
3665
3666 void
3667 Perl_clear_defarray(pTHX_ AV* av, bool abandon)
3668 {
3669     const SSize_t fill = AvFILLp(av);
3670
3671     PERL_ARGS_ASSERT_CLEAR_DEFARRAY;
3672
3673     if (LIKELY(!abandon && SvREFCNT(av) == 1 && !SvMAGICAL(av))) {
3674         av_clear(av);
3675         AvREIFY_only(av);
3676     }
3677     else {
3678         AV *newav = newAV();
3679         av_extend(newav, fill);
3680         AvREIFY_only(newav);
3681         PAD_SVl(0) = MUTABLE_SV(newav);
3682         SvREFCNT_dec_NN(av);
3683     }
3684 }
3685
3686
3687 PP(pp_entersub)
3688 {
3689     dSP; dPOPss;
3690     GV *gv;
3691     CV *cv;
3692     PERL_CONTEXT *cx;
3693     I32 old_savestack_ix;
3694
3695     if (UNLIKELY(!sv))
3696         goto do_die;
3697
3698     /* Locate the CV to call:
3699      * - most common case: RV->CV: f(), $ref->():
3700      *   note that if a sub is compiled before its caller is compiled,
3701      *   the stash entry will be a ref to a CV, rather than being a GV.
3702      * - second most common case: CV: $ref->method()
3703      */
3704
3705     /* a non-magic-RV -> CV ? */
3706     if (LIKELY( (SvFLAGS(sv) & (SVf_ROK|SVs_GMG)) == SVf_ROK)) {
3707         cv = MUTABLE_CV(SvRV(sv));
3708         if (UNLIKELY(SvOBJECT(cv))) /* might be overloaded */
3709             goto do_ref;
3710     }
3711     else
3712         cv = MUTABLE_CV(sv);
3713
3714     /* a CV ? */
3715     if (UNLIKELY(SvTYPE(cv) != SVt_PVCV)) {
3716         /* handle all the weird cases */
3717         switch (SvTYPE(sv)) {
3718         case SVt_PVLV:
3719             if (!isGV_with_GP(sv))
3720                 goto do_default;
3721             /* FALLTHROUGH */
3722         case SVt_PVGV:
3723             cv = GvCVu((const GV *)sv);
3724             if (UNLIKELY(!cv)) {
3725                 HV *stash;
3726                 cv = sv_2cv(sv, &stash, &gv, 0);
3727                 if (!cv) {
3728                     old_savestack_ix = PL_savestack_ix;
3729                     goto try_autoload;
3730                 }
3731             }
3732             break;
3733
3734         default:
3735           do_default:
3736             SvGETMAGIC(sv);
3737             if (SvROK(sv)) {
3738               do_ref:
3739                 if (UNLIKELY(SvAMAGIC(sv))) {
3740                     sv = amagic_deref_call(sv, to_cv_amg);
3741                     /* Don't SPAGAIN here.  */
3742                 }
3743             }
3744             else {
3745                 const char *sym;
3746                 STRLEN len;
3747                 if (UNLIKELY(!SvOK(sv)))
3748                     DIE(aTHX_ PL_no_usym, "a subroutine");
3749
3750                 if (UNLIKELY(sv == &PL_sv_yes)) { /* unfound import, ignore */
3751                     if (PL_op->op_flags & OPf_STACKED) /* hasargs */
3752                         SP = PL_stack_base + POPMARK;
3753                     else
3754                         (void)POPMARK;
3755                     if (GIMME_V == G_SCALAR)
3756                         PUSHs(&PL_sv_undef);
3757                     RETURN;
3758                 }
3759
3760                 sym = SvPV_nomg_const(sv, len);
3761                 if (PL_op->op_private & HINT_STRICT_REFS)
3762                     DIE(aTHX_ "Can't use string (\"%" SVf32 "\"%s) as a subroutine ref while \"strict refs\" in use", sv, len>32 ? "..." : "");
3763                 cv = get_cvn_flags(sym, len, GV_ADD|SvUTF8(sv));
3764                 break;
3765             }
3766             cv = MUTABLE_CV(SvRV(sv));
3767             if (LIKELY(SvTYPE(cv) == SVt_PVCV))
3768                 break;
3769             /* FALLTHROUGH */
3770         case SVt_PVHV:
3771         case SVt_PVAV:
3772           do_die:
3773             DIE(aTHX_ "Not a CODE reference");
3774         }
3775     }
3776
3777     /* At this point we want to save PL_savestack_ix, either by doing a
3778      * cx_pushsub(), or for XS, doing an ENTER. But we don't yet know the final
3779      * CV we will be using (so we don't know whether its XS, so we can't
3780      * cx_pushsub() or ENTER yet), and determining cv may itself push stuff on
3781      * the save stack. So remember where we are currently on the save
3782      * stack, and later update the CX or scopestack entry accordingly. */
3783     old_savestack_ix = PL_savestack_ix;
3784
3785     /* these two fields are in a union. If they ever become separate,
3786      * we have to test for both of them being null below */
3787     assert(cv);
3788     assert((void*)&CvROOT(cv) == (void*)&CvXSUB(cv));
3789     while (UNLIKELY(!CvROOT(cv))) {
3790         GV* autogv;
3791         SV* sub_name;
3792
3793         /* anonymous or undef'd function leaves us no recourse */
3794         if (CvLEXICAL(cv) && CvHASGV(cv))
3795             DIE(aTHX_ "Undefined subroutine &%"SVf" called",
3796                        SVfARG(cv_name(cv, NULL, 0)));
3797         if (CvANON(cv) || !CvHASGV(cv)) {
3798             DIE(aTHX_ "Undefined subroutine called");
3799         }
3800
3801         /* autoloaded stub? */
3802         if (cv != GvCV(gv = CvGV(cv))) {
3803             cv = GvCV(gv);
3804         }
3805         /* should call AUTOLOAD now? */
3806         else {
3807           try_autoload:
3808             autogv = gv_autoload_pvn(GvSTASH(gv), GvNAME(gv), GvNAMELEN(gv),
3809                                    GvNAMEUTF8(gv) ? SVf_UTF8 : 0);
3810             cv = autogv ? GvCV(autogv) : NULL;
3811         }
3812         if (!cv) {
3813             sub_name = sv_newmortal();
3814             gv_efullname3(sub_name, gv, NULL);
3815             DIE(aTHX_ "Undefined subroutine &%"SVf" called", SVfARG(sub_name));
3816         }
3817     }
3818
3819     /* unrolled "CvCLONE(cv) && ! CvCLONED(cv)" */
3820     if (UNLIKELY((CvFLAGS(cv) & (CVf_CLONE|CVf_CLONED)) == CVf_CLONE))
3821         DIE(aTHX_ "Closure prototype called");
3822
3823     if (UNLIKELY((PL_op->op_private & OPpENTERSUB_DB) && GvCV(PL_DBsub)
3824             && !CvNODEBUG(cv)))
3825     {
3826          Perl_get_db_sub(aTHX_ &sv, cv);
3827          if (CvISXSUB(cv))
3828              PL_curcopdb = PL_curcop;
3829          if (CvLVALUE(cv)) {
3830              /* check for lsub that handles lvalue subroutines */
3831              cv = GvCV(gv_fetchpvs("DB::lsub", GV_ADDMULTI, SVt_PVCV));
3832              /* if lsub not found then fall back to DB::sub */
3833              if (!cv) cv = GvCV(PL_DBsub);
3834          } else {
3835              cv = GvCV(PL_DBsub);
3836          }
3837
3838         if (!cv || (!CvXSUB(cv) && !CvSTART(cv)))
3839             DIE(aTHX_ "No DB::sub routine defined");
3840     }
3841
3842     if (!(CvISXSUB(cv))) {
3843         /* This path taken at least 75% of the time   */
3844         dMARK;
3845         PADLIST *padlist;
3846         I32 depth;
3847         bool hasargs;
3848         U8 gimme;
3849
3850         /* keep PADTMP args alive throughout the call (we need to do this
3851          * because @_ isn't refcounted). Note that we create the mortals
3852          * in the caller's tmps frame, so they won't be freed until after
3853          * we return from the sub.
3854          */
3855         {
3856             SV **svp = MARK;
3857             while (svp < SP) {
3858                 SV *sv = *++svp;
3859                 if (!sv)
3860                     continue;
3861                 if (SvPADTMP(sv))
3862                     *svp = sv = sv_mortalcopy(sv);
3863                 SvTEMP_off(sv);
3864             }
3865         }
3866
3867         gimme = GIMME_V;
3868         cx = cx_pushblock(CXt_SUB, gimme, MARK, old_savestack_ix);
3869         hasargs = cBOOL(PL_op->op_flags & OPf_STACKED);
3870         cx_pushsub(cx, cv, PL_op->op_next, hasargs);
3871
3872         padlist = CvPADLIST(cv);
3873         if (UNLIKELY((depth = ++CvDEPTH(cv)) >= 2))
3874             pad_push(padlist, depth);
3875         PAD_SET_CUR_NOSAVE(padlist, depth);
3876         if (LIKELY(hasargs)) {
3877             AV *const av = MUTABLE_AV(PAD_SVl(0));
3878             SSize_t items;
3879             AV **defavp;
3880
3881             defavp = &GvAV(PL_defgv);
3882             cx->blk_sub.savearray = *defavp;
3883             *defavp = MUTABLE_AV(SvREFCNT_inc_simple_NN(av));
3884
3885             /* it's the responsibility of whoever leaves a sub to ensure
3886              * that a clean, empty AV is left in pad[0]. This is normally
3887              * done by cx_popsub() */
3888             assert(!AvREAL(av) && AvFILLp(av) == -1);
3889
3890             items = SP - MARK;
3891             if (UNLIKELY(items - 1 > AvMAX(av))) {
3892                 SV **ary = AvALLOC(av);
3893                 AvMAX(av) = items - 1;
3894                 Renew(ary, items, SV*);
3895                 AvALLOC(av) = ary;
3896                 AvARRAY(av) = ary;
3897             }
3898
3899             Copy(MARK+1,AvARRAY(av),items,SV*);
3900             AvFILLp(av) = items - 1;
3901         }
3902         if (UNLIKELY((cx->blk_u16 & OPpENTERSUB_LVAL_MASK) == OPpLVAL_INTRO &&
3903             !CvLVALUE(cv)))
3904             DIE(aTHX_ "Can't modify non-lvalue subroutine call of &%"SVf,
3905                 SVfARG(cv_name(cv, NULL, 0)));
3906         /* warning must come *after* we fully set up the context
3907          * stuff so that __WARN__ handlers can safely dounwind()
3908          * if they want to
3909          */
3910         if (UNLIKELY(depth == PERL_SUB_DEPTH_WARN
3911                 && ckWARN(WARN_RECURSION)
3912                 && !(PERLDB_SUB && cv == GvCV(PL_DBsub))))
3913             sub_crush_depth(cv);
3914         RETURNOP(CvSTART(cv));
3915     }
3916     else {
3917         SSize_t markix = TOPMARK;
3918         bool is_scalar;
3919
3920         ENTER;
3921         /* pretend we did the ENTER earlier */
3922         PL_scopestack[PL_scopestack_ix - 1] = old_savestack_ix;
3923
3924         SAVETMPS;
3925         PUTBACK;
3926
3927         if (UNLIKELY(((PL_op->op_private
3928                & CX_PUSHSUB_GET_LVALUE_MASK(Perl_is_lvalue_sub)
3929              ) & OPpENTERSUB_LVAL_MASK) == OPpLVAL_INTRO &&
3930             !CvLVALUE(cv)))
3931             DIE(aTHX_ "Can't modify non-lvalue subroutine call of &%"SVf,
3932                 SVfARG(cv_name(cv, NULL, 0)));
3933
3934         if (UNLIKELY(!(PL_op->op_flags & OPf_STACKED) && GvAV(PL_defgv))) {
3935             /* Need to copy @_ to stack. Alternative may be to
3936              * switch stack to @_, and copy return values
3937              * back. This would allow popping @_ in XSUB, e.g.. XXXX */
3938             AV * const av = GvAV(PL_defgv);
3939             const SSize_t items = AvFILL(av) + 1;
3940
3941             if (items) {
3942                 SSize_t i = 0;
3943                 const bool m = cBOOL(SvRMAGICAL(av));
3944                 /* Mark is at the end of the stack. */
3945                 EXTEND(SP, items);
3946                 for (; i < items; ++i)
3947                 {
3948                     SV *sv;
3949                     if (m) {
3950                         SV ** const svp = av_fetch(av, i, 0);
3951                         sv = svp ? *svp : NULL;
3952                     }
3953                     else sv = AvARRAY(av)[i];
3954                     if (sv) SP[i+1] = sv;
3955                     else {
3956                         SP[i+1] = newSVavdefelem(av, i, 1);
3957                     }
3958                 }
3959                 SP += items;
3960                 PUTBACK ;               
3961             }
3962         }
3963         else {
3964             SV **mark = PL_stack_base + markix;
3965             SSize_t items = SP - mark;
3966             while (items--) {
3967                 mark++;
3968                 if (*mark && SvPADTMP(*mark)) {
3969                     *mark = sv_mortalcopy(*mark);
3970                 }
3971             }
3972         }
3973         /* We assume first XSUB in &DB::sub is the called one. */
3974         if (UNLIKELY(PL_curcopdb)) {
3975             SAVEVPTR(PL_curcop);
3976             PL_curcop = PL_curcopdb;
3977             PL_curcopdb = NULL;
3978         }
3979         /* Do we need to open block here? XXXX */
3980
3981         /* calculate gimme here as PL_op might get changed and then not
3982          * restored until the LEAVE further down */
3983         is_scalar = (GIMME_V == G_SCALAR);
3984
3985         /* CvXSUB(cv) must not be NULL because newXS() refuses NULL xsub address */
3986         assert(CvXSUB(cv));
3987         CvXSUB(cv)(aTHX_ cv);
3988
3989         /* Enforce some sanity in scalar context. */
3990         if (is_scalar) {
3991             SV **svp = PL_stack_base + markix + 1;
3992             if (svp != PL_stack_sp) {
3993                 *svp = svp > PL_stack_sp ? &PL_sv_undef : *PL_stack_sp;
3994                 PL_stack_sp = svp;
3995             }
3996         }
3997         LEAVE;
3998         return NORMAL;
3999     }
4000 }
4001
4002 void
4003 Perl_sub_crush_depth(pTHX_ CV *cv)
4004 {
4005     PERL_ARGS_ASSERT_SUB_CRUSH_DEPTH;
4006
4007     if (CvANON(cv))
4008         Perl_warner(aTHX_ packWARN(WARN_RECURSION), "Deep recursion on anonymous subroutine");
4009     else {
4010         Perl_warner(aTHX_ packWARN(WARN_RECURSION), "Deep recursion on subroutine \"%"SVf"\"",
4011                     SVfARG(cv_name(cv,NULL,0)));
4012     }
4013 }
4014
4015 PP(pp_aelem)
4016 {
4017     dSP;
4018     SV** svp;
4019     SV* const elemsv = POPs;
4020     IV elem = SvIV(elemsv);
4021     AV *const av = MUTABLE_AV(POPs);
4022     const U32 lval = PL_op->op_flags & OPf_MOD || LVRET;
4023     const U32 defer = PL_op->op_private & OPpLVAL_DEFER;
4024     const bool localizing = PL_op->op_private & OPpLVAL_INTRO;
4025     bool preeminent = TRUE;
4026     SV *sv;
4027
4028     if (UNLIKELY(SvROK(elemsv) && !SvGAMAGIC(elemsv) && ckWARN(WARN_MISC)))
4029         Perl_warner(aTHX_ packWARN(WARN_MISC),
4030                     "Use of reference \"%"SVf"\" as array index",
4031                     SVfARG(elemsv));
4032     if (UNLIKELY(SvTYPE(av) != SVt_PVAV))
4033         RETPUSHUNDEF;
4034
4035     if (UNLIKELY(localizing)) {
4036         MAGIC *mg;
4037         HV *stash;
4038
4039         /* If we can determine whether the element exist,
4040          * Try to preserve the existenceness of a tied array
4041          * element by using EXISTS and DELETE if possible.
4042          * Fallback to FETCH and STORE otherwise. */
4043         if (SvCANEXISTDELETE(av))
4044             preeminent = av_exists(av, elem);
4045     }
4046
4047     svp = av_fetch(av, elem, lval && !defer);
4048     if (lval) {
4049 #ifdef PERL_MALLOC_WRAP
4050          if (SvUOK(elemsv)) {
4051               const UV uv = SvUV(elemsv);
4052               elem = uv > IV_MAX ? IV_MAX : uv;
4053          }
4054          else if (SvNOK(elemsv))
4055               elem = (IV)SvNV(elemsv);
4056          if (elem > 0) {
4057               static const char oom_array_extend[] =
4058                 "Out of memory during array extend"; /* Duplicated in av.c */
4059               MEM_WRAP_CHECK_1(elem,SV*,oom_array_extend);
4060          }
4061 #endif
4062         if (!svp || !*svp) {
4063             IV len;
4064             if (!defer)
4065                 DIE(aTHX_ PL_no_aelem, elem);
4066             len = av_tindex(av);
4067             mPUSHs(newSVavdefelem(av,
4068             /* Resolve a negative index now, unless it points before the
4069                beginning of the array, in which case record it for error
4070                reporting in magic_setdefelem. */
4071                 elem < 0 && len + elem >= 0 ? len + elem : elem,
4072                 1));
4073             RETURN;
4074         }
4075         if (UNLIKELY(localizing)) {
4076             if (preeminent)
4077                 save_aelem(av, elem, svp);
4078             else
4079                 SAVEADELETE(av, elem);
4080         }
4081         else if (PL_op->op_private & OPpDEREF) {
4082             PUSHs(vivify_ref(*svp, PL_op->op_private & OPpDEREF));
4083             RETURN;
4084         }
4085     }
4086     sv = (svp ? *svp : &PL_sv_undef);
4087     if (!lval && SvRMAGICAL(av) && SvGMAGICAL(sv)) /* see note in pp_helem() */
4088         mg_get(sv);
4089     PUSHs(sv);
4090     RETURN;
4091 }
4092
4093 SV*
4094 Perl_vivify_ref(pTHX_ SV *sv, U32 to_what)
4095 {
4096     PERL_ARGS_ASSERT_VIVIFY_REF;
4097
4098     SvGETMAGIC(sv);
4099     if (!SvOK(sv)) {
4100         if (SvREADONLY(sv))
4101             Perl_croak_no_modify();
4102         prepare_SV_for_RV(sv);
4103         switch (to_what) {
4104         case OPpDEREF_SV:
4105             SvRV_set(sv, newSV(0));
4106             break;
4107         case OPpDEREF_AV:
4108             SvRV_set(sv, MUTABLE_SV(newAV()));
4109             break;
4110         case OPpDEREF_HV:
4111             SvRV_set(sv, MUTABLE_SV(newHV()));
4112             break;
4113         }
4114         SvROK_on(sv);
4115         SvSETMAGIC(sv);
4116         SvGETMAGIC(sv);
4117     }
4118     if (SvGMAGICAL(sv)) {
4119         /* copy the sv without magic to prevent magic from being
4120            executed twice */
4121         SV* msv = sv_newmortal();
4122         sv_setsv_nomg(msv, sv);
4123         return msv;
4124     }
4125     return sv;
4126 }
4127
4128 PERL_STATIC_INLINE HV *
4129 S_opmethod_stash(pTHX_ SV* meth)
4130 {
4131     SV* ob;
4132     HV* stash;
4133
4134     SV* const sv = PL_stack_base + TOPMARK == PL_stack_sp
4135         ? (Perl_croak(aTHX_ "Can't call method \"%"SVf"\" without a "
4136                             "package or object reference", SVfARG(meth)),
4137            (SV *)NULL)
4138         : *(PL_stack_base + TOPMARK + 1);
4139
4140     PERL_ARGS_ASSERT_OPMETHOD_STASH;
4141
4142     if (UNLIKELY(!sv))
4143        undefined:
4144         Perl_croak(aTHX_ "Can't call method \"%"SVf"\" on an undefined value",
4145                    SVfARG(meth));
4146
4147     if (UNLIKELY(SvGMAGICAL(sv))) mg_get(sv);
4148     else if (SvIsCOW_shared_hash(sv)) { /* MyClass->meth() */
4149         stash = gv_stashsv(sv, GV_CACHE_ONLY);
4150         if (stash) return stash;
4151     }
4152
4153     if (SvROK(sv))
4154         ob = MUTABLE_SV(SvRV(sv));
4155     else if (!SvOK(sv)) goto undefined;
4156     else if (isGV_with_GP(sv)) {
4157         if (!GvIO(sv))
4158             Perl_croak(aTHX_ "Can't call method \"%"SVf"\" "
4159                              "without a package or object reference",
4160                               SVfARG(meth));
4161         ob = sv;
4162         if (SvTYPE(ob) == SVt_PVLV && LvTYPE(ob) == 'y') {
4163             assert(!LvTARGLEN(ob));
4164             ob = LvTARG(ob);
4165             assert(ob);
4166         }
4167         *(PL_stack_base + TOPMARK + 1) = sv_2mortal(newRV(ob));
4168     }
4169     else {
4170         /* this isn't a reference */
4171         GV* iogv;
4172         STRLEN packlen;
4173         const char * const packname = SvPV_nomg_const(sv, packlen);
4174         const U32 packname_utf8 = SvUTF8(sv);
4175         stash = gv_stashpvn(packname, packlen, packname_utf8 | GV_CACHE_ONLY);
4176         if (stash) return stash;
4177
4178         if (!(iogv = gv_fetchpvn_flags(
4179                 packname, packlen, packname_utf8, SVt_PVIO
4180              )) ||
4181             !(ob=MUTABLE_SV(GvIO(iogv))))
4182         {
4183             /* this isn't the name of a filehandle either */
4184             if (!packlen)
4185             {
4186                 Perl_croak(aTHX_ "Can't call method \"%"SVf"\" "
4187                                  "without a package or object reference",
4188                                   SVfARG(meth));
4189             }
4190             /* assume it's a package name */
4191             stash = gv_stashpvn(packname, packlen, packname_utf8);
4192             if (stash) return stash;
4193             else return MUTABLE_HV(sv);
4194         }
4195         /* it _is_ a filehandle name -- replace with a reference */
4196         *(PL_stack_base + TOPMARK + 1) = sv_2mortal(newRV(MUTABLE_SV(iogv)));
4197     }
4198
4199     /* if we got here, ob should be an object or a glob */
4200     if (!ob || !(SvOBJECT(ob)
4201                  || (isGV_with_GP(ob)
4202                      && (ob = MUTABLE_SV(GvIO((const GV *)ob)))
4203                      && SvOBJECT(ob))))
4204     {
4205         Perl_croak(aTHX_ "Can't call method \"%"SVf"\" on unblessed reference",
4206                    SVfARG((SvSCREAM(meth) && strEQ(SvPV_nolen_const(meth),"isa"))
4207                                         ? newSVpvs_flags("DOES", SVs_TEMP)
4208                                         : meth));
4209     }
4210
4211     return SvSTASH(ob);
4212 }
4213
4214 PP(pp_method)
4215 {
4216     dSP;
4217     GV* gv;
4218     HV* stash;
4219     SV* const meth = TOPs;
4220
4221     if (SvROK(meth)) {
4222         SV* const rmeth = SvRV(meth);
4223         if (SvTYPE(rmeth) == SVt_PVCV) {
4224             SETs(rmeth);
4225             RETURN;
4226         }
4227     }
4228
4229     stash = opmethod_stash(meth);
4230
4231     gv = gv_fetchmethod_sv_flags(stash, meth, GV_AUTOLOAD|GV_CROAK);
4232     assert(gv);
4233
4234     SETs(isGV(gv) ? MUTABLE_SV(GvCV(gv)) : MUTABLE_SV(gv));
4235     RETURN;
4236 }
4237
4238 #define METHOD_CHECK_CACHE(stash,cache,meth)                            \
4239     const HE* const he = hv_fetch_ent(cache, meth, 0, 0);               \
4240     if (he) {                                                           \
4241         gv = MUTABLE_GV(HeVAL(he));                                     \
4242         if (isGV(gv) && GvCV(gv) && (!GvCVGEN(gv) || GvCVGEN(gv)        \
4243              == (PL_sub_generation + HvMROMETA(stash)->cache_gen)))     \
4244         {                                                               \
4245             XPUSHs(MUTABLE_SV(GvCV(gv)));                               \
4246             RETURN;                                                     \
4247         }                                                               \
4248     }                                                                   \
4249
4250 PP(pp_method_named)
4251 {
4252     dSP;
4253     GV* gv;
4254     SV* const meth = cMETHOPx_meth(PL_op);
4255     HV* const stash = opmethod_stash(meth);
4256
4257     if (LIKELY(SvTYPE(stash) == SVt_PVHV)) {
4258         METHOD_CHECK_CACHE(stash, stash, meth);
4259     }
4260
4261     gv = gv_fetchmethod_sv_flags(stash, meth, GV_AUTOLOAD|GV_CROAK);
4262     assert(gv);
4263
4264     XPUSHs(isGV(gv) ? MUTABLE_SV(GvCV(gv)) : MUTABLE_SV(gv));
4265     RETURN;
4266 }
4267
4268 PP(pp_method_super)
4269 {
4270     dSP;
4271     GV* gv;
4272     HV* cache;
4273     SV* const meth = cMETHOPx_meth(PL_op);
4274     HV* const stash = CopSTASH(PL_curcop);
4275     /* Actually, SUPER doesn't need real object's (or class') stash at all,
4276      * as it uses CopSTASH. However, we must ensure that object(class) is
4277      * correct (this check is done by S_opmethod_stash) */
4278     opmethod_stash(meth);
4279
4280     if ((cache = HvMROMETA(stash)->super)) {
4281         METHOD_CHECK_CACHE(stash, cache, meth);
4282     }
4283
4284     gv = gv_fetchmethod_sv_flags(stash, meth, GV_AUTOLOAD|GV_CROAK|GV_SUPER);
4285     assert(gv);
4286
4287     XPUSHs(isGV(gv) ? MUTABLE_SV(GvCV(gv)) : MUTABLE_SV(gv));
4288     RETURN;
4289 }
4290
4291 PP(pp_method_redir)
4292 {
4293     dSP;
4294     GV* gv;
4295     SV* const meth = cMETHOPx_meth(PL_op);
4296     HV* stash = gv_stashsv(cMETHOPx_rclass(PL_op), 0);
4297     opmethod_stash(meth); /* not used but needed for error checks */
4298
4299     if (stash) { METHOD_CHECK_CACHE(stash, stash, meth); }
4300     else stash = MUTABLE_HV(cMETHOPx_rclass(PL_op));
4301
4302     gv = gv_fetchmethod_sv_flags(stash, meth, GV_AUTOLOAD|GV_CROAK);
4303     assert(gv);
4304
4305     XPUSHs(isGV(gv) ? MUTABLE_SV(GvCV(gv)) : MUTABLE_SV(gv));
4306     RETURN;
4307 }
4308
4309 PP(pp_method_redir_super)
4310 {
4311     dSP;
4312     GV* gv;
4313     HV* cache;
4314     SV* const meth = cMETHOPx_meth(PL_op);
4315     HV* stash = gv_stashsv(cMETHOPx_rclass(PL_op), 0);
4316     opmethod_stash(meth); /* not used but needed for error checks */
4317
4318     if (UNLIKELY(!stash)) stash = MUTABLE_HV(cMETHOPx_rclass(PL_op));
4319     else if ((cache = HvMROMETA(stash)->super)) {
4320          METHOD_CHECK_CACHE(stash, cache, meth);
4321     }
4322
4323     gv = gv_fetchmethod_sv_flags(stash, meth, GV_AUTOLOAD|GV_CROAK|GV_SUPER);
4324     assert(gv);
4325
4326     XPUSHs(isGV(gv) ? MUTABLE_SV(GvCV(gv)) : MUTABLE_SV(gv));
4327     RETURN;
4328 }
4329
4330 /*
4331  * ex: set ts=8 sts=4 sw=4 et:
4332  */