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