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