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