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