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