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