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