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