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