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