This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
don't assume that filesys starts at / in Pod-Html
[perl5.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     dVAR;
43     dSP;
44     XPUSHs(cSVOP_sv);
45     RETURN;
46 }
47
48 PP(pp_nextstate)
49 {
50     dVAR;
51     PL_curcop = (COP*)PL_op;
52     TAINT_NOT;          /* Each statement is presumed innocent */
53     PL_stack_sp = PL_stack_base + cxstack[cxstack_ix].blk_oldsp;
54     FREETMPS;
55     PERL_ASYNC_CHECK();
56     return NORMAL;
57 }
58
59 PP(pp_gvsv)
60 {
61     dVAR;
62     dSP;
63     EXTEND(SP,1);
64     if (PL_op->op_private & OPpLVAL_INTRO)
65         PUSHs(save_scalar(cGVOP_gv));
66     else
67         PUSHs(GvSVn(cGVOP_gv));
68     RETURN;
69 }
70
71 PP(pp_null)
72 {
73     dVAR;
74     return NORMAL;
75 }
76
77 /* This is sometimes called directly by pp_coreargs. */
78 PP(pp_pushmark)
79 {
80     dVAR;
81     PUSHMARK(PL_stack_sp);
82     return NORMAL;
83 }
84
85 PP(pp_stringify)
86 {
87     dVAR; dSP; dTARGET;
88     sv_copypv(TARG,TOPs);
89     SETTARG;
90     RETURN;
91 }
92
93 PP(pp_gv)
94 {
95     dVAR; dSP;
96     XPUSHs(MUTABLE_SV(cGVOP_gv));
97     RETURN;
98 }
99
100 PP(pp_and)
101 {
102     dVAR; dSP;
103     PERL_ASYNC_CHECK();
104     if (!SvTRUE(TOPs))
105         RETURN;
106     else {
107         if (PL_op->op_type == OP_AND)
108             --SP;
109         RETURNOP(cLOGOP->op_other);
110     }
111 }
112
113 PP(pp_sassign)
114 {
115     dVAR; dSP; dPOPTOPssrl;
116
117     if (PL_op->op_private & OPpASSIGN_BACKWARDS) {
118         SV * const temp = left;
119         left = right; right = temp;
120     }
121     if (PL_tainting && PL_tainted && !SvTAINTED(left))
122         TAINT_NOT;
123     if (PL_op->op_private & OPpASSIGN_CV_TO_GV) {
124         SV * const cv = SvRV(left);
125         const U32 cv_type = SvTYPE(cv);
126         const bool is_gv = isGV_with_GP(right);
127         const bool got_coderef = cv_type == SVt_PVCV || cv_type == SVt_PVFM;
128
129         if (!got_coderef) {
130             assert(SvROK(cv));
131         }
132
133         /* Can do the optimisation if right (LVALUE) is not a typeglob,
134            left (RVALUE) is a reference to something, and we're in void
135            context. */
136         if (!got_coderef && !is_gv && GIMME_V == G_VOID) {
137             /* Is the target symbol table currently empty?  */
138             GV * const gv = gv_fetchsv_nomg(right, GV_NOINIT, SVt_PVGV);
139             if (SvTYPE(gv) != SVt_PVGV && !SvOK(gv)) {
140                 /* Good. Create a new proxy constant subroutine in the target.
141                    The gv becomes a(nother) reference to the constant.  */
142                 SV *const value = SvRV(cv);
143
144                 SvUPGRADE(MUTABLE_SV(gv), SVt_IV);
145                 SvPCS_IMPORTED_on(gv);
146                 SvRV_set(gv, value);
147                 SvREFCNT_inc_simple_void(value);
148                 SETs(right);
149                 RETURN;
150             }
151         }
152
153         /* Need to fix things up.  */
154         if (!is_gv) {
155             /* Need to fix GV.  */
156             right = MUTABLE_SV(gv_fetchsv_nomg(right,GV_ADD, SVt_PVGV));
157         }
158
159         if (!got_coderef) {
160             /* We've been returned a constant rather than a full subroutine,
161                but they expect a subroutine reference to apply.  */
162             if (SvROK(cv)) {
163                 ENTER_with_name("sassign_coderef");
164                 SvREFCNT_inc_void(SvRV(cv));
165                 /* newCONSTSUB takes a reference count on the passed in SV
166                    from us.  We set the name to NULL, otherwise we get into
167                    all sorts of fun as the reference to our new sub is
168                    donated to the GV that we're about to assign to.
169                 */
170                 SvRV_set(left, MUTABLE_SV(newCONSTSUB(GvSTASH(right), NULL,
171                                                       SvRV(cv))));
172                 SvREFCNT_dec(cv);
173                 LEAVE_with_name("sassign_coderef");
174             } else {
175                 /* What can happen for the corner case *{"BONK"} = \&{"BONK"};
176                    is that
177                    First:   ops for \&{"BONK"}; return us the constant in the
178                             symbol table
179                    Second:  ops for *{"BONK"} cause that symbol table entry
180                             (and our reference to it) to be upgraded from RV
181                             to typeblob)
182                    Thirdly: We get here. cv is actually PVGV now, and its
183                             GvCV() is actually the subroutine we're looking for
184
185                    So change the reference so that it points to the subroutine
186                    of that typeglob, as that's what they were after all along.
187                 */
188                 GV *const upgraded = MUTABLE_GV(cv);
189                 CV *const source = GvCV(upgraded);
190
191                 assert(source);
192                 assert(CvFLAGS(source) & CVf_CONST);
193
194                 SvREFCNT_inc_void(source);
195                 SvREFCNT_dec(upgraded);
196                 SvRV_set(left, MUTABLE_SV(source));
197             }
198         }
199
200     }
201     if (
202       SvTEMP(right) && !SvSMAGICAL(right) && SvREFCNT(right) == 1 &&
203       (!isGV_with_GP(right) || SvFAKE(right)) && ckWARN(WARN_MISC)
204     )
205         Perl_warner(aTHX_
206             packWARN(WARN_MISC), "Useless assignment to a temporary"
207         );
208     SvSetMagicSV(right, left);
209     SETs(right);
210     RETURN;
211 }
212
213 PP(pp_cond_expr)
214 {
215     dVAR; dSP;
216     PERL_ASYNC_CHECK();
217     if (SvTRUEx(POPs))
218         RETURNOP(cLOGOP->op_other);
219     else
220         RETURNOP(cLOGOP->op_next);
221 }
222
223 PP(pp_unstack)
224 {
225     dVAR;
226     PERL_ASYNC_CHECK();
227     TAINT_NOT;          /* Each statement is presumed innocent */
228     PL_stack_sp = PL_stack_base + cxstack[cxstack_ix].blk_oldsp;
229     FREETMPS;
230     if (!(PL_op->op_flags & OPf_SPECIAL)) {
231         I32 oldsave = PL_scopestack[PL_scopestack_ix - 1];
232         LEAVE_SCOPE(oldsave);
233     }
234     return NORMAL;
235 }
236
237 PP(pp_concat)
238 {
239   dVAR; dSP; dATARGET; tryAMAGICbin_MG(concat_amg, AMGf_assign);
240   {
241     dPOPTOPssrl;
242     bool lbyte;
243     STRLEN rlen;
244     const char *rpv = NULL;
245     bool rbyte = FALSE;
246     bool rcopied = FALSE;
247
248     if (TARG == right && right != left) { /* $r = $l.$r */
249         rpv = SvPV_nomg_const(right, rlen);
250         rbyte = !DO_UTF8(right);
251         right = newSVpvn_flags(rpv, rlen, SVs_TEMP);
252         rpv = SvPV_const(right, rlen);  /* no point setting UTF-8 here */
253         rcopied = TRUE;
254     }
255
256     if (TARG != left) { /* not $l .= $r */
257         STRLEN llen;
258         const char* const lpv = SvPV_nomg_const(left, llen);
259         lbyte = !DO_UTF8(left);
260         sv_setpvn(TARG, lpv, llen);
261         if (!lbyte)
262             SvUTF8_on(TARG);
263         else
264             SvUTF8_off(TARG);
265     }
266     else { /* $l .= $r */
267         if (!SvOK(TARG)) {
268             if (left == right && ckWARN(WARN_UNINITIALIZED)) /* $l .= $l */
269                 report_uninit(right);
270             sv_setpvs(left, "");
271         }
272         lbyte = (SvROK(left) && SvTYPE(SvRV(left)) == SVt_REGEXP)
273                     ?  !DO_UTF8(SvRV(left)) : !DO_UTF8(left);
274         if (IN_BYTES)
275             SvUTF8_off(TARG);
276     }
277
278     if (!rcopied) {
279         if (left == right)
280             /* $r.$r: do magic twice: tied might return different 2nd time */
281             SvGETMAGIC(right);
282         rpv = SvPV_nomg_const(right, rlen);
283         rbyte = !DO_UTF8(right);
284     }
285     if (lbyte != rbyte) {
286         /* sv_utf8_upgrade_nomg() may reallocate the stack */
287         PUTBACK;
288         if (lbyte)
289             sv_utf8_upgrade_nomg(TARG);
290         else {
291             if (!rcopied)
292                 right = newSVpvn_flags(rpv, rlen, SVs_TEMP);
293             sv_utf8_upgrade_nomg(right);
294             rpv = SvPV_nomg_const(right, rlen);
295         }
296         SPAGAIN;
297     }
298     sv_catpvn_nomg(TARG, rpv, rlen);
299
300     SETTARG;
301     RETURN;
302   }
303 }
304
305 PP(pp_padsv)
306 {
307     dVAR; dSP; dTARGET;
308     XPUSHs(TARG);
309     if (PL_op->op_flags & OPf_MOD) {
310         if (PL_op->op_private & OPpLVAL_INTRO)
311             if (!(PL_op->op_private & OPpPAD_STATE))
312                 SAVECLEARSV(PAD_SVl(PL_op->op_targ));
313         if (PL_op->op_private & OPpDEREF) {
314             PUTBACK;
315             TOPs = vivify_ref(TOPs, PL_op->op_private & OPpDEREF);
316             SPAGAIN;
317         }
318     }
319     RETURN;
320 }
321
322 PP(pp_readline)
323 {
324     dVAR;
325     dSP;
326     if (TOPs) {
327         SvGETMAGIC(TOPs);
328         tryAMAGICunTARGET(iter_amg, 0, 0);
329         PL_last_in_gv = MUTABLE_GV(*PL_stack_sp--);
330     }
331     else PL_last_in_gv = PL_argvgv, PL_stack_sp--;
332     if (!isGV_with_GP(PL_last_in_gv)) {
333         if (SvROK(PL_last_in_gv) && isGV_with_GP(SvRV(PL_last_in_gv)))
334             PL_last_in_gv = MUTABLE_GV(SvRV(PL_last_in_gv));
335         else {
336             dSP;
337             XPUSHs(MUTABLE_SV(PL_last_in_gv));
338             PUTBACK;
339             Perl_pp_rv2gv(aTHX);
340             PL_last_in_gv = MUTABLE_GV(*PL_stack_sp--);
341         }
342     }
343     return do_readline();
344 }
345
346 PP(pp_eq)
347 {
348     dVAR; dSP;
349     SV *left, *right;
350
351     tryAMAGICbin_MG(eq_amg, AMGf_set|AMGf_numeric);
352     right = POPs;
353     left  = TOPs;
354     SETs(boolSV(
355         (SvIOK_notUV(left) && SvIOK_notUV(right))
356         ? (SvIVX(left) == SvIVX(right))
357         : ( do_ncmp(left, right) == 0)
358     ));
359     RETURN;
360 }
361
362 PP(pp_preinc)
363 {
364     dVAR; dSP;
365     const bool inc =
366         PL_op->op_type == OP_PREINC || PL_op->op_type == OP_I_PREINC;
367     if (SvTYPE(TOPs) >= SVt_PVAV || (isGV_with_GP(TOPs) && !SvFAKE(TOPs)))
368         Perl_croak_no_modify(aTHX);
369     if (!SvREADONLY(TOPs) && SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)
370         && SvIVX(TOPs) != (inc ? IV_MAX : IV_MIN))
371     {
372         SvIV_set(TOPs, SvIVX(TOPs) + (inc ? 1 : -1));
373         SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
374     }
375     else /* Do all the PERL_PRESERVE_IVUV conditionals in sv_inc */
376         if (inc) sv_inc(TOPs);
377         else sv_dec(TOPs);
378     SvSETMAGIC(TOPs);
379     return NORMAL;
380 }
381
382 PP(pp_or)
383 {
384     dVAR; dSP;
385     PERL_ASYNC_CHECK();
386     if (SvTRUE(TOPs))
387         RETURN;
388     else {
389         if (PL_op->op_type == OP_OR)
390             --SP;
391         RETURNOP(cLOGOP->op_other);
392     }
393 }
394
395 PP(pp_defined)
396 {
397     dVAR; dSP;
398     register SV* sv;
399     bool defined;
400     const int op_type = PL_op->op_type;
401     const bool is_dor = (op_type == OP_DOR || op_type == OP_DORASSIGN);
402
403     if (is_dor) {
404         PERL_ASYNC_CHECK();
405         sv = TOPs;
406         if (!sv || !SvANY(sv)) {
407             if (op_type == OP_DOR)
408                 --SP;
409             RETURNOP(cLOGOP->op_other);
410         }
411     }
412     else {
413         /* OP_DEFINED */
414         sv = POPs;
415         if (!sv || !SvANY(sv))
416             RETPUSHNO;
417     }
418
419     defined = FALSE;
420     switch (SvTYPE(sv)) {
421     case SVt_PVAV:
422         if (AvMAX(sv) >= 0 || SvGMAGICAL(sv) || (SvRMAGICAL(sv) && mg_find(sv, PERL_MAGIC_tied)))
423             defined = TRUE;
424         break;
425     case SVt_PVHV:
426         if (HvARRAY(sv) || SvGMAGICAL(sv) || (SvRMAGICAL(sv) && mg_find(sv, PERL_MAGIC_tied)))
427             defined = TRUE;
428         break;
429     case SVt_PVCV:
430         if (CvROOT(sv) || CvXSUB(sv))
431             defined = TRUE;
432         break;
433     default:
434         SvGETMAGIC(sv);
435         if (SvOK(sv))
436             defined = TRUE;
437         break;
438     }
439
440     if (is_dor) {
441         if(defined) 
442             RETURN; 
443         if(op_type == OP_DOR)
444             --SP;
445         RETURNOP(cLOGOP->op_other);
446     }
447     /* assuming OP_DEFINED */
448     if(defined) 
449         RETPUSHYES;
450     RETPUSHNO;
451 }
452
453 PP(pp_add)
454 {
455     dVAR; dSP; dATARGET; bool useleft; SV *svl, *svr;
456     tryAMAGICbin_MG(add_amg, AMGf_assign|AMGf_numeric);
457     svr = TOPs;
458     svl = TOPm1s;
459
460     useleft = USE_LEFT(svl);
461 #ifdef PERL_PRESERVE_IVUV
462     /* We must see if we can perform the addition with integers if possible,
463        as the integer code detects overflow while the NV code doesn't.
464        If either argument hasn't had a numeric conversion yet attempt to get
465        the IV. It's important to do this now, rather than just assuming that
466        it's not IOK as a PV of "9223372036854775806" may not take well to NV
467        addition, and an SV which is NOK, NV=6.0 ought to be coerced to
468        integer in case the second argument is IV=9223372036854775806
469        We can (now) rely on sv_2iv to do the right thing, only setting the
470        public IOK flag if the value in the NV (or PV) slot is truly integer.
471
472        A side effect is that this also aggressively prefers integer maths over
473        fp maths for integer values.
474
475        How to detect overflow?
476
477        C 99 section 6.2.6.1 says
478
479        The range of nonnegative values of a signed integer type is a subrange
480        of the corresponding unsigned integer type, and the representation of
481        the same value in each type is the same. A computation involving
482        unsigned operands can never overflow, because a result that cannot be
483        represented by the resulting unsigned integer type is reduced modulo
484        the number that is one greater than the largest value that can be
485        represented by the resulting type.
486
487        (the 9th paragraph)
488
489        which I read as "unsigned ints wrap."
490
491        signed integer overflow seems to be classed as "exception condition"
492
493        If an exceptional condition occurs during the evaluation of an
494        expression (that is, if the result is not mathematically defined or not
495        in the range of representable values for its type), the behavior is
496        undefined.
497
498        (6.5, the 5th paragraph)
499
500        I had assumed that on 2s complement machines signed arithmetic would
501        wrap, hence coded pp_add and pp_subtract on the assumption that
502        everything perl builds on would be happy.  After much wailing and
503        gnashing of teeth it would seem that irix64 knows its ANSI spec well,
504        knows that it doesn't need to, and doesn't.  Bah.  Anyway, the all-
505        unsigned code below is actually shorter than the old code. :-)
506     */
507
508     SvIV_please_nomg(svr);
509
510     if (SvIOK(svr)) {
511         /* Unless the left argument is integer in range we are going to have to
512            use NV maths. Hence only attempt to coerce the right argument if
513            we know the left is integer.  */
514         register UV auv = 0;
515         bool auvok = FALSE;
516         bool a_valid = 0;
517
518         if (!useleft) {
519             auv = 0;
520             a_valid = auvok = 1;
521             /* left operand is undef, treat as zero. + 0 is identity,
522                Could SETi or SETu right now, but space optimise by not adding
523                lots of code to speed up what is probably a rarish case.  */
524         } else {
525             /* Left operand is defined, so is it IV? */
526             SvIV_please_nomg(svl);
527             if (SvIOK(svl)) {
528                 if ((auvok = SvUOK(svl)))
529                     auv = SvUVX(svl);
530                 else {
531                     register const IV aiv = SvIVX(svl);
532                     if (aiv >= 0) {
533                         auv = aiv;
534                         auvok = 1;      /* Now acting as a sign flag.  */
535                     } else { /* 2s complement assumption for IV_MIN */
536                         auv = (UV)-aiv;
537                     }
538                 }
539                 a_valid = 1;
540             }
541         }
542         if (a_valid) {
543             bool result_good = 0;
544             UV result;
545             register UV buv;
546             bool buvok = SvUOK(svr);
547         
548             if (buvok)
549                 buv = SvUVX(svr);
550             else {
551                 register const IV biv = SvIVX(svr);
552                 if (biv >= 0) {
553                     buv = biv;
554                     buvok = 1;
555                 } else
556                     buv = (UV)-biv;
557             }
558             /* ?uvok if value is >= 0. basically, flagged as UV if it's +ve,
559                else "IV" now, independent of how it came in.
560                if a, b represents positive, A, B negative, a maps to -A etc
561                a + b =>  (a + b)
562                A + b => -(a - b)
563                a + B =>  (a - b)
564                A + B => -(a + b)
565                all UV maths. negate result if A negative.
566                add if signs same, subtract if signs differ. */
567
568             if (auvok ^ buvok) {
569                 /* Signs differ.  */
570                 if (auv >= buv) {
571                     result = auv - buv;
572                     /* Must get smaller */
573                     if (result <= auv)
574                         result_good = 1;
575                 } else {
576                     result = buv - auv;
577                     if (result <= buv) {
578                         /* result really should be -(auv-buv). as its negation
579                            of true value, need to swap our result flag  */
580                         auvok = !auvok;
581                         result_good = 1;
582                     }
583                 }
584             } else {
585                 /* Signs same */
586                 result = auv + buv;
587                 if (result >= auv)
588                     result_good = 1;
589             }
590             if (result_good) {
591                 SP--;
592                 if (auvok)
593                     SETu( result );
594                 else {
595                     /* Negate result */
596                     if (result <= (UV)IV_MIN)
597                         SETi( -(IV)result );
598                     else {
599                         /* result valid, but out of range for IV.  */
600                         SETn( -(NV)result );
601                     }
602                 }
603                 RETURN;
604             } /* Overflow, drop through to NVs.  */
605         }
606     }
607 #endif
608     {
609         NV value = SvNV_nomg(svr);
610         (void)POPs;
611         if (!useleft) {
612             /* left operand is undef, treat as zero. + 0.0 is identity. */
613             SETn(value);
614             RETURN;
615         }
616         SETn( value + SvNV_nomg(svl) );
617         RETURN;
618     }
619 }
620
621 PP(pp_aelemfast)
622 {
623     dVAR; dSP;
624     AV * const av = PL_op->op_type == OP_AELEMFAST_LEX
625         ? MUTABLE_AV(PAD_SV(PL_op->op_targ)) : GvAVn(cGVOP_gv);
626     const U32 lval = PL_op->op_flags & OPf_MOD;
627     SV** const svp = av_fetch(av, PL_op->op_private, lval);
628     SV *sv = (svp ? *svp : &PL_sv_undef);
629     EXTEND(SP, 1);
630     if (!lval && SvRMAGICAL(av) && SvGMAGICAL(sv)) /* see note in pp_helem() */
631         mg_get(sv);
632     PUSHs(sv);
633     RETURN;
634 }
635
636 PP(pp_join)
637 {
638     dVAR; dSP; dMARK; dTARGET;
639     MARK++;
640     do_join(TARG, *MARK, MARK, SP);
641     SP = MARK;
642     SETs(TARG);
643     RETURN;
644 }
645
646 PP(pp_pushre)
647 {
648     dVAR; dSP;
649 #ifdef DEBUGGING
650     /*
651      * We ass_u_me that LvTARGOFF() comes first, and that two STRLENs
652      * will be enough to hold an OP*.
653      */
654     SV* const sv = sv_newmortal();
655     sv_upgrade(sv, SVt_PVLV);
656     LvTYPE(sv) = '/';
657     Copy(&PL_op, &LvTARGOFF(sv), 1, OP*);
658     XPUSHs(sv);
659 #else
660     XPUSHs(MUTABLE_SV(PL_op));
661 #endif
662     RETURN;
663 }
664
665 /* Oversized hot code. */
666
667 PP(pp_print)
668 {
669     dVAR; dSP; dMARK; dORIGMARK;
670     register PerlIO *fp;
671     MAGIC *mg;
672     GV * const gv
673         = (PL_op->op_flags & OPf_STACKED) ? MUTABLE_GV(*++MARK) : PL_defoutgv;
674     IO *io = GvIO(gv);
675
676     if (io
677         && (mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar)))
678     {
679       had_magic:
680         if (MARK == ORIGMARK) {
681             /* If using default handle then we need to make space to
682              * pass object as 1st arg, so move other args up ...
683              */
684             MEXTEND(SP, 1);
685             ++MARK;
686             Move(MARK, MARK + 1, (SP - MARK) + 1, SV*);
687             ++SP;
688         }
689         return Perl_tied_method(aTHX_ "PRINT", mark - 1, MUTABLE_SV(io),
690                                 mg,
691                                 (G_SCALAR | TIED_METHOD_ARGUMENTS_ON_STACK
692                                  | (PL_op->op_type == OP_SAY
693                                     ? TIED_METHOD_SAY : 0)), sp - mark);
694     }
695     if (!io) {
696         if ( gv && GvEGVx(gv) && (io = GvIO(GvEGV(gv)))
697             && (mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar)))
698             goto had_magic;
699         report_evil_fh(gv);
700         SETERRNO(EBADF,RMS_IFI);
701         goto just_say_no;
702     }
703     else if (!(fp = IoOFP(io))) {
704         if (IoIFP(io))
705             report_wrongway_fh(gv, '<');
706         else
707             report_evil_fh(gv);
708         SETERRNO(EBADF,IoIFP(io)?RMS_FAC:RMS_IFI);
709         goto just_say_no;
710     }
711     else {
712         SV * const ofs = GvSV(PL_ofsgv); /* $, */
713         MARK++;
714         if (ofs && (SvGMAGICAL(ofs) || SvOK(ofs))) {
715             while (MARK <= SP) {
716                 if (!do_print(*MARK, fp))
717                     break;
718                 MARK++;
719                 if (MARK <= SP) {
720                     /* don't use 'ofs' here - it may be invalidated by magic callbacks */
721                     if (!do_print(GvSV(PL_ofsgv), fp)) {
722                         MARK--;
723                         break;
724                     }
725                 }
726             }
727         }
728         else {
729             while (MARK <= SP) {
730                 if (!do_print(*MARK, fp))
731                     break;
732                 MARK++;
733             }
734         }
735         if (MARK <= SP)
736             goto just_say_no;
737         else {
738             if (PL_op->op_type == OP_SAY) {
739                 if (PerlIO_write(fp, "\n", 1) == 0 || PerlIO_error(fp))
740                     goto just_say_no;
741             }
742             else if (PL_ors_sv && SvOK(PL_ors_sv))
743                 if (!do_print(PL_ors_sv, fp)) /* $\ */
744                     goto just_say_no;
745
746             if (IoFLAGS(io) & IOf_FLUSH)
747                 if (PerlIO_flush(fp) == EOF)
748                     goto just_say_no;
749         }
750     }
751     SP = ORIGMARK;
752     XPUSHs(&PL_sv_yes);
753     RETURN;
754
755   just_say_no:
756     SP = ORIGMARK;
757     XPUSHs(&PL_sv_undef);
758     RETURN;
759 }
760
761 PP(pp_rv2av)
762 {
763     dVAR; dSP; dTOPss;
764     const I32 gimme = GIMME_V;
765     static const char an_array[] = "an ARRAY";
766     static const char a_hash[] = "a HASH";
767     const bool is_pp_rv2av = PL_op->op_type == OP_RV2AV;
768     const svtype type = is_pp_rv2av ? SVt_PVAV : SVt_PVHV;
769
770     SvGETMAGIC(sv);
771     if (SvROK(sv)) {
772         if (SvAMAGIC(sv)) {
773             sv = amagic_deref_call(sv, is_pp_rv2av ? to_av_amg : to_hv_amg);
774         }
775         sv = SvRV(sv);
776         if (SvTYPE(sv) != type)
777             /* diag_listed_as: Not an ARRAY reference */
778             DIE(aTHX_ "Not %s reference", is_pp_rv2av ? an_array : a_hash);
779         if (PL_op->op_flags & OPf_REF) {
780             SETs(sv);
781             RETURN;
782         }
783         else if (PL_op->op_private & OPpMAYBE_LVSUB) {
784           const I32 flags = is_lvalue_sub();
785           if (flags && !(flags & OPpENTERSUB_INARGS)) {
786             if (gimme != G_ARRAY)
787                 goto croak_cant_return;
788             SETs(sv);
789             RETURN;
790           }
791         }
792         else if (PL_op->op_flags & OPf_MOD
793                 && PL_op->op_private & OPpLVAL_INTRO)
794             Perl_croak(aTHX_ "%s", PL_no_localize_ref);
795     }
796     else {
797         if (SvTYPE(sv) == type) {
798             if (PL_op->op_flags & OPf_REF) {
799                 SETs(sv);
800                 RETURN;
801             }
802             else if (LVRET) {
803                 if (gimme != G_ARRAY)
804                     goto croak_cant_return;
805                 SETs(sv);
806                 RETURN;
807             }
808         }
809         else {
810             GV *gv;
811         
812             if (!isGV_with_GP(sv)) {
813                 gv = Perl_softref2xv(aTHX_ sv, is_pp_rv2av ? an_array : a_hash,
814                                      type, &sp);
815                 if (!gv)
816                     RETURN;
817             }
818             else {
819                 gv = MUTABLE_GV(sv);
820             }
821             sv = is_pp_rv2av ? MUTABLE_SV(GvAVn(gv)) : MUTABLE_SV(GvHVn(gv));
822             if (PL_op->op_private & OPpLVAL_INTRO)
823                 sv = is_pp_rv2av ? MUTABLE_SV(save_ary(gv)) : MUTABLE_SV(save_hash(gv));
824             if (PL_op->op_flags & OPf_REF) {
825                 SETs(sv);
826                 RETURN;
827             }
828             else if (PL_op->op_private & OPpMAYBE_LVSUB) {
829               const I32 flags = is_lvalue_sub();
830               if (flags && !(flags & OPpENTERSUB_INARGS)) {
831                 if (gimme != G_ARRAY)
832                     goto croak_cant_return;
833                 SETs(sv);
834                 RETURN;
835               }
836             }
837         }
838     }
839
840     if (is_pp_rv2av) {
841         AV *const av = MUTABLE_AV(sv);
842         /* The guts of pp_rv2av, with no intending change to preserve history
843            (until such time as we get tools that can do blame annotation across
844            whitespace changes.  */
845         if (gimme == G_ARRAY) {
846             const I32 maxarg = AvFILL(av) + 1;
847             (void)POPs;                 /* XXXX May be optimized away? */
848             EXTEND(SP, maxarg);
849             if (SvRMAGICAL(av)) {
850                 U32 i;
851                 for (i=0; i < (U32)maxarg; i++) {
852                     SV ** const svp = av_fetch(av, i, FALSE);
853                     /* See note in pp_helem, and bug id #27839 */
854                     SP[i+1] = svp
855                         ? SvGMAGICAL(*svp) ? (mg_get(*svp), *svp) : *svp
856                         : &PL_sv_undef;
857                 }
858             }
859             else {
860                 Copy(AvARRAY(av), SP+1, maxarg, SV*);
861             }
862             SP += maxarg;
863         }
864         else if (gimme == G_SCALAR) {
865             dTARGET;
866             const I32 maxarg = AvFILL(av) + 1;
867             SETi(maxarg);
868         }
869     } else {
870         /* The guts of pp_rv2hv  */
871         if (gimme == G_ARRAY) { /* array wanted */
872             *PL_stack_sp = sv;
873             return Perl_do_kv(aTHX);
874         }
875         else if (gimme == G_SCALAR) {
876             dTARGET;
877             TARG = Perl_hv_scalar(aTHX_ MUTABLE_HV(sv));
878             SPAGAIN;
879             SETTARG;
880         }
881     }
882     RETURN;
883
884  croak_cant_return:
885     Perl_croak(aTHX_ "Can't return %s to lvalue scalar context",
886                is_pp_rv2av ? "array" : "hash");
887     RETURN;
888 }
889
890 STATIC void
891 S_do_oddball(pTHX_ HV *hash, SV **relem, SV **firstrelem)
892 {
893     dVAR;
894
895     PERL_ARGS_ASSERT_DO_ODDBALL;
896
897     if (*relem) {
898         SV *tmpstr;
899         const HE *didstore;
900
901         if (ckWARN(WARN_MISC)) {
902             const char *err;
903             if (relem == firstrelem &&
904                 SvROK(*relem) &&
905                 (SvTYPE(SvRV(*relem)) == SVt_PVAV ||
906                  SvTYPE(SvRV(*relem)) == SVt_PVHV))
907             {
908                 err = "Reference found where even-sized list expected";
909             }
910             else
911                 err = "Odd number of elements in hash assignment";
912             Perl_warner(aTHX_ packWARN(WARN_MISC), "%s", err);
913         }
914
915         tmpstr = newSV(0);
916         didstore = hv_store_ent(hash,*relem,tmpstr,0);
917         if (SvMAGICAL(hash)) {
918             if (SvSMAGICAL(tmpstr))
919                 mg_set(tmpstr);
920             if (!didstore)
921                 sv_2mortal(tmpstr);
922         }
923         TAINT_NOT;
924     }
925 }
926
927 PP(pp_aassign)
928 {
929     dVAR; dSP;
930     SV **lastlelem = PL_stack_sp;
931     SV **lastrelem = PL_stack_base + POPMARK;
932     SV **firstrelem = PL_stack_base + POPMARK + 1;
933     SV **firstlelem = lastrelem + 1;
934
935     register SV **relem;
936     register SV **lelem;
937
938     register SV *sv;
939     register AV *ary;
940
941     I32 gimme;
942     HV *hash;
943     I32 i;
944     int magic;
945     int duplicates = 0;
946     SV **firsthashrelem = NULL; /* "= 0" keeps gcc 2.95 quiet  */
947
948     PL_delaymagic = DM_DELAY;           /* catch simultaneous items */
949     gimme = GIMME_V;
950
951     /* If there's a common identifier on both sides we have to take
952      * special care that assigning the identifier on the left doesn't
953      * clobber a value on the right that's used later in the list.
954      * Don't bother if LHS is just an empty hash or array.
955      */
956
957     if (    (PL_op->op_private & OPpASSIGN_COMMON)
958         &&  (
959                firstlelem != lastlelem
960             || ! ((sv = *firstlelem))
961             || SvMAGICAL(sv)
962             || ! (SvTYPE(sv) == SVt_PVAV || SvTYPE(sv) == SVt_PVHV)
963             || (SvTYPE(sv) == SVt_PVAV && AvFILL((AV*)sv) != -1)
964             || (SvTYPE(sv) == SVt_PVHV && HvUSEDKEYS((HV*)sv) != 0)
965             )
966     ) {
967         EXTEND_MORTAL(lastrelem - firstrelem + 1);
968         for (relem = firstrelem; relem <= lastrelem; relem++) {
969             if ((sv = *relem)) {
970                 TAINT_NOT;      /* Each item is independent */
971
972                 /* Dear TODO test in t/op/sort.t, I love you.
973                    (It's relying on a panic, not a "semi-panic" from newSVsv()
974                    and then an assertion failure below.)  */
975                 if (SvIS_FREED(sv)) {
976                     Perl_croak(aTHX_ "panic: attempt to copy freed scalar %p",
977                                (void*)sv);
978                 }
979                 /* Specifically *not* sv_mortalcopy(), as that will steal TEMPs,
980                    and we need a second copy of a temp here.  */
981                 *relem = sv_2mortal(newSVsv(sv));
982             }
983         }
984     }
985
986     relem = firstrelem;
987     lelem = firstlelem;
988     ary = NULL;
989     hash = NULL;
990
991     while (lelem <= lastlelem) {
992         TAINT_NOT;              /* Each item stands on its own, taintwise. */
993         sv = *lelem++;
994         switch (SvTYPE(sv)) {
995         case SVt_PVAV:
996             ary = MUTABLE_AV(sv);
997             magic = SvMAGICAL(ary) != 0;
998             ENTER;
999             SAVEFREESV(SvREFCNT_inc_simple_NN(sv));
1000             av_clear(ary);
1001             av_extend(ary, lastrelem - relem);
1002             i = 0;
1003             while (relem <= lastrelem) {        /* gobble up all the rest */
1004                 SV **didstore;
1005                 assert(*relem);
1006                 sv = newSV(0);
1007                 sv_setsv(sv, *relem);
1008                 *(relem++) = sv;
1009                 didstore = av_store(ary,i++,sv);
1010                 if (magic) {
1011                     if (SvSMAGICAL(sv))
1012                         mg_set(sv);
1013                     if (!didstore)
1014                         sv_2mortal(sv);
1015                 }
1016                 TAINT_NOT;
1017             }
1018             if (PL_delaymagic & DM_ARRAY_ISA)
1019                 SvSETMAGIC(MUTABLE_SV(ary));
1020             LEAVE;
1021             break;
1022         case SVt_PVHV: {                                /* normal hash */
1023                 SV *tmpstr;
1024                 SV** topelem = relem;
1025
1026                 hash = MUTABLE_HV(sv);
1027                 magic = SvMAGICAL(hash) != 0;
1028                 ENTER;
1029                 SAVEFREESV(SvREFCNT_inc_simple_NN(sv));
1030                 hv_clear(hash);
1031                 firsthashrelem = relem;
1032
1033                 while (relem < lastrelem) {     /* gobble up all the rest */
1034                     HE *didstore;
1035                     sv = *relem ? *relem : &PL_sv_no;
1036                     relem++;
1037                     tmpstr = newSV(0);
1038                     if (*relem)
1039                         sv_setsv(tmpstr,*relem);        /* value */
1040                     relem++;
1041                     if (gimme != G_VOID) {
1042                         if (hv_exists_ent(hash, sv, 0))
1043                             /* key overwrites an existing entry */
1044                             duplicates += 2;
1045                         else
1046                         if (gimme == G_ARRAY) {
1047                             /* copy element back: possibly to an earlier
1048                              * stack location if we encountered dups earlier */
1049                             *topelem++ = sv;
1050                             *topelem++ = tmpstr;
1051                         }
1052                     }
1053                     didstore = hv_store_ent(hash,sv,tmpstr,0);
1054                     if (magic) {
1055                         if (SvSMAGICAL(tmpstr))
1056                             mg_set(tmpstr);
1057                         if (!didstore)
1058                             sv_2mortal(tmpstr);
1059                     }
1060                     TAINT_NOT;
1061                 }
1062                 if (relem == lastrelem) {
1063                     do_oddball(hash, relem, firstrelem);
1064                     relem++;
1065                 }
1066                 LEAVE;
1067             }
1068             break;
1069         default:
1070             if (SvIMMORTAL(sv)) {
1071                 if (relem <= lastrelem)
1072                     relem++;
1073                 break;
1074             }
1075             if (relem <= lastrelem) {
1076                 if (
1077                   SvTEMP(sv) && !SvSMAGICAL(sv) && SvREFCNT(sv) == 1 &&
1078                   (!isGV_with_GP(sv) || SvFAKE(sv)) && ckWARN(WARN_MISC)
1079                 )
1080                     Perl_warner(aTHX_
1081                        packWARN(WARN_MISC),
1082                       "Useless assignment to a temporary"
1083                     );
1084                 sv_setsv(sv, *relem);
1085                 *(relem++) = sv;
1086             }
1087             else
1088                 sv_setsv(sv, &PL_sv_undef);
1089             SvSETMAGIC(sv);
1090             break;
1091         }
1092     }
1093     if (PL_delaymagic & ~DM_DELAY) {
1094         /* Will be used to set PL_tainting below */
1095         UV tmp_uid  = PerlProc_getuid();
1096         UV tmp_euid = PerlProc_geteuid();
1097         UV tmp_gid  = PerlProc_getgid();
1098         UV tmp_egid = PerlProc_getegid();
1099
1100         if (PL_delaymagic & DM_UID) {
1101 #ifdef HAS_SETRESUID
1102             (void)setresuid((PL_delaymagic & DM_RUID) ? PL_delaymagic_uid  : (Uid_t)-1,
1103                             (PL_delaymagic & DM_EUID) ? PL_delaymagic_euid : (Uid_t)-1,
1104                             (Uid_t)-1);
1105 #else
1106 #  ifdef HAS_SETREUID
1107             (void)setreuid((PL_delaymagic & DM_RUID) ? PL_delaymagic_uid  : (Uid_t)-1,
1108                            (PL_delaymagic & DM_EUID) ? PL_delaymagic_euid : (Uid_t)-1);
1109 #  else
1110 #    ifdef HAS_SETRUID
1111             if ((PL_delaymagic & DM_UID) == DM_RUID) {
1112                 (void)setruid(PL_delaymagic_uid);
1113                 PL_delaymagic &= ~DM_RUID;
1114             }
1115 #    endif /* HAS_SETRUID */
1116 #    ifdef HAS_SETEUID
1117             if ((PL_delaymagic & DM_UID) == DM_EUID) {
1118                 (void)seteuid(PL_delaymagic_euid);
1119                 PL_delaymagic &= ~DM_EUID;
1120             }
1121 #    endif /* HAS_SETEUID */
1122             if (PL_delaymagic & DM_UID) {
1123                 if (PL_delaymagic_uid != PL_delaymagic_euid)
1124                     DIE(aTHX_ "No setreuid available");
1125                 (void)PerlProc_setuid(PL_delaymagic_uid);
1126             }
1127 #  endif /* HAS_SETREUID */
1128 #endif /* HAS_SETRESUID */
1129             tmp_uid  = PerlProc_getuid();
1130             tmp_euid = PerlProc_geteuid();
1131         }
1132         if (PL_delaymagic & DM_GID) {
1133 #ifdef HAS_SETRESGID
1134             (void)setresgid((PL_delaymagic & DM_RGID) ? PL_delaymagic_gid  : (Gid_t)-1,
1135                             (PL_delaymagic & DM_EGID) ? PL_delaymagic_egid : (Gid_t)-1,
1136                             (Gid_t)-1);
1137 #else
1138 #  ifdef HAS_SETREGID
1139             (void)setregid((PL_delaymagic & DM_RGID) ? PL_delaymagic_gid  : (Gid_t)-1,
1140                            (PL_delaymagic & DM_EGID) ? PL_delaymagic_egid : (Gid_t)-1);
1141 #  else
1142 #    ifdef HAS_SETRGID
1143             if ((PL_delaymagic & DM_GID) == DM_RGID) {
1144                 (void)setrgid(PL_delaymagic_gid);
1145                 PL_delaymagic &= ~DM_RGID;
1146             }
1147 #    endif /* HAS_SETRGID */
1148 #    ifdef HAS_SETEGID
1149             if ((PL_delaymagic & DM_GID) == DM_EGID) {
1150                 (void)setegid(PL_delaymagic_egid);
1151                 PL_delaymagic &= ~DM_EGID;
1152             }
1153 #    endif /* HAS_SETEGID */
1154             if (PL_delaymagic & DM_GID) {
1155                 if (PL_delaymagic_gid != PL_delaymagic_egid)
1156                     DIE(aTHX_ "No setregid available");
1157                 (void)PerlProc_setgid(PL_delaymagic_gid);
1158             }
1159 #  endif /* HAS_SETREGID */
1160 #endif /* HAS_SETRESGID */
1161             tmp_gid  = PerlProc_getgid();
1162             tmp_egid = PerlProc_getegid();
1163         }
1164         PL_tainting |= (tmp_uid && (tmp_euid != tmp_uid || tmp_egid != tmp_gid));
1165     }
1166     PL_delaymagic = 0;
1167
1168     if (gimme == G_VOID)
1169         SP = firstrelem - 1;
1170     else if (gimme == G_SCALAR) {
1171         dTARGET;
1172         SP = firstrelem;
1173         SETi(lastrelem - firstrelem + 1 - duplicates);
1174     }
1175     else {
1176         if (ary)
1177             SP = lastrelem;
1178         else if (hash) {
1179             if (duplicates) {
1180                 /* at this point we have removed the duplicate key/value
1181                  * pairs from the stack, but the remaining values may be
1182                  * wrong; i.e. with (a 1 a 2 b 3) on the stack we've removed
1183                  * the (a 2), but the stack now probably contains
1184                  * (a <freed> b 3), because { hv_save(a,1); hv_save(a,2) }
1185                  * obliterates the earlier key. So refresh all values. */
1186                 lastrelem -= duplicates;
1187                 relem = firsthashrelem;
1188                 while (relem < lastrelem) {
1189                     HE *he;
1190                     sv = *relem++;
1191                     he = hv_fetch_ent(hash, sv, 0, 0);
1192                     *relem++ = (he ? HeVAL(he) : &PL_sv_undef);
1193                 }
1194             }
1195             SP = lastrelem;
1196         }
1197         else
1198             SP = firstrelem + (lastlelem - firstlelem);
1199         lelem = firstlelem + (relem - firstrelem);
1200         while (relem <= SP)
1201             *relem++ = (lelem <= lastlelem) ? *lelem++ : &PL_sv_undef;
1202     }
1203
1204     RETURN;
1205 }
1206
1207 PP(pp_qr)
1208 {
1209     dVAR; dSP;
1210     register PMOP * const pm = cPMOP;
1211     REGEXP * rx = PM_GETRE(pm);
1212     SV * const pkg = rx ? CALLREG_PACKAGE(rx) : NULL;
1213     SV * const rv = sv_newmortal();
1214
1215     SvUPGRADE(rv, SVt_IV);
1216     /* For a subroutine describing itself as "This is a hacky workaround" I'm
1217        loathe to use it here, but it seems to be the right fix. Or close.
1218        The key part appears to be that it's essential for pp_qr to return a new
1219        object (SV), which implies that there needs to be an effective way to
1220        generate a new SV from the existing SV that is pre-compiled in the
1221        optree.  */
1222     SvRV_set(rv, MUTABLE_SV(reg_temp_copy(NULL, rx)));
1223     SvROK_on(rv);
1224
1225     if (pkg) {
1226         HV *const stash = gv_stashsv(pkg, GV_ADD);
1227         SvREFCNT_dec(pkg);
1228         (void)sv_bless(rv, stash);
1229     }
1230
1231     if (RX_EXTFLAGS(rx) & RXf_TAINTED) {
1232         SvTAINTED_on(rv);
1233         SvTAINTED_on(SvRV(rv));
1234     }
1235     XPUSHs(rv);
1236     RETURN;
1237 }
1238
1239 PP(pp_match)
1240 {
1241     dVAR; dSP; dTARG;
1242     register PMOP *pm = cPMOP;
1243     PMOP *dynpm = pm;
1244     register const char *t;
1245     register const char *s;
1246     const char *strend;
1247     I32 global;
1248     U8 r_flags = REXEC_CHECKED;
1249     const char *truebase;                       /* Start of string  */
1250     register REGEXP *rx = PM_GETRE(pm);
1251     bool rxtainted;
1252     const I32 gimme = GIMME;
1253     STRLEN len;
1254     I32 minmatch = 0;
1255     const I32 oldsave = PL_savestack_ix;
1256     I32 update_minmatch = 1;
1257     I32 had_zerolen = 0;
1258     U32 gpos = 0;
1259
1260     if (PL_op->op_flags & OPf_STACKED)
1261         TARG = POPs;
1262     else if (PL_op->op_private & OPpTARGET_MY)
1263         GETTARGET;
1264     else {
1265         TARG = DEFSV;
1266         EXTEND(SP,1);
1267     }
1268
1269     PUTBACK;                            /* EVAL blocks need stack_sp. */
1270     /* Skip get-magic if this is a qr// clone, because regcomp has
1271        already done it. */
1272     s = ((struct regexp *)SvANY(rx))->mother_re
1273          ? SvPV_nomg_const(TARG, len)
1274          : SvPV_const(TARG, len);
1275     if (!s)
1276         DIE(aTHX_ "panic: pp_match");
1277     strend = s + len;
1278     rxtainted = ((RX_EXTFLAGS(rx) & RXf_TAINTED) ||
1279                  (PL_tainted && (pm->op_pmflags & PMf_RETAINT)));
1280     TAINT_NOT;
1281
1282     RX_MATCH_UTF8_set(rx, DO_UTF8(TARG));
1283
1284     /* PMdf_USED is set after a ?? matches once */
1285     if (
1286 #ifdef USE_ITHREADS
1287         SvREADONLY(PL_regex_pad[pm->op_pmoffset])
1288 #else
1289         pm->op_pmflags & PMf_USED
1290 #endif
1291     ) {
1292       failure:
1293         if (gimme == G_ARRAY)
1294             RETURN;
1295         RETPUSHNO;
1296     }
1297
1298
1299
1300     /* empty pattern special-cased to use last successful pattern if possible */
1301     if (!RX_PRELEN(rx) && PL_curpm) {
1302         pm = PL_curpm;
1303         rx = PM_GETRE(pm);
1304     }
1305
1306     if (RX_MINLEN(rx) > (I32)len)
1307         goto failure;
1308
1309     truebase = t = s;
1310
1311     /* XXXX What part of this is needed with true \G-support? */
1312     if ((global = dynpm->op_pmflags & PMf_GLOBAL)) {
1313         RX_OFFS(rx)[0].start = -1;
1314         if (SvTYPE(TARG) >= SVt_PVMG && SvMAGIC(TARG)) {
1315             MAGIC* const mg = mg_find(TARG, PERL_MAGIC_regex_global);
1316             if (mg && mg->mg_len >= 0) {
1317                 if (!(RX_EXTFLAGS(rx) & RXf_GPOS_SEEN))
1318                     RX_OFFS(rx)[0].end = RX_OFFS(rx)[0].start = mg->mg_len;
1319                 else if (RX_EXTFLAGS(rx) & RXf_ANCH_GPOS) {
1320                     r_flags |= REXEC_IGNOREPOS;
1321                     RX_OFFS(rx)[0].end = RX_OFFS(rx)[0].start = mg->mg_len;
1322                 } else if (RX_EXTFLAGS(rx) & RXf_GPOS_FLOAT) 
1323                     gpos = mg->mg_len;
1324                 else 
1325                     RX_OFFS(rx)[0].end = RX_OFFS(rx)[0].start = mg->mg_len;
1326                 minmatch = (mg->mg_flags & MGf_MINMATCH) ? RX_GOFS(rx) + 1 : 0;
1327                 update_minmatch = 0;
1328             }
1329         }
1330     }
1331     /* XXX: comment out !global get safe $1 vars after a
1332        match, BUT be aware that this leads to dramatic slowdowns on
1333        /g matches against large strings.  So far a solution to this problem
1334        appears to be quite tricky.
1335        Test for the unsafe vars are TODO for now. */
1336     if (       (!global && RX_NPARENS(rx))
1337             || SvTEMP(TARG) || SvAMAGIC(TARG) || PL_sawampersand
1338             || (RX_EXTFLAGS(rx) & (RXf_EVAL_SEEN|RXf_PMf_KEEPCOPY)))
1339         r_flags |= REXEC_COPY_STR;
1340     if (SvSCREAM(TARG))
1341         r_flags |= REXEC_SCREAM;
1342
1343   play_it_again:
1344     if (global && RX_OFFS(rx)[0].start != -1) {
1345         t = s = RX_OFFS(rx)[0].end + truebase - RX_GOFS(rx);
1346         if ((s + RX_MINLEN(rx)) > strend || s < truebase)
1347             goto nope;
1348         if (update_minmatch++)
1349             minmatch = had_zerolen;
1350     }
1351     if (RX_EXTFLAGS(rx) & RXf_USE_INTUIT &&
1352         DO_UTF8(TARG) == (RX_UTF8(rx) != 0)) {
1353         /* FIXME - can PL_bostr be made const char *?  */
1354         PL_bostr = (char *)truebase;
1355         s = CALLREG_INTUIT_START(rx, TARG, (char *)s, (char *)strend, r_flags, NULL);
1356
1357         if (!s)
1358             goto nope;
1359         if ( (RX_EXTFLAGS(rx) & RXf_CHECK_ALL)
1360              && !PL_sawampersand
1361              && !(RX_EXTFLAGS(rx) & RXf_PMf_KEEPCOPY)
1362              && ((RX_EXTFLAGS(rx) & RXf_NOSCAN)
1363                  || !((RX_EXTFLAGS(rx) & RXf_INTUIT_TAIL)
1364                       && (r_flags & REXEC_SCREAM)))
1365              && !SvROK(TARG))   /* Cannot trust since INTUIT cannot guess ^ */
1366             goto yup;
1367     }
1368     if (!CALLREGEXEC(rx, (char*)s, (char *)strend, (char*)truebase,
1369                      minmatch, TARG, NUM2PTR(void*, gpos), r_flags))
1370         goto ret_no;
1371
1372     PL_curpm = pm;
1373     if (dynpm->op_pmflags & PMf_ONCE) {
1374 #ifdef USE_ITHREADS
1375         SvREADONLY_on(PL_regex_pad[dynpm->op_pmoffset]);
1376 #else
1377         dynpm->op_pmflags |= PMf_USED;
1378 #endif
1379     }
1380
1381   gotcha:
1382     if (rxtainted)
1383         RX_MATCH_TAINTED_on(rx);
1384     TAINT_IF(RX_MATCH_TAINTED(rx));
1385     if (gimme == G_ARRAY) {
1386         const I32 nparens = RX_NPARENS(rx);
1387         I32 i = (global && !nparens) ? 1 : 0;
1388
1389         SPAGAIN;                        /* EVAL blocks could move the stack. */
1390         EXTEND(SP, nparens + i);
1391         EXTEND_MORTAL(nparens + i);
1392         for (i = !i; i <= nparens; i++) {
1393             PUSHs(sv_newmortal());
1394             if ((RX_OFFS(rx)[i].start != -1) && RX_OFFS(rx)[i].end != -1 ) {
1395                 const I32 len = RX_OFFS(rx)[i].end - RX_OFFS(rx)[i].start;
1396                 s = RX_OFFS(rx)[i].start + truebase;
1397                 if (RX_OFFS(rx)[i].end < 0 || RX_OFFS(rx)[i].start < 0 ||
1398                     len < 0 || len > strend - s)
1399                     DIE(aTHX_ "panic: pp_match start/end pointers, i=%ld, "
1400                         "start=%ld, end=%ld, s=%p, strend=%p, len=%"UVuf,
1401                         (long) i, (long) RX_OFFS(rx)[i].start,
1402                         (long)RX_OFFS(rx)[i].end, s, strend, (UV) len);
1403                 sv_setpvn(*SP, s, len);
1404                 if (DO_UTF8(TARG) && is_utf8_string((U8*)s, len))
1405                     SvUTF8_on(*SP);
1406             }
1407         }
1408         if (global) {
1409             if (dynpm->op_pmflags & PMf_CONTINUE) {
1410                 MAGIC* mg = NULL;
1411                 if (SvTYPE(TARG) >= SVt_PVMG && SvMAGIC(TARG))
1412                     mg = mg_find(TARG, PERL_MAGIC_regex_global);
1413                 if (!mg) {
1414 #ifdef PERL_OLD_COPY_ON_WRITE
1415                     if (SvIsCOW(TARG))
1416                         sv_force_normal_flags(TARG, 0);
1417 #endif
1418                     mg = sv_magicext(TARG, NULL, PERL_MAGIC_regex_global,
1419                                      &PL_vtbl_mglob, NULL, 0);
1420                 }
1421                 if (RX_OFFS(rx)[0].start != -1) {
1422                     mg->mg_len = RX_OFFS(rx)[0].end;
1423                     if (RX_OFFS(rx)[0].start + RX_GOFS(rx) == (UV)RX_OFFS(rx)[0].end)
1424                         mg->mg_flags |= MGf_MINMATCH;
1425                     else
1426                         mg->mg_flags &= ~MGf_MINMATCH;
1427                 }
1428             }
1429             had_zerolen = (RX_OFFS(rx)[0].start != -1
1430                            && (RX_OFFS(rx)[0].start + RX_GOFS(rx)
1431                                == (UV)RX_OFFS(rx)[0].end));
1432             PUTBACK;                    /* EVAL blocks may use stack */
1433             r_flags |= REXEC_IGNOREPOS | REXEC_NOT_FIRST;
1434             goto play_it_again;
1435         }
1436         else if (!nparens)
1437             XPUSHs(&PL_sv_yes);
1438         LEAVE_SCOPE(oldsave);
1439         RETURN;
1440     }
1441     else {
1442         if (global) {
1443             MAGIC* mg;
1444             if (SvTYPE(TARG) >= SVt_PVMG && SvMAGIC(TARG))
1445                 mg = mg_find(TARG, PERL_MAGIC_regex_global);
1446             else
1447                 mg = NULL;
1448             if (!mg) {
1449 #ifdef PERL_OLD_COPY_ON_WRITE
1450                 if (SvIsCOW(TARG))
1451                     sv_force_normal_flags(TARG, 0);
1452 #endif
1453                 mg = sv_magicext(TARG, NULL, PERL_MAGIC_regex_global,
1454                                  &PL_vtbl_mglob, NULL, 0);
1455             }
1456             if (RX_OFFS(rx)[0].start != -1) {
1457                 mg->mg_len = RX_OFFS(rx)[0].end;
1458                 if (RX_OFFS(rx)[0].start + RX_GOFS(rx) == (UV)RX_OFFS(rx)[0].end)
1459                     mg->mg_flags |= MGf_MINMATCH;
1460                 else
1461                     mg->mg_flags &= ~MGf_MINMATCH;
1462             }
1463         }
1464         LEAVE_SCOPE(oldsave);
1465         RETPUSHYES;
1466     }
1467
1468 yup:                                    /* Confirmed by INTUIT */
1469     if (rxtainted)
1470         RX_MATCH_TAINTED_on(rx);
1471     TAINT_IF(RX_MATCH_TAINTED(rx));
1472     PL_curpm = pm;
1473     if (dynpm->op_pmflags & PMf_ONCE) {
1474 #ifdef USE_ITHREADS
1475         SvREADONLY_on(PL_regex_pad[dynpm->op_pmoffset]);
1476 #else
1477         dynpm->op_pmflags |= PMf_USED;
1478 #endif
1479     }
1480     if (RX_MATCH_COPIED(rx))
1481         Safefree(RX_SUBBEG(rx));
1482     RX_MATCH_COPIED_off(rx);
1483     RX_SUBBEG(rx) = NULL;
1484     if (global) {
1485         /* FIXME - should rx->subbeg be const char *?  */
1486         RX_SUBBEG(rx) = (char *) truebase;
1487         RX_OFFS(rx)[0].start = s - truebase;
1488         if (RX_MATCH_UTF8(rx)) {
1489             char * const t = (char*)utf8_hop((U8*)s, RX_MINLENRET(rx));
1490             RX_OFFS(rx)[0].end = t - truebase;
1491         }
1492         else {
1493             RX_OFFS(rx)[0].end = s - truebase + RX_MINLENRET(rx);
1494         }
1495         RX_SUBLEN(rx) = strend - truebase;
1496         goto gotcha;
1497     }
1498     if (PL_sawampersand || RX_EXTFLAGS(rx) & RXf_PMf_KEEPCOPY) {
1499         I32 off;
1500 #ifdef PERL_OLD_COPY_ON_WRITE
1501         if (SvIsCOW(TARG) || (SvFLAGS(TARG) & CAN_COW_MASK) == CAN_COW_FLAGS) {
1502             if (DEBUG_C_TEST) {
1503                 PerlIO_printf(Perl_debug_log,
1504                               "Copy on write: pp_match $& capture, type %d, truebase=%p, t=%p, difference %d\n",
1505                               (int) SvTYPE(TARG), (void*)truebase, (void*)t,
1506                               (int)(t-truebase));
1507             }
1508             RX_SAVED_COPY(rx) = sv_setsv_cow(RX_SAVED_COPY(rx), TARG);
1509             RX_SUBBEG(rx)
1510                 = (char *) SvPVX_const(RX_SAVED_COPY(rx)) + (t - truebase);
1511             assert (SvPOKp(RX_SAVED_COPY(rx)));
1512         } else
1513 #endif
1514         {
1515
1516             RX_SUBBEG(rx) = savepvn(t, strend - t);
1517 #ifdef PERL_OLD_COPY_ON_WRITE
1518             RX_SAVED_COPY(rx) = NULL;
1519 #endif
1520         }
1521         RX_SUBLEN(rx) = strend - t;
1522         RX_MATCH_COPIED_on(rx);
1523         off = RX_OFFS(rx)[0].start = s - t;
1524         RX_OFFS(rx)[0].end = off + RX_MINLENRET(rx);
1525     }
1526     else {                      /* startp/endp are used by @- @+. */
1527         RX_OFFS(rx)[0].start = s - truebase;
1528         RX_OFFS(rx)[0].end = s - truebase + RX_MINLENRET(rx);
1529     }
1530     /* including RX_NPARENS(rx) in the below code seems highly suspicious.
1531        -dmq */
1532     RX_NPARENS(rx) = RX_LASTPAREN(rx) = RX_LASTCLOSEPAREN(rx) = 0;      /* used by @-, @+, and $^N */
1533     LEAVE_SCOPE(oldsave);
1534     RETPUSHYES;
1535
1536 nope:
1537 ret_no:
1538     if (global && !(dynpm->op_pmflags & PMf_CONTINUE)) {
1539         if (SvTYPE(TARG) >= SVt_PVMG && SvMAGIC(TARG)) {
1540             MAGIC* const mg = mg_find(TARG, PERL_MAGIC_regex_global);
1541             if (mg)
1542                 mg->mg_len = -1;
1543         }
1544     }
1545     LEAVE_SCOPE(oldsave);
1546     if (gimme == G_ARRAY)
1547         RETURN;
1548     RETPUSHNO;
1549 }
1550
1551 OP *
1552 Perl_do_readline(pTHX)
1553 {
1554     dVAR; dSP; dTARGETSTACKED;
1555     register SV *sv;
1556     STRLEN tmplen = 0;
1557     STRLEN offset;
1558     PerlIO *fp;
1559     register IO * const io = GvIO(PL_last_in_gv);
1560     register const I32 type = PL_op->op_type;
1561     const I32 gimme = GIMME_V;
1562
1563     if (io) {
1564         const MAGIC *const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1565         if (mg) {
1566             Perl_tied_method(aTHX_ "READLINE", SP, MUTABLE_SV(io), mg, gimme, 0);
1567             if (gimme == G_SCALAR) {
1568                 SPAGAIN;
1569                 SvSetSV_nosteal(TARG, TOPs);
1570                 SETTARG;
1571             }
1572             return NORMAL;
1573         }
1574     }
1575     fp = NULL;
1576     if (io) {
1577         fp = IoIFP(io);
1578         if (!fp) {
1579             if (IoFLAGS(io) & IOf_ARGV) {
1580                 if (IoFLAGS(io) & IOf_START) {
1581                     IoLINES(io) = 0;
1582                     if (av_len(GvAVn(PL_last_in_gv)) < 0) {
1583                         IoFLAGS(io) &= ~IOf_START;
1584                         do_open(PL_last_in_gv,"-",1,FALSE,O_RDONLY,0,NULL);
1585                         sv_setpvs(GvSVn(PL_last_in_gv), "-");
1586                         SvSETMAGIC(GvSV(PL_last_in_gv));
1587                         fp = IoIFP(io);
1588                         goto have_fp;
1589                     }
1590                 }
1591                 fp = nextargv(PL_last_in_gv);
1592                 if (!fp) { /* Note: fp != IoIFP(io) */
1593                     (void)do_close(PL_last_in_gv, FALSE); /* now it does*/
1594                 }
1595             }
1596             else if (type == OP_GLOB)
1597                 fp = Perl_start_glob(aTHX_ POPs, io);
1598         }
1599         else if (type == OP_GLOB)
1600             SP--;
1601         else if (IoTYPE(io) == IoTYPE_WRONLY) {
1602             report_wrongway_fh(PL_last_in_gv, '>');
1603         }
1604     }
1605     if (!fp) {
1606         if ((!io || !(IoFLAGS(io) & IOf_START))
1607             && ckWARN2(WARN_GLOB, WARN_CLOSED))
1608         {
1609             if (type == OP_GLOB)
1610                 Perl_warner(aTHX_ packWARN(WARN_GLOB),
1611                             "glob failed (can't start child: %s)",
1612                             Strerror(errno));
1613             else
1614                 report_evil_fh(PL_last_in_gv);
1615         }
1616         if (gimme == G_SCALAR) {
1617             /* undef TARG, and push that undefined value */
1618             if (type != OP_RCATLINE) {
1619                 SV_CHECK_THINKFIRST_COW_DROP(TARG);
1620                 SvOK_off(TARG);
1621             }
1622             PUSHTARG;
1623         }
1624         RETURN;
1625     }
1626   have_fp:
1627     if (gimme == G_SCALAR) {
1628         sv = TARG;
1629         if (type == OP_RCATLINE && SvGMAGICAL(sv))
1630             mg_get(sv);
1631         if (SvROK(sv)) {
1632             if (type == OP_RCATLINE)
1633                 SvPV_force_nomg_nolen(sv);
1634             else
1635                 sv_unref(sv);
1636         }
1637         else if (isGV_with_GP(sv)) {
1638             SvPV_force_nomg_nolen(sv);
1639         }
1640         SvUPGRADE(sv, SVt_PV);
1641         tmplen = SvLEN(sv);     /* remember if already alloced */
1642         if (!tmplen && !SvREADONLY(sv)) {
1643             /* try short-buffering it. Please update t/op/readline.t
1644              * if you change the growth length.
1645              */
1646             Sv_Grow(sv, 80);
1647         }
1648         offset = 0;
1649         if (type == OP_RCATLINE && SvOK(sv)) {
1650             if (!SvPOK(sv)) {
1651                 SvPV_force_nomg_nolen(sv);
1652             }
1653             offset = SvCUR(sv);
1654         }
1655     }
1656     else {
1657         sv = sv_2mortal(newSV(80));
1658         offset = 0;
1659     }
1660
1661     /* This should not be marked tainted if the fp is marked clean */
1662 #define MAYBE_TAINT_LINE(io, sv) \
1663     if (!(IoFLAGS(io) & IOf_UNTAINT)) { \
1664         TAINT;                          \
1665         SvTAINTED_on(sv);               \
1666     }
1667
1668 /* delay EOF state for a snarfed empty file */
1669 #define SNARF_EOF(gimme,rs,io,sv) \
1670     (gimme != G_SCALAR || SvCUR(sv)                                     \
1671      || (IoFLAGS(io) & IOf_NOLINE) || !RsSNARF(rs))
1672
1673     for (;;) {
1674         PUTBACK;
1675         if (!sv_gets(sv, fp, offset)
1676             && (type == OP_GLOB
1677                 || SNARF_EOF(gimme, PL_rs, io, sv)
1678                 || PerlIO_error(fp)))
1679         {
1680             PerlIO_clearerr(fp);
1681             if (IoFLAGS(io) & IOf_ARGV) {
1682                 fp = nextargv(PL_last_in_gv);
1683                 if (fp)
1684                     continue;
1685                 (void)do_close(PL_last_in_gv, FALSE);
1686             }
1687             else if (type == OP_GLOB) {
1688                 if (!do_close(PL_last_in_gv, FALSE)) {
1689                     Perl_ck_warner(aTHX_ packWARN(WARN_GLOB),
1690                                    "glob failed (child exited with status %d%s)",
1691                                    (int)(STATUS_CURRENT >> 8),
1692                                    (STATUS_CURRENT & 0x80) ? ", core dumped" : "");
1693                 }
1694             }
1695             if (gimme == G_SCALAR) {
1696                 if (type != OP_RCATLINE) {
1697                     SV_CHECK_THINKFIRST_COW_DROP(TARG);
1698                     SvOK_off(TARG);
1699                 }
1700                 SPAGAIN;
1701                 PUSHTARG;
1702             }
1703             MAYBE_TAINT_LINE(io, sv);
1704             RETURN;
1705         }
1706         MAYBE_TAINT_LINE(io, sv);
1707         IoLINES(io)++;
1708         IoFLAGS(io) |= IOf_NOLINE;
1709         SvSETMAGIC(sv);
1710         SPAGAIN;
1711         XPUSHs(sv);
1712         if (type == OP_GLOB) {
1713             const char *t1;
1714
1715             if (SvCUR(sv) > 0 && SvCUR(PL_rs) > 0) {
1716                 char * const tmps = SvEND(sv) - 1;
1717                 if (*tmps == *SvPVX_const(PL_rs)) {
1718                     *tmps = '\0';
1719                     SvCUR_set(sv, SvCUR(sv) - 1);
1720                 }
1721             }
1722             for (t1 = SvPVX_const(sv); *t1; t1++)
1723                 if (!isALPHA(*t1) && !isDIGIT(*t1) &&
1724                     strchr("$&*(){}[]'\";\\|?<>~`", *t1))
1725                         break;
1726             if (*t1 && PerlLIO_lstat(SvPVX_const(sv), &PL_statbuf) < 0) {
1727                 (void)POPs;             /* Unmatched wildcard?  Chuck it... */
1728                 continue;
1729             }
1730         } else if (SvUTF8(sv)) { /* OP_READLINE, OP_RCATLINE */
1731              if (ckWARN(WARN_UTF8)) {
1732                 const U8 * const s = (const U8*)SvPVX_const(sv) + offset;
1733                 const STRLEN len = SvCUR(sv) - offset;
1734                 const U8 *f;
1735
1736                 if (!is_utf8_string_loc(s, len, &f))
1737                     /* Emulate :encoding(utf8) warning in the same case. */
1738                     Perl_warner(aTHX_ packWARN(WARN_UTF8),
1739                                 "utf8 \"\\x%02X\" does not map to Unicode",
1740                                 f < (U8*)SvEND(sv) ? *f : 0);
1741              }
1742         }
1743         if (gimme == G_ARRAY) {
1744             if (SvLEN(sv) - SvCUR(sv) > 20) {
1745                 SvPV_shrink_to_cur(sv);
1746             }
1747             sv = sv_2mortal(newSV(80));
1748             continue;
1749         }
1750         else if (gimme == G_SCALAR && !tmplen && SvLEN(sv) - SvCUR(sv) > 80) {
1751             /* try to reclaim a bit of scalar space (only on 1st alloc) */
1752             const STRLEN new_len
1753                 = SvCUR(sv) < 60 ? 80 : SvCUR(sv)+40; /* allow some slop */
1754             SvPV_renew(sv, new_len);
1755         }
1756         RETURN;
1757     }
1758 }
1759
1760 PP(pp_helem)
1761 {
1762     dVAR; dSP;
1763     HE* he;
1764     SV **svp;
1765     SV * const keysv = POPs;
1766     HV * const hv = MUTABLE_HV(POPs);
1767     const U32 lval = PL_op->op_flags & OPf_MOD || LVRET;
1768     const U32 defer = PL_op->op_private & OPpLVAL_DEFER;
1769     SV *sv;
1770     const U32 hash = (SvIsCOW_shared_hash(keysv)) ? SvSHARED_HASH(keysv) : 0;
1771     const bool localizing = PL_op->op_private & OPpLVAL_INTRO;
1772     bool preeminent = TRUE;
1773
1774     if (SvTYPE(hv) != SVt_PVHV)
1775         RETPUSHUNDEF;
1776
1777     if (localizing) {
1778         MAGIC *mg;
1779         HV *stash;
1780
1781         /* If we can determine whether the element exist,
1782          * Try to preserve the existenceness of a tied hash
1783          * element by using EXISTS and DELETE if possible.
1784          * Fallback to FETCH and STORE otherwise. */
1785         if (SvCANEXISTDELETE(hv) || mg_find((const SV *)hv, PERL_MAGIC_env))
1786             preeminent = hv_exists_ent(hv, keysv, 0);
1787     }
1788
1789     he = hv_fetch_ent(hv, keysv, lval && !defer, hash);
1790     svp = he ? &HeVAL(he) : NULL;
1791     if (lval) {
1792         if (!svp || !*svp || *svp == &PL_sv_undef) {
1793             SV* lv;
1794             SV* key2;
1795             if (!defer) {
1796                 DIE(aTHX_ PL_no_helem_sv, SVfARG(keysv));
1797             }
1798             lv = sv_newmortal();
1799             sv_upgrade(lv, SVt_PVLV);
1800             LvTYPE(lv) = 'y';
1801             sv_magic(lv, key2 = newSVsv(keysv), PERL_MAGIC_defelem, NULL, 0);
1802             SvREFCNT_dec(key2); /* sv_magic() increments refcount */
1803             LvTARG(lv) = SvREFCNT_inc_simple(hv);
1804             LvTARGLEN(lv) = 1;
1805             PUSHs(lv);
1806             RETURN;
1807         }
1808         if (localizing) {
1809             if (HvNAME_get(hv) && isGV(*svp))
1810                 save_gp(MUTABLE_GV(*svp), !(PL_op->op_flags & OPf_SPECIAL));
1811             else if (preeminent)
1812                 save_helem_flags(hv, keysv, svp,
1813                      (PL_op->op_flags & OPf_SPECIAL) ? 0 : SAVEf_SETMAGIC);
1814             else
1815                 SAVEHDELETE(hv, keysv);
1816         }
1817         else if (PL_op->op_private & OPpDEREF) {
1818             PUSHs(vivify_ref(*svp, PL_op->op_private & OPpDEREF));
1819             RETURN;
1820         }
1821     }
1822     sv = (svp && *svp ? *svp : &PL_sv_undef);
1823     /* Originally this did a conditional C<sv = sv_mortalcopy(sv)>; this
1824      * was to make C<local $tied{foo} = $tied{foo}> possible.
1825      * However, it seems no longer to be needed for that purpose, and
1826      * introduced a new bug: stuff like C<while ($hash{taintedval} =~ /.../g>
1827      * would loop endlessly since the pos magic is getting set on the
1828      * mortal copy and lost. However, the copy has the effect of
1829      * triggering the get magic, and losing it altogether made things like
1830      * c<$tied{foo};> in void context no longer do get magic, which some
1831      * code relied on. Also, delayed triggering of magic on @+ and friends
1832      * meant the original regex may be out of scope by now. So as a
1833      * compromise, do the get magic here. (The MGf_GSKIP flag will stop it
1834      * being called too many times). */
1835     if (!lval && SvRMAGICAL(hv) && SvGMAGICAL(sv))
1836         mg_get(sv);
1837     PUSHs(sv);
1838     RETURN;
1839 }
1840
1841 PP(pp_iter)
1842 {
1843     dVAR; dSP;
1844     register PERL_CONTEXT *cx;
1845     SV *sv, *oldsv;
1846     SV **itersvp;
1847     AV *av = NULL; /* used for LOOP_FOR on arrays and the stack */
1848     bool av_is_stack = FALSE;
1849
1850     EXTEND(SP, 1);
1851     cx = &cxstack[cxstack_ix];
1852     if (!CxTYPE_is_LOOP(cx))
1853         DIE(aTHX_ "panic: pp_iter, type=%u", CxTYPE(cx));
1854
1855     itersvp = CxITERVAR(cx);
1856     if (CxTYPE(cx) == CXt_LOOP_LAZYSV) {
1857             /* string increment */
1858             SV* cur = cx->blk_loop.state_u.lazysv.cur;
1859             SV *end = cx->blk_loop.state_u.lazysv.end;
1860             /* If the maximum is !SvOK(), pp_enteriter substitutes PL_sv_no.
1861                It has SvPVX of "" and SvCUR of 0, which is what we want.  */
1862             STRLEN maxlen = 0;
1863             const char *max = SvPV_const(end, maxlen);
1864             if (!SvNIOK(cur) && SvCUR(cur) <= maxlen) {
1865                 if (SvREFCNT(*itersvp) == 1 && !SvMAGICAL(*itersvp)) {
1866                     /* safe to reuse old SV */
1867                     sv_setsv(*itersvp, cur);
1868                 }
1869                 else
1870                 {
1871                     /* we need a fresh SV every time so that loop body sees a
1872                      * completely new SV for closures/references to work as
1873                      * they used to */
1874                     oldsv = *itersvp;
1875                     *itersvp = newSVsv(cur);
1876                     SvREFCNT_dec(oldsv);
1877                 }
1878                 if (strEQ(SvPVX_const(cur), max))
1879                     sv_setiv(cur, 0); /* terminate next time */
1880                 else
1881                     sv_inc(cur);
1882                 RETPUSHYES;
1883             }
1884             RETPUSHNO;
1885     }
1886     else if (CxTYPE(cx) == CXt_LOOP_LAZYIV) {
1887         /* integer increment */
1888         if (cx->blk_loop.state_u.lazyiv.cur > cx->blk_loop.state_u.lazyiv.end)
1889             RETPUSHNO;
1890
1891         /* don't risk potential race */
1892         if (SvREFCNT(*itersvp) == 1 && !SvMAGICAL(*itersvp)) {
1893             /* safe to reuse old SV */
1894             sv_setiv(*itersvp, cx->blk_loop.state_u.lazyiv.cur++);
1895         }
1896         else
1897         {
1898             /* we need a fresh SV every time so that loop body sees a
1899              * completely new SV for closures/references to work as they
1900              * used to */
1901             oldsv = *itersvp;
1902             *itersvp = newSViv(cx->blk_loop.state_u.lazyiv.cur++);
1903             SvREFCNT_dec(oldsv);
1904         }
1905
1906         /* Handle end of range at IV_MAX */
1907         if ((cx->blk_loop.state_u.lazyiv.cur == IV_MIN) &&
1908             (cx->blk_loop.state_u.lazyiv.end == IV_MAX))
1909         {
1910             cx->blk_loop.state_u.lazyiv.cur++;
1911             cx->blk_loop.state_u.lazyiv.end++;
1912         }
1913
1914         RETPUSHYES;
1915     }
1916
1917     /* iterate array */
1918     assert(CxTYPE(cx) == CXt_LOOP_FOR);
1919     av = cx->blk_loop.state_u.ary.ary;
1920     if (!av) {
1921         av_is_stack = TRUE;
1922         av = PL_curstack;
1923     }
1924     if (PL_op->op_private & OPpITER_REVERSED) {
1925         if (cx->blk_loop.state_u.ary.ix <= (av_is_stack
1926                                     ? cx->blk_loop.resetsp + 1 : 0))
1927             RETPUSHNO;
1928
1929         if (SvMAGICAL(av) || AvREIFY(av)) {
1930             SV * const * const svp = av_fetch(av, --cx->blk_loop.state_u.ary.ix, FALSE);
1931             sv = svp ? *svp : NULL;
1932         }
1933         else {
1934             sv = AvARRAY(av)[--cx->blk_loop.state_u.ary.ix];
1935         }
1936     }
1937     else {
1938         if (cx->blk_loop.state_u.ary.ix >= (av_is_stack ? cx->blk_oldsp :
1939                                     AvFILL(av)))
1940             RETPUSHNO;
1941
1942         if (SvMAGICAL(av) || AvREIFY(av)) {
1943             SV * const * const svp = av_fetch(av, ++cx->blk_loop.state_u.ary.ix, FALSE);
1944             sv = svp ? *svp : NULL;
1945         }
1946         else {
1947             sv = AvARRAY(av)[++cx->blk_loop.state_u.ary.ix];
1948         }
1949     }
1950
1951     if (sv && SvIS_FREED(sv)) {
1952         *itersvp = NULL;
1953         Perl_croak(aTHX_ "Use of freed value in iteration");
1954     }
1955
1956     if (sv) {
1957         SvTEMP_off(sv);
1958         SvREFCNT_inc_simple_void_NN(sv);
1959     }
1960     else
1961         sv = &PL_sv_undef;
1962     if (!av_is_stack && sv == &PL_sv_undef) {
1963         SV *lv = newSV_type(SVt_PVLV);
1964         LvTYPE(lv) = 'y';
1965         sv_magic(lv, NULL, PERL_MAGIC_defelem, NULL, 0);
1966         LvTARG(lv) = SvREFCNT_inc_simple(av);
1967         LvTARGOFF(lv) = cx->blk_loop.state_u.ary.ix;
1968         LvTARGLEN(lv) = (STRLEN)UV_MAX;
1969         sv = lv;
1970     }
1971
1972     oldsv = *itersvp;
1973     *itersvp = sv;
1974     SvREFCNT_dec(oldsv);
1975
1976     RETPUSHYES;
1977 }
1978
1979 /*
1980 A description of how taint works in pattern matching and substitution.
1981
1982 While the pattern is being assembled/concatenated and then compiled,
1983 PL_tainted will get set if any component of the pattern is tainted, e.g.
1984 /.*$tainted/.  At the end of pattern compilation, the RXf_TAINTED flag
1985 is set on the pattern if PL_tainted is set.
1986
1987 When the pattern is copied, e.g. $r = qr/..../, the SV holding the ref to
1988 the pattern is marked as tainted. This means that subsequent usage, such
1989 as /x$r/, will set PL_tainted, and thus RXf_TAINTED, on the new pattern too.
1990
1991 During execution of a pattern, locale-variant ops such as ALNUML set the
1992 local flag RF_tainted. At the end of execution, the engine sets the
1993 RXf_TAINTED_SEEN on the pattern if RF_tainted got set, or clears it
1994 otherwise.
1995
1996 In addition, RXf_TAINTED_SEEN is used post-execution by the get magic code
1997 of $1 et al to indicate whether the returned value should be tainted.
1998 It is the responsibility of the caller of the pattern (i.e. pp_match,
1999 pp_subst etc) to set this flag for any other circumstances where $1 needs
2000 to be tainted.
2001
2002 The taint behaviour of pp_subst (and pp_substcont) is quite complex.
2003
2004 There are three possible sources of taint
2005     * the source string
2006     * the pattern (both compile- and run-time, RXf_TAINTED / RXf_TAINTED_SEEN)
2007     * the replacement string (or expression under /e)
2008     
2009 There are four destinations of taint and they are affected by the sources
2010 according to the rules below:
2011
2012     * the return value (not including /r):
2013         tainted by the source string and pattern, but only for the
2014         number-of-iterations case; boolean returns aren't tainted;
2015     * the modified string (or modified copy under /r):
2016         tainted by the source string, pattern, and replacement strings;
2017     * $1 et al:
2018         tainted by the pattern, and under 'use re "taint"', by the source
2019         string too;
2020     * PL_taint - i.e. whether subsequent code (e.g. in a /e block) is tainted:
2021         should always be unset before executing subsequent code.
2022
2023 The overall action of pp_subst is:
2024
2025     * at the start, set bits in rxtainted indicating the taint status of
2026         the various sources.
2027
2028     * After each pattern execution, update the SUBST_TAINT_PAT bit in
2029         rxtainted if RXf_TAINTED_SEEN has been set, to indicate that the
2030         pattern has subsequently become tainted via locale ops.
2031
2032     * If control is being passed to pp_substcont to execute a /e block,
2033         save rxtainted in the CXt_SUBST block, for future use by
2034         pp_substcont.
2035
2036     * Whenever control is being returned to perl code (either by falling
2037         off the "end" of pp_subst/pp_substcont, or by entering a /e block),
2038         use the flag bits in rxtainted to make all the appropriate types of
2039         destination taint visible; e.g. set RXf_TAINTED_SEEN so that $1
2040         et al will appear tainted.
2041
2042 pp_match is just a simpler version of the above.
2043
2044 */
2045
2046 PP(pp_subst)
2047 {
2048     dVAR; dSP; dTARG;
2049     register PMOP *pm = cPMOP;
2050     PMOP *rpm = pm;
2051     register char *s;
2052     char *strend;
2053     register char *m;
2054     const char *c;
2055     register char *d;
2056     STRLEN clen;
2057     I32 iters = 0;
2058     I32 maxiters;
2059     register I32 i;
2060     bool once;
2061     U8 rxtainted = 0; /* holds various SUBST_TAINT_* flag bits.
2062                         See "how taint works" above */
2063     char *orig;
2064     U8 r_flags;
2065     register REGEXP *rx = PM_GETRE(pm);
2066     STRLEN len;
2067     int force_on_match = 0;
2068     const I32 oldsave = PL_savestack_ix;
2069     STRLEN slen;
2070     bool doutf8 = FALSE;
2071 #ifdef PERL_OLD_COPY_ON_WRITE
2072     bool is_cow;
2073 #endif
2074     SV *nsv = NULL;
2075     /* known replacement string? */
2076     register SV *dstr = (pm->op_pmflags & PMf_CONST) ? POPs : NULL;
2077
2078     PERL_ASYNC_CHECK();
2079
2080     if (PL_op->op_flags & OPf_STACKED)
2081         TARG = POPs;
2082     else if (PL_op->op_private & OPpTARGET_MY)
2083         GETTARGET;
2084     else {
2085         TARG = DEFSV;
2086         EXTEND(SP,1);
2087     }
2088
2089 #ifdef PERL_OLD_COPY_ON_WRITE
2090     /* Awooga. Awooga. "bool" types that are actually char are dangerous,
2091        because they make integers such as 256 "false".  */
2092     is_cow = SvIsCOW(TARG) ? TRUE : FALSE;
2093 #else
2094     if (SvIsCOW(TARG))
2095         sv_force_normal_flags(TARG,0);
2096 #endif
2097     if (!(rpm->op_pmflags & PMf_NONDESTRUCT)
2098 #ifdef PERL_OLD_COPY_ON_WRITE
2099         && !is_cow
2100 #endif
2101         && (SvREADONLY(TARG)
2102             || ( ((SvTYPE(TARG) == SVt_PVGV && isGV_with_GP(TARG))
2103                   || SvTYPE(TARG) > SVt_PVLV)
2104                  && !(SvTYPE(TARG) == SVt_PVGV && SvFAKE(TARG)))))
2105         Perl_croak_no_modify(aTHX);
2106     PUTBACK;
2107
2108   setup_match:
2109     s = SvPV_mutable(TARG, len);
2110     if (!SvPOKp(TARG) || SvTYPE(TARG) == SVt_PVGV)
2111         force_on_match = 1;
2112
2113     /* only replace once? */
2114     once = !(rpm->op_pmflags & PMf_GLOBAL);
2115
2116     /* See "how taint works" above */
2117     if (PL_tainting) {
2118         rxtainted  = (
2119             (SvTAINTED(TARG) ? SUBST_TAINT_STR : 0)
2120           | ((RX_EXTFLAGS(rx) & RXf_TAINTED) ? SUBST_TAINT_PAT : 0)
2121           | ((pm->op_pmflags & PMf_RETAINT) ? SUBST_TAINT_RETAINT : 0)
2122           | ((once && !(rpm->op_pmflags & PMf_NONDESTRUCT))
2123                 ? SUBST_TAINT_BOOLRET : 0));
2124         TAINT_NOT;
2125     }
2126
2127     RX_MATCH_UTF8_set(rx, DO_UTF8(TARG));
2128
2129   force_it:
2130     if (!pm || !s)
2131         DIE(aTHX_ "panic: pp_subst, pm=%p, s=%p", pm, s);
2132
2133     strend = s + len;
2134     slen = RX_MATCH_UTF8(rx) ? utf8_length((U8*)s, (U8*)strend) : len;
2135     maxiters = 2 * slen + 10;   /* We can match twice at each
2136                                    position, once with zero-length,
2137                                    second time with non-zero. */
2138
2139     if (!RX_PRELEN(rx) && PL_curpm) {
2140         pm = PL_curpm;
2141         rx = PM_GETRE(pm);
2142     }
2143     r_flags = (RX_NPARENS(rx) || SvTEMP(TARG) || PL_sawampersand
2144             || (RX_EXTFLAGS(rx) & (RXf_EVAL_SEEN|RXf_PMf_KEEPCOPY)) )
2145                ? REXEC_COPY_STR : 0;
2146     if (SvSCREAM(TARG))
2147         r_flags |= REXEC_SCREAM;
2148
2149     orig = m = s;
2150     if (RX_EXTFLAGS(rx) & RXf_USE_INTUIT) {
2151         PL_bostr = orig;
2152         s = CALLREG_INTUIT_START(rx, TARG, s, strend, r_flags, NULL);
2153
2154         if (!s)
2155             goto ret_no;
2156         /* How to do it in subst? */
2157 /*      if ( (RX_EXTFLAGS(rx) & RXf_CHECK_ALL)
2158              && !PL_sawampersand
2159              && !(RX_EXTFLAGS(rx) & RXf_KEEPCOPY)
2160              && ((RX_EXTFLAGS(rx) & RXf_NOSCAN)
2161                  || !((RX_EXTFLAGS(rx) & RXf_INTUIT_TAIL)
2162                       && (r_flags & REXEC_SCREAM))))
2163             goto yup;
2164 */
2165     }
2166
2167     if (!CALLREGEXEC(rx, s, strend, orig, 0, TARG, NULL,
2168                          r_flags | REXEC_CHECKED))
2169     {
2170       ret_no:
2171         SPAGAIN;
2172         PUSHs(rpm->op_pmflags & PMf_NONDESTRUCT ? TARG : &PL_sv_no);
2173         LEAVE_SCOPE(oldsave);
2174         RETURN;
2175     }
2176
2177     /* known replacement string? */
2178     if (dstr) {
2179         if (SvTAINTED(dstr))
2180             rxtainted |= SUBST_TAINT_REPL;
2181
2182         /* Upgrade the source if the replacement is utf8 but the source is not,
2183          * but only if it matched; see
2184          * http://www.nntp.perl.org/group/perl.perl5.porters/2010/04/msg158809.html
2185          */
2186         if (DO_UTF8(dstr) && ! DO_UTF8(TARG)) {
2187             char * const orig_pvx =  SvPVX(TARG);
2188             const STRLEN new_len = sv_utf8_upgrade_nomg(TARG);
2189
2190             /* If the lengths are the same, the pattern contains only
2191              * invariants, can keep going; otherwise, various internal markers
2192              * could be off, so redo */
2193             if (new_len != len || orig_pvx != SvPVX(TARG)) {
2194                 goto setup_match;
2195             }
2196         }
2197
2198         /* replacement needing upgrading? */
2199         if (DO_UTF8(TARG) && !doutf8) {
2200              nsv = sv_newmortal();
2201              SvSetSV(nsv, dstr);
2202              if (PL_encoding)
2203                   sv_recode_to_utf8(nsv, PL_encoding);
2204              else
2205                   sv_utf8_upgrade(nsv);
2206              c = SvPV_const(nsv, clen);
2207              doutf8 = TRUE;
2208         }
2209         else {
2210             c = SvPV_const(dstr, clen);
2211             doutf8 = DO_UTF8(dstr);
2212         }
2213     }
2214     else {
2215         c = NULL;
2216         doutf8 = FALSE;
2217     }
2218     
2219     /* can do inplace substitution? */
2220     if (c
2221 #ifdef PERL_OLD_COPY_ON_WRITE
2222         && !is_cow
2223 #endif
2224         && (I32)clen <= RX_MINLENRET(rx) && (once || !(r_flags & REXEC_COPY_STR))
2225         && !(RX_EXTFLAGS(rx) & RXf_LOOKBEHIND_SEEN)
2226         && (!doutf8 || SvUTF8(TARG))
2227         && !(rpm->op_pmflags & PMf_NONDESTRUCT))
2228     {
2229
2230 #ifdef PERL_OLD_COPY_ON_WRITE
2231         if (SvIsCOW(TARG)) {
2232             assert (!force_on_match);
2233             goto have_a_cow;
2234         }
2235 #endif
2236         if (force_on_match) {
2237             force_on_match = 0;
2238             s = SvPV_force(TARG, len);
2239             goto force_it;
2240         }
2241         d = s;
2242         PL_curpm = pm;
2243         SvSCREAM_off(TARG);     /* disable possible screamer */
2244         if (once) {
2245             if (RX_MATCH_TAINTED(rx)) /* run time pattern taint, eg locale */
2246                 rxtainted |= SUBST_TAINT_PAT;
2247             m = orig + RX_OFFS(rx)[0].start;
2248             d = orig + RX_OFFS(rx)[0].end;
2249             s = orig;
2250             if (m - s > strend - d) {  /* faster to shorten from end */
2251                 if (clen) {
2252                     Copy(c, m, clen, char);
2253                     m += clen;
2254                 }
2255                 i = strend - d;
2256                 if (i > 0) {
2257                     Move(d, m, i, char);
2258                     m += i;
2259                 }
2260                 *m = '\0';
2261                 SvCUR_set(TARG, m - s);
2262             }
2263             else if ((i = m - s)) {     /* faster from front */
2264                 d -= clen;
2265                 m = d;
2266                 Move(s, d - i, i, char);
2267                 sv_chop(TARG, d-i);
2268                 if (clen)
2269                     Copy(c, m, clen, char);
2270             }
2271             else if (clen) {
2272                 d -= clen;
2273                 sv_chop(TARG, d);
2274                 Copy(c, d, clen, char);
2275             }
2276             else {
2277                 sv_chop(TARG, d);
2278             }
2279             SPAGAIN;
2280             PUSHs(&PL_sv_yes);
2281         }
2282         else {
2283             do {
2284                 if (iters++ > maxiters)
2285                     DIE(aTHX_ "Substitution loop");
2286                 if (RX_MATCH_TAINTED(rx)) /* run time pattern taint, eg locale */
2287                     rxtainted |= SUBST_TAINT_PAT;
2288                 m = RX_OFFS(rx)[0].start + orig;
2289                 if ((i = m - s)) {
2290                     if (s != d)
2291                         Move(s, d, i, char);
2292                     d += i;
2293                 }
2294                 if (clen) {
2295                     Copy(c, d, clen, char);
2296                     d += clen;
2297                 }
2298                 s = RX_OFFS(rx)[0].end + orig;
2299             } while (CALLREGEXEC(rx, s, strend, orig, s == m,
2300                                  TARG, NULL,
2301                                  /* don't match same null twice */
2302                                  REXEC_NOT_FIRST|REXEC_IGNOREPOS));
2303             if (s != d) {
2304                 i = strend - s;
2305                 SvCUR_set(TARG, d - SvPVX_const(TARG) + i);
2306                 Move(s, d, i+1, char);          /* include the NUL */
2307             }
2308             SPAGAIN;
2309             mPUSHi((I32)iters);
2310         }
2311     }
2312     else {
2313         if (force_on_match) {
2314             force_on_match = 0;
2315             if (rpm->op_pmflags & PMf_NONDESTRUCT) {
2316                 /* I feel that it should be possible to avoid this mortal copy
2317                    given that the code below copies into a new destination.
2318                    However, I suspect it isn't worth the complexity of
2319                    unravelling the C<goto force_it> for the small number of
2320                    cases where it would be viable to drop into the copy code. */
2321                 TARG = sv_2mortal(newSVsv(TARG));
2322             }
2323             s = SvPV_force(TARG, len);
2324             goto force_it;
2325         }
2326 #ifdef PERL_OLD_COPY_ON_WRITE
2327       have_a_cow:
2328 #endif
2329         if (RX_MATCH_TAINTED(rx)) /* run time pattern taint, eg locale */
2330             rxtainted |= SUBST_TAINT_PAT;
2331         dstr = newSVpvn_flags(m, s-m, SVs_TEMP | (DO_UTF8(TARG) ? SVf_UTF8 : 0));
2332         PL_curpm = pm;
2333         if (!c) {
2334             register PERL_CONTEXT *cx;
2335             SPAGAIN;
2336             /* note that a whole bunch of local vars are saved here for
2337              * use by pp_substcont: here's a list of them in case you're
2338              * searching for places in this sub that uses a particular var:
2339              * iters maxiters r_flags oldsave rxtainted orig dstr targ
2340              * s m strend rx once */
2341             PUSHSUBST(cx);
2342             RETURNOP(cPMOP->op_pmreplrootu.op_pmreplroot);
2343         }
2344         r_flags |= REXEC_IGNOREPOS | REXEC_NOT_FIRST;
2345         do {
2346             if (iters++ > maxiters)
2347                 DIE(aTHX_ "Substitution loop");
2348             if (RX_MATCH_TAINTED(rx))
2349                 rxtainted |= SUBST_TAINT_PAT;
2350             if (RX_MATCH_COPIED(rx) && RX_SUBBEG(rx) != orig) {
2351                 m = s;
2352                 s = orig;
2353                 orig = RX_SUBBEG(rx);
2354                 s = orig + (m - s);
2355                 strend = s + (strend - m);
2356             }
2357             m = RX_OFFS(rx)[0].start + orig;
2358             if (doutf8 && !SvUTF8(dstr))
2359                 sv_catpvn_utf8_upgrade(dstr, s, m - s, nsv);
2360             else
2361                 sv_catpvn(dstr, s, m-s);
2362             s = RX_OFFS(rx)[0].end + orig;
2363             if (clen)
2364                 sv_catpvn(dstr, c, clen);
2365             if (once)
2366                 break;
2367         } while (CALLREGEXEC(rx, s, strend, orig, s == m,
2368                              TARG, NULL, r_flags));
2369         if (doutf8 && !DO_UTF8(TARG))
2370             sv_catpvn_utf8_upgrade(dstr, s, strend - s, nsv);
2371         else
2372             sv_catpvn(dstr, s, strend - s);
2373
2374         if (rpm->op_pmflags & PMf_NONDESTRUCT) {
2375             /* From here on down we're using the copy, and leaving the original
2376                untouched.  */
2377             TARG = dstr;
2378             SPAGAIN;
2379             PUSHs(dstr);
2380         } else {
2381 #ifdef PERL_OLD_COPY_ON_WRITE
2382             /* The match may make the string COW. If so, brilliant, because
2383                that's just saved us one malloc, copy and free - the regexp has
2384                donated the old buffer, and we malloc an entirely new one, rather
2385                than the regexp malloc()ing a buffer and copying our original,
2386                only for us to throw it away here during the substitution.  */
2387             if (SvIsCOW(TARG)) {
2388                 sv_force_normal_flags(TARG, SV_COW_DROP_PV);
2389             } else
2390 #endif
2391             {
2392                 SvPV_free(TARG);
2393             }
2394             SvPV_set(TARG, SvPVX(dstr));
2395             SvCUR_set(TARG, SvCUR(dstr));
2396             SvLEN_set(TARG, SvLEN(dstr));
2397             doutf8 |= DO_UTF8(dstr);
2398             SvPV_set(dstr, NULL);
2399
2400             SPAGAIN;
2401             mPUSHi((I32)iters);
2402         }
2403     }
2404
2405     if (!(rpm->op_pmflags & PMf_NONDESTRUCT)) {
2406         (void)SvPOK_only_UTF8(TARG);
2407         if (doutf8)
2408             SvUTF8_on(TARG);
2409     }
2410
2411     /* See "how taint works" above */
2412     if (PL_tainting) {
2413         if ((rxtainted & SUBST_TAINT_PAT) ||
2414             ((rxtainted & (SUBST_TAINT_STR|SUBST_TAINT_RETAINT)) ==
2415                                 (SUBST_TAINT_STR|SUBST_TAINT_RETAINT))
2416         )
2417             (RX_MATCH_TAINTED_on(rx)); /* taint $1 et al */
2418
2419         if (!(rxtainted & SUBST_TAINT_BOOLRET)
2420             && (rxtainted & (SUBST_TAINT_STR|SUBST_TAINT_PAT))
2421         )
2422             SvTAINTED_on(TOPs);  /* taint return value */
2423         else
2424             SvTAINTED_off(TOPs);  /* may have got tainted earlier */
2425
2426         /* needed for mg_set below */
2427         PL_tainted =
2428           cBOOL(rxtainted & (SUBST_TAINT_STR|SUBST_TAINT_PAT|SUBST_TAINT_REPL));
2429         SvTAINT(TARG);
2430     }
2431     SvSETMAGIC(TARG); /* PL_tainted must be correctly set for this mg_set */
2432     TAINT_NOT;
2433     LEAVE_SCOPE(oldsave);
2434     RETURN;
2435 }
2436
2437 PP(pp_grepwhile)
2438 {
2439     dVAR; dSP;
2440
2441     if (SvTRUEx(POPs))
2442         PL_stack_base[PL_markstack_ptr[-1]++] = PL_stack_base[*PL_markstack_ptr];
2443     ++*PL_markstack_ptr;
2444     FREETMPS;
2445     LEAVE_with_name("grep_item");                                       /* exit inner scope */
2446
2447     /* All done yet? */
2448     if (PL_stack_base + *PL_markstack_ptr > SP) {
2449         I32 items;
2450         const I32 gimme = GIMME_V;
2451
2452         LEAVE_with_name("grep");                                        /* exit outer scope */
2453         (void)POPMARK;                          /* pop src */
2454         items = --*PL_markstack_ptr - PL_markstack_ptr[-1];
2455         (void)POPMARK;                          /* pop dst */
2456         SP = PL_stack_base + POPMARK;           /* pop original mark */
2457         if (gimme == G_SCALAR) {
2458             if (PL_op->op_private & OPpGREP_LEX) {
2459                 SV* const sv = sv_newmortal();
2460                 sv_setiv(sv, items);
2461                 PUSHs(sv);
2462             }
2463             else {
2464                 dTARGET;
2465                 XPUSHi(items);
2466             }
2467         }
2468         else if (gimme == G_ARRAY)
2469             SP += items;
2470         RETURN;
2471     }
2472     else {
2473         SV *src;
2474
2475         ENTER_with_name("grep_item");                                   /* enter inner scope */
2476         SAVEVPTR(PL_curpm);
2477
2478         src = PL_stack_base[*PL_markstack_ptr];
2479         SvTEMP_off(src);
2480         if (PL_op->op_private & OPpGREP_LEX)
2481             PAD_SVl(PL_op->op_targ) = src;
2482         else
2483             DEFSV_set(src);
2484
2485         RETURNOP(cLOGOP->op_other);
2486     }
2487 }
2488
2489 PP(pp_leavesub)
2490 {
2491     dVAR; dSP;
2492     SV **mark;
2493     SV **newsp;
2494     PMOP *newpm;
2495     I32 gimme;
2496     register PERL_CONTEXT *cx;
2497     SV *sv;
2498
2499     if (CxMULTICALL(&cxstack[cxstack_ix]))
2500         return 0;
2501
2502     POPBLOCK(cx,newpm);
2503     cxstack_ix++; /* temporarily protect top context */
2504
2505     TAINT_NOT;
2506     if (gimme == G_SCALAR) {
2507         MARK = newsp + 1;
2508         if (MARK <= SP) {
2509             if (cx->blk_sub.cv && CvDEPTH(cx->blk_sub.cv) > 1) {
2510                 if (SvTEMP(TOPs) && SvREFCNT(TOPs) == 1
2511                      && !SvMAGICAL(TOPs)) {
2512                     *MARK = SvREFCNT_inc(TOPs);
2513                     FREETMPS;
2514                     sv_2mortal(*MARK);
2515                 }
2516                 else {
2517                     sv = SvREFCNT_inc(TOPs);    /* FREETMPS could clobber it */
2518                     FREETMPS;
2519                     *MARK = sv_mortalcopy(sv);
2520                     SvREFCNT_dec(sv);
2521                 }
2522             }
2523             else if (SvTEMP(TOPs) && SvREFCNT(TOPs) == 1
2524                      && !SvMAGICAL(TOPs)) {
2525                 *MARK = TOPs;
2526             }
2527             else
2528                 *MARK = sv_mortalcopy(TOPs);
2529         }
2530         else {
2531             MEXTEND(MARK, 0);
2532             *MARK = &PL_sv_undef;
2533         }
2534         SP = MARK;
2535     }
2536     else if (gimme == G_ARRAY) {
2537         for (MARK = newsp + 1; MARK <= SP; MARK++) {
2538             if (!SvTEMP(*MARK) || SvREFCNT(*MARK) != 1
2539                  || SvMAGICAL(*MARK)) {
2540                 *MARK = sv_mortalcopy(*MARK);
2541                 TAINT_NOT;      /* Each item is independent */
2542             }
2543         }
2544     }
2545     PUTBACK;
2546
2547     LEAVE;
2548     cxstack_ix--;
2549     POPSUB(cx,sv);      /* Stack values are safe: release CV and @_ ... */
2550     PL_curpm = newpm;   /* ... and pop $1 et al */
2551
2552     LEAVESUB(sv);
2553     return cx->blk_sub.retop;
2554 }
2555
2556 PP(pp_entersub)
2557 {
2558     dVAR; dSP; dPOPss;
2559     GV *gv;
2560     register CV *cv;
2561     register PERL_CONTEXT *cx;
2562     I32 gimme;
2563     const bool hasargs = (PL_op->op_flags & OPf_STACKED) != 0;
2564
2565     if (!sv)
2566         DIE(aTHX_ "Not a CODE reference");
2567     switch (SvTYPE(sv)) {
2568         /* This is overwhelming the most common case:  */
2569     case SVt_PVGV:
2570       we_have_a_glob:
2571         if (!(cv = GvCVu((const GV *)sv))) {
2572             HV *stash;
2573             cv = sv_2cv(sv, &stash, &gv, 0);
2574         }
2575         if (!cv) {
2576             ENTER;
2577             SAVETMPS;
2578             goto try_autoload;
2579         }
2580         break;
2581     case SVt_PVLV:
2582         if(isGV_with_GP(sv)) goto we_have_a_glob;
2583         /*FALLTHROUGH*/
2584     default:
2585         if (sv == &PL_sv_yes) {         /* unfound import, ignore */
2586             if (hasargs)
2587                 SP = PL_stack_base + POPMARK;
2588             else
2589                 (void)POPMARK;
2590             RETURN;
2591         }
2592         SvGETMAGIC(sv);
2593         if (SvROK(sv)) {
2594             if (SvAMAGIC(sv)) {
2595                 sv = amagic_deref_call(sv, to_cv_amg);
2596                 /* Don't SPAGAIN here.  */
2597             }
2598         }
2599         else {
2600             const char *sym;
2601             STRLEN len;
2602             sym = SvPV_nomg_const(sv, len);
2603             if (!sym)
2604                 DIE(aTHX_ PL_no_usym, "a subroutine");
2605             if (PL_op->op_private & HINT_STRICT_REFS)
2606                 DIE(aTHX_ "Can't use string (\"%" SVf32 "\"%s) as a subroutine ref while \"strict refs\" in use", sv, len>32 ? "..." : "");
2607             cv = get_cvn_flags(sym, len, GV_ADD|SvUTF8(sv));
2608             break;
2609         }
2610         cv = MUTABLE_CV(SvRV(sv));
2611         if (SvTYPE(cv) == SVt_PVCV)
2612             break;
2613         /* FALL THROUGH */
2614     case SVt_PVHV:
2615     case SVt_PVAV:
2616         DIE(aTHX_ "Not a CODE reference");
2617         /* This is the second most common case:  */
2618     case SVt_PVCV:
2619         cv = MUTABLE_CV(sv);
2620         break;
2621     }
2622
2623     ENTER;
2624     SAVETMPS;
2625
2626   retry:
2627     if (CvCLONE(cv) && ! CvCLONED(cv))
2628         DIE(aTHX_ "Closure prototype called");
2629     if (!CvROOT(cv) && !CvXSUB(cv)) {
2630         GV* autogv;
2631         SV* sub_name;
2632
2633         /* anonymous or undef'd function leaves us no recourse */
2634         if (CvANON(cv) || !(gv = CvGV(cv)))
2635             DIE(aTHX_ "Undefined subroutine called");
2636
2637         /* autoloaded stub? */
2638         if (cv != GvCV(gv)) {
2639             cv = GvCV(gv);
2640         }
2641         /* should call AUTOLOAD now? */
2642         else {
2643 try_autoload:
2644             if ((autogv = gv_autoload_pvn(GvSTASH(gv), GvNAME(gv), GvNAMELEN(gv),
2645                                    GvNAMEUTF8(gv) ? SVf_UTF8 : 0)))
2646             {
2647                 cv = GvCV(autogv);
2648             }
2649             /* sorry */
2650             else {
2651                 sub_name = sv_newmortal();
2652                 gv_efullname3(sub_name, gv, NULL);
2653                 DIE(aTHX_ "Undefined subroutine &%"SVf" called", SVfARG(sub_name));
2654             }
2655         }
2656         if (!cv)
2657             DIE(aTHX_ "Not a CODE reference");
2658         goto retry;
2659     }
2660
2661     gimme = GIMME_V;
2662     if ((PL_op->op_private & OPpENTERSUB_DB) && GvCV(PL_DBsub) && !CvNODEBUG(cv)) {
2663          Perl_get_db_sub(aTHX_ &sv, cv);
2664          if (CvISXSUB(cv))
2665              PL_curcopdb = PL_curcop;
2666          if (CvLVALUE(cv)) {
2667              /* check for lsub that handles lvalue subroutines */
2668              cv = GvCV(gv_HVadd(gv_fetchpvs("DB::lsub", GV_ADDMULTI, SVt_PVHV)));
2669              /* if lsub not found then fall back to DB::sub */
2670              if (!cv) cv = GvCV(PL_DBsub);
2671          } else {
2672              cv = GvCV(PL_DBsub);
2673          }
2674
2675         if (!cv || (!CvXSUB(cv) && !CvSTART(cv)))
2676             DIE(aTHX_ "No DB::sub routine defined");
2677     }
2678
2679     if (!(CvISXSUB(cv))) {
2680         /* This path taken at least 75% of the time   */
2681         dMARK;
2682         register I32 items = SP - MARK;
2683         AV* const padlist = CvPADLIST(cv);
2684         PUSHBLOCK(cx, CXt_SUB, MARK);
2685         PUSHSUB(cx);
2686         cx->blk_sub.retop = PL_op->op_next;
2687         CvDEPTH(cv)++;
2688         /* XXX This would be a natural place to set C<PL_compcv = cv> so
2689          * that eval'' ops within this sub know the correct lexical space.
2690          * Owing the speed considerations, we choose instead to search for
2691          * the cv using find_runcv() when calling doeval().
2692          */
2693         if (CvDEPTH(cv) >= 2) {
2694             PERL_STACK_OVERFLOW_CHECK();
2695             pad_push(padlist, CvDEPTH(cv));
2696         }
2697         SAVECOMPPAD();
2698         PAD_SET_CUR_NOSAVE(padlist, CvDEPTH(cv));
2699         if (hasargs) {
2700             AV *const av = MUTABLE_AV(PAD_SVl(0));
2701             if (AvREAL(av)) {
2702                 /* @_ is normally not REAL--this should only ever
2703                  * happen when DB::sub() calls things that modify @_ */
2704                 av_clear(av);
2705                 AvREAL_off(av);
2706                 AvREIFY_on(av);
2707             }
2708             cx->blk_sub.savearray = GvAV(PL_defgv);
2709             GvAV(PL_defgv) = MUTABLE_AV(SvREFCNT_inc_simple(av));
2710             CX_CURPAD_SAVE(cx->blk_sub);
2711             cx->blk_sub.argarray = av;
2712             ++MARK;
2713
2714             if (items > AvMAX(av) + 1) {
2715                 SV **ary = AvALLOC(av);
2716                 if (AvARRAY(av) != ary) {
2717                     AvMAX(av) += AvARRAY(av) - AvALLOC(av);
2718                     AvARRAY(av) = ary;
2719                 }
2720                 if (items > AvMAX(av) + 1) {
2721                     AvMAX(av) = items - 1;
2722                     Renew(ary,items,SV*);
2723                     AvALLOC(av) = ary;
2724                     AvARRAY(av) = ary;
2725                 }
2726             }
2727             Copy(MARK,AvARRAY(av),items,SV*);
2728             AvFILLp(av) = items - 1;
2729         
2730             while (items--) {
2731                 if (*MARK)
2732                     SvTEMP_off(*MARK);
2733                 MARK++;
2734             }
2735         }
2736         if ((cx->blk_u16 & OPpENTERSUB_LVAL_MASK) == OPpLVAL_INTRO &&
2737             !CvLVALUE(cv))
2738             DIE(aTHX_ "Can't modify non-lvalue subroutine call");
2739         /* warning must come *after* we fully set up the context
2740          * stuff so that __WARN__ handlers can safely dounwind()
2741          * if they want to
2742          */
2743         if (CvDEPTH(cv) == PERL_SUB_DEPTH_WARN && ckWARN(WARN_RECURSION)
2744             && !(PERLDB_SUB && cv == GvCV(PL_DBsub)))
2745             sub_crush_depth(cv);
2746         RETURNOP(CvSTART(cv));
2747     }
2748     else {
2749         I32 markix = TOPMARK;
2750
2751         PUTBACK;
2752
2753         if (!hasargs) {
2754             /* Need to copy @_ to stack. Alternative may be to
2755              * switch stack to @_, and copy return values
2756              * back. This would allow popping @_ in XSUB, e.g.. XXXX */
2757             AV * const av = GvAV(PL_defgv);
2758             const I32 items = AvFILLp(av) + 1;   /* @_ is not tieable */
2759
2760             if (items) {
2761                 /* Mark is at the end of the stack. */
2762                 EXTEND(SP, items);
2763                 Copy(AvARRAY(av), SP + 1, items, SV*);
2764                 SP += items;
2765                 PUTBACK ;               
2766             }
2767         }
2768         /* We assume first XSUB in &DB::sub is the called one. */
2769         if (PL_curcopdb) {
2770             SAVEVPTR(PL_curcop);
2771             PL_curcop = PL_curcopdb;
2772             PL_curcopdb = NULL;
2773         }
2774         /* Do we need to open block here? XXXX */
2775
2776         /* CvXSUB(cv) must not be NULL because newXS() refuses NULL xsub address */
2777         assert(CvXSUB(cv));
2778         CvXSUB(cv)(aTHX_ cv);
2779
2780         /* Enforce some sanity in scalar context. */
2781         if (gimme == G_SCALAR && ++markix != PL_stack_sp - PL_stack_base ) {
2782             if (markix > PL_stack_sp - PL_stack_base)
2783                 *(PL_stack_base + markix) = &PL_sv_undef;
2784             else
2785                 *(PL_stack_base + markix) = *PL_stack_sp;
2786             PL_stack_sp = PL_stack_base + markix;
2787         }
2788         LEAVE;
2789         return NORMAL;
2790     }
2791 }
2792
2793 void
2794 Perl_sub_crush_depth(pTHX_ CV *cv)
2795 {
2796     PERL_ARGS_ASSERT_SUB_CRUSH_DEPTH;
2797
2798     if (CvANON(cv))
2799         Perl_warner(aTHX_ packWARN(WARN_RECURSION), "Deep recursion on anonymous subroutine");
2800     else {
2801         SV* const tmpstr = sv_newmortal();
2802         gv_efullname3(tmpstr, CvGV(cv), NULL);
2803         Perl_warner(aTHX_ packWARN(WARN_RECURSION), "Deep recursion on subroutine \"%"SVf"\"",
2804                     SVfARG(tmpstr));
2805     }
2806 }
2807
2808 PP(pp_aelem)
2809 {
2810     dVAR; dSP;
2811     SV** svp;
2812     SV* const elemsv = POPs;
2813     IV elem = SvIV(elemsv);
2814     AV *const av = MUTABLE_AV(POPs);
2815     const U32 lval = PL_op->op_flags & OPf_MOD || LVRET;
2816     const U32 defer = (PL_op->op_private & OPpLVAL_DEFER) && (elem > av_len(av));
2817     const bool localizing = PL_op->op_private & OPpLVAL_INTRO;
2818     bool preeminent = TRUE;
2819     SV *sv;
2820
2821     if (SvROK(elemsv) && !SvGAMAGIC(elemsv) && ckWARN(WARN_MISC))
2822         Perl_warner(aTHX_ packWARN(WARN_MISC),
2823                     "Use of reference \"%"SVf"\" as array index",
2824                     SVfARG(elemsv));
2825     if (SvTYPE(av) != SVt_PVAV)
2826         RETPUSHUNDEF;
2827
2828     if (localizing) {
2829         MAGIC *mg;
2830         HV *stash;
2831
2832         /* If we can determine whether the element exist,
2833          * Try to preserve the existenceness of a tied array
2834          * element by using EXISTS and DELETE if possible.
2835          * Fallback to FETCH and STORE otherwise. */
2836         if (SvCANEXISTDELETE(av))
2837             preeminent = av_exists(av, elem);
2838     }
2839
2840     svp = av_fetch(av, elem, lval && !defer);
2841     if (lval) {
2842 #ifdef PERL_MALLOC_WRAP
2843          if (SvUOK(elemsv)) {
2844               const UV uv = SvUV(elemsv);
2845               elem = uv > IV_MAX ? IV_MAX : uv;
2846          }
2847          else if (SvNOK(elemsv))
2848               elem = (IV)SvNV(elemsv);
2849          if (elem > 0) {
2850               static const char oom_array_extend[] =
2851                 "Out of memory during array extend"; /* Duplicated in av.c */
2852               MEM_WRAP_CHECK_1(elem,SV*,oom_array_extend);
2853          }
2854 #endif
2855         if (!svp || *svp == &PL_sv_undef) {
2856             SV* lv;
2857             if (!defer)
2858                 DIE(aTHX_ PL_no_aelem, elem);
2859             lv = sv_newmortal();
2860             sv_upgrade(lv, SVt_PVLV);
2861             LvTYPE(lv) = 'y';
2862             sv_magic(lv, NULL, PERL_MAGIC_defelem, NULL, 0);
2863             LvTARG(lv) = SvREFCNT_inc_simple(av);
2864             LvTARGOFF(lv) = elem;
2865             LvTARGLEN(lv) = 1;
2866             PUSHs(lv);
2867             RETURN;
2868         }
2869         if (localizing) {
2870             if (preeminent)
2871                 save_aelem(av, elem, svp);
2872             else
2873                 SAVEADELETE(av, elem);
2874         }
2875         else if (PL_op->op_private & OPpDEREF) {
2876             PUSHs(vivify_ref(*svp, PL_op->op_private & OPpDEREF));
2877             RETURN;
2878         }
2879     }
2880     sv = (svp ? *svp : &PL_sv_undef);
2881     if (!lval && SvRMAGICAL(av) && SvGMAGICAL(sv)) /* see note in pp_helem() */
2882         mg_get(sv);
2883     PUSHs(sv);
2884     RETURN;
2885 }
2886
2887 SV*
2888 Perl_vivify_ref(pTHX_ SV *sv, U32 to_what)
2889 {
2890     PERL_ARGS_ASSERT_VIVIFY_REF;
2891
2892     SvGETMAGIC(sv);
2893     if (!SvOK(sv)) {
2894         if (SvREADONLY(sv))
2895             Perl_croak_no_modify(aTHX);
2896         prepare_SV_for_RV(sv);
2897         switch (to_what) {
2898         case OPpDEREF_SV:
2899             SvRV_set(sv, newSV(0));
2900             break;
2901         case OPpDEREF_AV:
2902             SvRV_set(sv, MUTABLE_SV(newAV()));
2903             break;
2904         case OPpDEREF_HV:
2905             SvRV_set(sv, MUTABLE_SV(newHV()));
2906             break;
2907         }
2908         SvROK_on(sv);
2909         SvSETMAGIC(sv);
2910         SvGETMAGIC(sv);
2911     }
2912     if (SvGMAGICAL(sv)) {
2913         /* copy the sv without magic to prevent magic from being
2914            executed twice */
2915         SV* msv = sv_newmortal();
2916         sv_setsv_nomg(msv, sv);
2917         return msv;
2918     }
2919     return sv;
2920 }
2921
2922 PP(pp_method)
2923 {
2924     dVAR; dSP;
2925     SV* const sv = TOPs;
2926
2927     if (SvROK(sv)) {
2928         SV* const rsv = SvRV(sv);
2929         if (SvTYPE(rsv) == SVt_PVCV) {
2930             SETs(rsv);
2931             RETURN;
2932         }
2933     }
2934
2935     SETs(method_common(sv, NULL));
2936     RETURN;
2937 }
2938
2939 PP(pp_method_named)
2940 {
2941     dVAR; dSP;
2942     SV* const sv = cSVOP_sv;
2943     U32 hash = SvSHARED_HASH(sv);
2944
2945     XPUSHs(method_common(sv, &hash));
2946     RETURN;
2947 }
2948
2949 STATIC SV *
2950 S_method_common(pTHX_ SV* meth, U32* hashp)
2951 {
2952     dVAR;
2953     SV* ob;
2954     GV* gv;
2955     HV* stash;
2956     SV *packsv = NULL;
2957     SV * const sv = *(PL_stack_base + TOPMARK + 1);
2958
2959     PERL_ARGS_ASSERT_METHOD_COMMON;
2960
2961     if (!sv)
2962         Perl_croak(aTHX_ "Can't call method \"%"SVf"\" on an undefined value",
2963                    SVfARG(meth));
2964
2965     SvGETMAGIC(sv);
2966     if (SvROK(sv))
2967         ob = MUTABLE_SV(SvRV(sv));
2968     else {
2969         GV* iogv;
2970         STRLEN packlen;
2971         const char * packname = NULL;
2972         bool packname_is_utf8 = FALSE;
2973
2974         /* this isn't a reference */
2975         if(SvOK(sv) && (packname = SvPV_nomg_const(sv, packlen))) {
2976           const HE* const he =
2977             (const HE *)hv_common_key_len(
2978               PL_stashcache, packname,
2979               packlen * -(packname_is_utf8 = !!SvUTF8(sv)), 0, NULL, 0
2980             );
2981           
2982           if (he) { 
2983             stash = INT2PTR(HV*,SvIV(HeVAL(he)));
2984             goto fetch;
2985           }
2986         }
2987
2988         if (!SvOK(sv) ||
2989             !(packname) ||
2990             !(iogv = gv_fetchpvn_flags(
2991                 packname, packlen, SVf_UTF8 * packname_is_utf8, SVt_PVIO
2992              )) ||
2993             !(ob=MUTABLE_SV(GvIO(iogv))))
2994         {
2995             /* this isn't the name of a filehandle either */
2996             if (!packname ||
2997                 ((UTF8_IS_START(*packname) && DO_UTF8(sv))
2998                     ? !isIDFIRST_utf8((U8*)packname)
2999                     : !isIDFIRST_L1((U8)*packname)
3000                 ))
3001             {
3002                 /* diag_listed_as: Can't call method "%s" without a package or object reference */
3003                 Perl_croak(aTHX_ "Can't call method \"%"SVf"\" %s",
3004                            SVfARG(meth),
3005                            SvOK(sv) ? "without a package or object reference"
3006                                     : "on an undefined value");
3007             }
3008             /* assume it's a package name */
3009             stash = gv_stashpvn(packname, packlen, packname_is_utf8 ? SVf_UTF8 : 0);
3010             if (!stash)
3011                 packsv = sv;
3012             else {
3013                 SV* const ref = newSViv(PTR2IV(stash));
3014                 (void)hv_store(PL_stashcache, packname,
3015                                 packname_is_utf8 ? -(I32)packlen : (I32)packlen, ref, 0);
3016             }
3017             goto fetch;
3018         }
3019         /* it _is_ a filehandle name -- replace with a reference */
3020         *(PL_stack_base + TOPMARK + 1) = sv_2mortal(newRV(MUTABLE_SV(iogv)));
3021     }
3022
3023     /* if we got here, ob should be a reference or a glob */
3024     if (!ob || !(SvOBJECT(ob)
3025                  || (SvTYPE(ob) == SVt_PVGV 
3026                      && isGV_with_GP(ob)
3027                      && (ob = MUTABLE_SV(GvIO((const GV *)ob)))
3028                      && SvOBJECT(ob))))
3029     {
3030         Perl_croak(aTHX_ "Can't call method \"%"SVf"\" on unblessed reference",
3031                    SVfARG((SvSCREAM(meth) && strEQ(SvPV_nolen_const(meth),"isa"))
3032                                         ? newSVpvs_flags("DOES", SVs_TEMP)
3033                                         : meth));
3034     }
3035
3036     stash = SvSTASH(ob);
3037
3038   fetch:
3039     /* NOTE: stash may be null, hope hv_fetch_ent and
3040        gv_fetchmethod can cope (it seems they can) */
3041
3042     /* shortcut for simple names */
3043     if (hashp) {
3044         const HE* const he = hv_fetch_ent(stash, meth, 0, *hashp);
3045         if (he) {
3046             gv = MUTABLE_GV(HeVAL(he));
3047             if (isGV(gv) && GvCV(gv) &&
3048                 (!GvCVGEN(gv) || GvCVGEN(gv)
3049                   == (PL_sub_generation + HvMROMETA(stash)->cache_gen)))
3050                 return MUTABLE_SV(GvCV(gv));
3051         }
3052     }
3053
3054     gv = gv_fetchmethod_sv_flags(stash ? stash : MUTABLE_HV(packsv),
3055                                      meth, GV_AUTOLOAD | GV_CROAK);
3056
3057     assert(gv);
3058
3059     return isGV(gv) ? MUTABLE_SV(GvCV(gv)) : MUTABLE_SV(gv);
3060 }
3061
3062 /*
3063  * Local variables:
3064  * c-indentation-style: bsd
3065  * c-basic-offset: 4
3066  * indent-tabs-mode: t
3067  * End:
3068  *
3069  * ex: set ts=8 sts=4 sw=4 noet:
3070  */