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