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