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