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