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