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