6fd0441f8cf5aa7cc0596444214c83aeedb9f54d
[p5sagit/p5-mst-13.2.git] / pp_hot.c
1 /*    pp_hot.c
2  *
3  *    Copyright (c) 1991-1994, 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 #include "perl.h"
20
21 /* Hot code. */
22
23 PP(pp_const)
24 {
25     dSP;
26     XPUSHs(cSVOP->op_sv);
27     RETURN;
28 }
29
30 PP(pp_nextstate)
31 {
32     curcop = (COP*)op;
33     TAINT_NOT;          /* Each statement is presumed innocent */
34     stack_sp = stack_base + cxstack[cxstack_ix].blk_oldsp;
35     FREETMPS;
36     return NORMAL;
37 }
38
39 PP(pp_gvsv)
40 {
41     dSP;
42     EXTEND(sp,1);
43     if (op->op_private & OPpLVAL_INTRO)
44         PUSHs(save_scalar(cGVOP->op_gv));
45     else
46         PUSHs(GvSV(cGVOP->op_gv));
47     RETURN;
48 }
49
50 PP(pp_null)
51 {
52     return NORMAL;
53 }
54
55 PP(pp_pushmark)
56 {
57     PUSHMARK(stack_sp);
58     return NORMAL;
59 }
60
61 PP(pp_stringify)
62 {
63     dSP; dTARGET;
64     STRLEN len;
65     char *s;
66     s = SvPV(TOPs,len);
67     sv_setpvn(TARG,s,len);
68     SETTARG;
69     RETURN;
70 }
71
72 PP(pp_gv)
73 {
74     dSP;
75     XPUSHs((SV*)cGVOP->op_gv);
76     RETURN;
77 }
78
79 PP(pp_gelem)
80 {
81     GV *gv;
82     SV *sv;
83     SV *ref;
84     char *elem;
85     dSP;
86
87     sv = POPs;
88     elem = SvPV(sv, na);
89     gv = (GV*)POPs;
90     ref = Nullsv;
91     sv = Nullsv;
92     switch (elem ? *elem : '\0')
93     {
94     case 'A':
95         if (strEQ(elem, "ARRAY"))
96             ref = (SV*)GvAV(gv);
97         break;
98     case 'C':
99         if (strEQ(elem, "CODE"))
100             ref = (SV*)GvCV(gv);
101         break;
102     case 'F':
103         if (strEQ(elem, "FILEHANDLE"))
104             ref = (SV*)GvIOp(gv);
105         break;
106     case 'G':
107         if (strEQ(elem, "GLOB"))
108             ref = (SV*)gv;
109         break;
110     case 'H':
111         if (strEQ(elem, "HASH"))
112             ref = (SV*)GvHV(gv);
113         break;
114     case 'N':
115         if (strEQ(elem, "NAME"))
116             sv = newSVpv(GvNAME(gv), GvNAMELEN(gv));
117         break;
118     case 'P':
119         if (strEQ(elem, "PACKAGE"))
120             sv = newSVpv(HvNAME(GvSTASH(gv)), 0);
121         break;
122     case 'S':
123         if (strEQ(elem, "SCALAR"))
124             ref = GvSV(gv);
125         break;
126     }
127     if (ref)
128         sv = newRV(ref);
129     if (sv)
130         sv_2mortal(sv);
131     else
132         sv = &sv_undef;
133     XPUSHs(sv);
134     RETURN;
135 }
136
137 PP(pp_and)
138 {
139     dSP;
140     if (!SvTRUE(TOPs))
141         RETURN;
142     else {
143         --SP;
144         RETURNOP(cLOGOP->op_other);
145     }
146 }
147
148 PP(pp_sassign)
149 {
150     dSP; dPOPTOPssrl;
151     MAGIC *mg;
152
153     if (op->op_private & OPpASSIGN_BACKWARDS) {
154         SV *temp;
155         temp = left; left = right; right = temp;
156     }
157     if (tainting && tainted && !SvTAINTED(left))
158         TAINT_NOT;
159     SvSetSV(right, left);
160     SvSETMAGIC(right);
161     SETs(right);
162     RETURN;
163 }
164
165 PP(pp_cond_expr)
166 {
167     dSP;
168     if (SvTRUEx(POPs))
169         RETURNOP(cCONDOP->op_true);
170     else
171         RETURNOP(cCONDOP->op_false);
172 }
173
174 PP(pp_unstack)
175 {
176     I32 oldsave;
177     TAINT_NOT;          /* Each statement is presumed innocent */
178     stack_sp = stack_base + cxstack[cxstack_ix].blk_oldsp;
179     FREETMPS;
180     oldsave = scopestack[scopestack_ix - 1];
181     LEAVE_SCOPE(oldsave);
182     return NORMAL;
183 }
184
185 PP(pp_seq)
186 {
187     dSP; tryAMAGICbinSET(seq,0); 
188     {
189       dPOPTOPssrl;
190       bool eq = ((op->op_private & OPpLOCALE)
191                  ? (sv_cmp_locale(left, right) == 0)
192                  : sv_eq(left, right));
193       SETs( eq ? &sv_yes : &sv_no );
194       RETURN;
195     }
196 }
197
198 PP(pp_concat)
199 {
200   dSP; dATARGET; tryAMAGICbin(concat,opASSIGN);
201   {
202     dPOPTOPssrl;
203     STRLEN len;
204     char *s;
205     if (TARG != left) {
206         s = SvPV(left,len);
207         sv_setpvn(TARG,s,len);
208     }
209     else if (SvGMAGICAL(TARG))
210         mg_get(TARG);
211     else if (!SvOK(TARG)) {
212         s = SvPV_force(TARG, len);
213         sv_setpv(TARG, "");     /* Suppress warning. */
214     }
215     s = SvPV(right,len);
216     sv_catpvn(TARG,s,len);
217     SETTARG;
218     RETURN;
219   }
220 }
221
222 PP(pp_padsv)
223 {
224     dSP; dTARGET;
225     XPUSHs(TARG);
226     if (op->op_flags & OPf_MOD) {
227         if (op->op_private & OPpLVAL_INTRO)
228             SAVECLEARSV(curpad[op->op_targ]);
229         else if (op->op_private & (OPpDEREF_HV|OPpDEREF_AV))
230             provide_ref(op, curpad[op->op_targ]);
231     }
232     RETURN;
233 }
234
235 PP(pp_readline)
236 {
237     last_in_gv = (GV*)(*stack_sp--);
238     return do_readline();
239 }
240
241 PP(pp_eq)
242 {
243     dSP; tryAMAGICbinSET(eq,0); 
244     {
245       dPOPnv;
246       SETs((TOPn == value) ? &sv_yes : &sv_no);
247       RETURN;
248     }
249 }
250
251 PP(pp_preinc)
252 {
253     dSP;
254     if (SvIOK(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs) &&
255         SvIVX(TOPs) != IV_MAX)
256     {
257         ++SvIVX(TOPs);
258         SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
259     }
260     else
261         sv_inc(TOPs);
262     SvSETMAGIC(TOPs);
263     return NORMAL;
264 }
265
266 PP(pp_or)
267 {
268     dSP;
269     if (SvTRUE(TOPs))
270         RETURN;
271     else {
272         --SP;
273         RETURNOP(cLOGOP->op_other);
274     }
275 }
276
277 PP(pp_add)
278 {
279     dSP; dATARGET; tryAMAGICbin(add,opASSIGN); 
280     {
281       dPOPTOPnnrl;
282       SETn( left + right );
283       RETURN;
284     }
285 }
286
287 PP(pp_aelemfast)
288 {
289     dSP;
290     AV *av = GvAV((GV*)cSVOP->op_sv);
291     SV** svp = av_fetch(av, op->op_private, op->op_flags & OPf_MOD);
292     PUSHs(svp ? *svp : &sv_undef);
293     RETURN;
294 }
295
296 PP(pp_join)
297 {
298     dSP; dMARK; dTARGET;
299     MARK++;
300     do_join(TARG, *MARK, MARK, SP);
301     SP = MARK;
302     SETs(TARG);
303     RETURN;
304 }
305
306 PP(pp_pushre)
307 {
308     dSP;
309     XPUSHs((SV*)op);
310     RETURN;
311 }
312
313 /* Oversized hot code. */
314
315 PP(pp_print)
316 {
317     dSP; dMARK; dORIGMARK;
318     GV *gv;
319     IO *io;
320     register PerlIO *fp;
321     MAGIC *mg;
322
323     if (op->op_flags & OPf_STACKED)
324         gv = (GV*)*++MARK;
325     else
326         gv = defoutgv;
327     if (SvMAGICAL(gv) && (mg = mg_find((SV*)gv, 'q'))) {
328         SV *sv;
329
330         PUSHMARK(MARK-1);
331         *MARK = mg->mg_obj;
332         ENTER;
333         perl_call_method("PRINT", G_SCALAR);
334         LEAVE;
335         SPAGAIN;
336         sv = POPs;
337         SP = ORIGMARK;
338         PUSHs(sv);
339         RETURN;
340     }
341     if (!(io = GvIO(gv))) {
342         if (dowarn) {
343             SV* sv = sv_newmortal();
344             gv_fullname3(sv, gv, Nullch);
345             warn("Filehandle %s never opened", SvPV(sv,na));
346         }
347
348         SETERRNO(EBADF,RMS$_IFI);
349         goto just_say_no;
350     }
351     else if (!(fp = IoOFP(io))) {
352         if (dowarn)  {
353             SV* sv = sv_newmortal();
354             gv_fullname3(sv, gv, Nullch);
355             if (IoIFP(io))
356                 warn("Filehandle %s opened only for input", SvPV(sv,na));
357             else
358                 warn("print on closed filehandle %s", SvPV(sv,na));
359         }
360         SETERRNO(EBADF,IoIFP(io)?RMS$_FAC:RMS$_IFI);
361         goto just_say_no;
362     }
363     else {
364         MARK++;
365         if (ofslen) {
366             while (MARK <= SP) {
367                 if (!do_print(*MARK, fp))
368                     break;
369                 MARK++;
370                 if (MARK <= SP) {
371                     if (PerlIO_write(fp, ofs, ofslen) == 0 || PerlIO_error(fp)) {
372                         MARK--;
373                         break;
374                     }
375                 }
376             }
377         }
378         else {
379             while (MARK <= SP) {
380                 if (!do_print(*MARK, fp))
381                     break;
382                 MARK++;
383             }
384         }
385         if (MARK <= SP)
386             goto just_say_no;
387         else {
388             if (orslen)
389                 if (PerlIO_write(fp, ors, orslen) == 0 || PerlIO_error(fp))
390                     goto just_say_no;
391
392             if (IoFLAGS(io) & IOf_FLUSH)
393                 if (PerlIO_flush(fp) == EOF)
394                     goto just_say_no;
395         }
396     }
397     SP = ORIGMARK;
398     PUSHs(&sv_yes);
399     RETURN;
400
401   just_say_no:
402     SP = ORIGMARK;
403     PUSHs(&sv_undef);
404     RETURN;
405 }
406
407 PP(pp_rv2av)
408 {
409     dSP; dPOPss;
410
411     AV *av;
412
413     if (SvROK(sv)) {
414       wasref:
415         av = (AV*)SvRV(sv);
416         if (SvTYPE(av) != SVt_PVAV)
417             DIE("Not an ARRAY reference");
418         if (op->op_private & OPpLVAL_INTRO)
419             av = (AV*)save_svref((SV**)sv);
420         if (op->op_flags & OPf_REF) {
421             PUSHs((SV*)av);
422             RETURN;
423         }
424     }
425     else {
426         if (SvTYPE(sv) == SVt_PVAV) {
427             av = (AV*)sv;
428             if (op->op_flags & OPf_REF) {
429                 PUSHs((SV*)av);
430                 RETURN;
431             }
432         }
433         else {
434             GV *gv;
435             
436             if (SvTYPE(sv) != SVt_PVGV) {
437                 char *sym;
438
439                 if (SvGMAGICAL(sv)) {
440                     mg_get(sv);
441                     if (SvROK(sv))
442                         goto wasref;
443                 }
444                 if (!SvOK(sv)) {
445                     if (op->op_flags & OPf_REF ||
446                       op->op_private & HINT_STRICT_REFS)
447                         DIE(no_usym, "an ARRAY");
448                     if (GIMME == G_ARRAY)
449                         RETURN;
450                     RETPUSHUNDEF;
451                 }
452                 sym = SvPV(sv,na);
453                 if (op->op_private & HINT_STRICT_REFS)
454                     DIE(no_symref, sym, "an ARRAY");
455                 gv = (GV*)gv_fetchpv(sym, TRUE, SVt_PVAV);
456             } else {
457                 gv = (GV*)sv;
458             }
459             av = GvAVn(gv);
460             if (op->op_private & OPpLVAL_INTRO)
461                 av = save_ary(gv);
462             if (op->op_flags & OPf_REF) {
463                 PUSHs((SV*)av);
464                 RETURN;
465             }
466         }
467     }
468
469     if (GIMME == G_ARRAY) {
470         I32 maxarg = AvFILL(av) + 1;
471         EXTEND(SP, maxarg);
472         Copy(AvARRAY(av), SP+1, maxarg, SV*);
473         SP += maxarg;
474     }
475     else {
476         dTARGET;
477         I32 maxarg = AvFILL(av) + 1;
478         PUSHi(maxarg);
479     }
480     RETURN;
481 }
482
483 PP(pp_rv2hv)
484 {
485
486     dSP; dTOPss;
487
488     HV *hv;
489
490     if (SvROK(sv)) {
491       wasref:
492         hv = (HV*)SvRV(sv);
493         if (SvTYPE(hv) != SVt_PVHV)
494             DIE("Not a HASH reference");
495         if (op->op_private & OPpLVAL_INTRO)
496             hv = (HV*)save_svref((SV**)sv);
497         if (op->op_flags & OPf_REF) {
498             SETs((SV*)hv);
499             RETURN;
500         }
501     }
502     else {
503         if (SvTYPE(sv) == SVt_PVHV) {
504             hv = (HV*)sv;
505             if (op->op_flags & OPf_REF) {
506                 SETs((SV*)hv);
507                 RETURN;
508             }
509         }
510         else {
511             GV *gv;
512             
513             if (SvTYPE(sv) != SVt_PVGV) {
514                 char *sym;
515
516                 if (SvGMAGICAL(sv)) {
517                     mg_get(sv);
518                     if (SvROK(sv))
519                         goto wasref;
520                 }
521                 if (!SvOK(sv)) {
522                     if (op->op_flags & OPf_REF ||
523                       op->op_private & HINT_STRICT_REFS)
524                         DIE(no_usym, "a HASH");
525                     if (GIMME == G_ARRAY) {
526                         SP--;
527                         RETURN;
528                     }
529                     RETSETUNDEF;
530                 }
531                 sym = SvPV(sv,na);
532                 if (op->op_private & HINT_STRICT_REFS)
533                     DIE(no_symref, sym, "a HASH");
534                 gv = (GV*)gv_fetchpv(sym, TRUE, SVt_PVHV);
535             } else {
536                 gv = (GV*)sv;
537             }
538             hv = GvHVn(gv);
539             if (op->op_private & OPpLVAL_INTRO)
540                 hv = save_hash(gv);
541             if (op->op_flags & OPf_REF) {
542                 SETs((SV*)hv);
543                 RETURN;
544             }
545         }
546     }
547
548     if (GIMME == G_ARRAY) { /* array wanted */
549         *stack_sp = (SV*)hv;
550         return do_kv(ARGS);
551     }
552     else {
553         dTARGET;
554         if (HvFILL(hv)) {
555             sprintf(buf, "%d/%d", HvFILL(hv), HvMAX(hv)+1);
556             sv_setpv(TARG, buf);
557         }
558         else
559             sv_setiv(TARG, 0);
560         SETTARG;
561         RETURN;
562     }
563 }
564
565 PP(pp_aassign)
566 {
567     dSP;
568     SV **lastlelem = stack_sp;
569     SV **lastrelem = stack_base + POPMARK;
570     SV **firstrelem = stack_base + POPMARK + 1;
571     SV **firstlelem = lastrelem + 1;
572
573     register SV **relem;
574     register SV **lelem;
575
576     register SV *sv;
577     register AV *ary;
578
579     HV *hash;
580     I32 i;
581     int magic;
582
583     delaymagic = DM_DELAY;              /* catch simultaneous items */
584
585     /* If there's a common identifier on both sides we have to take
586      * special care that assigning the identifier on the left doesn't
587      * clobber a value on the right that's used later in the list.
588      */
589     if (op->op_private & OPpASSIGN_COMMON) {
590         for (relem = firstrelem; relem <= lastrelem; relem++) {
591             /*SUPPRESS 560*/
592             if (sv = *relem)
593                 *relem = sv_mortalcopy(sv);
594         }
595     }
596
597     relem = firstrelem;
598     lelem = firstlelem;
599     ary = Null(AV*);
600     hash = Null(HV*);
601     while (lelem <= lastlelem) {
602         TAINT_NOT;              /* Each item stands on its own, taintwise. */
603         sv = *lelem++;
604         switch (SvTYPE(sv)) {
605         case SVt_PVAV:
606             ary = (AV*)sv;
607             magic = SvMAGICAL(ary) != 0;
608             
609             av_clear(ary);
610             i = 0;
611             while (relem <= lastrelem) {        /* gobble up all the rest */
612                 sv = NEWSV(28,0);
613                 assert(*relem);
614                 sv_setsv(sv,*relem);
615                 *(relem++) = sv;
616                 (void)av_store(ary,i++,sv);
617                 if (magic)
618                     mg_set(sv);
619                 TAINT_NOT;
620             }
621             break;
622         case SVt_PVHV: {
623                 SV *tmpstr;
624
625                 hash = (HV*)sv;
626                 magic = SvMAGICAL(hash) != 0;
627                 hv_clear(hash);
628
629                 while (relem < lastrelem) {     /* gobble up all the rest */
630                     STRLEN len;
631                     if (*relem)
632                         sv = *(relem++);
633                     else
634                         sv = &sv_no, relem++;
635                     tmpstr = NEWSV(29,0);
636                     if (*relem)
637                         sv_setsv(tmpstr,*relem);        /* value */
638                     *(relem++) = tmpstr;
639                     (void)hv_store_ent(hash,sv,tmpstr,0);
640                     if (magic)
641                         mg_set(tmpstr);
642                     TAINT_NOT;
643                 }
644                 if (relem == lastrelem)
645                     warn("Odd number of elements in hash list");
646             }
647             break;
648         default:
649             if (SvTHINKFIRST(sv)) {
650                 if (SvREADONLY(sv) && curcop != &compiling) {
651                     if (sv != &sv_undef && sv != &sv_yes && sv != &sv_no)
652                         DIE(no_modify);
653                     if (relem <= lastrelem)
654                         relem++;
655                     break;
656                 }
657                 if (SvROK(sv))
658                     sv_unref(sv);
659             }
660             if (relem <= lastrelem) {
661                 sv_setsv(sv, *relem);
662                 *(relem++) = sv;
663             }
664             else
665                 sv_setsv(sv, &sv_undef);
666             SvSETMAGIC(sv);
667             break;
668         }
669     }
670     if (delaymagic & ~DM_DELAY) {
671         if (delaymagic & DM_UID) {
672 #ifdef HAS_SETRESUID
673             (void)setresuid(uid,euid,(Uid_t)-1);
674 #else
675 #  ifdef HAS_SETREUID
676             (void)setreuid(uid,euid);
677 #  else
678 #    ifdef HAS_SETRUID
679             if ((delaymagic & DM_UID) == DM_RUID) {
680                 (void)setruid(uid);
681                 delaymagic &= ~DM_RUID;
682             }
683 #    endif /* HAS_SETRUID */
684 #    ifdef HAS_SETEUID
685             if ((delaymagic & DM_UID) == DM_EUID) {
686                 (void)seteuid(uid);
687                 delaymagic &= ~DM_EUID;
688             }
689 #    endif /* HAS_SETEUID */
690             if (delaymagic & DM_UID) {
691                 if (uid != euid)
692                     DIE("No setreuid available");
693                 (void)setuid(uid);
694             }
695 #  endif /* HAS_SETREUID */
696 #endif /* HAS_SETRESUID */
697             uid = (int)getuid();
698             euid = (int)geteuid();
699         }
700         if (delaymagic & DM_GID) {
701 #ifdef HAS_SETRESGID
702             (void)setresgid(gid,egid,(Gid_t)-1);
703 #else
704 #  ifdef HAS_SETREGID
705             (void)setregid(gid,egid);
706 #  else
707 #    ifdef HAS_SETRGID
708             if ((delaymagic & DM_GID) == DM_RGID) {
709                 (void)setrgid(gid);
710                 delaymagic &= ~DM_RGID;
711             }
712 #    endif /* HAS_SETRGID */
713 #    ifdef HAS_SETEGID
714             if ((delaymagic & DM_GID) == DM_EGID) {
715                 (void)setegid(gid);
716                 delaymagic &= ~DM_EGID;
717             }
718 #    endif /* HAS_SETEGID */
719             if (delaymagic & DM_GID) {
720                 if (gid != egid)
721                     DIE("No setregid available");
722                 (void)setgid(gid);
723             }
724 #  endif /* HAS_SETREGID */
725 #endif /* HAS_SETRESGID */
726             gid = (int)getgid();
727             egid = (int)getegid();
728         }
729         tainting |= (uid && (euid != uid || egid != gid));
730     }
731     delaymagic = 0;
732     if (GIMME == G_ARRAY) {
733         if (ary || hash)
734             SP = lastrelem;
735         else
736             SP = firstrelem + (lastlelem - firstlelem);
737         RETURN;
738     }
739     else {
740         dTARGET;
741         SP = firstrelem;
742                 
743         SETi(lastrelem - firstrelem + 1);
744         RETURN;
745     }
746 }
747
748 PP(pp_match)
749 {
750     dSP; dTARG;
751     register PMOP *pm = cPMOP;
752     register char *t;
753     register char *s;
754     char *strend;
755     I32 global;
756     I32 safebase;
757     char *truebase;
758     register REGEXP *rx = pm->op_pmregexp;
759     I32 gimme = GIMME;
760     STRLEN len;
761     I32 minmatch = 0;
762     I32 oldsave = savestack_ix;
763
764     if (op->op_flags & OPf_STACKED)
765         TARG = POPs;
766     else {
767         TARG = GvSV(defgv);
768         EXTEND(SP,1);
769     }
770     s = SvPV(TARG, len);
771     strend = s + len;
772     if (!s)
773         DIE("panic: do_match");
774
775     if (pm->op_pmflags & PMf_USED) {
776         if (gimme == G_ARRAY)
777             RETURN;
778         RETPUSHNO;
779     }
780
781     if (!rx->prelen && curpm) {
782         pm = curpm;
783         rx = pm->op_pmregexp;
784     }
785     truebase = t = s;
786     if (global = pm->op_pmflags & PMf_GLOBAL) {
787         rx->startp[0] = 0;
788         if (SvTYPE(TARG) >= SVt_PVMG && SvMAGIC(TARG)) {
789             MAGIC* mg = mg_find(TARG, 'g');
790             if (mg && mg->mg_len >= 0) {
791                 rx->endp[0] = rx->startp[0] = s + mg->mg_len; 
792                 minmatch = (mg->mg_flags & MGf_MINMATCH);
793             }
794         }
795     }
796     if (!rx->nparens && !global)
797         gimme = G_SCALAR;                       /* accidental array context? */
798     safebase = (gimme == G_ARRAY) || global;
799     if (pm->op_pmflags & (PMf_MULTILINE|PMf_SINGLELINE)) {
800         SAVEINT(multiline);
801         multiline = pm->op_pmflags & PMf_MULTILINE;
802     }
803
804 play_it_again:
805     if (global && rx->startp[0]) {
806         t = s = rx->endp[0];
807         if (s > strend)
808             goto nope;
809         minmatch = (s == rx->startp[0]);
810     }
811     if (pm->op_pmshort) {
812         if (pm->op_pmflags & PMf_SCANFIRST) {
813             if (SvSCREAM(TARG)) {
814                 if (screamfirst[BmRARE(pm->op_pmshort)] < 0)
815                     goto nope;
816                 else if (!(s = screaminstr(TARG, pm->op_pmshort)))
817                     goto nope;
818                 else if (pm->op_pmflags & PMf_ALL)
819                     goto yup;
820             }
821             else if (!(s = fbm_instr((unsigned char*)s,
822               (unsigned char*)strend, pm->op_pmshort)))
823                 goto nope;
824             else if (pm->op_pmflags & PMf_ALL)
825                 goto yup;
826             if (s && rx->regback >= 0) {
827                 ++BmUSEFUL(pm->op_pmshort);
828                 s -= rx->regback;
829                 if (s < t)
830                     s = t;
831             }
832             else
833                 s = t;
834         }
835         else if (!multiline) {
836             if (*SvPVX(pm->op_pmshort) != *s
837                 || (pm->op_pmslen > 1
838                     && memcmp(SvPVX(pm->op_pmshort), s, pm->op_pmslen)))
839                 goto nope;
840         }
841         if (!rx->naughty && --BmUSEFUL(pm->op_pmshort) < 0) {
842             SvREFCNT_dec(pm->op_pmshort);
843             pm->op_pmshort = Nullsv;    /* opt is being useless */
844         }
845     }
846     if (pregexec(rx, s, strend, truebase, minmatch,
847                  SvSCREAM(TARG) ? TARG : Nullsv, safebase))
848     {
849         curpm = pm;
850         if (pm->op_pmflags & PMf_ONCE)
851             pm->op_pmflags |= PMf_USED;
852         goto gotcha;
853     }
854     else
855         goto ret_no;
856     /*NOTREACHED*/
857
858   gotcha:
859     if (gimme == G_ARRAY) {
860         I32 iters, i, len;
861
862         TAINT_IF(rx->exec_tainted);
863         iters = rx->nparens;
864         if (global && !iters)
865             i = 1;
866         else
867             i = 0;
868         EXTEND(SP, iters + i);
869         EXTEND_MORTAL(iters + i);
870         for (i = !i; i <= iters; i++) {
871             PUSHs(sv_newmortal());
872             /*SUPPRESS 560*/
873             if ((s = rx->startp[i]) && rx->endp[i] ) {
874                 len = rx->endp[i] - s;
875                 sv_setpvn(*SP, s, len);
876             }
877         }
878         if (global) {
879             truebase = rx->subbeg;
880             if (rx->startp[0] && rx->startp[0] == rx->endp[0])
881                 ++rx->endp[0];
882             goto play_it_again;
883         }
884         LEAVE_SCOPE(oldsave);
885         RETURN;
886     }
887     else {
888         if (global) {
889             MAGIC* mg = 0;
890             if (SvTYPE(TARG) >= SVt_PVMG && SvMAGIC(TARG))
891                 mg = mg_find(TARG, 'g');
892             if (!mg) {
893                 sv_magic(TARG, (SV*)0, 'g', Nullch, 0);
894                 mg = mg_find(TARG, 'g');
895             }
896             if (rx->startp[0]) {
897                 mg->mg_len = rx->endp[0] - truebase;
898                 if (rx->startp[0] == rx->endp[0])
899                     mg->mg_flags |= MGf_MINMATCH;
900                 else
901                     mg->mg_flags &= ~MGf_MINMATCH;
902             }
903             else
904                 mg->mg_len = -1;
905         }
906         LEAVE_SCOPE(oldsave);
907         RETPUSHYES;
908     }
909
910 yup:
911     ++BmUSEFUL(pm->op_pmshort);
912     curpm = pm;
913     if (pm->op_pmflags & PMf_ONCE)
914         pm->op_pmflags |= PMf_USED;
915     if (global) {
916         rx->subbeg = truebase;
917         rx->subend = strend;
918         rx->startp[0] = s;
919         rx->endp[0] = s + SvCUR(pm->op_pmshort);
920         goto gotcha;
921     }
922     if (sawampersand) {
923         char *tmps;
924
925         if (rx->subbase)
926             Safefree(rx->subbase);
927         tmps = rx->subbase = savepvn(t, strend-t);
928         rx->subbeg = tmps;
929         rx->subend = tmps + (strend-t);
930         tmps = rx->startp[0] = tmps + (s - t);
931         rx->endp[0] = tmps + SvCUR(pm->op_pmshort);
932     }
933     LEAVE_SCOPE(oldsave);
934     RETPUSHYES;
935
936 nope:
937     if (pm->op_pmshort)
938         ++BmUSEFUL(pm->op_pmshort);
939
940 ret_no:
941     if (global) {
942         if (SvTYPE(TARG) >= SVt_PVMG && SvMAGIC(TARG)) {
943             MAGIC* mg = mg_find(TARG, 'g');
944             if (mg)
945                 mg->mg_len = -1;
946         }
947     }
948     LEAVE_SCOPE(oldsave);
949     if (gimme == G_ARRAY)
950         RETURN;
951     RETPUSHNO;
952 }
953
954 OP *
955 do_readline()
956 {
957     dSP; dTARGETSTACKED;
958     register SV *sv;
959     STRLEN tmplen = 0;
960     STRLEN offset;
961     PerlIO *fp;
962     register IO *io = GvIO(last_in_gv);
963     register I32 type = op->op_type;
964     MAGIC *mg;
965
966     if (SvMAGICAL(last_in_gv) && (mg = mg_find((SV*)last_in_gv, 'q'))) {
967         PUSHMARK(SP);
968         XPUSHs(mg->mg_obj);
969         PUTBACK;
970         ENTER;
971         perl_call_method("READLINE", GIMME);
972         LEAVE;
973         SPAGAIN;
974         if (GIMME == G_SCALAR) sv_setsv(TARG, TOPs);
975         RETURN;
976     }
977     fp = Nullfp;
978     if (io) {
979         fp = IoIFP(io);
980         if (!fp) {
981             if (IoFLAGS(io) & IOf_ARGV) {
982                 if (IoFLAGS(io) & IOf_START) {
983                     IoFLAGS(io) &= ~IOf_START;
984                     IoLINES(io) = 0;
985                     if (av_len(GvAVn(last_in_gv)) < 0) {
986                         SV *tmpstr = newSVpv("-", 1); /* assume stdin */
987                         av_push(GvAVn(last_in_gv), tmpstr);
988                     }
989                 }
990                 fp = nextargv(last_in_gv);
991                 if (!fp) { /* Note: fp != IoIFP(io) */
992                     (void)do_close(last_in_gv, FALSE); /* now it does*/
993                     IoFLAGS(io) |= IOf_START;
994                 }
995             }
996             else if (type == OP_GLOB) {
997                 SV *tmpcmd = NEWSV(55, 0);
998                 SV *tmpglob = POPs;
999                 ENTER;
1000                 SAVEFREESV(tmpcmd);
1001 #ifdef VMS /* expand the wildcards right here, rather than opening a pipe, */
1002            /* since spawning off a process is a real performance hit */
1003                 {
1004 #include <descrip.h>
1005 #include <lib$routines.h>
1006 #include <nam.h>
1007 #include <rmsdef.h>
1008                     char rslt[NAM$C_MAXRSS+1+sizeof(unsigned short int)] = {'\0','\0'};
1009                     char vmsspec[NAM$C_MAXRSS+1];
1010                     char *rstr = rslt + sizeof(unsigned short int), *begin, *end, *cp;
1011                     char tmpfnam[L_tmpnam] = "SYS$SCRATCH:";
1012                     $DESCRIPTOR(dfltdsc,"SYS$DISK:[]*.*;");
1013                     PerlIO *tmpfp;
1014                     STRLEN i;
1015                     struct dsc$descriptor_s wilddsc
1016                        = {0, DSC$K_DTYPE_T, DSC$K_CLASS_S, 0};
1017                     struct dsc$descriptor_vs rsdsc
1018                        = {sizeof rslt, DSC$K_DTYPE_VT, DSC$K_CLASS_VS, rslt};
1019                     unsigned long int cxt = 0, sts = 0, ok = 1, hasdir = 0, hasver = 0, isunix = 0;
1020
1021                     /* We could find out if there's an explicit dev/dir or version
1022                        by peeking into lib$find_file's internal context at
1023                        ((struct NAM *)((struct FAB *)cxt)->fab$l_nam)->nam$l_fnb
1024                        but that's unsupported, so I don't want to do it now and
1025                        have it bite someone in the future. */
1026                     strcat(tmpfnam,tmpnam(NULL));
1027                     cp = SvPV(tmpglob,i);
1028                     for (; i; i--) {
1029                        if (cp[i] == ';') hasver = 1;
1030                        if (cp[i] == '.') {
1031                            if (sts) hasver = 1;
1032                            else sts = 1;
1033                        }
1034                        if (cp[i] == '/') {
1035                           hasdir = isunix = 1;
1036                           break;
1037                        }
1038                        if (cp[i] == ']' || cp[i] == '>' || cp[i] == ':') {
1039                            hasdir = 1;
1040                            break;
1041                        }
1042                     }
1043                     if ((tmpfp = PerlIO_open(tmpfnam,"w+","fop=dlt")) != NULL) {
1044                         ok = ((wilddsc.dsc$a_pointer = tovmsspec(SvPVX(tmpglob),vmsspec)) != NULL);
1045                         if (ok) wilddsc.dsc$w_length = (unsigned short int) strlen(wilddsc.dsc$a_pointer);
1046                         while (ok && ((sts = lib$find_file(&wilddsc,&rsdsc,&cxt,
1047                                                     &dfltdsc,NULL,NULL,NULL))&1)) {
1048                             end = rstr + (unsigned long int) *rslt;
1049                             if (!hasver) while (*end != ';') end--;
1050                             *(end++) = '\n';  *end = '\0';
1051                             for (cp = rstr; *cp; cp++) *cp = _tolower(*cp);
1052                             if (hasdir) {
1053                               if (isunix) trim_unixpath(rstr,SvPVX(tmpglob));
1054                               begin = rstr;
1055                             }
1056                             else {
1057                                 begin = end;
1058                                 while (*(--begin) != ']' && *begin != '>') ;
1059                                 ++begin;
1060                             }
1061                             ok = (PerlIO_puts(tmpfp,begin) != EOF);
1062                         }
1063                         if (cxt) (void)lib$find_file_end(&cxt);
1064                         if (ok && sts != RMS$_NMF &&
1065                             sts != RMS$_DNF && sts != RMS$_FNF) ok = 0;
1066                         if (!ok) {
1067                             if (!(sts & 1)) {
1068                               SETERRNO((sts == RMS$_SYN ? EINVAL : EVMSERR),sts);
1069                             }
1070                             PerlIO_close(tmpfp);
1071                             fp = NULL;
1072                         }
1073                         else {
1074                            PerlIO_rewind(tmpfp);
1075                            IoTYPE(io) = '<';
1076                            IoIFP(io) = fp = tmpfp;
1077                         }
1078                     }
1079                 }
1080 #else /* !VMS */
1081 #ifdef DOSISH
1082 #ifdef OS2
1083                 sv_setpv(tmpcmd, "for a in ");
1084                 sv_catsv(tmpcmd, tmpglob);
1085                 sv_catpv(tmpcmd, "; do echo \"$a\\0\\c\"; done |");
1086 #else
1087                 sv_setpv(tmpcmd, "perlglob ");
1088                 sv_catsv(tmpcmd, tmpglob);
1089                 sv_catpv(tmpcmd, " |");
1090 #endif /* !OS2 */
1091 #else /* !DOSISH */
1092 #if defined(CSH)
1093                 sv_setpvn(tmpcmd, cshname, cshlen);
1094                 sv_catpv(tmpcmd, " -cf 'set nonomatch; glob ");
1095                 sv_catsv(tmpcmd, tmpglob);
1096                 sv_catpv(tmpcmd, "' 2>/dev/null |");
1097 #else
1098                 sv_setpv(tmpcmd, "echo ");
1099                 sv_catsv(tmpcmd, tmpglob);
1100 #if 'z' - 'a' == 25
1101                 sv_catpv(tmpcmd, "|tr -s ' \t\f\r' '\\012\\012\\012\\012'|");
1102 #else
1103                 sv_catpv(tmpcmd, "|tr -s ' \t\f\r' '\\n\\n\\n\\n'|");
1104 #endif
1105 #endif /* !CSH */
1106 #endif /* !DOSISH */
1107                 (void)do_open(last_in_gv, SvPVX(tmpcmd), SvCUR(tmpcmd),
1108                               FALSE, 0, 0, Nullfp);
1109                 fp = IoIFP(io);
1110 #endif /* !VMS */
1111                 LEAVE;
1112             }
1113         }
1114         else if (type == OP_GLOB)
1115             SP--;
1116     }
1117     if (!fp) {
1118         if (dowarn && io && !(IoFLAGS(io) & IOf_START))
1119             warn("Read on closed filehandle <%s>", GvENAME(last_in_gv));
1120         if (GIMME == G_SCALAR) {
1121             (void)SvOK_off(TARG);
1122             PUSHTARG;
1123         }
1124         RETURN;
1125     }
1126     if (GIMME == G_ARRAY) {
1127         sv = sv_2mortal(NEWSV(57, 80));
1128         offset = 0;
1129     }
1130     else {
1131         sv = TARG;
1132         (void)SvUPGRADE(sv, SVt_PV);
1133         tmplen = SvLEN(sv);     /* remember if already alloced */
1134         if (!tmplen)
1135             Sv_Grow(sv, 80);    /* try short-buffering it */
1136         if (type == OP_RCATLINE)
1137             offset = SvCUR(sv);
1138         else
1139             offset = 0;
1140     }
1141     for (;;) {
1142         if (!sv_gets(sv, fp, offset)) {
1143             PerlIO_clearerr(fp);
1144             if (IoFLAGS(io) & IOf_ARGV) {
1145                 fp = nextargv(last_in_gv);
1146                 if (fp)
1147                     continue;
1148                 (void)do_close(last_in_gv, FALSE);
1149                 IoFLAGS(io) |= IOf_START;
1150             }
1151             else if (type == OP_GLOB) {
1152                 (void)do_close(last_in_gv, FALSE);
1153             }
1154             if (GIMME == G_SCALAR) {
1155                 (void)SvOK_off(TARG);
1156                 PUSHTARG;
1157             }
1158             RETURN;
1159         }
1160         /* This should not be marked tainted if the fp is marked clean */
1161         if (!(IoFLAGS(io) & IOf_UNTAINT)) {
1162             TAINT;
1163             SvTAINTED_on(sv);
1164         }
1165         IoLINES(io)++;
1166         XPUSHs(sv);
1167         if (type == OP_GLOB) {
1168             char *tmps;
1169
1170             if (SvCUR(sv) > 0 && SvCUR(rs) > 0) {
1171                 tmps = SvEND(sv) - 1;
1172                 if (*tmps == *SvPVX(rs)) {
1173                     *tmps = '\0';
1174                     SvCUR(sv)--;
1175                 }
1176             }
1177             for (tmps = SvPVX(sv); *tmps; tmps++)
1178                 if (!isALPHA(*tmps) && !isDIGIT(*tmps) &&
1179                     strchr("$&*(){}[]'\";\\|?<>~`", *tmps))
1180                         break;
1181             if (*tmps && Stat(SvPVX(sv), &statbuf) < 0) {
1182                 (void)POPs;             /* Unmatched wildcard?  Chuck it... */
1183                 continue;
1184             }
1185         }
1186         if (GIMME == G_ARRAY) {
1187             if (SvLEN(sv) - SvCUR(sv) > 20) {
1188                 SvLEN_set(sv, SvCUR(sv)+1);
1189                 Renew(SvPVX(sv), SvLEN(sv), char);
1190             }
1191             sv = sv_2mortal(NEWSV(58, 80));
1192             continue;
1193         }
1194         else if (!tmplen && SvLEN(sv) - SvCUR(sv) > 80) {
1195             /* try to reclaim a bit of scalar space (only on 1st alloc) */
1196             if (SvCUR(sv) < 60)
1197                 SvLEN_set(sv, 80);
1198             else
1199                 SvLEN_set(sv, SvCUR(sv)+40);    /* allow some slop */
1200             Renew(SvPVX(sv), SvLEN(sv), char);
1201         }
1202         RETURN;
1203     }
1204 }
1205
1206 PP(pp_enter)
1207 {
1208     dSP;
1209     register CONTEXT *cx;
1210     I32 gimme;
1211
1212     /*
1213      * We don't just use the GIMME macro here because it assumes there's
1214      * already a context, which ain't necessarily so at initial startup.
1215      */
1216
1217     if (op->op_flags & OPf_KNOW)
1218         gimme = op->op_flags & OPf_LIST;
1219     else if (cxstack_ix >= 0)
1220         gimme = cxstack[cxstack_ix].blk_gimme;
1221     else
1222         gimme = G_SCALAR;
1223
1224     ENTER;
1225
1226     SAVETMPS;
1227     PUSHBLOCK(cx, CXt_BLOCK, sp);
1228
1229     RETURN;
1230 }
1231
1232 PP(pp_helem)
1233 {
1234     dSP;
1235     HE* he;
1236     SV *keysv = POPs;
1237     HV *hv = (HV*)POPs;
1238     I32 lval = op->op_flags & OPf_MOD;
1239
1240     if (SvTYPE(hv) != SVt_PVHV)
1241         RETPUSHUNDEF;
1242     he = hv_fetch_ent(hv, keysv, lval, 0);
1243     if (lval) {
1244         if (!he || HeVAL(he) == &sv_undef)
1245             DIE(no_helem, SvPV(keysv, na));
1246         if (op->op_private & OPpLVAL_INTRO)
1247             save_svref(&HeVAL(he));
1248         else if (op->op_private & (OPpDEREF_HV|OPpDEREF_AV))
1249             provide_ref(op, HeVAL(he));
1250     }
1251     PUSHs(he ? HeVAL(he) : &sv_undef);
1252     RETURN;
1253 }
1254
1255 PP(pp_leave)
1256 {
1257     dSP;
1258     register CONTEXT *cx;
1259     register SV **mark;
1260     SV **newsp;
1261     PMOP *newpm;
1262     I32 gimme;
1263
1264     if (op->op_flags & OPf_SPECIAL) {
1265         cx = &cxstack[cxstack_ix];
1266         cx->blk_oldpm = curpm;  /* fake block should preserve $1 et al */
1267     }
1268
1269     POPBLOCK(cx,newpm);
1270
1271     if (op->op_flags & OPf_KNOW)
1272         gimme = op->op_flags & OPf_LIST;
1273     else if (cxstack_ix >= 0)
1274         gimme = cxstack[cxstack_ix].blk_gimme;
1275     else
1276         gimme = G_SCALAR;
1277
1278     if (gimme == G_SCALAR) {
1279         if (op->op_private & OPpLEAVE_VOID)
1280             SP = newsp;
1281         else {
1282             MARK = newsp + 1;
1283             if (MARK <= SP)
1284                 if (SvFLAGS(TOPs) & (SVs_PADTMP|SVs_TEMP))
1285                     *MARK = TOPs;
1286                 else
1287                     *MARK = sv_mortalcopy(TOPs);
1288             else {
1289                 MEXTEND(mark,0);
1290                 *MARK = &sv_undef;
1291             }
1292             SP = MARK;
1293         }
1294     }
1295     else {
1296         for (mark = newsp + 1; mark <= SP; mark++)
1297             if (!(SvFLAGS(*mark) & (SVs_PADTMP|SVs_TEMP)))
1298                 *mark = sv_mortalcopy(*mark);
1299                 /* in case LEAVE wipes old return values */
1300     }
1301     curpm = newpm;      /* Don't pop $1 et al till now */
1302
1303     LEAVE;
1304
1305     RETURN;
1306 }
1307
1308 PP(pp_iter)
1309 {
1310     dSP;
1311     register CONTEXT *cx;
1312     SV *sv;
1313     AV* av;
1314
1315     EXTEND(sp, 1);
1316     cx = &cxstack[cxstack_ix];
1317     if (cx->cx_type != CXt_LOOP)
1318         DIE("panic: pp_iter");
1319     av = cx->blk_loop.iterary;
1320     if (av == curstack && cx->blk_loop.iterix >= cx->blk_oldsp)
1321         RETPUSHNO;
1322
1323     if (cx->blk_loop.iterix >= AvFILL(av))
1324         RETPUSHNO;
1325
1326     if (sv = AvARRAY(av)[++cx->blk_loop.iterix]) {
1327         SvTEMP_off(sv);
1328         *cx->blk_loop.itervar = sv;
1329     }
1330     else
1331         *cx->blk_loop.itervar = &sv_undef;
1332
1333     RETPUSHYES;
1334 }
1335
1336 PP(pp_subst)
1337 {
1338     dSP; dTARG;
1339     register PMOP *pm = cPMOP;
1340     PMOP *rpm = pm;
1341     register SV *dstr;
1342     register char *s;
1343     char *strend;
1344     register char *m;
1345     char *c;
1346     register char *d;
1347     STRLEN clen;
1348     I32 iters = 0;
1349     I32 maxiters;
1350     register I32 i;
1351     bool once;
1352     char *orig;
1353     I32 safebase;
1354     register REGEXP *rx = pm->op_pmregexp;
1355     STRLEN len;
1356     int force_on_match = 0;
1357     I32 oldsave = savestack_ix;
1358
1359     if (pm->op_pmflags & PMf_CONST)     /* known replacement string? */
1360         dstr = POPs;
1361     if (op->op_flags & OPf_STACKED)
1362         TARG = POPs;
1363     else {
1364         TARG = GvSV(defgv);
1365         EXTEND(SP,1);
1366     }
1367     s = SvPV(TARG, len);
1368     if (!SvPOKp(TARG) || SvREADONLY(TARG) || (SvTYPE(TARG) == SVt_PVGV))
1369         force_on_match = 1;
1370
1371   force_it:
1372     if (!pm || !s)
1373         DIE("panic: do_subst");
1374
1375     strend = s + len;
1376     maxiters = (strend - s) + 10;
1377
1378     if (!rx->prelen && curpm) {
1379         pm = curpm;
1380         rx = pm->op_pmregexp;
1381     }
1382     safebase = ((!rx || !rx->nparens) && !sawampersand);
1383     if (pm->op_pmflags & (PMf_MULTILINE|PMf_SINGLELINE)) {
1384         SAVEINT(multiline);
1385         multiline = pm->op_pmflags & PMf_MULTILINE;
1386     }
1387     orig = m = s;
1388     if (pm->op_pmshort) {
1389         if (pm->op_pmflags & PMf_SCANFIRST) {
1390             if (SvSCREAM(TARG)) {
1391                 if (screamfirst[BmRARE(pm->op_pmshort)] < 0)
1392                     goto nope;
1393                 else if (!(s = screaminstr(TARG, pm->op_pmshort)))
1394                     goto nope;
1395             }
1396             else if (!(s = fbm_instr((unsigned char*)s, (unsigned char*)strend,
1397               pm->op_pmshort)))
1398                 goto nope;
1399             if (s && rx->regback >= 0) {
1400                 ++BmUSEFUL(pm->op_pmshort);
1401                 s -= rx->regback;
1402                 if (s < m)
1403                     s = m;
1404             }
1405             else
1406                 s = m;
1407         }
1408         else if (!multiline) {
1409             if (*SvPVX(pm->op_pmshort) != *s
1410                 || (pm->op_pmslen > 1
1411                     && memcmp(SvPVX(pm->op_pmshort), s, pm->op_pmslen)))
1412                 goto nope;
1413         }
1414         if (!rx->naughty && --BmUSEFUL(pm->op_pmshort) < 0) {
1415             SvREFCNT_dec(pm->op_pmshort);
1416             pm->op_pmshort = Nullsv;    /* opt is being useless */
1417         }
1418     }
1419     once = !(rpm->op_pmflags & PMf_GLOBAL);
1420     if (rpm->op_pmflags & PMf_CONST) {  /* known replacement string? */
1421         c = SvPV(dstr, clen);
1422         if (clen <= rx->minlen) {
1423                                         /* can do inplace substitution */
1424             if (pregexec(rx, s, strend, orig, 0,
1425               SvSCREAM(TARG) ? TARG : Nullsv, safebase)) {
1426                 if (force_on_match) {
1427                     force_on_match = 0;
1428                     s = SvPV_force(TARG, len);
1429                     goto force_it;
1430                 }
1431                 if (rx->subbase)        /* oops, no we can't */
1432                     goto long_way;
1433                 d = s;
1434                 curpm = pm;
1435                 SvSCREAM_off(TARG);     /* disable possible screamer */
1436                 if (once) {
1437                     m = rx->startp[0];
1438                     d = rx->endp[0];
1439                     s = orig;
1440                     if (m - s > strend - d) {   /* faster to shorten from end */
1441                         if (clen) {
1442                             Copy(c, m, clen, char);
1443                             m += clen;
1444                         }
1445                         i = strend - d;
1446                         if (i > 0) {
1447                             Move(d, m, i, char);
1448                             m += i;
1449                         }
1450                         *m = '\0';
1451                         SvCUR_set(TARG, m - s);
1452                         (void)SvPOK_only(TARG);
1453                         SvSETMAGIC(TARG);
1454                         PUSHs(&sv_yes);
1455                         LEAVE_SCOPE(oldsave);
1456                         RETURN;
1457                     }
1458                     /*SUPPRESS 560*/
1459                     else if (i = m - s) {       /* faster from front */
1460                         d -= clen;
1461                         m = d;
1462                         sv_chop(TARG, d-i);
1463                         s += i;
1464                         while (i--)
1465                             *--d = *--s;
1466                         if (clen)
1467                             Copy(c, m, clen, char);
1468                         (void)SvPOK_only(TARG);
1469                         SvSETMAGIC(TARG);
1470                         PUSHs(&sv_yes);
1471                         LEAVE_SCOPE(oldsave);
1472                         RETURN;
1473                     }
1474                     else if (clen) {
1475                         d -= clen;
1476                         sv_chop(TARG, d);
1477                         Copy(c, d, clen, char);
1478                         (void)SvPOK_only(TARG);
1479                         SvSETMAGIC(TARG);
1480                         PUSHs(&sv_yes);
1481                         LEAVE_SCOPE(oldsave);
1482                         RETURN;
1483                     }
1484                     else {
1485                         sv_chop(TARG, d);
1486                         (void)SvPOK_only(TARG);
1487                         SvSETMAGIC(TARG);
1488                         PUSHs(&sv_yes);
1489                         LEAVE_SCOPE(oldsave);
1490                         RETURN;
1491                     }
1492                     /* NOTREACHED */
1493                 }
1494                 do {
1495                     if (iters++ > maxiters)
1496                         DIE("Substitution loop");
1497                     m = rx->startp[0];
1498                     /*SUPPRESS 560*/
1499                     if (i = m - s) {
1500                         if (s != d)
1501                             Move(s, d, i, char);
1502                         d += i;
1503                     }
1504                     if (clen) {
1505                         Copy(c, d, clen, char);
1506                         d += clen;
1507                     }
1508                     s = rx->endp[0];
1509                 } while (pregexec(rx, s, strend, orig, s == m,
1510                     Nullsv, TRUE));     /* (don't match same null twice) */
1511                 if (s != d) {
1512                     i = strend - s;
1513                     SvCUR_set(TARG, d - SvPVX(TARG) + i);
1514                     Move(s, d, i+1, char);              /* include the Null */
1515                 }
1516                 (void)SvPOK_only(TARG);
1517                 SvSETMAGIC(TARG);
1518                 PUSHs(sv_2mortal(newSViv((I32)iters)));
1519                 LEAVE_SCOPE(oldsave);
1520                 RETURN;
1521             }
1522             PUSHs(&sv_no);
1523             LEAVE_SCOPE(oldsave);
1524             RETURN;
1525         }
1526     }
1527     else
1528         c = Nullch;
1529     if (pregexec(rx, s, strend, orig, 0,
1530       SvSCREAM(TARG) ? TARG : Nullsv, safebase)) {
1531     long_way:
1532         if (force_on_match) {
1533             force_on_match = 0;
1534             s = SvPV_force(TARG, len);
1535             goto force_it;
1536         }
1537         dstr = NEWSV(25, sv_len(TARG));
1538         sv_setpvn(dstr, m, s-m);
1539         curpm = pm;
1540         if (!c) {
1541             register CONTEXT *cx;
1542             PUSHSUBST(cx);
1543             RETURNOP(cPMOP->op_pmreplroot);
1544         }
1545         do {
1546             if (iters++ > maxiters)
1547                 DIE("Substitution loop");
1548             if (rx->subbase && rx->subbase != orig) {
1549                 m = s;
1550                 s = orig;
1551                 orig = rx->subbase;
1552                 s = orig + (m - s);
1553                 strend = s + (strend - m);
1554             }
1555             m = rx->startp[0];
1556             sv_catpvn(dstr, s, m-s);
1557             s = rx->endp[0];
1558             if (clen)
1559                 sv_catpvn(dstr, c, clen);
1560             if (once)
1561                 break;
1562         } while (pregexec(rx, s, strend, orig, s == m, Nullsv,
1563             safebase));
1564         sv_catpvn(dstr, s, strend - s);
1565
1566         (void)SvOOK_off(TARG);
1567         Safefree(SvPVX(TARG));
1568         SvPVX(TARG) = SvPVX(dstr);
1569         SvCUR_set(TARG, SvCUR(dstr));
1570         SvLEN_set(TARG, SvLEN(dstr));
1571         SvPVX(dstr) = 0;
1572         sv_free(dstr);
1573
1574         (void)SvPOK_only(TARG);
1575         SvSETMAGIC(TARG);
1576         PUSHs(sv_2mortal(newSViv((I32)iters)));
1577         LEAVE_SCOPE(oldsave);
1578         RETURN;
1579     }
1580     PUSHs(&sv_no);
1581     LEAVE_SCOPE(oldsave);
1582     RETURN;
1583
1584 nope:
1585     ++BmUSEFUL(pm->op_pmshort);
1586     PUSHs(&sv_no);
1587     LEAVE_SCOPE(oldsave);
1588     RETURN;
1589 }
1590
1591 PP(pp_grepwhile)
1592 {
1593     dSP;
1594
1595     if (SvTRUEx(POPs))
1596         stack_base[markstack_ptr[-1]++] = stack_base[*markstack_ptr];
1597     ++*markstack_ptr;
1598     LEAVE;                                      /* exit inner scope */
1599
1600     /* All done yet? */
1601     if (stack_base + *markstack_ptr > sp) {
1602         I32 items;
1603
1604         LEAVE;                                  /* exit outer scope */
1605         (void)POPMARK;                          /* pop src */
1606         items = --*markstack_ptr - markstack_ptr[-1];
1607         (void)POPMARK;                          /* pop dst */
1608         SP = stack_base + POPMARK;              /* pop original mark */
1609         if (GIMME != G_ARRAY) {
1610             dTARGET;
1611             XPUSHi(items);
1612             RETURN;
1613         }
1614         SP += items;
1615         RETURN;
1616     }
1617     else {
1618         SV *src;
1619
1620         ENTER;                                  /* enter inner scope */
1621         SAVESPTR(curpm);
1622
1623         src = stack_base[*markstack_ptr];
1624         SvTEMP_off(src);
1625         GvSV(defgv) = src;
1626
1627         RETURNOP(cLOGOP->op_other);
1628     }
1629 }
1630
1631 PP(pp_leavesub)
1632 {
1633     dSP;
1634     SV **mark;
1635     SV **newsp;
1636     PMOP *newpm;
1637     I32 gimme;
1638     register CONTEXT *cx;
1639
1640     POPBLOCK(cx,newpm);
1641     POPSUB(cx);
1642
1643     if (gimme == G_SCALAR) {
1644         MARK = newsp + 1;
1645         if (MARK <= SP)
1646             if (SvFLAGS(TOPs) & SVs_TEMP)
1647                 *MARK = TOPs;
1648             else
1649                 *MARK = sv_mortalcopy(TOPs);
1650         else {
1651             MEXTEND(mark,0);
1652             *MARK = &sv_undef;
1653         }
1654         SP = MARK;
1655     }
1656     else {
1657         for (mark = newsp + 1; mark <= SP; mark++)
1658             if (!(SvFLAGS(*mark) & SVs_TEMP))
1659                 *mark = sv_mortalcopy(*mark);
1660                 /* in case LEAVE wipes old return values */
1661     }
1662
1663     if (cx->blk_sub.hasargs) {          /* You don't exist; go away. */
1664         AV* av = cx->blk_sub.argarray;
1665
1666         av_clear(av);
1667         AvREAL_off(av);
1668     }
1669     curpm = newpm;      /* Don't pop $1 et al till now */
1670
1671     LEAVE;
1672     PUTBACK;
1673     return pop_return();
1674 }
1675
1676 PP(pp_entersub)
1677 {
1678     dSP; dPOPss;
1679     GV *gv;
1680     HV *stash;
1681     register CV *cv;
1682     register CONTEXT *cx;
1683     I32 gimme;
1684     I32 hasargs = (op->op_flags & OPf_STACKED) != 0;
1685
1686     if (!sv)
1687         DIE("Not a CODE reference");
1688     switch (SvTYPE(sv)) {
1689     default:
1690         if (!SvROK(sv)) {
1691             char *sym;
1692
1693             if (sv == &sv_yes)          /* unfound import, ignore */
1694                 RETURN;
1695             if (!SvOK(sv))
1696                 DIE(no_usym, "a subroutine");
1697             sym = SvPV(sv,na);
1698             if (op->op_private & HINT_STRICT_REFS)
1699                 DIE(no_symref, sym, "a subroutine");
1700             cv = perl_get_cv(sym, TRUE);
1701             break;
1702         }
1703         cv = (CV*)SvRV(sv);
1704         if (SvTYPE(cv) == SVt_PVCV)
1705             break;
1706         /* FALL THROUGH */
1707     case SVt_PVHV:
1708     case SVt_PVAV:
1709         DIE("Not a CODE reference");
1710     case SVt_PVCV:
1711         cv = (CV*)sv;
1712         break;
1713     case SVt_PVGV:
1714         if (!(cv = GvCV((GV*)sv)))
1715             cv = sv_2cv(sv, &stash, &gv, TRUE);
1716         break;
1717     }
1718
1719     ENTER;
1720     SAVETMPS;
1721
1722   retry:
1723     if (!cv)
1724         DIE("Not a CODE reference");
1725
1726     if (!CvROOT(cv) && !CvXSUB(cv)) {
1727         if (gv = CvGV(cv)) {
1728             SV *tmpstr;
1729             GV *ngv;
1730             if (SvFAKE(cv) && GvCV(gv) != cv) { /* autoloaded stub? */
1731                 cv = GvCV(gv);
1732                 if (SvTYPE(sv) == SVt_PVGV) {
1733                     SvREFCNT_dec(GvCV((GV*)sv));
1734                     GvCV((GV*)sv) = (CV*)SvREFCNT_inc((SV*)cv);
1735                 }
1736                 goto retry;
1737             }
1738             tmpstr = sv_newmortal();
1739             gv_efullname3(tmpstr, gv, Nullch);
1740             ngv = gv_fetchmethod(GvESTASH(gv), "AUTOLOAD");
1741             if (ngv && ngv != gv && (cv = GvCV(ngv))) { /* One more chance... */
1742                 gv = ngv;
1743                 sv_setsv(GvSV(CvGV(cv)), tmpstr);       /* Set CV's $AUTOLOAD */
1744                 SvTAINTED_off(GvSV(CvGV(cv)));
1745                 goto retry;
1746             }
1747             else
1748                 DIE("Undefined subroutine &%s called",SvPVX(tmpstr));
1749         }
1750         DIE("Undefined subroutine called");
1751     }
1752
1753     gimme = GIMME;
1754     if ((op->op_private & OPpENTERSUB_DB)) {
1755         sv = GvSV(DBsub);
1756         save_item(sv);
1757         gv = CvGV(cv);
1758         if ( CvFLAGS(cv) & (CVf_ANON | CVf_CLONED)
1759              || strEQ(GvNAME(gv), "END") ) {
1760             /* GV is potentially non-unique */
1761             sv_setsv(sv, newRV((SV*)cv));
1762         }
1763         else {
1764             gv_efullname3(sv, gv, Nullch);
1765         }
1766         cv = GvCV(DBsub);
1767         if (CvXSUB(cv)) curcopdb = curcop;
1768         if (!cv)
1769             DIE("No DBsub routine");
1770     }
1771
1772     if (CvXSUB(cv)) {
1773         if (CvOLDSTYLE(cv)) {
1774             I32 (*fp3)_((int,int,int));
1775             dMARK;
1776             register I32 items = SP - MARK;
1777                                         /* We dont worry to copy from @_. */
1778             while (sp > mark) {
1779                 sp[1] = sp[0];
1780                 sp--;
1781             }
1782             stack_sp = mark + 1;
1783             fp3 = (I32(*)_((int,int,int)))CvXSUB(cv);
1784             items = (*fp3)(CvXSUBANY(cv).any_i32, 
1785                            MARK - stack_base + 1,
1786                            items);
1787             stack_sp = stack_base + items;
1788         }
1789         else {
1790             I32 markix = TOPMARK;
1791
1792             PUTBACK;
1793
1794             if (!hasargs) {
1795                 /* Need to copy @_ to stack. Alternative may be to
1796                  * switch stack to @_, and copy return values
1797                  * back. This would allow popping @_ in XSUB, e.g.. XXXX */
1798                 AV* av = GvAV(defgv);
1799                 I32 items = AvFILL(av) + 1;
1800
1801                 if (items) {
1802                     /* Mark is at the end of the stack. */
1803                     EXTEND(sp, items);
1804                     Copy(AvARRAY(av), sp + 1, items, SV*);
1805                     sp += items;
1806                     PUTBACK ;               
1807                 }
1808             }
1809             if (curcopdb) {             /* We assume that the first
1810                                            XSUB in &DB::sub is the
1811                                            called one. */
1812                 SAVESPTR(curcop);
1813                 curcop = curcopdb;
1814                 curcopdb = NULL;
1815             }
1816             /* Do we need to open block here? XXXX */
1817             (void)(*CvXSUB(cv))(cv);
1818
1819             /* Enforce some sanity in scalar context. */
1820             if (gimme == G_SCALAR && ++markix != stack_sp - stack_base ) {
1821                 if (markix > stack_sp - stack_base)
1822                     *(stack_base + markix) = &sv_undef;
1823                 else
1824                     *(stack_base + markix) = *stack_sp;
1825                 stack_sp = stack_base + markix;
1826             }
1827         }
1828         LEAVE;
1829         return NORMAL;
1830     }
1831     else {
1832         dMARK;
1833         register I32 items = SP - MARK;
1834         AV* padlist = CvPADLIST(cv);
1835         SV** svp = AvARRAY(padlist);
1836         push_return(op->op_next);
1837         PUSHBLOCK(cx, CXt_SUB, MARK);
1838         PUSHSUB(cx);
1839         CvDEPTH(cv)++;
1840         if (CvDEPTH(cv) < 2)
1841             (void)SvREFCNT_inc(cv);
1842         else {  /* save temporaries on recursion? */
1843             if (CvDEPTH(cv) == 100 && dowarn)
1844                 warn("Deep recursion on subroutine \"%s\"",GvENAME(CvGV(cv)));
1845             if (CvDEPTH(cv) > AvFILL(padlist)) {
1846                 AV *av;
1847                 AV *newpad = newAV();
1848                 SV **oldpad = AvARRAY(svp[CvDEPTH(cv)-1]);
1849                 I32 ix = AvFILL((AV*)svp[1]);
1850                 svp = AvARRAY(svp[0]);
1851                 for ( ;ix > 0; ix--) {
1852                     if (svp[ix] != &sv_undef) {
1853                         char *name = SvPVX(svp[ix]);
1854                         if (SvFLAGS(svp[ix]) & SVf_FAKE) { /* outer lexical? */
1855                             av_store(newpad, ix,
1856                                 SvREFCNT_inc(oldpad[ix]) );
1857                         }
1858                         else {                          /* our own lexical */
1859                             if (*name == '@')
1860                                 av_store(newpad, ix, sv = (SV*)newAV());
1861                             else if (*name == '%')
1862                                 av_store(newpad, ix, sv = (SV*)newHV());
1863                             else
1864                                 av_store(newpad, ix, sv = NEWSV(0,0));
1865                             SvPADMY_on(sv);
1866                         }
1867                     }
1868                     else {
1869                         av_store(newpad, ix, sv = NEWSV(0,0));
1870                         SvPADTMP_on(sv);
1871                     }
1872                 }
1873                 av = newAV();           /* will be @_ */
1874                 av_extend(av, 0);
1875                 av_store(newpad, 0, (SV*)av);
1876                 AvFLAGS(av) = AVf_REIFY;
1877                 av_store(padlist, CvDEPTH(cv), (SV*)newpad);
1878                 AvFILL(padlist) = CvDEPTH(cv);
1879                 svp = AvARRAY(padlist);
1880             }
1881         }
1882         SAVESPTR(curpad);
1883         curpad = AvARRAY((AV*)svp[CvDEPTH(cv)]);
1884         if (hasargs) {
1885             AV* av = (AV*)curpad[0];
1886             SV** ary;
1887
1888             if (AvREAL(av)) {
1889                 av_clear(av);
1890                 AvREAL_off(av);
1891             }
1892             cx->blk_sub.savearray = GvAV(defgv);
1893             cx->blk_sub.argarray = av;
1894             GvAV(defgv) = cx->blk_sub.argarray;
1895             ++MARK;
1896
1897             if (items > AvMAX(av) + 1) {
1898                 ary = AvALLOC(av);
1899                 if (AvARRAY(av) != ary) {
1900                     AvMAX(av) += AvARRAY(av) - AvALLOC(av);
1901                     SvPVX(av) = (char*)ary;
1902                 }
1903                 if (items > AvMAX(av) + 1) {
1904                     AvMAX(av) = items - 1;
1905                     Renew(ary,items,SV*);
1906                     AvALLOC(av) = ary;
1907                     SvPVX(av) = (char*)ary;
1908                 }
1909             }
1910             Copy(MARK,AvARRAY(av),items,SV*);
1911             AvFILL(av) = items - 1;
1912             
1913             while (items--) {
1914                 if (*MARK)
1915                     SvTEMP_off(*MARK);
1916                 MARK++;
1917             }
1918         }
1919         RETURNOP(CvSTART(cv));
1920     }
1921 }
1922
1923 PP(pp_aelem)
1924 {
1925     dSP;
1926     SV** svp;
1927     I32 elem = POPi;
1928     AV *av = (AV*)POPs;
1929     I32 lval = op->op_flags & OPf_MOD;
1930
1931     if (elem > 0)
1932         elem -= curcop->cop_arybase;
1933     if (SvTYPE(av) != SVt_PVAV)
1934         RETPUSHUNDEF;
1935     svp = av_fetch(av, elem, lval);
1936     if (lval) {
1937         if (!svp || *svp == &sv_undef)
1938             DIE(no_aelem, elem);
1939         if (op->op_private & OPpLVAL_INTRO)
1940             save_svref(svp);
1941         else if (op->op_private & (OPpDEREF_HV|OPpDEREF_AV))
1942             provide_ref(op, *svp);
1943     }
1944     PUSHs(svp ? *svp : &sv_undef);
1945     RETURN;
1946 }
1947
1948 void
1949 provide_ref(op, sv)
1950 OP* op;
1951 SV* sv;
1952 {
1953     if (SvGMAGICAL(sv))
1954         mg_get(sv);
1955     if (!SvOK(sv)) {
1956         if (SvREADONLY(sv))
1957             croak(no_modify);
1958         (void)SvUPGRADE(sv, SVt_RV);
1959         SvRV(sv) = (op->op_private & OPpDEREF_HV ?
1960                     (SV*)newHV() : (SV*)newAV());
1961         SvROK_on(sv);
1962         SvSETMAGIC(sv);
1963     }
1964 }
1965
1966 PP(pp_method)
1967 {
1968     dSP;
1969     SV* sv;
1970     SV* ob;
1971     GV* gv;
1972     SV* nm;
1973
1974     nm = TOPs;
1975     sv = *(stack_base + TOPMARK + 1);
1976     
1977     gv = 0;
1978     if (SvGMAGICAL(sv))
1979         mg_get(sv);
1980     if (SvROK(sv))
1981         ob = (SV*)SvRV(sv);
1982     else {
1983         GV* iogv;
1984         char* packname = 0;
1985         STRLEN packlen;
1986
1987         if (!SvOK(sv) ||
1988             !(packname = SvPV(sv, packlen)) ||
1989             !(iogv = gv_fetchpv(packname, FALSE, SVt_PVIO)) ||
1990             !(ob=(SV*)GvIO(iogv)))
1991         {
1992             char *name = SvPV(nm, na);
1993             HV *stash;
1994             if (!packname || !isALPHA(*packname))
1995 DIE("Can't call method \"%s\" without a package or object reference", name);
1996             if (!(stash = gv_stashpvn(packname, packlen, FALSE))) {
1997                 if (gv_stashpvn("UNIVERSAL", 9, FALSE))
1998                     stash = gv_stashpvn(packname, packlen, TRUE);
1999                 else
2000                     DIE("Can't call method \"%s\" in empty package \"%s\"",
2001                         name, packname);
2002             }
2003             gv = gv_fetchmethod(stash,name);
2004             if (!gv)
2005                 DIE("Can't locate object method \"%s\" via package \"%s\"",
2006                     name, packname);
2007             SETs((SV*)gv);
2008             RETURN;
2009         }
2010         *(stack_base + TOPMARK + 1) = sv_2mortal(newRV((SV*)iogv));
2011     }
2012
2013     if (!ob || !SvOBJECT(ob)) {
2014         char *name = SvPV(nm, na);
2015         DIE("Can't call method \"%s\" on unblessed reference", name);
2016     }
2017
2018     if (!gv) {          /* nothing cached */
2019         char *name = SvPV(nm, na);
2020         gv = gv_fetchmethod(SvSTASH(ob),name);
2021         if (!gv)
2022             DIE("Can't locate object method \"%s\" via package \"%s\"",
2023                 name, HvNAME(SvSTASH(ob)));
2024     }
2025
2026     SETs((SV*)gv);
2027     RETURN;
2028 }
2029