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