This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Add NV_IMPLICIT_BIT define.
[perl5.git] / pp_hot.c
... / ...
CommitLineData
1/* pp_hot.c
2 *
3 * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
4 * 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 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 * [p.1007 of _The Lord of the Rings_, VI/viii: "The Scouring of the Shire"]
19 */
20
21/* This file contains 'hot' pp ("push/pop") functions that
22 * execute the opcodes that make up a perl program. A typical pp function
23 * expects to find its arguments on the stack, and usually pushes its
24 * results onto the stack, hence the 'pp' terminology. Each OP structure
25 * contains a pointer to the relevant pp_foo() function.
26 *
27 * By 'hot', we mean common ops whose execution speed is critical.
28 * By gathering them together into a single file, we encourage
29 * CPU cache hits on hot code. Also it could be taken as a warning not to
30 * change any code in this file unless you're sure it won't affect
31 * performance.
32 */
33
34#include "EXTERN.h"
35#define PERL_IN_PP_HOT_C
36#include "perl.h"
37
38/* Hot code. */
39
40PP(pp_const)
41{
42 dSP;
43 XPUSHs(cSVOP_sv);
44 RETURN;
45}
46
47PP(pp_nextstate)
48{
49 PL_curcop = (COP*)PL_op;
50 PL_sawalias = 0;
51 TAINT_NOT; /* Each statement is presumed innocent */
52 PL_stack_sp = PL_stack_base + cxstack[cxstack_ix].blk_oldsp;
53 FREETMPS;
54 PERL_ASYNC_CHECK();
55 return NORMAL;
56}
57
58PP(pp_gvsv)
59{
60 dSP;
61 EXTEND(SP,1);
62 if (UNLIKELY(PL_op->op_private & OPpLVAL_INTRO))
63 PUSHs(save_scalar(cGVOP_gv));
64 else
65 PUSHs(GvSVn(cGVOP_gv));
66 if (GvREFCNT(cGVOP_gv) > 1 || GvALIASED_SV(cGVOP_gv))
67 PL_sawalias = TRUE;
68 RETURN;
69}
70
71
72/* also used for: pp_lineseq() pp_regcmaybe() pp_scalar() pp_scope() */
73
74PP(pp_null)
75{
76 return NORMAL;
77}
78
79/* This is sometimes called directly by pp_coreargs, pp_grepstart and
80 amagic_call. */
81PP(pp_pushmark)
82{
83 PUSHMARK(PL_stack_sp);
84 return NORMAL;
85}
86
87PP(pp_stringify)
88{
89 dSP; dTARGET;
90 SV * const sv = TOPs;
91 SETs(TARG);
92 sv_copypv(TARG, sv);
93 SvSETMAGIC(TARG);
94 /* no PUTBACK, SETs doesn't inc/dec SP */
95 return NORMAL;
96}
97
98PP(pp_gv)
99{
100 dSP;
101 XPUSHs(MUTABLE_SV(cGVOP_gv));
102 if (isGV(cGVOP_gv)
103 && (GvREFCNT(cGVOP_gv) > 1 || GvALIASED_SV(cGVOP_gv)))
104 PL_sawalias = TRUE;
105 RETURN;
106}
107
108
109/* also used for: pp_andassign() */
110
111PP(pp_and)
112{
113 PERL_ASYNC_CHECK();
114 {
115 /* SP is not used to remove a variable that is saved across the
116 sv_2bool_flags call in SvTRUE_NN, if a RISC/CISC or low/high machine
117 register or load/store vs direct mem ops macro is introduced, this
118 should be a define block between direct PL_stack_sp and dSP operations,
119 presently, using PL_stack_sp is bias towards CISC cpus */
120 SV * const sv = *PL_stack_sp;
121 if (!SvTRUE_NN(sv))
122 return NORMAL;
123 else {
124 if (PL_op->op_type == OP_AND)
125 --PL_stack_sp;
126 return cLOGOP->op_other;
127 }
128 }
129}
130
131PP(pp_sassign)
132{
133 dSP;
134 /* sassign keeps its args in the optree traditionally backwards.
135 So we pop them differently.
136 */
137 SV *left = POPs; SV *right = TOPs;
138
139 if (PL_op->op_private & OPpASSIGN_BACKWARDS) {
140 SV * const temp = left;
141 left = right; right = temp;
142 }
143 if (TAINTING_get && UNLIKELY(TAINT_get) && !SvTAINTED(right))
144 TAINT_NOT;
145 if (UNLIKELY(PL_op->op_private & OPpASSIGN_CV_TO_GV)) {
146 /* *foo =\&bar */
147 SV * const cv = SvRV(right);
148 const U32 cv_type = SvTYPE(cv);
149 const bool is_gv = isGV_with_GP(left);
150 const bool got_coderef = cv_type == SVt_PVCV || cv_type == SVt_PVFM;
151
152 if (!got_coderef) {
153 assert(SvROK(cv));
154 }
155
156 /* Can do the optimisation if left (LVALUE) is not a typeglob,
157 right (RVALUE) is a reference to something, and we're in void
158 context. */
159 if (!got_coderef && !is_gv && GIMME_V == G_VOID) {
160 /* Is the target symbol table currently empty? */
161 GV * const gv = gv_fetchsv_nomg(left, GV_NOINIT, SVt_PVGV);
162 if (SvTYPE(gv) != SVt_PVGV && !SvOK(gv)) {
163 /* Good. Create a new proxy constant subroutine in the target.
164 The gv becomes a(nother) reference to the constant. */
165 SV *const value = SvRV(cv);
166
167 SvUPGRADE(MUTABLE_SV(gv), SVt_IV);
168 SvPCS_IMPORTED_on(gv);
169 SvRV_set(gv, value);
170 SvREFCNT_inc_simple_void(value);
171 SETs(left);
172 RETURN;
173 }
174 }
175
176 /* Need to fix things up. */
177 if (!is_gv) {
178 /* Need to fix GV. */
179 left = MUTABLE_SV(gv_fetchsv_nomg(left,GV_ADD, SVt_PVGV));
180 }
181
182 if (!got_coderef) {
183 /* We've been returned a constant rather than a full subroutine,
184 but they expect a subroutine reference to apply. */
185 if (SvROK(cv)) {
186 ENTER_with_name("sassign_coderef");
187 SvREFCNT_inc_void(SvRV(cv));
188 /* newCONSTSUB takes a reference count on the passed in SV
189 from us. We set the name to NULL, otherwise we get into
190 all sorts of fun as the reference to our new sub is
191 donated to the GV that we're about to assign to.
192 */
193 SvRV_set(right, MUTABLE_SV(newCONSTSUB(GvSTASH(left), NULL,
194 SvRV(cv))));
195 SvREFCNT_dec_NN(cv);
196 LEAVE_with_name("sassign_coderef");
197 } else {
198 /* What can happen for the corner case *{"BONK"} = \&{"BONK"};
199 is that
200 First: ops for \&{"BONK"}; return us the constant in the
201 symbol table
202 Second: ops for *{"BONK"} cause that symbol table entry
203 (and our reference to it) to be upgraded from RV
204 to typeblob)
205 Thirdly: We get here. cv is actually PVGV now, and its
206 GvCV() is actually the subroutine we're looking for
207
208 So change the reference so that it points to the subroutine
209 of that typeglob, as that's what they were after all along.
210 */
211 GV *const upgraded = MUTABLE_GV(cv);
212 CV *const source = GvCV(upgraded);
213
214 assert(source);
215 assert(CvFLAGS(source) & CVf_CONST);
216
217 SvREFCNT_inc_void(source);
218 SvREFCNT_dec_NN(upgraded);
219 SvRV_set(right, MUTABLE_SV(source));
220 }
221 }
222
223 }
224 if (
225 UNLIKELY(SvTEMP(left)) && !SvSMAGICAL(left) && SvREFCNT(left) == 1 &&
226 (!isGV_with_GP(left) || SvFAKE(left)) && ckWARN(WARN_MISC)
227 )
228 Perl_warner(aTHX_
229 packWARN(WARN_MISC), "Useless assignment to a temporary"
230 );
231 SvSetMagicSV(left, right);
232 SETs(left);
233 RETURN;
234}
235
236PP(pp_cond_expr)
237{
238 dSP;
239 PERL_ASYNC_CHECK();
240 if (SvTRUEx(POPs))
241 RETURNOP(cLOGOP->op_other);
242 else
243 RETURNOP(cLOGOP->op_next);
244}
245
246PP(pp_unstack)
247{
248 PERL_ASYNC_CHECK();
249 TAINT_NOT; /* Each statement is presumed innocent */
250 PL_stack_sp = PL_stack_base + cxstack[cxstack_ix].blk_oldsp;
251 FREETMPS;
252 if (!(PL_op->op_flags & OPf_SPECIAL)) {
253 I32 oldsave = PL_scopestack[PL_scopestack_ix - 1];
254 LEAVE_SCOPE(oldsave);
255 }
256 return NORMAL;
257}
258
259PP(pp_concat)
260{
261 dSP; dATARGET; tryAMAGICbin_MG(concat_amg, AMGf_assign);
262 {
263 dPOPTOPssrl;
264 bool lbyte;
265 STRLEN rlen;
266 const char *rpv = NULL;
267 bool rbyte = FALSE;
268 bool rcopied = FALSE;
269
270 if (TARG == right && right != left) { /* $r = $l.$r */
271 rpv = SvPV_nomg_const(right, rlen);
272 rbyte = !DO_UTF8(right);
273 right = newSVpvn_flags(rpv, rlen, SVs_TEMP);
274 rpv = SvPV_const(right, rlen); /* no point setting UTF-8 here */
275 rcopied = TRUE;
276 }
277
278 if (TARG != left) { /* not $l .= $r */
279 STRLEN llen;
280 const char* const lpv = SvPV_nomg_const(left, llen);
281 lbyte = !DO_UTF8(left);
282 sv_setpvn(TARG, lpv, llen);
283 if (!lbyte)
284 SvUTF8_on(TARG);
285 else
286 SvUTF8_off(TARG);
287 }
288 else { /* $l .= $r and left == TARG */
289 if (!SvOK(left)) {
290 if (left == right && ckWARN(WARN_UNINITIALIZED)) /* $l .= $l */
291 report_uninit(right);
292 sv_setpvs(left, "");
293 }
294 else {
295 SvPV_force_nomg_nolen(left);
296 }
297 lbyte = !DO_UTF8(left);
298 if (IN_BYTES)
299 SvUTF8_off(left);
300 }
301
302 if (!rcopied) {
303 rpv = SvPV_nomg_const(right, rlen);
304 rbyte = !DO_UTF8(right);
305 }
306 if (lbyte != rbyte) {
307 if (lbyte)
308 sv_utf8_upgrade_nomg(TARG);
309 else {
310 if (!rcopied)
311 right = newSVpvn_flags(rpv, rlen, SVs_TEMP);
312 sv_utf8_upgrade_nomg(right);
313 rpv = SvPV_nomg_const(right, rlen);
314 }
315 }
316 sv_catpvn_nomg(TARG, rpv, rlen);
317
318 SETTARG;
319 RETURN;
320 }
321}
322
323/* push the elements of av onto the stack.
324 * XXX Note that padav has similar code but without the mg_get().
325 * I suspect that the mg_get is no longer needed, but while padav
326 * differs, it can't share this function */
327
328STATIC void
329S_pushav(pTHX_ AV* const av)
330{
331 dSP;
332 const SSize_t maxarg = AvFILL(av) + 1;
333 EXTEND(SP, maxarg);
334 if (UNLIKELY(SvRMAGICAL(av))) {
335 PADOFFSET i;
336 for (i=0; i < (PADOFFSET)maxarg; i++) {
337 SV ** const svp = av_fetch(av, i, FALSE);
338 /* See note in pp_helem, and bug id #27839 */
339 SP[i+1] = svp
340 ? SvGMAGICAL(*svp) ? (mg_get(*svp), *svp) : *svp
341 : &PL_sv_undef;
342 }
343 }
344 else {
345 PADOFFSET i;
346 for (i=0; i < (PADOFFSET)maxarg; i++) {
347 SV * const sv = AvARRAY(av)[i];
348 SP[i+1] = LIKELY(sv) ? sv : &PL_sv_undef;
349 }
350 }
351 SP += maxarg;
352 PUTBACK;
353}
354
355
356/* ($lex1,@lex2,...) or my ($lex1,@lex2,...) */
357
358PP(pp_padrange)
359{
360 dSP;
361 PADOFFSET base = PL_op->op_targ;
362 int count = (int)(PL_op->op_private) & OPpPADRANGE_COUNTMASK;
363 int i;
364 if (PL_op->op_flags & OPf_SPECIAL) {
365 /* fake the RHS of my ($x,$y,..) = @_ */
366 PUSHMARK(SP);
367 S_pushav(aTHX_ GvAVn(PL_defgv));
368 SPAGAIN;
369 }
370
371 /* note, this is only skipped for compile-time-known void cxt */
372 if ((PL_op->op_flags & OPf_WANT) != OPf_WANT_VOID) {
373 EXTEND(SP, count);
374 PUSHMARK(SP);
375 for (i = 0; i <count; i++)
376 *++SP = PAD_SV(base+i);
377 }
378 if (PL_op->op_private & OPpLVAL_INTRO) {
379 SV **svp = &(PAD_SVl(base));
380 const UV payload = (UV)(
381 (base << (OPpPADRANGE_COUNTSHIFT + SAVE_TIGHT_SHIFT))
382 | (count << SAVE_TIGHT_SHIFT)
383 | SAVEt_CLEARPADRANGE);
384 STATIC_ASSERT_STMT(OPpPADRANGE_COUNTMASK + 1 == (1 << OPpPADRANGE_COUNTSHIFT));
385 assert((payload >> (OPpPADRANGE_COUNTSHIFT+SAVE_TIGHT_SHIFT)) == base);
386 {
387 dSS_ADD;
388 SS_ADD_UV(payload);
389 SS_ADD_END(1);
390 }
391
392 for (i = 0; i <count; i++)
393 SvPADSTALE_off(*svp++); /* mark lexical as active */
394 }
395 RETURN;
396}
397
398
399PP(pp_padsv)
400{
401 dSP;
402 EXTEND(SP, 1);
403 {
404 OP * const op = PL_op;
405 /* access PL_curpad once */
406 SV ** const padentry = &(PAD_SVl(op->op_targ));
407 {
408 dTARG;
409 TARG = *padentry;
410 PUSHs(TARG);
411 PUTBACK; /* no pop/push after this, TOPs ok */
412 }
413 if (op->op_flags & OPf_MOD) {
414 if (op->op_private & OPpLVAL_INTRO)
415 if (!(op->op_private & OPpPAD_STATE))
416 save_clearsv(padentry);
417 if (op->op_private & OPpDEREF) {
418 /* TOPs is equivalent to TARG here. Using TOPs (SP) rather
419 than TARG reduces the scope of TARG, so it does not
420 span the call to save_clearsv, resulting in smaller
421 machine code. */
422 TOPs = vivify_ref(TOPs, op->op_private & OPpDEREF);
423 }
424 }
425 return op->op_next;
426 }
427}
428
429PP(pp_readline)
430{
431 dSP;
432 if (TOPs) {
433 SvGETMAGIC(TOPs);
434 tryAMAGICunTARGETlist(iter_amg, 0);
435 PL_last_in_gv = MUTABLE_GV(*PL_stack_sp--);
436 }
437 else PL_last_in_gv = PL_argvgv, PL_stack_sp--;
438 if (!isGV_with_GP(PL_last_in_gv)) {
439 if (SvROK(PL_last_in_gv) && isGV_with_GP(SvRV(PL_last_in_gv)))
440 PL_last_in_gv = MUTABLE_GV(SvRV(PL_last_in_gv));
441 else {
442 dSP;
443 XPUSHs(MUTABLE_SV(PL_last_in_gv));
444 PUTBACK;
445 Perl_pp_rv2gv(aTHX);
446 PL_last_in_gv = MUTABLE_GV(*PL_stack_sp--);
447 if (PL_last_in_gv == (GV *)&PL_sv_undef)
448 PL_last_in_gv = NULL;
449 else
450 assert(isGV_with_GP(PL_last_in_gv));
451 }
452 }
453 return do_readline();
454}
455
456PP(pp_eq)
457{
458 dSP;
459 SV *left, *right;
460
461 tryAMAGICbin_MG(eq_amg, AMGf_set|AMGf_numeric);
462 right = POPs;
463 left = TOPs;
464 SETs(boolSV(
465 (SvIOK_notUV(left) && SvIOK_notUV(right))
466 ? (SvIVX(left) == SvIVX(right))
467 : ( do_ncmp(left, right) == 0)
468 ));
469 RETURN;
470}
471
472
473/* also used for: pp_i_predec() pp_i_preinc() pp_predec() */
474
475PP(pp_preinc)
476{
477 dSP;
478 const bool inc =
479 PL_op->op_type == OP_PREINC || PL_op->op_type == OP_I_PREINC;
480 if (UNLIKELY(SvTYPE(TOPs) >= SVt_PVAV || (isGV_with_GP(TOPs) && !SvFAKE(TOPs))))
481 Perl_croak_no_modify();
482 if (LIKELY(!SvREADONLY(TOPs) && !SvGMAGICAL(TOPs) && SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs))
483 && SvIVX(TOPs) != (inc ? IV_MAX : IV_MIN))
484 {
485 SvIV_set(TOPs, SvIVX(TOPs) + (inc ? 1 : -1));
486 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
487 }
488 else /* Do all the PERL_PRESERVE_IVUV conditionals in sv_inc */
489 if (inc) sv_inc(TOPs);
490 else sv_dec(TOPs);
491 SvSETMAGIC(TOPs);
492 return NORMAL;
493}
494
495
496/* also used for: pp_orassign() */
497
498PP(pp_or)
499{
500 dSP;
501 PERL_ASYNC_CHECK();
502 if (SvTRUE(TOPs))
503 RETURN;
504 else {
505 if (PL_op->op_type == OP_OR)
506 --SP;
507 RETURNOP(cLOGOP->op_other);
508 }
509}
510
511
512/* also used for: pp_dor() pp_dorassign() */
513
514PP(pp_defined)
515{
516 dSP;
517 SV* sv;
518 bool defined;
519 const int op_type = PL_op->op_type;
520 const bool is_dor = (op_type == OP_DOR || op_type == OP_DORASSIGN);
521
522 if (is_dor) {
523 PERL_ASYNC_CHECK();
524 sv = TOPs;
525 if (UNLIKELY(!sv || !SvANY(sv))) {
526 if (op_type == OP_DOR)
527 --SP;
528 RETURNOP(cLOGOP->op_other);
529 }
530 }
531 else {
532 /* OP_DEFINED */
533 sv = POPs;
534 if (UNLIKELY(!sv || !SvANY(sv)))
535 RETPUSHNO;
536 }
537
538 defined = FALSE;
539 switch (SvTYPE(sv)) {
540 case SVt_PVAV:
541 if (AvMAX(sv) >= 0 || SvGMAGICAL(sv) || (SvRMAGICAL(sv) && mg_find(sv, PERL_MAGIC_tied)))
542 defined = TRUE;
543 break;
544 case SVt_PVHV:
545 if (HvARRAY(sv) || SvGMAGICAL(sv) || (SvRMAGICAL(sv) && mg_find(sv, PERL_MAGIC_tied)))
546 defined = TRUE;
547 break;
548 case SVt_PVCV:
549 if (CvROOT(sv) || CvXSUB(sv))
550 defined = TRUE;
551 break;
552 default:
553 SvGETMAGIC(sv);
554 if (SvOK(sv))
555 defined = TRUE;
556 break;
557 }
558
559 if (is_dor) {
560 if(defined)
561 RETURN;
562 if(op_type == OP_DOR)
563 --SP;
564 RETURNOP(cLOGOP->op_other);
565 }
566 /* assuming OP_DEFINED */
567 if(defined)
568 RETPUSHYES;
569 RETPUSHNO;
570}
571
572PP(pp_add)
573{
574 dSP; dATARGET; bool useleft; SV *svl, *svr;
575 tryAMAGICbin_MG(add_amg, AMGf_assign|AMGf_numeric);
576 svr = TOPs;
577 svl = TOPm1s;
578
579 useleft = USE_LEFT(svl);
580#ifdef PERL_PRESERVE_IVUV
581 /* We must see if we can perform the addition with integers if possible,
582 as the integer code detects overflow while the NV code doesn't.
583 If either argument hasn't had a numeric conversion yet attempt to get
584 the IV. It's important to do this now, rather than just assuming that
585 it's not IOK as a PV of "9223372036854775806" may not take well to NV
586 addition, and an SV which is NOK, NV=6.0 ought to be coerced to
587 integer in case the second argument is IV=9223372036854775806
588 We can (now) rely on sv_2iv to do the right thing, only setting the
589 public IOK flag if the value in the NV (or PV) slot is truly integer.
590
591 A side effect is that this also aggressively prefers integer maths over
592 fp maths for integer values.
593
594 How to detect overflow?
595
596 C 99 section 6.2.6.1 says
597
598 The range of nonnegative values of a signed integer type is a subrange
599 of the corresponding unsigned integer type, and the representation of
600 the same value in each type is the same. A computation involving
601 unsigned operands can never overflow, because a result that cannot be
602 represented by the resulting unsigned integer type is reduced modulo
603 the number that is one greater than the largest value that can be
604 represented by the resulting type.
605
606 (the 9th paragraph)
607
608 which I read as "unsigned ints wrap."
609
610 signed integer overflow seems to be classed as "exception condition"
611
612 If an exceptional condition occurs during the evaluation of an
613 expression (that is, if the result is not mathematically defined or not
614 in the range of representable values for its type), the behavior is
615 undefined.
616
617 (6.5, the 5th paragraph)
618
619 I had assumed that on 2s complement machines signed arithmetic would
620 wrap, hence coded pp_add and pp_subtract on the assumption that
621 everything perl builds on would be happy. After much wailing and
622 gnashing of teeth it would seem that irix64 knows its ANSI spec well,
623 knows that it doesn't need to, and doesn't. Bah. Anyway, the all-
624 unsigned code below is actually shorter than the old code. :-)
625 */
626
627 if (SvIV_please_nomg(svr)) {
628 /* Unless the left argument is integer in range we are going to have to
629 use NV maths. Hence only attempt to coerce the right argument if
630 we know the left is integer. */
631 UV auv = 0;
632 bool auvok = FALSE;
633 bool a_valid = 0;
634
635 if (!useleft) {
636 auv = 0;
637 a_valid = auvok = 1;
638 /* left operand is undef, treat as zero. + 0 is identity,
639 Could SETi or SETu right now, but space optimise by not adding
640 lots of code to speed up what is probably a rarish case. */
641 } else {
642 /* Left operand is defined, so is it IV? */
643 if (SvIV_please_nomg(svl)) {
644 if ((auvok = SvUOK(svl)))
645 auv = SvUVX(svl);
646 else {
647 const IV aiv = SvIVX(svl);
648 if (aiv >= 0) {
649 auv = aiv;
650 auvok = 1; /* Now acting as a sign flag. */
651 } else {
652 auv = (aiv == IV_MIN) ? (UV)aiv : (UV)(-aiv);
653 }
654 }
655 a_valid = 1;
656 }
657 }
658 if (a_valid) {
659 bool result_good = 0;
660 UV result;
661 UV buv;
662 bool buvok = SvUOK(svr);
663
664 if (buvok)
665 buv = SvUVX(svr);
666 else {
667 const IV biv = SvIVX(svr);
668 if (biv >= 0) {
669 buv = biv;
670 buvok = 1;
671 } else
672 buv = (biv == IV_MIN) ? (UV)biv : (UV)(-biv);
673 }
674 /* ?uvok if value is >= 0. basically, flagged as UV if it's +ve,
675 else "IV" now, independent of how it came in.
676 if a, b represents positive, A, B negative, a maps to -A etc
677 a + b => (a + b)
678 A + b => -(a - b)
679 a + B => (a - b)
680 A + B => -(a + b)
681 all UV maths. negate result if A negative.
682 add if signs same, subtract if signs differ. */
683
684 if (auvok ^ buvok) {
685 /* Signs differ. */
686 if (auv >= buv) {
687 result = auv - buv;
688 /* Must get smaller */
689 if (result <= auv)
690 result_good = 1;
691 } else {
692 result = buv - auv;
693 if (result <= buv) {
694 /* result really should be -(auv-buv). as its negation
695 of true value, need to swap our result flag */
696 auvok = !auvok;
697 result_good = 1;
698 }
699 }
700 } else {
701 /* Signs same */
702 result = auv + buv;
703 if (result >= auv)
704 result_good = 1;
705 }
706 if (result_good) {
707 SP--;
708 if (auvok)
709 SETu( result );
710 else {
711 /* Negate result */
712 if (result <= (UV)IV_MIN)
713 SETi(result == (UV)IV_MIN
714 ? IV_MIN : -(IV)result);
715 else {
716 /* result valid, but out of range for IV. */
717 SETn( -(NV)result );
718 }
719 }
720 RETURN;
721 } /* Overflow, drop through to NVs. */
722 }
723 }
724#endif
725 {
726 NV value = SvNV_nomg(svr);
727 (void)POPs;
728 if (!useleft) {
729 /* left operand is undef, treat as zero. + 0.0 is identity. */
730 SETn(value);
731 RETURN;
732 }
733 SETn( value + SvNV_nomg(svl) );
734 RETURN;
735 }
736}
737
738
739/* also used for: pp_aelemfast_lex() */
740
741PP(pp_aelemfast)
742{
743 dSP;
744 AV * const av = PL_op->op_type == OP_AELEMFAST_LEX
745 ? MUTABLE_AV(PAD_SV(PL_op->op_targ)) : GvAVn(cGVOP_gv);
746 const U32 lval = PL_op->op_flags & OPf_MOD;
747 SV** const svp = av_fetch(av, (I8)PL_op->op_private, lval);
748 SV *sv = (svp ? *svp : &PL_sv_undef);
749
750 if (UNLIKELY(!svp && lval))
751 DIE(aTHX_ PL_no_aelem, (int)(I8)PL_op->op_private);
752
753 EXTEND(SP, 1);
754 if (!lval && SvRMAGICAL(av) && SvGMAGICAL(sv)) /* see note in pp_helem() */
755 mg_get(sv);
756 PUSHs(sv);
757 RETURN;
758}
759
760PP(pp_join)
761{
762 dSP; dMARK; dTARGET;
763 MARK++;
764 do_join(TARG, *MARK, MARK, SP);
765 SP = MARK;
766 SETs(TARG);
767 RETURN;
768}
769
770PP(pp_pushre)
771{
772 dSP;
773#ifdef DEBUGGING
774 /*
775 * We ass_u_me that LvTARGOFF() comes first, and that two STRLENs
776 * will be enough to hold an OP*.
777 */
778 SV* const sv = sv_newmortal();
779 sv_upgrade(sv, SVt_PVLV);
780 LvTYPE(sv) = '/';
781 Copy(&PL_op, &LvTARGOFF(sv), 1, OP*);
782 XPUSHs(sv);
783#else
784 XPUSHs(MUTABLE_SV(PL_op));
785#endif
786 RETURN;
787}
788
789/* Oversized hot code. */
790
791/* also used for: pp_say() */
792
793PP(pp_print)
794{
795 dSP; dMARK; dORIGMARK;
796 PerlIO *fp;
797 MAGIC *mg;
798 GV * const gv
799 = (PL_op->op_flags & OPf_STACKED) ? MUTABLE_GV(*++MARK) : PL_defoutgv;
800 IO *io = GvIO(gv);
801
802 if (io
803 && (mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar)))
804 {
805 had_magic:
806 if (MARK == ORIGMARK) {
807 /* If using default handle then we need to make space to
808 * pass object as 1st arg, so move other args up ...
809 */
810 MEXTEND(SP, 1);
811 ++MARK;
812 Move(MARK, MARK + 1, (SP - MARK) + 1, SV*);
813 ++SP;
814 }
815 return Perl_tied_method(aTHX_ SV_CONST(PRINT), mark - 1, MUTABLE_SV(io),
816 mg,
817 (G_SCALAR | TIED_METHOD_ARGUMENTS_ON_STACK
818 | (PL_op->op_type == OP_SAY
819 ? TIED_METHOD_SAY : 0)), sp - mark);
820 }
821 if (!io) {
822 if ( gv && GvEGVx(gv) && (io = GvIO(GvEGV(gv)))
823 && (mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar)))
824 goto had_magic;
825 report_evil_fh(gv);
826 SETERRNO(EBADF,RMS_IFI);
827 goto just_say_no;
828 }
829 else if (!(fp = IoOFP(io))) {
830 if (IoIFP(io))
831 report_wrongway_fh(gv, '<');
832 else
833 report_evil_fh(gv);
834 SETERRNO(EBADF,IoIFP(io)?RMS_FAC:RMS_IFI);
835 goto just_say_no;
836 }
837 else {
838 SV * const ofs = GvSV(PL_ofsgv); /* $, */
839 MARK++;
840 if (ofs && (SvGMAGICAL(ofs) || SvOK(ofs))) {
841 while (MARK <= SP) {
842 if (!do_print(*MARK, fp))
843 break;
844 MARK++;
845 if (MARK <= SP) {
846 /* don't use 'ofs' here - it may be invalidated by magic callbacks */
847 if (!do_print(GvSV(PL_ofsgv), fp)) {
848 MARK--;
849 break;
850 }
851 }
852 }
853 }
854 else {
855 while (MARK <= SP) {
856 if (!do_print(*MARK, fp))
857 break;
858 MARK++;
859 }
860 }
861 if (MARK <= SP)
862 goto just_say_no;
863 else {
864 if (PL_op->op_type == OP_SAY) {
865 if (PerlIO_write(fp, "\n", 1) == 0 || PerlIO_error(fp))
866 goto just_say_no;
867 }
868 else if (PL_ors_sv && SvOK(PL_ors_sv))
869 if (!do_print(PL_ors_sv, fp)) /* $\ */
870 goto just_say_no;
871
872 if (IoFLAGS(io) & IOf_FLUSH)
873 if (PerlIO_flush(fp) == EOF)
874 goto just_say_no;
875 }
876 }
877 SP = ORIGMARK;
878 XPUSHs(&PL_sv_yes);
879 RETURN;
880
881 just_say_no:
882 SP = ORIGMARK;
883 XPUSHs(&PL_sv_undef);
884 RETURN;
885}
886
887
888/* also used for: pp_rv2hv() */
889/* also called directly by pp_lvavref */
890
891PP(pp_rv2av)
892{
893 dSP; dTOPss;
894 const I32 gimme = GIMME_V;
895 static const char an_array[] = "an ARRAY";
896 static const char a_hash[] = "a HASH";
897 const bool is_pp_rv2av = PL_op->op_type == OP_RV2AV
898 || PL_op->op_type == OP_LVAVREF;
899 const svtype type = is_pp_rv2av ? SVt_PVAV : SVt_PVHV;
900
901 SvGETMAGIC(sv);
902 if (SvROK(sv)) {
903 if (UNLIKELY(SvAMAGIC(sv))) {
904 sv = amagic_deref_call(sv, is_pp_rv2av ? to_av_amg : to_hv_amg);
905 }
906 sv = SvRV(sv);
907 if (UNLIKELY(SvTYPE(sv) != type))
908 /* diag_listed_as: Not an ARRAY reference */
909 DIE(aTHX_ "Not %s reference", is_pp_rv2av ? an_array : a_hash);
910 else if (UNLIKELY(PL_op->op_flags & OPf_MOD
911 && PL_op->op_private & OPpLVAL_INTRO))
912 Perl_croak(aTHX_ "%s", PL_no_localize_ref);
913 }
914 else if (UNLIKELY(SvTYPE(sv) != type)) {
915 GV *gv;
916
917 if (!isGV_with_GP(sv)) {
918 gv = Perl_softref2xv(aTHX_ sv, is_pp_rv2av ? an_array : a_hash,
919 type, &sp);
920 if (!gv)
921 RETURN;
922 }
923 else {
924 gv = MUTABLE_GV(sv);
925 }
926 sv = is_pp_rv2av ? MUTABLE_SV(GvAVn(gv)) : MUTABLE_SV(GvHVn(gv));
927 if (PL_op->op_private & OPpLVAL_INTRO)
928 sv = is_pp_rv2av ? MUTABLE_SV(save_ary(gv)) : MUTABLE_SV(save_hash(gv));
929 }
930 if (PL_op->op_flags & OPf_REF) {
931 SETs(sv);
932 RETURN;
933 }
934 else if (UNLIKELY(PL_op->op_private & OPpMAYBE_LVSUB)) {
935 const I32 flags = is_lvalue_sub();
936 if (flags && !(flags & OPpENTERSUB_INARGS)) {
937 if (gimme != G_ARRAY)
938 goto croak_cant_return;
939 SETs(sv);
940 RETURN;
941 }
942 }
943
944 if (is_pp_rv2av) {
945 AV *const av = MUTABLE_AV(sv);
946 /* The guts of pp_rv2av */
947 if (gimme == G_ARRAY) {
948 SP--;
949 PUTBACK;
950 S_pushav(aTHX_ av);
951 SPAGAIN;
952 }
953 else if (gimme == G_SCALAR) {
954 dTARGET;
955 const SSize_t maxarg = AvFILL(av) + 1;
956 SETi(maxarg);
957 }
958 } else {
959 /* The guts of pp_rv2hv */
960 if (gimme == G_ARRAY) { /* array wanted */
961 *PL_stack_sp = sv;
962 return Perl_do_kv(aTHX);
963 }
964 else if ((PL_op->op_private & OPpTRUEBOOL
965 || ( PL_op->op_private & OPpMAYBE_TRUEBOOL
966 && block_gimme() == G_VOID ))
967 && (!SvRMAGICAL(sv) || !mg_find(sv, PERL_MAGIC_tied)))
968 SETs(HvUSEDKEYS(sv) ? &PL_sv_yes : sv_2mortal(newSViv(0)));
969 else if (gimme == G_SCALAR) {
970 dTARG;
971 TARG = Perl_hv_scalar(aTHX_ MUTABLE_HV(sv));
972 SETTARG;
973 }
974 }
975 RETURN;
976
977 croak_cant_return:
978 Perl_croak(aTHX_ "Can't return %s to lvalue scalar context",
979 is_pp_rv2av ? "array" : "hash");
980 RETURN;
981}
982
983STATIC void
984S_do_oddball(pTHX_ SV **oddkey, SV **firstkey)
985{
986 PERL_ARGS_ASSERT_DO_ODDBALL;
987
988 if (*oddkey) {
989 if (ckWARN(WARN_MISC)) {
990 const char *err;
991 if (oddkey == firstkey &&
992 SvROK(*oddkey) &&
993 (SvTYPE(SvRV(*oddkey)) == SVt_PVAV ||
994 SvTYPE(SvRV(*oddkey)) == SVt_PVHV))
995 {
996 err = "Reference found where even-sized list expected";
997 }
998 else
999 err = "Odd number of elements in hash assignment";
1000 Perl_warner(aTHX_ packWARN(WARN_MISC), "%s", err);
1001 }
1002
1003 }
1004}
1005
1006PP(pp_aassign)
1007{
1008 dVAR; dSP;
1009 SV **lastlelem = PL_stack_sp;
1010 SV **lastrelem = PL_stack_base + POPMARK;
1011 SV **firstrelem = PL_stack_base + POPMARK + 1;
1012 SV **firstlelem = lastrelem + 1;
1013
1014 SV **relem;
1015 SV **lelem;
1016
1017 SV *sv;
1018 AV *ary;
1019
1020 I32 gimme;
1021 HV *hash;
1022 SSize_t i;
1023 int magic;
1024 U32 lval = 0;
1025
1026 PL_delaymagic = DM_DELAY; /* catch simultaneous items */
1027 gimme = GIMME_V;
1028 if (gimme == G_ARRAY)
1029 lval = PL_op->op_flags & OPf_MOD || LVRET;
1030
1031 /* If there's a common identifier on both sides we have to take
1032 * special care that assigning the identifier on the left doesn't
1033 * clobber a value on the right that's used later in the list.
1034 * Don't bother if LHS is just an empty hash or array.
1035 */
1036
1037 if ( (PL_op->op_private & OPpASSIGN_COMMON || PL_sawalias)
1038 && (
1039 firstlelem != lastlelem
1040 || ! ((sv = *firstlelem))
1041 || SvMAGICAL(sv)
1042 || ! (SvTYPE(sv) == SVt_PVAV || SvTYPE(sv) == SVt_PVHV)
1043 || (SvTYPE(sv) == SVt_PVAV && AvFILL((AV*)sv) != -1)
1044 || (SvTYPE(sv) == SVt_PVHV && HvUSEDKEYS((HV*)sv) != 0)
1045 )
1046 ) {
1047 EXTEND_MORTAL(lastrelem - firstrelem + 1);
1048 for (relem = firstrelem; relem <= lastrelem; relem++) {
1049 if (LIKELY((sv = *relem))) {
1050 TAINT_NOT; /* Each item is independent */
1051
1052 /* Dear TODO test in t/op/sort.t, I love you.
1053 (It's relying on a panic, not a "semi-panic" from newSVsv()
1054 and then an assertion failure below.) */
1055 if (UNLIKELY(SvIS_FREED(sv))) {
1056 Perl_croak(aTHX_ "panic: attempt to copy freed scalar %p",
1057 (void*)sv);
1058 }
1059 /* Not newSVsv(), as it does not allow copy-on-write,
1060 resulting in wasteful copies. We need a second copy of
1061 a temp here, hence the SV_NOSTEAL. */
1062 *relem = sv_mortalcopy_flags(sv,SV_GMAGIC|SV_DO_COW_SVSETSV
1063 |SV_NOSTEAL);
1064 }
1065 }
1066 }
1067
1068 relem = firstrelem;
1069 lelem = firstlelem;
1070 ary = NULL;
1071 hash = NULL;
1072
1073 while (LIKELY(lelem <= lastlelem)) {
1074 bool alias = FALSE;
1075 TAINT_NOT; /* Each item stands on its own, taintwise. */
1076 sv = *lelem++;
1077 if (UNLIKELY(!sv)) {
1078 alias = TRUE;
1079 sv = *lelem++;
1080 ASSUME(SvTYPE(sv) == SVt_PVAV);
1081 }
1082 switch (SvTYPE(sv)) {
1083 case SVt_PVAV:
1084 ary = MUTABLE_AV(sv);
1085 magic = SvMAGICAL(ary) != 0;
1086 ENTER;
1087 SAVEFREESV(SvREFCNT_inc_simple_NN(sv));
1088 av_clear(ary);
1089 av_extend(ary, lastrelem - relem);
1090 i = 0;
1091 while (relem <= lastrelem) { /* gobble up all the rest */
1092 SV **didstore;
1093 if (LIKELY(*relem))
1094 SvGETMAGIC(*relem); /* before newSV, in case it dies */
1095 if (LIKELY(!alias)) {
1096 sv = newSV(0);
1097 sv_setsv_nomg(sv, *relem);
1098 *relem = sv;
1099 }
1100 else {
1101 if (!SvROK(*relem))
1102 DIE(aTHX_ "Assigned value is not a reference");
1103 if (SvTYPE(SvRV(*relem)) > SVt_PVLV)
1104 /* diag_listed_as: Assigned value is not %s reference */
1105 DIE(aTHX_
1106 "Assigned value is not a SCALAR reference");
1107 if (lval)
1108 *relem = sv_mortalcopy(*relem);
1109 /* XXX else check for weak refs? */
1110 sv = SvREFCNT_inc_simple_NN(SvRV(*relem));
1111 }
1112 relem++;
1113 didstore = av_store(ary,i++,sv);
1114 if (magic) {
1115 if (!didstore)
1116 sv_2mortal(sv);
1117 if (SvSMAGICAL(sv))
1118 mg_set(sv);
1119 }
1120 TAINT_NOT;
1121 }
1122 if (UNLIKELY(PL_delaymagic & DM_ARRAY_ISA))
1123 SvSETMAGIC(MUTABLE_SV(ary));
1124 LEAVE;
1125 break;
1126 case SVt_PVHV: { /* normal hash */
1127 SV *tmpstr;
1128 int odd;
1129 int duplicates = 0;
1130 SV** topelem = relem;
1131 SV **firsthashrelem = relem;
1132
1133 hash = MUTABLE_HV(sv);
1134 magic = SvMAGICAL(hash) != 0;
1135
1136 odd = ((lastrelem - firsthashrelem)&1)? 0 : 1;
1137 if (UNLIKELY(odd)) {
1138 do_oddball(lastrelem, firsthashrelem);
1139 /* we have firstlelem to reuse, it's not needed anymore
1140 */
1141 *(lastrelem+1) = &PL_sv_undef;
1142 }
1143
1144 ENTER;
1145 SAVEFREESV(SvREFCNT_inc_simple_NN(sv));
1146 hv_clear(hash);
1147 while (LIKELY(relem < lastrelem+odd)) { /* gobble up all the rest */
1148 HE *didstore;
1149 assert(*relem);
1150 /* Copy the key if aassign is called in lvalue context,
1151 to avoid having the next op modify our rhs. Copy
1152 it also if it is gmagical, lest it make the
1153 hv_store_ent call below croak, leaking the value. */
1154 sv = lval || SvGMAGICAL(*relem)
1155 ? sv_mortalcopy(*relem)
1156 : *relem;
1157 relem++;
1158 assert(*relem);
1159 SvGETMAGIC(*relem);
1160 tmpstr = newSV(0);
1161 sv_setsv_nomg(tmpstr,*relem++); /* value */
1162 if (gimme == G_ARRAY) {
1163 if (hv_exists_ent(hash, sv, 0))
1164 /* key overwrites an existing entry */
1165 duplicates += 2;
1166 else {
1167 /* copy element back: possibly to an earlier
1168 * stack location if we encountered dups earlier,
1169 * possibly to a later stack location if odd */
1170 *topelem++ = sv;
1171 *topelem++ = tmpstr;
1172 }
1173 }
1174 didstore = hv_store_ent(hash,sv,tmpstr,0);
1175 if (magic) {
1176 if (!didstore) sv_2mortal(tmpstr);
1177 SvSETMAGIC(tmpstr);
1178 }
1179 TAINT_NOT;
1180 }
1181 LEAVE;
1182 if (duplicates && gimme == G_ARRAY) {
1183 /* at this point we have removed the duplicate key/value
1184 * pairs from the stack, but the remaining values may be
1185 * wrong; i.e. with (a 1 a 2 b 3) on the stack we've removed
1186 * the (a 2), but the stack now probably contains
1187 * (a <freed> b 3), because { hv_save(a,1); hv_save(a,2) }
1188 * obliterates the earlier key. So refresh all values. */
1189 lastrelem -= duplicates;
1190 relem = firsthashrelem;
1191 while (relem < lastrelem+odd) {
1192 HE *he;
1193 he = hv_fetch_ent(hash, *relem++, 0, 0);
1194 *relem++ = (he ? HeVAL(he) : &PL_sv_undef);
1195 }
1196 }
1197 if (odd && gimme == G_ARRAY) lastrelem++;
1198 }
1199 break;
1200 default:
1201 if (SvIMMORTAL(sv)) {
1202 if (relem <= lastrelem)
1203 relem++;
1204 break;
1205 }
1206 if (relem <= lastrelem) {
1207 if (UNLIKELY(
1208 SvTEMP(sv) && !SvSMAGICAL(sv) && SvREFCNT(sv) == 1 &&
1209 (!isGV_with_GP(sv) || SvFAKE(sv)) && ckWARN(WARN_MISC)
1210 ))
1211 Perl_warner(aTHX_
1212 packWARN(WARN_MISC),
1213 "Useless assignment to a temporary"
1214 );
1215 sv_setsv(sv, *relem);
1216 *(relem++) = sv;
1217 }
1218 else
1219 sv_setsv(sv, &PL_sv_undef);
1220 SvSETMAGIC(sv);
1221 break;
1222 }
1223 }
1224 if (UNLIKELY(PL_delaymagic & ~DM_DELAY)) {
1225 /* Will be used to set PL_tainting below */
1226 Uid_t tmp_uid = PerlProc_getuid();
1227 Uid_t tmp_euid = PerlProc_geteuid();
1228 Gid_t tmp_gid = PerlProc_getgid();
1229 Gid_t tmp_egid = PerlProc_getegid();
1230
1231 /* XXX $> et al currently silently ignore failures */
1232 if (PL_delaymagic & DM_UID) {
1233#ifdef HAS_SETRESUID
1234 PERL_UNUSED_RESULT(
1235 setresuid((PL_delaymagic & DM_RUID) ? PL_delaymagic_uid : (Uid_t)-1,
1236 (PL_delaymagic & DM_EUID) ? PL_delaymagic_euid : (Uid_t)-1,
1237 (Uid_t)-1));
1238#else
1239# ifdef HAS_SETREUID
1240 PERL_UNUSED_RESULT(
1241 setreuid((PL_delaymagic & DM_RUID) ? PL_delaymagic_uid : (Uid_t)-1,
1242 (PL_delaymagic & DM_EUID) ? PL_delaymagic_euid : (Uid_t)-1));
1243# else
1244# ifdef HAS_SETRUID
1245 if ((PL_delaymagic & DM_UID) == DM_RUID) {
1246 PERL_UNUSED_RESULT(setruid(PL_delaymagic_uid));
1247 PL_delaymagic &= ~DM_RUID;
1248 }
1249# endif /* HAS_SETRUID */
1250# ifdef HAS_SETEUID
1251 if ((PL_delaymagic & DM_UID) == DM_EUID) {
1252 PERL_UNUSED_RESULT(seteuid(PL_delaymagic_euid));
1253 PL_delaymagic &= ~DM_EUID;
1254 }
1255# endif /* HAS_SETEUID */
1256 if (PL_delaymagic & DM_UID) {
1257 if (PL_delaymagic_uid != PL_delaymagic_euid)
1258 DIE(aTHX_ "No setreuid available");
1259 PERL_UNUSED_RESULT(PerlProc_setuid(PL_delaymagic_uid));
1260 }
1261# endif /* HAS_SETREUID */
1262#endif /* HAS_SETRESUID */
1263
1264 tmp_uid = PerlProc_getuid();
1265 tmp_euid = PerlProc_geteuid();
1266 }
1267 /* XXX $> et al currently silently ignore failures */
1268 if (PL_delaymagic & DM_GID) {
1269#ifdef HAS_SETRESGID
1270 PERL_UNUSED_RESULT(
1271 setresgid((PL_delaymagic & DM_RGID) ? PL_delaymagic_gid : (Gid_t)-1,
1272 (PL_delaymagic & DM_EGID) ? PL_delaymagic_egid : (Gid_t)-1,
1273 (Gid_t)-1));
1274#else
1275# ifdef HAS_SETREGID
1276 PERL_UNUSED_RESULT(
1277 setregid((PL_delaymagic & DM_RGID) ? PL_delaymagic_gid : (Gid_t)-1,
1278 (PL_delaymagic & DM_EGID) ? PL_delaymagic_egid : (Gid_t)-1));
1279# else
1280# ifdef HAS_SETRGID
1281 if ((PL_delaymagic & DM_GID) == DM_RGID) {
1282 PERL_UNUSED_RESULT(setrgid(PL_delaymagic_gid));
1283 PL_delaymagic &= ~DM_RGID;
1284 }
1285# endif /* HAS_SETRGID */
1286# ifdef HAS_SETEGID
1287 if ((PL_delaymagic & DM_GID) == DM_EGID) {
1288 PERL_UNUSED_RESULT(setegid(PL_delaymagic_egid));
1289 PL_delaymagic &= ~DM_EGID;
1290 }
1291# endif /* HAS_SETEGID */
1292 if (PL_delaymagic & DM_GID) {
1293 if (PL_delaymagic_gid != PL_delaymagic_egid)
1294 DIE(aTHX_ "No setregid available");
1295 PERL_UNUSED_RESULT(PerlProc_setgid(PL_delaymagic_gid));
1296 }
1297# endif /* HAS_SETREGID */
1298#endif /* HAS_SETRESGID */
1299
1300 tmp_gid = PerlProc_getgid();
1301 tmp_egid = PerlProc_getegid();
1302 }
1303 TAINTING_set( TAINTING_get | (tmp_uid && (tmp_euid != tmp_uid || tmp_egid != tmp_gid)) );
1304#ifdef NO_TAINT_SUPPORT
1305 PERL_UNUSED_VAR(tmp_uid);
1306 PERL_UNUSED_VAR(tmp_euid);
1307 PERL_UNUSED_VAR(tmp_gid);
1308 PERL_UNUSED_VAR(tmp_egid);
1309#endif
1310 }
1311 PL_delaymagic = 0;
1312
1313 if (gimme == G_VOID)
1314 SP = firstrelem - 1;
1315 else if (gimme == G_SCALAR) {
1316 dTARGET;
1317 SP = firstrelem;
1318 SETi(lastrelem - firstrelem + 1);
1319 }
1320 else {
1321 if (ary || hash)
1322 /* note that in this case *firstlelem may have been overwritten
1323 by sv_undef in the odd hash case */
1324 SP = lastrelem;
1325 else {
1326 SP = firstrelem + (lastlelem - firstlelem);
1327 lelem = firstlelem + (relem - firstrelem);
1328 while (relem <= SP)
1329 *relem++ = (lelem <= lastlelem) ? *lelem++ : &PL_sv_undef;
1330 }
1331 }
1332
1333 RETURN;
1334}
1335
1336PP(pp_qr)
1337{
1338 dSP;
1339 PMOP * const pm = cPMOP;
1340 REGEXP * rx = PM_GETRE(pm);
1341 SV * const pkg = rx ? CALLREG_PACKAGE(rx) : NULL;
1342 SV * const rv = sv_newmortal();
1343 CV **cvp;
1344 CV *cv;
1345
1346 SvUPGRADE(rv, SVt_IV);
1347 /* For a subroutine describing itself as "This is a hacky workaround" I'm
1348 loathe to use it here, but it seems to be the right fix. Or close.
1349 The key part appears to be that it's essential for pp_qr to return a new
1350 object (SV), which implies that there needs to be an effective way to
1351 generate a new SV from the existing SV that is pre-compiled in the
1352 optree. */
1353 SvRV_set(rv, MUTABLE_SV(reg_temp_copy(NULL, rx)));
1354 SvROK_on(rv);
1355
1356 cvp = &( ReANY((REGEXP *)SvRV(rv))->qr_anoncv);
1357 if (UNLIKELY((cv = *cvp) && CvCLONE(*cvp))) {
1358 *cvp = cv_clone(cv);
1359 SvREFCNT_dec_NN(cv);
1360 }
1361
1362 if (pkg) {
1363 HV *const stash = gv_stashsv(pkg, GV_ADD);
1364 SvREFCNT_dec_NN(pkg);
1365 (void)sv_bless(rv, stash);
1366 }
1367
1368 if (UNLIKELY(RX_ISTAINTED(rx))) {
1369 SvTAINTED_on(rv);
1370 SvTAINTED_on(SvRV(rv));
1371 }
1372 XPUSHs(rv);
1373 RETURN;
1374}
1375
1376PP(pp_match)
1377{
1378 dSP; dTARG;
1379 PMOP *pm = cPMOP;
1380 PMOP *dynpm = pm;
1381 const char *s;
1382 const char *strend;
1383 SSize_t curpos = 0; /* initial pos() or current $+[0] */
1384 I32 global;
1385 U8 r_flags = 0;
1386 const char *truebase; /* Start of string */
1387 REGEXP *rx = PM_GETRE(pm);
1388 bool rxtainted;
1389 const I32 gimme = GIMME_V;
1390 STRLEN len;
1391 const I32 oldsave = PL_savestack_ix;
1392 I32 had_zerolen = 0;
1393 MAGIC *mg = NULL;
1394
1395 if (PL_op->op_flags & OPf_STACKED)
1396 TARG = POPs;
1397 else if (ARGTARG)
1398 GETTARGET;
1399 else {
1400 TARG = DEFSV;
1401 EXTEND(SP,1);
1402 }
1403
1404 PUTBACK; /* EVAL blocks need stack_sp. */
1405 /* Skip get-magic if this is a qr// clone, because regcomp has
1406 already done it. */
1407 truebase = ReANY(rx)->mother_re
1408 ? SvPV_nomg_const(TARG, len)
1409 : SvPV_const(TARG, len);
1410 if (!truebase)
1411 DIE(aTHX_ "panic: pp_match");
1412 strend = truebase + len;
1413 rxtainted = (RX_ISTAINTED(rx) ||
1414 (TAINT_get && (pm->op_pmflags & PMf_RETAINT)));
1415 TAINT_NOT;
1416
1417 /* We need to know this in case we fail out early - pos() must be reset */
1418 global = dynpm->op_pmflags & PMf_GLOBAL;
1419
1420 /* PMdf_USED is set after a ?? matches once */
1421 if (
1422#ifdef USE_ITHREADS
1423 SvREADONLY(PL_regex_pad[pm->op_pmoffset])
1424#else
1425 pm->op_pmflags & PMf_USED
1426#endif
1427 ) {
1428 DEBUG_r(PerlIO_printf(Perl_debug_log, "?? already matched once"));
1429 goto nope;
1430 }
1431
1432 /* empty pattern special-cased to use last successful pattern if
1433 possible, except for qr// */
1434 if (!ReANY(rx)->mother_re && !RX_PRELEN(rx)
1435 && PL_curpm) {
1436 pm = PL_curpm;
1437 rx = PM_GETRE(pm);
1438 }
1439
1440 if (RX_MINLEN(rx) >= 0 && (STRLEN)RX_MINLEN(rx) > len) {
1441 DEBUG_r(PerlIO_printf(Perl_debug_log, "String shorter than min possible regex match (%"
1442 UVuf" < %"IVdf")\n",
1443 (UV)len, (IV)RX_MINLEN(rx)));
1444 goto nope;
1445 }
1446
1447 /* get pos() if //g */
1448 if (global) {
1449 mg = mg_find_mglob(TARG);
1450 if (mg && mg->mg_len >= 0) {
1451 curpos = MgBYTEPOS(mg, TARG, truebase, len);
1452 /* last time pos() was set, it was zero-length match */
1453 if (mg->mg_flags & MGf_MINMATCH)
1454 had_zerolen = 1;
1455 }
1456 }
1457
1458#ifdef PERL_SAWAMPERSAND
1459 if ( RX_NPARENS(rx)
1460 || PL_sawampersand
1461 || (RX_EXTFLAGS(rx) & (RXf_EVAL_SEEN|RXf_PMf_KEEPCOPY))
1462 || (dynpm->op_pmflags & PMf_KEEPCOPY)
1463 )
1464#endif
1465 {
1466 r_flags |= (REXEC_COPY_STR|REXEC_COPY_SKIP_PRE);
1467 /* in @a =~ /(.)/g, we iterate multiple times, but copy the buffer
1468 * only on the first iteration. Therefore we need to copy $' as well
1469 * as $&, to make the rest of the string available for captures in
1470 * subsequent iterations */
1471 if (! (global && gimme == G_ARRAY))
1472 r_flags |= REXEC_COPY_SKIP_POST;
1473 };
1474#ifdef PERL_SAWAMPERSAND
1475 if (dynpm->op_pmflags & PMf_KEEPCOPY)
1476 /* handle KEEPCOPY in pmop but not rx, eg $r=qr/a/; /$r/p */
1477 r_flags &= ~(REXEC_COPY_SKIP_PRE|REXEC_COPY_SKIP_POST);
1478#endif
1479
1480 s = truebase;
1481
1482 play_it_again:
1483 if (global)
1484 s = truebase + curpos;
1485
1486 if (!CALLREGEXEC(rx, (char*)s, (char *)strend, (char*)truebase,
1487 had_zerolen, TARG, NULL, r_flags))
1488 goto nope;
1489
1490 PL_curpm = pm;
1491 if (dynpm->op_pmflags & PMf_ONCE)
1492#ifdef USE_ITHREADS
1493 SvREADONLY_on(PL_regex_pad[dynpm->op_pmoffset]);
1494#else
1495 dynpm->op_pmflags |= PMf_USED;
1496#endif
1497
1498 if (rxtainted)
1499 RX_MATCH_TAINTED_on(rx);
1500 TAINT_IF(RX_MATCH_TAINTED(rx));
1501
1502 /* update pos */
1503
1504 if (global && (gimme != G_ARRAY || (dynpm->op_pmflags & PMf_CONTINUE))) {
1505 if (!mg)
1506 mg = sv_magicext_mglob(TARG);
1507 MgBYTEPOS_set(mg, TARG, truebase, RX_OFFS(rx)[0].end);
1508 if (RX_ZERO_LEN(rx))
1509 mg->mg_flags |= MGf_MINMATCH;
1510 else
1511 mg->mg_flags &= ~MGf_MINMATCH;
1512 }
1513
1514 if ((!RX_NPARENS(rx) && !global) || gimme != G_ARRAY) {
1515 LEAVE_SCOPE(oldsave);
1516 RETPUSHYES;
1517 }
1518
1519 /* push captures on stack */
1520
1521 {
1522 const I32 nparens = RX_NPARENS(rx);
1523 I32 i = (global && !nparens) ? 1 : 0;
1524
1525 SPAGAIN; /* EVAL blocks could move the stack. */
1526 EXTEND(SP, nparens + i);
1527 EXTEND_MORTAL(nparens + i);
1528 for (i = !i; i <= nparens; i++) {
1529 PUSHs(sv_newmortal());
1530 if (LIKELY((RX_OFFS(rx)[i].start != -1)
1531 && RX_OFFS(rx)[i].end != -1 ))
1532 {
1533 const I32 len = RX_OFFS(rx)[i].end - RX_OFFS(rx)[i].start;
1534 const char * const s = RX_OFFS(rx)[i].start + truebase;
1535 if (UNLIKELY(RX_OFFS(rx)[i].end < 0 || RX_OFFS(rx)[i].start < 0
1536 || len < 0 || len > strend - s))
1537 DIE(aTHX_ "panic: pp_match start/end pointers, i=%ld, "
1538 "start=%ld, end=%ld, s=%p, strend=%p, len=%"UVuf,
1539 (long) i, (long) RX_OFFS(rx)[i].start,
1540 (long)RX_OFFS(rx)[i].end, s, strend, (UV) len);
1541 sv_setpvn(*SP, s, len);
1542 if (DO_UTF8(TARG) && is_utf8_string((U8*)s, len))
1543 SvUTF8_on(*SP);
1544 }
1545 }
1546 if (global) {
1547 curpos = (UV)RX_OFFS(rx)[0].end;
1548 had_zerolen = RX_ZERO_LEN(rx);
1549 PUTBACK; /* EVAL blocks may use stack */
1550 r_flags |= REXEC_IGNOREPOS | REXEC_NOT_FIRST;
1551 goto play_it_again;
1552 }
1553 LEAVE_SCOPE(oldsave);
1554 RETURN;
1555 }
1556 NOT_REACHED; /* NOTREACHED */
1557
1558 nope:
1559 if (global && !(dynpm->op_pmflags & PMf_CONTINUE)) {
1560 if (!mg)
1561 mg = mg_find_mglob(TARG);
1562 if (mg)
1563 mg->mg_len = -1;
1564 }
1565 LEAVE_SCOPE(oldsave);
1566 if (gimme == G_ARRAY)
1567 RETURN;
1568 RETPUSHNO;
1569}
1570
1571OP *
1572Perl_do_readline(pTHX)
1573{
1574 dSP; dTARGETSTACKED;
1575 SV *sv;
1576 STRLEN tmplen = 0;
1577 STRLEN offset;
1578 PerlIO *fp;
1579 IO * const io = GvIO(PL_last_in_gv);
1580 const I32 type = PL_op->op_type;
1581 const I32 gimme = GIMME_V;
1582
1583 if (io) {
1584 const MAGIC *const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1585 if (mg) {
1586 Perl_tied_method(aTHX_ SV_CONST(READLINE), SP, MUTABLE_SV(io), mg, gimme, 0);
1587 if (gimme == G_SCALAR) {
1588 SPAGAIN;
1589 SvSetSV_nosteal(TARG, TOPs);
1590 SETTARG;
1591 }
1592 return NORMAL;
1593 }
1594 }
1595 fp = NULL;
1596 if (io) {
1597 fp = IoIFP(io);
1598 if (!fp) {
1599 if (IoFLAGS(io) & IOf_ARGV) {
1600 if (IoFLAGS(io) & IOf_START) {
1601 IoLINES(io) = 0;
1602 if (av_tindex(GvAVn(PL_last_in_gv)) < 0) {
1603 IoFLAGS(io) &= ~IOf_START;
1604 do_open6(PL_last_in_gv, "-", 1, NULL, NULL, 0);
1605 SvTAINTED_off(GvSVn(PL_last_in_gv)); /* previous tainting irrelevant */
1606 sv_setpvs(GvSVn(PL_last_in_gv), "-");
1607 SvSETMAGIC(GvSV(PL_last_in_gv));
1608 fp = IoIFP(io);
1609 goto have_fp;
1610 }
1611 }
1612 fp = nextargv(PL_last_in_gv, PL_op->op_flags & OPf_SPECIAL);
1613 if (!fp) { /* Note: fp != IoIFP(io) */
1614 (void)do_close(PL_last_in_gv, FALSE); /* now it does*/
1615 }
1616 }
1617 else if (type == OP_GLOB)
1618 fp = Perl_start_glob(aTHX_ POPs, io);
1619 }
1620 else if (type == OP_GLOB)
1621 SP--;
1622 else if (IoTYPE(io) == IoTYPE_WRONLY) {
1623 report_wrongway_fh(PL_last_in_gv, '>');
1624 }
1625 }
1626 if (!fp) {
1627 if ((!io || !(IoFLAGS(io) & IOf_START))
1628 && ckWARN(WARN_CLOSED)
1629 && type != OP_GLOB)
1630 {
1631 report_evil_fh(PL_last_in_gv);
1632 }
1633 if (gimme == G_SCALAR) {
1634 /* undef TARG, and push that undefined value */
1635 if (type != OP_RCATLINE) {
1636 SV_CHECK_THINKFIRST_COW_DROP(TARG);
1637 SvOK_off(TARG);
1638 }
1639 PUSHTARG;
1640 }
1641 RETURN;
1642 }
1643 have_fp:
1644 if (gimme == G_SCALAR) {
1645 sv = TARG;
1646 if (type == OP_RCATLINE && SvGMAGICAL(sv))
1647 mg_get(sv);
1648 if (SvROK(sv)) {
1649 if (type == OP_RCATLINE)
1650 SvPV_force_nomg_nolen(sv);
1651 else
1652 sv_unref(sv);
1653 }
1654 else if (isGV_with_GP(sv)) {
1655 SvPV_force_nomg_nolen(sv);
1656 }
1657 SvUPGRADE(sv, SVt_PV);
1658 tmplen = SvLEN(sv); /* remember if already alloced */
1659 if (!tmplen && !SvREADONLY(sv) && !SvIsCOW(sv)) {
1660 /* try short-buffering it. Please update t/op/readline.t
1661 * if you change the growth length.
1662 */
1663 Sv_Grow(sv, 80);
1664 }
1665 offset = 0;
1666 if (type == OP_RCATLINE && SvOK(sv)) {
1667 if (!SvPOK(sv)) {
1668 SvPV_force_nomg_nolen(sv);
1669 }
1670 offset = SvCUR(sv);
1671 }
1672 }
1673 else {
1674 sv = sv_2mortal(newSV(80));
1675 offset = 0;
1676 }
1677
1678 /* This should not be marked tainted if the fp is marked clean */
1679#define MAYBE_TAINT_LINE(io, sv) \
1680 if (!(IoFLAGS(io) & IOf_UNTAINT)) { \
1681 TAINT; \
1682 SvTAINTED_on(sv); \
1683 }
1684
1685/* delay EOF state for a snarfed empty file */
1686#define SNARF_EOF(gimme,rs,io,sv) \
1687 (gimme != G_SCALAR || SvCUR(sv) \
1688 || (IoFLAGS(io) & IOf_NOLINE) || !RsSNARF(rs))
1689
1690 for (;;) {
1691 PUTBACK;
1692 if (!sv_gets(sv, fp, offset)
1693 && (type == OP_GLOB
1694 || SNARF_EOF(gimme, PL_rs, io, sv)
1695 || PerlIO_error(fp)))
1696 {
1697 PerlIO_clearerr(fp);
1698 if (IoFLAGS(io) & IOf_ARGV) {
1699 fp = nextargv(PL_last_in_gv, PL_op->op_flags & OPf_SPECIAL);
1700 if (fp)
1701 continue;
1702 (void)do_close(PL_last_in_gv, FALSE);
1703 }
1704 else if (type == OP_GLOB) {
1705 if (!do_close(PL_last_in_gv, FALSE)) {
1706 Perl_ck_warner(aTHX_ packWARN(WARN_GLOB),
1707 "glob failed (child exited with status %d%s)",
1708 (int)(STATUS_CURRENT >> 8),
1709 (STATUS_CURRENT & 0x80) ? ", core dumped" : "");
1710 }
1711 }
1712 if (gimme == G_SCALAR) {
1713 if (type != OP_RCATLINE) {
1714 SV_CHECK_THINKFIRST_COW_DROP(TARG);
1715 SvOK_off(TARG);
1716 }
1717 SPAGAIN;
1718 PUSHTARG;
1719 }
1720 MAYBE_TAINT_LINE(io, sv);
1721 RETURN;
1722 }
1723 MAYBE_TAINT_LINE(io, sv);
1724 IoLINES(io)++;
1725 IoFLAGS(io) |= IOf_NOLINE;
1726 SvSETMAGIC(sv);
1727 SPAGAIN;
1728 XPUSHs(sv);
1729 if (type == OP_GLOB) {
1730 const char *t1;
1731
1732 if (SvCUR(sv) > 0 && SvCUR(PL_rs) > 0) {
1733 char * const tmps = SvEND(sv) - 1;
1734 if (*tmps == *SvPVX_const(PL_rs)) {
1735 *tmps = '\0';
1736 SvCUR_set(sv, SvCUR(sv) - 1);
1737 }
1738 }
1739 for (t1 = SvPVX_const(sv); *t1; t1++)
1740#ifdef __VMS
1741 if (strchr("*%?", *t1))
1742#else
1743 if (strchr("$&*(){}[]'\";\\|?<>~`", *t1))
1744#endif
1745 break;
1746 if (*t1 && PerlLIO_lstat(SvPVX_const(sv), &PL_statbuf) < 0) {
1747 (void)POPs; /* Unmatched wildcard? Chuck it... */
1748 continue;
1749 }
1750 } else if (SvUTF8(sv)) { /* OP_READLINE, OP_RCATLINE */
1751 if (ckWARN(WARN_UTF8)) {
1752 const U8 * const s = (const U8*)SvPVX_const(sv) + offset;
1753 const STRLEN len = SvCUR(sv) - offset;
1754 const U8 *f;
1755
1756 if (!is_utf8_string_loc(s, len, &f))
1757 /* Emulate :encoding(utf8) warning in the same case. */
1758 Perl_warner(aTHX_ packWARN(WARN_UTF8),
1759 "utf8 \"\\x%02X\" does not map to Unicode",
1760 f < (U8*)SvEND(sv) ? *f : 0);
1761 }
1762 }
1763 if (gimme == G_ARRAY) {
1764 if (SvLEN(sv) - SvCUR(sv) > 20) {
1765 SvPV_shrink_to_cur(sv);
1766 }
1767 sv = sv_2mortal(newSV(80));
1768 continue;
1769 }
1770 else if (gimme == G_SCALAR && !tmplen && SvLEN(sv) - SvCUR(sv) > 80) {
1771 /* try to reclaim a bit of scalar space (only on 1st alloc) */
1772 const STRLEN new_len
1773 = SvCUR(sv) < 60 ? 80 : SvCUR(sv)+40; /* allow some slop */
1774 SvPV_renew(sv, new_len);
1775 }
1776 RETURN;
1777 }
1778}
1779
1780PP(pp_helem)
1781{
1782 dSP;
1783 HE* he;
1784 SV **svp;
1785 SV * const keysv = POPs;
1786 HV * const hv = MUTABLE_HV(POPs);
1787 const U32 lval = PL_op->op_flags & OPf_MOD || LVRET;
1788 const U32 defer = PL_op->op_private & OPpLVAL_DEFER;
1789 SV *sv;
1790 const bool localizing = PL_op->op_private & OPpLVAL_INTRO;
1791 bool preeminent = TRUE;
1792
1793 if (SvTYPE(hv) != SVt_PVHV)
1794 RETPUSHUNDEF;
1795
1796 if (localizing) {
1797 MAGIC *mg;
1798 HV *stash;
1799
1800 /* If we can determine whether the element exist,
1801 * Try to preserve the existenceness of a tied hash
1802 * element by using EXISTS and DELETE if possible.
1803 * Fallback to FETCH and STORE otherwise. */
1804 if (SvCANEXISTDELETE(hv))
1805 preeminent = hv_exists_ent(hv, keysv, 0);
1806 }
1807
1808 he = hv_fetch_ent(hv, keysv, lval && !defer, 0);
1809 svp = he ? &HeVAL(he) : NULL;
1810 if (lval) {
1811 if (!svp || !*svp || *svp == &PL_sv_undef) {
1812 SV* lv;
1813 SV* key2;
1814 if (!defer) {
1815 DIE(aTHX_ PL_no_helem_sv, SVfARG(keysv));
1816 }
1817 lv = sv_newmortal();
1818 sv_upgrade(lv, SVt_PVLV);
1819 LvTYPE(lv) = 'y';
1820 sv_magic(lv, key2 = newSVsv(keysv), PERL_MAGIC_defelem, NULL, 0);
1821 SvREFCNT_dec_NN(key2); /* sv_magic() increments refcount */
1822 LvTARG(lv) = SvREFCNT_inc_simple(hv);
1823 LvTARGLEN(lv) = 1;
1824 PUSHs(lv);
1825 RETURN;
1826 }
1827 if (localizing) {
1828 if (HvNAME_get(hv) && isGV(*svp))
1829 save_gp(MUTABLE_GV(*svp), !(PL_op->op_flags & OPf_SPECIAL));
1830 else if (preeminent)
1831 save_helem_flags(hv, keysv, svp,
1832 (PL_op->op_flags & OPf_SPECIAL) ? 0 : SAVEf_SETMAGIC);
1833 else
1834 SAVEHDELETE(hv, keysv);
1835 }
1836 else if (PL_op->op_private & OPpDEREF) {
1837 PUSHs(vivify_ref(*svp, PL_op->op_private & OPpDEREF));
1838 RETURN;
1839 }
1840 }
1841 sv = (svp && *svp ? *svp : &PL_sv_undef);
1842 /* Originally this did a conditional C<sv = sv_mortalcopy(sv)>; this
1843 * was to make C<local $tied{foo} = $tied{foo}> possible.
1844 * However, it seems no longer to be needed for that purpose, and
1845 * introduced a new bug: stuff like C<while ($hash{taintedval} =~ /.../g>
1846 * would loop endlessly since the pos magic is getting set on the
1847 * mortal copy and lost. However, the copy has the effect of
1848 * triggering the get magic, and losing it altogether made things like
1849 * c<$tied{foo};> in void context no longer do get magic, which some
1850 * code relied on. Also, delayed triggering of magic on @+ and friends
1851 * meant the original regex may be out of scope by now. So as a
1852 * compromise, do the get magic here. (The MGf_GSKIP flag will stop it
1853 * being called too many times). */
1854 if (!lval && SvRMAGICAL(hv) && SvGMAGICAL(sv))
1855 mg_get(sv);
1856 PUSHs(sv);
1857 RETURN;
1858}
1859
1860
1861/* a stripped-down version of Perl_softref2xv() for use by
1862 * pp_multideref(), which doesn't use PL_op->op_flags */
1863
1864GV *
1865S_softref2xv_lite(pTHX_ SV *const sv, const char *const what,
1866 const svtype type)
1867{
1868 if (PL_op->op_private & HINT_STRICT_REFS) {
1869 if (SvOK(sv))
1870 Perl_die(aTHX_ PL_no_symref_sv, sv,
1871 (SvPOKp(sv) && SvCUR(sv)>32 ? "..." : ""), what);
1872 else
1873 Perl_die(aTHX_ PL_no_usym, what);
1874 }
1875 if (!SvOK(sv))
1876 Perl_die(aTHX_ PL_no_usym, what);
1877 return gv_fetchsv_nomg(sv, GV_ADD, type);
1878}
1879
1880
1881/* handle one or more derefs and array/hash indexings, e.g.
1882 * $h->{foo} or $a[0]{$key}[$i] or f()->[1]
1883 *
1884 * op_aux points to an array of unions of UV / IV / SV* / PADOFFSET.
1885 * Each of these either contains an action, or an argument, such as
1886 * a UV to use as an array index, or a lexical var to retrieve.
1887 * In fact, several actions re stored per UV; we keep shifting new actions
1888 * of the one UV, and only reload when it becomes zero.
1889 */
1890
1891PP(pp_multideref)
1892{
1893 SV *sv = NULL; /* init to avoid spurious 'may be used uninitialized' */
1894 UNOP_AUX_item *items = cUNOP_AUXx(PL_op)->op_aux;
1895 UV actions = items->uv;
1896
1897 assert(actions);
1898 /* this tells find_uninit_var() where we're up to */
1899 PL_multideref_pc = items;
1900
1901 while (1) {
1902 /* there are three main classes of action; the first retrieve
1903 * the initial AV or HV from a variable or the stack; the second
1904 * does the equivalent of an unrolled (/DREFAV, rv2av, aelem),
1905 * the third an unrolled (/DREFHV, rv2hv, helem).
1906 */
1907 switch (actions & MDEREF_ACTION_MASK) {
1908
1909 case MDEREF_reload:
1910 actions = (++items)->uv;
1911 continue;
1912
1913 case MDEREF_AV_padav_aelem: /* $lex[...] */
1914 sv = PAD_SVl((++items)->pad_offset);
1915 goto do_AV_aelem;
1916
1917 case MDEREF_AV_gvav_aelem: /* $pkg[...] */
1918 sv = UNOP_AUX_item_sv(++items);
1919 assert(isGV_with_GP(sv));
1920 sv = (SV*)GvAVn((GV*)sv);
1921 goto do_AV_aelem;
1922
1923 case MDEREF_AV_pop_rv2av_aelem: /* expr->[...] */
1924 {
1925 dSP;
1926 sv = POPs;
1927 PUTBACK;
1928 goto do_AV_rv2av_aelem;
1929 }
1930
1931 case MDEREF_AV_gvsv_vivify_rv2av_aelem: /* $pkg->[...] */
1932 sv = UNOP_AUX_item_sv(++items);
1933 assert(isGV_with_GP(sv));
1934 sv = GvSVn((GV*)sv);
1935 goto do_AV_vivify_rv2av_aelem;
1936
1937 case MDEREF_AV_padsv_vivify_rv2av_aelem: /* $lex->[...] */
1938 sv = PAD_SVl((++items)->pad_offset);
1939 /* FALLTHROUGH */
1940
1941 do_AV_vivify_rv2av_aelem:
1942 case MDEREF_AV_vivify_rv2av_aelem: /* vivify, ->[...] */
1943 /* this is the OPpDEREF action normally found at the end of
1944 * ops like aelem, helem, rv2sv */
1945 sv = vivify_ref(sv, OPpDEREF_AV);
1946 /* FALLTHROUGH */
1947
1948 do_AV_rv2av_aelem:
1949 /* this is basically a copy of pp_rv2av when it just has the
1950 * sKR/1 flags */
1951 SvGETMAGIC(sv);
1952 if (LIKELY(SvROK(sv))) {
1953 if (UNLIKELY(SvAMAGIC(sv))) {
1954 sv = amagic_deref_call(sv, to_av_amg);
1955 }
1956 sv = SvRV(sv);
1957 if (UNLIKELY(SvTYPE(sv) != SVt_PVAV))
1958 DIE(aTHX_ "Not an ARRAY reference");
1959 }
1960 else if (SvTYPE(sv) != SVt_PVAV) {
1961 if (!isGV_with_GP(sv))
1962 sv = (SV*)S_softref2xv_lite(aTHX_ sv, "an ARRAY", SVt_PVAV);
1963 sv = MUTABLE_SV(GvAVn((GV*)sv));
1964 }
1965 /* FALLTHROUGH */
1966
1967 do_AV_aelem:
1968 {
1969 /* retrieve the key; this may be either a lexical or package
1970 * var (whose index/ptr is stored as an item) or a signed
1971 * integer constant stored as an item.
1972 */
1973 SV *elemsv;
1974 IV elem = 0; /* to shut up stupid compiler warnings */
1975
1976
1977 assert(SvTYPE(sv) == SVt_PVAV);
1978
1979 switch (actions & MDEREF_INDEX_MASK) {
1980 case MDEREF_INDEX_none:
1981 goto finish;
1982 case MDEREF_INDEX_const:
1983 elem = (++items)->iv;
1984 break;
1985 case MDEREF_INDEX_padsv:
1986 elemsv = PAD_SVl((++items)->pad_offset);
1987 goto check_elem;
1988 case MDEREF_INDEX_gvsv:
1989 elemsv = UNOP_AUX_item_sv(++items);
1990 assert(isGV_with_GP(elemsv));
1991 elemsv = GvSVn((GV*)elemsv);
1992 check_elem:
1993 if (UNLIKELY(SvROK(elemsv) && !SvGAMAGIC(elemsv)
1994 && ckWARN(WARN_MISC)))
1995 Perl_warner(aTHX_ packWARN(WARN_MISC),
1996 "Use of reference \"%"SVf"\" as array index",
1997 SVfARG(elemsv));
1998 /* the only time that S_find_uninit_var() needs this
1999 * is to determine which index value triggered the
2000 * undef warning. So just update it here. Note that
2001 * since we don't save and restore this var (e.g. for
2002 * tie or overload execution), its value will be
2003 * meaningless apart from just here */
2004 PL_multideref_pc = items;
2005 elem = SvIV(elemsv);
2006 break;
2007 }
2008
2009
2010 /* this is basically a copy of pp_aelem with OPpDEREF skipped */
2011
2012 if (!(actions & MDEREF_FLAG_last)) {
2013 SV** svp = av_fetch((AV*)sv, elem, 1);
2014 if (!svp || ! (sv=*svp))
2015 DIE(aTHX_ PL_no_aelem, elem);
2016 break;
2017 }
2018
2019 if (PL_op->op_private &
2020 (OPpMULTIDEREF_EXISTS|OPpMULTIDEREF_DELETE))
2021 {
2022 if (PL_op->op_private & OPpMULTIDEREF_EXISTS) {
2023 sv = av_exists((AV*)sv, elem) ? &PL_sv_yes : &PL_sv_no;
2024 }
2025 else {
2026 I32 discard = (GIMME_V == G_VOID) ? G_DISCARD : 0;
2027 sv = av_delete((AV*)sv, elem, discard);
2028 if (discard)
2029 return NORMAL;
2030 if (!sv)
2031 sv = &PL_sv_undef;
2032 }
2033 }
2034 else {
2035 const U32 lval = PL_op->op_flags & OPf_MOD || LVRET;
2036 const U32 defer = PL_op->op_private & OPpLVAL_DEFER;
2037 const bool localizing = PL_op->op_private & OPpLVAL_INTRO;
2038 bool preeminent = TRUE;
2039 AV *const av = (AV*)sv;
2040 SV** svp;
2041
2042 if (UNLIKELY(localizing)) {
2043 MAGIC *mg;
2044 HV *stash;
2045
2046 /* If we can determine whether the element exist,
2047 * Try to preserve the existenceness of a tied array
2048 * element by using EXISTS and DELETE if possible.
2049 * Fallback to FETCH and STORE otherwise. */
2050 if (SvCANEXISTDELETE(av))
2051 preeminent = av_exists(av, elem);
2052 }
2053
2054 svp = av_fetch(av, elem, lval && !defer);
2055
2056 if (lval) {
2057 if (!svp || !(sv = *svp)) {
2058 IV len;
2059 if (!defer)
2060 DIE(aTHX_ PL_no_aelem, elem);
2061 len = av_tindex(av);
2062 sv = sv_2mortal(newSVavdefelem(av,
2063 /* Resolve a negative index now, unless it points
2064 * before the beginning of the array, in which
2065 * case record it for error reporting in
2066 * magic_setdefelem. */
2067 elem < 0 && len + elem >= 0
2068 ? len + elem : elem, 1));
2069 }
2070 else {
2071 if (UNLIKELY(localizing)) {
2072 if (preeminent) {
2073 save_aelem(av, elem, svp);
2074 sv = *svp; /* may have changed */
2075 }
2076 else
2077 SAVEADELETE(av, elem);
2078 }
2079 }
2080 }
2081 else {
2082 sv = (svp ? *svp : &PL_sv_undef);
2083 /* see note in pp_helem() */
2084 if (SvRMAGICAL(av) && SvGMAGICAL(sv))
2085 mg_get(sv);
2086 }
2087 }
2088
2089 }
2090 finish:
2091 {
2092 dSP;
2093 XPUSHs(sv);
2094 RETURN;
2095 }
2096 /* NOTREACHED */
2097
2098
2099
2100
2101 case MDEREF_HV_padhv_helem: /* $lex{...} */
2102 sv = PAD_SVl((++items)->pad_offset);
2103 goto do_HV_helem;
2104
2105 case MDEREF_HV_gvhv_helem: /* $pkg{...} */
2106 sv = UNOP_AUX_item_sv(++items);
2107 assert(isGV_with_GP(sv));
2108 sv = (SV*)GvHVn((GV*)sv);
2109 goto do_HV_helem;
2110
2111 case MDEREF_HV_pop_rv2hv_helem: /* expr->{...} */
2112 {
2113 dSP;
2114 sv = POPs;
2115 PUTBACK;
2116 goto do_HV_rv2hv_helem;
2117 }
2118
2119 case MDEREF_HV_gvsv_vivify_rv2hv_helem: /* $pkg->{...} */
2120 sv = UNOP_AUX_item_sv(++items);
2121 assert(isGV_with_GP(sv));
2122 sv = GvSVn((GV*)sv);
2123 goto do_HV_vivify_rv2hv_helem;
2124
2125 case MDEREF_HV_padsv_vivify_rv2hv_helem: /* $lex->{...} */
2126 sv = PAD_SVl((++items)->pad_offset);
2127 /* FALLTHROUGH */
2128
2129 do_HV_vivify_rv2hv_helem:
2130 case MDEREF_HV_vivify_rv2hv_helem: /* vivify, ->{...} */
2131 /* this is the OPpDEREF action normally found at the end of
2132 * ops like aelem, helem, rv2sv */
2133 sv = vivify_ref(sv, OPpDEREF_HV);
2134 /* FALLTHROUGH */
2135
2136 do_HV_rv2hv_helem:
2137 /* this is basically a copy of pp_rv2hv when it just has the
2138 * sKR/1 flags (and pp_rv2hv is aliased to pp_rv2av) */
2139
2140 SvGETMAGIC(sv);
2141 if (LIKELY(SvROK(sv))) {
2142 if (UNLIKELY(SvAMAGIC(sv))) {
2143 sv = amagic_deref_call(sv, to_hv_amg);
2144 }
2145 sv = SvRV(sv);
2146 if (UNLIKELY(SvTYPE(sv) != SVt_PVHV))
2147 DIE(aTHX_ "Not a HASH reference");
2148 }
2149 else if (SvTYPE(sv) != SVt_PVHV) {
2150 if (!isGV_with_GP(sv))
2151 sv = (SV*)S_softref2xv_lite(aTHX_ sv, "a HASH", SVt_PVHV);
2152 sv = MUTABLE_SV(GvHVn((GV*)sv));
2153 }
2154 /* FALLTHROUGH */
2155
2156 do_HV_helem:
2157 {
2158 /* retrieve the key; this may be either a lexical / package
2159 * var or a string constant, whose index/ptr is stored as an
2160 * item
2161 */
2162 SV *keysv = NULL; /* to shut up stupid compiler warnings */
2163
2164 assert(SvTYPE(sv) == SVt_PVHV);
2165
2166 switch (actions & MDEREF_INDEX_MASK) {
2167 case MDEREF_INDEX_none:
2168 goto finish;
2169
2170 case MDEREF_INDEX_const:
2171 keysv = UNOP_AUX_item_sv(++items);
2172 break;
2173
2174 case MDEREF_INDEX_padsv:
2175 keysv = PAD_SVl((++items)->pad_offset);
2176 break;
2177
2178 case MDEREF_INDEX_gvsv:
2179 keysv = UNOP_AUX_item_sv(++items);
2180 keysv = GvSVn((GV*)keysv);
2181 break;
2182 }
2183
2184 /* see comment above about setting this var */
2185 PL_multideref_pc = items;
2186
2187
2188 /* ensure that candidate CONSTs have been HEKified */
2189 assert( ((actions & MDEREF_INDEX_MASK) != MDEREF_INDEX_const)
2190 || SvTYPE(keysv) >= SVt_PVMG
2191 || !SvOK(keysv)
2192 || SvROK(keysv)
2193 || SvIsCOW_shared_hash(keysv));
2194
2195 /* this is basically a copy of pp_helem with OPpDEREF skipped */
2196
2197 if (!(actions & MDEREF_FLAG_last)) {
2198 HE *he = hv_fetch_ent((HV*)sv, keysv, 1, 0);
2199 if (!he || !(sv=HeVAL(he)) || sv == &PL_sv_undef)
2200 DIE(aTHX_ PL_no_helem_sv, SVfARG(keysv));
2201 break;
2202 }
2203
2204 if (PL_op->op_private &
2205 (OPpMULTIDEREF_EXISTS|OPpMULTIDEREF_DELETE))
2206 {
2207 if (PL_op->op_private & OPpMULTIDEREF_EXISTS) {
2208 sv = hv_exists_ent((HV*)sv, keysv, 0)
2209 ? &PL_sv_yes : &PL_sv_no;
2210 }
2211 else {
2212 I32 discard = (GIMME_V == G_VOID) ? G_DISCARD : 0;
2213 sv = hv_delete_ent((HV*)sv, keysv, discard, 0);
2214 if (discard)
2215 return NORMAL;
2216 if (!sv)
2217 sv = &PL_sv_undef;
2218 }
2219 }
2220 else {
2221 const U32 lval = PL_op->op_flags & OPf_MOD || LVRET;
2222 const U32 defer = PL_op->op_private & OPpLVAL_DEFER;
2223 const bool localizing = PL_op->op_private & OPpLVAL_INTRO;
2224 bool preeminent = TRUE;
2225 SV **svp;
2226 HV * const hv = (HV*)sv;
2227 HE* he;
2228
2229 if (UNLIKELY(localizing)) {
2230 MAGIC *mg;
2231 HV *stash;
2232
2233 /* If we can determine whether the element exist,
2234 * Try to preserve the existenceness of a tied hash
2235 * element by using EXISTS and DELETE if possible.
2236 * Fallback to FETCH and STORE otherwise. */
2237 if (SvCANEXISTDELETE(hv))
2238 preeminent = hv_exists_ent(hv, keysv, 0);
2239 }
2240
2241 he = hv_fetch_ent(hv, keysv, lval && !defer, 0);
2242 svp = he ? &HeVAL(he) : NULL;
2243
2244
2245 if (lval) {
2246 if (!svp || !(sv = *svp) || sv == &PL_sv_undef) {
2247 SV* lv;
2248 SV* key2;
2249 if (!defer)
2250 DIE(aTHX_ PL_no_helem_sv, SVfARG(keysv));
2251 lv = sv_newmortal();
2252 sv_upgrade(lv, SVt_PVLV);
2253 LvTYPE(lv) = 'y';
2254 sv_magic(lv, key2 = newSVsv(keysv),
2255 PERL_MAGIC_defelem, NULL, 0);
2256 /* sv_magic() increments refcount */
2257 SvREFCNT_dec_NN(key2);
2258 LvTARG(lv) = SvREFCNT_inc_simple(hv);
2259 LvTARGLEN(lv) = 1;
2260 sv = lv;
2261 }
2262 else {
2263 if (localizing) {
2264 if (HvNAME_get(hv) && isGV(sv))
2265 save_gp(MUTABLE_GV(sv),
2266 !(PL_op->op_flags & OPf_SPECIAL));
2267 else if (preeminent) {
2268 save_helem_flags(hv, keysv, svp,
2269 (PL_op->op_flags & OPf_SPECIAL)
2270 ? 0 : SAVEf_SETMAGIC);
2271 sv = *svp; /* may have changed */
2272 }
2273 else
2274 SAVEHDELETE(hv, keysv);
2275 }
2276 }
2277 }
2278 else {
2279 sv = (svp && *svp ? *svp : &PL_sv_undef);
2280 /* see note in pp_helem() */
2281 if (SvRMAGICAL(hv) && SvGMAGICAL(sv))
2282 mg_get(sv);
2283 }
2284 }
2285 goto finish;
2286 }
2287
2288 } /* switch */
2289
2290 actions >>= MDEREF_SHIFT;
2291 } /* while */
2292 /* NOTREACHED */
2293}
2294
2295
2296PP(pp_iter)
2297{
2298 dSP;
2299 PERL_CONTEXT *cx;
2300 SV *oldsv;
2301 SV **itersvp;
2302
2303 EXTEND(SP, 1);
2304 cx = &cxstack[cxstack_ix];
2305 itersvp = CxITERVAR(cx);
2306
2307 switch (CxTYPE(cx)) {
2308
2309 case CXt_LOOP_LAZYSV: /* string increment */
2310 {
2311 SV* cur = cx->blk_loop.state_u.lazysv.cur;
2312 SV *end = cx->blk_loop.state_u.lazysv.end;
2313 /* If the maximum is !SvOK(), pp_enteriter substitutes PL_sv_no.
2314 It has SvPVX of "" and SvCUR of 0, which is what we want. */
2315 STRLEN maxlen = 0;
2316 const char *max = SvPV_const(end, maxlen);
2317 if (UNLIKELY(SvNIOK(cur) || SvCUR(cur) > maxlen))
2318 RETPUSHNO;
2319
2320 oldsv = *itersvp;
2321 if (LIKELY(SvREFCNT(oldsv) == 1 && !SvMAGICAL(oldsv))) {
2322 /* safe to reuse old SV */
2323 sv_setsv(oldsv, cur);
2324 }
2325 else
2326 {
2327 /* we need a fresh SV every time so that loop body sees a
2328 * completely new SV for closures/references to work as
2329 * they used to */
2330 *itersvp = newSVsv(cur);
2331 SvREFCNT_dec_NN(oldsv);
2332 }
2333 if (strEQ(SvPVX_const(cur), max))
2334 sv_setiv(cur, 0); /* terminate next time */
2335 else
2336 sv_inc(cur);
2337 break;
2338 }
2339
2340 case CXt_LOOP_LAZYIV: /* integer increment */
2341 {
2342 IV cur = cx->blk_loop.state_u.lazyiv.cur;
2343 if (UNLIKELY(cur > cx->blk_loop.state_u.lazyiv.end))
2344 RETPUSHNO;
2345
2346 oldsv = *itersvp;
2347 /* don't risk potential race */
2348 if (LIKELY(SvREFCNT(oldsv) == 1 && !SvMAGICAL(oldsv))) {
2349 /* safe to reuse old SV */
2350 sv_setiv(oldsv, cur);
2351 }
2352 else
2353 {
2354 /* we need a fresh SV every time so that loop body sees a
2355 * completely new SV for closures/references to work as they
2356 * used to */
2357 *itersvp = newSViv(cur);
2358 SvREFCNT_dec_NN(oldsv);
2359 }
2360
2361 if (UNLIKELY(cur == IV_MAX)) {
2362 /* Handle end of range at IV_MAX */
2363 cx->blk_loop.state_u.lazyiv.end = IV_MIN;
2364 } else
2365 ++cx->blk_loop.state_u.lazyiv.cur;
2366 break;
2367 }
2368
2369 case CXt_LOOP_FOR: /* iterate array */
2370 {
2371
2372 AV *av = cx->blk_loop.state_u.ary.ary;
2373 SV *sv;
2374 bool av_is_stack = FALSE;
2375 IV ix;
2376
2377 if (!av) {
2378 av_is_stack = TRUE;
2379 av = PL_curstack;
2380 }
2381 if (PL_op->op_private & OPpITER_REVERSED) {
2382 ix = --cx->blk_loop.state_u.ary.ix;
2383 if (UNLIKELY(ix <= (av_is_stack ? cx->blk_loop.resetsp : -1)))
2384 RETPUSHNO;
2385 }
2386 else {
2387 ix = ++cx->blk_loop.state_u.ary.ix;
2388 if (UNLIKELY(ix > (av_is_stack ? cx->blk_oldsp : AvFILL(av))))
2389 RETPUSHNO;
2390 }
2391
2392 if (UNLIKELY(SvMAGICAL(av) || AvREIFY(av))) {
2393 SV * const * const svp = av_fetch(av, ix, FALSE);
2394 sv = svp ? *svp : NULL;
2395 }
2396 else {
2397 sv = AvARRAY(av)[ix];
2398 }
2399
2400 if (UNLIKELY(cx->cx_type & CXp_FOR_LVREF)) {
2401 SvSetMagicSV(*itersvp, sv);
2402 break;
2403 }
2404
2405 if (LIKELY(sv)) {
2406 if (UNLIKELY(SvIS_FREED(sv))) {
2407 *itersvp = NULL;
2408 Perl_croak(aTHX_ "Use of freed value in iteration");
2409 }
2410 if (SvPADTMP(sv)) {
2411 sv = newSVsv(sv);
2412 }
2413 else {
2414 SvTEMP_off(sv);
2415 SvREFCNT_inc_simple_void_NN(sv);
2416 }
2417 }
2418 else if (!av_is_stack) {
2419 sv = newSVavdefelem(av, ix, 0);
2420 }
2421 else
2422 sv = &PL_sv_undef;
2423
2424 oldsv = *itersvp;
2425 *itersvp = sv;
2426 SvREFCNT_dec(oldsv);
2427 break;
2428 }
2429
2430 default:
2431 DIE(aTHX_ "panic: pp_iter, type=%u", CxTYPE(cx));
2432 }
2433 RETPUSHYES;
2434}
2435
2436/*
2437A description of how taint works in pattern matching and substitution.
2438
2439This is all conditional on NO_TAINT_SUPPORT not being defined. Under
2440NO_TAINT_SUPPORT, taint-related operations should become no-ops.
2441
2442While the pattern is being assembled/concatenated and then compiled,
2443PL_tainted will get set (via TAINT_set) if any component of the pattern
2444is tainted, e.g. /.*$tainted/. At the end of pattern compilation,
2445the RXf_TAINTED flag is set on the pattern if PL_tainted is set (via
2446TAINT_get). It will also be set if any component of the pattern matches
2447based on locale-dependent behavior.
2448
2449When the pattern is copied, e.g. $r = qr/..../, the SV holding the ref to
2450the pattern is marked as tainted. This means that subsequent usage, such
2451as /x$r/, will set PL_tainted using TAINT_set, and thus RXf_TAINTED,
2452on the new pattern too.
2453
2454RXf_TAINTED_SEEN is used post-execution by the get magic code
2455of $1 et al to indicate whether the returned value should be tainted.
2456It is the responsibility of the caller of the pattern (i.e. pp_match,
2457pp_subst etc) to set this flag for any other circumstances where $1 needs
2458to be tainted.
2459
2460The taint behaviour of pp_subst (and pp_substcont) is quite complex.
2461
2462There are three possible sources of taint
2463 * the source string
2464 * the pattern (both compile- and run-time, RXf_TAINTED / RXf_TAINTED_SEEN)
2465 * the replacement string (or expression under /e)
2466
2467There are four destinations of taint and they are affected by the sources
2468according to the rules below:
2469
2470 * the return value (not including /r):
2471 tainted by the source string and pattern, but only for the
2472 number-of-iterations case; boolean returns aren't tainted;
2473 * the modified string (or modified copy under /r):
2474 tainted by the source string, pattern, and replacement strings;
2475 * $1 et al:
2476 tainted by the pattern, and under 'use re "taint"', by the source
2477 string too;
2478 * PL_taint - i.e. whether subsequent code (e.g. in a /e block) is tainted:
2479 should always be unset before executing subsequent code.
2480
2481The overall action of pp_subst is:
2482
2483 * at the start, set bits in rxtainted indicating the taint status of
2484 the various sources.
2485
2486 * After each pattern execution, update the SUBST_TAINT_PAT bit in
2487 rxtainted if RXf_TAINTED_SEEN has been set, to indicate that the
2488 pattern has subsequently become tainted via locale ops.
2489
2490 * If control is being passed to pp_substcont to execute a /e block,
2491 save rxtainted in the CXt_SUBST block, for future use by
2492 pp_substcont.
2493
2494 * Whenever control is being returned to perl code (either by falling
2495 off the "end" of pp_subst/pp_substcont, or by entering a /e block),
2496 use the flag bits in rxtainted to make all the appropriate types of
2497 destination taint visible; e.g. set RXf_TAINTED_SEEN so that $1
2498 et al will appear tainted.
2499
2500pp_match is just a simpler version of the above.
2501
2502*/
2503
2504PP(pp_subst)
2505{
2506 dSP; dTARG;
2507 PMOP *pm = cPMOP;
2508 PMOP *rpm = pm;
2509 char *s;
2510 char *strend;
2511 const char *c;
2512 STRLEN clen;
2513 SSize_t iters = 0;
2514 SSize_t maxiters;
2515 bool once;
2516 U8 rxtainted = 0; /* holds various SUBST_TAINT_* flag bits.
2517 See "how taint works" above */
2518 char *orig;
2519 U8 r_flags;
2520 REGEXP *rx = PM_GETRE(pm);
2521 STRLEN len;
2522 int force_on_match = 0;
2523 const I32 oldsave = PL_savestack_ix;
2524 STRLEN slen;
2525 bool doutf8 = FALSE; /* whether replacement is in utf8 */
2526#ifdef PERL_ANY_COW
2527 bool is_cow;
2528#endif
2529 SV *nsv = NULL;
2530 /* known replacement string? */
2531 SV *dstr = (pm->op_pmflags & PMf_CONST) ? POPs : NULL;
2532
2533 PERL_ASYNC_CHECK();
2534
2535 if (PL_op->op_flags & OPf_STACKED)
2536 TARG = POPs;
2537 else if (ARGTARG)
2538 GETTARGET;
2539 else {
2540 TARG = DEFSV;
2541 EXTEND(SP,1);
2542 }
2543
2544 SvGETMAGIC(TARG); /* must come before cow check */
2545#ifdef PERL_ANY_COW
2546 /* Awooga. Awooga. "bool" types that are actually char are dangerous,
2547 because they make integers such as 256 "false". */
2548 is_cow = SvIsCOW(TARG) ? TRUE : FALSE;
2549#else
2550 if (SvIsCOW(TARG))
2551 sv_force_normal_flags(TARG,0);
2552#endif
2553 if (!(rpm->op_pmflags & PMf_NONDESTRUCT)
2554 && (SvREADONLY(TARG)
2555 || ( ((SvTYPE(TARG) == SVt_PVGV && isGV_with_GP(TARG))
2556 || SvTYPE(TARG) > SVt_PVLV)
2557 && !(SvTYPE(TARG) == SVt_PVGV && SvFAKE(TARG)))))
2558 Perl_croak_no_modify();
2559 PUTBACK;
2560
2561 orig = SvPV_nomg(TARG, len);
2562 /* note we don't (yet) force the var into being a string; if we fail
2563 * to match, we leave as-is; on successful match howeverm, we *will*
2564 * coerce into a string, then repeat the match */
2565 if (!SvPOKp(TARG) || SvTYPE(TARG) == SVt_PVGV || SvVOK(TARG))
2566 force_on_match = 1;
2567
2568 /* only replace once? */
2569 once = !(rpm->op_pmflags & PMf_GLOBAL);
2570
2571 /* See "how taint works" above */
2572 if (TAINTING_get) {
2573 rxtainted = (
2574 (SvTAINTED(TARG) ? SUBST_TAINT_STR : 0)
2575 | (RX_ISTAINTED(rx) ? SUBST_TAINT_PAT : 0)
2576 | ((pm->op_pmflags & PMf_RETAINT) ? SUBST_TAINT_RETAINT : 0)
2577 | ((once && !(rpm->op_pmflags & PMf_NONDESTRUCT))
2578 ? SUBST_TAINT_BOOLRET : 0));
2579 TAINT_NOT;
2580 }
2581
2582 force_it:
2583 if (!pm || !orig)
2584 DIE(aTHX_ "panic: pp_subst, pm=%p, orig=%p", pm, orig);
2585
2586 strend = orig + len;
2587 slen = DO_UTF8(TARG) ? utf8_length((U8*)orig, (U8*)strend) : len;
2588 maxiters = 2 * slen + 10; /* We can match twice at each
2589 position, once with zero-length,
2590 second time with non-zero. */
2591
2592 if (!RX_PRELEN(rx) && PL_curpm
2593 && !ReANY(rx)->mother_re) {
2594 pm = PL_curpm;
2595 rx = PM_GETRE(pm);
2596 }
2597
2598#ifdef PERL_SAWAMPERSAND
2599 r_flags = ( RX_NPARENS(rx)
2600 || PL_sawampersand
2601 || (RX_EXTFLAGS(rx) & (RXf_EVAL_SEEN|RXf_PMf_KEEPCOPY))
2602 || (rpm->op_pmflags & PMf_KEEPCOPY)
2603 )
2604 ? REXEC_COPY_STR
2605 : 0;
2606#else
2607 r_flags = REXEC_COPY_STR;
2608#endif
2609
2610 if (!CALLREGEXEC(rx, orig, strend, orig, 0, TARG, NULL, r_flags))
2611 {
2612 SPAGAIN;
2613 PUSHs(rpm->op_pmflags & PMf_NONDESTRUCT ? TARG : &PL_sv_no);
2614 LEAVE_SCOPE(oldsave);
2615 RETURN;
2616 }
2617 PL_curpm = pm;
2618
2619 /* known replacement string? */
2620 if (dstr) {
2621 /* replacement needing upgrading? */
2622 if (DO_UTF8(TARG) && !doutf8) {
2623 nsv = sv_newmortal();
2624 SvSetSV(nsv, dstr);
2625 if (IN_ENCODING)
2626 sv_recode_to_utf8(nsv, _get_encoding());
2627 else
2628 sv_utf8_upgrade(nsv);
2629 c = SvPV_const(nsv, clen);
2630 doutf8 = TRUE;
2631 }
2632 else {
2633 c = SvPV_const(dstr, clen);
2634 doutf8 = DO_UTF8(dstr);
2635 }
2636
2637 if (SvTAINTED(dstr))
2638 rxtainted |= SUBST_TAINT_REPL;
2639 }
2640 else {
2641 c = NULL;
2642 doutf8 = FALSE;
2643 }
2644
2645 /* can do inplace substitution? */
2646 if (c
2647#ifdef PERL_ANY_COW
2648 && !is_cow
2649#endif
2650 && (I32)clen <= RX_MINLENRET(rx)
2651 && ( once
2652 || !(r_flags & REXEC_COPY_STR)
2653 || (!SvGMAGICAL(dstr) && !(RX_EXTFLAGS(rx) & RXf_EVAL_SEEN))
2654 )
2655 && !(RX_EXTFLAGS(rx) & RXf_NO_INPLACE_SUBST)
2656 && (!doutf8 || SvUTF8(TARG))
2657 && !(rpm->op_pmflags & PMf_NONDESTRUCT))
2658 {
2659
2660#ifdef PERL_ANY_COW
2661 if (SvIsCOW(TARG)) {
2662 if (!force_on_match)
2663 goto have_a_cow;
2664 assert(SvVOK(TARG));
2665 }
2666#endif
2667 if (force_on_match) {
2668 /* redo the first match, this time with the orig var
2669 * forced into being a string */
2670 force_on_match = 0;
2671 orig = SvPV_force_nomg(TARG, len);
2672 goto force_it;
2673 }
2674
2675 if (once) {
2676 char *d, *m;
2677 if (RX_MATCH_TAINTED(rx)) /* run time pattern taint, eg locale */
2678 rxtainted |= SUBST_TAINT_PAT;
2679 m = orig + RX_OFFS(rx)[0].start;
2680 d = orig + RX_OFFS(rx)[0].end;
2681 s = orig;
2682 if (m - s > strend - d) { /* faster to shorten from end */
2683 I32 i;
2684 if (clen) {
2685 Copy(c, m, clen, char);
2686 m += clen;
2687 }
2688 i = strend - d;
2689 if (i > 0) {
2690 Move(d, m, i, char);
2691 m += i;
2692 }
2693 *m = '\0';
2694 SvCUR_set(TARG, m - s);
2695 }
2696 else { /* faster from front */
2697 I32 i = m - s;
2698 d -= clen;
2699 if (i > 0)
2700 Move(s, d - i, i, char);
2701 sv_chop(TARG, d-i);
2702 if (clen)
2703 Copy(c, d, clen, char);
2704 }
2705 SPAGAIN;
2706 PUSHs(&PL_sv_yes);
2707 }
2708 else {
2709 char *d, *m;
2710 d = s = RX_OFFS(rx)[0].start + orig;
2711 do {
2712 I32 i;
2713 if (UNLIKELY(iters++ > maxiters))
2714 DIE(aTHX_ "Substitution loop");
2715 if (UNLIKELY(RX_MATCH_TAINTED(rx))) /* run time pattern taint, eg locale */
2716 rxtainted |= SUBST_TAINT_PAT;
2717 m = RX_OFFS(rx)[0].start + orig;
2718 if ((i = m - s)) {
2719 if (s != d)
2720 Move(s, d, i, char);
2721 d += i;
2722 }
2723 if (clen) {
2724 Copy(c, d, clen, char);
2725 d += clen;
2726 }
2727 s = RX_OFFS(rx)[0].end + orig;
2728 } while (CALLREGEXEC(rx, s, strend, orig,
2729 s == m, /* don't match same null twice */
2730 TARG, NULL,
2731 REXEC_NOT_FIRST|REXEC_IGNOREPOS|REXEC_FAIL_ON_UNDERFLOW));
2732 if (s != d) {
2733 I32 i = strend - s;
2734 SvCUR_set(TARG, d - SvPVX_const(TARG) + i);
2735 Move(s, d, i+1, char); /* include the NUL */
2736 }
2737 SPAGAIN;
2738 mPUSHi(iters);
2739 }
2740 }
2741 else {
2742 bool first;
2743 char *m;
2744 SV *repl;
2745 if (force_on_match) {
2746 /* redo the first match, this time with the orig var
2747 * forced into being a string */
2748 force_on_match = 0;
2749 if (rpm->op_pmflags & PMf_NONDESTRUCT) {
2750 /* I feel that it should be possible to avoid this mortal copy
2751 given that the code below copies into a new destination.
2752 However, I suspect it isn't worth the complexity of
2753 unravelling the C<goto force_it> for the small number of
2754 cases where it would be viable to drop into the copy code. */
2755 TARG = sv_2mortal(newSVsv(TARG));
2756 }
2757 orig = SvPV_force_nomg(TARG, len);
2758 goto force_it;
2759 }
2760#ifdef PERL_ANY_COW
2761 have_a_cow:
2762#endif
2763 if (RX_MATCH_TAINTED(rx)) /* run time pattern taint, eg locale */
2764 rxtainted |= SUBST_TAINT_PAT;
2765 repl = dstr;
2766 s = RX_OFFS(rx)[0].start + orig;
2767 dstr = newSVpvn_flags(orig, s-orig,
2768 SVs_TEMP | (DO_UTF8(TARG) ? SVf_UTF8 : 0));
2769 if (!c) {
2770 PERL_CONTEXT *cx;
2771 SPAGAIN;
2772 m = orig;
2773 /* note that a whole bunch of local vars are saved here for
2774 * use by pp_substcont: here's a list of them in case you're
2775 * searching for places in this sub that uses a particular var:
2776 * iters maxiters r_flags oldsave rxtainted orig dstr targ
2777 * s m strend rx once */
2778 PUSHSUBST(cx);
2779 RETURNOP(cPMOP->op_pmreplrootu.op_pmreplroot);
2780 }
2781 first = TRUE;
2782 do {
2783 if (UNLIKELY(iters++ > maxiters))
2784 DIE(aTHX_ "Substitution loop");
2785 if (UNLIKELY(RX_MATCH_TAINTED(rx)))
2786 rxtainted |= SUBST_TAINT_PAT;
2787 if (RX_MATCH_COPIED(rx) && RX_SUBBEG(rx) != orig) {
2788 char *old_s = s;
2789 char *old_orig = orig;
2790 assert(RX_SUBOFFSET(rx) == 0);
2791
2792 orig = RX_SUBBEG(rx);
2793 s = orig + (old_s - old_orig);
2794 strend = s + (strend - old_s);
2795 }
2796 m = RX_OFFS(rx)[0].start + orig;
2797 sv_catpvn_nomg_maybeutf8(dstr, s, m - s, DO_UTF8(TARG));
2798 s = RX_OFFS(rx)[0].end + orig;
2799 if (first) {
2800 /* replacement already stringified */
2801 if (clen)
2802 sv_catpvn_nomg_maybeutf8(dstr, c, clen, doutf8);
2803 first = FALSE;
2804 }
2805 else {
2806 if (IN_ENCODING) {
2807 if (!nsv) nsv = sv_newmortal();
2808 sv_copypv(nsv, repl);
2809 if (!DO_UTF8(nsv)) sv_recode_to_utf8(nsv, _get_encoding());
2810 sv_catsv(dstr, nsv);
2811 }
2812 else sv_catsv(dstr, repl);
2813 if (UNLIKELY(SvTAINTED(repl)))
2814 rxtainted |= SUBST_TAINT_REPL;
2815 }
2816 if (once)
2817 break;
2818 } while (CALLREGEXEC(rx, s, strend, orig, s == m,
2819 TARG, NULL,
2820 REXEC_NOT_FIRST|REXEC_IGNOREPOS|REXEC_FAIL_ON_UNDERFLOW));
2821 sv_catpvn_nomg_maybeutf8(dstr, s, strend - s, DO_UTF8(TARG));
2822
2823 if (rpm->op_pmflags & PMf_NONDESTRUCT) {
2824 /* From here on down we're using the copy, and leaving the original
2825 untouched. */
2826 TARG = dstr;
2827 SPAGAIN;
2828 PUSHs(dstr);
2829 } else {
2830#ifdef PERL_ANY_COW
2831 /* The match may make the string COW. If so, brilliant, because
2832 that's just saved us one malloc, copy and free - the regexp has
2833 donated the old buffer, and we malloc an entirely new one, rather
2834 than the regexp malloc()ing a buffer and copying our original,
2835 only for us to throw it away here during the substitution. */
2836 if (SvIsCOW(TARG)) {
2837 sv_force_normal_flags(TARG, SV_COW_DROP_PV);
2838 } else
2839#endif
2840 {
2841 SvPV_free(TARG);
2842 }
2843 SvPV_set(TARG, SvPVX(dstr));
2844 SvCUR_set(TARG, SvCUR(dstr));
2845 SvLEN_set(TARG, SvLEN(dstr));
2846 SvFLAGS(TARG) |= SvUTF8(dstr);
2847 SvPV_set(dstr, NULL);
2848
2849 SPAGAIN;
2850 mPUSHi(iters);
2851 }
2852 }
2853
2854 if (!(rpm->op_pmflags & PMf_NONDESTRUCT)) {
2855 (void)SvPOK_only_UTF8(TARG);
2856 }
2857
2858 /* See "how taint works" above */
2859 if (TAINTING_get) {
2860 if ((rxtainted & SUBST_TAINT_PAT) ||
2861 ((rxtainted & (SUBST_TAINT_STR|SUBST_TAINT_RETAINT)) ==
2862 (SUBST_TAINT_STR|SUBST_TAINT_RETAINT))
2863 )
2864 (RX_MATCH_TAINTED_on(rx)); /* taint $1 et al */
2865
2866 if (!(rxtainted & SUBST_TAINT_BOOLRET)
2867 && (rxtainted & (SUBST_TAINT_STR|SUBST_TAINT_PAT))
2868 )
2869 SvTAINTED_on(TOPs); /* taint return value */
2870 else
2871 SvTAINTED_off(TOPs); /* may have got tainted earlier */
2872
2873 /* needed for mg_set below */
2874 TAINT_set(
2875 cBOOL(rxtainted & (SUBST_TAINT_STR|SUBST_TAINT_PAT|SUBST_TAINT_REPL))
2876 );
2877 SvTAINT(TARG);
2878 }
2879 SvSETMAGIC(TARG); /* PL_tainted must be correctly set for this mg_set */
2880 TAINT_NOT;
2881 LEAVE_SCOPE(oldsave);
2882 RETURN;
2883}
2884
2885PP(pp_grepwhile)
2886{
2887 dSP;
2888
2889 if (SvTRUEx(POPs))
2890 PL_stack_base[PL_markstack_ptr[-1]++] = PL_stack_base[*PL_markstack_ptr];
2891 ++*PL_markstack_ptr;
2892 FREETMPS;
2893 LEAVE_with_name("grep_item"); /* exit inner scope */
2894
2895 /* All done yet? */
2896 if (UNLIKELY(PL_stack_base + *PL_markstack_ptr > SP)) {
2897 I32 items;
2898 const I32 gimme = GIMME_V;
2899
2900 LEAVE_with_name("grep"); /* exit outer scope */
2901 (void)POPMARK; /* pop src */
2902 items = --*PL_markstack_ptr - PL_markstack_ptr[-1];
2903 (void)POPMARK; /* pop dst */
2904 SP = PL_stack_base + POPMARK; /* pop original mark */
2905 if (gimme == G_SCALAR) {
2906 if (PL_op->op_private & OPpGREP_LEX) {
2907 SV* const sv = sv_newmortal();
2908 sv_setiv(sv, items);
2909 PUSHs(sv);
2910 }
2911 else {
2912 dTARGET;
2913 XPUSHi(items);
2914 }
2915 }
2916 else if (gimme == G_ARRAY)
2917 SP += items;
2918 RETURN;
2919 }
2920 else {
2921 SV *src;
2922
2923 ENTER_with_name("grep_item"); /* enter inner scope */
2924 SAVEVPTR(PL_curpm);
2925
2926 src = PL_stack_base[*PL_markstack_ptr];
2927 if (SvPADTMP(src)) {
2928 src = PL_stack_base[*PL_markstack_ptr] = sv_mortalcopy(src);
2929 PL_tmps_floor++;
2930 }
2931 SvTEMP_off(src);
2932 if (PL_op->op_private & OPpGREP_LEX)
2933 PAD_SVl(PL_op->op_targ) = src;
2934 else
2935 DEFSV_set(src);
2936
2937 RETURNOP(cLOGOP->op_other);
2938 }
2939}
2940
2941PP(pp_leavesub)
2942{
2943 dSP;
2944 SV **mark;
2945 SV **newsp;
2946 PMOP *newpm;
2947 I32 gimme;
2948 PERL_CONTEXT *cx;
2949 SV *sv;
2950
2951 if (CxMULTICALL(&cxstack[cxstack_ix]))
2952 return 0;
2953
2954 POPBLOCK(cx,newpm);
2955 cxstack_ix++; /* temporarily protect top context */
2956
2957 TAINT_NOT;
2958 if (gimme == G_SCALAR) {
2959 MARK = newsp + 1;
2960 if (LIKELY(MARK <= SP)) {
2961 if (cx->blk_sub.cv && CvDEPTH(cx->blk_sub.cv) > 1) {
2962 if (SvTEMP(TOPs) && SvREFCNT(TOPs) == 1
2963 && !SvMAGICAL(TOPs)) {
2964 *MARK = SvREFCNT_inc(TOPs);
2965 FREETMPS;
2966 sv_2mortal(*MARK);
2967 }
2968 else {
2969 sv = SvREFCNT_inc(TOPs); /* FREETMPS could clobber it */
2970 FREETMPS;
2971 *MARK = sv_mortalcopy(sv);
2972 SvREFCNT_dec_NN(sv);
2973 }
2974 }
2975 else if (SvTEMP(TOPs) && SvREFCNT(TOPs) == 1
2976 && !SvMAGICAL(TOPs)) {
2977 *MARK = TOPs;
2978 }
2979 else
2980 *MARK = sv_mortalcopy(TOPs);
2981 }
2982 else {
2983 MEXTEND(MARK, 0);
2984 *MARK = &PL_sv_undef;
2985 }
2986 SP = MARK;
2987 }
2988 else if (gimme == G_ARRAY) {
2989 for (MARK = newsp + 1; MARK <= SP; MARK++) {
2990 if (!SvTEMP(*MARK) || SvREFCNT(*MARK) != 1
2991 || SvMAGICAL(*MARK)) {
2992 *MARK = sv_mortalcopy(*MARK);
2993 TAINT_NOT; /* Each item is independent */
2994 }
2995 }
2996 }
2997 PUTBACK;
2998
2999 LEAVE;
3000 POPSUB(cx,sv); /* Stack values are safe: release CV and @_ ... */
3001 cxstack_ix--;
3002 PL_curpm = newpm; /* ... and pop $1 et al */
3003
3004 LEAVESUB(sv);
3005 return cx->blk_sub.retop;
3006}
3007
3008PP(pp_entersub)
3009{
3010 dSP; dPOPss;
3011 GV *gv;
3012 CV *cv;
3013 PERL_CONTEXT *cx;
3014 I32 gimme;
3015 const bool hasargs = (PL_op->op_flags & OPf_STACKED) != 0;
3016
3017 if (UNLIKELY(!sv))
3018 DIE(aTHX_ "Not a CODE reference");
3019 /* This is overwhelmingly the most common case: */
3020 if (!LIKELY(SvTYPE(sv) == SVt_PVGV && (cv = GvCVu((const GV *)sv)))) {
3021 switch (SvTYPE(sv)) {
3022 case SVt_PVGV:
3023 we_have_a_glob:
3024 if (!(cv = GvCVu((const GV *)sv))) {
3025 HV *stash;
3026 cv = sv_2cv(sv, &stash, &gv, 0);
3027 }
3028 if (!cv) {
3029 ENTER;
3030 SAVETMPS;
3031 goto try_autoload;
3032 }
3033 break;
3034 case SVt_PVLV:
3035 if(isGV_with_GP(sv)) goto we_have_a_glob;
3036 /* FALLTHROUGH */
3037 default:
3038 if (sv == &PL_sv_yes) { /* unfound import, ignore */
3039 if (hasargs)
3040 SP = PL_stack_base + POPMARK;
3041 else
3042 (void)POPMARK;
3043 RETURN;
3044 }
3045 SvGETMAGIC(sv);
3046 if (SvROK(sv)) {
3047 if (SvAMAGIC(sv)) {
3048 sv = amagic_deref_call(sv, to_cv_amg);
3049 /* Don't SPAGAIN here. */
3050 }
3051 }
3052 else {
3053 const char *sym;
3054 STRLEN len;
3055 if (!SvOK(sv))
3056 DIE(aTHX_ PL_no_usym, "a subroutine");
3057 sym = SvPV_nomg_const(sv, len);
3058 if (PL_op->op_private & HINT_STRICT_REFS)
3059 DIE(aTHX_ "Can't use string (\"%" SVf32 "\"%s) as a subroutine ref while \"strict refs\" in use", sv, len>32 ? "..." : "");
3060 cv = get_cvn_flags(sym, len, GV_ADD|SvUTF8(sv));
3061 break;
3062 }
3063 cv = MUTABLE_CV(SvRV(sv));
3064 if (SvTYPE(cv) == SVt_PVCV)
3065 break;
3066 /* FALLTHROUGH */
3067 case SVt_PVHV:
3068 case SVt_PVAV:
3069 DIE(aTHX_ "Not a CODE reference");
3070 /* This is the second most common case: */
3071 case SVt_PVCV:
3072 cv = MUTABLE_CV(sv);
3073 break;
3074 }
3075 }
3076
3077 ENTER;
3078
3079 retry:
3080 if (UNLIKELY(CvCLONE(cv) && ! CvCLONED(cv)))
3081 DIE(aTHX_ "Closure prototype called");
3082 if (UNLIKELY(!CvROOT(cv) && !CvXSUB(cv))) {
3083 GV* autogv;
3084 SV* sub_name;
3085
3086 /* anonymous or undef'd function leaves us no recourse */
3087 if (CvLEXICAL(cv) && CvHASGV(cv))
3088 DIE(aTHX_ "Undefined subroutine &%"SVf" called",
3089 SVfARG(cv_name(cv, NULL, 0)));
3090 if (CvANON(cv) || !CvHASGV(cv)) {
3091 DIE(aTHX_ "Undefined subroutine called");
3092 }
3093
3094 /* autoloaded stub? */
3095 if (cv != GvCV(gv = CvGV(cv))) {
3096 cv = GvCV(gv);
3097 }
3098 /* should call AUTOLOAD now? */
3099 else {
3100 try_autoload:
3101 if ((autogv = gv_autoload_pvn(GvSTASH(gv), GvNAME(gv), GvNAMELEN(gv),
3102 GvNAMEUTF8(gv) ? SVf_UTF8 : 0)))
3103 {
3104 cv = GvCV(autogv);
3105 }
3106 else {
3107 sorry:
3108 sub_name = sv_newmortal();
3109 gv_efullname3(sub_name, gv, NULL);
3110 DIE(aTHX_ "Undefined subroutine &%"SVf" called", SVfARG(sub_name));
3111 }
3112 }
3113 if (!cv)
3114 goto sorry;
3115 goto retry;
3116 }
3117
3118 if (UNLIKELY((PL_op->op_private & OPpENTERSUB_DB) && GvCV(PL_DBsub)
3119 && !CvNODEBUG(cv)))
3120 {
3121 Perl_get_db_sub(aTHX_ &sv, cv);
3122 if (CvISXSUB(cv))
3123 PL_curcopdb = PL_curcop;
3124 if (CvLVALUE(cv)) {
3125 /* check for lsub that handles lvalue subroutines */
3126 cv = GvCV(gv_fetchpvs("DB::lsub", GV_ADDMULTI, SVt_PVCV));
3127 /* if lsub not found then fall back to DB::sub */
3128 if (!cv) cv = GvCV(PL_DBsub);
3129 } else {
3130 cv = GvCV(PL_DBsub);
3131 }
3132
3133 if (!cv || (!CvXSUB(cv) && !CvSTART(cv)))
3134 DIE(aTHX_ "No DB::sub routine defined");
3135 }
3136
3137 gimme = GIMME_V;
3138
3139 if (!(CvISXSUB(cv))) {
3140 /* This path taken at least 75% of the time */
3141 dMARK;
3142 PADLIST * const padlist = CvPADLIST(cv);
3143 I32 depth;
3144
3145 PUSHBLOCK(cx, CXt_SUB, MARK);
3146 PUSHSUB(cx);
3147 cx->blk_sub.retop = PL_op->op_next;
3148 if (UNLIKELY((depth = ++CvDEPTH(cv)) >= 2)) {
3149 PERL_STACK_OVERFLOW_CHECK();
3150 pad_push(padlist, depth);
3151 }
3152 SAVECOMPPAD();
3153 PAD_SET_CUR_NOSAVE(padlist, depth);
3154 if (LIKELY(hasargs)) {
3155 AV *const av = MUTABLE_AV(PAD_SVl(0));
3156 SSize_t items;
3157 AV **defavp;
3158
3159 if (UNLIKELY(AvREAL(av))) {
3160 /* @_ is normally not REAL--this should only ever
3161 * happen when DB::sub() calls things that modify @_ */
3162 av_clear(av);
3163 AvREAL_off(av);
3164 AvREIFY_on(av);
3165 }
3166 defavp = &GvAV(PL_defgv);
3167 cx->blk_sub.savearray = *defavp;
3168 *defavp = MUTABLE_AV(SvREFCNT_inc_simple_NN(av));
3169 CX_CURPAD_SAVE(cx->blk_sub);
3170 cx->blk_sub.argarray = av;
3171 items = SP - MARK;
3172
3173 if (UNLIKELY(items - 1 > AvMAX(av))) {
3174 SV **ary = AvALLOC(av);
3175 AvMAX(av) = items - 1;
3176 Renew(ary, items, SV*);
3177 AvALLOC(av) = ary;
3178 AvARRAY(av) = ary;
3179 }
3180
3181 Copy(MARK+1,AvARRAY(av),items,SV*);
3182 AvFILLp(av) = items - 1;
3183
3184 MARK = AvARRAY(av);
3185 while (items--) {
3186 if (*MARK)
3187 {
3188 if (SvPADTMP(*MARK)) {
3189 *MARK = sv_mortalcopy(*MARK);
3190 }
3191 SvTEMP_off(*MARK);
3192 }
3193 MARK++;
3194 }
3195 }
3196 SAVETMPS;
3197 if (UNLIKELY((cx->blk_u16 & OPpENTERSUB_LVAL_MASK) == OPpLVAL_INTRO &&
3198 !CvLVALUE(cv)))
3199 DIE(aTHX_ "Can't modify non-lvalue subroutine call");
3200 /* warning must come *after* we fully set up the context
3201 * stuff so that __WARN__ handlers can safely dounwind()
3202 * if they want to
3203 */
3204 if (UNLIKELY(depth == PERL_SUB_DEPTH_WARN
3205 && ckWARN(WARN_RECURSION)
3206 && !(PERLDB_SUB && cv == GvCV(PL_DBsub))))
3207 sub_crush_depth(cv);
3208 RETURNOP(CvSTART(cv));
3209 }
3210 else {
3211 SSize_t markix = TOPMARK;
3212
3213 SAVETMPS;
3214 PUTBACK;
3215
3216 if (UNLIKELY(((PL_op->op_private
3217 & PUSHSUB_GET_LVALUE_MASK(Perl_is_lvalue_sub)
3218 ) & OPpENTERSUB_LVAL_MASK) == OPpLVAL_INTRO &&
3219 !CvLVALUE(cv)))
3220 DIE(aTHX_ "Can't modify non-lvalue subroutine call");
3221
3222 if (UNLIKELY(!hasargs && GvAV(PL_defgv))) {
3223 /* Need to copy @_ to stack. Alternative may be to
3224 * switch stack to @_, and copy return values
3225 * back. This would allow popping @_ in XSUB, e.g.. XXXX */
3226 AV * const av = GvAV(PL_defgv);
3227 const SSize_t items = AvFILL(av) + 1;
3228
3229 if (items) {
3230 SSize_t i = 0;
3231 const bool m = cBOOL(SvRMAGICAL(av));
3232 /* Mark is at the end of the stack. */
3233 EXTEND(SP, items);
3234 for (; i < items; ++i)
3235 {
3236 SV *sv;
3237 if (m) {
3238 SV ** const svp = av_fetch(av, i, 0);
3239 sv = svp ? *svp : NULL;
3240 }
3241 else sv = AvARRAY(av)[i];
3242 if (sv) SP[i+1] = sv;
3243 else {
3244 SP[i+1] = newSVavdefelem(av, i, 1);
3245 }
3246 }
3247 SP += items;
3248 PUTBACK ;
3249 }
3250 }
3251 else {
3252 SV **mark = PL_stack_base + markix;
3253 SSize_t items = SP - mark;
3254 while (items--) {
3255 mark++;
3256 if (*mark && SvPADTMP(*mark)) {
3257 *mark = sv_mortalcopy(*mark);
3258 }
3259 }
3260 }
3261 /* We assume first XSUB in &DB::sub is the called one. */
3262 if (UNLIKELY(PL_curcopdb)) {
3263 SAVEVPTR(PL_curcop);
3264 PL_curcop = PL_curcopdb;
3265 PL_curcopdb = NULL;
3266 }
3267 /* Do we need to open block here? XXXX */
3268
3269 /* CvXSUB(cv) must not be NULL because newXS() refuses NULL xsub address */
3270 assert(CvXSUB(cv));
3271 CvXSUB(cv)(aTHX_ cv);
3272
3273 /* Enforce some sanity in scalar context. */
3274 if (gimme == G_SCALAR) {
3275 SV **svp = PL_stack_base + markix + 1;
3276 if (svp != PL_stack_sp) {
3277 *svp = svp > PL_stack_sp ? &PL_sv_undef : *PL_stack_sp;
3278 PL_stack_sp = svp;
3279 }
3280 }
3281 LEAVE;
3282 return NORMAL;
3283 }
3284}
3285
3286void
3287Perl_sub_crush_depth(pTHX_ CV *cv)
3288{
3289 PERL_ARGS_ASSERT_SUB_CRUSH_DEPTH;
3290
3291 if (CvANON(cv))
3292 Perl_warner(aTHX_ packWARN(WARN_RECURSION), "Deep recursion on anonymous subroutine");
3293 else {
3294 Perl_warner(aTHX_ packWARN(WARN_RECURSION), "Deep recursion on subroutine \"%"SVf"\"",
3295 SVfARG(cv_name(cv,NULL,0)));
3296 }
3297}
3298
3299PP(pp_aelem)
3300{
3301 dSP;
3302 SV** svp;
3303 SV* const elemsv = POPs;
3304 IV elem = SvIV(elemsv);
3305 AV *const av = MUTABLE_AV(POPs);
3306 const U32 lval = PL_op->op_flags & OPf_MOD || LVRET;
3307 const U32 defer = PL_op->op_private & OPpLVAL_DEFER;
3308 const bool localizing = PL_op->op_private & OPpLVAL_INTRO;
3309 bool preeminent = TRUE;
3310 SV *sv;
3311
3312 if (UNLIKELY(SvROK(elemsv) && !SvGAMAGIC(elemsv) && ckWARN(WARN_MISC)))
3313 Perl_warner(aTHX_ packWARN(WARN_MISC),
3314 "Use of reference \"%"SVf"\" as array index",
3315 SVfARG(elemsv));
3316 if (UNLIKELY(SvTYPE(av) != SVt_PVAV))
3317 RETPUSHUNDEF;
3318
3319 if (UNLIKELY(localizing)) {
3320 MAGIC *mg;
3321 HV *stash;
3322
3323 /* If we can determine whether the element exist,
3324 * Try to preserve the existenceness of a tied array
3325 * element by using EXISTS and DELETE if possible.
3326 * Fallback to FETCH and STORE otherwise. */
3327 if (SvCANEXISTDELETE(av))
3328 preeminent = av_exists(av, elem);
3329 }
3330
3331 svp = av_fetch(av, elem, lval && !defer);
3332 if (lval) {
3333#ifdef PERL_MALLOC_WRAP
3334 if (SvUOK(elemsv)) {
3335 const UV uv = SvUV(elemsv);
3336 elem = uv > IV_MAX ? IV_MAX : uv;
3337 }
3338 else if (SvNOK(elemsv))
3339 elem = (IV)SvNV(elemsv);
3340 if (elem > 0) {
3341 static const char oom_array_extend[] =
3342 "Out of memory during array extend"; /* Duplicated in av.c */
3343 MEM_WRAP_CHECK_1(elem,SV*,oom_array_extend);
3344 }
3345#endif
3346 if (!svp || !*svp) {
3347 IV len;
3348 if (!defer)
3349 DIE(aTHX_ PL_no_aelem, elem);
3350 len = av_tindex(av);
3351 mPUSHs(newSVavdefelem(av,
3352 /* Resolve a negative index now, unless it points before the
3353 beginning of the array, in which case record it for error
3354 reporting in magic_setdefelem. */
3355 elem < 0 && len + elem >= 0 ? len + elem : elem,
3356 1));
3357 RETURN;
3358 }
3359 if (UNLIKELY(localizing)) {
3360 if (preeminent)
3361 save_aelem(av, elem, svp);
3362 else
3363 SAVEADELETE(av, elem);
3364 }
3365 else if (PL_op->op_private & OPpDEREF) {
3366 PUSHs(vivify_ref(*svp, PL_op->op_private & OPpDEREF));
3367 RETURN;
3368 }
3369 }
3370 sv = (svp ? *svp : &PL_sv_undef);
3371 if (!lval && SvRMAGICAL(av) && SvGMAGICAL(sv)) /* see note in pp_helem() */
3372 mg_get(sv);
3373 PUSHs(sv);
3374 RETURN;
3375}
3376
3377SV*
3378Perl_vivify_ref(pTHX_ SV *sv, U32 to_what)
3379{
3380 PERL_ARGS_ASSERT_VIVIFY_REF;
3381
3382 SvGETMAGIC(sv);
3383 if (!SvOK(sv)) {
3384 if (SvREADONLY(sv))
3385 Perl_croak_no_modify();
3386 prepare_SV_for_RV(sv);
3387 switch (to_what) {
3388 case OPpDEREF_SV:
3389 SvRV_set(sv, newSV(0));
3390 break;
3391 case OPpDEREF_AV:
3392 SvRV_set(sv, MUTABLE_SV(newAV()));
3393 break;
3394 case OPpDEREF_HV:
3395 SvRV_set(sv, MUTABLE_SV(newHV()));
3396 break;
3397 }
3398 SvROK_on(sv);
3399 SvSETMAGIC(sv);
3400 SvGETMAGIC(sv);
3401 }
3402 if (SvGMAGICAL(sv)) {
3403 /* copy the sv without magic to prevent magic from being
3404 executed twice */
3405 SV* msv = sv_newmortal();
3406 sv_setsv_nomg(msv, sv);
3407 return msv;
3408 }
3409 return sv;
3410}
3411
3412PERL_STATIC_INLINE HV *
3413S_opmethod_stash(pTHX_ SV* meth)
3414{
3415 SV* ob;
3416 HV* stash;
3417
3418 SV* const sv = PL_stack_base + TOPMARK == PL_stack_sp
3419 ? (Perl_croak(aTHX_ "Can't call method \"%"SVf"\" without a "
3420 "package or object reference", SVfARG(meth)),
3421 (SV *)NULL)
3422 : *(PL_stack_base + TOPMARK + 1);
3423
3424 PERL_ARGS_ASSERT_OPMETHOD_STASH;
3425
3426 if (UNLIKELY(!sv))
3427 undefined:
3428 Perl_croak(aTHX_ "Can't call method \"%"SVf"\" on an undefined value",
3429 SVfARG(meth));
3430
3431 if (UNLIKELY(SvGMAGICAL(sv))) mg_get(sv);
3432 else if (SvIsCOW_shared_hash(sv)) { /* MyClass->meth() */
3433 stash = gv_stashsv(sv, GV_CACHE_ONLY);
3434 if (stash) return stash;
3435 }
3436
3437 if (SvROK(sv))
3438 ob = MUTABLE_SV(SvRV(sv));
3439 else if (!SvOK(sv)) goto undefined;
3440 else if (isGV_with_GP(sv)) {
3441 if (!GvIO(sv))
3442 Perl_croak(aTHX_ "Can't call method \"%"SVf"\" "
3443 "without a package or object reference",
3444 SVfARG(meth));
3445 ob = sv;
3446 if (SvTYPE(ob) == SVt_PVLV && LvTYPE(ob) == 'y') {
3447 assert(!LvTARGLEN(ob));
3448 ob = LvTARG(ob);
3449 assert(ob);
3450 }
3451 *(PL_stack_base + TOPMARK + 1) = sv_2mortal(newRV(ob));
3452 }
3453 else {
3454 /* this isn't a reference */
3455 GV* iogv;
3456 STRLEN packlen;
3457 const char * const packname = SvPV_nomg_const(sv, packlen);
3458 const U32 packname_utf8 = SvUTF8(sv);
3459 stash = gv_stashpvn(packname, packlen, packname_utf8 | GV_CACHE_ONLY);
3460 if (stash) return stash;
3461
3462 if (!(iogv = gv_fetchpvn_flags(
3463 packname, packlen, packname_utf8, SVt_PVIO
3464 )) ||
3465 !(ob=MUTABLE_SV(GvIO(iogv))))
3466 {
3467 /* this isn't the name of a filehandle either */
3468 if (!packlen)
3469 {
3470 Perl_croak(aTHX_ "Can't call method \"%"SVf"\" "
3471 "without a package or object reference",
3472 SVfARG(meth));
3473 }
3474 /* assume it's a package name */
3475 stash = gv_stashpvn(packname, packlen, packname_utf8);
3476 if (stash) return stash;
3477 else return MUTABLE_HV(sv);
3478 }
3479 /* it _is_ a filehandle name -- replace with a reference */
3480 *(PL_stack_base + TOPMARK + 1) = sv_2mortal(newRV(MUTABLE_SV(iogv)));
3481 }
3482
3483 /* if we got here, ob should be an object or a glob */
3484 if (!ob || !(SvOBJECT(ob)
3485 || (isGV_with_GP(ob)
3486 && (ob = MUTABLE_SV(GvIO((const GV *)ob)))
3487 && SvOBJECT(ob))))
3488 {
3489 Perl_croak(aTHX_ "Can't call method \"%"SVf"\" on unblessed reference",
3490 SVfARG((SvSCREAM(meth) && strEQ(SvPV_nolen_const(meth),"isa"))
3491 ? newSVpvs_flags("DOES", SVs_TEMP)
3492 : meth));
3493 }
3494
3495 return SvSTASH(ob);
3496}
3497
3498PP(pp_method)
3499{
3500 dSP;
3501 GV* gv;
3502 HV* stash;
3503 SV* const meth = TOPs;
3504
3505 if (SvROK(meth)) {
3506 SV* const rmeth = SvRV(meth);
3507 if (SvTYPE(rmeth) == SVt_PVCV) {
3508 SETs(rmeth);
3509 RETURN;
3510 }
3511 }
3512
3513 stash = opmethod_stash(meth);
3514
3515 gv = gv_fetchmethod_sv_flags(stash, meth, GV_AUTOLOAD|GV_CROAK);
3516 assert(gv);
3517
3518 SETs(isGV(gv) ? MUTABLE_SV(GvCV(gv)) : MUTABLE_SV(gv));
3519 RETURN;
3520}
3521
3522#define METHOD_CHECK_CACHE(stash,cache,meth) \
3523 const HE* const he = hv_fetch_ent(cache, meth, 0, 0); \
3524 if (he) { \
3525 gv = MUTABLE_GV(HeVAL(he)); \
3526 if (isGV(gv) && GvCV(gv) && (!GvCVGEN(gv) || GvCVGEN(gv) \
3527 == (PL_sub_generation + HvMROMETA(stash)->cache_gen))) \
3528 { \
3529 XPUSHs(MUTABLE_SV(GvCV(gv))); \
3530 RETURN; \
3531 } \
3532 } \
3533
3534PP(pp_method_named)
3535{
3536 dSP;
3537 GV* gv;
3538 SV* const meth = cMETHOPx_meth(PL_op);
3539 HV* const stash = opmethod_stash(meth);
3540
3541 if (LIKELY(SvTYPE(stash) == SVt_PVHV)) {
3542 METHOD_CHECK_CACHE(stash, stash, meth);
3543 }
3544
3545 gv = gv_fetchmethod_sv_flags(stash, meth, GV_AUTOLOAD|GV_CROAK);
3546 assert(gv);
3547
3548 XPUSHs(isGV(gv) ? MUTABLE_SV(GvCV(gv)) : MUTABLE_SV(gv));
3549 RETURN;
3550}
3551
3552PP(pp_method_super)
3553{
3554 dSP;
3555 GV* gv;
3556 HV* cache;
3557 SV* const meth = cMETHOPx_meth(PL_op);
3558 HV* const stash = CopSTASH(PL_curcop);
3559 /* Actually, SUPER doesn't need real object's (or class') stash at all,
3560 * as it uses CopSTASH. However, we must ensure that object(class) is
3561 * correct (this check is done by S_opmethod_stash) */
3562 opmethod_stash(meth);
3563
3564 if ((cache = HvMROMETA(stash)->super)) {
3565 METHOD_CHECK_CACHE(stash, cache, meth);
3566 }
3567
3568 gv = gv_fetchmethod_sv_flags(stash, meth, GV_AUTOLOAD|GV_CROAK|GV_SUPER);
3569 assert(gv);
3570
3571 XPUSHs(isGV(gv) ? MUTABLE_SV(GvCV(gv)) : MUTABLE_SV(gv));
3572 RETURN;
3573}
3574
3575PP(pp_method_redir)
3576{
3577 dSP;
3578 GV* gv;
3579 SV* const meth = cMETHOPx_meth(PL_op);
3580 HV* stash = gv_stashsv(cMETHOPx_rclass(PL_op), 0);
3581 opmethod_stash(meth); /* not used but needed for error checks */
3582
3583 if (stash) { METHOD_CHECK_CACHE(stash, stash, meth); }
3584 else stash = MUTABLE_HV(cMETHOPx_rclass(PL_op));
3585
3586 gv = gv_fetchmethod_sv_flags(stash, meth, GV_AUTOLOAD|GV_CROAK);
3587 assert(gv);
3588
3589 XPUSHs(isGV(gv) ? MUTABLE_SV(GvCV(gv)) : MUTABLE_SV(gv));
3590 RETURN;
3591}
3592
3593PP(pp_method_redir_super)
3594{
3595 dSP;
3596 GV* gv;
3597 HV* cache;
3598 SV* const meth = cMETHOPx_meth(PL_op);
3599 HV* stash = gv_stashsv(cMETHOPx_rclass(PL_op), 0);
3600 opmethod_stash(meth); /* not used but needed for error checks */
3601
3602 if (UNLIKELY(!stash)) stash = MUTABLE_HV(cMETHOPx_rclass(PL_op));
3603 else if ((cache = HvMROMETA(stash)->super)) {
3604 METHOD_CHECK_CACHE(stash, cache, meth);
3605 }
3606
3607 gv = gv_fetchmethod_sv_flags(stash, meth, GV_AUTOLOAD|GV_CROAK|GV_SUPER);
3608 assert(gv);
3609
3610 XPUSHs(isGV(gv) ? MUTABLE_SV(GvCV(gv)) : MUTABLE_SV(gv));
3611 RETURN;
3612}
3613
3614/*
3615 * Local variables:
3616 * c-indentation-style: bsd
3617 * c-basic-offset: 4
3618 * indent-tabs-mode: nil
3619 * End:
3620 *
3621 * ex: set ts=8 sts=4 sw=4 et:
3622 */