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