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