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