Introduce pp_lock.
[p5sagit/p5-mst-13.2.git] / pp_hot.c
CommitLineData
a0d0e21e 1/* pp_hot.c
2 *
9607fc9c 3 * Copyright (c) 1991-1997, 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"
19#include "perl.h"
20
21/* Hot code. */
22
11343788 23#ifdef USE_THREADS
24static void
25unset_cvowner(cvarg)
26void *cvarg;
27{
28 register CV* cv = (CV *) cvarg;
29#ifdef DEBUGGING
30 dTHR;
31#endif /* DEBUGGING */
32
33 DEBUG_L((fprintf(stderr, "0x%lx unsetting CvOWNER of 0x%lx:%s\n",
34 (unsigned long)thr, (unsigned long)cv, SvPEEK((SV*)cv))));
35 MUTEX_LOCK(CvMUTEXP(cv));
9ed32d99 36 /* assert(CvDEPTH(cv) == 0); */
11343788 37 assert(thr == CvOWNER(cv));
38 CvOWNER(cv) = 0;
39 if (CvCONDP(cv))
40 COND_SIGNAL(CvCONDP(cv)); /* next please */
41 MUTEX_UNLOCK(CvMUTEXP(cv));
42 SvREFCNT_dec(cv);
43}
44
45#if 0
46void
47mutex_unlock(m)
48void *m;
49{
50#ifdef DEBUGGING
51 dTHR;
52 DEBUG_L((fprintf(stderr, "0x%lx unlocking mutex 0x%lx\n",
53 (unsigned long) thr, (unsigned long) m)));
54#endif /* DEBUGGING */
55 MUTEX_UNLOCK((pthread_mutex_t *) m);
56}
57#endif
58#endif /* USE_THREADS */
59
a0d0e21e 60PP(pp_const)
61{
62 dSP;
63 XPUSHs(cSVOP->op_sv);
64 RETURN;
65}
66
67PP(pp_nextstate)
68{
69 curcop = (COP*)op;
70 TAINT_NOT; /* Each statement is presumed innocent */
71 stack_sp = stack_base + cxstack[cxstack_ix].blk_oldsp;
72 FREETMPS;
73 return NORMAL;
74}
75
76PP(pp_gvsv)
77{
78 dSP;
79 EXTEND(sp,1);
80 if (op->op_private & OPpLVAL_INTRO)
81 PUSHs(save_scalar(cGVOP->op_gv));
82 else
83 PUSHs(GvSV(cGVOP->op_gv));
84 RETURN;
85}
86
87PP(pp_null)
88{
89 return NORMAL;
90}
91
92PP(pp_pushmark)
93{
94 PUSHMARK(stack_sp);
95 return NORMAL;
96}
97
98PP(pp_stringify)
99{
100 dSP; dTARGET;
101 STRLEN len;
102 char *s;
103 s = SvPV(TOPs,len);
104 sv_setpvn(TARG,s,len);
105 SETTARG;
106 RETURN;
107}
108
109PP(pp_gv)
110{
111 dSP;
112 XPUSHs((SV*)cGVOP->op_gv);
113 RETURN;
114}
115
c07a80fd 116PP(pp_gelem)
117{
118 GV *gv;
119 SV *sv;
120 SV *ref;
121 char *elem;
122 dSP;
123
124 sv = POPs;
125 elem = SvPV(sv, na);
126 gv = (GV*)POPs;
127 ref = Nullsv;
128 sv = Nullsv;
129 switch (elem ? *elem : '\0')
130 {
131 case 'A':
132 if (strEQ(elem, "ARRAY"))
133 ref = (SV*)GvAV(gv);
134 break;
135 case 'C':
136 if (strEQ(elem, "CODE"))
8ebc5c01 137 ref = (SV*)GvCVu(gv);
c07a80fd 138 break;
139 case 'F':
36477c24 140 if (strEQ(elem, "FILEHANDLE")) /* XXX deprecate in 5.005 */
c07a80fd 141 ref = (SV*)GvIOp(gv);
142 break;
143 case 'G':
144 if (strEQ(elem, "GLOB"))
145 ref = (SV*)gv;
146 break;
147 case 'H':
148 if (strEQ(elem, "HASH"))
149 ref = (SV*)GvHV(gv);
150 break;
36477c24 151 case 'I':
152 if (strEQ(elem, "IO"))
153 ref = (SV*)GvIOp(gv);
154 break;
c07a80fd 155 case 'N':
156 if (strEQ(elem, "NAME"))
157 sv = newSVpv(GvNAME(gv), GvNAMELEN(gv));
158 break;
159 case 'P':
160 if (strEQ(elem, "PACKAGE"))
161 sv = newSVpv(HvNAME(GvSTASH(gv)), 0);
162 break;
163 case 'S':
164 if (strEQ(elem, "SCALAR"))
165 ref = GvSV(gv);
166 break;
167 }
168 if (ref)
169 sv = newRV(ref);
170 if (sv)
171 sv_2mortal(sv);
172 else
173 sv = &sv_undef;
174 XPUSHs(sv);
175 RETURN;
176}
177
a0d0e21e 178PP(pp_and)
179{
180 dSP;
181 if (!SvTRUE(TOPs))
182 RETURN;
183 else {
184 --SP;
185 RETURNOP(cLOGOP->op_other);
186 }
187}
188
189PP(pp_sassign)
190{
191 dSP; dPOPTOPssrl;
748a9306 192 MAGIC *mg;
193
a0d0e21e 194 if (op->op_private & OPpASSIGN_BACKWARDS) {
195 SV *temp;
196 temp = left; left = right; right = temp;
197 }
bbce6d69 198 if (tainting && tainted && !SvTAINTED(left))
a0d0e21e 199 TAINT_NOT;
54310121 200 SvSetMagicSV(right, left);
a0d0e21e 201 SETs(right);
202 RETURN;
203}
204
205PP(pp_cond_expr)
206{
207 dSP;
208 if (SvTRUEx(POPs))
209 RETURNOP(cCONDOP->op_true);
210 else
211 RETURNOP(cCONDOP->op_false);
212}
213
214PP(pp_unstack)
215{
216 I32 oldsave;
217 TAINT_NOT; /* Each statement is presumed innocent */
218 stack_sp = stack_base + cxstack[cxstack_ix].blk_oldsp;
219 FREETMPS;
220 oldsave = scopestack[scopestack_ix - 1];
221 LEAVE_SCOPE(oldsave);
222 return NORMAL;
223}
224
a0d0e21e 225PP(pp_concat)
226{
748a9306 227 dSP; dATARGET; tryAMAGICbin(concat,opASSIGN);
228 {
229 dPOPTOPssrl;
a0d0e21e 230 STRLEN len;
231 char *s;
232 if (TARG != left) {
233 s = SvPV(left,len);
234 sv_setpvn(TARG,s,len);
235 }
c07a80fd 236 else if (SvGMAGICAL(TARG))
237 mg_get(TARG);
7a4c00b4 238 else if (!SvOK(TARG) && SvTYPE(TARG) <= SVt_PVMG) {
748a9306 239 sv_setpv(TARG, ""); /* Suppress warning. */
7a4c00b4 240 s = SvPV_force(TARG, len);
4633a7c4 241 }
a0d0e21e 242 s = SvPV(right,len);
68dc0745 243 if (SvOK(TARG))
244 sv_catpvn(TARG,s,len);
245 else
246 sv_setpvn(TARG,s,len); /* suppress warning */
a0d0e21e 247 SETTARG;
248 RETURN;
748a9306 249 }
a0d0e21e 250}
251
252PP(pp_padsv)
253{
254 dSP; dTARGET;
255 XPUSHs(TARG);
4633a7c4 256 if (op->op_flags & OPf_MOD) {
257 if (op->op_private & OPpLVAL_INTRO)
258 SAVECLEARSV(curpad[op->op_targ]);
5f05dabc 259 else if (op->op_private & OPpDEREF)
54310121 260 vivify_ref(curpad[op->op_targ], op->op_private & OPpDEREF);
4633a7c4 261 }
a0d0e21e 262 RETURN;
263}
264
265PP(pp_readline)
266{
267 last_in_gv = (GV*)(*stack_sp--);
268 return do_readline();
269}
270
271PP(pp_eq)
272{
273 dSP; tryAMAGICbinSET(eq,0);
274 {
275 dPOPnv;
54310121 276 SETs(boolSV(TOPn == value));
a0d0e21e 277 RETURN;
278 }
279}
280
281PP(pp_preinc)
282{
283 dSP;
68dc0745 284 if (SvREADONLY(TOPs) || SvTYPE(TOPs) > SVt_PVLV)
44a8e56a 285 croak(no_modify);
55497cff 286 if (SvIOK(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs) &&
287 SvIVX(TOPs) != IV_MAX)
288 {
748a9306 289 ++SvIVX(TOPs);
55497cff 290 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
748a9306 291 }
292 else
293 sv_inc(TOPs);
a0d0e21e 294 SvSETMAGIC(TOPs);
295 return NORMAL;
296}
297
298PP(pp_or)
299{
300 dSP;
301 if (SvTRUE(TOPs))
302 RETURN;
303 else {
304 --SP;
305 RETURNOP(cLOGOP->op_other);
306 }
307}
308
309PP(pp_add)
310{
311 dSP; dATARGET; tryAMAGICbin(add,opASSIGN);
312 {
7a4c00b4 313 dPOPTOPnnrl_ul;
a0d0e21e 314 SETn( left + right );
315 RETURN;
316 }
317}
318
319PP(pp_aelemfast)
320{
321 dSP;
322 AV *av = GvAV((GV*)cSVOP->op_sv);
323 SV** svp = av_fetch(av, op->op_private, op->op_flags & OPf_MOD);
324 PUSHs(svp ? *svp : &sv_undef);
325 RETURN;
326}
327
328PP(pp_join)
329{
330 dSP; dMARK; dTARGET;
331 MARK++;
332 do_join(TARG, *MARK, MARK, SP);
333 SP = MARK;
334 SETs(TARG);
335 RETURN;
336}
337
338PP(pp_pushre)
339{
340 dSP;
44a8e56a 341#ifdef DEBUGGING
342 /*
343 * We ass_u_me that LvTARGOFF() comes first, and that two STRLENs
344 * will be enough to hold an OP*.
345 */
346 SV* sv = sv_newmortal();
347 sv_upgrade(sv, SVt_PVLV);
348 LvTYPE(sv) = '/';
349 Copy(&op, &LvTARGOFF(sv), 1, OP*);
350 XPUSHs(sv);
351#else
a0d0e21e 352 XPUSHs((SV*)op);
44a8e56a 353#endif
a0d0e21e 354 RETURN;
355}
356
357/* Oversized hot code. */
358
359PP(pp_print)
360{
361 dSP; dMARK; dORIGMARK;
362 GV *gv;
363 IO *io;
760ac839 364 register PerlIO *fp;
236988e4 365 MAGIC *mg;
a0d0e21e 366
367 if (op->op_flags & OPf_STACKED)
368 gv = (GV*)*++MARK;
369 else
370 gv = defoutgv;
236988e4 371 if (SvMAGICAL(gv) && (mg = mg_find((SV*)gv, 'q'))) {
68dc0745 372 if (MARK == ORIGMARK) {
373 EXTEND(SP, 1);
374 ++MARK;
375 Move(MARK, MARK + 1, (SP - MARK) + 1, SV*);
376 ++SP;
377 }
378 PUSHMARK(MARK - 1);
236988e4 379 *MARK = mg->mg_obj;
68dc0745 380 PUTBACK;
236988e4 381 ENTER;
382 perl_call_method("PRINT", G_SCALAR);
383 LEAVE;
384 SPAGAIN;
68dc0745 385 MARK = ORIGMARK + 1;
386 *MARK = *SP;
387 SP = MARK;
236988e4 388 RETURN;
389 }
a0d0e21e 390 if (!(io = GvIO(gv))) {
748a9306 391 if (dowarn) {
392 SV* sv = sv_newmortal();
4f732624 393 gv_fullname3(sv, gv, Nullch);
748a9306 394 warn("Filehandle %s never opened", SvPV(sv,na));
395 }
396
397 SETERRNO(EBADF,RMS$_IFI);
a0d0e21e 398 goto just_say_no;
399 }
400 else if (!(fp = IoOFP(io))) {
401 if (dowarn) {
748a9306 402 SV* sv = sv_newmortal();
4f732624 403 gv_fullname3(sv, gv, Nullch);
a0d0e21e 404 if (IoIFP(io))
748a9306 405 warn("Filehandle %s opened only for input", SvPV(sv,na));
a0d0e21e 406 else
748a9306 407 warn("print on closed filehandle %s", SvPV(sv,na));
a0d0e21e 408 }
748a9306 409 SETERRNO(EBADF,IoIFP(io)?RMS$_FAC:RMS$_IFI);
a0d0e21e 410 goto just_say_no;
411 }
412 else {
413 MARK++;
414 if (ofslen) {
415 while (MARK <= SP) {
416 if (!do_print(*MARK, fp))
417 break;
418 MARK++;
419 if (MARK <= SP) {
760ac839 420 if (PerlIO_write(fp, ofs, ofslen) == 0 || PerlIO_error(fp)) {
a0d0e21e 421 MARK--;
422 break;
423 }
424 }
425 }
426 }
427 else {
428 while (MARK <= SP) {
429 if (!do_print(*MARK, fp))
430 break;
431 MARK++;
432 }
433 }
434 if (MARK <= SP)
435 goto just_say_no;
436 else {
437 if (orslen)
760ac839 438 if (PerlIO_write(fp, ors, orslen) == 0 || PerlIO_error(fp))
a0d0e21e 439 goto just_say_no;
440
441 if (IoFLAGS(io) & IOf_FLUSH)
760ac839 442 if (PerlIO_flush(fp) == EOF)
a0d0e21e 443 goto just_say_no;
444 }
445 }
446 SP = ORIGMARK;
447 PUSHs(&sv_yes);
448 RETURN;
449
450 just_say_no:
451 SP = ORIGMARK;
452 PUSHs(&sv_undef);
453 RETURN;
454}
455
456PP(pp_rv2av)
457{
458 dSP; dPOPss;
a0d0e21e 459 AV *av;
460
461 if (SvROK(sv)) {
462 wasref:
463 av = (AV*)SvRV(sv);
464 if (SvTYPE(av) != SVt_PVAV)
465 DIE("Not an ARRAY reference");
466 if (op->op_private & OPpLVAL_INTRO)
467 av = (AV*)save_svref((SV**)sv);
468 if (op->op_flags & OPf_REF) {
469 PUSHs((SV*)av);
470 RETURN;
471 }
472 }
473 else {
474 if (SvTYPE(sv) == SVt_PVAV) {
475 av = (AV*)sv;
476 if (op->op_flags & OPf_REF) {
477 PUSHs((SV*)av);
478 RETURN;
479 }
480 }
481 else {
67955e0c 482 GV *gv;
483
a0d0e21e 484 if (SvTYPE(sv) != SVt_PVGV) {
748a9306 485 char *sym;
486
a0d0e21e 487 if (SvGMAGICAL(sv)) {
488 mg_get(sv);
489 if (SvROK(sv))
490 goto wasref;
491 }
492 if (!SvOK(sv)) {
493 if (op->op_flags & OPf_REF ||
494 op->op_private & HINT_STRICT_REFS)
495 DIE(no_usym, "an ARRAY");
d83e6520 496 if (dowarn)
497 warn(warn_uninit);
4633a7c4 498 if (GIMME == G_ARRAY)
499 RETURN;
a0d0e21e 500 RETPUSHUNDEF;
501 }
748a9306 502 sym = SvPV(sv,na);
a0d0e21e 503 if (op->op_private & HINT_STRICT_REFS)
748a9306 504 DIE(no_symref, sym, "an ARRAY");
67955e0c 505 gv = (GV*)gv_fetchpv(sym, TRUE, SVt_PVAV);
506 } else {
507 gv = (GV*)sv;
a0d0e21e 508 }
67955e0c 509 av = GvAVn(gv);
a0d0e21e 510 if (op->op_private & OPpLVAL_INTRO)
67955e0c 511 av = save_ary(gv);
a0d0e21e 512 if (op->op_flags & OPf_REF) {
513 PUSHs((SV*)av);
514 RETURN;
515 }
516 }
517 }
518
519 if (GIMME == G_ARRAY) {
520 I32 maxarg = AvFILL(av) + 1;
521 EXTEND(SP, maxarg);
522 Copy(AvARRAY(av), SP+1, maxarg, SV*);
523 SP += maxarg;
524 }
525 else {
526 dTARGET;
527 I32 maxarg = AvFILL(av) + 1;
528 PUSHi(maxarg);
529 }
530 RETURN;
531}
532
533PP(pp_rv2hv)
534{
a0d0e21e 535 dSP; dTOPss;
a0d0e21e 536 HV *hv;
537
538 if (SvROK(sv)) {
539 wasref:
540 hv = (HV*)SvRV(sv);
c750a3ec 541 if (SvTYPE(hv) != SVt_PVHV && SvTYPE(hv) != SVt_PVAV)
a0d0e21e 542 DIE("Not a HASH reference");
543 if (op->op_private & OPpLVAL_INTRO)
544 hv = (HV*)save_svref((SV**)sv);
545 if (op->op_flags & OPf_REF) {
546 SETs((SV*)hv);
547 RETURN;
548 }
549 }
550 else {
c750a3ec 551 if (SvTYPE(sv) == SVt_PVHV || SvTYPE(sv) == SVt_PVAV) {
a0d0e21e 552 hv = (HV*)sv;
553 if (op->op_flags & OPf_REF) {
554 SETs((SV*)hv);
555 RETURN;
556 }
557 }
558 else {
67955e0c 559 GV *gv;
560
a0d0e21e 561 if (SvTYPE(sv) != SVt_PVGV) {
748a9306 562 char *sym;
563
a0d0e21e 564 if (SvGMAGICAL(sv)) {
565 mg_get(sv);
566 if (SvROK(sv))
567 goto wasref;
568 }
569 if (!SvOK(sv)) {
570 if (op->op_flags & OPf_REF ||
571 op->op_private & HINT_STRICT_REFS)
572 DIE(no_usym, "a HASH");
d83e6520 573 if (dowarn)
574 warn(warn_uninit);
4633a7c4 575 if (GIMME == G_ARRAY) {
576 SP--;
577 RETURN;
578 }
a0d0e21e 579 RETSETUNDEF;
580 }
748a9306 581 sym = SvPV(sv,na);
a0d0e21e 582 if (op->op_private & HINT_STRICT_REFS)
748a9306 583 DIE(no_symref, sym, "a HASH");
67955e0c 584 gv = (GV*)gv_fetchpv(sym, TRUE, SVt_PVHV);
585 } else {
586 gv = (GV*)sv;
a0d0e21e 587 }
67955e0c 588 hv = GvHVn(gv);
a0d0e21e 589 if (op->op_private & OPpLVAL_INTRO)
67955e0c 590 hv = save_hash(gv);
a0d0e21e 591 if (op->op_flags & OPf_REF) {
592 SETs((SV*)hv);
593 RETURN;
594 }
595 }
596 }
597
598 if (GIMME == G_ARRAY) { /* array wanted */
599 *stack_sp = (SV*)hv;
600 return do_kv(ARGS);
601 }
602 else {
603 dTARGET;
c750a3ec 604 /* This bit is OK even when hv is really an AV */
46fc3d4c 605 if (HvFILL(hv))
606 sv_setpvf(TARG, "%ld/%ld",
607 (long)HvFILL(hv), (long)HvMAX(hv) + 1);
a0d0e21e 608 else
609 sv_setiv(TARG, 0);
c750a3ec 610
a0d0e21e 611 SETTARG;
612 RETURN;
613 }
614}
615
616PP(pp_aassign)
617{
618 dSP;
619 SV **lastlelem = stack_sp;
620 SV **lastrelem = stack_base + POPMARK;
621 SV **firstrelem = stack_base + POPMARK + 1;
622 SV **firstlelem = lastrelem + 1;
623
624 register SV **relem;
625 register SV **lelem;
626
627 register SV *sv;
628 register AV *ary;
629
54310121 630 I32 gimme;
a0d0e21e 631 HV *hash;
632 I32 i;
633 int magic;
634
635 delaymagic = DM_DELAY; /* catch simultaneous items */
636
637 /* If there's a common identifier on both sides we have to take
638 * special care that assigning the identifier on the left doesn't
639 * clobber a value on the right that's used later in the list.
640 */
641 if (op->op_private & OPpASSIGN_COMMON) {
642 for (relem = firstrelem; relem <= lastrelem; relem++) {
643 /*SUPPRESS 560*/
a1f49e72 644 if (sv = *relem) {
645 TAINT_NOT; /* Each item is independent */
a0d0e21e 646 *relem = sv_mortalcopy(sv);
a1f49e72 647 }
a0d0e21e 648 }
649 }
650
651 relem = firstrelem;
652 lelem = firstlelem;
653 ary = Null(AV*);
654 hash = Null(HV*);
655 while (lelem <= lastlelem) {
bbce6d69 656 TAINT_NOT; /* Each item stands on its own, taintwise. */
a0d0e21e 657 sv = *lelem++;
658 switch (SvTYPE(sv)) {
659 case SVt_PVAV:
660 ary = (AV*)sv;
748a9306 661 magic = SvMAGICAL(ary) != 0;
a0d0e21e 662
663 av_clear(ary);
7e42bd57 664 av_extend(ary, lastrelem - relem);
a0d0e21e 665 i = 0;
666 while (relem <= lastrelem) { /* gobble up all the rest */
667 sv = NEWSV(28,0);
668 assert(*relem);
669 sv_setsv(sv,*relem);
670 *(relem++) = sv;
671 (void)av_store(ary,i++,sv);
672 if (magic)
673 mg_set(sv);
bbce6d69 674 TAINT_NOT;
a0d0e21e 675 }
676 break;
677 case SVt_PVHV: {
a0d0e21e 678 SV *tmpstr;
679
680 hash = (HV*)sv;
748a9306 681 magic = SvMAGICAL(hash) != 0;
a0d0e21e 682 hv_clear(hash);
683
684 while (relem < lastrelem) { /* gobble up all the rest */
685 STRLEN len;
4633a7c4 686 if (*relem)
a0d0e21e 687 sv = *(relem++);
4633a7c4 688 else
a0d0e21e 689 sv = &sv_no, relem++;
a0d0e21e 690 tmpstr = NEWSV(29,0);
691 if (*relem)
692 sv_setsv(tmpstr,*relem); /* value */
693 *(relem++) = tmpstr;
760ac839 694 (void)hv_store_ent(hash,sv,tmpstr,0);
a0d0e21e 695 if (magic)
696 mg_set(tmpstr);
bbce6d69 697 TAINT_NOT;
8e07c86e 698 }
760ac839 699 if (relem == lastrelem)
700 warn("Odd number of elements in hash list");
a0d0e21e 701 }
702 break;
703 default:
704 if (SvTHINKFIRST(sv)) {
705 if (SvREADONLY(sv) && curcop != &compiling) {
706 if (sv != &sv_undef && sv != &sv_yes && sv != &sv_no)
707 DIE(no_modify);
708 if (relem <= lastrelem)
709 relem++;
710 break;
711 }
712 if (SvROK(sv))
713 sv_unref(sv);
714 }
715 if (relem <= lastrelem) {
716 sv_setsv(sv, *relem);
717 *(relem++) = sv;
718 }
719 else
720 sv_setsv(sv, &sv_undef);
721 SvSETMAGIC(sv);
722 break;
723 }
724 }
725 if (delaymagic & ~DM_DELAY) {
726 if (delaymagic & DM_UID) {
727#ifdef HAS_SETRESUID
728 (void)setresuid(uid,euid,(Uid_t)-1);
56febc5e 729#else
730# ifdef HAS_SETREUID
a0d0e21e 731 (void)setreuid(uid,euid);
56febc5e 732# else
733# ifdef HAS_SETRUID
a0d0e21e 734 if ((delaymagic & DM_UID) == DM_RUID) {
735 (void)setruid(uid);
748a9306 736 delaymagic &= ~DM_RUID;
a0d0e21e 737 }
56febc5e 738# endif /* HAS_SETRUID */
739# ifdef HAS_SETEUID
a0d0e21e 740 if ((delaymagic & DM_UID) == DM_EUID) {
741 (void)seteuid(uid);
748a9306 742 delaymagic &= ~DM_EUID;
a0d0e21e 743 }
56febc5e 744# endif /* HAS_SETEUID */
a0d0e21e 745 if (delaymagic & DM_UID) {
746 if (uid != euid)
747 DIE("No setreuid available");
748 (void)setuid(uid);
749 }
56febc5e 750# endif /* HAS_SETREUID */
751#endif /* HAS_SETRESUID */
a0d0e21e 752 uid = (int)getuid();
753 euid = (int)geteuid();
754 }
755 if (delaymagic & DM_GID) {
756#ifdef HAS_SETRESGID
757 (void)setresgid(gid,egid,(Gid_t)-1);
56febc5e 758#else
759# ifdef HAS_SETREGID
a0d0e21e 760 (void)setregid(gid,egid);
56febc5e 761# else
762# ifdef HAS_SETRGID
a0d0e21e 763 if ((delaymagic & DM_GID) == DM_RGID) {
764 (void)setrgid(gid);
748a9306 765 delaymagic &= ~DM_RGID;
a0d0e21e 766 }
56febc5e 767# endif /* HAS_SETRGID */
768# ifdef HAS_SETEGID
a0d0e21e 769 if ((delaymagic & DM_GID) == DM_EGID) {
770 (void)setegid(gid);
748a9306 771 delaymagic &= ~DM_EGID;
a0d0e21e 772 }
56febc5e 773# endif /* HAS_SETEGID */
a0d0e21e 774 if (delaymagic & DM_GID) {
775 if (gid != egid)
776 DIE("No setregid available");
777 (void)setgid(gid);
778 }
56febc5e 779# endif /* HAS_SETREGID */
780#endif /* HAS_SETRESGID */
a0d0e21e 781 gid = (int)getgid();
782 egid = (int)getegid();
783 }
4633a7c4 784 tainting |= (uid && (euid != uid || egid != gid));
a0d0e21e 785 }
786 delaymagic = 0;
54310121 787
788 gimme = GIMME_V;
789 if (gimme == G_VOID)
790 SP = firstrelem - 1;
791 else if (gimme == G_SCALAR) {
792 dTARGET;
793 SP = firstrelem;
794 SETi(lastrelem - firstrelem + 1);
795 }
796 else {
a0d0e21e 797 if (ary || hash)
798 SP = lastrelem;
799 else
800 SP = firstrelem + (lastlelem - firstlelem);
0c8c7a05 801 lelem = firstlelem + (relem - firstrelem);
5f05dabc 802 while (relem <= SP)
0c8c7a05 803 *relem++ = (lelem <= lastlelem) ? *lelem++ : &sv_undef;
a0d0e21e 804 }
54310121 805 RETURN;
a0d0e21e 806}
807
808PP(pp_match)
809{
810 dSP; dTARG;
811 register PMOP *pm = cPMOP;
812 register char *t;
813 register char *s;
814 char *strend;
815 I32 global;
816 I32 safebase;
817 char *truebase;
818 register REGEXP *rx = pm->op_pmregexp;
819 I32 gimme = GIMME;
820 STRLEN len;
748a9306 821 I32 minmatch = 0;
4633a7c4 822 I32 oldsave = savestack_ix;
f86702cc 823 I32 update_minmatch = 1;
a0d0e21e 824
825 if (op->op_flags & OPf_STACKED)
826 TARG = POPs;
827 else {
828 TARG = GvSV(defgv);
829 EXTEND(SP,1);
830 }
831 s = SvPV(TARG, len);
832 strend = s + len;
833 if (!s)
834 DIE("panic: do_match");
9212bbba 835 TAINT_NOT;
a0d0e21e 836
837 if (pm->op_pmflags & PMf_USED) {
838 if (gimme == G_ARRAY)
839 RETURN;
840 RETPUSHNO;
841 }
842
843 if (!rx->prelen && curpm) {
844 pm = curpm;
845 rx = pm->op_pmregexp;
846 }
847 truebase = t = s;
848 if (global = pm->op_pmflags & PMf_GLOBAL) {
849 rx->startp[0] = 0;
850 if (SvTYPE(TARG) >= SVt_PVMG && SvMAGIC(TARG)) {
851 MAGIC* mg = mg_find(TARG, 'g');
748a9306 852 if (mg && mg->mg_len >= 0) {
a0d0e21e 853 rx->endp[0] = rx->startp[0] = s + mg->mg_len;
748a9306 854 minmatch = (mg->mg_flags & MGf_MINMATCH);
f86702cc 855 update_minmatch = 0;
748a9306 856 }
a0d0e21e 857 }
858 }
748a9306 859 if (!rx->nparens && !global)
860 gimme = G_SCALAR; /* accidental array context? */
137443ea 861 safebase = (((gimme == G_ARRAY) || global || !rx->nparens)
862 && !sawampersand);
a0d0e21e 863 if (pm->op_pmflags & (PMf_MULTILINE|PMf_SINGLELINE)) {
864 SAVEINT(multiline);
865 multiline = pm->op_pmflags & PMf_MULTILINE;
866 }
867
868play_it_again:
869 if (global && rx->startp[0]) {
870 t = s = rx->endp[0];
51aa1f50 871 if ((s + rx->minlen) > strend)
a0d0e21e 872 goto nope;
f86702cc 873 if (update_minmatch++)
874 minmatch = (s == rx->startp[0]);
a0d0e21e 875 }
876 if (pm->op_pmshort) {
877 if (pm->op_pmflags & PMf_SCANFIRST) {
878 if (SvSCREAM(TARG)) {
879 if (screamfirst[BmRARE(pm->op_pmshort)] < 0)
880 goto nope;
881 else if (!(s = screaminstr(TARG, pm->op_pmshort)))
882 goto nope;
883 else if (pm->op_pmflags & PMf_ALL)
884 goto yup;
885 }
886 else if (!(s = fbm_instr((unsigned char*)s,
887 (unsigned char*)strend, pm->op_pmshort)))
888 goto nope;
889 else if (pm->op_pmflags & PMf_ALL)
890 goto yup;
891 if (s && rx->regback >= 0) {
892 ++BmUSEFUL(pm->op_pmshort);
893 s -= rx->regback;
894 if (s < t)
895 s = t;
896 }
897 else
898 s = t;
899 }
900 else if (!multiline) {
bbce6d69 901 if (*SvPVX(pm->op_pmshort) != *s
902 || (pm->op_pmslen > 1
36477c24 903 && memNE(SvPVX(pm->op_pmshort), s, pm->op_pmslen)))
bbce6d69 904 goto nope;
a0d0e21e 905 }
906 if (!rx->naughty && --BmUSEFUL(pm->op_pmshort) < 0) {
907 SvREFCNT_dec(pm->op_pmshort);
908 pm->op_pmshort = Nullsv; /* opt is being useless */
909 }
910 }
e50aee73 911 if (pregexec(rx, s, strend, truebase, minmatch,
bbce6d69 912 SvSCREAM(TARG) ? TARG : Nullsv, safebase))
913 {
a0d0e21e 914 curpm = pm;
915 if (pm->op_pmflags & PMf_ONCE)
916 pm->op_pmflags |= PMf_USED;
917 goto gotcha;
918 }
919 else
920 goto ret_no;
921 /*NOTREACHED*/
922
923 gotcha:
9212bbba 924 TAINT_IF(rx->exec_tainted);
a0d0e21e 925 if (gimme == G_ARRAY) {
926 I32 iters, i, len;
927
928 iters = rx->nparens;
929 if (global && !iters)
930 i = 1;
931 else
932 i = 0;
933 EXTEND(SP, iters + i);
bbce6d69 934 EXTEND_MORTAL(iters + i);
a0d0e21e 935 for (i = !i; i <= iters; i++) {
936 PUSHs(sv_newmortal());
937 /*SUPPRESS 560*/
938 if ((s = rx->startp[i]) && rx->endp[i] ) {
939 len = rx->endp[i] - s;
940 sv_setpvn(*SP, s, len);
941 }
942 }
943 if (global) {
944 truebase = rx->subbeg;
5f05dabc 945 strend = rx->subend;
a0d0e21e 946 if (rx->startp[0] && rx->startp[0] == rx->endp[0])
947 ++rx->endp[0];
948 goto play_it_again;
949 }
4633a7c4 950 LEAVE_SCOPE(oldsave);
a0d0e21e 951 RETURN;
952 }
953 else {
954 if (global) {
955 MAGIC* mg = 0;
956 if (SvTYPE(TARG) >= SVt_PVMG && SvMAGIC(TARG))
957 mg = mg_find(TARG, 'g');
958 if (!mg) {
959 sv_magic(TARG, (SV*)0, 'g', Nullch, 0);
960 mg = mg_find(TARG, 'g');
961 }
748a9306 962 if (rx->startp[0]) {
5f05dabc 963 mg->mg_len = rx->endp[0] - rx->subbeg;
748a9306 964 if (rx->startp[0] == rx->endp[0])
965 mg->mg_flags |= MGf_MINMATCH;
966 else
967 mg->mg_flags &= ~MGf_MINMATCH;
968 }
a0d0e21e 969 }
4633a7c4 970 LEAVE_SCOPE(oldsave);
a0d0e21e 971 RETPUSHYES;
972 }
973
974yup:
9212bbba 975 TAINT_IF(rx->exec_tainted);
a0d0e21e 976 ++BmUSEFUL(pm->op_pmshort);
977 curpm = pm;
978 if (pm->op_pmflags & PMf_ONCE)
979 pm->op_pmflags |= PMf_USED;
5f05dabc 980 Safefree(rx->subbase);
981 rx->subbase = Nullch;
a0d0e21e 982 if (global) {
983 rx->subbeg = truebase;
984 rx->subend = strend;
985 rx->startp[0] = s;
986 rx->endp[0] = s + SvCUR(pm->op_pmshort);
987 goto gotcha;
988 }
989 if (sawampersand) {
990 char *tmps;
991
a0d0e21e 992 tmps = rx->subbase = savepvn(t, strend-t);
993 rx->subbeg = tmps;
994 rx->subend = tmps + (strend-t);
995 tmps = rx->startp[0] = tmps + (s - t);
996 rx->endp[0] = tmps + SvCUR(pm->op_pmshort);
997 }
4633a7c4 998 LEAVE_SCOPE(oldsave);
a0d0e21e 999 RETPUSHYES;
1000
1001nope:
1002 if (pm->op_pmshort)
1003 ++BmUSEFUL(pm->op_pmshort);
1004
1005ret_no:
c90c0ff4 1006 if (global && !(pm->op_pmflags & PMf_CONTINUE)) {
a0d0e21e 1007 if (SvTYPE(TARG) >= SVt_PVMG && SvMAGIC(TARG)) {
1008 MAGIC* mg = mg_find(TARG, 'g');
1009 if (mg)
1010 mg->mg_len = -1;
1011 }
1012 }
4633a7c4 1013 LEAVE_SCOPE(oldsave);
a0d0e21e 1014 if (gimme == G_ARRAY)
1015 RETURN;
1016 RETPUSHNO;
1017}
1018
1019OP *
1020do_readline()
1021{
11343788 1022 dTHR;
a0d0e21e 1023 dSP; dTARGETSTACKED;
1024 register SV *sv;
1025 STRLEN tmplen = 0;
1026 STRLEN offset;
760ac839 1027 PerlIO *fp;
a0d0e21e 1028 register IO *io = GvIO(last_in_gv);
1029 register I32 type = op->op_type;
54310121 1030 I32 gimme = GIMME_V;
e79b0511 1031 MAGIC *mg;
a0d0e21e 1032
e79b0511 1033 if (SvMAGICAL(last_in_gv) && (mg = mg_find((SV*)last_in_gv, 'q'))) {
1034 PUSHMARK(SP);
1035 XPUSHs(mg->mg_obj);
1036 PUTBACK;
1037 ENTER;
54310121 1038 perl_call_method("READLINE", gimme);
e79b0511 1039 LEAVE;
1040 SPAGAIN;
54310121 1041 if (gimme == G_SCALAR)
1042 SvSetMagicSV_nosteal(TARG, TOPs);
e79b0511 1043 RETURN;
1044 }
a0d0e21e 1045 fp = Nullfp;
1046 if (io) {
1047 fp = IoIFP(io);
1048 if (!fp) {
1049 if (IoFLAGS(io) & IOf_ARGV) {
1050 if (IoFLAGS(io) & IOf_START) {
1051 IoFLAGS(io) &= ~IOf_START;
1052 IoLINES(io) = 0;
1053 if (av_len(GvAVn(last_in_gv)) < 0) {
1054 SV *tmpstr = newSVpv("-", 1); /* assume stdin */
1055 av_push(GvAVn(last_in_gv), tmpstr);
1056 }
1057 }
1058 fp = nextargv(last_in_gv);
1059 if (!fp) { /* Note: fp != IoIFP(io) */
1060 (void)do_close(last_in_gv, FALSE); /* now it does*/
1061 IoFLAGS(io) |= IOf_START;
1062 }
1063 }
1064 else if (type == OP_GLOB) {
1065 SV *tmpcmd = NEWSV(55, 0);
1066 SV *tmpglob = POPs;
1067 ENTER;
1068 SAVEFREESV(tmpcmd);
1069#ifdef VMS /* expand the wildcards right here, rather than opening a pipe, */
1070 /* since spawning off a process is a real performance hit */
1071 {
1072#include <descrip.h>
1073#include <lib$routines.h>
1074#include <nam.h>
1075#include <rmsdef.h>
1076 char rslt[NAM$C_MAXRSS+1+sizeof(unsigned short int)] = {'\0','\0'};
1077 char vmsspec[NAM$C_MAXRSS+1];
1078 char *rstr = rslt + sizeof(unsigned short int), *begin, *end, *cp;
1079 char tmpfnam[L_tmpnam] = "SYS$SCRATCH:";
1080 $DESCRIPTOR(dfltdsc,"SYS$DISK:[]*.*;");
760ac839 1081 PerlIO *tmpfp;
a0d0e21e 1082 STRLEN i;
1083 struct dsc$descriptor_s wilddsc
1084 = {0, DSC$K_DTYPE_T, DSC$K_CLASS_S, 0};
1085 struct dsc$descriptor_vs rsdsc
1086 = {sizeof rslt, DSC$K_DTYPE_VT, DSC$K_CLASS_VS, rslt};
1087 unsigned long int cxt = 0, sts = 0, ok = 1, hasdir = 0, hasver = 0, isunix = 0;
1088
1089 /* We could find out if there's an explicit dev/dir or version
1090 by peeking into lib$find_file's internal context at
1091 ((struct NAM *)((struct FAB *)cxt)->fab$l_nam)->nam$l_fnb
1092 but that's unsupported, so I don't want to do it now and
1093 have it bite someone in the future. */
1094 strcat(tmpfnam,tmpnam(NULL));
1095 cp = SvPV(tmpglob,i);
1096 for (; i; i--) {
1097 if (cp[i] == ';') hasver = 1;
1098 if (cp[i] == '.') {
1099 if (sts) hasver = 1;
1100 else sts = 1;
1101 }
1102 if (cp[i] == '/') {
1103 hasdir = isunix = 1;
1104 break;
748a9306 1105 }
a0d0e21e 1106 if (cp[i] == ']' || cp[i] == '>' || cp[i] == ':') {
1107 hasdir = 1;
1108 break;
1109 }
1110 }
760ac839 1111 if ((tmpfp = PerlIO_open(tmpfnam,"w+","fop=dlt")) != NULL) {
a0d0e21e 1112 ok = ((wilddsc.dsc$a_pointer = tovmsspec(SvPVX(tmpglob),vmsspec)) != NULL);
1113 if (ok) wilddsc.dsc$w_length = (unsigned short int) strlen(wilddsc.dsc$a_pointer);
1114 while (ok && ((sts = lib$find_file(&wilddsc,&rsdsc,&cxt,
1115 &dfltdsc,NULL,NULL,NULL))&1)) {
1116 end = rstr + (unsigned long int) *rslt;
1117 if (!hasver) while (*end != ';') end--;
1118 *(end++) = '\n'; *end = '\0';
1119 for (cp = rstr; *cp; cp++) *cp = _tolower(*cp);
1120 if (hasdir) {
f86702cc 1121 if (isunix) trim_unixpath(rstr,SvPVX(tmpglob),1);
a0d0e21e 1122 begin = rstr;
1123 }
1124 else {
1125 begin = end;
1126 while (*(--begin) != ']' && *begin != '>') ;
1127 ++begin;
1128 }
760ac839 1129 ok = (PerlIO_puts(tmpfp,begin) != EOF);
a0d0e21e 1130 }
1131 if (cxt) (void)lib$find_file_end(&cxt);
748a9306 1132 if (ok && sts != RMS$_NMF &&
1133 sts != RMS$_DNF && sts != RMS$_FNF) ok = 0;
a0d0e21e 1134 if (!ok) {
c07a80fd 1135 if (!(sts & 1)) {
1136 SETERRNO((sts == RMS$_SYN ? EINVAL : EVMSERR),sts);
1137 }
760ac839 1138 PerlIO_close(tmpfp);
a0d0e21e 1139 fp = NULL;
1140 }
1141 else {
760ac839 1142 PerlIO_rewind(tmpfp);
a0d0e21e 1143 IoTYPE(io) = '<';
1144 IoIFP(io) = fp = tmpfp;
1e422769 1145 IoFLAGS(io) &= ~IOf_UNTAINT; /* maybe redundant */
a0d0e21e 1146 }
1147 }
1148 }
1149#else /* !VMS */
1150#ifdef DOSISH
67955e0c 1151#ifdef OS2
1152 sv_setpv(tmpcmd, "for a in ");
1153 sv_catsv(tmpcmd, tmpglob);
1154 sv_catpv(tmpcmd, "; do echo \"$a\\0\\c\"; done |");
1155#else
a0d0e21e 1156 sv_setpv(tmpcmd, "perlglob ");
1157 sv_catsv(tmpcmd, tmpglob);
1158 sv_catpv(tmpcmd, " |");
67955e0c 1159#endif /* !OS2 */
1160#else /* !DOSISH */
1161#if defined(CSH)
a0d0e21e 1162 sv_setpvn(tmpcmd, cshname, cshlen);
1163 sv_catpv(tmpcmd, " -cf 'set nonomatch; glob ");
1164 sv_catsv(tmpcmd, tmpglob);
16d20bd9 1165 sv_catpv(tmpcmd, "' 2>/dev/null |");
a0d0e21e 1166#else
1167 sv_setpv(tmpcmd, "echo ");
1168 sv_catsv(tmpcmd, tmpglob);
1169#if 'z' - 'a' == 25
1170 sv_catpv(tmpcmd, "|tr -s ' \t\f\r' '\\012\\012\\012\\012'|");
1171#else
1172 sv_catpv(tmpcmd, "|tr -s ' \t\f\r' '\\n\\n\\n\\n'|");
1173#endif
1174#endif /* !CSH */
67955e0c 1175#endif /* !DOSISH */
c07a80fd 1176 (void)do_open(last_in_gv, SvPVX(tmpcmd), SvCUR(tmpcmd),
1177 FALSE, 0, 0, Nullfp);
a0d0e21e 1178 fp = IoIFP(io);
1179#endif /* !VMS */
1180 LEAVE;
1181 }
1182 }
1183 else if (type == OP_GLOB)
1184 SP--;
1185 }
1186 if (!fp) {
4633a7c4 1187 if (dowarn && io && !(IoFLAGS(io) & IOf_START))
a0d0e21e 1188 warn("Read on closed filehandle <%s>", GvENAME(last_in_gv));
54310121 1189 if (gimme == G_SCALAR) {
a0d0e21e 1190 (void)SvOK_off(TARG);
1191 PUSHTARG;
1192 }
1193 RETURN;
1194 }
54310121 1195 if (gimme == G_SCALAR) {
a0d0e21e 1196 sv = TARG;
9607fc9c 1197 if (SvROK(sv))
1198 sv_unref(sv);
a0d0e21e 1199 (void)SvUPGRADE(sv, SVt_PV);
1200 tmplen = SvLEN(sv); /* remember if already alloced */
1201 if (!tmplen)
1202 Sv_Grow(sv, 80); /* try short-buffering it */
1203 if (type == OP_RCATLINE)
1204 offset = SvCUR(sv);
1205 else
1206 offset = 0;
1207 }
54310121 1208 else {
1209 sv = sv_2mortal(NEWSV(57, 80));
1210 offset = 0;
1211 }
a0d0e21e 1212 for (;;) {
1213 if (!sv_gets(sv, fp, offset)) {
760ac839 1214 PerlIO_clearerr(fp);
a0d0e21e 1215 if (IoFLAGS(io) & IOf_ARGV) {
1216 fp = nextargv(last_in_gv);
1217 if (fp)
1218 continue;
1219 (void)do_close(last_in_gv, FALSE);
1220 IoFLAGS(io) |= IOf_START;
1221 }
1222 else if (type == OP_GLOB) {
5cd24f17 1223 if (do_close(last_in_gv, FALSE) & ~0xFF)
1224 warn("internal error: glob failed");
a0d0e21e 1225 }
54310121 1226 if (gimme == G_SCALAR) {
a0d0e21e 1227 (void)SvOK_off(TARG);
1228 PUSHTARG;
1229 }
1230 RETURN;
1231 }
bbce6d69 1232 /* This should not be marked tainted if the fp is marked clean */
1233 if (!(IoFLAGS(io) & IOf_UNTAINT)) {
1234 TAINT;
1235 SvTAINTED_on(sv);
1236 }
a0d0e21e 1237 IoLINES(io)++;
71be2cbc 1238 SvSETMAGIC(sv);
a0d0e21e 1239 XPUSHs(sv);
a0d0e21e 1240 if (type == OP_GLOB) {
1241 char *tmps;
1242
c07a80fd 1243 if (SvCUR(sv) > 0 && SvCUR(rs) > 0) {
1244 tmps = SvEND(sv) - 1;
1245 if (*tmps == *SvPVX(rs)) {
1246 *tmps = '\0';
1247 SvCUR(sv)--;
1248 }
1249 }
a0d0e21e 1250 for (tmps = SvPVX(sv); *tmps; tmps++)
1251 if (!isALPHA(*tmps) && !isDIGIT(*tmps) &&
1252 strchr("$&*(){}[]'\";\\|?<>~`", *tmps))
1253 break;
1254 if (*tmps && Stat(SvPVX(sv), &statbuf) < 0) {
1255 (void)POPs; /* Unmatched wildcard? Chuck it... */
1256 continue;
1257 }
1258 }
54310121 1259 if (gimme == G_ARRAY) {
a0d0e21e 1260 if (SvLEN(sv) - SvCUR(sv) > 20) {
1261 SvLEN_set(sv, SvCUR(sv)+1);
1262 Renew(SvPVX(sv), SvLEN(sv), char);
1263 }
1264 sv = sv_2mortal(NEWSV(58, 80));
1265 continue;
1266 }
54310121 1267 else if (gimme == G_SCALAR && !tmplen && SvLEN(sv) - SvCUR(sv) > 80) {
a0d0e21e 1268 /* try to reclaim a bit of scalar space (only on 1st alloc) */
1269 if (SvCUR(sv) < 60)
1270 SvLEN_set(sv, 80);
1271 else
1272 SvLEN_set(sv, SvCUR(sv)+40); /* allow some slop */
1273 Renew(SvPVX(sv), SvLEN(sv), char);
1274 }
1275 RETURN;
1276 }
1277}
1278
1279PP(pp_enter)
1280{
1281 dSP;
1282 register CONTEXT *cx;
54310121 1283 I32 gimme = OP_GIMME(op, -1);
a0d0e21e 1284
54310121 1285 if (gimme == -1) {
1286 if (cxstack_ix >= 0)
1287 gimme = cxstack[cxstack_ix].blk_gimme;
1288 else
1289 gimme = G_SCALAR;
1290 }
a0d0e21e 1291
1292 ENTER;
1293
1294 SAVETMPS;
1295 PUSHBLOCK(cx, CXt_BLOCK, sp);
1296
1297 RETURN;
1298}
1299
1300PP(pp_helem)
1301{
1302 dSP;
760ac839 1303 HE* he;
ae77835f 1304 SV **svp;
a0d0e21e 1305 SV *keysv = POPs;
a0d0e21e 1306 HV *hv = (HV*)POPs;
68dc0745 1307 U32 lval = op->op_flags & OPf_MOD;
1308 U32 defer = op->op_private & OPpLVAL_DEFER;
a0d0e21e 1309
ae77835f 1310 if (SvTYPE(hv) == SVt_PVHV) {
1311 he = hv_fetch_ent(hv, keysv, lval && !defer, 0);
97fcbf96 1312 svp = he ? &HeVAL(he) : 0;
ae77835f 1313 }
1314 else if (SvTYPE(hv) == SVt_PVAV) {
97fcbf96 1315 svp = avhv_fetch_ent((AV*)hv, keysv, lval && !defer, 0);
ae77835f 1316 }
c750a3ec 1317 else {
a0d0e21e 1318 RETPUSHUNDEF;
c750a3ec 1319 }
a0d0e21e 1320 if (lval) {
97fcbf96 1321 if (!svp || *svp == &sv_undef) {
68dc0745 1322 SV* lv;
1323 SV* key2;
1324 if (!defer)
1325 DIE(no_helem, SvPV(keysv, na));
1326 lv = sv_newmortal();
1327 sv_upgrade(lv, SVt_PVLV);
1328 LvTYPE(lv) = 'y';
1329 sv_magic(lv, key2 = newSVsv(keysv), 'y', Nullch, 0);
1330 SvREFCNT_dec(key2); /* sv_magic() increments refcount */
1331 LvTARG(lv) = SvREFCNT_inc(hv);
1332 LvTARGLEN(lv) = 1;
1333 PUSHs(lv);
1334 RETURN;
1335 }
5f05dabc 1336 if (op->op_private & OPpLVAL_INTRO) {
ae77835f 1337 if (HvNAME(hv) && isGV(*svp))
1338 save_gp((GV*)*svp, !(op->op_flags & OPf_SPECIAL));
5f05dabc 1339 else
ae77835f 1340 save_svref(svp);
5f05dabc 1341 }
1342 else if (op->op_private & OPpDEREF)
ae77835f 1343 vivify_ref(*svp, op->op_private & OPpDEREF);
a0d0e21e 1344 }
1345 PUSHs(svp ? *svp : &sv_undef);
1346 RETURN;
1347}
1348
1349PP(pp_leave)
1350{
1351 dSP;
1352 register CONTEXT *cx;
1353 register SV **mark;
1354 SV **newsp;
1355 PMOP *newpm;
1356 I32 gimme;
1357
1358 if (op->op_flags & OPf_SPECIAL) {
1359 cx = &cxstack[cxstack_ix];
1360 cx->blk_oldpm = curpm; /* fake block should preserve $1 et al */
1361 }
1362
1363 POPBLOCK(cx,newpm);
1364
54310121 1365 gimme = OP_GIMME(op, -1);
1366 if (gimme == -1) {
1367 if (cxstack_ix >= 0)
1368 gimme = cxstack[cxstack_ix].blk_gimme;
1369 else
1370 gimme = G_SCALAR;
1371 }
a0d0e21e 1372
a1f49e72 1373 TAINT_NOT;
54310121 1374 if (gimme == G_VOID)
1375 SP = newsp;
1376 else if (gimme == G_SCALAR) {
1377 MARK = newsp + 1;
1378 if (MARK <= SP)
1379 if (SvFLAGS(TOPs) & (SVs_PADTMP|SVs_TEMP))
1380 *MARK = TOPs;
1381 else
1382 *MARK = sv_mortalcopy(TOPs);
a0d0e21e 1383 else {
54310121 1384 MEXTEND(mark,0);
1385 *MARK = &sv_undef;
a0d0e21e 1386 }
54310121 1387 SP = MARK;
a0d0e21e 1388 }
54310121 1389 else if (gimme == G_ARRAY) {
a1f49e72 1390 /* in case LEAVE wipes old return values */
1391 for (mark = newsp + 1; mark <= SP; mark++) {
1392 if (!(SvFLAGS(*mark) & (SVs_PADTMP|SVs_TEMP))) {
a0d0e21e 1393 *mark = sv_mortalcopy(*mark);
a1f49e72 1394 TAINT_NOT; /* Each item is independent */
1395 }
1396 }
a0d0e21e 1397 }
1398 curpm = newpm; /* Don't pop $1 et al till now */
1399
1400 LEAVE;
1401
1402 RETURN;
1403}
1404
1405PP(pp_iter)
1406{
1407 dSP;
1408 register CONTEXT *cx;
5f05dabc 1409 SV* sv;
4633a7c4 1410 AV* av;
a0d0e21e 1411
1412 EXTEND(sp, 1);
1413 cx = &cxstack[cxstack_ix];
1414 if (cx->cx_type != CXt_LOOP)
1415 DIE("panic: pp_iter");
1416
4633a7c4 1417 av = cx->blk_loop.iterary;
71be2cbc 1418 if (cx->blk_loop.iterix >= (av == curstack ? cx->blk_oldsp : AvFILL(av)))
4633a7c4 1419 RETPUSHNO;
a0d0e21e 1420
7a4c00b4 1421 SvREFCNT_dec(*cx->blk_loop.itervar);
a0d0e21e 1422
5f05dabc 1423 if (sv = AvARRAY(av)[++cx->blk_loop.iterix])
a0d0e21e 1424 SvTEMP_off(sv);
a0d0e21e 1425 else
5f05dabc 1426 sv = &sv_undef;
1427 if (av != curstack && SvIMMORTAL(sv)) {
1428 SV *lv = cx->blk_loop.iterlval;
71be2cbc 1429 if (lv && SvREFCNT(lv) > 1) {
1430 SvREFCNT_dec(lv);
1431 lv = Nullsv;
1432 }
5f05dabc 1433 if (lv)
1434 SvREFCNT_dec(LvTARG(lv));
1435 else {
68dc0745 1436 lv = cx->blk_loop.iterlval = NEWSV(26, 0);
5f05dabc 1437 sv_upgrade(lv, SVt_PVLV);
5f05dabc 1438 LvTYPE(lv) = 'y';
68dc0745 1439 sv_magic(lv, Nullsv, 'y', Nullch, 0);
5f05dabc 1440 }
1441 LvTARG(lv) = SvREFCNT_inc(av);
1442 LvTARGOFF(lv) = cx->blk_loop.iterix;
68dc0745 1443 LvTARGLEN(lv) = -1;
5f05dabc 1444 sv = (SV*)lv;
1445 }
a0d0e21e 1446
7a4c00b4 1447 *cx->blk_loop.itervar = SvREFCNT_inc(sv);
a0d0e21e 1448 RETPUSHYES;
1449}
1450
1451PP(pp_subst)
1452{
1453 dSP; dTARG;
1454 register PMOP *pm = cPMOP;
1455 PMOP *rpm = pm;
1456 register SV *dstr;
1457 register char *s;
1458 char *strend;
1459 register char *m;
1460 char *c;
1461 register char *d;
1462 STRLEN clen;
1463 I32 iters = 0;
1464 I32 maxiters;
1465 register I32 i;
1466 bool once;
71be2cbc 1467 bool rxtainted;
a0d0e21e 1468 char *orig;
1469 I32 safebase;
1470 register REGEXP *rx = pm->op_pmregexp;
1471 STRLEN len;
1472 int force_on_match = 0;
4633a7c4 1473 I32 oldsave = savestack_ix;
a0d0e21e 1474
5cd24f17 1475 /* known replacement string? */
1476 dstr = (pm->op_pmflags & PMf_CONST) ? POPs : Nullsv;
a0d0e21e 1477 if (op->op_flags & OPf_STACKED)
1478 TARG = POPs;
1479 else {
1480 TARG = GvSV(defgv);
1481 EXTEND(SP,1);
1482 }
68dc0745 1483 if (SvREADONLY(TARG)
1484 || (SvTYPE(TARG) > SVt_PVLV
1485 && !(SvTYPE(TARG) == SVt_PVGV && SvFAKE(TARG))))
1486 croak(no_modify);
a0d0e21e 1487 s = SvPV(TARG, len);
68dc0745 1488 if (!SvPOKp(TARG) || SvTYPE(TARG) == SVt_PVGV)
a0d0e21e 1489 force_on_match = 1;
9212bbba 1490 TAINT_NOT;
a0d0e21e 1491
1492 force_it:
1493 if (!pm || !s)
1494 DIE("panic: do_subst");
1495
1496 strend = s + len;
1497 maxiters = (strend - s) + 10;
1498
1499 if (!rx->prelen && curpm) {
1500 pm = curpm;
1501 rx = pm->op_pmregexp;
1502 }
5f05dabc 1503 safebase = (!rx->nparens && !sawampersand);
a0d0e21e 1504 if (pm->op_pmflags & (PMf_MULTILINE|PMf_SINGLELINE)) {
1505 SAVEINT(multiline);
1506 multiline = pm->op_pmflags & PMf_MULTILINE;
1507 }
1508 orig = m = s;
1509 if (pm->op_pmshort) {
1510 if (pm->op_pmflags & PMf_SCANFIRST) {
1511 if (SvSCREAM(TARG)) {
1512 if (screamfirst[BmRARE(pm->op_pmshort)] < 0)
1513 goto nope;
1514 else if (!(s = screaminstr(TARG, pm->op_pmshort)))
1515 goto nope;
1516 }
1517 else if (!(s = fbm_instr((unsigned char*)s, (unsigned char*)strend,
1518 pm->op_pmshort)))
1519 goto nope;
1520 if (s && rx->regback >= 0) {
1521 ++BmUSEFUL(pm->op_pmshort);
1522 s -= rx->regback;
1523 if (s < m)
1524 s = m;
1525 }
1526 else
1527 s = m;
1528 }
1529 else if (!multiline) {
bbce6d69 1530 if (*SvPVX(pm->op_pmshort) != *s
1531 || (pm->op_pmslen > 1
36477c24 1532 && memNE(SvPVX(pm->op_pmshort), s, pm->op_pmslen)))
bbce6d69 1533 goto nope;
a0d0e21e 1534 }
1535 if (!rx->naughty && --BmUSEFUL(pm->op_pmshort) < 0) {
1536 SvREFCNT_dec(pm->op_pmshort);
1537 pm->op_pmshort = Nullsv; /* opt is being useless */
1538 }
1539 }
71be2cbc 1540
1541 /* only replace once? */
a0d0e21e 1542 once = !(rpm->op_pmflags & PMf_GLOBAL);
71be2cbc 1543
1544 /* known replacement string? */
5cd24f17 1545 c = dstr ? SvPV(dstr, clen) : Nullch;
71be2cbc 1546
1547 /* can do inplace substitution? */
137443ea 1548 if (c && clen <= rx->minlen && safebase) {
71be2cbc 1549 if (! pregexec(rx, s, strend, orig, 0,
1550 SvSCREAM(TARG) ? TARG : Nullsv, safebase)) {
1551 PUSHs(&sv_no);
1552 LEAVE_SCOPE(oldsave);
1553 RETURN;
1554 }
1555 if (force_on_match) {
1556 force_on_match = 0;
1557 s = SvPV_force(TARG, len);
1558 goto force_it;
1559 }
71be2cbc 1560 d = s;
1561 curpm = pm;
1562 SvSCREAM_off(TARG); /* disable possible screamer */
1563 if (once) {
1564 rxtainted = rx->exec_tainted;
1565 m = rx->startp[0];
1566 d = rx->endp[0];
1567 s = orig;
1568 if (m - s > strend - d) { /* faster to shorten from end */
1569 if (clen) {
1570 Copy(c, m, clen, char);
1571 m += clen;
a0d0e21e 1572 }
71be2cbc 1573 i = strend - d;
1574 if (i > 0) {
1575 Move(d, m, i, char);
1576 m += i;
a0d0e21e 1577 }
71be2cbc 1578 *m = '\0';
1579 SvCUR_set(TARG, m - s);
1580 }
1581 /*SUPPRESS 560*/
1582 else if (i = m - s) { /* faster from front */
1583 d -= clen;
1584 m = d;
1585 sv_chop(TARG, d-i);
1586 s += i;
1587 while (i--)
1588 *--d = *--s;
1589 if (clen)
1590 Copy(c, m, clen, char);
1591 }
1592 else if (clen) {
1593 d -= clen;
1594 sv_chop(TARG, d);
1595 Copy(c, d, clen, char);
1596 }
1597 else {
1598 sv_chop(TARG, d);
1599 }
9212bbba 1600 TAINT_IF(rxtainted);
71be2cbc 1601 PUSHs(&sv_yes);
1602 }
1603 else {
1604 rxtainted = 0;
1605 do {
1606 if (iters++ > maxiters)
1607 DIE("Substitution loop");
1608 rxtainted |= rx->exec_tainted;
1609 m = rx->startp[0];
1610 /*SUPPRESS 560*/
1611 if (i = m - s) {
1612 if (s != d)
1613 Move(s, d, i, char);
1614 d += i;
a0d0e21e 1615 }
71be2cbc 1616 if (clen) {
1617 Copy(c, d, clen, char);
1618 d += clen;
1619 }
1620 s = rx->endp[0];
1621 } while (pregexec(rx, s, strend, orig, s == m,
1622 Nullsv, TRUE)); /* don't match same null twice */
1623 if (s != d) {
1624 i = strend - s;
1625 SvCUR_set(TARG, d - SvPVX(TARG) + i);
1626 Move(s, d, i+1, char); /* include the NUL */
a0d0e21e 1627 }
9212bbba 1628 TAINT_IF(rxtainted);
71be2cbc 1629 PUSHs(sv_2mortal(newSViv((I32)iters)));
a0d0e21e 1630 }
71be2cbc 1631 (void)SvPOK_only(TARG);
1632 SvSETMAGIC(TARG);
9212bbba 1633 SvTAINT(TARG);
71be2cbc 1634 LEAVE_SCOPE(oldsave);
1635 RETURN;
a0d0e21e 1636 }
71be2cbc 1637
e50aee73 1638 if (pregexec(rx, s, strend, orig, 0,
5f05dabc 1639 SvSCREAM(TARG) ? TARG : Nullsv, safebase)) {
a0d0e21e 1640 if (force_on_match) {
1641 force_on_match = 0;
1642 s = SvPV_force(TARG, len);
1643 goto force_it;
1644 }
71be2cbc 1645 rxtainted = rx->exec_tainted;
a0d0e21e 1646 dstr = NEWSV(25, sv_len(TARG));
1647 sv_setpvn(dstr, m, s-m);
1648 curpm = pm;
1649 if (!c) {
1650 register CONTEXT *cx;
1651 PUSHSUBST(cx);
1652 RETURNOP(cPMOP->op_pmreplroot);
1653 }
1654 do {
1655 if (iters++ > maxiters)
1656 DIE("Substitution loop");
71be2cbc 1657 rxtainted |= rx->exec_tainted;
a0d0e21e 1658 if (rx->subbase && rx->subbase != orig) {
1659 m = s;
1660 s = orig;
1661 orig = rx->subbase;
1662 s = orig + (m - s);
1663 strend = s + (strend - m);
1664 }
1665 m = rx->startp[0];
1666 sv_catpvn(dstr, s, m-s);
1667 s = rx->endp[0];
1668 if (clen)
1669 sv_catpvn(dstr, c, clen);
1670 if (once)
1671 break;
5f05dabc 1672 } while (pregexec(rx, s, strend, orig, s == m, Nullsv, safebase));
a0d0e21e 1673 sv_catpvn(dstr, s, strend - s);
748a9306 1674
9212bbba 1675 TAINT_IF(rxtainted);
1676
4633a7c4 1677 (void)SvOOK_off(TARG);
cb0b1708 1678 Safefree(SvPVX(TARG));
748a9306 1679 SvPVX(TARG) = SvPVX(dstr);
1680 SvCUR_set(TARG, SvCUR(dstr));
1681 SvLEN_set(TARG, SvLEN(dstr));
1682 SvPVX(dstr) = 0;
1683 sv_free(dstr);
1684
a0d0e21e 1685 (void)SvPOK_only(TARG);
1686 SvSETMAGIC(TARG);
9212bbba 1687 SvTAINT(TARG);
a0d0e21e 1688 PUSHs(sv_2mortal(newSViv((I32)iters)));
4633a7c4 1689 LEAVE_SCOPE(oldsave);
a0d0e21e 1690 RETURN;
1691 }
5cd24f17 1692 goto ret_no;
a0d0e21e 1693
1694nope:
1695 ++BmUSEFUL(pm->op_pmshort);
5cd24f17 1696
1697ret_no:
a0d0e21e 1698 PUSHs(&sv_no);
4633a7c4 1699 LEAVE_SCOPE(oldsave);
a0d0e21e 1700 RETURN;
1701}
1702
1703PP(pp_grepwhile)
1704{
1705 dSP;
1706
1707 if (SvTRUEx(POPs))
1708 stack_base[markstack_ptr[-1]++] = stack_base[*markstack_ptr];
1709 ++*markstack_ptr;
1710 LEAVE; /* exit inner scope */
1711
1712 /* All done yet? */
1713 if (stack_base + *markstack_ptr > sp) {
1714 I32 items;
54310121 1715 I32 gimme = GIMME_V;
a0d0e21e 1716
1717 LEAVE; /* exit outer scope */
1718 (void)POPMARK; /* pop src */
1719 items = --*markstack_ptr - markstack_ptr[-1];
1720 (void)POPMARK; /* pop dst */
1721 SP = stack_base + POPMARK; /* pop original mark */
54310121 1722 if (gimme == G_SCALAR) {
a0d0e21e 1723 dTARGET;
1724 XPUSHi(items);
a0d0e21e 1725 }
54310121 1726 else if (gimme == G_ARRAY)
1727 SP += items;
a0d0e21e 1728 RETURN;
1729 }
1730 else {
1731 SV *src;
1732
1733 ENTER; /* enter inner scope */
1734 SAVESPTR(curpm);
1735
1736 src = stack_base[*markstack_ptr];
1737 SvTEMP_off(src);
1738 GvSV(defgv) = src;
1739
1740 RETURNOP(cLOGOP->op_other);
1741 }
1742}
1743
1744PP(pp_leavesub)
1745{
1746 dSP;
1747 SV **mark;
1748 SV **newsp;
1749 PMOP *newpm;
1750 I32 gimme;
1751 register CONTEXT *cx;
f86702cc 1752 struct block_sub cxsub;
a0d0e21e 1753
1754 POPBLOCK(cx,newpm);
f86702cc 1755 POPSUB1(cx); /* Delay POPSUB2 until stack values are safe */
1756
a1f49e72 1757 TAINT_NOT;
a0d0e21e 1758 if (gimme == G_SCALAR) {
1759 MARK = newsp + 1;
1760 if (MARK <= SP)
f86702cc 1761 *MARK = SvTEMP(TOPs) ? TOPs : sv_mortalcopy(TOPs);
a0d0e21e 1762 else {
f86702cc 1763 MEXTEND(MARK, 0);
a0d0e21e 1764 *MARK = &sv_undef;
1765 }
1766 SP = MARK;
1767 }
54310121 1768 else if (gimme == G_ARRAY) {
f86702cc 1769 for (MARK = newsp + 1; MARK <= SP; MARK++) {
a1f49e72 1770 if (!SvTEMP(*MARK)) {
f86702cc 1771 *MARK = sv_mortalcopy(*MARK);
a1f49e72 1772 TAINT_NOT; /* Each item is independent */
1773 }
f86702cc 1774 }
a0d0e21e 1775 }
f86702cc 1776 PUTBACK;
1777
1778 POPSUB2(); /* Stack values are safe: release CV and @_ ... */
1779 curpm = newpm; /* ... and pop $1 et al */
a0d0e21e 1780
1781 LEAVE;
a0d0e21e 1782 return pop_return();
1783}
1784
1785PP(pp_entersub)
1786{
1787 dSP; dPOPss;
1788 GV *gv;
1789 HV *stash;
1790 register CV *cv;
1791 register CONTEXT *cx;
5d94fbed 1792 I32 gimme;
07055b4c 1793 bool hasargs = (op->op_flags & OPf_STACKED) != 0;
a0d0e21e 1794
1795 if (!sv)
1796 DIE("Not a CODE reference");
1797 switch (SvTYPE(sv)) {
1798 default:
1799 if (!SvROK(sv)) {
748a9306 1800 char *sym;
1801
a0d0e21e 1802 if (sv == &sv_yes) /* unfound import, ignore */
1803 RETURN;
15ff848f 1804 if (SvGMAGICAL(sv)) {
1805 mg_get(sv);
1806 sym = SvPOKp(sv) ? SvPVX(sv) : Nullch;
1807 }
1808 else
1809 sym = SvPV(sv, na);
1810 if (!sym)
a0d0e21e 1811 DIE(no_usym, "a subroutine");
1812 if (op->op_private & HINT_STRICT_REFS)
748a9306 1813 DIE(no_symref, sym, "a subroutine");
1814 cv = perl_get_cv(sym, TRUE);
a0d0e21e 1815 break;
1816 }
1817 cv = (CV*)SvRV(sv);
1818 if (SvTYPE(cv) == SVt_PVCV)
1819 break;
1820 /* FALL THROUGH */
1821 case SVt_PVHV:
1822 case SVt_PVAV:
1823 DIE("Not a CODE reference");
1824 case SVt_PVCV:
1825 cv = (CV*)sv;
1826 break;
1827 case SVt_PVGV:
8ebc5c01 1828 if (!(cv = GvCVu((GV*)sv)))
a0d0e21e 1829 cv = sv_2cv(sv, &stash, &gv, TRUE);
1830 break;
1831 }
1832
1833 ENTER;
1834 SAVETMPS;
1835
1836 retry:
1837 if (!cv)
1838 DIE("Not a CODE reference");
1839
1840 if (!CvROOT(cv) && !CvXSUB(cv)) {
44a8e56a 1841 GV* autogv;
1842 SV* subname;
1843
1844 /* anonymous or undef'd function leaves us no recourse */
1845 if (CvANON(cv) || !(gv = CvGV(cv)))
1846 DIE("Undefined subroutine called");
1847 /* autoloaded stub? */
1848 if (cv != GvCV(gv)) {
1849 cv = GvCV(gv);
1850 goto retry;
a0d0e21e 1851 }
44a8e56a 1852 /* should call AUTOLOAD now? */
54310121 1853 if ((autogv = gv_autoload4(GvSTASH(gv), GvNAME(gv), GvNAMELEN(gv),
1854 FALSE)))
1855 {
44a8e56a 1856 cv = GvCV(autogv);
1857 goto retry;
a0d0e21e 1858 }
44a8e56a 1859 /* sorry */
1860 subname = sv_newmortal();
1861 gv_efullname3(subname, gv, Nullch);
1862 DIE("Undefined subroutine &%s called", SvPVX(subname));
a0d0e21e 1863 }
1864
54310121 1865 gimme = GIMME_V;
28757baa 1866 if ((op->op_private & OPpENTERSUB_DB) && GvCV(DBsub) && !CvNODEBUG(cv)) {
71be2cbc 1867 SV *oldsv = sv;
a0d0e21e 1868 sv = GvSV(DBsub);
1869 save_item(sv);
67955e0c 1870 gv = CvGV(cv);
71be2cbc 1871 if ( (CvFLAGS(cv) & (CVf_ANON | CVf_CLONED))
1872 || strEQ(GvNAME(gv), "END")
1873 || ((GvCV(gv) != cv) && /* Could be imported, and old sub redefined. */
1874 !( (SvTYPE(oldsv) == SVt_PVGV) && (GvCV((GV*)oldsv) == cv)
1875 && (gv = (GV*)oldsv) ))) { /* Use GV from the stack as a fallback. */
1876 /* GV is potentially non-unique, or contain different CV. */
748a9306 1877 sv_setsv(sv, newRV((SV*)cv));
a5f75d66 1878 }
748a9306 1879 else {
4f732624 1880 gv_efullname3(sv, gv, Nullch);
748a9306 1881 }
a0d0e21e 1882 cv = GvCV(DBsub);
67955e0c 1883 if (CvXSUB(cv)) curcopdb = curcop;
a0d0e21e 1884 if (!cv)
1885 DIE("No DBsub routine");
1886 }
1887
11343788 1888#ifdef USE_THREADS
1889 MUTEX_LOCK(CvMUTEXP(cv));
1890 if (!CvCONDP(cv)) {
1891#ifdef DEBUGGING
1892 DEBUG_L((fprintf(stderr, "0x%lx entering fast %s\n",
1893 (unsigned long)thr, SvPEEK((SV*)cv))));
1894#endif /* DEBUGGING */
1895 MUTEX_UNLOCK(CvMUTEXP(cv)); /* fast sub wants neither sync nor clone */
1896 }
f93b4edd 1897 else if (SvFLAGS(cv) & SVp_SYNC) {
11343788 1898 /*
1899 * It's a synchronised CV. Wait until it's free unless
1900 * we own it already (in which case we're recursing).
1901 */
1902 if (CvOWNER(cv) && CvOWNER(cv) != thr) {
1903 do {
1904 DEBUG_L((fprintf(stderr, "0x%lx wait for 0x%lx to leave %s\n",
1905 (unsigned long)thr,(unsigned long)CvOWNER(cv),
1906 SvPEEK((SV*)cv))));
1907 COND_WAIT(CvCONDP(cv), CvMUTEXP(cv)); /* yawn */
1908 } while (CvOWNER(cv));
1909 }
1910 CvOWNER(cv) = thr; /* Assert ownership */
1911 SvREFCNT_inc(cv);
1912 MUTEX_UNLOCK(CvMUTEXP(cv));
1913 if (CvDEPTH(cv) == 0)
1914 SAVEDESTRUCTOR(unset_cvowner, (void*) cv);
1915 }
1916 else {
1917 /*
1918 * It's an ordinary unsynchronised CV so we must distinguish
1919 * three cases. (1) It's ours already (and we're recursing);
1920 * (2) it's free (but we may already be using a cached clone);
1921 * (3) another thread owns it. Case (1) is easy: we just use it.
1922 * Case (2) means we look for a clone--if we have one, use it
1923 * otherwise grab ownership of cv. Case (3) means look we for a
1924 * clone and have to create one if we don't already have one.
1925 * Why look for a clone in case (2) when we could just grab
1926 * ownership of cv straight away? Well, we could be recursing,
1927 * i.e. we originally tried to enter cv while another thread
1928 * owned it (hence we used a clone) but it has been freed up
1929 * and we're now recursing into it. It may or may not be "better"
1930 * to use the clone but at least CvDEPTH can be trusted.
1931 */
1932 if (CvOWNER(cv) == thr)
1933 MUTEX_UNLOCK(CvMUTEXP(cv));
1934 else {
1935 /* Case (2) or (3) */
1936 SV **svp;
1937
1938 /*
1939 * XXX Might it be better to release CvMUTEXP(cv) while we
1940 * do the hv_fetch? We might find someone has pinched it
1941 * when we look again, in which case we would be in case
1942 * (3) instead of (2) so we'd have to clone. Would the fact
1943 * that we released the mutex more quickly make up for this?
1944 */
1945 svp = hv_fetch(cvcache, (char *)cv, sizeof(cv), FALSE);
1946 if (svp) {
1947 /* We already have a clone to use */
1948 MUTEX_UNLOCK(CvMUTEXP(cv));
1949 cv = *(CV**)svp;
1950 DEBUG_L(fprintf(stderr,
1951 "entersub: 0x%lx already has clone 0x%lx:%s\n",
1952 (unsigned long) thr, (unsigned long) cv,
1953 SvPEEK((SV*)cv)));
1954 CvOWNER(cv) = thr;
1955 SvREFCNT_inc(cv);
1956 if (CvDEPTH(cv) == 0)
1957 SAVEDESTRUCTOR(unset_cvowner, (void*) cv);
1958 }
1959 else {
1960 /* (2) => grab ownership of cv. (3) => make clone */
1961 if (!CvOWNER(cv)) {
1962 CvOWNER(cv) = thr;
1963 SvREFCNT_inc(cv);
1964 MUTEX_UNLOCK(CvMUTEXP(cv));
1965 DEBUG_L(fprintf(stderr,
1966 "entersub: 0x%lx grabbing 0x%lx:%s\n",
1967 (unsigned long) thr, (unsigned long) cv,
1968 SvPEEK((SV*)cv)));
1969 } else {
1970 /* Make a new clone. */
1971 CV *clonecv;
1972 SvREFCNT_inc(cv); /* don't let it vanish from under us */
1973 MUTEX_UNLOCK(CvMUTEXP(cv));
1974 DEBUG_L((fprintf(stderr,
1975 "entersub: 0x%lx cloning 0x%lx:%s\n",
1976 (unsigned long) thr, (unsigned long) cv,
1977 SvPEEK((SV*)cv))));
1978 /*
1979 * We're creating a new clone so there's no race
1980 * between the original MUTEX_UNLOCK and the
1981 * SvREFCNT_inc since no one will be trying to undef
1982 * it out from underneath us. At least, I don't think
1983 * there's a race...
1984 */
1985 clonecv = cv_clone(cv);
1986 SvREFCNT_dec(cv); /* finished with this */
1987 hv_store(cvcache, (char*)cv, sizeof(cv), (SV*)clonecv,0);
1988 CvOWNER(clonecv) = thr;
1989 cv = clonecv;
1990 SvREFCNT_inc(cv);
1991 }
1992 assert(CvDEPTH(cv) == 0);
1993 SAVEDESTRUCTOR(unset_cvowner, (void*) cv);
1994 }
1995 }
1996 }
1997#endif /* USE_THREADS */
1998
1999 gimme = GIMME;
2000
a0d0e21e 2001 if (CvXSUB(cv)) {
2002 if (CvOLDSTYLE(cv)) {
ecfc5424 2003 I32 (*fp3)_((int,int,int));
a0d0e21e 2004 dMARK;
2005 register I32 items = SP - MARK;
67955e0c 2006 /* We dont worry to copy from @_. */
a0d0e21e 2007 while (sp > mark) {
2008 sp[1] = sp[0];
2009 sp--;
2010 }
2011 stack_sp = mark + 1;
ecfc5424 2012 fp3 = (I32(*)_((int,int,int)))CvXSUB(cv);
2013 items = (*fp3)(CvXSUBANY(cv).any_i32,
2014 MARK - stack_base + 1,
2015 items);
a0d0e21e 2016 stack_sp = stack_base + items;
2017 }
2018 else {
748a9306 2019 I32 markix = TOPMARK;
2020
a0d0e21e 2021 PUTBACK;
67955e0c 2022
2023 if (!hasargs) {
2024 /* Need to copy @_ to stack. Alternative may be to
2025 * switch stack to @_, and copy return values
2026 * back. This would allow popping @_ in XSUB, e.g.. XXXX */
2027 AV* av = GvAV(defgv);
2028 I32 items = AvFILL(av) + 1;
2029
2030 if (items) {
2031 /* Mark is at the end of the stack. */
2032 EXTEND(sp, items);
2033 Copy(AvARRAY(av), sp + 1, items, SV*);
2034 sp += items;
2035 PUTBACK ;
2036 }
2037 }
2038 if (curcopdb) { /* We assume that the first
2039 XSUB in &DB::sub is the
2040 called one. */
2041 SAVESPTR(curcop);
2042 curcop = curcopdb;
2043 curcopdb = NULL;
2044 }
2045 /* Do we need to open block here? XXXX */
a0d0e21e 2046 (void)(*CvXSUB(cv))(cv);
748a9306 2047
2048 /* Enforce some sanity in scalar context. */
5d94fbed 2049 if (gimme == G_SCALAR && ++markix != stack_sp - stack_base ) {
748a9306 2050 if (markix > stack_sp - stack_base)
2051 *(stack_base + markix) = &sv_undef;
2052 else
2053 *(stack_base + markix) = *stack_sp;
2054 stack_sp = stack_base + markix;
2055 }
a0d0e21e 2056 }
2057 LEAVE;
2058 return NORMAL;
2059 }
2060 else {
2061 dMARK;
2062 register I32 items = SP - MARK;
a0d0e21e 2063 AV* padlist = CvPADLIST(cv);
2064 SV** svp = AvARRAY(padlist);
2065 push_return(op->op_next);
2066 PUSHBLOCK(cx, CXt_SUB, MARK);
2067 PUSHSUB(cx);
2068 CvDEPTH(cv)++;
2069 if (CvDEPTH(cv) < 2)
2070 (void)SvREFCNT_inc(cv);
2071 else { /* save temporaries on recursion? */
5f05dabc 2072 if (CvDEPTH(cv) == 100 && dowarn
44a8e56a 2073 && !(perldb && cv == GvCV(DBsub)))
2074 sub_crush_depth(cv);
a0d0e21e 2075 if (CvDEPTH(cv) > AvFILL(padlist)) {
2076 AV *av;
2077 AV *newpad = newAV();
4aa0a1f7 2078 SV **oldpad = AvARRAY(svp[CvDEPTH(cv)-1]);
a0d0e21e 2079 I32 ix = AvFILL((AV*)svp[1]);
2080 svp = AvARRAY(svp[0]);
748a9306 2081 for ( ;ix > 0; ix--) {
a0d0e21e 2082 if (svp[ix] != &sv_undef) {
748a9306 2083 char *name = SvPVX(svp[ix]);
5f05dabc 2084 if ((SvFLAGS(svp[ix]) & SVf_FAKE) /* outer lexical? */
2085 || *name == '&') /* anonymous code? */
2086 {
2087 av_store(newpad, ix, SvREFCNT_inc(oldpad[ix]));
748a9306 2088 }
2089 else { /* our own lexical */
2090 if (*name == '@')
2091 av_store(newpad, ix, sv = (SV*)newAV());
2092 else if (*name == '%')
2093 av_store(newpad, ix, sv = (SV*)newHV());
2094 else
2095 av_store(newpad, ix, sv = NEWSV(0,0));
2096 SvPADMY_on(sv);
2097 }
a0d0e21e 2098 }
2099 else {
748a9306 2100 av_store(newpad, ix, sv = NEWSV(0,0));
a0d0e21e 2101 SvPADTMP_on(sv);
2102 }
2103 }
2104 av = newAV(); /* will be @_ */
2105 av_extend(av, 0);
2106 av_store(newpad, 0, (SV*)av);
2107 AvFLAGS(av) = AVf_REIFY;
2108 av_store(padlist, CvDEPTH(cv), (SV*)newpad);
2109 AvFILL(padlist) = CvDEPTH(cv);
2110 svp = AvARRAY(padlist);
2111 }
2112 }
2113 SAVESPTR(curpad);
2114 curpad = AvARRAY((AV*)svp[CvDEPTH(cv)]);
2115 if (hasargs) {
2116 AV* av = (AV*)curpad[0];
2117 SV** ary;
2118
2119 if (AvREAL(av)) {
2120 av_clear(av);
2121 AvREAL_off(av);
2122 }
2123 cx->blk_sub.savearray = GvAV(defgv);
2124 cx->blk_sub.argarray = av;
0c8c7a05 2125 GvAV(defgv) = (AV*)SvREFCNT_inc(av);
a0d0e21e 2126 ++MARK;
2127
2128 if (items > AvMAX(av) + 1) {
2129 ary = AvALLOC(av);
2130 if (AvARRAY(av) != ary) {
2131 AvMAX(av) += AvARRAY(av) - AvALLOC(av);
2132 SvPVX(av) = (char*)ary;
2133 }
2134 if (items > AvMAX(av) + 1) {
2135 AvMAX(av) = items - 1;
2136 Renew(ary,items,SV*);
2137 AvALLOC(av) = ary;
2138 SvPVX(av) = (char*)ary;
2139 }
2140 }
2141 Copy(MARK,AvARRAY(av),items,SV*);
2142 AvFILL(av) = items - 1;
2143
2144 while (items--) {
2145 if (*MARK)
2146 SvTEMP_off(*MARK);
2147 MARK++;
2148 }
2149 }
2150 RETURNOP(CvSTART(cv));
2151 }
2152}
2153
44a8e56a 2154void
2155sub_crush_depth(cv)
2156CV* cv;
2157{
2158 if (CvANON(cv))
2159 warn("Deep recursion on anonymous subroutine");
2160 else {
2161 SV* tmpstr = sv_newmortal();
2162 gv_efullname3(tmpstr, CvGV(cv), Nullch);
2163 warn("Deep recursion on subroutine \"%s\"", SvPVX(tmpstr));
2164 }
2165}
2166
a0d0e21e 2167PP(pp_aelem)
2168{
2169 dSP;
2170 SV** svp;
748a9306 2171 I32 elem = POPi;
68dc0745 2172 AV* av = (AV*)POPs;
2173 U32 lval = op->op_flags & OPf_MOD;
2174 U32 defer = (op->op_private & OPpLVAL_DEFER) && (elem > AvFILL(av));
a0d0e21e 2175
748a9306 2176 if (elem > 0)
2177 elem -= curcop->cop_arybase;
a0d0e21e 2178 if (SvTYPE(av) != SVt_PVAV)
2179 RETPUSHUNDEF;
68dc0745 2180 svp = av_fetch(av, elem, lval && !defer);
a0d0e21e 2181 if (lval) {
68dc0745 2182 if (!svp || *svp == &sv_undef) {
2183 SV* lv;
2184 if (!defer)
2185 DIE(no_aelem, elem);
2186 lv = sv_newmortal();
2187 sv_upgrade(lv, SVt_PVLV);
2188 LvTYPE(lv) = 'y';
2189 sv_magic(lv, Nullsv, 'y', Nullch, 0);
2190 LvTARG(lv) = SvREFCNT_inc(av);
2191 LvTARGOFF(lv) = elem;
2192 LvTARGLEN(lv) = 1;
2193 PUSHs(lv);
2194 RETURN;
2195 }
a0d0e21e 2196 if (op->op_private & OPpLVAL_INTRO)
2197 save_svref(svp);
5f05dabc 2198 else if (op->op_private & OPpDEREF)
68dc0745 2199 vivify_ref(*svp, op->op_private & OPpDEREF);
a0d0e21e 2200 }
2201 PUSHs(svp ? *svp : &sv_undef);
2202 RETURN;
2203}
2204
02a9e968 2205void
68dc0745 2206vivify_ref(sv, to_what)
02a9e968 2207SV* sv;
68dc0745 2208U32 to_what;
02a9e968 2209{
2210 if (SvGMAGICAL(sv))
2211 mg_get(sv);
2212 if (!SvOK(sv)) {
2213 if (SvREADONLY(sv))
2214 croak(no_modify);
5f05dabc 2215 if (SvTYPE(sv) < SVt_RV)
2216 sv_upgrade(sv, SVt_RV);
2217 else if (SvTYPE(sv) >= SVt_PV) {
2218 (void)SvOOK_off(sv);
2219 Safefree(SvPVX(sv));
2220 SvLEN(sv) = SvCUR(sv) = 0;
2221 }
68dc0745 2222 switch (to_what) {
5f05dabc 2223 case OPpDEREF_SV:
2224 SvRV(sv) = newSV(0);
2225 break;
2226 case OPpDEREF_AV:
2227 SvRV(sv) = (SV*)newAV();
2228 break;
2229 case OPpDEREF_HV:
2230 SvRV(sv) = (SV*)newHV();
2231 break;
2232 }
02a9e968 2233 SvROK_on(sv);
2234 SvSETMAGIC(sv);
2235 }
2236}
2237
a0d0e21e 2238PP(pp_method)
2239{
2240 dSP;
2241 SV* sv;
2242 SV* ob;
2243 GV* gv;
56304f61 2244 HV* stash;
2245 char* name;
ac91690f 2246 char* packname;
2247 STRLEN packlen;
a0d0e21e 2248
56304f61 2249 name = SvPV(TOPs, na);
a0d0e21e 2250 sv = *(stack_base + TOPMARK + 1);
2251
16d20bd9 2252 if (SvGMAGICAL(sv))
2253 mg_get(sv);
a0d0e21e 2254 if (SvROK(sv))
16d20bd9 2255 ob = (SV*)SvRV(sv);
a0d0e21e 2256 else {
2257 GV* iogv;
a0d0e21e 2258
56304f61 2259 packname = Nullch;
a0d0e21e 2260 if (!SvOK(sv) ||
56304f61 2261 !(packname = SvPV(sv, packlen)) ||
a0d0e21e 2262 !(iogv = gv_fetchpv(packname, FALSE, SVt_PVIO)) ||
2263 !(ob=(SV*)GvIO(iogv)))
2264 {
56304f61 2265 if (!packname || !isIDFIRST(*packname))
ac91690f 2266 DIE("Can't call method \"%s\" without a package or object reference", name);
56304f61 2267 stash = gv_stashpvn(packname, packlen, TRUE);
ac91690f 2268 goto fetch;
a0d0e21e 2269 }
ac91690f 2270 *(stack_base + TOPMARK + 1) = sv_2mortal(newRV((SV*)iogv));
a0d0e21e 2271 }
2272
ac91690f 2273 if (!ob || !SvOBJECT(ob))
a0d0e21e 2274 DIE("Can't call method \"%s\" on unblessed reference", name);
a0d0e21e 2275
56304f61 2276 stash = SvSTASH(ob);
a0d0e21e 2277
ac91690f 2278 fetch:
ac91690f 2279 gv = gv_fetchmethod(stash, name);
56304f61 2280 if (!gv) {
2281 char* leaf = name;
2282 char* sep = Nullch;
2283 char* p;
2284
2285 for (p = name; *p; p++) {
2286 if (*p == '\'')
2287 sep = p, leaf = p + 1;
2288 else if (*p == ':' && *(p + 1) == ':')
2289 sep = p, leaf = p + 2;
2290 }
2291 if (!sep || ((sep - name) == 5 && strnEQ(name, "SUPER", 5))) {
2292 packname = HvNAME(sep ? curcop->cop_stash : stash);
2293 packlen = strlen(packname);
2294 }
2295 else {
2296 packname = name;
2297 packlen = sep - name;
2298 }
2299 DIE("Can't locate object method \"%s\" via package \"%.*s\"",
2300 leaf, (int)packlen, packname);
2301 }
8ebc5c01 2302 SETs(isGV(gv) ? (SV*)GvCV(gv) : (SV*)gv);
a0d0e21e 2303 RETURN;
2304}