This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Suppress System V IPC for 64-bit Darwin builds
[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);
149 SvREFCNT_inc(value);
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;
165 SvREFCNT_inc(SvRV(cv));
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 */
1804 LvTARG(lv) = SvREFCNT_inc(hv);
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 }
2010 LvTARG(lv) = SvREFCNT_inc(av);
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;
1d7c1841 2017 *itersvp = SvREFCNT_inc(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;
2028 register SV *dstr;
2029 register char *s;
2030 char *strend;
2031 register char *m;
5c144d81 2032 const char *c;
a0d0e21e
LW
2033 register char *d;
2034 STRLEN clen;
2035 I32 iters = 0;
2036 I32 maxiters;
2037 register I32 i;
2038 bool once;
71be2cbc 2039 bool rxtainted;
a0d0e21e 2040 char *orig;
22e551b9 2041 I32 r_flags;
aaa362c4 2042 register REGEXP *rx = PM_GETRE(pm);
a0d0e21e
LW
2043 STRLEN len;
2044 int force_on_match = 0;
0bcc34c2 2045 const I32 oldsave = PL_savestack_ix;
792b2c16 2046 STRLEN slen;
f272994b 2047 bool doutf8 = FALSE;
f8c7b90f 2048#ifdef PERL_OLD_COPY_ON_WRITE
ed252734
NC
2049 bool is_cow;
2050#endif
a0714e2c 2051 SV *nsv = NULL;
a0d0e21e 2052
5cd24f17 2053 /* known replacement string? */
a0714e2c 2054 dstr = (pm->op_pmflags & PMf_CONST) ? POPs : NULL;
533c011a 2055 if (PL_op->op_flags & OPf_STACKED)
a0d0e21e 2056 TARG = POPs;
59f00321
RGS
2057 else if (PL_op->op_private & OPpTARGET_MY)
2058 GETTARGET;
a0d0e21e 2059 else {
54b9620d 2060 TARG = DEFSV;
a0d0e21e 2061 EXTEND(SP,1);
1c846c1f 2062 }
d9f424b2 2063
f8c7b90f 2064#ifdef PERL_OLD_COPY_ON_WRITE
ed252734
NC
2065 /* Awooga. Awooga. "bool" types that are actually char are dangerous,
2066 because they make integers such as 256 "false". */
2067 is_cow = SvIsCOW(TARG) ? TRUE : FALSE;
2068#else
765f542d
NC
2069 if (SvIsCOW(TARG))
2070 sv_force_normal_flags(TARG,0);
ed252734
NC
2071#endif
2072 if (
f8c7b90f 2073#ifdef PERL_OLD_COPY_ON_WRITE
ed252734
NC
2074 !is_cow &&
2075#endif
2076 (SvREADONLY(TARG)
4ce457a6
TP
2077 || ( (SvTYPE(TARG) == SVt_PVGV || SvTYPE(TARG) > SVt_PVLV)
2078 && !(SvTYPE(TARG) == SVt_PVGV && SvFAKE(TARG)))))
d470f89e 2079 DIE(aTHX_ PL_no_modify);
8ec5e241
NIS
2080 PUTBACK;
2081
d5263905 2082 s = SvPV_mutable(TARG, len);
68dc0745 2083 if (!SvPOKp(TARG) || SvTYPE(TARG) == SVt_PVGV)
a0d0e21e 2084 force_on_match = 1;
b3eb6a9b 2085 rxtainted = ((pm->op_pmdynflags & PMdf_TAINTED) ||
3280af22
NIS
2086 (PL_tainted && (pm->op_pmflags & PMf_RETAINT)));
2087 if (PL_tainted)
b3eb6a9b 2088 rxtainted |= 2;
9212bbba 2089 TAINT_NOT;
a12c0f56 2090
a30b2f1f 2091 RX_MATCH_UTF8_set(rx, DO_UTF8(TARG));
d9f424b2 2092
a0d0e21e
LW
2093 force_it:
2094 if (!pm || !s)
2269b42e 2095 DIE(aTHX_ "panic: pp_subst");
a0d0e21e
LW
2096
2097 strend = s + len;
a30b2f1f 2098 slen = RX_MATCH_UTF8(rx) ? utf8_length((U8*)s, (U8*)strend) : len;
792b2c16
JH
2099 maxiters = 2 * slen + 10; /* We can match twice at each
2100 position, once with zero-length,
2101 second time with non-zero. */
a0d0e21e 2102
3280af22
NIS
2103 if (!rx->prelen && PL_curpm) {
2104 pm = PL_curpm;
aaa362c4 2105 rx = PM_GETRE(pm);
a0d0e21e 2106 }
0b78c20a
JH
2107 r_flags = (rx->nparens || SvTEMP(TARG) || PL_sawampersand
2108 || (pm->op_pmflags & PMf_EVAL))
ed252734 2109 ? REXEC_COPY_STR : 0;
f722798b 2110 if (SvSCREAM(TARG))
22e551b9 2111 r_flags |= REXEC_SCREAM;
7fba1cd6 2112
a0d0e21e 2113 orig = m = s;
f722798b 2114 if (rx->reganch & RE_USE_INTUIT) {
ee0b7718 2115 PL_bostr = orig;
f722798b
IZ
2116 s = CALLREG_INTUIT_START(aTHX_ rx, TARG, s, strend, r_flags, NULL);
2117
2118 if (!s)
2119 goto nope;
2120 /* How to do it in subst? */
2121/* if ( (rx->reganch & ROPT_CHECK_ALL)
1c846c1f 2122 && !PL_sawampersand
f722798b
IZ
2123 && ((rx->reganch & ROPT_NOSCAN)
2124 || !((rx->reganch & RE_INTUIT_TAIL)
2125 && (r_flags & REXEC_SCREAM))))
2126 goto yup;
2127*/
a0d0e21e 2128 }
71be2cbc 2129
2130 /* only replace once? */
a0d0e21e 2131 once = !(rpm->op_pmflags & PMf_GLOBAL);
71be2cbc 2132
2133 /* known replacement string? */
f272994b 2134 if (dstr) {
8514a05a
JH
2135 /* replacement needing upgrading? */
2136 if (DO_UTF8(TARG) && !doutf8) {
db79b45b 2137 nsv = sv_newmortal();
4a176938 2138 SvSetSV(nsv, dstr);
8514a05a
JH
2139 if (PL_encoding)
2140 sv_recode_to_utf8(nsv, PL_encoding);
2141 else
2142 sv_utf8_upgrade(nsv);
5c144d81 2143 c = SvPV_const(nsv, clen);
4a176938
JH
2144 doutf8 = TRUE;
2145 }
2146 else {
5c144d81 2147 c = SvPV_const(dstr, clen);
4a176938 2148 doutf8 = DO_UTF8(dstr);
8514a05a 2149 }
f272994b
A
2150 }
2151 else {
6136c704 2152 c = NULL;
f272994b
A
2153 doutf8 = FALSE;
2154 }
2155
71be2cbc 2156 /* can do inplace substitution? */
ed252734 2157 if (c
f8c7b90f 2158#ifdef PERL_OLD_COPY_ON_WRITE
ed252734
NC
2159 && !is_cow
2160#endif
2161 && (I32)clen <= rx->minlen && (once || !(r_flags & REXEC_COPY_STR))
db79b45b
JH
2162 && !(rx->reganch & ROPT_LOOKBEHIND_SEEN)
2163 && (!doutf8 || SvUTF8(TARG))) {
f722798b
IZ
2164 if (!CALLREGEXEC(aTHX_ rx, s, strend, orig, 0, TARG, NULL,
2165 r_flags | REXEC_CHECKED))
2166 {
8ec5e241 2167 SPAGAIN;
3280af22 2168 PUSHs(&PL_sv_no);
71be2cbc 2169 LEAVE_SCOPE(oldsave);
2170 RETURN;
2171 }
f8c7b90f 2172#ifdef PERL_OLD_COPY_ON_WRITE
ed252734
NC
2173 if (SvIsCOW(TARG)) {
2174 assert (!force_on_match);
2175 goto have_a_cow;
2176 }
2177#endif
71be2cbc 2178 if (force_on_match) {
2179 force_on_match = 0;
2180 s = SvPV_force(TARG, len);
2181 goto force_it;
2182 }
71be2cbc 2183 d = s;
3280af22 2184 PL_curpm = pm;
71be2cbc 2185 SvSCREAM_off(TARG); /* disable possible screamer */
2186 if (once) {
48c036b1 2187 rxtainted |= RX_MATCH_TAINTED(rx);
cf93c79d
IZ
2188 m = orig + rx->startp[0];
2189 d = orig + rx->endp[0];
71be2cbc 2190 s = orig;
2191 if (m - s > strend - d) { /* faster to shorten from end */
2192 if (clen) {
2193 Copy(c, m, clen, char);
2194 m += clen;
a0d0e21e 2195 }
71be2cbc 2196 i = strend - d;
2197 if (i > 0) {
2198 Move(d, m, i, char);
2199 m += i;
a0d0e21e 2200 }
71be2cbc 2201 *m = '\0';
2202 SvCUR_set(TARG, m - s);
2203 }
155aba94 2204 else if ((i = m - s)) { /* faster from front */
71be2cbc 2205 d -= clen;
2206 m = d;
2207 sv_chop(TARG, d-i);
2208 s += i;
2209 while (i--)
2210 *--d = *--s;
2211 if (clen)
2212 Copy(c, m, clen, char);
2213 }
2214 else if (clen) {
2215 d -= clen;
2216 sv_chop(TARG, d);
2217 Copy(c, d, clen, char);
2218 }
2219 else {
2220 sv_chop(TARG, d);
2221 }
48c036b1 2222 TAINT_IF(rxtainted & 1);
8ec5e241 2223 SPAGAIN;
3280af22 2224 PUSHs(&PL_sv_yes);
71be2cbc 2225 }
2226 else {
71be2cbc 2227 do {
2228 if (iters++ > maxiters)
cea2e8a9 2229 DIE(aTHX_ "Substitution loop");
d9f97599 2230 rxtainted |= RX_MATCH_TAINTED(rx);
cf93c79d 2231 m = rx->startp[0] + orig;
155aba94 2232 if ((i = m - s)) {
71be2cbc 2233 if (s != d)
2234 Move(s, d, i, char);
2235 d += i;
a0d0e21e 2236 }
71be2cbc 2237 if (clen) {
2238 Copy(c, d, clen, char);
2239 d += clen;
2240 }
cf93c79d 2241 s = rx->endp[0] + orig;
cea2e8a9 2242 } while (CALLREGEXEC(aTHX_ rx, s, strend, orig, s == m,
f722798b
IZ
2243 TARG, NULL,
2244 /* don't match same null twice */
2245 REXEC_NOT_FIRST|REXEC_IGNOREPOS));
71be2cbc 2246 if (s != d) {
2247 i = strend - s;
aa07b2f6 2248 SvCUR_set(TARG, d - SvPVX_const(TARG) + i);
71be2cbc 2249 Move(s, d, i+1, char); /* include the NUL */
a0d0e21e 2250 }
48c036b1 2251 TAINT_IF(rxtainted & 1);
8ec5e241 2252 SPAGAIN;
71be2cbc 2253 PUSHs(sv_2mortal(newSViv((I32)iters)));
a0d0e21e 2254 }
80b498e0 2255 (void)SvPOK_only_UTF8(TARG);
48c036b1 2256 TAINT_IF(rxtainted);
8ec5e241
NIS
2257 if (SvSMAGICAL(TARG)) {
2258 PUTBACK;
2259 mg_set(TARG);
2260 SPAGAIN;
2261 }
9212bbba 2262 SvTAINT(TARG);
aefe6dfc
JH
2263 if (doutf8)
2264 SvUTF8_on(TARG);
71be2cbc 2265 LEAVE_SCOPE(oldsave);
2266 RETURN;
a0d0e21e 2267 }
71be2cbc 2268
f722798b
IZ
2269 if (CALLREGEXEC(aTHX_ rx, s, strend, orig, 0, TARG, NULL,
2270 r_flags | REXEC_CHECKED))
2271 {
a0d0e21e
LW
2272 if (force_on_match) {
2273 force_on_match = 0;
2274 s = SvPV_force(TARG, len);
2275 goto force_it;
2276 }
f8c7b90f 2277#ifdef PERL_OLD_COPY_ON_WRITE
ed252734
NC
2278 have_a_cow:
2279#endif
48c036b1 2280 rxtainted |= RX_MATCH_TAINTED(rx);
f2b990bf 2281 dstr = newSVpvn(m, s-m);
ffc61ed2
JH
2282 if (DO_UTF8(TARG))
2283 SvUTF8_on(dstr);
3280af22 2284 PL_curpm = pm;
a0d0e21e 2285 if (!c) {
c09156bb 2286 register PERL_CONTEXT *cx;
8ec5e241 2287 SPAGAIN;
454f1e26 2288 (void)ReREFCNT_inc(rx);
a0d0e21e
LW
2289 PUSHSUBST(cx);
2290 RETURNOP(cPMOP->op_pmreplroot);
2291 }
cf93c79d 2292 r_flags |= REXEC_IGNOREPOS | REXEC_NOT_FIRST;
a0d0e21e
LW
2293 do {
2294 if (iters++ > maxiters)
cea2e8a9 2295 DIE(aTHX_ "Substitution loop");
d9f97599 2296 rxtainted |= RX_MATCH_TAINTED(rx);
cf93c79d 2297 if (RX_MATCH_COPIED(rx) && rx->subbeg != orig) {
a0d0e21e
LW
2298 m = s;
2299 s = orig;
cf93c79d 2300 orig = rx->subbeg;
a0d0e21e
LW
2301 s = orig + (m - s);
2302 strend = s + (strend - m);
2303 }
cf93c79d 2304 m = rx->startp[0] + orig;
db79b45b
JH
2305 if (doutf8 && !SvUTF8(dstr))
2306 sv_catpvn_utf8_upgrade(dstr, s, m - s, nsv);
2307 else
2308 sv_catpvn(dstr, s, m-s);
cf93c79d 2309 s = rx->endp[0] + orig;
a0d0e21e
LW
2310 if (clen)
2311 sv_catpvn(dstr, c, clen);
2312 if (once)
2313 break;
ffc61ed2
JH
2314 } while (CALLREGEXEC(aTHX_ rx, s, strend, orig, s == m,
2315 TARG, NULL, r_flags));
db79b45b
JH
2316 if (doutf8 && !DO_UTF8(TARG))
2317 sv_catpvn_utf8_upgrade(dstr, s, strend - s, nsv);
89afcb60
A
2318 else
2319 sv_catpvn(dstr, s, strend - s);
748a9306 2320
f8c7b90f 2321#ifdef PERL_OLD_COPY_ON_WRITE
ed252734
NC
2322 /* The match may make the string COW. If so, brilliant, because that's
2323 just saved us one malloc, copy and free - the regexp has donated
2324 the old buffer, and we malloc an entirely new one, rather than the
2325 regexp malloc()ing a buffer and copying our original, only for
2326 us to throw it away here during the substitution. */
2327 if (SvIsCOW(TARG)) {
2328 sv_force_normal_flags(TARG, SV_COW_DROP_PV);
2329 } else
2330#endif
2331 {
8bd4d4c5 2332 SvPV_free(TARG);
ed252734 2333 }
f880fe2f 2334 SvPV_set(TARG, SvPVX(dstr));
748a9306
LW
2335 SvCUR_set(TARG, SvCUR(dstr));
2336 SvLEN_set(TARG, SvLEN(dstr));
f272994b 2337 doutf8 |= DO_UTF8(dstr);
6136c704 2338 SvPV_set(dstr, NULL);
748a9306
LW
2339 sv_free(dstr);
2340
48c036b1 2341 TAINT_IF(rxtainted & 1);
f878fbec 2342 SPAGAIN;
48c036b1
GS
2343 PUSHs(sv_2mortal(newSViv((I32)iters)));
2344
a0d0e21e 2345 (void)SvPOK_only(TARG);
f272994b 2346 if (doutf8)
60aeb6fd 2347 SvUTF8_on(TARG);
48c036b1 2348 TAINT_IF(rxtainted);
a0d0e21e 2349 SvSETMAGIC(TARG);
9212bbba 2350 SvTAINT(TARG);
4633a7c4 2351 LEAVE_SCOPE(oldsave);
a0d0e21e
LW
2352 RETURN;
2353 }
5cd24f17 2354 goto ret_no;
a0d0e21e
LW
2355
2356nope:
1c846c1f 2357ret_no:
8ec5e241 2358 SPAGAIN;
3280af22 2359 PUSHs(&PL_sv_no);
4633a7c4 2360 LEAVE_SCOPE(oldsave);
a0d0e21e
LW
2361 RETURN;
2362}
2363
2364PP(pp_grepwhile)
2365{
27da23d5 2366 dVAR; dSP;
a0d0e21e
LW
2367
2368 if (SvTRUEx(POPs))
3280af22
NIS
2369 PL_stack_base[PL_markstack_ptr[-1]++] = PL_stack_base[*PL_markstack_ptr];
2370 ++*PL_markstack_ptr;
a0d0e21e
LW
2371 LEAVE; /* exit inner scope */
2372
2373 /* All done yet? */
3280af22 2374 if (PL_stack_base + *PL_markstack_ptr > SP) {
a0d0e21e 2375 I32 items;
c4420975 2376 const I32 gimme = GIMME_V;
a0d0e21e
LW
2377
2378 LEAVE; /* exit outer scope */
2379 (void)POPMARK; /* pop src */
3280af22 2380 items = --*PL_markstack_ptr - PL_markstack_ptr[-1];
a0d0e21e 2381 (void)POPMARK; /* pop dst */
3280af22 2382 SP = PL_stack_base + POPMARK; /* pop original mark */
54310121 2383 if (gimme == G_SCALAR) {
7cc47870 2384 if (PL_op->op_private & OPpGREP_LEX) {
c4420975 2385 SV* const sv = sv_newmortal();
7cc47870
RGS
2386 sv_setiv(sv, items);
2387 PUSHs(sv);
2388 }
2389 else {
2390 dTARGET;
2391 XPUSHi(items);
2392 }
a0d0e21e 2393 }
54310121 2394 else if (gimme == G_ARRAY)
2395 SP += items;
a0d0e21e
LW
2396 RETURN;
2397 }
2398 else {
2399 SV *src;
2400
2401 ENTER; /* enter inner scope */
1d7c1841 2402 SAVEVPTR(PL_curpm);
a0d0e21e 2403
3280af22 2404 src = PL_stack_base[*PL_markstack_ptr];
a0d0e21e 2405 SvTEMP_off(src);
59f00321
RGS
2406 if (PL_op->op_private & OPpGREP_LEX)
2407 PAD_SVl(PL_op->op_targ) = src;
2408 else
2409 DEFSV = src;
a0d0e21e
LW
2410
2411 RETURNOP(cLOGOP->op_other);
2412 }
2413}
2414
2415PP(pp_leavesub)
2416{
27da23d5 2417 dVAR; dSP;
a0d0e21e
LW
2418 SV **mark;
2419 SV **newsp;
2420 PMOP *newpm;
2421 I32 gimme;
c09156bb 2422 register PERL_CONTEXT *cx;
b0d9ce38 2423 SV *sv;
a0d0e21e 2424
9850bf21
RH
2425 if (CxMULTICALL(&cxstack[cxstack_ix]))
2426 return 0;
2427
a0d0e21e 2428 POPBLOCK(cx,newpm);
5dd42e15 2429 cxstack_ix++; /* temporarily protect top context */
1c846c1f 2430
a1f49e72 2431 TAINT_NOT;
a0d0e21e
LW
2432 if (gimme == G_SCALAR) {
2433 MARK = newsp + 1;
a29cdaf0 2434 if (MARK <= SP) {
a8bba7fa 2435 if (cx->blk_sub.cv && CvDEPTH(cx->blk_sub.cv) > 1) {
a29cdaf0
IZ
2436 if (SvTEMP(TOPs)) {
2437 *MARK = SvREFCNT_inc(TOPs);
2438 FREETMPS;
2439 sv_2mortal(*MARK);
cd06dffe
GS
2440 }
2441 else {
959e3673 2442 sv = SvREFCNT_inc(TOPs); /* FREETMPS could clobber it */
a29cdaf0 2443 FREETMPS;
959e3673
GS
2444 *MARK = sv_mortalcopy(sv);
2445 SvREFCNT_dec(sv);
a29cdaf0 2446 }
cd06dffe
GS
2447 }
2448 else
a29cdaf0 2449 *MARK = SvTEMP(TOPs) ? TOPs : sv_mortalcopy(TOPs);
cd06dffe
GS
2450 }
2451 else {
f86702cc 2452 MEXTEND(MARK, 0);
3280af22 2453 *MARK = &PL_sv_undef;
a0d0e21e
LW
2454 }
2455 SP = MARK;
2456 }
54310121 2457 else if (gimme == G_ARRAY) {
f86702cc 2458 for (MARK = newsp + 1; MARK <= SP; MARK++) {
a1f49e72 2459 if (!SvTEMP(*MARK)) {
f86702cc 2460 *MARK = sv_mortalcopy(*MARK);
a1f49e72
CS
2461 TAINT_NOT; /* Each item is independent */
2462 }
f86702cc 2463 }
a0d0e21e 2464 }
f86702cc 2465 PUTBACK;
1c846c1f 2466
5dd42e15
DM
2467 LEAVE;
2468 cxstack_ix--;
b0d9ce38 2469 POPSUB(cx,sv); /* Stack values are safe: release CV and @_ ... */
3280af22 2470 PL_curpm = newpm; /* ... and pop $1 et al */
a0d0e21e 2471
b0d9ce38 2472 LEAVESUB(sv);
f39bc417 2473 return cx->blk_sub.retop;
a0d0e21e
LW
2474}
2475
cd06dffe
GS
2476/* This duplicates the above code because the above code must not
2477 * get any slower by more conditions */
2478PP(pp_leavesublv)
2479{
27da23d5 2480 dVAR; dSP;
cd06dffe
GS
2481 SV **mark;
2482 SV **newsp;
2483 PMOP *newpm;
2484 I32 gimme;
2485 register PERL_CONTEXT *cx;
b0d9ce38 2486 SV *sv;
cd06dffe 2487
9850bf21
RH
2488 if (CxMULTICALL(&cxstack[cxstack_ix]))
2489 return 0;
2490
cd06dffe 2491 POPBLOCK(cx,newpm);
5dd42e15 2492 cxstack_ix++; /* temporarily protect top context */
1c846c1f 2493
cd06dffe
GS
2494 TAINT_NOT;
2495
2496 if (cx->blk_sub.lval & OPpENTERSUB_INARGS) {
2497 /* We are an argument to a function or grep().
2498 * This kind of lvalueness was legal before lvalue
2499 * subroutines too, so be backward compatible:
2500 * cannot report errors. */
2501
2502 /* Scalar context *is* possible, on the LHS of -> only,
2503 * as in f()->meth(). But this is not an lvalue. */
2504 if (gimme == G_SCALAR)
2505 goto temporise;
2506 if (gimme == G_ARRAY) {
a8bba7fa 2507 if (!CvLVALUE(cx->blk_sub.cv))
cd06dffe
GS
2508 goto temporise_array;
2509 EXTEND_MORTAL(SP - newsp);
2510 for (mark = newsp + 1; mark <= SP; mark++) {
2511 if (SvTEMP(*mark))
bb263b4e 2512 /*EMPTY*/;
cd06dffe
GS
2513 else if (SvFLAGS(*mark) & (SVs_PADTMP | SVf_READONLY))
2514 *mark = sv_mortalcopy(*mark);
2515 else {
2516 /* Can be a localized value subject to deletion. */
2517 PL_tmps_stack[++PL_tmps_ix] = *mark;
e1f15930 2518 (void)SvREFCNT_inc(*mark);
cd06dffe
GS
2519 }
2520 }
2521 }
2522 }
2523 else if (cx->blk_sub.lval) { /* Leave it as it is if we can. */
2524 /* Here we go for robustness, not for speed, so we change all
2525 * the refcounts so the caller gets a live guy. Cannot set
2526 * TEMP, so sv_2mortal is out of question. */
a8bba7fa 2527 if (!CvLVALUE(cx->blk_sub.cv)) {
5dd42e15
DM
2528 LEAVE;
2529 cxstack_ix--;
b0d9ce38 2530 POPSUB(cx,sv);
d470f89e 2531 PL_curpm = newpm;
b0d9ce38 2532 LEAVESUB(sv);
d470f89e
GS
2533 DIE(aTHX_ "Can't modify non-lvalue subroutine call");
2534 }
cd06dffe
GS
2535 if (gimme == G_SCALAR) {
2536 MARK = newsp + 1;
2537 EXTEND_MORTAL(1);
2538 if (MARK == SP) {
f9bc45ef
TP
2539 /* Temporaries are bad unless they happen to be elements
2540 * of a tied hash or array */
2541 if (SvFLAGS(TOPs) & (SVs_TEMP | SVs_PADTMP | SVf_READONLY) &&
2542 !(SvRMAGICAL(TOPs) && mg_find(TOPs, PERL_MAGIC_tiedelem))) {
5dd42e15
DM
2543 LEAVE;
2544 cxstack_ix--;
b0d9ce38 2545 POPSUB(cx,sv);
d470f89e 2546 PL_curpm = newpm;
b0d9ce38 2547 LEAVESUB(sv);
e9f19e3c
HS
2548 DIE(aTHX_ "Can't return %s from lvalue subroutine",
2549 SvREADONLY(TOPs) ? (TOPs == &PL_sv_undef) ? "undef"
2550 : "a readonly value" : "a temporary");
d470f89e 2551 }
cd06dffe
GS
2552 else { /* Can be a localized value
2553 * subject to deletion. */
2554 PL_tmps_stack[++PL_tmps_ix] = *mark;
e1f15930 2555 (void)SvREFCNT_inc(*mark);
cd06dffe
GS
2556 }
2557 }
d470f89e 2558 else { /* Should not happen? */
5dd42e15
DM
2559 LEAVE;
2560 cxstack_ix--;
b0d9ce38 2561 POPSUB(cx,sv);
d470f89e 2562 PL_curpm = newpm;
b0d9ce38 2563 LEAVESUB(sv);
d470f89e 2564 DIE(aTHX_ "%s returned from lvalue subroutine in scalar context",
cd06dffe 2565 (MARK > SP ? "Empty array" : "Array"));
d470f89e 2566 }
cd06dffe
GS
2567 SP = MARK;
2568 }
2569 else if (gimme == G_ARRAY) {
2570 EXTEND_MORTAL(SP - newsp);
2571 for (mark = newsp + 1; mark <= SP; mark++) {
f206cdda
AMS
2572 if (*mark != &PL_sv_undef
2573 && SvFLAGS(*mark) & (SVs_TEMP | SVs_PADTMP | SVf_READONLY)) {
d470f89e
GS
2574 /* Might be flattened array after $#array = */
2575 PUTBACK;
5dd42e15
DM
2576 LEAVE;
2577 cxstack_ix--;
b0d9ce38 2578 POPSUB(cx,sv);
d470f89e 2579 PL_curpm = newpm;
b0d9ce38 2580 LEAVESUB(sv);
f206cdda
AMS
2581 DIE(aTHX_ "Can't return a %s from lvalue subroutine",
2582 SvREADONLY(TOPs) ? "readonly value" : "temporary");
d470f89e 2583 }
cd06dffe 2584 else {
cd06dffe
GS
2585 /* Can be a localized value subject to deletion. */
2586 PL_tmps_stack[++PL_tmps_ix] = *mark;
e1f15930 2587 (void)SvREFCNT_inc(*mark);
cd06dffe
GS
2588 }
2589 }
2590 }
2591 }
2592 else {
2593 if (gimme == G_SCALAR) {
2594 temporise:
2595 MARK = newsp + 1;
2596 if (MARK <= SP) {
a8bba7fa 2597 if (cx->blk_sub.cv && CvDEPTH(cx->blk_sub.cv) > 1) {
cd06dffe
GS
2598 if (SvTEMP(TOPs)) {
2599 *MARK = SvREFCNT_inc(TOPs);
2600 FREETMPS;
2601 sv_2mortal(*MARK);
2602 }
2603 else {
959e3673 2604 sv = SvREFCNT_inc(TOPs); /* FREETMPS could clobber it */
cd06dffe 2605 FREETMPS;
959e3673
GS
2606 *MARK = sv_mortalcopy(sv);
2607 SvREFCNT_dec(sv);
cd06dffe
GS
2608 }
2609 }
2610 else
2611 *MARK = SvTEMP(TOPs) ? TOPs : sv_mortalcopy(TOPs);
2612 }
2613 else {
2614 MEXTEND(MARK, 0);
2615 *MARK = &PL_sv_undef;
2616 }
2617 SP = MARK;
2618 }
2619 else if (gimme == G_ARRAY) {
2620 temporise_array:
2621 for (MARK = newsp + 1; MARK <= SP; MARK++) {
2622 if (!SvTEMP(*MARK)) {
2623 *MARK = sv_mortalcopy(*MARK);
2624 TAINT_NOT; /* Each item is independent */
2625 }
2626 }
2627 }
2628 }
2629 PUTBACK;
1c846c1f 2630
5dd42e15
DM
2631 LEAVE;
2632 cxstack_ix--;
b0d9ce38 2633 POPSUB(cx,sv); /* Stack values are safe: release CV and @_ ... */
cd06dffe
GS
2634 PL_curpm = newpm; /* ... and pop $1 et al */
2635
b0d9ce38 2636 LEAVESUB(sv);
f39bc417 2637 return cx->blk_sub.retop;
cd06dffe
GS
2638}
2639
2640
76e3520e 2641STATIC CV *
cea2e8a9 2642S_get_db_sub(pTHX_ SV **svp, CV *cv)
3de9ffa1 2643{
97aff369 2644 dVAR;
0bcc34c2 2645 SV * const dbsv = GvSVn(PL_DBsub);
491527d0 2646
f398eb67 2647 save_item(dbsv);
491527d0
GS
2648 if (!PERLDB_SUB_NN) {
2649 GV *gv = CvGV(cv);
2650
491527d0 2651 if ( (CvFLAGS(cv) & (CVf_ANON | CVf_CLONED))
1c846c1f 2652 || strEQ(GvNAME(gv), "END")
491527d0
GS
2653 || ((GvCV(gv) != cv) && /* Could be imported, and old sub redefined. */
2654 !( (SvTYPE(*svp) == SVt_PVGV) && (GvCV((GV*)*svp) == cv)
2655 && (gv = (GV*)*svp) ))) {
2656 /* Use GV from the stack as a fallback. */
2657 /* GV is potentially non-unique, or contain different CV. */
823a54a3 2658 SV * const tmp = newRV((SV*)cv);
c2e66d9e
GS
2659 sv_setsv(dbsv, tmp);
2660 SvREFCNT_dec(tmp);
491527d0
GS
2661 }
2662 else {
6136c704 2663 gv_efullname3(dbsv, gv, NULL);
491527d0 2664 }
3de9ffa1
MB
2665 }
2666 else {
a9c4fd4e 2667 const int type = SvTYPE(dbsv);
f398eb67
NC
2668 if (type < SVt_PVIV && type != SVt_IV)
2669 sv_upgrade(dbsv, SVt_PVIV);
155aba94 2670 (void)SvIOK_on(dbsv);
45977657 2671 SvIV_set(dbsv, PTR2IV(cv)); /* Do it the quickest way */
3de9ffa1 2672 }
491527d0 2673
aed2304a 2674 if (CvISXSUB(cv))
3280af22
NIS
2675 PL_curcopdb = PL_curcop;
2676 cv = GvCV(PL_DBsub);
3de9ffa1
MB
2677 return cv;
2678}
2679
a0d0e21e
LW
2680PP(pp_entersub)
2681{
27da23d5 2682 dVAR; dSP; dPOPss;
a0d0e21e 2683 GV *gv;
a0d0e21e 2684 register CV *cv;
c09156bb 2685 register PERL_CONTEXT *cx;
5d94fbed 2686 I32 gimme;
a9c4fd4e 2687 const bool hasargs = (PL_op->op_flags & OPf_STACKED) != 0;
a0d0e21e
LW
2688
2689 if (!sv)
cea2e8a9 2690 DIE(aTHX_ "Not a CODE reference");
a0d0e21e 2691 switch (SvTYPE(sv)) {
f1025168
NC
2692 /* This is overwhelming the most common case: */
2693 case SVt_PVGV:
f730a42d
NC
2694 if (!(cv = GvCVu((GV*)sv))) {
2695 HV *stash;
f2c0649b 2696 cv = sv_2cv(sv, &stash, &gv, 0);
f730a42d 2697 }
f1025168
NC
2698 if (!cv) {
2699 ENTER;
2700 SAVETMPS;
2701 goto try_autoload;
2702 }
2703 break;
a0d0e21e
LW
2704 default:
2705 if (!SvROK(sv)) {
a9c4fd4e 2706 const char *sym;
3280af22 2707 if (sv == &PL_sv_yes) { /* unfound import, ignore */
fb73857a 2708 if (hasargs)
3280af22 2709 SP = PL_stack_base + POPMARK;
a0d0e21e 2710 RETURN;
fb73857a 2711 }
15ff848f
CS
2712 if (SvGMAGICAL(sv)) {
2713 mg_get(sv);
f5f1d18e
AMS
2714 if (SvROK(sv))
2715 goto got_rv;
6136c704 2716 sym = SvPOKp(sv) ? SvPVX_const(sv) : NULL;
15ff848f 2717 }
a9c4fd4e 2718 else {
8b6b16e7 2719 sym = SvPV_nolen_const(sv);
a9c4fd4e 2720 }
15ff848f 2721 if (!sym)
cea2e8a9 2722 DIE(aTHX_ PL_no_usym, "a subroutine");
533c011a 2723 if (PL_op->op_private & HINT_STRICT_REFS)
cea2e8a9 2724 DIE(aTHX_ PL_no_symref, sym, "a subroutine");
864dbfa3 2725 cv = get_cv(sym, TRUE);
a0d0e21e
LW
2726 break;
2727 }
f5f1d18e 2728 got_rv:
f5284f61 2729 {
823a54a3 2730 SV * const * sp = &sv; /* Used in tryAMAGICunDEREF macro. */
f5284f61
IZ
2731 tryAMAGICunDEREF(to_cv);
2732 }
a0d0e21e
LW
2733 cv = (CV*)SvRV(sv);
2734 if (SvTYPE(cv) == SVt_PVCV)
2735 break;
2736 /* FALL THROUGH */
2737 case SVt_PVHV:
2738 case SVt_PVAV:
cea2e8a9 2739 DIE(aTHX_ "Not a CODE reference");
f1025168 2740 /* This is the second most common case: */
a0d0e21e
LW
2741 case SVt_PVCV:
2742 cv = (CV*)sv;
2743 break;
a0d0e21e
LW
2744 }
2745
2746 ENTER;
2747 SAVETMPS;
2748
2749 retry:
a0d0e21e 2750 if (!CvROOT(cv) && !CvXSUB(cv)) {
2f349aa0
NC
2751 GV* autogv;
2752 SV* sub_name;
2753
2754 /* anonymous or undef'd function leaves us no recourse */
2755 if (CvANON(cv) || !(gv = CvGV(cv)))
2756 DIE(aTHX_ "Undefined subroutine called");
2757
2758 /* autoloaded stub? */
2759 if (cv != GvCV(gv)) {
2760 cv = GvCV(gv);
2761 }
2762 /* should call AUTOLOAD now? */
2763 else {
2764try_autoload:
2765 if ((autogv = gv_autoload4(GvSTASH(gv), GvNAME(gv), GvNAMELEN(gv),
2766 FALSE)))
2767 {
2768 cv = GvCV(autogv);
2769 }
2770 /* sorry */
2771 else {
2772 sub_name = sv_newmortal();
6136c704 2773 gv_efullname3(sub_name, gv, NULL);
2f349aa0
NC
2774 DIE(aTHX_ "Undefined subroutine &%"SVf" called", sub_name);
2775 }
2776 }
2777 if (!cv)
2778 DIE(aTHX_ "Not a CODE reference");
2779 goto retry;
a0d0e21e
LW
2780 }
2781
54310121 2782 gimme = GIMME_V;
67caa1fe 2783 if ((PL_op->op_private & OPpENTERSUB_DB) && GvCV(PL_DBsub) && !CvNODEBUG(cv)) {
06492da6
SF
2784 if (CvASSERTION(cv) && PL_DBassertion)
2785 sv_setiv(PL_DBassertion, 1);
2786
4f01c5a5 2787 cv = get_db_sub(&sv, cv);
ccafdc96
RGS
2788 if (!cv || (!CvXSUB(cv) && !CvSTART(cv)))
2789 DIE(aTHX_ "No DB::sub routine defined");
67caa1fe 2790 }
a0d0e21e 2791
aed2304a 2792 if (!(CvISXSUB(cv))) {
f1025168 2793 /* This path taken at least 75% of the time */
a0d0e21e
LW
2794 dMARK;
2795 register I32 items = SP - MARK;
0bcc34c2 2796 AV* const padlist = CvPADLIST(cv);
a0d0e21e
LW
2797 PUSHBLOCK(cx, CXt_SUB, MARK);
2798 PUSHSUB(cx);
f39bc417 2799 cx->blk_sub.retop = PL_op->op_next;
a0d0e21e 2800 CvDEPTH(cv)++;
6b35e009
GS
2801 /* XXX This would be a natural place to set C<PL_compcv = cv> so
2802 * that eval'' ops within this sub know the correct lexical space.
a3985cdc
DM
2803 * Owing the speed considerations, we choose instead to search for
2804 * the cv using find_runcv() when calling doeval().
6b35e009 2805 */
b36bdeca 2806 if (CvDEPTH(cv) >= 2) {
1d7c1841 2807 PERL_STACK_OVERFLOW_CHECK();
26019298 2808 pad_push(padlist, CvDEPTH(cv));
a0d0e21e 2809 }
9320a037
DM
2810 SAVECOMPPAD();
2811 PAD_SET_CUR_NOSAVE(padlist, CvDEPTH(cv));
6d4ff0d2 2812 if (hasargs)
6d4ff0d2 2813 {
0bcc34c2 2814 AV* const av = (AV*)PAD_SVl(0);
221373f0
GS
2815 if (AvREAL(av)) {
2816 /* @_ is normally not REAL--this should only ever
2817 * happen when DB::sub() calls things that modify @_ */
2818 av_clear(av);
2819 AvREAL_off(av);
2820 AvREIFY_on(av);
2821 }
3280af22
NIS
2822 cx->blk_sub.savearray = GvAV(PL_defgv);
2823 GvAV(PL_defgv) = (AV*)SvREFCNT_inc(av);
dd2155a4 2824 CX_CURPAD_SAVE(cx->blk_sub);
6d4ff0d2 2825 cx->blk_sub.argarray = av;
a0d0e21e
LW
2826 ++MARK;
2827
2828 if (items > AvMAX(av) + 1) {
504618e9 2829 SV **ary = AvALLOC(av);
a0d0e21e
LW
2830 if (AvARRAY(av) != ary) {
2831 AvMAX(av) += AvARRAY(av) - AvALLOC(av);
f880fe2f 2832 SvPV_set(av, (char*)ary);
a0d0e21e
LW
2833 }
2834 if (items > AvMAX(av) + 1) {
2835 AvMAX(av) = items - 1;
2836 Renew(ary,items,SV*);
2837 AvALLOC(av) = ary;
f880fe2f 2838 SvPV_set(av, (char*)ary);
a0d0e21e
LW
2839 }
2840 }
2841 Copy(MARK,AvARRAY(av),items,SV*);
93965878 2842 AvFILLp(av) = items - 1;
1c846c1f 2843
a0d0e21e
LW
2844 while (items--) {
2845 if (*MARK)
2846 SvTEMP_off(*MARK);
2847 MARK++;
2848 }
2849 }
4a925ff6
GS
2850 /* warning must come *after* we fully set up the context
2851 * stuff so that __WARN__ handlers can safely dounwind()
2852 * if they want to
2853 */
2854 if (CvDEPTH(cv) == 100 && ckWARN(WARN_RECURSION)
2855 && !(PERLDB_SUB && cv == GvCV(PL_DBsub)))
2856 sub_crush_depth(cv);
77a005ab 2857#if 0
bf49b057 2858 DEBUG_S(PerlIO_printf(Perl_debug_log,
0f15f207 2859 "%p entersub returning %p\n", thr, CvSTART(cv)));
77a005ab 2860#endif
a0d0e21e
LW
2861 RETURNOP(CvSTART(cv));
2862 }
f1025168 2863 else {
f1025168
NC
2864 I32 markix = TOPMARK;
2865
2866 PUTBACK;
2867
2868 if (!hasargs) {
2869 /* Need to copy @_ to stack. Alternative may be to
2870 * switch stack to @_, and copy return values
2871 * back. This would allow popping @_ in XSUB, e.g.. XXXX */
a3b680e6
AL
2872 AV * const av = GvAV(PL_defgv);
2873 const I32 items = AvFILLp(av) + 1; /* @_ is not tieable */
f1025168
NC
2874
2875 if (items) {
2876 /* Mark is at the end of the stack. */
2877 EXTEND(SP, items);
2878 Copy(AvARRAY(av), SP + 1, items, SV*);
2879 SP += items;
2880 PUTBACK ;
2881 }
2882 }
2883 /* We assume first XSUB in &DB::sub is the called one. */
2884 if (PL_curcopdb) {
2885 SAVEVPTR(PL_curcop);
2886 PL_curcop = PL_curcopdb;
2887 PL_curcopdb = NULL;
2888 }
2889 /* Do we need to open block here? XXXX */
2890 (void)(*CvXSUB(cv))(aTHX_ cv);
2891
2892 /* Enforce some sanity in scalar context. */
2893 if (gimme == G_SCALAR && ++markix != PL_stack_sp - PL_stack_base ) {
2894 if (markix > PL_stack_sp - PL_stack_base)
2895 *(PL_stack_base + markix) = &PL_sv_undef;
2896 else
2897 *(PL_stack_base + markix) = *PL_stack_sp;
2898 PL_stack_sp = PL_stack_base + markix;
2899 }
f1025168
NC
2900 LEAVE;
2901 return NORMAL;
2902 }
a0d0e21e
LW
2903}
2904
44a8e56a 2905void
864dbfa3 2906Perl_sub_crush_depth(pTHX_ CV *cv)
44a8e56a 2907{
2908 if (CvANON(cv))
9014280d 2909 Perl_warner(aTHX_ packWARN(WARN_RECURSION), "Deep recursion on anonymous subroutine");
44a8e56a 2910 else {
aec46f14 2911 SV* const tmpstr = sv_newmortal();
6136c704 2912 gv_efullname3(tmpstr, CvGV(cv), NULL);
35c1215d
NC
2913 Perl_warner(aTHX_ packWARN(WARN_RECURSION), "Deep recursion on subroutine \"%"SVf"\"",
2914 tmpstr);
44a8e56a 2915 }
2916}
2917
a0d0e21e
LW
2918PP(pp_aelem)
2919{
97aff369 2920 dVAR; dSP;
a0d0e21e 2921 SV** svp;
a3b680e6 2922 SV* const elemsv = POPs;
d804643f 2923 IV elem = SvIV(elemsv);
0bcc34c2 2924 AV* const av = (AV*)POPs;
e1ec3a88
AL
2925 const U32 lval = PL_op->op_flags & OPf_MOD || LVRET;
2926 const U32 defer = (PL_op->op_private & OPpLVAL_DEFER) && (elem > av_len(av));
be6c24e0 2927 SV *sv;
a0d0e21e 2928
e35c1634 2929 if (SvROK(elemsv) && !SvGAMAGIC(elemsv) && ckWARN(WARN_MISC))
35c1215d 2930 Perl_warner(aTHX_ packWARN(WARN_MISC), "Use of reference \"%"SVf"\" as array index", elemsv);
748a9306 2931 if (elem > 0)
3280af22 2932 elem -= PL_curcop->cop_arybase;
a0d0e21e
LW
2933 if (SvTYPE(av) != SVt_PVAV)
2934 RETPUSHUNDEF;
68dc0745 2935 svp = av_fetch(av, elem, lval && !defer);
a0d0e21e 2936 if (lval) {
2b573ace 2937#ifdef PERL_MALLOC_WRAP
2b573ace 2938 if (SvUOK(elemsv)) {
a9c4fd4e 2939 const UV uv = SvUV(elemsv);
2b573ace
JH
2940 elem = uv > IV_MAX ? IV_MAX : uv;
2941 }
2942 else if (SvNOK(elemsv))
2943 elem = (IV)SvNV(elemsv);
a3b680e6
AL
2944 if (elem > 0) {
2945 static const char oom_array_extend[] =
2946 "Out of memory during array extend"; /* Duplicated in av.c */
2b573ace 2947 MEM_WRAP_CHECK_1(elem,SV*,oom_array_extend);
a3b680e6 2948 }
2b573ace 2949#endif
3280af22 2950 if (!svp || *svp == &PL_sv_undef) {
68dc0745 2951 SV* lv;
2952 if (!defer)
cea2e8a9 2953 DIE(aTHX_ PL_no_aelem, elem);
68dc0745 2954 lv = sv_newmortal();
2955 sv_upgrade(lv, SVt_PVLV);
2956 LvTYPE(lv) = 'y';
a0714e2c 2957 sv_magic(lv, NULL, PERL_MAGIC_defelem, NULL, 0);
68dc0745 2958 LvTARG(lv) = SvREFCNT_inc(av);
2959 LvTARGOFF(lv) = elem;
2960 LvTARGLEN(lv) = 1;
2961 PUSHs(lv);
2962 RETURN;
2963 }
bfc4de9f 2964 if (PL_op->op_private & OPpLVAL_INTRO)
161b7d16 2965 save_aelem(av, elem, svp);
533c011a
NIS
2966 else if (PL_op->op_private & OPpDEREF)
2967 vivify_ref(*svp, PL_op->op_private & OPpDEREF);
a0d0e21e 2968 }
3280af22 2969 sv = (svp ? *svp : &PL_sv_undef);
be6c24e0
GS
2970 if (!lval && SvGMAGICAL(sv)) /* see note in pp_helem() */
2971 sv = sv_mortalcopy(sv);
2972 PUSHs(sv);
a0d0e21e
LW
2973 RETURN;
2974}
2975
02a9e968 2976void
864dbfa3 2977Perl_vivify_ref(pTHX_ SV *sv, U32 to_what)
02a9e968 2978{
5b295bef 2979 SvGETMAGIC(sv);
02a9e968
CS
2980 if (!SvOK(sv)) {
2981 if (SvREADONLY(sv))
cea2e8a9 2982 Perl_croak(aTHX_ PL_no_modify);
5f05dabc 2983 if (SvTYPE(sv) < SVt_RV)
2984 sv_upgrade(sv, SVt_RV);
2985 else if (SvTYPE(sv) >= SVt_PV) {
8bd4d4c5 2986 SvPV_free(sv);
b162af07
SP
2987 SvLEN_set(sv, 0);
2988 SvCUR_set(sv, 0);
5f05dabc 2989 }
68dc0745 2990 switch (to_what) {
5f05dabc 2991 case OPpDEREF_SV:
561b68a9 2992 SvRV_set(sv, newSV(0));
5f05dabc 2993 break;
2994 case OPpDEREF_AV:
b162af07 2995 SvRV_set(sv, (SV*)newAV());
5f05dabc 2996 break;
2997 case OPpDEREF_HV:
b162af07 2998 SvRV_set(sv, (SV*)newHV());
5f05dabc 2999 break;
3000 }
02a9e968
CS
3001 SvROK_on(sv);
3002 SvSETMAGIC(sv);
3003 }
3004}
3005
a0d0e21e
LW
3006PP(pp_method)
3007{
97aff369 3008 dVAR; dSP;
890ce7af 3009 SV* const sv = TOPs;
f5d5a27c
CS
3010
3011 if (SvROK(sv)) {
890ce7af 3012 SV* const rsv = SvRV(sv);
f5d5a27c
CS
3013 if (SvTYPE(rsv) == SVt_PVCV) {
3014 SETs(rsv);
3015 RETURN;
3016 }
3017 }
3018
4608196e 3019 SETs(method_common(sv, NULL));
f5d5a27c
CS
3020 RETURN;
3021}
3022
3023PP(pp_method_named)
3024{
97aff369 3025 dVAR; dSP;
890ce7af 3026 SV* const sv = cSVOP_sv;
c158a4fd 3027 U32 hash = SvSHARED_HASH(sv);
f5d5a27c
CS
3028
3029 XPUSHs(method_common(sv, &hash));
3030 RETURN;
3031}
3032
3033STATIC SV *
3034S_method_common(pTHX_ SV* meth, U32* hashp)
3035{
97aff369 3036 dVAR;
a0d0e21e
LW
3037 SV* ob;
3038 GV* gv;
56304f61 3039 HV* stash;
f5d5a27c 3040 STRLEN namelen;
6136c704 3041 const char* packname = NULL;
a0714e2c 3042 SV *packsv = NULL;
ac91690f 3043 STRLEN packlen;
46c461b5
AL
3044 const char * const name = SvPV_const(meth, namelen);
3045 SV * const sv = *(PL_stack_base + TOPMARK + 1);
f5d5a27c 3046
4f1b7578
SC
3047 if (!sv)
3048 Perl_croak(aTHX_ "Can't call method \"%s\" on an undefined value", name);
3049
5b295bef 3050 SvGETMAGIC(sv);
a0d0e21e 3051 if (SvROK(sv))
16d20bd9 3052 ob = (SV*)SvRV(sv);
a0d0e21e
LW
3053 else {
3054 GV* iogv;
a0d0e21e 3055
af09ea45 3056 /* this isn't a reference */
5c144d81 3057 if(SvOK(sv) && (packname = SvPV_const(sv, packlen))) {
b464bac0 3058 const HE* const he = hv_fetch_ent(PL_stashcache, sv, 0, 0);
081fc587 3059 if (he) {
5e6396ae 3060 stash = INT2PTR(HV*,SvIV(HeVAL(he)));
081fc587
AB
3061 goto fetch;
3062 }
3063 }
3064
a0d0e21e 3065 if (!SvOK(sv) ||
05f5af9a 3066 !(packname) ||
f776e3cd 3067 !(iogv = gv_fetchsv(sv, 0, SVt_PVIO)) ||
a0d0e21e
LW
3068 !(ob=(SV*)GvIO(iogv)))
3069 {
af09ea45 3070 /* this isn't the name of a filehandle either */
1c846c1f 3071 if (!packname ||
fd400ab9 3072 ((UTF8_IS_START(*packname) && DO_UTF8(sv))
b86a2fa7 3073 ? !isIDFIRST_utf8((U8*)packname)
834a4ddd
LW
3074 : !isIDFIRST(*packname)
3075 ))
3076 {
f5d5a27c
CS
3077 Perl_croak(aTHX_ "Can't call method \"%s\" %s", name,
3078 SvOK(sv) ? "without a package or object reference"
3079 : "on an undefined value");
834a4ddd 3080 }
af09ea45
IK
3081 /* assume it's a package name */
3082 stash = gv_stashpvn(packname, packlen, FALSE);
0dae17bd
GS
3083 if (!stash)
3084 packsv = sv;
081fc587 3085 else {
5e6396ae 3086 SV* ref = newSViv(PTR2IV(stash));
7e8961ec
AB
3087 hv_store(PL_stashcache, packname, packlen, ref, 0);
3088 }
ac91690f 3089 goto fetch;
a0d0e21e 3090 }
af09ea45 3091 /* it _is_ a filehandle name -- replace with a reference */
3280af22 3092 *(PL_stack_base + TOPMARK + 1) = sv_2mortal(newRV((SV*)iogv));
a0d0e21e
LW
3093 }
3094
af09ea45 3095 /* if we got here, ob should be a reference or a glob */
f0d43078
GS
3096 if (!ob || !(SvOBJECT(ob)
3097 || (SvTYPE(ob) == SVt_PVGV && (ob = (SV*)GvIO((GV*)ob))
3098 && SvOBJECT(ob))))
3099 {
f5d5a27c
CS
3100 Perl_croak(aTHX_ "Can't call method \"%s\" on unblessed reference",
3101 name);
f0d43078 3102 }
a0d0e21e 3103
56304f61 3104 stash = SvSTASH(ob);
a0d0e21e 3105
ac91690f 3106 fetch:
af09ea45
IK
3107 /* NOTE: stash may be null, hope hv_fetch_ent and
3108 gv_fetchmethod can cope (it seems they can) */
3109
f5d5a27c
CS
3110 /* shortcut for simple names */
3111 if (hashp) {
b464bac0 3112 const HE* const he = hv_fetch_ent(stash, meth, 0, *hashp);
f5d5a27c
CS
3113 if (he) {
3114 gv = (GV*)HeVAL(he);
3115 if (isGV(gv) && GvCV(gv) &&
3116 (!GvCVGEN(gv) || GvCVGEN(gv) == PL_sub_generation))
3117 return (SV*)GvCV(gv);
3118 }
3119 }
3120
0dae17bd 3121 gv = gv_fetchmethod(stash ? stash : (HV*)packsv, name);
af09ea45 3122
56304f61 3123 if (!gv) {
af09ea45
IK
3124 /* This code tries to figure out just what went wrong with
3125 gv_fetchmethod. It therefore needs to duplicate a lot of
3126 the internals of that function. We can't move it inside
3127 Perl_gv_fetchmethod_autoload(), however, since that would
3128 cause UNIVERSAL->can("NoSuchPackage::foo") to croak, and we
3129 don't want that.
3130 */
a9c4fd4e 3131 const char* leaf = name;
6136c704 3132 const char* sep = NULL;
a9c4fd4e 3133 const char* p;
56304f61
CS
3134
3135 for (p = name; *p; p++) {
3136 if (*p == '\'')
3137 sep = p, leaf = p + 1;
3138 else if (*p == ':' && *(p + 1) == ':')
3139 sep = p, leaf = p + 2;
3140 }
3141 if (!sep || ((sep - name) == 5 && strnEQ(name, "SUPER", 5))) {
9b9d0b15
NC
3142 /* the method name is unqualified or starts with SUPER:: */
3143 bool need_strlen = 1;
3144 if (sep) {
3145 packname = CopSTASHPV(PL_curcop);
3146 }
3147 else if (stash) {
46c461b5 3148 HEK * const packhek = HvNAME_HEK(stash);
9b9d0b15
NC
3149 if (packhek) {
3150 packname = HEK_KEY(packhek);
3151 packlen = HEK_LEN(packhek);
3152 need_strlen = 0;
3153 } else {
3154 goto croak;
3155 }
3156 }
3157
3158 if (!packname) {
3159 croak:
e27ad1f2
AV
3160 Perl_croak(aTHX_
3161 "Can't use anonymous symbol table for method lookup");
9b9d0b15
NC
3162 }
3163 else if (need_strlen)
e27ad1f2 3164 packlen = strlen(packname);
9b9d0b15 3165
56304f61
CS
3166 }
3167 else {
af09ea45 3168 /* the method name is qualified */
56304f61
CS
3169 packname = name;
3170 packlen = sep - name;
3171 }
af09ea45
IK
3172
3173 /* we're relying on gv_fetchmethod not autovivifying the stash */
3174 if (gv_stashpvn(packname, packlen, FALSE)) {
c1899e02 3175 Perl_croak(aTHX_
af09ea45
IK
3176 "Can't locate object method \"%s\" via package \"%.*s\"",
3177 leaf, (int)packlen, packname);
c1899e02
GS
3178 }
3179 else {
3180 Perl_croak(aTHX_
af09ea45
IK
3181 "Can't locate object method \"%s\" via package \"%.*s\""
3182 " (perhaps you forgot to load \"%.*s\"?)",
3183 leaf, (int)packlen, packname, (int)packlen, packname);
c1899e02 3184 }
56304f61 3185 }
f5d5a27c 3186 return isGV(gv) ? (SV*)GvCV(gv) : (SV*)gv;
a0d0e21e 3187}
241d1a3b
NC
3188
3189/*
3190 * Local variables:
3191 * c-indentation-style: bsd
3192 * c-basic-offset: 4
3193 * indent-tabs-mode: t
3194 * End:
3195 *
37442d52
RGS
3196 * ex: set ts=8 sts=4 sw=4 noet:
3197 */