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