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