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