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