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