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