This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Bitten again by the snakes in the MANIFEST spec - tabs, not spaces.
[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 const I32 gimme = GIMME_V;
786 static const char return_array_to_lvalue_scalar[] = "Can't return array to lvalue scalar context";
787 static const char return_hash_to_lvalue_scalar[] = "Can't return hash to lvalue scalar context";
788 static const char an_array[] = "an ARRAY";
789 static const char a_hash[] = "a HASH";
790 const bool is_pp_rv2av = PL_op->op_type == OP_RV2AV;
791 const svtype type = is_pp_rv2av ? SVt_PVAV : SVt_PVHV;
792
793 if (SvROK(sv)) {
794 wasref:
795 tryAMAGICunDEREF_var(is_pp_rv2av ? to_av_amg : to_hv_amg);
796
797 sv = SvRV(sv);
798 if (SvTYPE(sv) != type)
799 DIE(aTHX_ "Not %s reference", is_pp_rv2av ? an_array : a_hash);
800 if (PL_op->op_flags & OPf_REF) {
801 SETs(sv);
802 RETURN;
803 }
804 else if (LVRET) {
805 if (gimme != G_ARRAY)
806 Perl_croak(aTHX_ is_pp_rv2av ? return_array_to_lvalue_scalar
807 : return_hash_to_lvalue_scalar);
808 SETs(sv);
809 RETURN;
810 }
811 else if (PL_op->op_flags & OPf_MOD
812 && PL_op->op_private & OPpLVAL_INTRO)
813 Perl_croak(aTHX_ PL_no_localize_ref);
814 }
815 else {
816 if (SvTYPE(sv) == type) {
817 if (PL_op->op_flags & OPf_REF) {
818 SETs(sv);
819 RETURN;
820 }
821 else if (LVRET) {
822 if (gimme != G_ARRAY)
823 Perl_croak(aTHX_
824 is_pp_rv2av ? return_array_to_lvalue_scalar
825 : return_hash_to_lvalue_scalar);
826 SETs(sv);
827 RETURN;
828 }
829 }
830 else {
831 GV *gv;
832
833 if (SvTYPE(sv) != SVt_PVGV) {
834 if (SvGMAGICAL(sv)) {
835 mg_get(sv);
836 if (SvROK(sv))
837 goto wasref;
838 }
839 gv = Perl_softref2xv(aTHX_ sv, is_pp_rv2av ? an_array : a_hash,
840 type, &sp);
841 if (!gv)
842 RETURN;
843 }
844 else {
845 gv = (GV*)sv;
846 }
847 sv = is_pp_rv2av ? (SV*)GvAVn(gv) : (SV*)GvHVn(gv);
848 if (PL_op->op_private & OPpLVAL_INTRO)
849 sv = is_pp_rv2av ? (SV*)save_ary(gv) : (SV*)save_hash(gv);
850 if (PL_op->op_flags & OPf_REF) {
851 SETs(sv);
852 RETURN;
853 }
854 else if (LVRET) {
855 if (gimme != G_ARRAY)
856 Perl_croak(aTHX_
857 is_pp_rv2av ? return_array_to_lvalue_scalar
858 : return_hash_to_lvalue_scalar);
859 SETs(sv);
860 RETURN;
861 }
862 }
863 }
864
865 if (is_pp_rv2av) {
866 AV *const av = (AV*)sv;
867 /* The guts of pp_rv2av, with no intenting change to preserve history
868 (until such time as we get tools that can do blame annotation across
869 whitespace changes. */
870 if (gimme == G_ARRAY) {
871 const I32 maxarg = AvFILL(av) + 1;
872 (void)POPs; /* XXXX May be optimized away? */
873 EXTEND(SP, maxarg);
874 if (SvRMAGICAL(av)) {
875 U32 i;
876 for (i=0; i < (U32)maxarg; i++) {
877 SV ** const svp = av_fetch(av, i, FALSE);
878 /* See note in pp_helem, and bug id #27839 */
879 SP[i+1] = svp
880 ? SvGMAGICAL(*svp) ? sv_mortalcopy(*svp) : *svp
881 : &PL_sv_undef;
882 }
883 }
884 else {
885 Copy(AvARRAY(av), SP+1, maxarg, SV*);
886 }
887 SP += maxarg;
888 }
889 else if (gimme == G_SCALAR) {
890 dTARGET;
891 const I32 maxarg = AvFILL(av) + 1;
892 SETi(maxarg);
893 }
894 } else {
895 /* The guts of pp_rv2hv */
896 if (gimme == G_ARRAY) { /* array wanted */
897 *PL_stack_sp = sv;
898 return do_kv();
899 }
900 else if (gimme == G_SCALAR) {
901 dTARGET;
902 TARG = Perl_hv_scalar(aTHX_ (HV*)sv);
903 SETTARG;
904 }
905 }
906 RETURN;
907}
908
909STATIC void
910S_do_oddball(pTHX_ HV *hash, SV **relem, SV **firstrelem)
911{
912 dVAR;
913 if (*relem) {
914 SV *tmpstr;
915 const HE *didstore;
916
917 if (ckWARN(WARN_MISC)) {
918 const char *err;
919 if (relem == firstrelem &&
920 SvROK(*relem) &&
921 (SvTYPE(SvRV(*relem)) == SVt_PVAV ||
922 SvTYPE(SvRV(*relem)) == SVt_PVHV))
923 {
924 err = "Reference found where even-sized list expected";
925 }
926 else
927 err = "Odd number of elements in hash assignment";
928 Perl_warner(aTHX_ packWARN(WARN_MISC), err);
929 }
930
931 tmpstr = newSV(0);
932 didstore = hv_store_ent(hash,*relem,tmpstr,0);
933 if (SvMAGICAL(hash)) {
934 if (SvSMAGICAL(tmpstr))
935 mg_set(tmpstr);
936 if (!didstore)
937 sv_2mortal(tmpstr);
938 }
939 TAINT_NOT;
940 }
941}
942
943PP(pp_aassign)
944{
945 dVAR; dSP;
946 SV **lastlelem = PL_stack_sp;
947 SV **lastrelem = PL_stack_base + POPMARK;
948 SV **firstrelem = PL_stack_base + POPMARK + 1;
949 SV **firstlelem = lastrelem + 1;
950
951 register SV **relem;
952 register SV **lelem;
953
954 register SV *sv;
955 register AV *ary;
956
957 I32 gimme;
958 HV *hash;
959 I32 i;
960 int magic;
961 int duplicates = 0;
962 SV **firsthashrelem = NULL; /* "= 0" keeps gcc 2.95 quiet */
963
964
965 PL_delaymagic = DM_DELAY; /* catch simultaneous items */
966 gimme = GIMME_V;
967
968 /* If there's a common identifier on both sides we have to take
969 * special care that assigning the identifier on the left doesn't
970 * clobber a value on the right that's used later in the list.
971 */
972 if (PL_op->op_private & (OPpASSIGN_COMMON)) {
973 EXTEND_MORTAL(lastrelem - firstrelem + 1);
974 for (relem = firstrelem; relem <= lastrelem; relem++) {
975 if ((sv = *relem)) {
976 TAINT_NOT; /* Each item is independent */
977 *relem = sv_mortalcopy(sv);
978 }
979 }
980 }
981 if (PL_op->op_private & OPpASSIGN_STATE) {
982 if (SvPADSTALE(*firstlelem))
983 SvPADSTALE_off(*firstlelem);
984 else
985 RETURN; /* ignore assignment */
986 }
987
988 relem = firstrelem;
989 lelem = firstlelem;
990 ary = NULL;
991 hash = NULL;
992
993 while (lelem <= lastlelem) {
994 TAINT_NOT; /* Each item stands on its own, taintwise. */
995 sv = *lelem++;
996 switch (SvTYPE(sv)) {
997 case SVt_PVAV:
998 ary = (AV*)sv;
999 magic = SvMAGICAL(ary) != 0;
1000 av_clear(ary);
1001 av_extend(ary, lastrelem - relem);
1002 i = 0;
1003 while (relem <= lastrelem) { /* gobble up all the rest */
1004 SV **didstore;
1005 assert(*relem);
1006 sv = newSVsv(*relem);
1007 *(relem++) = sv;
1008 didstore = av_store(ary,i++,sv);
1009 if (magic) {
1010 if (SvSMAGICAL(sv))
1011 mg_set(sv);
1012 if (!didstore)
1013 sv_2mortal(sv);
1014 }
1015 TAINT_NOT;
1016 }
1017 break;
1018 case SVt_PVHV: { /* normal hash */
1019 SV *tmpstr;
1020
1021 hash = (HV*)sv;
1022 magic = SvMAGICAL(hash) != 0;
1023 hv_clear(hash);
1024 firsthashrelem = relem;
1025
1026 while (relem < lastrelem) { /* gobble up all the rest */
1027 HE *didstore;
1028 sv = *relem ? *relem : &PL_sv_no;
1029 relem++;
1030 tmpstr = newSV(0);
1031 if (*relem)
1032 sv_setsv(tmpstr,*relem); /* value */
1033 *(relem++) = tmpstr;
1034 if (gimme != G_VOID && hv_exists_ent(hash, sv, 0))
1035 /* key overwrites an existing entry */
1036 duplicates += 2;
1037 didstore = hv_store_ent(hash,sv,tmpstr,0);
1038 if (magic) {
1039 if (SvSMAGICAL(tmpstr))
1040 mg_set(tmpstr);
1041 if (!didstore)
1042 sv_2mortal(tmpstr);
1043 }
1044 TAINT_NOT;
1045 }
1046 if (relem == lastrelem) {
1047 do_oddball(hash, relem, firstrelem);
1048 relem++;
1049 }
1050 }
1051 break;
1052 default:
1053 if (SvIMMORTAL(sv)) {
1054 if (relem <= lastrelem)
1055 relem++;
1056 break;
1057 }
1058 if (relem <= lastrelem) {
1059 sv_setsv(sv, *relem);
1060 *(relem++) = sv;
1061 }
1062 else
1063 sv_setsv(sv, &PL_sv_undef);
1064 SvSETMAGIC(sv);
1065 break;
1066 }
1067 }
1068 if (PL_delaymagic & ~DM_DELAY) {
1069 if (PL_delaymagic & DM_UID) {
1070#ifdef HAS_SETRESUID
1071 (void)setresuid((PL_delaymagic & DM_RUID) ? PL_uid : (Uid_t)-1,
1072 (PL_delaymagic & DM_EUID) ? PL_euid : (Uid_t)-1,
1073 (Uid_t)-1);
1074#else
1075# ifdef HAS_SETREUID
1076 (void)setreuid((PL_delaymagic & DM_RUID) ? PL_uid : (Uid_t)-1,
1077 (PL_delaymagic & DM_EUID) ? PL_euid : (Uid_t)-1);
1078# else
1079# ifdef HAS_SETRUID
1080 if ((PL_delaymagic & DM_UID) == DM_RUID) {
1081 (void)setruid(PL_uid);
1082 PL_delaymagic &= ~DM_RUID;
1083 }
1084# endif /* HAS_SETRUID */
1085# ifdef HAS_SETEUID
1086 if ((PL_delaymagic & DM_UID) == DM_EUID) {
1087 (void)seteuid(PL_euid);
1088 PL_delaymagic &= ~DM_EUID;
1089 }
1090# endif /* HAS_SETEUID */
1091 if (PL_delaymagic & DM_UID) {
1092 if (PL_uid != PL_euid)
1093 DIE(aTHX_ "No setreuid available");
1094 (void)PerlProc_setuid(PL_uid);
1095 }
1096# endif /* HAS_SETREUID */
1097#endif /* HAS_SETRESUID */
1098 PL_uid = PerlProc_getuid();
1099 PL_euid = PerlProc_geteuid();
1100 }
1101 if (PL_delaymagic & DM_GID) {
1102#ifdef HAS_SETRESGID
1103 (void)setresgid((PL_delaymagic & DM_RGID) ? PL_gid : (Gid_t)-1,
1104 (PL_delaymagic & DM_EGID) ? PL_egid : (Gid_t)-1,
1105 (Gid_t)-1);
1106#else
1107# ifdef HAS_SETREGID
1108 (void)setregid((PL_delaymagic & DM_RGID) ? PL_gid : (Gid_t)-1,
1109 (PL_delaymagic & DM_EGID) ? PL_egid : (Gid_t)-1);
1110# else
1111# ifdef HAS_SETRGID
1112 if ((PL_delaymagic & DM_GID) == DM_RGID) {
1113 (void)setrgid(PL_gid);
1114 PL_delaymagic &= ~DM_RGID;
1115 }
1116# endif /* HAS_SETRGID */
1117# ifdef HAS_SETEGID
1118 if ((PL_delaymagic & DM_GID) == DM_EGID) {
1119 (void)setegid(PL_egid);
1120 PL_delaymagic &= ~DM_EGID;
1121 }
1122# endif /* HAS_SETEGID */
1123 if (PL_delaymagic & DM_GID) {
1124 if (PL_gid != PL_egid)
1125 DIE(aTHX_ "No setregid available");
1126 (void)PerlProc_setgid(PL_gid);
1127 }
1128# endif /* HAS_SETREGID */
1129#endif /* HAS_SETRESGID */
1130 PL_gid = PerlProc_getgid();
1131 PL_egid = PerlProc_getegid();
1132 }
1133 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
1134 }
1135 PL_delaymagic = 0;
1136
1137 if (gimme == G_VOID)
1138 SP = firstrelem - 1;
1139 else if (gimme == G_SCALAR) {
1140 dTARGET;
1141 SP = firstrelem;
1142 SETi(lastrelem - firstrelem + 1 - duplicates);
1143 }
1144 else {
1145 if (ary)
1146 SP = lastrelem;
1147 else if (hash) {
1148 if (duplicates) {
1149 /* Removes from the stack the entries which ended up as
1150 * duplicated keys in the hash (fix for [perl #24380]) */
1151 Move(firsthashrelem + duplicates,
1152 firsthashrelem, duplicates, SV**);
1153 lastrelem -= duplicates;
1154 }
1155 SP = lastrelem;
1156 }
1157 else
1158 SP = firstrelem + (lastlelem - firstlelem);
1159 lelem = firstlelem + (relem - firstrelem);
1160 while (relem <= SP)
1161 *relem++ = (lelem <= lastlelem) ? *lelem++ : &PL_sv_undef;
1162 }
1163 RETURN;
1164}
1165
1166PP(pp_qr)
1167{
1168 dVAR; dSP;
1169 register PMOP * const pm = cPMOP;
1170 SV * const rv = sv_newmortal();
1171 SV * const sv = newSVrv(rv, "Regexp");
1172 if (pm->op_pmdynflags & PMdf_TAINTED)
1173 SvTAINTED_on(rv);
1174 sv_magic(sv,(SV*)ReREFCNT_inc(PM_GETRE(pm)), PERL_MAGIC_qr,0,0);
1175 XPUSHs(rv);
1176 RETURN;
1177}
1178
1179PP(pp_match)
1180{
1181 dVAR; dSP; dTARG;
1182 register PMOP *pm = cPMOP;
1183 PMOP *dynpm = pm;
1184 register const char *t;
1185 register const char *s;
1186 const char *strend;
1187 I32 global;
1188 I32 r_flags = REXEC_CHECKED;
1189 const char *truebase; /* Start of string */
1190 register REGEXP *rx = PM_GETRE(pm);
1191 bool rxtainted;
1192 const I32 gimme = GIMME;
1193 STRLEN len;
1194 I32 minmatch = 0;
1195 const I32 oldsave = PL_savestack_ix;
1196 I32 update_minmatch = 1;
1197 I32 had_zerolen = 0;
1198 U32 gpos = 0;
1199
1200 if (PL_op->op_flags & OPf_STACKED)
1201 TARG = POPs;
1202 else if (PL_op->op_private & OPpTARGET_MY)
1203 GETTARGET;
1204 else {
1205 TARG = DEFSV;
1206 EXTEND(SP,1);
1207 }
1208
1209 PUTBACK; /* EVAL blocks need stack_sp. */
1210 s = SvPV_const(TARG, len);
1211 if (!s)
1212 DIE(aTHX_ "panic: pp_match");
1213 strend = s + len;
1214 rxtainted = ((pm->op_pmdynflags & PMdf_TAINTED) ||
1215 (PL_tainted && (pm->op_pmflags & PMf_RETAINT)));
1216 TAINT_NOT;
1217
1218 RX_MATCH_UTF8_set(rx, DO_UTF8(TARG));
1219
1220 /* PMdf_USED is set after a ?? matches once */
1221 if (pm->op_pmdynflags & PMdf_USED) {
1222 failure:
1223 if (gimme == G_ARRAY)
1224 RETURN;
1225 RETPUSHNO;
1226 }
1227
1228 /* empty pattern special-cased to use last successful pattern if possible */
1229 if (!rx->prelen && PL_curpm) {
1230 pm = PL_curpm;
1231 rx = PM_GETRE(pm);
1232 }
1233
1234 if (rx->minlen > (I32)len)
1235 goto failure;
1236
1237 truebase = t = s;
1238
1239 /* XXXX What part of this is needed with true \G-support? */
1240 if ((global = dynpm->op_pmflags & PMf_GLOBAL)) {
1241 rx->startp[0] = -1;
1242 if (SvTYPE(TARG) >= SVt_PVMG && SvMAGIC(TARG)) {
1243 MAGIC* const mg = mg_find(TARG, PERL_MAGIC_regex_global);
1244 if (mg && mg->mg_len >= 0) {
1245 if (!(rx->extflags & RXf_GPOS_SEEN))
1246 rx->endp[0] = rx->startp[0] = mg->mg_len;
1247 else if (rx->extflags & RXf_ANCH_GPOS) {
1248 r_flags |= REXEC_IGNOREPOS;
1249 rx->endp[0] = rx->startp[0] = mg->mg_len;
1250 } else if (rx->extflags & RXf_GPOS_FLOAT)
1251 gpos = mg->mg_len;
1252 else
1253 rx->endp[0] = rx->startp[0] = mg->mg_len;
1254 minmatch = (mg->mg_flags & MGf_MINMATCH) ? rx->gofs + 1 : 0;
1255 update_minmatch = 0;
1256 }
1257 }
1258 }
1259 /* remove comment to get faster /g but possibly unsafe $1 vars after a
1260 match. Test for the unsafe vars will fail as well*/
1261 if (( /* !global && */ rx->nparens)
1262 || SvTEMP(TARG) || PL_sawampersand ||
1263 (pm->op_pmflags & (PMf_EVAL|PMf_KEEPCOPY)))
1264 r_flags |= REXEC_COPY_STR;
1265 if (SvSCREAM(TARG))
1266 r_flags |= REXEC_SCREAM;
1267
1268play_it_again:
1269 if (global && rx->startp[0] != -1) {
1270 t = s = rx->endp[0] + truebase - rx->gofs;
1271 if ((s + rx->minlen) > strend || s < truebase)
1272 goto nope;
1273 if (update_minmatch++)
1274 minmatch = had_zerolen;
1275 }
1276 if (rx->extflags & RXf_USE_INTUIT &&
1277 DO_UTF8(TARG) == ((rx->extflags & RXf_UTF8) != 0)) {
1278 /* FIXME - can PL_bostr be made const char *? */
1279 PL_bostr = (char *)truebase;
1280 s = CALLREG_INTUIT_START(rx, TARG, (char *)s, (char *)strend, r_flags, NULL);
1281
1282 if (!s)
1283 goto nope;
1284 if ( (rx->extflags & RXf_CHECK_ALL)
1285 && !PL_sawampersand
1286 && !(pm->op_pmflags & PMf_KEEPCOPY)
1287 && ((rx->extflags & RXf_NOSCAN)
1288 || !((rx->extflags & RXf_INTUIT_TAIL)
1289 && (r_flags & REXEC_SCREAM)))
1290 && !SvROK(TARG)) /* Cannot trust since INTUIT cannot guess ^ */
1291 goto yup;
1292 }
1293 if (CALLREGEXEC(rx, (char*)s, (char *)strend, (char*)truebase, minmatch, TARG, INT2PTR(void*, gpos), r_flags))
1294 {
1295 PL_curpm = pm;
1296 if (dynpm->op_pmflags & PMf_ONCE)
1297 dynpm->op_pmdynflags |= PMdf_USED;
1298 goto gotcha;
1299 }
1300 else
1301 goto ret_no;
1302 /*NOTREACHED*/
1303
1304 gotcha:
1305 if (rxtainted)
1306 RX_MATCH_TAINTED_on(rx);
1307 TAINT_IF(RX_MATCH_TAINTED(rx));
1308 if (gimme == G_ARRAY) {
1309 const I32 nparens = rx->nparens;
1310 I32 i = (global && !nparens) ? 1 : 0;
1311
1312 SPAGAIN; /* EVAL blocks could move the stack. */
1313 EXTEND(SP, nparens + i);
1314 EXTEND_MORTAL(nparens + i);
1315 for (i = !i; i <= nparens; i++) {
1316 PUSHs(sv_newmortal());
1317 if ((rx->startp[i] != -1) && rx->endp[i] != -1 ) {
1318 const I32 len = rx->endp[i] - rx->startp[i];
1319 s = rx->startp[i] + truebase;
1320 if (rx->endp[i] < 0 || rx->startp[i] < 0 ||
1321 len < 0 || len > strend - s)
1322 DIE(aTHX_ "panic: pp_match start/end pointers");
1323 sv_setpvn(*SP, s, len);
1324 if (DO_UTF8(TARG) && is_utf8_string((U8*)s, len))
1325 SvUTF8_on(*SP);
1326 }
1327 }
1328 if (global) {
1329 if (dynpm->op_pmflags & PMf_CONTINUE) {
1330 MAGIC* mg = NULL;
1331 if (SvTYPE(TARG) >= SVt_PVMG && SvMAGIC(TARG))
1332 mg = mg_find(TARG, PERL_MAGIC_regex_global);
1333 if (!mg) {
1334#ifdef PERL_OLD_COPY_ON_WRITE
1335 if (SvIsCOW(TARG))
1336 sv_force_normal_flags(TARG, 0);
1337#endif
1338 mg = sv_magicext(TARG, NULL, PERL_MAGIC_regex_global,
1339 &PL_vtbl_mglob, NULL, 0);
1340 }
1341 if (rx->startp[0] != -1) {
1342 mg->mg_len = rx->endp[0];
1343 if (rx->startp[0] + rx->gofs == (UV)rx->endp[0])
1344 mg->mg_flags |= MGf_MINMATCH;
1345 else
1346 mg->mg_flags &= ~MGf_MINMATCH;
1347 }
1348 }
1349 had_zerolen = (rx->startp[0] != -1
1350 && rx->startp[0] + rx->gofs == (UV)rx->endp[0]);
1351 PUTBACK; /* EVAL blocks may use stack */
1352 r_flags |= REXEC_IGNOREPOS | REXEC_NOT_FIRST;
1353 goto play_it_again;
1354 }
1355 else if (!nparens)
1356 XPUSHs(&PL_sv_yes);
1357 LEAVE_SCOPE(oldsave);
1358 RETURN;
1359 }
1360 else {
1361 if (global) {
1362 MAGIC* mg;
1363 if (SvTYPE(TARG) >= SVt_PVMG && SvMAGIC(TARG))
1364 mg = mg_find(TARG, PERL_MAGIC_regex_global);
1365 else
1366 mg = NULL;
1367 if (!mg) {
1368#ifdef PERL_OLD_COPY_ON_WRITE
1369 if (SvIsCOW(TARG))
1370 sv_force_normal_flags(TARG, 0);
1371#endif
1372 mg = sv_magicext(TARG, NULL, PERL_MAGIC_regex_global,
1373 &PL_vtbl_mglob, NULL, 0);
1374 }
1375 if (rx->startp[0] != -1) {
1376 mg->mg_len = rx->endp[0];
1377 if (rx->startp[0] + rx->gofs == (UV)rx->endp[0])
1378 mg->mg_flags |= MGf_MINMATCH;
1379 else
1380 mg->mg_flags &= ~MGf_MINMATCH;
1381 }
1382 }
1383 LEAVE_SCOPE(oldsave);
1384 RETPUSHYES;
1385 }
1386
1387yup: /* Confirmed by INTUIT */
1388 if (rxtainted)
1389 RX_MATCH_TAINTED_on(rx);
1390 TAINT_IF(RX_MATCH_TAINTED(rx));
1391 PL_curpm = pm;
1392 if (dynpm->op_pmflags & PMf_ONCE)
1393 dynpm->op_pmdynflags |= PMdf_USED;
1394 if (RX_MATCH_COPIED(rx))
1395 Safefree(rx->subbeg);
1396 RX_MATCH_COPIED_off(rx);
1397 rx->subbeg = NULL;
1398 if (global) {
1399 /* FIXME - should rx->subbeg be const char *? */
1400 rx->subbeg = (char *) truebase;
1401 rx->startp[0] = s - truebase;
1402 if (RX_MATCH_UTF8(rx)) {
1403 char * const t = (char*)utf8_hop((U8*)s, rx->minlenret);
1404 rx->endp[0] = t - truebase;
1405 }
1406 else {
1407 rx->endp[0] = s - truebase + rx->minlenret;
1408 }
1409 rx->sublen = strend - truebase;
1410 goto gotcha;
1411 }
1412 if (PL_sawampersand || pm->op_pmflags & PMf_KEEPCOPY) {
1413 I32 off;
1414#ifdef PERL_OLD_COPY_ON_WRITE
1415 if (SvIsCOW(TARG) || (SvFLAGS(TARG) & CAN_COW_MASK) == CAN_COW_FLAGS) {
1416 if (DEBUG_C_TEST) {
1417 PerlIO_printf(Perl_debug_log,
1418 "Copy on write: pp_match $& capture, type %d, truebase=%p, t=%p, difference %d\n",
1419 (int) SvTYPE(TARG), (void*)truebase, (void*)t,
1420 (int)(t-truebase));
1421 }
1422 rx->saved_copy = sv_setsv_cow(rx->saved_copy, TARG);
1423 rx->subbeg = (char *) SvPVX_const(rx->saved_copy) + (t - truebase);
1424 assert (SvPOKp(rx->saved_copy));
1425 } else
1426#endif
1427 {
1428
1429 rx->subbeg = savepvn(t, strend - t);
1430#ifdef PERL_OLD_COPY_ON_WRITE
1431 rx->saved_copy = NULL;
1432#endif
1433 }
1434 rx->sublen = strend - t;
1435 RX_MATCH_COPIED_on(rx);
1436 off = rx->startp[0] = s - t;
1437 rx->endp[0] = off + rx->minlenret;
1438 }
1439 else { /* startp/endp are used by @- @+. */
1440 rx->startp[0] = s - truebase;
1441 rx->endp[0] = s - truebase + rx->minlenret;
1442 }
1443 /* including rx->nparens in the below code seems highly suspicious.
1444 -dmq */
1445 rx->nparens = rx->lastparen = rx->lastcloseparen = 0; /* used by @-, @+, and $^N */
1446 LEAVE_SCOPE(oldsave);
1447 RETPUSHYES;
1448
1449nope:
1450ret_no:
1451 if (global && !(dynpm->op_pmflags & PMf_CONTINUE)) {
1452 if (SvTYPE(TARG) >= SVt_PVMG && SvMAGIC(TARG)) {
1453 MAGIC* const mg = mg_find(TARG, PERL_MAGIC_regex_global);
1454 if (mg)
1455 mg->mg_len = -1;
1456 }
1457 }
1458 LEAVE_SCOPE(oldsave);
1459 if (gimme == G_ARRAY)
1460 RETURN;
1461 RETPUSHNO;
1462}
1463
1464OP *
1465Perl_do_readline(pTHX)
1466{
1467 dVAR; dSP; dTARGETSTACKED;
1468 register SV *sv;
1469 STRLEN tmplen = 0;
1470 STRLEN offset;
1471 PerlIO *fp;
1472 register IO * const io = GvIO(PL_last_in_gv);
1473 register const I32 type = PL_op->op_type;
1474 const I32 gimme = GIMME_V;
1475
1476 if (io) {
1477 MAGIC * const mg = SvTIED_mg((SV*)io, PERL_MAGIC_tiedscalar);
1478 if (mg) {
1479 PUSHMARK(SP);
1480 XPUSHs(SvTIED_obj((SV*)io, mg));
1481 PUTBACK;
1482 ENTER;
1483 call_method("READLINE", gimme);
1484 LEAVE;
1485 SPAGAIN;
1486 if (gimme == G_SCALAR) {
1487 SV* const result = POPs;
1488 SvSetSV_nosteal(TARG, result);
1489 PUSHTARG;
1490 }
1491 RETURN;
1492 }
1493 }
1494 fp = NULL;
1495 if (io) {
1496 fp = IoIFP(io);
1497 if (!fp) {
1498 if (IoFLAGS(io) & IOf_ARGV) {
1499 if (IoFLAGS(io) & IOf_START) {
1500 IoLINES(io) = 0;
1501 if (av_len(GvAVn(PL_last_in_gv)) < 0) {
1502 IoFLAGS(io) &= ~IOf_START;
1503 do_open(PL_last_in_gv,"-",1,FALSE,O_RDONLY,0,NULL);
1504 sv_setpvn(GvSVn(PL_last_in_gv), "-", 1);
1505 SvSETMAGIC(GvSV(PL_last_in_gv));
1506 fp = IoIFP(io);
1507 goto have_fp;
1508 }
1509 }
1510 fp = nextargv(PL_last_in_gv);
1511 if (!fp) { /* Note: fp != IoIFP(io) */
1512 (void)do_close(PL_last_in_gv, FALSE); /* now it does*/
1513 }
1514 }
1515 else if (type == OP_GLOB)
1516 fp = Perl_start_glob(aTHX_ POPs, io);
1517 }
1518 else if (type == OP_GLOB)
1519 SP--;
1520 else if (ckWARN(WARN_IO) && IoTYPE(io) == IoTYPE_WRONLY) {
1521 report_evil_fh(PL_last_in_gv, io, OP_phoney_OUTPUT_ONLY);
1522 }
1523 }
1524 if (!fp) {
1525 if ((!io || !(IoFLAGS(io) & IOf_START))
1526 && ckWARN2(WARN_GLOB, WARN_CLOSED))
1527 {
1528 if (type == OP_GLOB)
1529 Perl_warner(aTHX_ packWARN(WARN_GLOB),
1530 "glob failed (can't start child: %s)",
1531 Strerror(errno));
1532 else
1533 report_evil_fh(PL_last_in_gv, io, PL_op->op_type);
1534 }
1535 if (gimme == G_SCALAR) {
1536 /* undef TARG, and push that undefined value */
1537 if (type != OP_RCATLINE) {
1538 SV_CHECK_THINKFIRST_COW_DROP(TARG);
1539 SvOK_off(TARG);
1540 }
1541 PUSHTARG;
1542 }
1543 RETURN;
1544 }
1545 have_fp:
1546 if (gimme == G_SCALAR) {
1547 sv = TARG;
1548 if (type == OP_RCATLINE && SvGMAGICAL(sv))
1549 mg_get(sv);
1550 if (SvROK(sv)) {
1551 if (type == OP_RCATLINE)
1552 SvPV_force_nolen(sv);
1553 else
1554 sv_unref(sv);
1555 }
1556 else if (isGV_with_GP(sv)) {
1557 SvPV_force_nolen(sv);
1558 }
1559 SvUPGRADE(sv, SVt_PV);
1560 tmplen = SvLEN(sv); /* remember if already alloced */
1561 if (!tmplen && !SvREADONLY(sv))
1562 Sv_Grow(sv, 80); /* try short-buffering it */
1563 offset = 0;
1564 if (type == OP_RCATLINE && SvOK(sv)) {
1565 if (!SvPOK(sv)) {
1566 SvPV_force_nolen(sv);
1567 }
1568 offset = SvCUR(sv);
1569 }
1570 }
1571 else {
1572 sv = sv_2mortal(newSV(80));
1573 offset = 0;
1574 }
1575
1576 /* This should not be marked tainted if the fp is marked clean */
1577#define MAYBE_TAINT_LINE(io, sv) \
1578 if (!(IoFLAGS(io) & IOf_UNTAINT)) { \
1579 TAINT; \
1580 SvTAINTED_on(sv); \
1581 }
1582
1583/* delay EOF state for a snarfed empty file */
1584#define SNARF_EOF(gimme,rs,io,sv) \
1585 (gimme != G_SCALAR || SvCUR(sv) \
1586 || (IoFLAGS(io) & IOf_NOLINE) || !RsSNARF(rs))
1587
1588 for (;;) {
1589 PUTBACK;
1590 if (!sv_gets(sv, fp, offset)
1591 && (type == OP_GLOB
1592 || SNARF_EOF(gimme, PL_rs, io, sv)
1593 || PerlIO_error(fp)))
1594 {
1595 PerlIO_clearerr(fp);
1596 if (IoFLAGS(io) & IOf_ARGV) {
1597 fp = nextargv(PL_last_in_gv);
1598 if (fp)
1599 continue;
1600 (void)do_close(PL_last_in_gv, FALSE);
1601 }
1602 else if (type == OP_GLOB) {
1603 if (!do_close(PL_last_in_gv, FALSE) && ckWARN(WARN_GLOB)) {
1604 Perl_warner(aTHX_ packWARN(WARN_GLOB),
1605 "glob failed (child exited with status %d%s)",
1606 (int)(STATUS_CURRENT >> 8),
1607 (STATUS_CURRENT & 0x80) ? ", core dumped" : "");
1608 }
1609 }
1610 if (gimme == G_SCALAR) {
1611 if (type != OP_RCATLINE) {
1612 SV_CHECK_THINKFIRST_COW_DROP(TARG);
1613 SvOK_off(TARG);
1614 }
1615 SPAGAIN;
1616 PUSHTARG;
1617 }
1618 MAYBE_TAINT_LINE(io, sv);
1619 RETURN;
1620 }
1621 MAYBE_TAINT_LINE(io, sv);
1622 IoLINES(io)++;
1623 IoFLAGS(io) |= IOf_NOLINE;
1624 SvSETMAGIC(sv);
1625 SPAGAIN;
1626 XPUSHs(sv);
1627 if (type == OP_GLOB) {
1628 const char *t1;
1629
1630 if (SvCUR(sv) > 0 && SvCUR(PL_rs) > 0) {
1631 char * const tmps = SvEND(sv) - 1;
1632 if (*tmps == *SvPVX_const(PL_rs)) {
1633 *tmps = '\0';
1634 SvCUR_set(sv, SvCUR(sv) - 1);
1635 }
1636 }
1637 for (t1 = SvPVX_const(sv); *t1; t1++)
1638 if (!isALPHA(*t1) && !isDIGIT(*t1) &&
1639 strchr("$&*(){}[]'\";\\|?<>~`", *t1))
1640 break;
1641 if (*t1 && PerlLIO_lstat(SvPVX_const(sv), &PL_statbuf) < 0) {
1642 (void)POPs; /* Unmatched wildcard? Chuck it... */
1643 continue;
1644 }
1645 } else if (SvUTF8(sv)) { /* OP_READLINE, OP_RCATLINE */
1646 if (ckWARN(WARN_UTF8)) {
1647 const U8 * const s = (const U8*)SvPVX_const(sv) + offset;
1648 const STRLEN len = SvCUR(sv) - offset;
1649 const U8 *f;
1650
1651 if (!is_utf8_string_loc(s, len, &f))
1652 /* Emulate :encoding(utf8) warning in the same case. */
1653 Perl_warner(aTHX_ packWARN(WARN_UTF8),
1654 "utf8 \"\\x%02X\" does not map to Unicode",
1655 f < (U8*)SvEND(sv) ? *f : 0);
1656 }
1657 }
1658 if (gimme == G_ARRAY) {
1659 if (SvLEN(sv) - SvCUR(sv) > 20) {
1660 SvPV_shrink_to_cur(sv);
1661 }
1662 sv = sv_2mortal(newSV(80));
1663 continue;
1664 }
1665 else if (gimme == G_SCALAR && !tmplen && SvLEN(sv) - SvCUR(sv) > 80) {
1666 /* try to reclaim a bit of scalar space (only on 1st alloc) */
1667 const STRLEN new_len
1668 = SvCUR(sv) < 60 ? 80 : SvCUR(sv)+40; /* allow some slop */
1669 SvPV_renew(sv, new_len);
1670 }
1671 RETURN;
1672 }
1673}
1674
1675PP(pp_enter)
1676{
1677 dVAR; dSP;
1678 register PERL_CONTEXT *cx;
1679 I32 gimme = OP_GIMME(PL_op, -1);
1680
1681 if (gimme == -1) {
1682 if (cxstack_ix >= 0)
1683 gimme = cxstack[cxstack_ix].blk_gimme;
1684 else
1685 gimme = G_SCALAR;
1686 }
1687
1688 ENTER;
1689
1690 SAVETMPS;
1691 PUSHBLOCK(cx, CXt_BLOCK, SP);
1692
1693 RETURN;
1694}
1695
1696PP(pp_helem)
1697{
1698 dVAR; dSP;
1699 HE* he;
1700 SV **svp;
1701 SV * const keysv = POPs;
1702 HV * const hv = (HV*)POPs;
1703 const U32 lval = PL_op->op_flags & OPf_MOD || LVRET;
1704 const U32 defer = PL_op->op_private & OPpLVAL_DEFER;
1705 SV *sv;
1706 const U32 hash = (SvIsCOW_shared_hash(keysv)) ? SvSHARED_HASH(keysv) : 0;
1707 I32 preeminent = 0;
1708
1709 if (SvTYPE(hv) != SVt_PVHV)
1710 RETPUSHUNDEF;
1711
1712 if (PL_op->op_private & OPpLVAL_INTRO) {
1713 MAGIC *mg;
1714 HV *stash;
1715 /* does the element we're localizing already exist? */
1716 preeminent = /* can we determine whether it exists? */
1717 ( !SvRMAGICAL(hv)
1718 || mg_find((SV*)hv, PERL_MAGIC_env)
1719 || ( (mg = mg_find((SV*)hv, PERL_MAGIC_tied))
1720 /* Try to preserve the existenceness of a tied hash
1721 * element by using EXISTS and DELETE if possible.
1722 * Fallback to FETCH and STORE otherwise */
1723 && (stash = SvSTASH(SvRV(SvTIED_obj((SV*)hv, mg))))
1724 && gv_fetchmethod_autoload(stash, "EXISTS", TRUE)
1725 && gv_fetchmethod_autoload(stash, "DELETE", TRUE)
1726 )
1727 ) ? hv_exists_ent(hv, keysv, 0) : 1;
1728 }
1729 he = hv_fetch_ent(hv, keysv, lval && !defer, hash);
1730 svp = he ? &HeVAL(he) : NULL;
1731 if (lval) {
1732 if (!svp || *svp == &PL_sv_undef) {
1733 SV* lv;
1734 SV* key2;
1735 if (!defer) {
1736 DIE(aTHX_ PL_no_helem_sv, SVfARG(keysv));
1737 }
1738 lv = sv_newmortal();
1739 sv_upgrade(lv, SVt_PVLV);
1740 LvTYPE(lv) = 'y';
1741 sv_magic(lv, key2 = newSVsv(keysv), PERL_MAGIC_defelem, NULL, 0);
1742 SvREFCNT_dec(key2); /* sv_magic() increments refcount */
1743 LvTARG(lv) = SvREFCNT_inc_simple(hv);
1744 LvTARGLEN(lv) = 1;
1745 PUSHs(lv);
1746 RETURN;
1747 }
1748 if (PL_op->op_private & OPpLVAL_INTRO) {
1749 if (HvNAME_get(hv) && isGV(*svp))
1750 save_gp((GV*)*svp, !(PL_op->op_flags & OPf_SPECIAL));
1751 else {
1752 if (!preeminent) {
1753 STRLEN keylen;
1754 const char * const key = SvPV_const(keysv, keylen);
1755 SAVEDELETE(hv, savepvn(key,keylen),
1756 SvUTF8(keysv) ? -(I32)keylen : (I32)keylen);
1757 } else
1758 save_helem(hv, keysv, svp);
1759 }
1760 }
1761 else if (PL_op->op_private & OPpDEREF)
1762 vivify_ref(*svp, PL_op->op_private & OPpDEREF);
1763 }
1764 sv = (svp ? *svp : &PL_sv_undef);
1765 /* This makes C<local $tied{foo} = $tied{foo}> possible.
1766 * Pushing the magical RHS on to the stack is useless, since
1767 * that magic is soon destined to be misled by the local(),
1768 * and thus the later pp_sassign() will fail to mg_get() the
1769 * old value. This should also cure problems with delayed
1770 * mg_get()s. GSAR 98-07-03 */
1771 if (!lval && SvGMAGICAL(sv))
1772 sv = sv_mortalcopy(sv);
1773 PUSHs(sv);
1774 RETURN;
1775}
1776
1777PP(pp_leave)
1778{
1779 dVAR; dSP;
1780 register PERL_CONTEXT *cx;
1781 SV **newsp;
1782 PMOP *newpm;
1783 I32 gimme;
1784
1785 if (PL_op->op_flags & OPf_SPECIAL) {
1786 cx = &cxstack[cxstack_ix];
1787 cx->blk_oldpm = PL_curpm; /* fake block should preserve $1 et al */
1788 }
1789
1790 POPBLOCK(cx,newpm);
1791
1792 gimme = OP_GIMME(PL_op, -1);
1793 if (gimme == -1) {
1794 if (cxstack_ix >= 0)
1795 gimme = cxstack[cxstack_ix].blk_gimme;
1796 else
1797 gimme = G_SCALAR;
1798 }
1799
1800 TAINT_NOT;
1801 if (gimme == G_VOID)
1802 SP = newsp;
1803 else if (gimme == G_SCALAR) {
1804 register SV **mark;
1805 MARK = newsp + 1;
1806 if (MARK <= SP) {
1807 if (SvFLAGS(TOPs) & (SVs_PADTMP|SVs_TEMP))
1808 *MARK = TOPs;
1809 else
1810 *MARK = sv_mortalcopy(TOPs);
1811 } else {
1812 MEXTEND(mark,0);
1813 *MARK = &PL_sv_undef;
1814 }
1815 SP = MARK;
1816 }
1817 else if (gimme == G_ARRAY) {
1818 /* in case LEAVE wipes old return values */
1819 register SV **mark;
1820 for (mark = newsp + 1; mark <= SP; mark++) {
1821 if (!(SvFLAGS(*mark) & (SVs_PADTMP|SVs_TEMP))) {
1822 *mark = sv_mortalcopy(*mark);
1823 TAINT_NOT; /* Each item is independent */
1824 }
1825 }
1826 }
1827 PL_curpm = newpm; /* Don't pop $1 et al till now */
1828
1829 LEAVE;
1830
1831 RETURN;
1832}
1833
1834PP(pp_iter)
1835{
1836 dVAR; dSP;
1837 register PERL_CONTEXT *cx;
1838 SV *sv, *oldsv;
1839 AV* av;
1840 SV **itersvp;
1841
1842 EXTEND(SP, 1);
1843 cx = &cxstack[cxstack_ix];
1844 if (CxTYPE(cx) != CXt_LOOP)
1845 DIE(aTHX_ "panic: pp_iter");
1846
1847 itersvp = CxITERVAR(cx);
1848 av = cx->blk_loop.iterary;
1849 if (SvTYPE(av) != SVt_PVAV) {
1850 /* iterate ($min .. $max) */
1851 if (cx->blk_loop.iterlval) {
1852 /* string increment */
1853 register SV* cur = cx->blk_loop.iterlval;
1854 STRLEN maxlen = 0;
1855 const char *max =
1856 SvOK((SV*)av) ?
1857 SvPV_const((SV*)av, maxlen) : (const char *)"";
1858 if (!SvNIOK(cur) && SvCUR(cur) <= maxlen) {
1859 if (SvREFCNT(*itersvp) == 1 && !SvMAGICAL(*itersvp)) {
1860 /* safe to reuse old SV */
1861 sv_setsv(*itersvp, cur);
1862 }
1863 else
1864 {
1865 /* we need a fresh SV every time so that loop body sees a
1866 * completely new SV for closures/references to work as
1867 * they used to */
1868 oldsv = *itersvp;
1869 *itersvp = newSVsv(cur);
1870 SvREFCNT_dec(oldsv);
1871 }
1872 if (strEQ(SvPVX_const(cur), max))
1873 sv_setiv(cur, 0); /* terminate next time */
1874 else
1875 sv_inc(cur);
1876 RETPUSHYES;
1877 }
1878 RETPUSHNO;
1879 }
1880 /* integer increment */
1881 if (cx->blk_loop.iterix > cx->blk_loop.itermax)
1882 RETPUSHNO;
1883
1884 /* don't risk potential race */
1885 if (SvREFCNT(*itersvp) == 1 && !SvMAGICAL(*itersvp)) {
1886 /* safe to reuse old SV */
1887 sv_setiv(*itersvp, cx->blk_loop.iterix++);
1888 }
1889 else
1890 {
1891 /* we need a fresh SV every time so that loop body sees a
1892 * completely new SV for closures/references to work as they
1893 * used to */
1894 oldsv = *itersvp;
1895 *itersvp = newSViv(cx->blk_loop.iterix++);
1896 SvREFCNT_dec(oldsv);
1897 }
1898 RETPUSHYES;
1899 }
1900
1901 /* iterate array */
1902 if (PL_op->op_private & OPpITER_REVERSED) {
1903 /* In reverse, use itermax as the min :-) */
1904 if (cx->blk_loop.iterix <= cx->blk_loop.itermax)
1905 RETPUSHNO;
1906
1907 if (SvMAGICAL(av) || AvREIFY(av)) {
1908 SV * const * const svp = av_fetch(av, --cx->blk_loop.iterix, FALSE);
1909 sv = svp ? *svp : NULL;
1910 }
1911 else {
1912 sv = AvARRAY(av)[--cx->blk_loop.iterix];
1913 }
1914 }
1915 else {
1916 if (cx->blk_loop.iterix >= (av == PL_curstack ? cx->blk_oldsp :
1917 AvFILL(av)))
1918 RETPUSHNO;
1919
1920 if (SvMAGICAL(av) || AvREIFY(av)) {
1921 SV * const * const svp = av_fetch(av, ++cx->blk_loop.iterix, FALSE);
1922 sv = svp ? *svp : NULL;
1923 }
1924 else {
1925 sv = AvARRAY(av)[++cx->blk_loop.iterix];
1926 }
1927 }
1928
1929 if (sv && SvIS_FREED(sv)) {
1930 *itersvp = NULL;
1931 Perl_croak(aTHX_ "Use of freed value in iteration");
1932 }
1933
1934 if (sv)
1935 SvTEMP_off(sv);
1936 else
1937 sv = &PL_sv_undef;
1938 if (av != PL_curstack && sv == &PL_sv_undef) {
1939 SV *lv = cx->blk_loop.iterlval;
1940 if (lv && SvREFCNT(lv) > 1) {
1941 SvREFCNT_dec(lv);
1942 lv = NULL;
1943 }
1944 if (lv)
1945 SvREFCNT_dec(LvTARG(lv));
1946 else {
1947 lv = cx->blk_loop.iterlval = newSV_type(SVt_PVLV);
1948 LvTYPE(lv) = 'y';
1949 sv_magic(lv, NULL, PERL_MAGIC_defelem, NULL, 0);
1950 }
1951 LvTARG(lv) = SvREFCNT_inc_simple(av);
1952 LvTARGOFF(lv) = cx->blk_loop.iterix;
1953 LvTARGLEN(lv) = (STRLEN)UV_MAX;
1954 sv = (SV*)lv;
1955 }
1956
1957 oldsv = *itersvp;
1958 *itersvp = SvREFCNT_inc_simple_NN(sv);
1959 SvREFCNT_dec(oldsv);
1960
1961 RETPUSHYES;
1962}
1963
1964PP(pp_subst)
1965{
1966 dVAR; dSP; dTARG;
1967 register PMOP *pm = cPMOP;
1968 PMOP *rpm = pm;
1969 register char *s;
1970 char *strend;
1971 register char *m;
1972 const char *c;
1973 register char *d;
1974 STRLEN clen;
1975 I32 iters = 0;
1976 I32 maxiters;
1977 register I32 i;
1978 bool once;
1979 bool rxtainted;
1980 char *orig;
1981 I32 r_flags;
1982 register REGEXP *rx = PM_GETRE(pm);
1983 STRLEN len;
1984 int force_on_match = 0;
1985 const I32 oldsave = PL_savestack_ix;
1986 STRLEN slen;
1987 bool doutf8 = FALSE;
1988#ifdef PERL_OLD_COPY_ON_WRITE
1989 bool is_cow;
1990#endif
1991 SV *nsv = NULL;
1992
1993 /* known replacement string? */
1994 register SV *dstr = (pm->op_pmflags & PMf_CONST) ? POPs : NULL;
1995 if (PL_op->op_flags & OPf_STACKED)
1996 TARG = POPs;
1997 else if (PL_op->op_private & OPpTARGET_MY)
1998 GETTARGET;
1999 else {
2000 TARG = DEFSV;
2001 EXTEND(SP,1);
2002 }
2003
2004#ifdef PERL_OLD_COPY_ON_WRITE
2005 /* Awooga. Awooga. "bool" types that are actually char are dangerous,
2006 because they make integers such as 256 "false". */
2007 is_cow = SvIsCOW(TARG) ? TRUE : FALSE;
2008#else
2009 if (SvIsCOW(TARG))
2010 sv_force_normal_flags(TARG,0);
2011#endif
2012 if (
2013#ifdef PERL_OLD_COPY_ON_WRITE
2014 !is_cow &&
2015#endif
2016 (SvREADONLY(TARG)
2017 || ( ((SvTYPE(TARG) == SVt_PVGV && isGV_with_GP(TARG))
2018 || SvTYPE(TARG) > SVt_PVLV)
2019 && !(SvTYPE(TARG) == SVt_PVGV && SvFAKE(TARG)))))
2020 DIE(aTHX_ PL_no_modify);
2021 PUTBACK;
2022
2023 s = SvPV_mutable(TARG, len);
2024 if (!SvPOKp(TARG) || SvTYPE(TARG) == SVt_PVGV)
2025 force_on_match = 1;
2026 rxtainted = ((pm->op_pmdynflags & PMdf_TAINTED) ||
2027 (PL_tainted && (pm->op_pmflags & PMf_RETAINT)));
2028 if (PL_tainted)
2029 rxtainted |= 2;
2030 TAINT_NOT;
2031
2032 RX_MATCH_UTF8_set(rx, DO_UTF8(TARG));
2033
2034 force_it:
2035 if (!pm || !s)
2036 DIE(aTHX_ "panic: pp_subst");
2037
2038 strend = s + len;
2039 slen = RX_MATCH_UTF8(rx) ? utf8_length((U8*)s, (U8*)strend) : len;
2040 maxiters = 2 * slen + 10; /* We can match twice at each
2041 position, once with zero-length,
2042 second time with non-zero. */
2043
2044 if (!rx->prelen && PL_curpm) {
2045 pm = PL_curpm;
2046 rx = PM_GETRE(pm);
2047 }
2048 r_flags = (rx->nparens || SvTEMP(TARG) || PL_sawampersand
2049 || (pm->op_pmflags & (PMf_EVAL|PMf_KEEPCOPY)) )
2050 ? REXEC_COPY_STR : 0;
2051 if (SvSCREAM(TARG))
2052 r_flags |= REXEC_SCREAM;
2053
2054 orig = m = s;
2055 if (rx->extflags & RXf_USE_INTUIT) {
2056 PL_bostr = orig;
2057 s = CALLREG_INTUIT_START(rx, TARG, s, strend, r_flags, NULL);
2058
2059 if (!s)
2060 goto nope;
2061 /* How to do it in subst? */
2062/* if ( (rx->extflags & RXf_CHECK_ALL)
2063 && !PL_sawampersand
2064 && !(pm->op_pmflags & PMf_KEEPCOPY)
2065 && ((rx->extflags & RXf_NOSCAN)
2066 || !((rx->extflags & RXf_INTUIT_TAIL)
2067 && (r_flags & REXEC_SCREAM))))
2068 goto yup;
2069*/
2070 }
2071
2072 /* only replace once? */
2073 once = !(rpm->op_pmflags & PMf_GLOBAL);
2074
2075 /* known replacement string? */
2076 if (dstr) {
2077 /* replacement needing upgrading? */
2078 if (DO_UTF8(TARG) && !doutf8) {
2079 nsv = sv_newmortal();
2080 SvSetSV(nsv, dstr);
2081 if (PL_encoding)
2082 sv_recode_to_utf8(nsv, PL_encoding);
2083 else
2084 sv_utf8_upgrade(nsv);
2085 c = SvPV_const(nsv, clen);
2086 doutf8 = TRUE;
2087 }
2088 else {
2089 c = SvPV_const(dstr, clen);
2090 doutf8 = DO_UTF8(dstr);
2091 }
2092 }
2093 else {
2094 c = NULL;
2095 doutf8 = FALSE;
2096 }
2097
2098 /* can do inplace substitution? */
2099 if (c
2100#ifdef PERL_OLD_COPY_ON_WRITE
2101 && !is_cow
2102#endif
2103 && (I32)clen <= rx->minlenret && (once || !(r_flags & REXEC_COPY_STR))
2104 && !(rx->extflags & RXf_LOOKBEHIND_SEEN)
2105 && (!doutf8 || SvUTF8(TARG))) {
2106 if (!CALLREGEXEC(rx, s, strend, orig, 0, TARG, NULL,
2107 r_flags | REXEC_CHECKED))
2108 {
2109 SPAGAIN;
2110 PUSHs(&PL_sv_no);
2111 LEAVE_SCOPE(oldsave);
2112 RETURN;
2113 }
2114#ifdef PERL_OLD_COPY_ON_WRITE
2115 if (SvIsCOW(TARG)) {
2116 assert (!force_on_match);
2117 goto have_a_cow;
2118 }
2119#endif
2120 if (force_on_match) {
2121 force_on_match = 0;
2122 s = SvPV_force(TARG, len);
2123 goto force_it;
2124 }
2125 d = s;
2126 PL_curpm = pm;
2127 SvSCREAM_off(TARG); /* disable possible screamer */
2128 if (once) {
2129 rxtainted |= RX_MATCH_TAINTED(rx);
2130 m = orig + rx->startp[0];
2131 d = orig + rx->endp[0];
2132 s = orig;
2133 if (m - s > strend - d) { /* faster to shorten from end */
2134 if (clen) {
2135 Copy(c, m, clen, char);
2136 m += clen;
2137 }
2138 i = strend - d;
2139 if (i > 0) {
2140 Move(d, m, i, char);
2141 m += i;
2142 }
2143 *m = '\0';
2144 SvCUR_set(TARG, m - s);
2145 }
2146 else if ((i = m - s)) { /* faster from front */
2147 d -= clen;
2148 m = d;
2149 sv_chop(TARG, d-i);
2150 s += i;
2151 while (i--)
2152 *--d = *--s;
2153 if (clen)
2154 Copy(c, m, clen, char);
2155 }
2156 else if (clen) {
2157 d -= clen;
2158 sv_chop(TARG, d);
2159 Copy(c, d, clen, char);
2160 }
2161 else {
2162 sv_chop(TARG, d);
2163 }
2164 TAINT_IF(rxtainted & 1);
2165 SPAGAIN;
2166 PUSHs(&PL_sv_yes);
2167 }
2168 else {
2169 do {
2170 if (iters++ > maxiters)
2171 DIE(aTHX_ "Substitution loop");
2172 rxtainted |= RX_MATCH_TAINTED(rx);
2173 m = rx->startp[0] + orig;
2174 if ((i = m - s)) {
2175 if (s != d)
2176 Move(s, d, i, char);
2177 d += i;
2178 }
2179 if (clen) {
2180 Copy(c, d, clen, char);
2181 d += clen;
2182 }
2183 s = rx->endp[0] + orig;
2184 } while (CALLREGEXEC(rx, s, strend, orig, s == m,
2185 TARG, NULL,
2186 /* don't match same null twice */
2187 REXEC_NOT_FIRST|REXEC_IGNOREPOS));
2188 if (s != d) {
2189 i = strend - s;
2190 SvCUR_set(TARG, d - SvPVX_const(TARG) + i);
2191 Move(s, d, i+1, char); /* include the NUL */
2192 }
2193 TAINT_IF(rxtainted & 1);
2194 SPAGAIN;
2195 PUSHs(sv_2mortal(newSViv((I32)iters)));
2196 }
2197 (void)SvPOK_only_UTF8(TARG);
2198 TAINT_IF(rxtainted);
2199 if (SvSMAGICAL(TARG)) {
2200 PUTBACK;
2201 mg_set(TARG);
2202 SPAGAIN;
2203 }
2204 SvTAINT(TARG);
2205 if (doutf8)
2206 SvUTF8_on(TARG);
2207 LEAVE_SCOPE(oldsave);
2208 RETURN;
2209 }
2210
2211 if (CALLREGEXEC(rx, s, strend, orig, 0, TARG, NULL,
2212 r_flags | REXEC_CHECKED))
2213 {
2214 if (force_on_match) {
2215 force_on_match = 0;
2216 s = SvPV_force(TARG, len);
2217 goto force_it;
2218 }
2219#ifdef PERL_OLD_COPY_ON_WRITE
2220 have_a_cow:
2221#endif
2222 rxtainted |= RX_MATCH_TAINTED(rx);
2223 dstr = newSVpvn(m, s-m);
2224 SAVEFREESV(dstr);
2225 if (DO_UTF8(TARG))
2226 SvUTF8_on(dstr);
2227 PL_curpm = pm;
2228 if (!c) {
2229 register PERL_CONTEXT *cx;
2230 SPAGAIN;
2231 PUSHSUBST(cx);
2232 RETURNOP(cPMOP->op_pmreplroot);
2233 }
2234 r_flags |= REXEC_IGNOREPOS | REXEC_NOT_FIRST;
2235 do {
2236 if (iters++ > maxiters)
2237 DIE(aTHX_ "Substitution loop");
2238 rxtainted |= RX_MATCH_TAINTED(rx);
2239 if (RX_MATCH_COPIED(rx) && rx->subbeg != orig) {
2240 m = s;
2241 s = orig;
2242 orig = rx->subbeg;
2243 s = orig + (m - s);
2244 strend = s + (strend - m);
2245 }
2246 m = rx->startp[0] + orig;
2247 if (doutf8 && !SvUTF8(dstr))
2248 sv_catpvn_utf8_upgrade(dstr, s, m - s, nsv);
2249 else
2250 sv_catpvn(dstr, s, m-s);
2251 s = rx->endp[0] + orig;
2252 if (clen)
2253 sv_catpvn(dstr, c, clen);
2254 if (once)
2255 break;
2256 } while (CALLREGEXEC(rx, s, strend, orig, s == m,
2257 TARG, NULL, r_flags));
2258 if (doutf8 && !DO_UTF8(TARG))
2259 sv_catpvn_utf8_upgrade(dstr, s, strend - s, nsv);
2260 else
2261 sv_catpvn(dstr, s, strend - s);
2262
2263#ifdef PERL_OLD_COPY_ON_WRITE
2264 /* The match may make the string COW. If so, brilliant, because that's
2265 just saved us one malloc, copy and free - the regexp has donated
2266 the old buffer, and we malloc an entirely new one, rather than the
2267 regexp malloc()ing a buffer and copying our original, only for
2268 us to throw it away here during the substitution. */
2269 if (SvIsCOW(TARG)) {
2270 sv_force_normal_flags(TARG, SV_COW_DROP_PV);
2271 } else
2272#endif
2273 {
2274 SvPV_free(TARG);
2275 }
2276 SvPV_set(TARG, SvPVX(dstr));
2277 SvCUR_set(TARG, SvCUR(dstr));
2278 SvLEN_set(TARG, SvLEN(dstr));
2279 doutf8 |= DO_UTF8(dstr);
2280 SvPV_set(dstr, NULL);
2281
2282 TAINT_IF(rxtainted & 1);
2283 SPAGAIN;
2284 PUSHs(sv_2mortal(newSViv((I32)iters)));
2285
2286 (void)SvPOK_only(TARG);
2287 if (doutf8)
2288 SvUTF8_on(TARG);
2289 TAINT_IF(rxtainted);
2290 SvSETMAGIC(TARG);
2291 SvTAINT(TARG);
2292 LEAVE_SCOPE(oldsave);
2293 RETURN;
2294 }
2295 goto ret_no;
2296
2297nope:
2298ret_no:
2299 SPAGAIN;
2300 PUSHs(&PL_sv_no);
2301 LEAVE_SCOPE(oldsave);
2302 RETURN;
2303}
2304
2305PP(pp_grepwhile)
2306{
2307 dVAR; dSP;
2308
2309 if (SvTRUEx(POPs))
2310 PL_stack_base[PL_markstack_ptr[-1]++] = PL_stack_base[*PL_markstack_ptr];
2311 ++*PL_markstack_ptr;
2312 LEAVE; /* exit inner scope */
2313
2314 /* All done yet? */
2315 if (PL_stack_base + *PL_markstack_ptr > SP) {
2316 I32 items;
2317 const I32 gimme = GIMME_V;
2318
2319 LEAVE; /* exit outer scope */
2320 (void)POPMARK; /* pop src */
2321 items = --*PL_markstack_ptr - PL_markstack_ptr[-1];
2322 (void)POPMARK; /* pop dst */
2323 SP = PL_stack_base + POPMARK; /* pop original mark */
2324 if (gimme == G_SCALAR) {
2325 if (PL_op->op_private & OPpGREP_LEX) {
2326 SV* const sv = sv_newmortal();
2327 sv_setiv(sv, items);
2328 PUSHs(sv);
2329 }
2330 else {
2331 dTARGET;
2332 XPUSHi(items);
2333 }
2334 }
2335 else if (gimme == G_ARRAY)
2336 SP += items;
2337 RETURN;
2338 }
2339 else {
2340 SV *src;
2341
2342 ENTER; /* enter inner scope */
2343 SAVEVPTR(PL_curpm);
2344
2345 src = PL_stack_base[*PL_markstack_ptr];
2346 SvTEMP_off(src);
2347 if (PL_op->op_private & OPpGREP_LEX)
2348 PAD_SVl(PL_op->op_targ) = src;
2349 else
2350 DEFSV = src;
2351
2352 RETURNOP(cLOGOP->op_other);
2353 }
2354}
2355
2356PP(pp_leavesub)
2357{
2358 dVAR; dSP;
2359 SV **mark;
2360 SV **newsp;
2361 PMOP *newpm;
2362 I32 gimme;
2363 register PERL_CONTEXT *cx;
2364 SV *sv;
2365
2366 if (CxMULTICALL(&cxstack[cxstack_ix]))
2367 return 0;
2368
2369 POPBLOCK(cx,newpm);
2370 cxstack_ix++; /* temporarily protect top context */
2371
2372 TAINT_NOT;
2373 if (gimme == G_SCALAR) {
2374 MARK = newsp + 1;
2375 if (MARK <= SP) {
2376 if (cx->blk_sub.cv && CvDEPTH(cx->blk_sub.cv) > 1) {
2377 if (SvTEMP(TOPs)) {
2378 *MARK = SvREFCNT_inc(TOPs);
2379 FREETMPS;
2380 sv_2mortal(*MARK);
2381 }
2382 else {
2383 sv = SvREFCNT_inc(TOPs); /* FREETMPS could clobber it */
2384 FREETMPS;
2385 *MARK = sv_mortalcopy(sv);
2386 SvREFCNT_dec(sv);
2387 }
2388 }
2389 else
2390 *MARK = SvTEMP(TOPs) ? TOPs : sv_mortalcopy(TOPs);
2391 }
2392 else {
2393 MEXTEND(MARK, 0);
2394 *MARK = &PL_sv_undef;
2395 }
2396 SP = MARK;
2397 }
2398 else if (gimme == G_ARRAY) {
2399 for (MARK = newsp + 1; MARK <= SP; MARK++) {
2400 if (!SvTEMP(*MARK)) {
2401 *MARK = sv_mortalcopy(*MARK);
2402 TAINT_NOT; /* Each item is independent */
2403 }
2404 }
2405 }
2406 PUTBACK;
2407
2408 LEAVE;
2409 cxstack_ix--;
2410 POPSUB(cx,sv); /* Stack values are safe: release CV and @_ ... */
2411 PL_curpm = newpm; /* ... and pop $1 et al */
2412
2413 LEAVESUB(sv);
2414 return cx->blk_sub.retop;
2415}
2416
2417/* This duplicates the above code because the above code must not
2418 * get any slower by more conditions */
2419PP(pp_leavesublv)
2420{
2421 dVAR; dSP;
2422 SV **mark;
2423 SV **newsp;
2424 PMOP *newpm;
2425 I32 gimme;
2426 register PERL_CONTEXT *cx;
2427 SV *sv;
2428
2429 if (CxMULTICALL(&cxstack[cxstack_ix]))
2430 return 0;
2431
2432 POPBLOCK(cx,newpm);
2433 cxstack_ix++; /* temporarily protect top context */
2434
2435 TAINT_NOT;
2436
2437 if (cx->blk_sub.lval & OPpENTERSUB_INARGS) {
2438 /* We are an argument to a function or grep().
2439 * This kind of lvalueness was legal before lvalue
2440 * subroutines too, so be backward compatible:
2441 * cannot report errors. */
2442
2443 /* Scalar context *is* possible, on the LHS of -> only,
2444 * as in f()->meth(). But this is not an lvalue. */
2445 if (gimme == G_SCALAR)
2446 goto temporise;
2447 if (gimme == G_ARRAY) {
2448 if (!CvLVALUE(cx->blk_sub.cv))
2449 goto temporise_array;
2450 EXTEND_MORTAL(SP - newsp);
2451 for (mark = newsp + 1; mark <= SP; mark++) {
2452 if (SvTEMP(*mark))
2453 NOOP;
2454 else if (SvFLAGS(*mark) & (SVs_PADTMP | SVf_READONLY))
2455 *mark = sv_mortalcopy(*mark);
2456 else {
2457 /* Can be a localized value subject to deletion. */
2458 PL_tmps_stack[++PL_tmps_ix] = *mark;
2459 SvREFCNT_inc_void(*mark);
2460 }
2461 }
2462 }
2463 }
2464 else if (cx->blk_sub.lval) { /* Leave it as it is if we can. */
2465 /* Here we go for robustness, not for speed, so we change all
2466 * the refcounts so the caller gets a live guy. Cannot set
2467 * TEMP, so sv_2mortal is out of question. */
2468 if (!CvLVALUE(cx->blk_sub.cv)) {
2469 LEAVE;
2470 cxstack_ix--;
2471 POPSUB(cx,sv);
2472 PL_curpm = newpm;
2473 LEAVESUB(sv);
2474 DIE(aTHX_ "Can't modify non-lvalue subroutine call");
2475 }
2476 if (gimme == G_SCALAR) {
2477 MARK = newsp + 1;
2478 EXTEND_MORTAL(1);
2479 if (MARK == SP) {
2480 /* Temporaries are bad unless they happen to be elements
2481 * of a tied hash or array */
2482 if (SvFLAGS(TOPs) & (SVs_TEMP | SVs_PADTMP | SVf_READONLY) &&
2483 !(SvRMAGICAL(TOPs) && mg_find(TOPs, PERL_MAGIC_tiedelem))) {
2484 LEAVE;
2485 cxstack_ix--;
2486 POPSUB(cx,sv);
2487 PL_curpm = newpm;
2488 LEAVESUB(sv);
2489 DIE(aTHX_ "Can't return %s from lvalue subroutine",
2490 SvREADONLY(TOPs) ? (TOPs == &PL_sv_undef) ? "undef"
2491 : "a readonly value" : "a temporary");
2492 }
2493 else { /* Can be a localized value
2494 * subject to deletion. */
2495 PL_tmps_stack[++PL_tmps_ix] = *mark;
2496 SvREFCNT_inc_void(*mark);
2497 }
2498 }
2499 else { /* Should not happen? */
2500 LEAVE;
2501 cxstack_ix--;
2502 POPSUB(cx,sv);
2503 PL_curpm = newpm;
2504 LEAVESUB(sv);
2505 DIE(aTHX_ "%s returned from lvalue subroutine in scalar context",
2506 (MARK > SP ? "Empty array" : "Array"));
2507 }
2508 SP = MARK;
2509 }
2510 else if (gimme == G_ARRAY) {
2511 EXTEND_MORTAL(SP - newsp);
2512 for (mark = newsp + 1; mark <= SP; mark++) {
2513 if (*mark != &PL_sv_undef
2514 && SvFLAGS(*mark) & (SVs_TEMP | SVs_PADTMP | SVf_READONLY)) {
2515 /* Might be flattened array after $#array = */
2516 PUTBACK;
2517 LEAVE;
2518 cxstack_ix--;
2519 POPSUB(cx,sv);
2520 PL_curpm = newpm;
2521 LEAVESUB(sv);
2522 DIE(aTHX_ "Can't return a %s from lvalue subroutine",
2523 SvREADONLY(TOPs) ? "readonly value" : "temporary");
2524 }
2525 else {
2526 /* Can be a localized value subject to deletion. */
2527 PL_tmps_stack[++PL_tmps_ix] = *mark;
2528 SvREFCNT_inc_void(*mark);
2529 }
2530 }
2531 }
2532 }
2533 else {
2534 if (gimme == G_SCALAR) {
2535 temporise:
2536 MARK = newsp + 1;
2537 if (MARK <= SP) {
2538 if (cx->blk_sub.cv && CvDEPTH(cx->blk_sub.cv) > 1) {
2539 if (SvTEMP(TOPs)) {
2540 *MARK = SvREFCNT_inc(TOPs);
2541 FREETMPS;
2542 sv_2mortal(*MARK);
2543 }
2544 else {
2545 sv = SvREFCNT_inc(TOPs); /* FREETMPS could clobber it */
2546 FREETMPS;
2547 *MARK = sv_mortalcopy(sv);
2548 SvREFCNT_dec(sv);
2549 }
2550 }
2551 else
2552 *MARK = SvTEMP(TOPs) ? TOPs : sv_mortalcopy(TOPs);
2553 }
2554 else {
2555 MEXTEND(MARK, 0);
2556 *MARK = &PL_sv_undef;
2557 }
2558 SP = MARK;
2559 }
2560 else if (gimme == G_ARRAY) {
2561 temporise_array:
2562 for (MARK = newsp + 1; MARK <= SP; MARK++) {
2563 if (!SvTEMP(*MARK)) {
2564 *MARK = sv_mortalcopy(*MARK);
2565 TAINT_NOT; /* Each item is independent */
2566 }
2567 }
2568 }
2569 }
2570 PUTBACK;
2571
2572 LEAVE;
2573 cxstack_ix--;
2574 POPSUB(cx,sv); /* Stack values are safe: release CV and @_ ... */
2575 PL_curpm = newpm; /* ... and pop $1 et al */
2576
2577 LEAVESUB(sv);
2578 return cx->blk_sub.retop;
2579}
2580
2581PP(pp_entersub)
2582{
2583 dVAR; dSP; dPOPss;
2584 GV *gv;
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 HV *stash;
2597 cv = sv_2cv(sv, &stash, &gv, 0);
2598 }
2599 if (!cv) {
2600 ENTER;
2601 SAVETMPS;
2602 goto try_autoload;
2603 }
2604 break;
2605 default:
2606 if (!SvROK(sv)) {
2607 const char *sym;
2608 STRLEN len;
2609 if (sv == &PL_sv_yes) { /* unfound import, ignore */
2610 if (hasargs)
2611 SP = PL_stack_base + POPMARK;
2612 RETURN;
2613 }
2614 if (SvGMAGICAL(sv)) {
2615 mg_get(sv);
2616 if (SvROK(sv))
2617 goto got_rv;
2618 if (SvPOKp(sv)) {
2619 sym = SvPVX_const(sv);
2620 len = SvCUR(sv);
2621 } else {
2622 sym = NULL;
2623 len = 0;
2624 }
2625 }
2626 else {
2627 sym = SvPV_const(sv, len);
2628 }
2629 if (!sym)
2630 DIE(aTHX_ PL_no_usym, "a subroutine");
2631 if (PL_op->op_private & HINT_STRICT_REFS)
2632 DIE(aTHX_ PL_no_symref, sym, "a subroutine");
2633 cv = get_cvn_flags(sym, len, GV_ADD|SvUTF8(sv));
2634 break;
2635 }
2636 got_rv:
2637 {
2638 SV * const * sp = &sv; /* Used in tryAMAGICunDEREF macro. */
2639 tryAMAGICunDEREF(to_cv);
2640 }
2641 cv = (CV*)SvRV(sv);
2642 if (SvTYPE(cv) == SVt_PVCV)
2643 break;
2644 /* FALL THROUGH */
2645 case SVt_PVHV:
2646 case SVt_PVAV:
2647 DIE(aTHX_ "Not a CODE reference");
2648 /* This is the second most common case: */
2649 case SVt_PVCV:
2650 cv = (CV*)sv;
2651 break;
2652 }
2653
2654 ENTER;
2655 SAVETMPS;
2656
2657 retry:
2658 if (!CvROOT(cv) && !CvXSUB(cv)) {
2659 GV* autogv;
2660 SV* sub_name;
2661
2662 /* anonymous or undef'd function leaves us no recourse */
2663 if (CvANON(cv) || !(gv = CvGV(cv)))
2664 DIE(aTHX_ "Undefined subroutine called");
2665
2666 /* autoloaded stub? */
2667 if (cv != GvCV(gv)) {
2668 cv = GvCV(gv);
2669 }
2670 /* should call AUTOLOAD now? */
2671 else {
2672try_autoload:
2673 if ((autogv = gv_autoload4(GvSTASH(gv), GvNAME(gv), GvNAMELEN(gv),
2674 FALSE)))
2675 {
2676 cv = GvCV(autogv);
2677 }
2678 /* sorry */
2679 else {
2680 sub_name = sv_newmortal();
2681 gv_efullname3(sub_name, gv, NULL);
2682 DIE(aTHX_ "Undefined subroutine &%"SVf" called", SVfARG(sub_name));
2683 }
2684 }
2685 if (!cv)
2686 DIE(aTHX_ "Not a CODE reference");
2687 goto retry;
2688 }
2689
2690 gimme = GIMME_V;
2691 if ((PL_op->op_private & OPpENTERSUB_DB) && GvCV(PL_DBsub) && !CvNODEBUG(cv)) {
2692 if (CvASSERTION(cv) && PL_DBassertion)
2693 sv_setiv(PL_DBassertion, 1);
2694
2695 Perl_get_db_sub(aTHX_ &sv, cv);
2696 if (CvISXSUB(cv))
2697 PL_curcopdb = PL_curcop;
2698 cv = GvCV(PL_DBsub);
2699
2700 if (!cv || (!CvXSUB(cv) && !CvSTART(cv)))
2701 DIE(aTHX_ "No DB::sub routine defined");
2702 }
2703
2704 if (!(CvISXSUB(cv))) {
2705 /* This path taken at least 75% of the time */
2706 dMARK;
2707 register I32 items = SP - MARK;
2708 AV* const padlist = CvPADLIST(cv);
2709 PUSHBLOCK(cx, CXt_SUB, MARK);
2710 PUSHSUB(cx);
2711 cx->blk_sub.retop = PL_op->op_next;
2712 CvDEPTH(cv)++;
2713 /* XXX This would be a natural place to set C<PL_compcv = cv> so
2714 * that eval'' ops within this sub know the correct lexical space.
2715 * Owing the speed considerations, we choose instead to search for
2716 * the cv using find_runcv() when calling doeval().
2717 */
2718 if (CvDEPTH(cv) >= 2) {
2719 PERL_STACK_OVERFLOW_CHECK();
2720 pad_push(padlist, CvDEPTH(cv));
2721 }
2722 SAVECOMPPAD();
2723 PAD_SET_CUR_NOSAVE(padlist, CvDEPTH(cv));
2724 if (hasargs) {
2725 AV* const av = (AV*)PAD_SVl(0);
2726 if (AvREAL(av)) {
2727 /* @_ is normally not REAL--this should only ever
2728 * happen when DB::sub() calls things that modify @_ */
2729 av_clear(av);
2730 AvREAL_off(av);
2731 AvREIFY_on(av);
2732 }
2733 cx->blk_sub.savearray = GvAV(PL_defgv);
2734 GvAV(PL_defgv) = (AV*)SvREFCNT_inc_simple(av);
2735 CX_CURPAD_SAVE(cx->blk_sub);
2736 cx->blk_sub.argarray = av;
2737 ++MARK;
2738
2739 if (items > AvMAX(av) + 1) {
2740 SV **ary = AvALLOC(av);
2741 if (AvARRAY(av) != ary) {
2742 AvMAX(av) += AvARRAY(av) - AvALLOC(av);
2743 AvARRAY(av) = ary;
2744 }
2745 if (items > AvMAX(av) + 1) {
2746 AvMAX(av) = items - 1;
2747 Renew(ary,items,SV*);
2748 AvALLOC(av) = ary;
2749 AvARRAY(av) = ary;
2750 }
2751 }
2752 Copy(MARK,AvARRAY(av),items,SV*);
2753 AvFILLp(av) = items - 1;
2754
2755 while (items--) {
2756 if (*MARK)
2757 SvTEMP_off(*MARK);
2758 MARK++;
2759 }
2760 }
2761 /* warning must come *after* we fully set up the context
2762 * stuff so that __WARN__ handlers can safely dounwind()
2763 * if they want to
2764 */
2765 if (CvDEPTH(cv) == 100 && ckWARN(WARN_RECURSION)
2766 && !(PERLDB_SUB && cv == GvCV(PL_DBsub)))
2767 sub_crush_depth(cv);
2768#if 0
2769 DEBUG_S(PerlIO_printf(Perl_debug_log,
2770 "%p entersub returning %p\n", (void*)thr, (void*)CvSTART(cv)));
2771#endif
2772 RETURNOP(CvSTART(cv));
2773 }
2774 else {
2775 I32 markix = TOPMARK;
2776
2777 PUTBACK;
2778
2779 if (!hasargs) {
2780 /* Need to copy @_ to stack. Alternative may be to
2781 * switch stack to @_, and copy return values
2782 * back. This would allow popping @_ in XSUB, e.g.. XXXX */
2783 AV * const av = GvAV(PL_defgv);
2784 const I32 items = AvFILLp(av) + 1; /* @_ is not tieable */
2785
2786 if (items) {
2787 /* Mark is at the end of the stack. */
2788 EXTEND(SP, items);
2789 Copy(AvARRAY(av), SP + 1, items, SV*);
2790 SP += items;
2791 PUTBACK ;
2792 }
2793 }
2794 /* We assume first XSUB in &DB::sub is the called one. */
2795 if (PL_curcopdb) {
2796 SAVEVPTR(PL_curcop);
2797 PL_curcop = PL_curcopdb;
2798 PL_curcopdb = NULL;
2799 }
2800 /* Do we need to open block here? XXXX */
2801 if (CvXSUB(cv)) /* XXX this is supposed to be true */
2802 (void)(*CvXSUB(cv))(aTHX_ cv);
2803
2804 /* Enforce some sanity in scalar context. */
2805 if (gimme == G_SCALAR && ++markix != PL_stack_sp - PL_stack_base ) {
2806 if (markix > PL_stack_sp - PL_stack_base)
2807 *(PL_stack_base + markix) = &PL_sv_undef;
2808 else
2809 *(PL_stack_base + markix) = *PL_stack_sp;
2810 PL_stack_sp = PL_stack_base + markix;
2811 }
2812 LEAVE;
2813 return NORMAL;
2814 }
2815}
2816
2817void
2818Perl_sub_crush_depth(pTHX_ CV *cv)
2819{
2820 if (CvANON(cv))
2821 Perl_warner(aTHX_ packWARN(WARN_RECURSION), "Deep recursion on anonymous subroutine");
2822 else {
2823 SV* const tmpstr = sv_newmortal();
2824 gv_efullname3(tmpstr, CvGV(cv), NULL);
2825 Perl_warner(aTHX_ packWARN(WARN_RECURSION), "Deep recursion on subroutine \"%"SVf"\"",
2826 SVfARG(tmpstr));
2827 }
2828}
2829
2830PP(pp_aelem)
2831{
2832 dVAR; dSP;
2833 SV** svp;
2834 SV* const elemsv = POPs;
2835 IV elem = SvIV(elemsv);
2836 AV* const av = (AV*)POPs;
2837 const U32 lval = PL_op->op_flags & OPf_MOD || LVRET;
2838 const U32 defer = (PL_op->op_private & OPpLVAL_DEFER) && (elem > av_len(av));
2839 SV *sv;
2840
2841 if (SvROK(elemsv) && !SvGAMAGIC(elemsv) && ckWARN(WARN_MISC))
2842 Perl_warner(aTHX_ packWARN(WARN_MISC),
2843 "Use of reference \"%"SVf"\" as array index",
2844 SVfARG(elemsv));
2845 if (elem > 0)
2846 elem -= CopARYBASE_get(PL_curcop);
2847 if (SvTYPE(av) != SVt_PVAV)
2848 RETPUSHUNDEF;
2849 svp = av_fetch(av, elem, lval && !defer);
2850 if (lval) {
2851#ifdef PERL_MALLOC_WRAP
2852 if (SvUOK(elemsv)) {
2853 const UV uv = SvUV(elemsv);
2854 elem = uv > IV_MAX ? IV_MAX : uv;
2855 }
2856 else if (SvNOK(elemsv))
2857 elem = (IV)SvNV(elemsv);
2858 if (elem > 0) {
2859 static const char oom_array_extend[] =
2860 "Out of memory during array extend"; /* Duplicated in av.c */
2861 MEM_WRAP_CHECK_1(elem,SV*,oom_array_extend);
2862 }
2863#endif
2864 if (!svp || *svp == &PL_sv_undef) {
2865 SV* lv;
2866 if (!defer)
2867 DIE(aTHX_ PL_no_aelem, elem);
2868 lv = sv_newmortal();
2869 sv_upgrade(lv, SVt_PVLV);
2870 LvTYPE(lv) = 'y';
2871 sv_magic(lv, NULL, PERL_MAGIC_defelem, NULL, 0);
2872 LvTARG(lv) = SvREFCNT_inc_simple(av);
2873 LvTARGOFF(lv) = elem;
2874 LvTARGLEN(lv) = 1;
2875 PUSHs(lv);
2876 RETURN;
2877 }
2878 if (PL_op->op_private & OPpLVAL_INTRO)
2879 save_aelem(av, elem, svp);
2880 else if (PL_op->op_private & OPpDEREF)
2881 vivify_ref(*svp, PL_op->op_private & OPpDEREF);
2882 }
2883 sv = (svp ? *svp : &PL_sv_undef);
2884 if (!lval && SvGMAGICAL(sv)) /* see note in pp_helem() */
2885 sv = sv_mortalcopy(sv);
2886 PUSHs(sv);
2887 RETURN;
2888}
2889
2890void
2891Perl_vivify_ref(pTHX_ SV *sv, U32 to_what)
2892{
2893 SvGETMAGIC(sv);
2894 if (!SvOK(sv)) {
2895 if (SvREADONLY(sv))
2896 Perl_croak(aTHX_ PL_no_modify);
2897 if (SvTYPE(sv) < SVt_RV)
2898 sv_upgrade(sv, SVt_RV);
2899 else if (SvTYPE(sv) >= SVt_PV) {
2900 SvPV_free(sv);
2901 SvLEN_set(sv, 0);
2902 SvCUR_set(sv, 0);
2903 }
2904 switch (to_what) {
2905 case OPpDEREF_SV:
2906 SvRV_set(sv, newSV(0));
2907 break;
2908 case OPpDEREF_AV:
2909 SvRV_set(sv, (SV*)newAV());
2910 break;
2911 case OPpDEREF_HV:
2912 SvRV_set(sv, (SV*)newHV());
2913 break;
2914 }
2915 SvROK_on(sv);
2916 SvSETMAGIC(sv);
2917 }
2918}
2919
2920PP(pp_method)
2921{
2922 dVAR; dSP;
2923 SV* const sv = TOPs;
2924
2925 if (SvROK(sv)) {
2926 SV* const rsv = SvRV(sv);
2927 if (SvTYPE(rsv) == SVt_PVCV) {
2928 SETs(rsv);
2929 RETURN;
2930 }
2931 }
2932
2933 SETs(method_common(sv, NULL));
2934 RETURN;
2935}
2936
2937PP(pp_method_named)
2938{
2939 dVAR; dSP;
2940 SV* const sv = cSVOP_sv;
2941 U32 hash = SvSHARED_HASH(sv);
2942
2943 XPUSHs(method_common(sv, &hash));
2944 RETURN;
2945}
2946
2947STATIC SV *
2948S_method_common(pTHX_ SV* meth, U32* hashp)
2949{
2950 dVAR;
2951 SV* ob;
2952 GV* gv;
2953 HV* stash;
2954 STRLEN namelen;
2955 const char* packname = NULL;
2956 SV *packsv = NULL;
2957 STRLEN packlen;
2958 const char * const name = SvPV_const(meth, namelen);
2959 SV * const sv = *(PL_stack_base + TOPMARK + 1);
2960
2961 if (!sv)
2962 Perl_croak(aTHX_ "Can't call method \"%s\" on an undefined value", name);
2963
2964 SvGETMAGIC(sv);
2965 if (SvROK(sv))
2966 ob = (SV*)SvRV(sv);
2967 else {
2968 GV* iogv;
2969
2970 /* this isn't a reference */
2971 if(SvOK(sv) && (packname = SvPV_const(sv, packlen))) {
2972 const HE* const he = hv_fetch_ent(PL_stashcache, sv, 0, 0);
2973 if (he) {
2974 stash = INT2PTR(HV*,SvIV(HeVAL(he)));
2975 goto fetch;
2976 }
2977 }
2978
2979 if (!SvOK(sv) ||
2980 !(packname) ||
2981 !(iogv = gv_fetchsv(sv, 0, SVt_PVIO)) ||
2982 !(ob=(SV*)GvIO(iogv)))
2983 {
2984 /* this isn't the name of a filehandle either */
2985 if (!packname ||
2986 ((UTF8_IS_START(*packname) && DO_UTF8(sv))
2987 ? !isIDFIRST_utf8((U8*)packname)
2988 : !isIDFIRST(*packname)
2989 ))
2990 {
2991 Perl_croak(aTHX_ "Can't call method \"%s\" %s", name,
2992 SvOK(sv) ? "without a package or object reference"
2993 : "on an undefined value");
2994 }
2995 /* assume it's a package name */
2996 stash = gv_stashpvn(packname, packlen, 0);
2997 if (!stash)
2998 packsv = sv;
2999 else {
3000 SV* const ref = newSViv(PTR2IV(stash));
3001 hv_store(PL_stashcache, packname, packlen, ref, 0);
3002 }
3003 goto fetch;
3004 }
3005 /* it _is_ a filehandle name -- replace with a reference */
3006 *(PL_stack_base + TOPMARK + 1) = sv_2mortal(newRV((SV*)iogv));
3007 }
3008
3009 /* if we got here, ob should be a reference or a glob */
3010 if (!ob || !(SvOBJECT(ob)
3011 || (SvTYPE(ob) == SVt_PVGV && (ob = (SV*)GvIO((GV*)ob))
3012 && SvOBJECT(ob))))
3013 {
3014 Perl_croak(aTHX_ "Can't call method \"%s\" on unblessed reference",
3015 name);
3016 }
3017
3018 stash = SvSTASH(ob);
3019
3020 fetch:
3021 /* NOTE: stash may be null, hope hv_fetch_ent and
3022 gv_fetchmethod can cope (it seems they can) */
3023
3024 /* shortcut for simple names */
3025 if (hashp) {
3026 const HE* const he = hv_fetch_ent(stash, meth, 0, *hashp);
3027 if (he) {
3028 gv = (GV*)HeVAL(he);
3029 if (isGV(gv) && GvCV(gv) &&
3030 (!GvCVGEN(gv) || GvCVGEN(gv) == PL_sub_generation))
3031 return (SV*)GvCV(gv);
3032 }
3033 }
3034
3035 gv = gv_fetchmethod(stash ? stash : (HV*)packsv, name);
3036
3037 if (!gv) {
3038 /* This code tries to figure out just what went wrong with
3039 gv_fetchmethod. It therefore needs to duplicate a lot of
3040 the internals of that function. We can't move it inside
3041 Perl_gv_fetchmethod_autoload(), however, since that would
3042 cause UNIVERSAL->can("NoSuchPackage::foo") to croak, and we
3043 don't want that.
3044 */
3045 const char* leaf = name;
3046 const char* sep = NULL;
3047 const char* p;
3048
3049 for (p = name; *p; p++) {
3050 if (*p == '\'')
3051 sep = p, leaf = p + 1;
3052 else if (*p == ':' && *(p + 1) == ':')
3053 sep = p, leaf = p + 2;
3054 }
3055 if (!sep || ((sep - name) == 5 && strnEQ(name, "SUPER", 5))) {
3056 /* the method name is unqualified or starts with SUPER:: */
3057 bool need_strlen = 1;
3058 if (sep) {
3059 packname = CopSTASHPV(PL_curcop);
3060 }
3061 else if (stash) {
3062 HEK * const packhek = HvNAME_HEK(stash);
3063 if (packhek) {
3064 packname = HEK_KEY(packhek);
3065 packlen = HEK_LEN(packhek);
3066 need_strlen = 0;
3067 } else {
3068 goto croak;
3069 }
3070 }
3071
3072 if (!packname) {
3073 croak:
3074 Perl_croak(aTHX_
3075 "Can't use anonymous symbol table for method lookup");
3076 }
3077 else if (need_strlen)
3078 packlen = strlen(packname);
3079
3080 }
3081 else {
3082 /* the method name is qualified */
3083 packname = name;
3084 packlen = sep - name;
3085 }
3086
3087 /* we're relying on gv_fetchmethod not autovivifying the stash */
3088 if (gv_stashpvn(packname, packlen, 0)) {
3089 Perl_croak(aTHX_
3090 "Can't locate object method \"%s\" via package \"%.*s\"",
3091 leaf, (int)packlen, packname);
3092 }
3093 else {
3094 Perl_croak(aTHX_
3095 "Can't locate object method \"%s\" via package \"%.*s\""
3096 " (perhaps you forgot to load \"%.*s\"?)",
3097 leaf, (int)packlen, packname, (int)packlen, packname);
3098 }
3099 }
3100 return isGV(gv) ? (SV*)GvCV(gv) : (SV*)gv;
3101}
3102
3103/*
3104 * Local variables:
3105 * c-indentation-style: bsd
3106 * c-basic-offset: 4
3107 * indent-tabs-mode: t
3108 * End:
3109 *
3110 * ex: set ts=8 sts=4 sw=4 noet:
3111 */