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