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