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