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