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