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