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