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