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