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