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