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