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