This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Update Test::Harness 3.36 -> 3.38
[perl5.git] / pp.c
... / ...
CommitLineData
1/* pp.c
2 *
3 * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
4 * 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 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 * 'It's a big house this, and very peculiar. Always a bit more
13 * to discover, and no knowing what you'll find round a corner.
14 * And Elves, sir!' --Samwise Gamgee
15 *
16 * [p.225 of _The Lord of the Rings_, II/i: "Many Meetings"]
17 */
18
19/* This file contains general pp ("push/pop") functions that execute the
20 * opcodes that make up a perl program. A typical pp function expects to
21 * find its arguments on the stack, and usually pushes its results onto
22 * the stack, hence the 'pp' terminology. Each OP structure contains
23 * a pointer to the relevant pp_foo() function.
24 */
25
26#include "EXTERN.h"
27#define PERL_IN_PP_C
28#include "perl.h"
29#include "keywords.h"
30
31#include "reentr.h"
32#include "regcharclass.h"
33
34/* XXX I can't imagine anyone who doesn't have this actually _needs_
35 it, since pid_t is an integral type.
36 --AD 2/20/1998
37*/
38#ifdef NEED_GETPID_PROTO
39extern Pid_t getpid (void);
40#endif
41
42/*
43 * Some BSDs and Cygwin default to POSIX math instead of IEEE.
44 * This switches them over to IEEE.
45 */
46#if defined(LIBM_LIB_VERSION)
47 _LIB_VERSION_TYPE _LIB_VERSION = _IEEE_;
48#endif
49
50static const STRLEN small_mu_len = sizeof(GREEK_SMALL_LETTER_MU_UTF8) - 1;
51static const STRLEN capital_iota_len = sizeof(GREEK_CAPITAL_LETTER_IOTA_UTF8) - 1;
52
53/* variations on pp_null */
54
55PP(pp_stub)
56{
57 dSP;
58 if (GIMME_V == G_SCALAR)
59 XPUSHs(&PL_sv_undef);
60 RETURN;
61}
62
63/* Pushy stuff. */
64
65/* This is also called directly by pp_lvavref. */
66PP(pp_padav)
67{
68 dSP; dTARGET;
69 U8 gimme;
70 assert(SvTYPE(TARG) == SVt_PVAV);
71 if (UNLIKELY( PL_op->op_private & OPpLVAL_INTRO ))
72 if (LIKELY( !(PL_op->op_private & OPpPAD_STATE) ))
73 SAVECLEARSV(PAD_SVl(PL_op->op_targ));
74 EXTEND(SP, 1);
75
76 if (PL_op->op_flags & OPf_REF) {
77 PUSHs(TARG);
78 RETURN;
79 }
80 else if (PL_op->op_private & OPpMAYBE_LVSUB) {
81 const I32 flags = is_lvalue_sub();
82 if (flags && !(flags & OPpENTERSUB_INARGS)) {
83 if (GIMME_V == G_SCALAR)
84 /* diag_listed_as: Can't return %s to lvalue scalar context */
85 Perl_croak(aTHX_ "Can't return array to lvalue scalar context");
86 PUSHs(TARG);
87 RETURN;
88 }
89 }
90
91 gimme = GIMME_V;
92 if (gimme == G_ARRAY) {
93 /* XXX see also S_pushav in pp_hot.c */
94 const SSize_t maxarg = AvFILL(MUTABLE_AV(TARG)) + 1;
95 EXTEND(SP, maxarg);
96 if (SvMAGICAL(TARG)) {
97 SSize_t i;
98 for (i=0; i < maxarg; i++) {
99 SV * const * const svp = av_fetch(MUTABLE_AV(TARG), i, FALSE);
100 SP[i+1] = (svp) ? *svp : &PL_sv_undef;
101 }
102 }
103 else {
104 SSize_t i;
105 for (i=0; i < maxarg; i++) {
106 SV * const sv = AvARRAY((const AV *)TARG)[i];
107 SP[i+1] = sv ? sv : &PL_sv_undef;
108 }
109 }
110 SP += maxarg;
111 }
112 else if (gimme == G_SCALAR) {
113 SV* const sv = sv_newmortal();
114 const SSize_t maxarg = AvFILL(MUTABLE_AV(TARG)) + 1;
115 sv_setiv(sv, maxarg);
116 PUSHs(sv);
117 }
118 RETURN;
119}
120
121PP(pp_padhv)
122{
123 dSP; dTARGET;
124 U8 gimme;
125
126 assert(SvTYPE(TARG) == SVt_PVHV);
127 XPUSHs(TARG);
128 if (UNLIKELY( PL_op->op_private & OPpLVAL_INTRO ))
129 if (LIKELY( !(PL_op->op_private & OPpPAD_STATE) ))
130 SAVECLEARSV(PAD_SVl(PL_op->op_targ));
131
132 if (PL_op->op_flags & OPf_REF)
133 RETURN;
134 else if (PL_op->op_private & OPpMAYBE_LVSUB) {
135 const I32 flags = is_lvalue_sub();
136 if (flags && !(flags & OPpENTERSUB_INARGS)) {
137 if (GIMME_V == G_SCALAR)
138 /* diag_listed_as: Can't return %s to lvalue scalar context */
139 Perl_croak(aTHX_ "Can't return hash to lvalue scalar context");
140 RETURN;
141 }
142 }
143
144 gimme = GIMME_V;
145 if (gimme == G_ARRAY) {
146 RETURNOP(Perl_do_kv(aTHX));
147 }
148 else if ((PL_op->op_private & OPpTRUEBOOL
149 || ( PL_op->op_private & OPpMAYBE_TRUEBOOL
150 && block_gimme() == G_VOID ))
151 && (!SvRMAGICAL(TARG) || !mg_find(TARG, PERL_MAGIC_tied))
152 )
153 SETs(HvUSEDKEYS(TARG) ? &PL_sv_yes : &PL_sv_no);
154 else if (gimme == G_SCALAR) {
155 SV* const sv = Perl_hv_scalar(aTHX_ MUTABLE_HV(TARG));
156 SETs(sv);
157 }
158 RETURN;
159}
160
161PP(pp_padcv)
162{
163 dSP; dTARGET;
164 assert(SvTYPE(TARG) == SVt_PVCV);
165 XPUSHs(TARG);
166 RETURN;
167}
168
169PP(pp_introcv)
170{
171 dTARGET;
172 SvPADSTALE_off(TARG);
173 return NORMAL;
174}
175
176PP(pp_clonecv)
177{
178 dTARGET;
179 CV * const protocv = PadnamePROTOCV(
180 PadlistNAMESARRAY(CvPADLIST(find_runcv(NULL)))[ARGTARG]
181 );
182 assert(SvTYPE(TARG) == SVt_PVCV);
183 assert(protocv);
184 if (CvISXSUB(protocv)) { /* constant */
185 /* XXX Should we clone it here? */
186 /* If this changes to use SAVECLEARSV, we can move the SAVECLEARSV
187 to introcv and remove the SvPADSTALE_off. */
188 SAVEPADSVANDMORTALIZE(ARGTARG);
189 PAD_SVl(ARGTARG) = SvREFCNT_inc_simple_NN(protocv);
190 }
191 else {
192 if (CvROOT(protocv)) {
193 assert(CvCLONE(protocv));
194 assert(!CvCLONED(protocv));
195 }
196 cv_clone_into(protocv,(CV *)TARG);
197 SAVECLEARSV(PAD_SVl(ARGTARG));
198 }
199 return NORMAL;
200}
201
202/* Translations. */
203
204/* In some cases this function inspects PL_op. If this function is called
205 for new op types, more bool parameters may need to be added in place of
206 the checks.
207
208 When noinit is true, the absence of a gv will cause a retval of undef.
209 This is unrelated to the cv-to-gv assignment case.
210*/
211
212static SV *
213S_rv2gv(pTHX_ SV *sv, const bool vivify_sv, const bool strict,
214 const bool noinit)
215{
216 if (!isGV(sv) || SvFAKE(sv)) SvGETMAGIC(sv);
217 if (SvROK(sv)) {
218 if (SvAMAGIC(sv)) {
219 sv = amagic_deref_call(sv, to_gv_amg);
220 }
221 wasref:
222 sv = SvRV(sv);
223 if (SvTYPE(sv) == SVt_PVIO) {
224 GV * const gv = MUTABLE_GV(sv_newmortal());
225 gv_init(gv, 0, "__ANONIO__", 10, 0);
226 GvIOp(gv) = MUTABLE_IO(sv);
227 SvREFCNT_inc_void_NN(sv);
228 sv = MUTABLE_SV(gv);
229 }
230 else if (!isGV_with_GP(sv)) {
231 Perl_die(aTHX_ "Not a GLOB reference");
232 }
233 }
234 else {
235 if (!isGV_with_GP(sv)) {
236 if (!SvOK(sv)) {
237 /* If this is a 'my' scalar and flag is set then vivify
238 * NI-S 1999/05/07
239 */
240 if (vivify_sv && sv != &PL_sv_undef) {
241 GV *gv;
242 if (SvREADONLY(sv))
243 Perl_croak_no_modify();
244 if (cUNOP->op_targ) {
245 SV * const namesv = PAD_SV(cUNOP->op_targ);
246 HV *stash = CopSTASH(PL_curcop);
247 if (SvTYPE(stash) != SVt_PVHV) stash = NULL;
248 gv = MUTABLE_GV(newSV(0));
249 gv_init_sv(gv, stash, namesv, 0);
250 }
251 else {
252 const char * const name = CopSTASHPV(PL_curcop);
253 gv = newGVgen_flags(name,
254 HvNAMEUTF8(CopSTASH(PL_curcop)) ? SVf_UTF8 : 0 );
255 SvREFCNT_inc_simple_void_NN(gv);
256 }
257 prepare_SV_for_RV(sv);
258 SvRV_set(sv, MUTABLE_SV(gv));
259 SvROK_on(sv);
260 SvSETMAGIC(sv);
261 goto wasref;
262 }
263 if (PL_op->op_flags & OPf_REF || strict) {
264 Perl_die(aTHX_ PL_no_usym, "a symbol");
265 }
266 if (ckWARN(WARN_UNINITIALIZED))
267 report_uninit(sv);
268 return &PL_sv_undef;
269 }
270 if (noinit)
271 {
272 if (!(sv = MUTABLE_SV(gv_fetchsv_nomg(
273 sv, GV_ADDMG, SVt_PVGV
274 ))))
275 return &PL_sv_undef;
276 }
277 else {
278 if (strict) {
279 Perl_die(aTHX_
280 PL_no_symref_sv,
281 sv,
282 (SvPOKp(sv) && SvCUR(sv)>32 ? "..." : ""),
283 "a symbol"
284 );
285 }
286 if ((PL_op->op_private & (OPpLVAL_INTRO|OPpDONT_INIT_GV))
287 == OPpDONT_INIT_GV) {
288 /* We are the target of a coderef assignment. Return
289 the scalar unchanged, and let pp_sasssign deal with
290 things. */
291 return sv;
292 }
293 sv = MUTABLE_SV(gv_fetchsv_nomg(sv, GV_ADD, SVt_PVGV));
294 }
295 /* FAKE globs in the symbol table cause weird bugs (#77810) */
296 SvFAKE_off(sv);
297 }
298 }
299 if (SvFAKE(sv) && !(PL_op->op_private & OPpALLOW_FAKE)) {
300 SV *newsv = sv_newmortal();
301 sv_setsv_flags(newsv, sv, 0);
302 SvFAKE_off(newsv);
303 sv = newsv;
304 }
305 return sv;
306}
307
308PP(pp_rv2gv)
309{
310 dSP; dTOPss;
311
312 sv = S_rv2gv(aTHX_
313 sv, PL_op->op_private & OPpDEREF,
314 PL_op->op_private & HINT_STRICT_REFS,
315 ((PL_op->op_flags & OPf_SPECIAL) && !(PL_op->op_flags & OPf_MOD))
316 || PL_op->op_type == OP_READLINE
317 );
318 if (PL_op->op_private & OPpLVAL_INTRO)
319 save_gp(MUTABLE_GV(sv), !(PL_op->op_flags & OPf_SPECIAL));
320 SETs(sv);
321 RETURN;
322}
323
324/* Helper function for pp_rv2sv and pp_rv2av */
325GV *
326Perl_softref2xv(pTHX_ SV *const sv, const char *const what,
327 const svtype type, SV ***spp)
328{
329 GV *gv;
330
331 PERL_ARGS_ASSERT_SOFTREF2XV;
332
333 if (PL_op->op_private & HINT_STRICT_REFS) {
334 if (SvOK(sv))
335 Perl_die(aTHX_ PL_no_symref_sv, sv,
336 (SvPOKp(sv) && SvCUR(sv)>32 ? "..." : ""), what);
337 else
338 Perl_die(aTHX_ PL_no_usym, what);
339 }
340 if (!SvOK(sv)) {
341 if (
342 PL_op->op_flags & OPf_REF
343 )
344 Perl_die(aTHX_ PL_no_usym, what);
345 if (ckWARN(WARN_UNINITIALIZED))
346 report_uninit(sv);
347 if (type != SVt_PV && GIMME_V == G_ARRAY) {
348 (*spp)--;
349 return NULL;
350 }
351 **spp = &PL_sv_undef;
352 return NULL;
353 }
354 if ((PL_op->op_flags & OPf_SPECIAL) &&
355 !(PL_op->op_flags & OPf_MOD))
356 {
357 if (!(gv = gv_fetchsv_nomg(sv, GV_ADDMG, type)))
358 {
359 **spp = &PL_sv_undef;
360 return NULL;
361 }
362 }
363 else {
364 gv = gv_fetchsv_nomg(sv, GV_ADD, type);
365 }
366 return gv;
367}
368
369PP(pp_rv2sv)
370{
371 dSP; dTOPss;
372 GV *gv = NULL;
373
374 SvGETMAGIC(sv);
375 if (SvROK(sv)) {
376 if (SvAMAGIC(sv)) {
377 sv = amagic_deref_call(sv, to_sv_amg);
378 }
379
380 sv = SvRV(sv);
381 if (SvTYPE(sv) >= SVt_PVAV)
382 DIE(aTHX_ "Not a SCALAR reference");
383 }
384 else {
385 gv = MUTABLE_GV(sv);
386
387 if (!isGV_with_GP(gv)) {
388 gv = Perl_softref2xv(aTHX_ sv, "a SCALAR", SVt_PV, &sp);
389 if (!gv)
390 RETURN;
391 }
392 sv = GvSVn(gv);
393 }
394 if (PL_op->op_flags & OPf_MOD) {
395 if (PL_op->op_private & OPpLVAL_INTRO) {
396 if (cUNOP->op_first->op_type == OP_NULL)
397 sv = save_scalar(MUTABLE_GV(TOPs));
398 else if (gv)
399 sv = save_scalar(gv);
400 else
401 Perl_croak(aTHX_ "%s", PL_no_localize_ref);
402 }
403 else if (PL_op->op_private & OPpDEREF)
404 sv = vivify_ref(sv, PL_op->op_private & OPpDEREF);
405 }
406 SETs(sv);
407 RETURN;
408}
409
410PP(pp_av2arylen)
411{
412 dSP;
413 AV * const av = MUTABLE_AV(TOPs);
414 const I32 lvalue = PL_op->op_flags & OPf_MOD || LVRET;
415 if (lvalue) {
416 SV ** const svp = Perl_av_arylen_p(aTHX_ MUTABLE_AV(av));
417 if (!*svp) {
418 *svp = newSV_type(SVt_PVMG);
419 sv_magic(*svp, MUTABLE_SV(av), PERL_MAGIC_arylen, NULL, 0);
420 }
421 SETs(*svp);
422 } else {
423 SETs(sv_2mortal(newSViv(AvFILL(MUTABLE_AV(av)))));
424 }
425 RETURN;
426}
427
428PP(pp_pos)
429{
430 dSP; dTOPss;
431
432 if (PL_op->op_flags & OPf_MOD || LVRET) {
433 SV * const ret = sv_2mortal(newSV_type(SVt_PVLV));/* Not TARG RT#67838 */
434 sv_magic(ret, NULL, PERL_MAGIC_pos, NULL, 0);
435 LvTYPE(ret) = '.';
436 LvTARG(ret) = SvREFCNT_inc_simple(sv);
437 SETs(ret); /* no SvSETMAGIC */
438 }
439 else {
440 const MAGIC * const mg = mg_find_mglob(sv);
441 if (mg && mg->mg_len != -1) {
442 dTARGET;
443 STRLEN i = mg->mg_len;
444 if (mg->mg_flags & MGf_BYTES && DO_UTF8(sv))
445 i = sv_pos_b2u_flags(sv, i, SV_GMAGIC|SV_CONST_RETURN);
446 SETu(i);
447 return NORMAL;
448 }
449 SETs(&PL_sv_undef);
450 }
451 return NORMAL;
452}
453
454PP(pp_rv2cv)
455{
456 dSP;
457 GV *gv;
458 HV *stash_unused;
459 const I32 flags = (PL_op->op_flags & OPf_SPECIAL)
460 ? GV_ADDMG
461 : ((PL_op->op_private & (OPpLVAL_INTRO|OPpMAY_RETURN_CONSTANT))
462 == OPpMAY_RETURN_CONSTANT)
463 ? GV_ADD|GV_NOEXPAND
464 : GV_ADD;
465 /* We usually try to add a non-existent subroutine in case of AUTOLOAD. */
466 /* (But not in defined().) */
467
468 CV *cv = sv_2cv(TOPs, &stash_unused, &gv, flags);
469 if (cv) NOOP;
470 else if ((flags == (GV_ADD|GV_NOEXPAND)) && gv && SvROK(gv)) {
471 cv = SvTYPE(SvRV(gv)) == SVt_PVCV
472 ? MUTABLE_CV(SvRV(gv))
473 : MUTABLE_CV(gv);
474 }
475 else
476 cv = MUTABLE_CV(&PL_sv_undef);
477 SETs(MUTABLE_SV(cv));
478 return NORMAL;
479}
480
481PP(pp_prototype)
482{
483 dSP;
484 CV *cv;
485 HV *stash;
486 GV *gv;
487 SV *ret = &PL_sv_undef;
488
489 if (SvGMAGICAL(TOPs)) SETs(sv_mortalcopy(TOPs));
490 if (SvPOK(TOPs) && SvCUR(TOPs) >= 7) {
491 const char * s = SvPVX_const(TOPs);
492 if (strnEQ(s, "CORE::", 6)) {
493 const int code = keyword(s + 6, SvCUR(TOPs) - 6, 1);
494 if (!code)
495 DIE(aTHX_ "Can't find an opnumber for \"%" UTF8f "\"",
496 UTF8fARG(SvFLAGS(TOPs) & SVf_UTF8, SvCUR(TOPs)-6, s+6));
497 {
498 SV * const sv = core_prototype(NULL, s + 6, code, NULL);
499 if (sv) ret = sv;
500 }
501 goto set;
502 }
503 }
504 cv = sv_2cv(TOPs, &stash, &gv, 0);
505 if (cv && SvPOK(cv))
506 ret = newSVpvn_flags(
507 CvPROTO(cv), CvPROTOLEN(cv), SVs_TEMP | SvUTF8(cv)
508 );
509 set:
510 SETs(ret);
511 RETURN;
512}
513
514PP(pp_anoncode)
515{
516 dSP;
517 CV *cv = MUTABLE_CV(PAD_SV(PL_op->op_targ));
518 if (CvCLONE(cv))
519 cv = MUTABLE_CV(sv_2mortal(MUTABLE_SV(cv_clone(cv))));
520 EXTEND(SP,1);
521 PUSHs(MUTABLE_SV(cv));
522 RETURN;
523}
524
525PP(pp_srefgen)
526{
527 dSP;
528 *SP = refto(*SP);
529 return NORMAL;
530}
531
532PP(pp_refgen)
533{
534 dSP; dMARK;
535 if (GIMME_V != G_ARRAY) {
536 if (++MARK <= SP)
537 *MARK = *SP;
538 else
539 {
540 MEXTEND(SP, 1);
541 *MARK = &PL_sv_undef;
542 }
543 *MARK = refto(*MARK);
544 SP = MARK;
545 RETURN;
546 }
547 EXTEND_MORTAL(SP - MARK);
548 while (++MARK <= SP)
549 *MARK = refto(*MARK);
550 RETURN;
551}
552
553STATIC SV*
554S_refto(pTHX_ SV *sv)
555{
556 SV* rv;
557
558 PERL_ARGS_ASSERT_REFTO;
559
560 if (SvTYPE(sv) == SVt_PVLV && LvTYPE(sv) == 'y') {
561 if (LvTARGLEN(sv))
562 vivify_defelem(sv);
563 if (!(sv = LvTARG(sv)))
564 sv = &PL_sv_undef;
565 else
566 SvREFCNT_inc_void_NN(sv);
567 }
568 else if (SvTYPE(sv) == SVt_PVAV) {
569 if (!AvREAL((const AV *)sv) && AvREIFY((const AV *)sv))
570 av_reify(MUTABLE_AV(sv));
571 SvTEMP_off(sv);
572 SvREFCNT_inc_void_NN(sv);
573 }
574 else if (SvPADTMP(sv)) {
575 sv = newSVsv(sv);
576 }
577 else {
578 SvTEMP_off(sv);
579 SvREFCNT_inc_void_NN(sv);
580 }
581 rv = sv_newmortal();
582 sv_upgrade(rv, SVt_IV);
583 SvRV_set(rv, sv);
584 SvROK_on(rv);
585 return rv;
586}
587
588PP(pp_ref)
589{
590 dSP;
591 SV * const sv = TOPs;
592
593 SvGETMAGIC(sv);
594 if (!SvROK(sv))
595 SETs(&PL_sv_no);
596 else {
597 dTARGET;
598 SETs(TARG);
599 /* use the return value that is in a register, its the same as TARG */
600 TARG = sv_ref(TARG,SvRV(sv),TRUE);
601 SvSETMAGIC(TARG);
602 }
603
604 return NORMAL;
605}
606
607PP(pp_bless)
608{
609 dSP;
610 HV *stash;
611
612 if (MAXARG == 1)
613 {
614 curstash:
615 stash = CopSTASH(PL_curcop);
616 if (SvTYPE(stash) != SVt_PVHV)
617 Perl_croak(aTHX_ "Attempt to bless into a freed package");
618 }
619 else {
620 SV * const ssv = POPs;
621 STRLEN len;
622 const char *ptr;
623
624 if (!ssv) goto curstash;
625 SvGETMAGIC(ssv);
626 if (SvROK(ssv)) {
627 if (!SvAMAGIC(ssv)) {
628 frog:
629 Perl_croak(aTHX_ "Attempt to bless into a reference");
630 }
631 /* SvAMAGIC is on here, but it only means potentially overloaded,
632 so after stringification: */
633 ptr = SvPV_nomg_const(ssv,len);
634 /* We need to check the flag again: */
635 if (!SvAMAGIC(ssv)) goto frog;
636 }
637 else ptr = SvPV_nomg_const(ssv,len);
638 if (len == 0)
639 Perl_ck_warner(aTHX_ packWARN(WARN_MISC),
640 "Explicit blessing to '' (assuming package main)");
641 stash = gv_stashpvn(ptr, len, GV_ADD|SvUTF8(ssv));
642 }
643
644 (void)sv_bless(TOPs, stash);
645 RETURN;
646}
647
648PP(pp_gelem)
649{
650 dSP;
651
652 SV *sv = POPs;
653 STRLEN len;
654 const char * const elem = SvPV_const(sv, len);
655 GV * const gv = MUTABLE_GV(TOPs);
656 SV * tmpRef = NULL;
657
658 sv = NULL;
659 if (elem) {
660 /* elem will always be NUL terminated. */
661 switch (*elem) {
662 case 'A':
663 if (memEQs(elem, len, "ARRAY"))
664 {
665 tmpRef = MUTABLE_SV(GvAV(gv));
666 if (tmpRef && !AvREAL((const AV *)tmpRef)
667 && AvREIFY((const AV *)tmpRef))
668 av_reify(MUTABLE_AV(tmpRef));
669 }
670 break;
671 case 'C':
672 if (memEQs(elem, len, "CODE"))
673 tmpRef = MUTABLE_SV(GvCVu(gv));
674 break;
675 case 'F':
676 if (memEQs(elem, len, "FILEHANDLE")) {
677 tmpRef = MUTABLE_SV(GvIOp(gv));
678 }
679 else
680 if (memEQs(elem, len, "FORMAT"))
681 tmpRef = MUTABLE_SV(GvFORM(gv));
682 break;
683 case 'G':
684 if (memEQs(elem, len, "GLOB"))
685 tmpRef = MUTABLE_SV(gv);
686 break;
687 case 'H':
688 if (memEQs(elem, len, "HASH"))
689 tmpRef = MUTABLE_SV(GvHV(gv));
690 break;
691 case 'I':
692 if (memEQs(elem, len, "IO"))
693 tmpRef = MUTABLE_SV(GvIOp(gv));
694 break;
695 case 'N':
696 if (memEQs(elem, len, "NAME"))
697 sv = newSVhek(GvNAME_HEK(gv));
698 break;
699 case 'P':
700 if (memEQs(elem, len, "PACKAGE")) {
701 const HV * const stash = GvSTASH(gv);
702 const HEK * const hek = stash ? HvNAME_HEK(stash) : NULL;
703 sv = hek ? newSVhek(hek) : newSVpvs("__ANON__");
704 }
705 break;
706 case 'S':
707 if (memEQs(elem, len, "SCALAR"))
708 tmpRef = GvSVn(gv);
709 break;
710 }
711 }
712 if (tmpRef)
713 sv = newRV(tmpRef);
714 if (sv)
715 sv_2mortal(sv);
716 else
717 sv = &PL_sv_undef;
718 SETs(sv);
719 RETURN;
720}
721
722/* Pattern matching */
723
724PP(pp_study)
725{
726 dSP; dTOPss;
727 STRLEN len;
728
729 (void)SvPV(sv, len);
730 if (len == 0 || len > I32_MAX || !SvPOK(sv) || SvUTF8(sv) || SvVALID(sv)) {
731 /* Historically, study was skipped in these cases. */
732 SETs(&PL_sv_no);
733 return NORMAL;
734 }
735
736 /* Make study a no-op. It's no longer useful and its existence
737 complicates matters elsewhere. */
738 SETs(&PL_sv_yes);
739 return NORMAL;
740}
741
742
743/* also used for: pp_transr() */
744
745PP(pp_trans)
746{
747 dSP;
748 SV *sv;
749
750 if (PL_op->op_flags & OPf_STACKED)
751 sv = POPs;
752 else {
753 EXTEND(SP,1);
754 if (ARGTARG)
755 sv = PAD_SV(ARGTARG);
756 else {
757 sv = DEFSV;
758 }
759 }
760 if(PL_op->op_type == OP_TRANSR) {
761 STRLEN len;
762 const char * const pv = SvPV(sv,len);
763 SV * const newsv = newSVpvn_flags(pv, len, SVs_TEMP|SvUTF8(sv));
764 do_trans(newsv);
765 PUSHs(newsv);
766 }
767 else {
768 I32 i = do_trans(sv);
769 mPUSHi(i);
770 }
771 RETURN;
772}
773
774/* Lvalue operators. */
775
776static size_t
777S_do_chomp(pTHX_ SV *retval, SV *sv, bool chomping)
778{
779 STRLEN len;
780 char *s;
781 size_t count = 0;
782
783 PERL_ARGS_ASSERT_DO_CHOMP;
784
785 if (chomping && (RsSNARF(PL_rs) || RsRECORD(PL_rs)))
786 return 0;
787 if (SvTYPE(sv) == SVt_PVAV) {
788 I32 i;
789 AV *const av = MUTABLE_AV(sv);
790 const I32 max = AvFILL(av);
791
792 for (i = 0; i <= max; i++) {
793 sv = MUTABLE_SV(av_fetch(av, i, FALSE));
794 if (sv && ((sv = *(SV**)sv), sv != &PL_sv_undef))
795 count += do_chomp(retval, sv, chomping);
796 }
797 return count;
798 }
799 else if (SvTYPE(sv) == SVt_PVHV) {
800 HV* const hv = MUTABLE_HV(sv);
801 HE* entry;
802 (void)hv_iterinit(hv);
803 while ((entry = hv_iternext(hv)))
804 count += do_chomp(retval, hv_iterval(hv,entry), chomping);
805 return count;
806 }
807 else if (SvREADONLY(sv)) {
808 Perl_croak_no_modify();
809 }
810
811 s = SvPV(sv, len);
812 if (chomping) {
813 if (s && len) {
814 char *temp_buffer = NULL;
815 SV *svrecode = NULL;
816 s += --len;
817 if (RsPARA(PL_rs)) {
818 if (*s != '\n')
819 goto nope_free_nothing;
820 ++count;
821 while (len && s[-1] == '\n') {
822 --len;
823 --s;
824 ++count;
825 }
826 }
827 else {
828 STRLEN rslen, rs_charlen;
829 const char *rsptr = SvPV_const(PL_rs, rslen);
830
831 rs_charlen = SvUTF8(PL_rs)
832 ? sv_len_utf8(PL_rs)
833 : rslen;
834
835 if (SvUTF8(PL_rs) != SvUTF8(sv)) {
836 /* Assumption is that rs is shorter than the scalar. */
837 if (SvUTF8(PL_rs)) {
838 /* RS is utf8, scalar is 8 bit. */
839 bool is_utf8 = TRUE;
840 temp_buffer = (char*)bytes_from_utf8((U8*)rsptr,
841 &rslen, &is_utf8);
842 if (is_utf8) {
843 /* Cannot downgrade, therefore cannot possibly match.
844 At this point, temp_buffer is not alloced, and
845 is the buffer inside PL_rs, so dont free it.
846 */
847 assert (temp_buffer == rsptr);
848 goto nope_free_sv;
849 }
850 rsptr = temp_buffer;
851 }
852 else {
853 /* RS is 8 bit, scalar is utf8. */
854 temp_buffer = (char*)bytes_to_utf8((U8*)rsptr, &rslen);
855 rsptr = temp_buffer;
856 }
857 }
858 if (rslen == 1) {
859 if (*s != *rsptr)
860 goto nope_free_all;
861 ++count;
862 }
863 else {
864 if (len < rslen - 1)
865 goto nope_free_all;
866 len -= rslen - 1;
867 s -= rslen - 1;
868 if (memNE(s, rsptr, rslen))
869 goto nope_free_all;
870 count += rs_charlen;
871 }
872 }
873 SvPV_force_nomg_nolen(sv);
874 SvCUR_set(sv, len);
875 *SvEND(sv) = '\0';
876 SvNIOK_off(sv);
877 SvSETMAGIC(sv);
878
879 nope_free_all:
880 Safefree(temp_buffer);
881 nope_free_sv:
882 SvREFCNT_dec(svrecode);
883 nope_free_nothing: ;
884 }
885 } else {
886 if (len && (!SvPOK(sv) || SvIsCOW(sv)))
887 s = SvPV_force_nomg(sv, len);
888 if (DO_UTF8(sv)) {
889 if (s && len) {
890 char * const send = s + len;
891 char * const start = s;
892 s = send - 1;
893 while (s > start && UTF8_IS_CONTINUATION(*s))
894 s--;
895 if (is_utf8_string((U8*)s, send - s)) {
896 sv_setpvn(retval, s, send - s);
897 *s = '\0';
898 SvCUR_set(sv, s - start);
899 SvNIOK_off(sv);
900 SvUTF8_on(retval);
901 }
902 }
903 else
904 SvPVCLEAR(retval);
905 }
906 else if (s && len) {
907 s += --len;
908 sv_setpvn(retval, s, 1);
909 *s = '\0';
910 SvCUR_set(sv, len);
911 SvUTF8_off(sv);
912 SvNIOK_off(sv);
913 }
914 else
915 SvPVCLEAR(retval);
916 SvSETMAGIC(sv);
917 }
918 return count;
919}
920
921
922/* also used for: pp_schomp() */
923
924PP(pp_schop)
925{
926 dSP; dTARGET;
927 const bool chomping = PL_op->op_type == OP_SCHOMP;
928
929 const size_t count = do_chomp(TARG, TOPs, chomping);
930 if (chomping)
931 sv_setiv(TARG, count);
932 SETTARG;
933 return NORMAL;
934}
935
936
937/* also used for: pp_chomp() */
938
939PP(pp_chop)
940{
941 dSP; dMARK; dTARGET; dORIGMARK;
942 const bool chomping = PL_op->op_type == OP_CHOMP;
943 size_t count = 0;
944
945 while (MARK < SP)
946 count += do_chomp(TARG, *++MARK, chomping);
947 if (chomping)
948 sv_setiv(TARG, count);
949 SP = ORIGMARK;
950 XPUSHTARG;
951 RETURN;
952}
953
954PP(pp_undef)
955{
956 dSP;
957 SV *sv;
958
959 if (!PL_op->op_private) {
960 EXTEND(SP, 1);
961 RETPUSHUNDEF;
962 }
963
964 sv = TOPs;
965 if (!sv)
966 {
967 SETs(&PL_sv_undef);
968 return NORMAL;
969 }
970
971 if (SvTHINKFIRST(sv))
972 sv_force_normal_flags(sv, SV_COW_DROP_PV|SV_IMMEDIATE_UNREF);
973
974 switch (SvTYPE(sv)) {
975 case SVt_NULL:
976 break;
977 case SVt_PVAV:
978 av_undef(MUTABLE_AV(sv));
979 break;
980 case SVt_PVHV:
981 hv_undef(MUTABLE_HV(sv));
982 break;
983 case SVt_PVCV:
984 if (cv_const_sv((const CV *)sv))
985 Perl_ck_warner(aTHX_ packWARN(WARN_MISC),
986 "Constant subroutine %" SVf " undefined",
987 SVfARG(CvANON((const CV *)sv)
988 ? newSVpvs_flags("(anonymous)", SVs_TEMP)
989 : sv_2mortal(newSVhek(
990 CvNAMED(sv)
991 ? CvNAME_HEK((CV *)sv)
992 : GvENAME_HEK(CvGV((const CV *)sv))
993 ))
994 ));
995 /* FALLTHROUGH */
996 case SVt_PVFM:
997 /* let user-undef'd sub keep its identity */
998 cv_undef_flags(MUTABLE_CV(sv), CV_UNDEF_KEEP_NAME);
999 break;
1000 case SVt_PVGV:
1001 assert(isGV_with_GP(sv));
1002 assert(!SvFAKE(sv));
1003 {
1004 GP *gp;
1005 HV *stash;
1006
1007 /* undef *Pkg::meth_name ... */
1008 bool method_changed
1009 = GvCVu((const GV *)sv) && (stash = GvSTASH((const GV *)sv))
1010 && HvENAME_get(stash);
1011 /* undef *Foo:: */
1012 if((stash = GvHV((const GV *)sv))) {
1013 if(HvENAME_get(stash))
1014 SvREFCNT_inc_simple_void_NN(sv_2mortal((SV *)stash));
1015 else stash = NULL;
1016 }
1017
1018 SvREFCNT_inc_simple_void_NN(sv_2mortal(sv));
1019 gp_free(MUTABLE_GV(sv));
1020 Newxz(gp, 1, GP);
1021 GvGP_set(sv, gp_ref(gp));
1022#ifndef PERL_DONT_CREATE_GVSV
1023 GvSV(sv) = newSV(0);
1024#endif
1025 GvLINE(sv) = CopLINE(PL_curcop);
1026 GvEGV(sv) = MUTABLE_GV(sv);
1027 GvMULTI_on(sv);
1028
1029 if(stash)
1030 mro_package_moved(NULL, stash, (const GV *)sv, 0);
1031 stash = NULL;
1032 /* undef *Foo::ISA */
1033 if( strEQ(GvNAME((const GV *)sv), "ISA")
1034 && (stash = GvSTASH((const GV *)sv))
1035 && (method_changed || HvENAME(stash)) )
1036 mro_isa_changed_in(stash);
1037 else if(method_changed)
1038 mro_method_changed_in(
1039 GvSTASH((const GV *)sv)
1040 );
1041
1042 break;
1043 }
1044 default:
1045 if (SvTYPE(sv) >= SVt_PV && SvPVX_const(sv) && SvLEN(sv)) {
1046 SvPV_free(sv);
1047 SvPV_set(sv, NULL);
1048 SvLEN_set(sv, 0);
1049 }
1050 SvOK_off(sv);
1051 SvSETMAGIC(sv);
1052 }
1053
1054 SETs(&PL_sv_undef);
1055 return NORMAL;
1056}
1057
1058
1059/* common "slow" code for pp_postinc and pp_postdec */
1060
1061static OP *
1062S_postincdec_common(pTHX_ SV *sv, SV *targ)
1063{
1064 dSP;
1065 const bool inc =
1066 PL_op->op_type == OP_POSTINC || PL_op->op_type == OP_I_POSTINC;
1067
1068 if (SvROK(sv))
1069 TARG = sv_newmortal();
1070 sv_setsv(TARG, sv);
1071 if (inc)
1072 sv_inc_nomg(sv);
1073 else
1074 sv_dec_nomg(sv);
1075 SvSETMAGIC(sv);
1076 /* special case for undef: see thread at 2003-03/msg00536.html in archive */
1077 if (inc && !SvOK(TARG))
1078 sv_setiv(TARG, 0);
1079 SETTARG;
1080 return NORMAL;
1081}
1082
1083
1084/* also used for: pp_i_postinc() */
1085
1086PP(pp_postinc)
1087{
1088 dSP; dTARGET;
1089 SV *sv = TOPs;
1090
1091 /* special-case sv being a simple integer */
1092 if (LIKELY(((sv->sv_flags &
1093 (SVf_THINKFIRST|SVs_GMG|SVf_IVisUV|
1094 SVf_IOK|SVf_NOK|SVf_POK|SVp_NOK|SVp_POK|SVf_ROK))
1095 == SVf_IOK))
1096 && SvIVX(sv) != IV_MAX)
1097 {
1098 IV iv = SvIVX(sv);
1099 SvIV_set(sv, iv + 1);
1100 TARGi(iv, 0); /* arg not GMG, so can't be tainted */
1101 SETs(TARG);
1102 return NORMAL;
1103 }
1104
1105 return S_postincdec_common(aTHX_ sv, TARG);
1106}
1107
1108
1109/* also used for: pp_i_postdec() */
1110
1111PP(pp_postdec)
1112{
1113 dSP; dTARGET;
1114 SV *sv = TOPs;
1115
1116 /* special-case sv being a simple integer */
1117 if (LIKELY(((sv->sv_flags &
1118 (SVf_THINKFIRST|SVs_GMG|SVf_IVisUV|
1119 SVf_IOK|SVf_NOK|SVf_POK|SVp_NOK|SVp_POK|SVf_ROK))
1120 == SVf_IOK))
1121 && SvIVX(sv) != IV_MIN)
1122 {
1123 IV iv = SvIVX(sv);
1124 SvIV_set(sv, iv - 1);
1125 TARGi(iv, 0); /* arg not GMG, so can't be tainted */
1126 SETs(TARG);
1127 return NORMAL;
1128 }
1129
1130 return S_postincdec_common(aTHX_ sv, TARG);
1131}
1132
1133
1134/* Ordinary operators. */
1135
1136PP(pp_pow)
1137{
1138 dSP; dATARGET; SV *svl, *svr;
1139#ifdef PERL_PRESERVE_IVUV
1140 bool is_int = 0;
1141#endif
1142 tryAMAGICbin_MG(pow_amg, AMGf_assign|AMGf_numeric);
1143 svr = TOPs;
1144 svl = TOPm1s;
1145#ifdef PERL_PRESERVE_IVUV
1146 /* For integer to integer power, we do the calculation by hand wherever
1147 we're sure it is safe; otherwise we call pow() and try to convert to
1148 integer afterwards. */
1149 if (SvIV_please_nomg(svr) && SvIV_please_nomg(svl)) {
1150 UV power;
1151 bool baseuok;
1152 UV baseuv;
1153
1154 if (SvUOK(svr)) {
1155 power = SvUVX(svr);
1156 } else {
1157 const IV iv = SvIVX(svr);
1158 if (iv >= 0) {
1159 power = iv;
1160 } else {
1161 goto float_it; /* Can't do negative powers this way. */
1162 }
1163 }
1164
1165 baseuok = SvUOK(svl);
1166 if (baseuok) {
1167 baseuv = SvUVX(svl);
1168 } else {
1169 const IV iv = SvIVX(svl);
1170 if (iv >= 0) {
1171 baseuv = iv;
1172 baseuok = TRUE; /* effectively it's a UV now */
1173 } else {
1174 baseuv = -iv; /* abs, baseuok == false records sign */
1175 }
1176 }
1177 /* now we have integer ** positive integer. */
1178 is_int = 1;
1179
1180 /* foo & (foo - 1) is zero only for a power of 2. */
1181 if (!(baseuv & (baseuv - 1))) {
1182 /* We are raising power-of-2 to a positive integer.
1183 The logic here will work for any base (even non-integer
1184 bases) but it can be less accurate than
1185 pow (base,power) or exp (power * log (base)) when the
1186 intermediate values start to spill out of the mantissa.
1187 With powers of 2 we know this can't happen.
1188 And powers of 2 are the favourite thing for perl
1189 programmers to notice ** not doing what they mean. */
1190 NV result = 1.0;
1191 NV base = baseuok ? baseuv : -(NV)baseuv;
1192
1193 if (power & 1) {
1194 result *= base;
1195 }
1196 while (power >>= 1) {
1197 base *= base;
1198 if (power & 1) {
1199 result *= base;
1200 }
1201 }
1202 SP--;
1203 SETn( result );
1204 SvIV_please_nomg(svr);
1205 RETURN;
1206 } else {
1207 unsigned int highbit = 8 * sizeof(UV);
1208 unsigned int diff = 8 * sizeof(UV);
1209 while (diff >>= 1) {
1210 highbit -= diff;
1211 if (baseuv >> highbit) {
1212 highbit += diff;
1213 }
1214 }
1215 /* we now have baseuv < 2 ** highbit */
1216 if (power * highbit <= 8 * sizeof(UV)) {
1217 /* result will definitely fit in UV, so use UV math
1218 on same algorithm as above */
1219 UV result = 1;
1220 UV base = baseuv;
1221 const bool odd_power = cBOOL(power & 1);
1222 if (odd_power) {
1223 result *= base;
1224 }
1225 while (power >>= 1) {
1226 base *= base;
1227 if (power & 1) {
1228 result *= base;
1229 }
1230 }
1231 SP--;
1232 if (baseuok || !odd_power)
1233 /* answer is positive */
1234 SETu( result );
1235 else if (result <= (UV)IV_MAX)
1236 /* answer negative, fits in IV */
1237 SETi( -(IV)result );
1238 else if (result == (UV)IV_MIN)
1239 /* 2's complement assumption: special case IV_MIN */
1240 SETi( IV_MIN );
1241 else
1242 /* answer negative, doesn't fit */
1243 SETn( -(NV)result );
1244 RETURN;
1245 }
1246 }
1247 }
1248 float_it:
1249#endif
1250 {
1251 NV right = SvNV_nomg(svr);
1252 NV left = SvNV_nomg(svl);
1253 (void)POPs;
1254
1255#if defined(USE_LONG_DOUBLE) && defined(HAS_AIX_POWL_NEG_BASE_BUG)
1256 /*
1257 We are building perl with long double support and are on an AIX OS
1258 afflicted with a powl() function that wrongly returns NaNQ for any
1259 negative base. This was reported to IBM as PMR #23047-379 on
1260 03/06/2006. The problem exists in at least the following versions
1261 of AIX and the libm fileset, and no doubt others as well:
1262
1263 AIX 4.3.3-ML10 bos.adt.libm 4.3.3.50
1264 AIX 5.1.0-ML04 bos.adt.libm 5.1.0.29
1265 AIX 5.2.0 bos.adt.libm 5.2.0.85
1266
1267 So, until IBM fixes powl(), we provide the following workaround to
1268 handle the problem ourselves. Our logic is as follows: for
1269 negative bases (left), we use fmod(right, 2) to check if the
1270 exponent is an odd or even integer:
1271
1272 - if odd, powl(left, right) == -powl(-left, right)
1273 - if even, powl(left, right) == powl(-left, right)
1274
1275 If the exponent is not an integer, the result is rightly NaNQ, so
1276 we just return that (as NV_NAN).
1277 */
1278
1279 if (left < 0.0) {
1280 NV mod2 = Perl_fmod( right, 2.0 );
1281 if (mod2 == 1.0 || mod2 == -1.0) { /* odd integer */
1282 SETn( -Perl_pow( -left, right) );
1283 } else if (mod2 == 0.0) { /* even integer */
1284 SETn( Perl_pow( -left, right) );
1285 } else { /* fractional power */
1286 SETn( NV_NAN );
1287 }
1288 } else {
1289 SETn( Perl_pow( left, right) );
1290 }
1291#else
1292 SETn( Perl_pow( left, right) );
1293#endif /* HAS_AIX_POWL_NEG_BASE_BUG */
1294
1295#ifdef PERL_PRESERVE_IVUV
1296 if (is_int)
1297 SvIV_please_nomg(svr);
1298#endif
1299 RETURN;
1300 }
1301}
1302
1303PP(pp_multiply)
1304{
1305 dSP; dATARGET; SV *svl, *svr;
1306 tryAMAGICbin_MG(mult_amg, AMGf_assign|AMGf_numeric);
1307 svr = TOPs;
1308 svl = TOPm1s;
1309
1310#ifdef PERL_PRESERVE_IVUV
1311
1312 /* special-case some simple common cases */
1313 if (!((svl->sv_flags|svr->sv_flags) & (SVf_IVisUV|SVs_GMG))) {
1314 IV il, ir;
1315 U32 flags = (svl->sv_flags & svr->sv_flags);
1316 if (flags & SVf_IOK) {
1317 /* both args are simple IVs */
1318 UV topl, topr;
1319 il = SvIVX(svl);
1320 ir = SvIVX(svr);
1321 do_iv:
1322 topl = ((UV)il) >> (UVSIZE * 4 - 1);
1323 topr = ((UV)ir) >> (UVSIZE * 4 - 1);
1324
1325 /* if both are in a range that can't under/overflow, do a
1326 * simple integer multiply: if the top halves(*) of both numbers
1327 * are 00...00 or 11...11, then it's safe.
1328 * (*) for 32-bits, the "top half" is the top 17 bits,
1329 * for 64-bits, its 33 bits */
1330 if (!(
1331 ((topl+1) | (topr+1))
1332 & ( (((UV)1) << (UVSIZE * 4 + 1)) - 2) /* 11..110 */
1333 )) {
1334 SP--;
1335 TARGi(il * ir, 0); /* args not GMG, so can't be tainted */
1336 SETs(TARG);
1337 RETURN;
1338 }
1339 goto generic;
1340 }
1341 else if (flags & SVf_NOK) {
1342 /* both args are NVs */
1343 NV nl = SvNVX(svl);
1344 NV nr = SvNVX(svr);
1345 NV result;
1346
1347 if (
1348#if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
1349 !Perl_isnan(nl) && nl == (NV)(il = (IV)nl)
1350 && !Perl_isnan(nr) && nr == (NV)(ir = (IV)nr)
1351#else
1352 nl == (NV)(il = (IV)nl) && nr == (NV)(ir = (IV)nr)
1353#endif
1354 )
1355 /* nothing was lost by converting to IVs */
1356 goto do_iv;
1357 SP--;
1358 result = nl * nr;
1359# if defined(__sgi) && defined(USE_LONG_DOUBLE) && LONG_DOUBLEKIND == LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_BE_BE && NVSIZE == 16
1360 if (Perl_isinf(result)) {
1361 Zero((U8*)&result + 8, 8, U8);
1362 }
1363# endif
1364 TARGn(result, 0); /* args not GMG, so can't be tainted */
1365 SETs(TARG);
1366 RETURN;
1367 }
1368 }
1369
1370 generic:
1371
1372 if (SvIV_please_nomg(svr)) {
1373 /* Unless the left argument is integer in range we are going to have to
1374 use NV maths. Hence only attempt to coerce the right argument if
1375 we know the left is integer. */
1376 /* Left operand is defined, so is it IV? */
1377 if (SvIV_please_nomg(svl)) {
1378 bool auvok = SvUOK(svl);
1379 bool buvok = SvUOK(svr);
1380 const UV topmask = (~ (UV)0) << (4 * sizeof (UV));
1381 const UV botmask = ~((~ (UV)0) << (4 * sizeof (UV)));
1382 UV alow;
1383 UV ahigh;
1384 UV blow;
1385 UV bhigh;
1386
1387 if (auvok) {
1388 alow = SvUVX(svl);
1389 } else {
1390 const IV aiv = SvIVX(svl);
1391 if (aiv >= 0) {
1392 alow = aiv;
1393 auvok = TRUE; /* effectively it's a UV now */
1394 } else {
1395 /* abs, auvok == false records sign */
1396 alow = (aiv == IV_MIN) ? (UV)aiv : (UV)(-aiv);
1397 }
1398 }
1399 if (buvok) {
1400 blow = SvUVX(svr);
1401 } else {
1402 const IV biv = SvIVX(svr);
1403 if (biv >= 0) {
1404 blow = biv;
1405 buvok = TRUE; /* effectively it's a UV now */
1406 } else {
1407 /* abs, buvok == false records sign */
1408 blow = (biv == IV_MIN) ? (UV)biv : (UV)(-biv);
1409 }
1410 }
1411
1412 /* If this does sign extension on unsigned it's time for plan B */
1413 ahigh = alow >> (4 * sizeof (UV));
1414 alow &= botmask;
1415 bhigh = blow >> (4 * sizeof (UV));
1416 blow &= botmask;
1417 if (ahigh && bhigh) {
1418 NOOP;
1419 /* eg 32 bit is at least 0x10000 * 0x10000 == 0x100000000
1420 which is overflow. Drop to NVs below. */
1421 } else if (!ahigh && !bhigh) {
1422 /* eg 32 bit is at most 0xFFFF * 0xFFFF == 0xFFFE0001
1423 so the unsigned multiply cannot overflow. */
1424 const UV product = alow * blow;
1425 if (auvok == buvok) {
1426 /* -ve * -ve or +ve * +ve gives a +ve result. */
1427 SP--;
1428 SETu( product );
1429 RETURN;
1430 } else if (product <= (UV)IV_MIN) {
1431 /* 2s complement assumption that (UV)-IV_MIN is correct. */
1432 /* -ve result, which could overflow an IV */
1433 SP--;
1434 /* can't negate IV_MIN, but there are aren't two
1435 * integers such that !ahigh && !bhigh, where the
1436 * product equals 0x800....000 */
1437 assert(product != (UV)IV_MIN);
1438 SETi( -(IV)product );
1439 RETURN;
1440 } /* else drop to NVs below. */
1441 } else {
1442 /* One operand is large, 1 small */
1443 UV product_middle;
1444 if (bhigh) {
1445 /* swap the operands */
1446 ahigh = bhigh;
1447 bhigh = blow; /* bhigh now the temp var for the swap */
1448 blow = alow;
1449 alow = bhigh;
1450 }
1451 /* now, ((ahigh * blow) << half_UV_len) + (alow * blow)
1452 multiplies can't overflow. shift can, add can, -ve can. */
1453 product_middle = ahigh * blow;
1454 if (!(product_middle & topmask)) {
1455 /* OK, (ahigh * blow) won't lose bits when we shift it. */
1456 UV product_low;
1457 product_middle <<= (4 * sizeof (UV));
1458 product_low = alow * blow;
1459
1460 /* as for pp_add, UV + something mustn't get smaller.
1461 IIRC ANSI mandates this wrapping *behaviour* for
1462 unsigned whatever the actual representation*/
1463 product_low += product_middle;
1464 if (product_low >= product_middle) {
1465 /* didn't overflow */
1466 if (auvok == buvok) {
1467 /* -ve * -ve or +ve * +ve gives a +ve result. */
1468 SP--;
1469 SETu( product_low );
1470 RETURN;
1471 } else if (product_low <= (UV)IV_MIN) {
1472 /* 2s complement assumption again */
1473 /* -ve result, which could overflow an IV */
1474 SP--;
1475 SETi(product_low == (UV)IV_MIN
1476 ? IV_MIN : -(IV)product_low);
1477 RETURN;
1478 } /* else drop to NVs below. */
1479 }
1480 } /* product_middle too large */
1481 } /* ahigh && bhigh */
1482 } /* SvIOK(svl) */
1483 } /* SvIOK(svr) */
1484#endif
1485 {
1486 NV right = SvNV_nomg(svr);
1487 NV left = SvNV_nomg(svl);
1488 NV result = left * right;
1489
1490 (void)POPs;
1491#if defined(__sgi) && defined(USE_LONG_DOUBLE) && LONG_DOUBLEKIND == LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_BE_BE && NVSIZE == 16
1492 if (Perl_isinf(result)) {
1493 Zero((U8*)&result + 8, 8, U8);
1494 }
1495#endif
1496 SETn(result);
1497 RETURN;
1498 }
1499}
1500
1501PP(pp_divide)
1502{
1503 dSP; dATARGET; SV *svl, *svr;
1504 tryAMAGICbin_MG(div_amg, AMGf_assign|AMGf_numeric);
1505 svr = TOPs;
1506 svl = TOPm1s;
1507 /* Only try to do UV divide first
1508 if ((SLOPPYDIVIDE is true) or
1509 (PERL_PRESERVE_IVUV is true and one or both SV is a UV too large
1510 to preserve))
1511 The assumption is that it is better to use floating point divide
1512 whenever possible, only doing integer divide first if we can't be sure.
1513 If NV_PRESERVES_UV is true then we know at compile time that no UV
1514 can be too large to preserve, so don't need to compile the code to
1515 test the size of UVs. */
1516
1517#ifdef SLOPPYDIVIDE
1518# define PERL_TRY_UV_DIVIDE
1519 /* ensure that 20./5. == 4. */
1520#else
1521# ifdef PERL_PRESERVE_IVUV
1522# ifndef NV_PRESERVES_UV
1523# define PERL_TRY_UV_DIVIDE
1524# endif
1525# endif
1526#endif
1527
1528#ifdef PERL_TRY_UV_DIVIDE
1529 if (SvIV_please_nomg(svr) && SvIV_please_nomg(svl)) {
1530 bool left_non_neg = SvUOK(svl);
1531 bool right_non_neg = SvUOK(svr);
1532 UV left;
1533 UV right;
1534
1535 if (right_non_neg) {
1536 right = SvUVX(svr);
1537 }
1538 else {
1539 const IV biv = SvIVX(svr);
1540 if (biv >= 0) {
1541 right = biv;
1542 right_non_neg = TRUE; /* effectively it's a UV now */
1543 }
1544 else {
1545 right = (biv == IV_MIN) ? (UV)biv : (UV)(-biv);
1546 }
1547 }
1548 /* historically undef()/0 gives a "Use of uninitialized value"
1549 warning before dieing, hence this test goes here.
1550 If it were immediately before the second SvIV_please, then
1551 DIE() would be invoked before left was even inspected, so
1552 no inspection would give no warning. */
1553 if (right == 0)
1554 DIE(aTHX_ "Illegal division by zero");
1555
1556 if (left_non_neg) {
1557 left = SvUVX(svl);
1558 }
1559 else {
1560 const IV aiv = SvIVX(svl);
1561 if (aiv >= 0) {
1562 left = aiv;
1563 left_non_neg = TRUE; /* effectively it's a UV now */
1564 }
1565 else {
1566 left = (aiv == IV_MIN) ? (UV)aiv : (UV)(-aiv);
1567 }
1568 }
1569
1570 if (left >= right
1571#ifdef SLOPPYDIVIDE
1572 /* For sloppy divide we always attempt integer division. */
1573#else
1574 /* Otherwise we only attempt it if either or both operands
1575 would not be preserved by an NV. If both fit in NVs
1576 we fall through to the NV divide code below. However,
1577 as left >= right to ensure integer result here, we know that
1578 we can skip the test on the right operand - right big
1579 enough not to be preserved can't get here unless left is
1580 also too big. */
1581
1582 && (left > ((UV)1 << NV_PRESERVES_UV_BITS))
1583#endif
1584 ) {
1585 /* Integer division can't overflow, but it can be imprecise. */
1586 const UV result = left / right;
1587 if (result * right == left) {
1588 SP--; /* result is valid */
1589 if (left_non_neg == right_non_neg) {
1590 /* signs identical, result is positive. */
1591 SETu( result );
1592 RETURN;
1593 }
1594 /* 2s complement assumption */
1595 if (result <= (UV)IV_MIN)
1596 SETi(result == (UV)IV_MIN ? IV_MIN : -(IV)result);
1597 else {
1598 /* It's exact but too negative for IV. */
1599 SETn( -(NV)result );
1600 }
1601 RETURN;
1602 } /* tried integer divide but it was not an integer result */
1603 } /* else (PERL_ABS(result) < 1.0) or (both UVs in range for NV) */
1604 } /* one operand wasn't SvIOK */
1605#endif /* PERL_TRY_UV_DIVIDE */
1606 {
1607 NV right = SvNV_nomg(svr);
1608 NV left = SvNV_nomg(svl);
1609 (void)POPs;(void)POPs;
1610#if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
1611 if (! Perl_isnan(right) && right == 0.0)
1612#else
1613 if (right == 0.0)
1614#endif
1615 DIE(aTHX_ "Illegal division by zero");
1616 PUSHn( left / right );
1617 RETURN;
1618 }
1619}
1620
1621PP(pp_modulo)
1622{
1623 dSP; dATARGET;
1624 tryAMAGICbin_MG(modulo_amg, AMGf_assign|AMGf_numeric);
1625 {
1626 UV left = 0;
1627 UV right = 0;
1628 bool left_neg = FALSE;
1629 bool right_neg = FALSE;
1630 bool use_double = FALSE;
1631 bool dright_valid = FALSE;
1632 NV dright = 0.0;
1633 NV dleft = 0.0;
1634 SV * const svr = TOPs;
1635 SV * const svl = TOPm1s;
1636 if (SvIV_please_nomg(svr)) {
1637 right_neg = !SvUOK(svr);
1638 if (!right_neg) {
1639 right = SvUVX(svr);
1640 } else {
1641 const IV biv = SvIVX(svr);
1642 if (biv >= 0) {
1643 right = biv;
1644 right_neg = FALSE; /* effectively it's a UV now */
1645 } else {
1646 right = (biv == IV_MIN) ? (UV)biv : (UV)(-biv);
1647 }
1648 }
1649 }
1650 else {
1651 dright = SvNV_nomg(svr);
1652 right_neg = dright < 0;
1653 if (right_neg)
1654 dright = -dright;
1655 if (dright < UV_MAX_P1) {
1656 right = U_V(dright);
1657 dright_valid = TRUE; /* In case we need to use double below. */
1658 } else {
1659 use_double = TRUE;
1660 }
1661 }
1662
1663 /* At this point use_double is only true if right is out of range for
1664 a UV. In range NV has been rounded down to nearest UV and
1665 use_double false. */
1666 if (!use_double && SvIV_please_nomg(svl)) {
1667 left_neg = !SvUOK(svl);
1668 if (!left_neg) {
1669 left = SvUVX(svl);
1670 } else {
1671 const IV aiv = SvIVX(svl);
1672 if (aiv >= 0) {
1673 left = aiv;
1674 left_neg = FALSE; /* effectively it's a UV now */
1675 } else {
1676 left = (aiv == IV_MIN) ? (UV)aiv : (UV)(-aiv);
1677 }
1678 }
1679 }
1680 else {
1681 dleft = SvNV_nomg(svl);
1682 left_neg = dleft < 0;
1683 if (left_neg)
1684 dleft = -dleft;
1685
1686 /* This should be exactly the 5.6 behaviour - if left and right are
1687 both in range for UV then use U_V() rather than floor. */
1688 if (!use_double) {
1689 if (dleft < UV_MAX_P1) {
1690 /* right was in range, so is dleft, so use UVs not double.
1691 */
1692 left = U_V(dleft);
1693 }
1694 /* left is out of range for UV, right was in range, so promote
1695 right (back) to double. */
1696 else {
1697 /* The +0.5 is used in 5.6 even though it is not strictly
1698 consistent with the implicit +0 floor in the U_V()
1699 inside the #if 1. */
1700 dleft = Perl_floor(dleft + 0.5);
1701 use_double = TRUE;
1702 if (dright_valid)
1703 dright = Perl_floor(dright + 0.5);
1704 else
1705 dright = right;
1706 }
1707 }
1708 }
1709 sp -= 2;
1710 if (use_double) {
1711 NV dans;
1712
1713 if (!dright)
1714 DIE(aTHX_ "Illegal modulus zero");
1715
1716 dans = Perl_fmod(dleft, dright);
1717 if ((left_neg != right_neg) && dans)
1718 dans = dright - dans;
1719 if (right_neg)
1720 dans = -dans;
1721 sv_setnv(TARG, dans);
1722 }
1723 else {
1724 UV ans;
1725
1726 if (!right)
1727 DIE(aTHX_ "Illegal modulus zero");
1728
1729 ans = left % right;
1730 if ((left_neg != right_neg) && ans)
1731 ans = right - ans;
1732 if (right_neg) {
1733 /* XXX may warn: unary minus operator applied to unsigned type */
1734 /* could change -foo to be (~foo)+1 instead */
1735 if (ans <= ~((UV)IV_MAX)+1)
1736 sv_setiv(TARG, ~ans+1);
1737 else
1738 sv_setnv(TARG, -(NV)ans);
1739 }
1740 else
1741 sv_setuv(TARG, ans);
1742 }
1743 PUSHTARG;
1744 RETURN;
1745 }
1746}
1747
1748PP(pp_repeat)
1749{
1750 dSP; dATARGET;
1751 IV count;
1752 SV *sv;
1753 bool infnan = FALSE;
1754
1755 if (GIMME_V == G_ARRAY && PL_op->op_private & OPpREPEAT_DOLIST) {
1756 /* TODO: think of some way of doing list-repeat overloading ??? */
1757 sv = POPs;
1758 SvGETMAGIC(sv);
1759 }
1760 else {
1761 if (UNLIKELY(PL_op->op_private & OPpREPEAT_DOLIST)) {
1762 /* The parser saw this as a list repeat, and there
1763 are probably several items on the stack. But we're
1764 in scalar/void context, and there's no pp_list to save us
1765 now. So drop the rest of the items -- robin@kitsite.com
1766 */
1767 dMARK;
1768 if (MARK + 1 < SP) {
1769 MARK[1] = TOPm1s;
1770 MARK[2] = TOPs;
1771 }
1772 else {
1773 dTOPss;
1774 ASSUME(MARK + 1 == SP);
1775 XPUSHs(sv);
1776 MARK[1] = &PL_sv_undef;
1777 }
1778 SP = MARK + 2;
1779 }
1780 tryAMAGICbin_MG(repeat_amg, AMGf_assign);
1781 sv = POPs;
1782 }
1783
1784 if (SvIOKp(sv)) {
1785 if (SvUOK(sv)) {
1786 const UV uv = SvUV_nomg(sv);
1787 if (uv > IV_MAX)
1788 count = IV_MAX; /* The best we can do? */
1789 else
1790 count = uv;
1791 } else {
1792 count = SvIV_nomg(sv);
1793 }
1794 }
1795 else if (SvNOKp(sv)) {
1796 const NV nv = SvNV_nomg(sv);
1797 infnan = Perl_isinfnan(nv);
1798 if (UNLIKELY(infnan)) {
1799 count = 0;
1800 } else {
1801 if (nv < 0.0)
1802 count = -1; /* An arbitrary negative integer */
1803 else
1804 count = (IV)nv;
1805 }
1806 }
1807 else
1808 count = SvIV_nomg(sv);
1809
1810 if (infnan) {
1811 Perl_ck_warner(aTHX_ packWARN(WARN_NUMERIC),
1812 "Non-finite repeat count does nothing");
1813 } else if (count < 0) {
1814 count = 0;
1815 Perl_ck_warner(aTHX_ packWARN(WARN_NUMERIC),
1816 "Negative repeat count does nothing");
1817 }
1818
1819 if (GIMME_V == G_ARRAY && PL_op->op_private & OPpREPEAT_DOLIST) {
1820 dMARK;
1821 const SSize_t items = SP - MARK;
1822 const U8 mod = PL_op->op_flags & OPf_MOD;
1823
1824 if (count > 1) {
1825 SSize_t max;
1826
1827 if ( items > SSize_t_MAX / count /* max would overflow */
1828 /* repeatcpy would overflow */
1829 || items > I32_MAX / (I32)sizeof(SV *)
1830 )
1831 Perl_croak(aTHX_ "%s","Out of memory during list extend");
1832 max = items * count;
1833 MEXTEND(MARK, max);
1834
1835 while (SP > MARK) {
1836 if (*SP) {
1837 if (mod && SvPADTMP(*SP)) {
1838 *SP = sv_mortalcopy(*SP);
1839 }
1840 SvTEMP_off((*SP));
1841 }
1842 SP--;
1843 }
1844 MARK++;
1845 repeatcpy((char*)(MARK + items), (char*)MARK,
1846 items * sizeof(const SV *), count - 1);
1847 SP += max;
1848 }
1849 else if (count <= 0)
1850 SP = MARK;
1851 }
1852 else { /* Note: mark already snarfed by pp_list */
1853 SV * const tmpstr = POPs;
1854 STRLEN len;
1855 bool isutf;
1856
1857 if (TARG != tmpstr)
1858 sv_setsv_nomg(TARG, tmpstr);
1859 SvPV_force_nomg(TARG, len);
1860 isutf = DO_UTF8(TARG);
1861 if (count != 1) {
1862 if (count < 1)
1863 SvCUR_set(TARG, 0);
1864 else {
1865 STRLEN max;
1866
1867 if ( len > (MEM_SIZE_MAX-1) / (UV)count /* max would overflow */
1868 || len > (U32)I32_MAX /* repeatcpy would overflow */
1869 )
1870 Perl_croak(aTHX_ "%s",
1871 "Out of memory during string extend");
1872 max = (UV)count * len + 1;
1873 SvGROW(TARG, max);
1874
1875 repeatcpy(SvPVX(TARG) + len, SvPVX(TARG), len, count - 1);
1876 SvCUR_set(TARG, SvCUR(TARG) * count);
1877 }
1878 *SvEND(TARG) = '\0';
1879 }
1880 if (isutf)
1881 (void)SvPOK_only_UTF8(TARG);
1882 else
1883 (void)SvPOK_only(TARG);
1884
1885 PUSHTARG;
1886 }
1887 RETURN;
1888}
1889
1890PP(pp_subtract)
1891{
1892 dSP; dATARGET; bool useleft; SV *svl, *svr;
1893 tryAMAGICbin_MG(subtr_amg, AMGf_assign|AMGf_numeric);
1894 svr = TOPs;
1895 svl = TOPm1s;
1896
1897#ifdef PERL_PRESERVE_IVUV
1898
1899 /* special-case some simple common cases */
1900 if (!((svl->sv_flags|svr->sv_flags) & (SVf_IVisUV|SVs_GMG))) {
1901 IV il, ir;
1902 U32 flags = (svl->sv_flags & svr->sv_flags);
1903 if (flags & SVf_IOK) {
1904 /* both args are simple IVs */
1905 UV topl, topr;
1906 il = SvIVX(svl);
1907 ir = SvIVX(svr);
1908 do_iv:
1909 topl = ((UV)il) >> (UVSIZE * 8 - 2);
1910 topr = ((UV)ir) >> (UVSIZE * 8 - 2);
1911
1912 /* if both are in a range that can't under/overflow, do a
1913 * simple integer subtract: if the top of both numbers
1914 * are 00 or 11, then it's safe */
1915 if (!( ((topl+1) | (topr+1)) & 2)) {
1916 SP--;
1917 TARGi(il - ir, 0); /* args not GMG, so can't be tainted */
1918 SETs(TARG);
1919 RETURN;
1920 }
1921 goto generic;
1922 }
1923 else if (flags & SVf_NOK) {
1924 /* both args are NVs */
1925 NV nl = SvNVX(svl);
1926 NV nr = SvNVX(svr);
1927
1928 if (
1929#if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
1930 !Perl_isnan(nl) && nl == (NV)(il = (IV)nl)
1931 && !Perl_isnan(nr) && nr == (NV)(ir = (IV)nr)
1932#else
1933 nl == (NV)(il = (IV)nl) && nr == (NV)(ir = (IV)nr)
1934#endif
1935 )
1936 /* nothing was lost by converting to IVs */
1937 goto do_iv;
1938 SP--;
1939 TARGn(nl - nr, 0); /* args not GMG, so can't be tainted */
1940 SETs(TARG);
1941 RETURN;
1942 }
1943 }
1944
1945 generic:
1946
1947 useleft = USE_LEFT(svl);
1948 /* See comments in pp_add (in pp_hot.c) about Overflow, and how
1949 "bad things" happen if you rely on signed integers wrapping. */
1950 if (SvIV_please_nomg(svr)) {
1951 /* Unless the left argument is integer in range we are going to have to
1952 use NV maths. Hence only attempt to coerce the right argument if
1953 we know the left is integer. */
1954 UV auv = 0;
1955 bool auvok = FALSE;
1956 bool a_valid = 0;
1957
1958 if (!useleft) {
1959 auv = 0;
1960 a_valid = auvok = 1;
1961 /* left operand is undef, treat as zero. */
1962 } else {
1963 /* Left operand is defined, so is it IV? */
1964 if (SvIV_please_nomg(svl)) {
1965 if ((auvok = SvUOK(svl)))
1966 auv = SvUVX(svl);
1967 else {
1968 const IV aiv = SvIVX(svl);
1969 if (aiv >= 0) {
1970 auv = aiv;
1971 auvok = 1; /* Now acting as a sign flag. */
1972 } else { /* 2s complement assumption for IV_MIN */
1973 auv = (aiv == IV_MIN) ? (UV)aiv : (UV)-aiv;
1974 }
1975 }
1976 a_valid = 1;
1977 }
1978 }
1979 if (a_valid) {
1980 bool result_good = 0;
1981 UV result;
1982 UV buv;
1983 bool buvok = SvUOK(svr);
1984
1985 if (buvok)
1986 buv = SvUVX(svr);
1987 else {
1988 const IV biv = SvIVX(svr);
1989 if (biv >= 0) {
1990 buv = biv;
1991 buvok = 1;
1992 } else
1993 buv = (biv == IV_MIN) ? (UV)biv : (UV)-biv;
1994 }
1995 /* ?uvok if value is >= 0. basically, flagged as UV if it's +ve,
1996 else "IV" now, independent of how it came in.
1997 if a, b represents positive, A, B negative, a maps to -A etc
1998 a - b => (a - b)
1999 A - b => -(a + b)
2000 a - B => (a + b)
2001 A - B => -(a - b)
2002 all UV maths. negate result if A negative.
2003 subtract if signs same, add if signs differ. */
2004
2005 if (auvok ^ buvok) {
2006 /* Signs differ. */
2007 result = auv + buv;
2008 if (result >= auv)
2009 result_good = 1;
2010 } else {
2011 /* Signs same */
2012 if (auv >= buv) {
2013 result = auv - buv;
2014 /* Must get smaller */
2015 if (result <= auv)
2016 result_good = 1;
2017 } else {
2018 result = buv - auv;
2019 if (result <= buv) {
2020 /* result really should be -(auv-buv). as its negation
2021 of true value, need to swap our result flag */
2022 auvok = !auvok;
2023 result_good = 1;
2024 }
2025 }
2026 }
2027 if (result_good) {
2028 SP--;
2029 if (auvok)
2030 SETu( result );
2031 else {
2032 /* Negate result */
2033 if (result <= (UV)IV_MIN)
2034 SETi(result == (UV)IV_MIN
2035 ? IV_MIN : -(IV)result);
2036 else {
2037 /* result valid, but out of range for IV. */
2038 SETn( -(NV)result );
2039 }
2040 }
2041 RETURN;
2042 } /* Overflow, drop through to NVs. */
2043 }
2044 }
2045#else
2046 useleft = USE_LEFT(svl);
2047#endif
2048 {
2049 NV value = SvNV_nomg(svr);
2050 (void)POPs;
2051
2052 if (!useleft) {
2053 /* left operand is undef, treat as zero - value */
2054 SETn(-value);
2055 RETURN;
2056 }
2057 SETn( SvNV_nomg(svl) - value );
2058 RETURN;
2059 }
2060}
2061
2062#define IV_BITS (IVSIZE * 8)
2063
2064static UV S_uv_shift(UV uv, int shift, bool left)
2065{
2066 if (shift < 0) {
2067 shift = -shift;
2068 left = !left;
2069 }
2070 if (shift >= IV_BITS) {
2071 return 0;
2072 }
2073 return left ? uv << shift : uv >> shift;
2074}
2075
2076static IV S_iv_shift(IV iv, int shift, bool left)
2077{
2078 if (shift < 0) {
2079 shift = -shift;
2080 left = !left;
2081 }
2082 if (shift >= IV_BITS) {
2083 return iv < 0 && !left ? -1 : 0;
2084 }
2085 return left ? iv << shift : iv >> shift;
2086}
2087
2088#define UV_LEFT_SHIFT(uv, shift) S_uv_shift(uv, shift, TRUE)
2089#define UV_RIGHT_SHIFT(uv, shift) S_uv_shift(uv, shift, FALSE)
2090#define IV_LEFT_SHIFT(iv, shift) S_iv_shift(iv, shift, TRUE)
2091#define IV_RIGHT_SHIFT(iv, shift) S_iv_shift(iv, shift, FALSE)
2092
2093PP(pp_left_shift)
2094{
2095 dSP; dATARGET; SV *svl, *svr;
2096 tryAMAGICbin_MG(lshift_amg, AMGf_assign|AMGf_numeric);
2097 svr = POPs;
2098 svl = TOPs;
2099 {
2100 const IV shift = SvIV_nomg(svr);
2101 if (PL_op->op_private & HINT_INTEGER) {
2102 SETi(IV_LEFT_SHIFT(SvIV_nomg(svl), shift));
2103 }
2104 else {
2105 SETu(UV_LEFT_SHIFT(SvUV_nomg(svl), shift));
2106 }
2107 RETURN;
2108 }
2109}
2110
2111PP(pp_right_shift)
2112{
2113 dSP; dATARGET; SV *svl, *svr;
2114 tryAMAGICbin_MG(rshift_amg, AMGf_assign|AMGf_numeric);
2115 svr = POPs;
2116 svl = TOPs;
2117 {
2118 const IV shift = SvIV_nomg(svr);
2119 if (PL_op->op_private & HINT_INTEGER) {
2120 SETi(IV_RIGHT_SHIFT(SvIV_nomg(svl), shift));
2121 }
2122 else {
2123 SETu(UV_RIGHT_SHIFT(SvUV_nomg(svl), shift));
2124 }
2125 RETURN;
2126 }
2127}
2128
2129PP(pp_lt)
2130{
2131 dSP;
2132 SV *left, *right;
2133
2134 tryAMAGICbin_MG(lt_amg, AMGf_set|AMGf_numeric);
2135 right = POPs;
2136 left = TOPs;
2137 SETs(boolSV(
2138 (SvIOK_notUV(left) && SvIOK_notUV(right))
2139 ? (SvIVX(left) < SvIVX(right))
2140 : (do_ncmp(left, right) == -1)
2141 ));
2142 RETURN;
2143}
2144
2145PP(pp_gt)
2146{
2147 dSP;
2148 SV *left, *right;
2149
2150 tryAMAGICbin_MG(gt_amg, AMGf_set|AMGf_numeric);
2151 right = POPs;
2152 left = TOPs;
2153 SETs(boolSV(
2154 (SvIOK_notUV(left) && SvIOK_notUV(right))
2155 ? (SvIVX(left) > SvIVX(right))
2156 : (do_ncmp(left, right) == 1)
2157 ));
2158 RETURN;
2159}
2160
2161PP(pp_le)
2162{
2163 dSP;
2164 SV *left, *right;
2165
2166 tryAMAGICbin_MG(le_amg, AMGf_set|AMGf_numeric);
2167 right = POPs;
2168 left = TOPs;
2169 SETs(boolSV(
2170 (SvIOK_notUV(left) && SvIOK_notUV(right))
2171 ? (SvIVX(left) <= SvIVX(right))
2172 : (do_ncmp(left, right) <= 0)
2173 ));
2174 RETURN;
2175}
2176
2177PP(pp_ge)
2178{
2179 dSP;
2180 SV *left, *right;
2181
2182 tryAMAGICbin_MG(ge_amg, AMGf_set|AMGf_numeric);
2183 right = POPs;
2184 left = TOPs;
2185 SETs(boolSV(
2186 (SvIOK_notUV(left) && SvIOK_notUV(right))
2187 ? (SvIVX(left) >= SvIVX(right))
2188 : ( (do_ncmp(left, right) & 2) == 0)
2189 ));
2190 RETURN;
2191}
2192
2193PP(pp_ne)
2194{
2195 dSP;
2196 SV *left, *right;
2197
2198 tryAMAGICbin_MG(ne_amg, AMGf_set|AMGf_numeric);
2199 right = POPs;
2200 left = TOPs;
2201 SETs(boolSV(
2202 (SvIOK_notUV(left) && SvIOK_notUV(right))
2203 ? (SvIVX(left) != SvIVX(right))
2204 : (do_ncmp(left, right) != 0)
2205 ));
2206 RETURN;
2207}
2208
2209/* compare left and right SVs. Returns:
2210 * -1: <
2211 * 0: ==
2212 * 1: >
2213 * 2: left or right was a NaN
2214 */
2215I32
2216Perl_do_ncmp(pTHX_ SV* const left, SV * const right)
2217{
2218 PERL_ARGS_ASSERT_DO_NCMP;
2219#ifdef PERL_PRESERVE_IVUV
2220 /* Fortunately it seems NaN isn't IOK */
2221 if (SvIV_please_nomg(right) && SvIV_please_nomg(left)) {
2222 if (!SvUOK(left)) {
2223 const IV leftiv = SvIVX(left);
2224 if (!SvUOK(right)) {
2225 /* ## IV <=> IV ## */
2226 const IV rightiv = SvIVX(right);
2227 return (leftiv > rightiv) - (leftiv < rightiv);
2228 }
2229 /* ## IV <=> UV ## */
2230 if (leftiv < 0)
2231 /* As (b) is a UV, it's >=0, so it must be < */
2232 return -1;
2233 {
2234 const UV rightuv = SvUVX(right);
2235 return ((UV)leftiv > rightuv) - ((UV)leftiv < rightuv);
2236 }
2237 }
2238
2239 if (SvUOK(right)) {
2240 /* ## UV <=> UV ## */
2241 const UV leftuv = SvUVX(left);
2242 const UV rightuv = SvUVX(right);
2243 return (leftuv > rightuv) - (leftuv < rightuv);
2244 }
2245 /* ## UV <=> IV ## */
2246 {
2247 const IV rightiv = SvIVX(right);
2248 if (rightiv < 0)
2249 /* As (a) is a UV, it's >=0, so it cannot be < */
2250 return 1;
2251 {
2252 const UV leftuv = SvUVX(left);
2253 return (leftuv > (UV)rightiv) - (leftuv < (UV)rightiv);
2254 }
2255 }
2256 NOT_REACHED; /* NOTREACHED */
2257 }
2258#endif
2259 {
2260 NV const rnv = SvNV_nomg(right);
2261 NV const lnv = SvNV_nomg(left);
2262
2263#if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
2264 if (Perl_isnan(lnv) || Perl_isnan(rnv)) {
2265 return 2;
2266 }
2267 return (lnv > rnv) - (lnv < rnv);
2268#else
2269 if (lnv < rnv)
2270 return -1;
2271 if (lnv > rnv)
2272 return 1;
2273 if (lnv == rnv)
2274 return 0;
2275 return 2;
2276#endif
2277 }
2278}
2279
2280
2281PP(pp_ncmp)
2282{
2283 dSP;
2284 SV *left, *right;
2285 I32 value;
2286 tryAMAGICbin_MG(ncmp_amg, AMGf_numeric);
2287 right = POPs;
2288 left = TOPs;
2289 value = do_ncmp(left, right);
2290 if (value == 2) {
2291 SETs(&PL_sv_undef);
2292 }
2293 else {
2294 dTARGET;
2295 SETi(value);
2296 }
2297 RETURN;
2298}
2299
2300
2301/* also used for: pp_sge() pp_sgt() pp_slt() */
2302
2303PP(pp_sle)
2304{
2305 dSP;
2306
2307 int amg_type = sle_amg;
2308 int multiplier = 1;
2309 int rhs = 1;
2310
2311 switch (PL_op->op_type) {
2312 case OP_SLT:
2313 amg_type = slt_amg;
2314 /* cmp < 0 */
2315 rhs = 0;
2316 break;
2317 case OP_SGT:
2318 amg_type = sgt_amg;
2319 /* cmp > 0 */
2320 multiplier = -1;
2321 rhs = 0;
2322 break;
2323 case OP_SGE:
2324 amg_type = sge_amg;
2325 /* cmp >= 0 */
2326 multiplier = -1;
2327 break;
2328 }
2329
2330 tryAMAGICbin_MG(amg_type, AMGf_set);
2331 {
2332 dPOPTOPssrl;
2333 const int cmp =
2334#ifdef USE_LOCALE_COLLATE
2335 (IN_LC_RUNTIME(LC_COLLATE))
2336 ? sv_cmp_locale_flags(left, right, 0)
2337 :
2338#endif
2339 sv_cmp_flags(left, right, 0);
2340 SETs(boolSV(cmp * multiplier < rhs));
2341 RETURN;
2342 }
2343}
2344
2345PP(pp_seq)
2346{
2347 dSP;
2348 tryAMAGICbin_MG(seq_amg, AMGf_set);
2349 {
2350 dPOPTOPssrl;
2351 SETs(boolSV(sv_eq_flags(left, right, 0)));
2352 RETURN;
2353 }
2354}
2355
2356PP(pp_sne)
2357{
2358 dSP;
2359 tryAMAGICbin_MG(sne_amg, AMGf_set);
2360 {
2361 dPOPTOPssrl;
2362 SETs(boolSV(!sv_eq_flags(left, right, 0)));
2363 RETURN;
2364 }
2365}
2366
2367PP(pp_scmp)
2368{
2369 dSP; dTARGET;
2370 tryAMAGICbin_MG(scmp_amg, 0);
2371 {
2372 dPOPTOPssrl;
2373 const int cmp =
2374#ifdef USE_LOCALE_COLLATE
2375 (IN_LC_RUNTIME(LC_COLLATE))
2376 ? sv_cmp_locale_flags(left, right, 0)
2377 :
2378#endif
2379 sv_cmp_flags(left, right, 0);
2380 SETi( cmp );
2381 RETURN;
2382 }
2383}
2384
2385PP(pp_bit_and)
2386{
2387 dSP; dATARGET;
2388 tryAMAGICbin_MG(band_amg, AMGf_assign);
2389 {
2390 dPOPTOPssrl;
2391 if (SvNIOKp(left) || SvNIOKp(right)) {
2392 const bool left_ro_nonnum = !SvNIOKp(left) && SvREADONLY(left);
2393 const bool right_ro_nonnum = !SvNIOKp(right) && SvREADONLY(right);
2394 if (PL_op->op_private & HINT_INTEGER) {
2395 const IV i = SvIV_nomg(left) & SvIV_nomg(right);
2396 SETi(i);
2397 }
2398 else {
2399 const UV u = SvUV_nomg(left) & SvUV_nomg(right);
2400 SETu(u);
2401 }
2402 if (left_ro_nonnum && left != TARG) SvNIOK_off(left);
2403 if (right_ro_nonnum) SvNIOK_off(right);
2404 }
2405 else {
2406 do_vop(PL_op->op_type, TARG, left, right);
2407 SETTARG;
2408 }
2409 RETURN;
2410 }
2411}
2412
2413PP(pp_nbit_and)
2414{
2415 dSP;
2416 tryAMAGICbin_MG(band_amg, AMGf_assign|AMGf_numarg);
2417 {
2418 dATARGET; dPOPTOPssrl;
2419 if (PL_op->op_private & HINT_INTEGER) {
2420 const IV i = SvIV_nomg(left) & SvIV_nomg(right);
2421 SETi(i);
2422 }
2423 else {
2424 const UV u = SvUV_nomg(left) & SvUV_nomg(right);
2425 SETu(u);
2426 }
2427 }
2428 RETURN;
2429}
2430
2431PP(pp_sbit_and)
2432{
2433 dSP;
2434 tryAMAGICbin_MG(sband_amg, AMGf_assign);
2435 {
2436 dATARGET; dPOPTOPssrl;
2437 do_vop(OP_BIT_AND, TARG, left, right);
2438 RETSETTARG;
2439 }
2440}
2441
2442/* also used for: pp_bit_xor() */
2443
2444PP(pp_bit_or)
2445{
2446 dSP; dATARGET;
2447 const int op_type = PL_op->op_type;
2448
2449 tryAMAGICbin_MG((op_type == OP_BIT_OR ? bor_amg : bxor_amg), AMGf_assign);
2450 {
2451 dPOPTOPssrl;
2452 if (SvNIOKp(left) || SvNIOKp(right)) {
2453 const bool left_ro_nonnum = !SvNIOKp(left) && SvREADONLY(left);
2454 const bool right_ro_nonnum = !SvNIOKp(right) && SvREADONLY(right);
2455 if (PL_op->op_private & HINT_INTEGER) {
2456 const IV l = (USE_LEFT(left) ? SvIV_nomg(left) : 0);
2457 const IV r = SvIV_nomg(right);
2458 const IV result = op_type == OP_BIT_OR ? (l | r) : (l ^ r);
2459 SETi(result);
2460 }
2461 else {
2462 const UV l = (USE_LEFT(left) ? SvUV_nomg(left) : 0);
2463 const UV r = SvUV_nomg(right);
2464 const UV result = op_type == OP_BIT_OR ? (l | r) : (l ^ r);
2465 SETu(result);
2466 }
2467 if (left_ro_nonnum && left != TARG) SvNIOK_off(left);
2468 if (right_ro_nonnum) SvNIOK_off(right);
2469 }
2470 else {
2471 do_vop(op_type, TARG, left, right);
2472 SETTARG;
2473 }
2474 RETURN;
2475 }
2476}
2477
2478/* also used for: pp_nbit_xor() */
2479
2480PP(pp_nbit_or)
2481{
2482 dSP;
2483 const int op_type = PL_op->op_type;
2484
2485 tryAMAGICbin_MG((op_type == OP_NBIT_OR ? bor_amg : bxor_amg),
2486 AMGf_assign|AMGf_numarg);
2487 {
2488 dATARGET; dPOPTOPssrl;
2489 if (PL_op->op_private & HINT_INTEGER) {
2490 const IV l = (USE_LEFT(left) ? SvIV_nomg(left) : 0);
2491 const IV r = SvIV_nomg(right);
2492 const IV result = op_type == OP_NBIT_OR ? (l | r) : (l ^ r);
2493 SETi(result);
2494 }
2495 else {
2496 const UV l = (USE_LEFT(left) ? SvUV_nomg(left) : 0);
2497 const UV r = SvUV_nomg(right);
2498 const UV result = op_type == OP_NBIT_OR ? (l | r) : (l ^ r);
2499 SETu(result);
2500 }
2501 }
2502 RETURN;
2503}
2504
2505/* also used for: pp_sbit_xor() */
2506
2507PP(pp_sbit_or)
2508{
2509 dSP;
2510 const int op_type = PL_op->op_type;
2511
2512 tryAMAGICbin_MG((op_type == OP_SBIT_OR ? sbor_amg : sbxor_amg),
2513 AMGf_assign);
2514 {
2515 dATARGET; dPOPTOPssrl;
2516 do_vop(op_type == OP_SBIT_OR ? OP_BIT_OR : OP_BIT_XOR, TARG, left,
2517 right);
2518 RETSETTARG;
2519 }
2520}
2521
2522PERL_STATIC_INLINE bool
2523S_negate_string(pTHX)
2524{
2525 dTARGET; dSP;
2526 STRLEN len;
2527 const char *s;
2528 SV * const sv = TOPs;
2529 if (!SvPOKp(sv) || SvNIOK(sv) || (!SvPOK(sv) && SvNIOKp(sv)))
2530 return FALSE;
2531 s = SvPV_nomg_const(sv, len);
2532 if (isIDFIRST(*s)) {
2533 sv_setpvs(TARG, "-");
2534 sv_catsv(TARG, sv);
2535 }
2536 else if (*s == '+' || (*s == '-' && !looks_like_number(sv))) {
2537 sv_setsv_nomg(TARG, sv);
2538 *SvPV_force_nomg(TARG, len) = *s == '-' ? '+' : '-';
2539 }
2540 else return FALSE;
2541 SETTARG;
2542 return TRUE;
2543}
2544
2545PP(pp_negate)
2546{
2547 dSP; dTARGET;
2548 tryAMAGICun_MG(neg_amg, AMGf_numeric);
2549 if (S_negate_string(aTHX)) return NORMAL;
2550 {
2551 SV * const sv = TOPs;
2552
2553 if (SvIOK(sv)) {
2554 /* It's publicly an integer */
2555 oops_its_an_int:
2556 if (SvIsUV(sv)) {
2557 if (SvIVX(sv) == IV_MIN) {
2558 /* 2s complement assumption. */
2559 SETi(SvIVX(sv)); /* special case: -((UV)IV_MAX+1) ==
2560 IV_MIN */
2561 return NORMAL;
2562 }
2563 else if (SvUVX(sv) <= IV_MAX) {
2564 SETi(-SvIVX(sv));
2565 return NORMAL;
2566 }
2567 }
2568 else if (SvIVX(sv) != IV_MIN) {
2569 SETi(-SvIVX(sv));
2570 return NORMAL;
2571 }
2572#ifdef PERL_PRESERVE_IVUV
2573 else {
2574 SETu((UV)IV_MIN);
2575 return NORMAL;
2576 }
2577#endif
2578 }
2579 if (SvNIOKp(sv) && (SvNIOK(sv) || !SvPOK(sv)))
2580 SETn(-SvNV_nomg(sv));
2581 else if (SvPOKp(sv) && SvIV_please_nomg(sv))
2582 goto oops_its_an_int;
2583 else
2584 SETn(-SvNV_nomg(sv));
2585 }
2586 return NORMAL;
2587}
2588
2589PP(pp_not)
2590{
2591 dSP;
2592 tryAMAGICun_MG(not_amg, AMGf_set);
2593 *PL_stack_sp = boolSV(!SvTRUE_nomg(*PL_stack_sp));
2594 return NORMAL;
2595}
2596
2597static void
2598S_scomplement(pTHX_ SV *targ, SV *sv)
2599{
2600 U8 *tmps;
2601 I32 anum;
2602 STRLEN len;
2603
2604 sv_copypv_nomg(TARG, sv);
2605 tmps = (U8*)SvPV_nomg(TARG, len);
2606 anum = len;
2607 if (SvUTF8(TARG)) {
2608 /* Calculate exact length, let's not estimate. */
2609 STRLEN targlen = 0;
2610 STRLEN l;
2611 UV nchar = 0;
2612 UV nwide = 0;
2613 U8 * const send = tmps + len;
2614 U8 * const origtmps = tmps;
2615 const UV utf8flags = UTF8_ALLOW_ANYUV;
2616
2617 while (tmps < send) {
2618 const UV c = utf8n_to_uvchr(tmps, send-tmps, &l, utf8flags);
2619 tmps += l;
2620 targlen += UVCHR_SKIP(~c);
2621 nchar++;
2622 if (c > 0xff)
2623 nwide++;
2624 }
2625
2626 /* Now rewind strings and write them. */
2627 tmps = origtmps;
2628
2629 if (nwide) {
2630 U8 *result;
2631 U8 *p;
2632
2633 Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED),
2634 deprecated_above_ff_msg, PL_op_desc[PL_op->op_type]);
2635 Newx(result, targlen + 1, U8);
2636 p = result;
2637 while (tmps < send) {
2638 const UV c = utf8n_to_uvchr(tmps, send-tmps, &l, utf8flags);
2639 tmps += l;
2640 p = uvchr_to_utf8_flags(p, ~c, UNICODE_ALLOW_ANY);
2641 }
2642 *p = '\0';
2643 sv_usepvn_flags(TARG, (char*)result, targlen,
2644 SV_HAS_TRAILING_NUL);
2645 SvUTF8_on(TARG);
2646 }
2647 else {
2648 U8 *result;
2649 U8 *p;
2650
2651 Newx(result, nchar + 1, U8);
2652 p = result;
2653 while (tmps < send) {
2654 const U8 c = (U8)utf8n_to_uvchr(tmps, send-tmps, &l, utf8flags);
2655 tmps += l;
2656 *p++ = ~c;
2657 }
2658 *p = '\0';
2659 sv_usepvn_flags(TARG, (char*)result, nchar, SV_HAS_TRAILING_NUL);
2660 SvUTF8_off(TARG);
2661 }
2662 return;
2663 }
2664#ifdef LIBERAL
2665 {
2666 long *tmpl;
2667 for ( ; anum && (unsigned long)tmps % sizeof(long); anum--, tmps++)
2668 *tmps = ~*tmps;
2669 tmpl = (long*)tmps;
2670 for ( ; anum >= (I32)sizeof(long); anum -= (I32)sizeof(long), tmpl++)
2671 *tmpl = ~*tmpl;
2672 tmps = (U8*)tmpl;
2673 }
2674#endif
2675 for ( ; anum > 0; anum--, tmps++)
2676 *tmps = ~*tmps;
2677}
2678
2679PP(pp_complement)
2680{
2681 dSP; dTARGET;
2682 tryAMAGICun_MG(compl_amg, AMGf_numeric);
2683 {
2684 dTOPss;
2685 if (SvNIOKp(sv)) {
2686 if (PL_op->op_private & HINT_INTEGER) {
2687 const IV i = ~SvIV_nomg(sv);
2688 SETi(i);
2689 }
2690 else {
2691 const UV u = ~SvUV_nomg(sv);
2692 SETu(u);
2693 }
2694 }
2695 else {
2696 S_scomplement(aTHX_ TARG, sv);
2697 SETTARG;
2698 }
2699 return NORMAL;
2700 }
2701}
2702
2703PP(pp_ncomplement)
2704{
2705 dSP;
2706 tryAMAGICun_MG(compl_amg, AMGf_numeric|AMGf_numarg);
2707 {
2708 dTARGET; dTOPss;
2709 if (PL_op->op_private & HINT_INTEGER) {
2710 const IV i = ~SvIV_nomg(sv);
2711 SETi(i);
2712 }
2713 else {
2714 const UV u = ~SvUV_nomg(sv);
2715 SETu(u);
2716 }
2717 }
2718 return NORMAL;
2719}
2720
2721PP(pp_scomplement)
2722{
2723 dSP;
2724 tryAMAGICun_MG(scompl_amg, AMGf_numeric);
2725 {
2726 dTARGET; dTOPss;
2727 S_scomplement(aTHX_ TARG, sv);
2728 SETTARG;
2729 return NORMAL;
2730 }
2731}
2732
2733/* integer versions of some of the above */
2734
2735PP(pp_i_multiply)
2736{
2737 dSP; dATARGET;
2738 tryAMAGICbin_MG(mult_amg, AMGf_assign);
2739 {
2740 dPOPTOPiirl_nomg;
2741 SETi( left * right );
2742 RETURN;
2743 }
2744}
2745
2746PP(pp_i_divide)
2747{
2748 IV num;
2749 dSP; dATARGET;
2750 tryAMAGICbin_MG(div_amg, AMGf_assign);
2751 {
2752 dPOPTOPssrl;
2753 IV value = SvIV_nomg(right);
2754 if (value == 0)
2755 DIE(aTHX_ "Illegal division by zero");
2756 num = SvIV_nomg(left);
2757
2758 /* avoid FPE_INTOVF on some platforms when num is IV_MIN */
2759 if (value == -1)
2760 value = - num;
2761 else
2762 value = num / value;
2763 SETi(value);
2764 RETURN;
2765 }
2766}
2767
2768PP(pp_i_modulo)
2769{
2770 /* This is the vanilla old i_modulo. */
2771 dSP; dATARGET;
2772 tryAMAGICbin_MG(modulo_amg, AMGf_assign);
2773 {
2774 dPOPTOPiirl_nomg;
2775 if (!right)
2776 DIE(aTHX_ "Illegal modulus zero");
2777 /* avoid FPE_INTOVF on some platforms when left is IV_MIN */
2778 if (right == -1)
2779 SETi( 0 );
2780 else
2781 SETi( left % right );
2782 RETURN;
2783 }
2784}
2785
2786#if defined(__GLIBC__) && IVSIZE == 8 \
2787 && ( __GLIBC__ < 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ < 8))
2788
2789PP(pp_i_modulo_glibc_bugfix)
2790{
2791 /* This is the i_modulo with the workaround for the _moddi3 bug
2792 * in (at least) glibc 2.2.5 (the PERL_ABS() the workaround).
2793 * See below for pp_i_modulo. */
2794 dSP; dATARGET;
2795 tryAMAGICbin_MG(modulo_amg, AMGf_assign);
2796 {
2797 dPOPTOPiirl_nomg;
2798 if (!right)
2799 DIE(aTHX_ "Illegal modulus zero");
2800 /* avoid FPE_INTOVF on some platforms when left is IV_MIN */
2801 if (right == -1)
2802 SETi( 0 );
2803 else
2804 SETi( left % PERL_ABS(right) );
2805 RETURN;
2806 }
2807}
2808#endif
2809
2810PP(pp_i_add)
2811{
2812 dSP; dATARGET;
2813 tryAMAGICbin_MG(add_amg, AMGf_assign);
2814 {
2815 dPOPTOPiirl_ul_nomg;
2816 SETi( left + right );
2817 RETURN;
2818 }
2819}
2820
2821PP(pp_i_subtract)
2822{
2823 dSP; dATARGET;
2824 tryAMAGICbin_MG(subtr_amg, AMGf_assign);
2825 {
2826 dPOPTOPiirl_ul_nomg;
2827 SETi( left - right );
2828 RETURN;
2829 }
2830}
2831
2832PP(pp_i_lt)
2833{
2834 dSP;
2835 tryAMAGICbin_MG(lt_amg, AMGf_set);
2836 {
2837 dPOPTOPiirl_nomg;
2838 SETs(boolSV(left < right));
2839 RETURN;
2840 }
2841}
2842
2843PP(pp_i_gt)
2844{
2845 dSP;
2846 tryAMAGICbin_MG(gt_amg, AMGf_set);
2847 {
2848 dPOPTOPiirl_nomg;
2849 SETs(boolSV(left > right));
2850 RETURN;
2851 }
2852}
2853
2854PP(pp_i_le)
2855{
2856 dSP;
2857 tryAMAGICbin_MG(le_amg, AMGf_set);
2858 {
2859 dPOPTOPiirl_nomg;
2860 SETs(boolSV(left <= right));
2861 RETURN;
2862 }
2863}
2864
2865PP(pp_i_ge)
2866{
2867 dSP;
2868 tryAMAGICbin_MG(ge_amg, AMGf_set);
2869 {
2870 dPOPTOPiirl_nomg;
2871 SETs(boolSV(left >= right));
2872 RETURN;
2873 }
2874}
2875
2876PP(pp_i_eq)
2877{
2878 dSP;
2879 tryAMAGICbin_MG(eq_amg, AMGf_set);
2880 {
2881 dPOPTOPiirl_nomg;
2882 SETs(boolSV(left == right));
2883 RETURN;
2884 }
2885}
2886
2887PP(pp_i_ne)
2888{
2889 dSP;
2890 tryAMAGICbin_MG(ne_amg, AMGf_set);
2891 {
2892 dPOPTOPiirl_nomg;
2893 SETs(boolSV(left != right));
2894 RETURN;
2895 }
2896}
2897
2898PP(pp_i_ncmp)
2899{
2900 dSP; dTARGET;
2901 tryAMAGICbin_MG(ncmp_amg, 0);
2902 {
2903 dPOPTOPiirl_nomg;
2904 I32 value;
2905
2906 if (left > right)
2907 value = 1;
2908 else if (left < right)
2909 value = -1;
2910 else
2911 value = 0;
2912 SETi(value);
2913 RETURN;
2914 }
2915}
2916
2917PP(pp_i_negate)
2918{
2919 dSP; dTARGET;
2920 tryAMAGICun_MG(neg_amg, 0);
2921 if (S_negate_string(aTHX)) return NORMAL;
2922 {
2923 SV * const sv = TOPs;
2924 IV const i = SvIV_nomg(sv);
2925 SETi(-i);
2926 return NORMAL;
2927 }
2928}
2929
2930/* High falutin' math. */
2931
2932PP(pp_atan2)
2933{
2934 dSP; dTARGET;
2935 tryAMAGICbin_MG(atan2_amg, 0);
2936 {
2937 dPOPTOPnnrl_nomg;
2938 SETn(Perl_atan2(left, right));
2939 RETURN;
2940 }
2941}
2942
2943
2944/* also used for: pp_cos() pp_exp() pp_log() pp_sqrt() */
2945
2946PP(pp_sin)
2947{
2948 dSP; dTARGET;
2949 int amg_type = fallback_amg;
2950 const char *neg_report = NULL;
2951 const int op_type = PL_op->op_type;
2952
2953 switch (op_type) {
2954 case OP_SIN: amg_type = sin_amg; break;
2955 case OP_COS: amg_type = cos_amg; break;
2956 case OP_EXP: amg_type = exp_amg; break;
2957 case OP_LOG: amg_type = log_amg; neg_report = "log"; break;
2958 case OP_SQRT: amg_type = sqrt_amg; neg_report = "sqrt"; break;
2959 }
2960
2961 assert(amg_type != fallback_amg);
2962
2963 tryAMAGICun_MG(amg_type, 0);
2964 {
2965 SV * const arg = TOPs;
2966 const NV value = SvNV_nomg(arg);
2967#ifdef NV_NAN
2968 NV result = NV_NAN;
2969#else
2970 NV result = 0.0;
2971#endif
2972 if (neg_report) { /* log or sqrt */
2973 if (
2974#if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
2975 ! Perl_isnan(value) &&
2976#endif
2977 (op_type == OP_LOG ? (value <= 0.0) : (value < 0.0))) {
2978 SET_NUMERIC_STANDARD();
2979 /* diag_listed_as: Can't take log of %g */
2980 DIE(aTHX_ "Can't take %s of %" NVgf, neg_report, value);
2981 }
2982 }
2983 switch (op_type) {
2984 default:
2985 case OP_SIN: result = Perl_sin(value); break;
2986 case OP_COS: result = Perl_cos(value); break;
2987 case OP_EXP: result = Perl_exp(value); break;
2988 case OP_LOG: result = Perl_log(value); break;
2989 case OP_SQRT: result = Perl_sqrt(value); break;
2990 }
2991 SETn(result);
2992 return NORMAL;
2993 }
2994}
2995
2996/* Support Configure command-line overrides for rand() functions.
2997 After 5.005, perhaps we should replace this by Configure support
2998 for drand48(), random(), or rand(). For 5.005, though, maintain
2999 compatibility by calling rand() but allow the user to override it.
3000 See INSTALL for details. --Andy Dougherty 15 July 1998
3001*/
3002/* Now it's after 5.005, and Configure supports drand48() and random(),
3003 in addition to rand(). So the overrides should not be needed any more.
3004 --Jarkko Hietaniemi 27 September 1998
3005 */
3006
3007PP(pp_rand)
3008{
3009 if (!PL_srand_called) {
3010 (void)seedDrand01((Rand_seed_t)seed());
3011 PL_srand_called = TRUE;
3012 }
3013 {
3014 dSP;
3015 NV value;
3016
3017 if (MAXARG < 1)
3018 {
3019 EXTEND(SP, 1);
3020 value = 1.0;
3021 }
3022 else {
3023 SV * const sv = POPs;
3024 if(!sv)
3025 value = 1.0;
3026 else
3027 value = SvNV(sv);
3028 }
3029 /* 1 of 2 things can be carried through SvNV, SP or TARG, SP was carried */
3030#if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
3031 if (! Perl_isnan(value) && value == 0.0)
3032#else
3033 if (value == 0.0)
3034#endif
3035 value = 1.0;
3036 {
3037 dTARGET;
3038 PUSHs(TARG);
3039 PUTBACK;
3040 value *= Drand01();
3041 sv_setnv_mg(TARG, value);
3042 }
3043 }
3044 return NORMAL;
3045}
3046
3047PP(pp_srand)
3048{
3049 dSP; dTARGET;
3050 UV anum;
3051
3052 if (MAXARG >= 1 && (TOPs || POPs)) {
3053 SV *top;
3054 char *pv;
3055 STRLEN len;
3056 int flags;
3057
3058 top = POPs;
3059 pv = SvPV(top, len);
3060 flags = grok_number(pv, len, &anum);
3061
3062 if (!(flags & IS_NUMBER_IN_UV)) {
3063 Perl_ck_warner_d(aTHX_ packWARN(WARN_OVERFLOW),
3064 "Integer overflow in srand");
3065 anum = UV_MAX;
3066 }
3067 }
3068 else {
3069 anum = seed();
3070 }
3071
3072 (void)seedDrand01((Rand_seed_t)anum);
3073 PL_srand_called = TRUE;
3074 if (anum)
3075 XPUSHu(anum);
3076 else {
3077 /* Historically srand always returned true. We can avoid breaking
3078 that like this: */
3079 sv_setpvs(TARG, "0 but true");
3080 XPUSHTARG;
3081 }
3082 RETURN;
3083}
3084
3085PP(pp_int)
3086{
3087 dSP; dTARGET;
3088 tryAMAGICun_MG(int_amg, AMGf_numeric);
3089 {
3090 SV * const sv = TOPs;
3091 const IV iv = SvIV_nomg(sv);
3092 /* XXX it's arguable that compiler casting to IV might be subtly
3093 different from modf (for numbers inside (IV_MIN,UV_MAX)) in which
3094 else preferring IV has introduced a subtle behaviour change bug. OTOH
3095 relying on floating point to be accurate is a bug. */
3096
3097 if (!SvOK(sv)) {
3098 SETu(0);
3099 }
3100 else if (SvIOK(sv)) {
3101 if (SvIsUV(sv))
3102 SETu(SvUV_nomg(sv));
3103 else
3104 SETi(iv);
3105 }
3106 else {
3107 const NV value = SvNV_nomg(sv);
3108 if (UNLIKELY(Perl_isinfnan(value)))
3109 SETn(value);
3110 else if (value >= 0.0) {
3111 if (value < (NV)UV_MAX + 0.5) {
3112 SETu(U_V(value));
3113 } else {
3114 SETn(Perl_floor(value));
3115 }
3116 }
3117 else {
3118 if (value > (NV)IV_MIN - 0.5) {
3119 SETi(I_V(value));
3120 } else {
3121 SETn(Perl_ceil(value));
3122 }
3123 }
3124 }
3125 }
3126 return NORMAL;
3127}
3128
3129PP(pp_abs)
3130{
3131 dSP; dTARGET;
3132 tryAMAGICun_MG(abs_amg, AMGf_numeric);
3133 {
3134 SV * const sv = TOPs;
3135 /* This will cache the NV value if string isn't actually integer */
3136 const IV iv = SvIV_nomg(sv);
3137
3138 if (!SvOK(sv)) {
3139 SETu(0);
3140 }
3141 else if (SvIOK(sv)) {
3142 /* IVX is precise */
3143 if (SvIsUV(sv)) {
3144 SETu(SvUV_nomg(sv)); /* force it to be numeric only */
3145 } else {
3146 if (iv >= 0) {
3147 SETi(iv);
3148 } else {
3149 if (iv != IV_MIN) {
3150 SETi(-iv);
3151 } else {
3152 /* 2s complement assumption. Also, not really needed as
3153 IV_MIN and -IV_MIN should both be %100...00 and NV-able */
3154 SETu((UV)IV_MIN);
3155 }
3156 }
3157 }
3158 } else{
3159 const NV value = SvNV_nomg(sv);
3160 if (value < 0.0)
3161 SETn(-value);
3162 else
3163 SETn(value);
3164 }
3165 }
3166 return NORMAL;
3167}
3168
3169
3170/* also used for: pp_hex() */
3171
3172PP(pp_oct)
3173{
3174 dSP; dTARGET;
3175 const char *tmps;
3176 I32 flags = PERL_SCAN_ALLOW_UNDERSCORES;
3177 STRLEN len;
3178 NV result_nv;
3179 UV result_uv;
3180 SV* const sv = TOPs;
3181
3182 tmps = (SvPV_const(sv, len));
3183 if (DO_UTF8(sv)) {
3184 /* If Unicode, try to downgrade
3185 * If not possible, croak. */
3186 SV* const tsv = sv_2mortal(newSVsv(sv));
3187
3188 SvUTF8_on(tsv);
3189 sv_utf8_downgrade(tsv, FALSE);
3190 tmps = SvPV_const(tsv, len);
3191 }
3192 if (PL_op->op_type == OP_HEX)
3193 goto hex;
3194
3195 while (*tmps && len && isSPACE(*tmps))
3196 tmps++, len--;
3197 if (*tmps == '0')
3198 tmps++, len--;
3199 if (isALPHA_FOLD_EQ(*tmps, 'x')) {
3200 hex:
3201 result_uv = grok_hex (tmps, &len, &flags, &result_nv);
3202 }
3203 else if (isALPHA_FOLD_EQ(*tmps, 'b'))
3204 result_uv = grok_bin (tmps, &len, &flags, &result_nv);
3205 else
3206 result_uv = grok_oct (tmps, &len, &flags, &result_nv);
3207
3208 if (flags & PERL_SCAN_GREATER_THAN_UV_MAX) {
3209 SETn(result_nv);
3210 }
3211 else {
3212 SETu(result_uv);
3213 }
3214 return NORMAL;
3215}
3216
3217/* String stuff. */
3218
3219PP(pp_length)
3220{
3221 dSP; dTARGET;
3222 SV * const sv = TOPs;
3223
3224 U32 in_bytes = IN_BYTES;
3225 /* simplest case shortcut */
3226 /* turn off SVf_UTF8 in tmp flags if HINT_BYTES on*/
3227 U32 svflags = (SvFLAGS(sv) ^ (in_bytes << 26)) & (SVf_POK|SVs_GMG|SVf_UTF8);
3228 STATIC_ASSERT_STMT(HINT_BYTES == 0x00000008 && SVf_UTF8 == 0x20000000 && (SVf_UTF8 == HINT_BYTES << 26));
3229 SETs(TARG);
3230
3231 if(LIKELY(svflags == SVf_POK))
3232 goto simple_pv;
3233 if(svflags & SVs_GMG)
3234 mg_get(sv);
3235 if (SvOK(sv)) {
3236 if (!IN_BYTES) /* reread to avoid using an C auto/register */
3237 sv_setiv(TARG, (IV)sv_len_utf8_nomg(sv));
3238 else
3239 {
3240 STRLEN len;
3241 /* unrolled SvPV_nomg_const(sv,len) */
3242 if(SvPOK_nog(sv)){
3243 simple_pv:
3244 len = SvCUR(sv);
3245 } else {
3246 (void)sv_2pv_flags(sv, &len, 0|SV_CONST_RETURN);
3247 }
3248 sv_setiv(TARG, (IV)(len));
3249 }
3250 } else {
3251 if (!SvPADTMP(TARG)) {
3252 sv_set_undef(TARG);
3253 } else { /* TARG is on stack at this point and is overwriten by SETs.
3254 This branch is the odd one out, so put TARG by default on
3255 stack earlier to let local SP go out of liveness sooner */
3256 SETs(&PL_sv_undef);
3257 goto no_set_magic;
3258 }
3259 }
3260 SvSETMAGIC(TARG);
3261 no_set_magic:
3262 return NORMAL; /* no putback, SP didn't move in this opcode */
3263}
3264
3265/* Returns false if substring is completely outside original string.
3266 No length is indicated by len_iv = 0 and len_is_uv = 0. len_is_uv must
3267 always be true for an explicit 0.
3268*/
3269bool
3270Perl_translate_substr_offsets( STRLEN curlen, IV pos1_iv,
3271 bool pos1_is_uv, IV len_iv,
3272 bool len_is_uv, STRLEN *posp,
3273 STRLEN *lenp)
3274{
3275 IV pos2_iv;
3276 int pos2_is_uv;
3277
3278 PERL_ARGS_ASSERT_TRANSLATE_SUBSTR_OFFSETS;
3279
3280 if (!pos1_is_uv && pos1_iv < 0 && curlen) {
3281 pos1_is_uv = curlen-1 > ~(UV)pos1_iv;
3282 pos1_iv += curlen;
3283 }
3284 if ((pos1_is_uv || pos1_iv > 0) && (UV)pos1_iv > curlen)
3285 return FALSE;
3286
3287 if (len_iv || len_is_uv) {
3288 if (!len_is_uv && len_iv < 0) {
3289 pos2_iv = curlen + len_iv;
3290 if (curlen)
3291 pos2_is_uv = curlen-1 > ~(UV)len_iv;
3292 else
3293 pos2_is_uv = 0;
3294 } else { /* len_iv >= 0 */
3295 if (!pos1_is_uv && pos1_iv < 0) {
3296 pos2_iv = pos1_iv + len_iv;
3297 pos2_is_uv = (UV)len_iv > (UV)IV_MAX;
3298 } else {
3299 if ((UV)len_iv > curlen-(UV)pos1_iv)
3300 pos2_iv = curlen;
3301 else
3302 pos2_iv = pos1_iv+len_iv;
3303 pos2_is_uv = 1;
3304 }
3305 }
3306 }
3307 else {
3308 pos2_iv = curlen;
3309 pos2_is_uv = 1;
3310 }
3311
3312 if (!pos2_is_uv && pos2_iv < 0) {
3313 if (!pos1_is_uv && pos1_iv < 0)
3314 return FALSE;
3315 pos2_iv = 0;
3316 }
3317 else if (!pos1_is_uv && pos1_iv < 0)
3318 pos1_iv = 0;
3319
3320 if ((UV)pos2_iv < (UV)pos1_iv)
3321 pos2_iv = pos1_iv;
3322 if ((UV)pos2_iv > curlen)
3323 pos2_iv = curlen;
3324
3325 /* pos1_iv and pos2_iv both in 0..curlen, so the cast is safe */
3326 *posp = (STRLEN)( (UV)pos1_iv );
3327 *lenp = (STRLEN)( (UV)pos2_iv - (UV)pos1_iv );
3328
3329 return TRUE;
3330}
3331
3332PP(pp_substr)
3333{
3334 dSP; dTARGET;
3335 SV *sv;
3336 STRLEN curlen;
3337 STRLEN utf8_curlen;
3338 SV * pos_sv;
3339 IV pos1_iv;
3340 int pos1_is_uv;
3341 SV * len_sv;
3342 IV len_iv = 0;
3343 int len_is_uv = 0;
3344 I32 lvalue = PL_op->op_flags & OPf_MOD || LVRET;
3345 const bool rvalue = (GIMME_V != G_VOID);
3346 const char *tmps;
3347 SV *repl_sv = NULL;
3348 const char *repl = NULL;
3349 STRLEN repl_len;
3350 int num_args = PL_op->op_private & 7;
3351 bool repl_need_utf8_upgrade = FALSE;
3352
3353 if (num_args > 2) {
3354 if (num_args > 3) {
3355 if(!(repl_sv = POPs)) num_args--;
3356 }
3357 if ((len_sv = POPs)) {
3358 len_iv = SvIV(len_sv);
3359 len_is_uv = len_iv ? SvIOK_UV(len_sv) : 1;
3360 }
3361 else num_args--;
3362 }
3363 pos_sv = POPs;
3364 pos1_iv = SvIV(pos_sv);
3365 pos1_is_uv = SvIOK_UV(pos_sv);
3366 sv = POPs;
3367 if (PL_op->op_private & OPpSUBSTR_REPL_FIRST) {
3368 assert(!repl_sv);
3369 repl_sv = POPs;
3370 }
3371 if (lvalue && !repl_sv) {
3372 SV * ret;
3373 ret = sv_2mortal(newSV_type(SVt_PVLV)); /* Not TARG RT#67838 */
3374 sv_magic(ret, NULL, PERL_MAGIC_substr, NULL, 0);
3375 LvTYPE(ret) = 'x';
3376 LvTARG(ret) = SvREFCNT_inc_simple(sv);
3377 LvTARGOFF(ret) =
3378 pos1_is_uv || pos1_iv >= 0
3379 ? (STRLEN)(UV)pos1_iv
3380 : (LvFLAGS(ret) |= 1, (STRLEN)(UV)-pos1_iv);
3381 LvTARGLEN(ret) =
3382 len_is_uv || len_iv > 0
3383 ? (STRLEN)(UV)len_iv
3384 : (LvFLAGS(ret) |= 2, (STRLEN)(UV)-len_iv);
3385
3386 PUSHs(ret); /* avoid SvSETMAGIC here */
3387 RETURN;
3388 }
3389 if (repl_sv) {
3390 repl = SvPV_const(repl_sv, repl_len);
3391 SvGETMAGIC(sv);
3392 if (SvROK(sv))
3393 Perl_ck_warner(aTHX_ packWARN(WARN_SUBSTR),
3394 "Attempt to use reference as lvalue in substr"
3395 );
3396 tmps = SvPV_force_nomg(sv, curlen);
3397 if (DO_UTF8(repl_sv) && repl_len) {
3398 if (!DO_UTF8(sv)) {
3399 /* Upgrade the dest, and recalculate tmps in case the buffer
3400 * got reallocated; curlen may also have been changed */
3401 sv_utf8_upgrade_nomg(sv);
3402 tmps = SvPV_nomg(sv, curlen);
3403 }
3404 }
3405 else if (DO_UTF8(sv))
3406 repl_need_utf8_upgrade = TRUE;
3407 }
3408 else tmps = SvPV_const(sv, curlen);
3409 if (DO_UTF8(sv)) {
3410 utf8_curlen = sv_or_pv_len_utf8(sv, tmps, curlen);
3411 if (utf8_curlen == curlen)
3412 utf8_curlen = 0;
3413 else
3414 curlen = utf8_curlen;
3415 }
3416 else
3417 utf8_curlen = 0;
3418
3419 {
3420 STRLEN pos, len, byte_len, byte_pos;
3421
3422 if (!translate_substr_offsets(
3423 curlen, pos1_iv, pos1_is_uv, len_iv, len_is_uv, &pos, &len
3424 )) goto bound_fail;
3425
3426 byte_len = len;
3427 byte_pos = utf8_curlen
3428 ? sv_or_pv_pos_u2b(sv, tmps, pos, &byte_len) : pos;
3429
3430 tmps += byte_pos;
3431
3432 if (rvalue) {
3433 SvTAINTED_off(TARG); /* decontaminate */
3434 SvUTF8_off(TARG); /* decontaminate */
3435 sv_setpvn(TARG, tmps, byte_len);
3436#ifdef USE_LOCALE_COLLATE
3437 sv_unmagic(TARG, PERL_MAGIC_collxfrm);
3438#endif
3439 if (utf8_curlen)
3440 SvUTF8_on(TARG);
3441 }
3442
3443 if (repl) {
3444 SV* repl_sv_copy = NULL;
3445
3446 if (repl_need_utf8_upgrade) {
3447 repl_sv_copy = newSVsv(repl_sv);
3448 sv_utf8_upgrade(repl_sv_copy);
3449 repl = SvPV_const(repl_sv_copy, repl_len);
3450 }
3451 if (!SvOK(sv))
3452 SvPVCLEAR(sv);
3453 sv_insert_flags(sv, byte_pos, byte_len, repl, repl_len, 0);
3454 SvREFCNT_dec(repl_sv_copy);
3455 }
3456 }
3457 if (PL_op->op_private & OPpSUBSTR_REPL_FIRST)
3458 SP++;
3459 else if (rvalue) {
3460 SvSETMAGIC(TARG);
3461 PUSHs(TARG);
3462 }
3463 RETURN;
3464
3465 bound_fail:
3466 if (repl)
3467 Perl_croak(aTHX_ "substr outside of string");
3468 Perl_ck_warner(aTHX_ packWARN(WARN_SUBSTR), "substr outside of string");
3469 RETPUSHUNDEF;
3470}
3471
3472PP(pp_vec)
3473{
3474 dSP;
3475 const IV size = POPi;
3476 SV* offsetsv = POPs;
3477 SV * const src = POPs;
3478 const I32 lvalue = PL_op->op_flags & OPf_MOD || LVRET;
3479 SV * ret;
3480 UV retuv = 0;
3481 STRLEN offset;
3482
3483 /* extract a STRLEN-ranged integer value from offsetsv into offset,
3484 * or die trying */
3485 {
3486 IV iv = SvIV(offsetsv);
3487
3488 /* avoid a large UV being wrapped to a negative value */
3489 if (SvIOK_UV(offsetsv) && SvUVX(offsetsv) > (UV)IV_MAX) {
3490 if (!lvalue)
3491 goto return_val; /* out of range: return 0 */
3492 Perl_croak_nocontext("Out of memory!");
3493 }
3494
3495 if (iv < 0) {
3496 if (!lvalue)
3497 goto return_val; /* out of range: return 0 */
3498 Perl_croak_nocontext("Negative offset to vec in lvalue context");
3499 }
3500
3501#if PTRSIZE < IVSIZE
3502 if (iv > Size_t_MAX) {
3503 if (!lvalue)
3504 goto return_val; /* out of range: return 0 */
3505 Perl_croak_nocontext("Out of memory!");
3506 }
3507#endif
3508
3509 offset = (STRLEN)iv;
3510 }
3511
3512 retuv = do_vecget(src, offset, size);
3513
3514 return_val:
3515
3516 if (lvalue) { /* it's an lvalue! */
3517 ret = sv_2mortal(newSV_type(SVt_PVLV)); /* Not TARG RT#67838 */
3518 sv_magic(ret, NULL, PERL_MAGIC_vec, NULL, 0);
3519 LvTYPE(ret) = 'v';
3520 LvTARG(ret) = SvREFCNT_inc_simple(src);
3521 LvTARGOFF(ret) = offset;
3522 LvTARGLEN(ret) = size;
3523 }
3524 else {
3525 dTARGET;
3526 SvTAINTED_off(TARG); /* decontaminate */
3527 ret = TARG;
3528 }
3529
3530
3531 sv_setuv(ret, retuv);
3532 if (!lvalue)
3533 SvSETMAGIC(ret);
3534 PUSHs(ret);
3535 RETURN;
3536}
3537
3538
3539/* also used for: pp_rindex() */
3540
3541PP(pp_index)
3542{
3543 dSP; dTARGET;
3544 SV *big;
3545 SV *little;
3546 SV *temp = NULL;
3547 STRLEN biglen;
3548 STRLEN llen = 0;
3549 SSize_t offset = 0;
3550 SSize_t retval;
3551 const char *big_p;
3552 const char *little_p;
3553 bool big_utf8;
3554 bool little_utf8;
3555 const bool is_index = PL_op->op_type == OP_INDEX;
3556 const bool threeargs = MAXARG >= 3 && (TOPs || ((void)POPs,0));
3557
3558 if (threeargs)
3559 offset = POPi;
3560 little = POPs;
3561 big = POPs;
3562 big_p = SvPV_const(big, biglen);
3563 little_p = SvPV_const(little, llen);
3564
3565 big_utf8 = DO_UTF8(big);
3566 little_utf8 = DO_UTF8(little);
3567 if (big_utf8 ^ little_utf8) {
3568 /* One needs to be upgraded. */
3569 if (little_utf8) {
3570 /* Well, maybe instead we might be able to downgrade the small
3571 string? */
3572 char * const pv = (char*)bytes_from_utf8((U8 *)little_p, &llen,
3573 &little_utf8);
3574 if (little_utf8) {
3575 /* If the large string is ISO-8859-1, and it's not possible to
3576 convert the small string to ISO-8859-1, then there is no
3577 way that it could be found anywhere by index. */
3578 retval = -1;
3579 goto fail;
3580 }
3581
3582 /* At this point, pv is a malloc()ed string. So donate it to temp
3583 to ensure it will get free()d */
3584 little = temp = newSV(0);
3585 sv_usepvn(temp, pv, llen);
3586 little_p = SvPVX(little);
3587 } else {
3588 temp = newSVpvn(little_p, llen);
3589
3590 sv_utf8_upgrade(temp);
3591 little = temp;
3592 little_p = SvPV_const(little, llen);
3593 }
3594 }
3595 if (SvGAMAGIC(big)) {
3596 /* Life just becomes a lot easier if I use a temporary here.
3597 Otherwise I need to avoid calls to sv_pos_u2b(), which (dangerously)
3598 will trigger magic and overloading again, as will fbm_instr()
3599 */
3600 big = newSVpvn_flags(big_p, biglen,
3601 SVs_TEMP | (big_utf8 ? SVf_UTF8 : 0));
3602 big_p = SvPVX(big);
3603 }
3604 if (SvGAMAGIC(little) || (is_index && !SvOK(little))) {
3605 /* index && SvOK() is a hack. fbm_instr() calls SvPV_const, which will
3606 warn on undef, and we've already triggered a warning with the
3607 SvPV_const some lines above. We can't remove that, as we need to
3608 call some SvPV to trigger overloading early and find out if the
3609 string is UTF-8.
3610 This is all getting too messy. The API isn't quite clean enough,
3611 because data access has side effects.
3612 */
3613 little = newSVpvn_flags(little_p, llen,
3614 SVs_TEMP | (little_utf8 ? SVf_UTF8 : 0));
3615 little_p = SvPVX(little);
3616 }
3617
3618 if (!threeargs)
3619 offset = is_index ? 0 : biglen;
3620 else {
3621 if (big_utf8 && offset > 0)
3622 offset = sv_pos_u2b_flags(big, offset, 0, SV_CONST_RETURN);
3623 if (!is_index)
3624 offset += llen;
3625 }
3626 if (offset < 0)
3627 offset = 0;
3628 else if (offset > (SSize_t)biglen)
3629 offset = biglen;
3630 if (!(little_p = is_index
3631 ? fbm_instr((unsigned char*)big_p + offset,
3632 (unsigned char*)big_p + biglen, little, 0)
3633 : rninstr(big_p, big_p + offset,
3634 little_p, little_p + llen)))
3635 retval = -1;
3636 else {
3637 retval = little_p - big_p;
3638 if (retval > 1 && big_utf8)
3639 retval = sv_pos_b2u_flags(big, retval, SV_CONST_RETURN);
3640 }
3641 SvREFCNT_dec(temp);
3642 fail:
3643 PUSHi(retval);
3644 RETURN;
3645}
3646
3647PP(pp_sprintf)
3648{
3649 dSP; dMARK; dORIGMARK; dTARGET;
3650 SvTAINTED_off(TARG);
3651 do_sprintf(TARG, SP-MARK, MARK+1);
3652 TAINT_IF(SvTAINTED(TARG));
3653 SP = ORIGMARK;
3654 PUSHTARG;
3655 RETURN;
3656}
3657
3658PP(pp_ord)
3659{
3660 dSP; dTARGET;
3661
3662 SV *argsv = TOPs;
3663 STRLEN len;
3664 const U8 *s = (U8*)SvPV_const(argsv, len);
3665
3666 SETu(DO_UTF8(argsv)
3667 ? (len ? utf8n_to_uvchr(s, len, 0, UTF8_ALLOW_ANYUV) : 0)
3668 : (UV)(*s));
3669
3670 return NORMAL;
3671}
3672
3673PP(pp_chr)
3674{
3675 dSP; dTARGET;
3676 char *tmps;
3677 UV value;
3678 SV *top = TOPs;
3679
3680 SvGETMAGIC(top);
3681 if (UNLIKELY(SvAMAGIC(top)))
3682 top = sv_2num(top);
3683 if (UNLIKELY(isinfnansv(top)))
3684 Perl_croak(aTHX_ "Cannot chr %" NVgf, SvNV(top));
3685 else {
3686 if (!IN_BYTES /* under bytes, chr(-1) eq chr(0xff), etc. */
3687 && ((SvIOKp(top) && !SvIsUV(top) && SvIV_nomg(top) < 0)
3688 ||
3689 ((SvNOKp(top) || (SvOK(top) && !SvIsUV(top)))
3690 && SvNV_nomg(top) < 0.0)))
3691 {
3692 if (ckWARN(WARN_UTF8)) {
3693 if (SvGMAGICAL(top)) {
3694 SV *top2 = sv_newmortal();
3695 sv_setsv_nomg(top2, top);
3696 top = top2;
3697 }
3698 Perl_warner(aTHX_ packWARN(WARN_UTF8),
3699 "Invalid negative number (%" SVf ") in chr", SVfARG(top));
3700 }
3701 value = UNICODE_REPLACEMENT;
3702 } else {
3703 value = SvUV_nomg(top);
3704 }
3705 }
3706
3707 SvUPGRADE(TARG,SVt_PV);
3708
3709 if (value > 255 && !IN_BYTES) {
3710 SvGROW(TARG, (STRLEN)UVCHR_SKIP(value)+1);
3711 tmps = (char*)uvchr_to_utf8_flags((U8*)SvPVX(TARG), value, 0);
3712 SvCUR_set(TARG, tmps - SvPVX_const(TARG));
3713 *tmps = '\0';
3714 (void)SvPOK_only(TARG);
3715 SvUTF8_on(TARG);
3716 SETTARG;
3717 return NORMAL;
3718 }
3719
3720 SvGROW(TARG,2);
3721 SvCUR_set(TARG, 1);
3722 tmps = SvPVX(TARG);
3723 *tmps++ = (char)value;
3724 *tmps = '\0';
3725 (void)SvPOK_only(TARG);
3726
3727 SETTARG;
3728 return NORMAL;
3729}
3730
3731PP(pp_crypt)
3732{
3733#ifdef HAS_CRYPT
3734 dSP; dTARGET;
3735 dPOPTOPssrl;
3736 STRLEN len;
3737 const char *tmps = SvPV_const(left, len);
3738
3739 if (DO_UTF8(left)) {
3740 /* If Unicode, try to downgrade.
3741 * If not possible, croak.
3742 * Yes, we made this up. */
3743 SV* const tsv = newSVpvn_flags(tmps, len, SVf_UTF8|SVs_TEMP);
3744
3745 sv_utf8_downgrade(tsv, FALSE);
3746 tmps = SvPV_const(tsv, len);
3747 }
3748# ifdef USE_ITHREADS
3749# ifdef HAS_CRYPT_R
3750 if (!PL_reentrant_buffer->_crypt_struct_buffer) {
3751 /* This should be threadsafe because in ithreads there is only
3752 * one thread per interpreter. If this would not be true,
3753 * we would need a mutex to protect this malloc. */
3754 PL_reentrant_buffer->_crypt_struct_buffer =
3755 (struct crypt_data *)safemalloc(sizeof(struct crypt_data));
3756#if defined(__GLIBC__) || defined(__EMX__)
3757 if (PL_reentrant_buffer->_crypt_struct_buffer) {
3758 PL_reentrant_buffer->_crypt_struct_buffer->initialized = 0;
3759 /* work around glibc-2.2.5 bug */
3760 PL_reentrant_buffer->_crypt_struct_buffer->current_saltbits = 0;
3761 }
3762#endif
3763 }
3764# endif /* HAS_CRYPT_R */
3765# endif /* USE_ITHREADS */
3766# ifdef FCRYPT
3767 sv_setpv(TARG, fcrypt(tmps, SvPV_nolen_const(right)));
3768# else
3769 sv_setpv(TARG, PerlProc_crypt(tmps, SvPV_nolen_const(right)));
3770# endif
3771 SvUTF8_off(TARG);
3772 SETTARG;
3773 RETURN;
3774#else
3775 DIE(aTHX_
3776 "The crypt() function is unimplemented due to excessive paranoia.");
3777#endif
3778}
3779
3780/* Generally UTF-8 and UTF-EBCDIC are indistinguishable at this level. So
3781 * most comments below say UTF-8, when in fact they mean UTF-EBCDIC as well */
3782
3783
3784/* also used for: pp_lcfirst() */
3785
3786PP(pp_ucfirst)
3787{
3788 /* Actually is both lcfirst() and ucfirst(). Only the first character
3789 * changes. This means that possibly we can change in-place, ie., just
3790 * take the source and change that one character and store it back, but not
3791 * if read-only etc, or if the length changes */
3792
3793 dSP;
3794 SV *source = TOPs;
3795 STRLEN slen; /* slen is the byte length of the whole SV. */
3796 STRLEN need;
3797 SV *dest;
3798 bool inplace; /* ? Convert first char only, in-place */
3799 bool doing_utf8 = FALSE; /* ? using utf8 */
3800 bool convert_source_to_utf8 = FALSE; /* ? need to convert */
3801 const int op_type = PL_op->op_type;
3802 const U8 *s;
3803 U8 *d;
3804 U8 tmpbuf[UTF8_MAXBYTES_CASE+1];
3805 STRLEN ulen; /* ulen is the byte length of the original Unicode character
3806 * stored as UTF-8 at s. */
3807 STRLEN tculen; /* tculen is the byte length of the freshly titlecased (or
3808 * lowercased) character stored in tmpbuf. May be either
3809 * UTF-8 or not, but in either case is the number of bytes */
3810
3811 s = (const U8*)SvPV_const(source, slen);
3812
3813 /* We may be able to get away with changing only the first character, in
3814 * place, but not if read-only, etc. Later we may discover more reasons to
3815 * not convert in-place. */
3816 inplace = !SvREADONLY(source) && SvPADTMP(source);
3817
3818 /* First calculate what the changed first character should be. This affects
3819 * whether we can just swap it out, leaving the rest of the string unchanged,
3820 * or even if have to convert the dest to UTF-8 when the source isn't */
3821
3822 if (! slen) { /* If empty */
3823 need = 1; /* still need a trailing NUL */
3824 ulen = 0;
3825 }
3826 else if (DO_UTF8(source)) { /* Is the source utf8? */
3827 doing_utf8 = TRUE;
3828 ulen = UTF8SKIP(s);
3829 if (op_type == OP_UCFIRST) {
3830#ifdef USE_LOCALE_CTYPE
3831 _toTITLE_utf8_flags(s, s +slen, tmpbuf, &tculen, IN_LC_RUNTIME(LC_CTYPE));
3832#else
3833 _toTITLE_utf8_flags(s, s +slen, tmpbuf, &tculen, 0);
3834#endif
3835 }
3836 else {
3837#ifdef USE_LOCALE_CTYPE
3838 _toLOWER_utf8_flags(s, s + slen, tmpbuf, &tculen, IN_LC_RUNTIME(LC_CTYPE));
3839#else
3840 _toLOWER_utf8_flags(s, s + slen, tmpbuf, &tculen, 0);
3841#endif
3842 }
3843
3844 /* we can't do in-place if the length changes. */
3845 if (ulen != tculen) inplace = FALSE;
3846 need = slen + 1 - ulen + tculen;
3847 }
3848 else { /* Non-zero length, non-UTF-8, Need to consider locale and if
3849 * latin1 is treated as caseless. Note that a locale takes
3850 * precedence */
3851 ulen = 1; /* Original character is 1 byte */
3852 tculen = 1; /* Most characters will require one byte, but this will
3853 * need to be overridden for the tricky ones */
3854 need = slen + 1;
3855
3856 if (op_type == OP_LCFIRST) {
3857
3858 /* lower case the first letter: no trickiness for any character */
3859#ifdef USE_LOCALE_CTYPE
3860 if (IN_LC_RUNTIME(LC_CTYPE)) {
3861 _CHECK_AND_WARN_PROBLEMATIC_LOCALE;
3862 *tmpbuf = toLOWER_LC(*s);
3863 }
3864 else
3865#endif
3866 {
3867 *tmpbuf = (IN_UNI_8_BIT)
3868 ? toLOWER_LATIN1(*s)
3869 : toLOWER(*s);
3870 }
3871 }
3872#ifdef USE_LOCALE_CTYPE
3873 /* is ucfirst() */
3874 else if (IN_LC_RUNTIME(LC_CTYPE)) {
3875 if (IN_UTF8_CTYPE_LOCALE) {
3876 goto do_uni_rules;
3877 }
3878
3879 _CHECK_AND_WARN_PROBLEMATIC_LOCALE;
3880 *tmpbuf = (U8) toUPPER_LC(*s); /* This would be a bug if any
3881 locales have upper and title case
3882 different */
3883 }
3884#endif
3885 else if (! IN_UNI_8_BIT) {
3886 *tmpbuf = toUPPER(*s); /* Returns caseless for non-ascii, or
3887 * on EBCDIC machines whatever the
3888 * native function does */
3889 }
3890 else {
3891 /* Here, is ucfirst non-UTF-8, not in locale (unless that locale is
3892 * UTF-8, which we treat as not in locale), and cased latin1 */
3893 UV title_ord;
3894#ifdef USE_LOCALE_CTYPE
3895 do_uni_rules:
3896#endif
3897
3898 title_ord = _to_upper_title_latin1(*s, tmpbuf, &tculen, 's');
3899 if (tculen > 1) {
3900 assert(tculen == 2);
3901
3902 /* If the result is an upper Latin1-range character, it can
3903 * still be represented in one byte, which is its ordinal */
3904 if (UTF8_IS_DOWNGRADEABLE_START(*tmpbuf)) {
3905 *tmpbuf = (U8) title_ord;
3906 tculen = 1;
3907 }
3908 else {
3909 /* Otherwise it became more than one ASCII character (in
3910 * the case of LATIN_SMALL_LETTER_SHARP_S) or changed to
3911 * beyond Latin1, so the number of bytes changed, so can't
3912 * replace just the first character in place. */
3913 inplace = FALSE;
3914
3915 /* If the result won't fit in a byte, the entire result
3916 * will have to be in UTF-8. Assume worst case sizing in
3917 * conversion. (all latin1 characters occupy at most two
3918 * bytes in utf8) */
3919 if (title_ord > 255) {
3920 doing_utf8 = TRUE;
3921 convert_source_to_utf8 = TRUE;
3922 need = slen * 2 + 1;
3923
3924 /* The (converted) UTF-8 and UTF-EBCDIC lengths of all
3925 * (both) characters whose title case is above 255 is
3926 * 2. */
3927 ulen = 2;
3928 }
3929 else { /* LATIN_SMALL_LETTER_SHARP_S expands by 1 byte */
3930 need = slen + 1 + 1;
3931 }
3932 }
3933 }
3934 } /* End of use Unicode (Latin1) semantics */
3935 } /* End of changing the case of the first character */
3936
3937 /* Here, have the first character's changed case stored in tmpbuf. Ready to
3938 * generate the result */
3939 if (inplace) {
3940
3941 /* We can convert in place. This means we change just the first
3942 * character without disturbing the rest; no need to grow */
3943 dest = source;
3944 s = d = (U8*)SvPV_force_nomg(source, slen);
3945 } else {
3946 dTARGET;
3947
3948 dest = TARG;
3949
3950 /* Here, we can't convert in place; we earlier calculated how much
3951 * space we will need, so grow to accommodate that */
3952 SvUPGRADE(dest, SVt_PV);
3953 d = (U8*)SvGROW(dest, need);
3954 (void)SvPOK_only(dest);
3955
3956 SETs(dest);
3957 }
3958
3959 if (doing_utf8) {
3960 if (! inplace) {
3961 if (! convert_source_to_utf8) {
3962
3963 /* Here both source and dest are in UTF-8, but have to create
3964 * the entire output. We initialize the result to be the
3965 * title/lower cased first character, and then append the rest
3966 * of the string. */
3967 sv_setpvn(dest, (char*)tmpbuf, tculen);
3968 if (slen > ulen) {
3969 sv_catpvn(dest, (char*)(s + ulen), slen - ulen);
3970 }
3971 }
3972 else {
3973 const U8 *const send = s + slen;
3974
3975 /* Here the dest needs to be in UTF-8, but the source isn't,
3976 * except we earlier UTF-8'd the first character of the source
3977 * into tmpbuf. First put that into dest, and then append the
3978 * rest of the source, converting it to UTF-8 as we go. */
3979
3980 /* Assert tculen is 2 here because the only two characters that
3981 * get to this part of the code have 2-byte UTF-8 equivalents */
3982 *d++ = *tmpbuf;
3983 *d++ = *(tmpbuf + 1);
3984 s++; /* We have just processed the 1st char */
3985
3986 for (; s < send; s++) {
3987 d = uvchr_to_utf8(d, *s);
3988 }
3989 *d = '\0';
3990 SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
3991 }
3992 SvUTF8_on(dest);
3993 }
3994 else { /* in-place UTF-8. Just overwrite the first character */
3995 Copy(tmpbuf, d, tculen, U8);
3996 SvCUR_set(dest, need - 1);
3997 }
3998
3999 }
4000 else { /* Neither source nor dest are in or need to be UTF-8 */
4001 if (slen) {
4002 if (inplace) { /* in-place, only need to change the 1st char */
4003 *d = *tmpbuf;
4004 }
4005 else { /* Not in-place */
4006
4007 /* Copy the case-changed character(s) from tmpbuf */
4008 Copy(tmpbuf, d, tculen, U8);
4009 d += tculen - 1; /* Code below expects d to point to final
4010 * character stored */
4011 }
4012 }
4013 else { /* empty source */
4014 /* See bug #39028: Don't taint if empty */
4015 *d = *s;
4016 }
4017
4018 /* In a "use bytes" we don't treat the source as UTF-8, but, still want
4019 * the destination to retain that flag */
4020 if (SvUTF8(source) && ! IN_BYTES)
4021 SvUTF8_on(dest);
4022
4023 if (!inplace) { /* Finish the rest of the string, unchanged */
4024 /* This will copy the trailing NUL */
4025 Copy(s + 1, d + 1, slen, U8);
4026 SvCUR_set(dest, need - 1);
4027 }
4028 }
4029#ifdef USE_LOCALE_CTYPE
4030 if (IN_LC_RUNTIME(LC_CTYPE)) {
4031 TAINT;
4032 SvTAINTED_on(dest);
4033 }
4034#endif
4035 if (dest != source && SvTAINTED(source))
4036 SvTAINT(dest);
4037 SvSETMAGIC(dest);
4038 return NORMAL;
4039}
4040
4041/* There's so much setup/teardown code common between uc and lc, I wonder if
4042 it would be worth merging the two, and just having a switch outside each
4043 of the three tight loops. There is less and less commonality though */
4044PP(pp_uc)
4045{
4046 dSP;
4047 SV *source = TOPs;
4048 STRLEN len;
4049 STRLEN min;
4050 SV *dest;
4051 const U8 *s;
4052 U8 *d;
4053
4054 SvGETMAGIC(source);
4055
4056 if ( SvPADTMP(source)
4057 && !SvREADONLY(source) && SvPOK(source)
4058 && !DO_UTF8(source)
4059 && (
4060#ifdef USE_LOCALE_CTYPE
4061 (IN_LC_RUNTIME(LC_CTYPE))
4062 ? ! IN_UTF8_CTYPE_LOCALE
4063 :
4064#endif
4065 ! IN_UNI_8_BIT))
4066 {
4067
4068 /* We can convert in place. The reason we can't if in UNI_8_BIT is to
4069 * make the loop tight, so we overwrite the source with the dest before
4070 * looking at it, and we need to look at the original source
4071 * afterwards. There would also need to be code added to handle
4072 * switching to not in-place in midstream if we run into characters
4073 * that change the length. Since being in locale overrides UNI_8_BIT,
4074 * that latter becomes irrelevant in the above test; instead for
4075 * locale, the size can't normally change, except if the locale is a
4076 * UTF-8 one */
4077 dest = source;
4078 s = d = (U8*)SvPV_force_nomg(source, len);
4079 min = len + 1;
4080 } else {
4081 dTARGET;
4082
4083 dest = TARG;
4084
4085 s = (const U8*)SvPV_nomg_const(source, len);
4086 min = len + 1;
4087
4088 SvUPGRADE(dest, SVt_PV);
4089 d = (U8*)SvGROW(dest, min);
4090 (void)SvPOK_only(dest);
4091
4092 SETs(dest);
4093 }
4094
4095 /* Overloaded values may have toggled the UTF-8 flag on source, so we need
4096 to check DO_UTF8 again here. */
4097
4098 if (DO_UTF8(source)) {
4099 const U8 *const send = s + len;
4100 U8 tmpbuf[UTF8_MAXBYTES_CASE+1];
4101
4102 /* All occurrences of these are to be moved to follow any other marks.
4103 * This is context-dependent. We may not be passed enough context to
4104 * move the iota subscript beyond all of them, but we do the best we can
4105 * with what we're given. The result is always better than if we
4106 * hadn't done this. And, the problem would only arise if we are
4107 * passed a character without all its combining marks, which would be
4108 * the caller's mistake. The information this is based on comes from a
4109 * comment in Unicode SpecialCasing.txt, (and the Standard's text
4110 * itself) and so can't be checked properly to see if it ever gets
4111 * revised. But the likelihood of it changing is remote */
4112 bool in_iota_subscript = FALSE;
4113
4114 while (s < send) {
4115 STRLEN u;
4116 STRLEN ulen;
4117 UV uv;
4118 if (in_iota_subscript && ! _is_utf8_mark(s)) {
4119
4120 /* A non-mark. Time to output the iota subscript */
4121 Copy(GREEK_CAPITAL_LETTER_IOTA_UTF8, d, capital_iota_len, U8);
4122 d += capital_iota_len;
4123 in_iota_subscript = FALSE;
4124 }
4125
4126 /* Then handle the current character. Get the changed case value
4127 * and copy it to the output buffer */
4128
4129 u = UTF8SKIP(s);
4130#ifdef USE_LOCALE_CTYPE
4131 uv = _toUPPER_utf8_flags(s, send, tmpbuf, &ulen, IN_LC_RUNTIME(LC_CTYPE));
4132#else
4133 uv = _toUPPER_utf8_flags(s, send, tmpbuf, &ulen, 0);
4134#endif
4135#define GREEK_CAPITAL_LETTER_IOTA 0x0399
4136#define COMBINING_GREEK_YPOGEGRAMMENI 0x0345
4137 if (uv == GREEK_CAPITAL_LETTER_IOTA
4138 && utf8_to_uvchr_buf(s, send, 0) == COMBINING_GREEK_YPOGEGRAMMENI)
4139 {
4140 in_iota_subscript = TRUE;
4141 }
4142 else {
4143 if (ulen > u && (SvLEN(dest) < (min += ulen - u))) {
4144 /* If the eventually required minimum size outgrows the
4145 * available space, we need to grow. */
4146 const UV o = d - (U8*)SvPVX_const(dest);
4147
4148 /* If someone uppercases one million U+03B0s we SvGROW()
4149 * one million times. Or we could try guessing how much to
4150 * allocate without allocating too much. Such is life.
4151 * See corresponding comment in lc code for another option
4152 * */
4153 d = o + (U8*) SvGROW(dest, min);
4154 }
4155 Copy(tmpbuf, d, ulen, U8);
4156 d += ulen;
4157 }
4158 s += u;
4159 }
4160 if (in_iota_subscript) {
4161 Copy(GREEK_CAPITAL_LETTER_IOTA_UTF8, d, capital_iota_len, U8);
4162 d += capital_iota_len;
4163 }
4164 SvUTF8_on(dest);
4165 *d = '\0';
4166
4167 SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
4168 }
4169 else { /* Not UTF-8 */
4170 if (len) {
4171 const U8 *const send = s + len;
4172
4173 /* Use locale casing if in locale; regular style if not treating
4174 * latin1 as having case; otherwise the latin1 casing. Do the
4175 * whole thing in a tight loop, for speed, */
4176#ifdef USE_LOCALE_CTYPE
4177 if (IN_LC_RUNTIME(LC_CTYPE)) {
4178 if (IN_UTF8_CTYPE_LOCALE) {
4179 goto do_uni_rules;
4180 }
4181 _CHECK_AND_WARN_PROBLEMATIC_LOCALE;
4182 for (; s < send; d++, s++)
4183 *d = (U8) toUPPER_LC(*s);
4184 }
4185 else
4186#endif
4187 if (! IN_UNI_8_BIT) {
4188 for (; s < send; d++, s++) {
4189 *d = toUPPER(*s);
4190 }
4191 }
4192 else {
4193#ifdef USE_LOCALE_CTYPE
4194 do_uni_rules:
4195#endif
4196 for (; s < send; d++, s++) {
4197 *d = toUPPER_LATIN1_MOD(*s);
4198 if (LIKELY(*d != LATIN_SMALL_LETTER_Y_WITH_DIAERESIS)) {
4199 continue;
4200 }
4201
4202 /* The mainstream case is the tight loop above. To avoid
4203 * extra tests in that, all three characters that require
4204 * special handling are mapped by the MOD to the one tested
4205 * just above.
4206 * Use the source to distinguish between the three cases */
4207
4208#if UNICODE_MAJOR_VERSION > 2 \
4209 || (UNICODE_MAJOR_VERSION == 2 && UNICODE_DOT_VERSION >= 1 \
4210 && UNICODE_DOT_DOT_VERSION >= 8)
4211 if (*s == LATIN_SMALL_LETTER_SHARP_S) {
4212
4213 /* uc() of this requires 2 characters, but they are
4214 * ASCII. If not enough room, grow the string */
4215 if (SvLEN(dest) < ++min) {
4216 const UV o = d - (U8*)SvPVX_const(dest);
4217 d = o + (U8*) SvGROW(dest, min);
4218 }
4219 *d++ = 'S'; *d = 'S'; /* upper case is 'SS' */
4220 continue; /* Back to the tight loop; still in ASCII */
4221 }
4222#endif
4223
4224 /* The other two special handling characters have their
4225 * upper cases outside the latin1 range, hence need to be
4226 * in UTF-8, so the whole result needs to be in UTF-8. So,
4227 * here we are somewhere in the middle of processing a
4228 * non-UTF-8 string, and realize that we will have to convert
4229 * the whole thing to UTF-8. What to do? There are
4230 * several possibilities. The simplest to code is to
4231 * convert what we have so far, set a flag, and continue on
4232 * in the loop. The flag would be tested each time through
4233 * the loop, and if set, the next character would be
4234 * converted to UTF-8 and stored. But, I (khw) didn't want
4235 * to slow down the mainstream case at all for this fairly
4236 * rare case, so I didn't want to add a test that didn't
4237 * absolutely have to be there in the loop, besides the
4238 * possibility that it would get too complicated for
4239 * optimizers to deal with. Another possibility is to just
4240 * give up, convert the source to UTF-8, and restart the
4241 * function that way. Another possibility is to convert
4242 * both what has already been processed and what is yet to
4243 * come separately to UTF-8, then jump into the loop that
4244 * handles UTF-8. But the most efficient time-wise of the
4245 * ones I could think of is what follows, and turned out to
4246 * not require much extra code. */
4247
4248 /* Convert what we have so far into UTF-8, telling the
4249 * function that we know it should be converted, and to
4250 * allow extra space for what we haven't processed yet.
4251 * Assume the worst case space requirements for converting
4252 * what we haven't processed so far: that it will require
4253 * two bytes for each remaining source character, plus the
4254 * NUL at the end. This may cause the string pointer to
4255 * move, so re-find it. */
4256
4257 len = d - (U8*)SvPVX_const(dest);
4258 SvCUR_set(dest, len);
4259 len = sv_utf8_upgrade_flags_grow(dest,
4260 SV_GMAGIC|SV_FORCE_UTF8_UPGRADE,
4261 (send -s) * 2 + 1);
4262 d = (U8*)SvPVX(dest) + len;
4263
4264 /* Now process the remainder of the source, converting to
4265 * upper and UTF-8. If a resulting byte is invariant in
4266 * UTF-8, output it as-is, otherwise convert to UTF-8 and
4267 * append it to the output. */
4268 for (; s < send; s++) {
4269 (void) _to_upper_title_latin1(*s, d, &len, 'S');
4270 d += len;
4271 }
4272
4273 /* Here have processed the whole source; no need to continue
4274 * with the outer loop. Each character has been converted
4275 * to upper case and converted to UTF-8 */
4276
4277 break;
4278 } /* End of processing all latin1-style chars */
4279 } /* End of processing all chars */
4280 } /* End of source is not empty */
4281
4282 if (source != dest) {
4283 *d = '\0'; /* Here d points to 1 after last char, add NUL */
4284 SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
4285 }
4286 } /* End of isn't utf8 */
4287#ifdef USE_LOCALE_CTYPE
4288 if (IN_LC_RUNTIME(LC_CTYPE)) {
4289 TAINT;
4290 SvTAINTED_on(dest);
4291 }
4292#endif
4293 if (dest != source && SvTAINTED(source))
4294 SvTAINT(dest);
4295 SvSETMAGIC(dest);
4296 return NORMAL;
4297}
4298
4299PP(pp_lc)
4300{
4301 dSP;
4302 SV *source = TOPs;
4303 STRLEN len;
4304 STRLEN min;
4305 SV *dest;
4306 const U8 *s;
4307 U8 *d;
4308
4309 SvGETMAGIC(source);
4310
4311 if ( SvPADTMP(source)
4312 && !SvREADONLY(source) && SvPOK(source)
4313 && !DO_UTF8(source)) {
4314
4315 /* We can convert in place, as lowercasing anything in the latin1 range
4316 * (or else DO_UTF8 would have been on) doesn't lengthen it */
4317 dest = source;
4318 s = d = (U8*)SvPV_force_nomg(source, len);
4319 min = len + 1;
4320 } else {
4321 dTARGET;
4322
4323 dest = TARG;
4324
4325 s = (const U8*)SvPV_nomg_const(source, len);
4326 min = len + 1;
4327
4328 SvUPGRADE(dest, SVt_PV);
4329 d = (U8*)SvGROW(dest, min);
4330 (void)SvPOK_only(dest);
4331
4332 SETs(dest);
4333 }
4334
4335 /* Overloaded values may have toggled the UTF-8 flag on source, so we need
4336 to check DO_UTF8 again here. */
4337
4338 if (DO_UTF8(source)) {
4339 const U8 *const send = s + len;
4340 U8 tmpbuf[UTF8_MAXBYTES_CASE+1];
4341
4342 while (s < send) {
4343 const STRLEN u = UTF8SKIP(s);
4344 STRLEN ulen;
4345
4346#ifdef USE_LOCALE_CTYPE
4347 _toLOWER_utf8_flags(s, send, tmpbuf, &ulen, IN_LC_RUNTIME(LC_CTYPE));
4348#else
4349 _toLOWER_utf8_flags(s, send, tmpbuf, &ulen, 0);
4350#endif
4351
4352 /* Here is where we would do context-sensitive actions. See the
4353 * commit message for 86510fb15 for why there isn't any */
4354
4355 if (ulen > u && (SvLEN(dest) < (min += ulen - u))) {
4356
4357 /* If the eventually required minimum size outgrows the
4358 * available space, we need to grow. */
4359 const UV o = d - (U8*)SvPVX_const(dest);
4360
4361 /* If someone lowercases one million U+0130s we SvGROW() one
4362 * million times. Or we could try guessing how much to
4363 * allocate without allocating too much. Such is life.
4364 * Another option would be to grow an extra byte or two more
4365 * each time we need to grow, which would cut down the million
4366 * to 500K, with little waste */
4367 d = o + (U8*) SvGROW(dest, min);
4368 }
4369
4370 /* Copy the newly lowercased letter to the output buffer we're
4371 * building */
4372 Copy(tmpbuf, d, ulen, U8);
4373 d += ulen;
4374 s += u;
4375 } /* End of looping through the source string */
4376 SvUTF8_on(dest);
4377 *d = '\0';
4378 SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
4379 } else { /* Not utf8 */
4380 if (len) {
4381 const U8 *const send = s + len;
4382
4383 /* Use locale casing if in locale; regular style if not treating
4384 * latin1 as having case; otherwise the latin1 casing. Do the
4385 * whole thing in a tight loop, for speed, */
4386#ifdef USE_LOCALE_CTYPE
4387 if (IN_LC_RUNTIME(LC_CTYPE)) {
4388 _CHECK_AND_WARN_PROBLEMATIC_LOCALE;
4389 for (; s < send; d++, s++)
4390 *d = toLOWER_LC(*s);
4391 }
4392 else
4393#endif
4394 if (! IN_UNI_8_BIT) {
4395 for (; s < send; d++, s++) {
4396 *d = toLOWER(*s);
4397 }
4398 }
4399 else {
4400 for (; s < send; d++, s++) {
4401 *d = toLOWER_LATIN1(*s);
4402 }
4403 }
4404 }
4405 if (source != dest) {
4406 *d = '\0';
4407 SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
4408 }
4409 }
4410#ifdef USE_LOCALE_CTYPE
4411 if (IN_LC_RUNTIME(LC_CTYPE)) {
4412 TAINT;
4413 SvTAINTED_on(dest);
4414 }
4415#endif
4416 if (dest != source && SvTAINTED(source))
4417 SvTAINT(dest);
4418 SvSETMAGIC(dest);
4419 return NORMAL;
4420}
4421
4422PP(pp_quotemeta)
4423{
4424 dSP; dTARGET;
4425 SV * const sv = TOPs;
4426 STRLEN len;
4427 const char *s = SvPV_const(sv,len);
4428
4429 SvUTF8_off(TARG); /* decontaminate */
4430 if (len) {
4431 char *d;
4432 SvUPGRADE(TARG, SVt_PV);
4433 SvGROW(TARG, (len * 2) + 1);
4434 d = SvPVX(TARG);
4435 if (DO_UTF8(sv)) {
4436 while (len) {
4437 STRLEN ulen = UTF8SKIP(s);
4438 bool to_quote = FALSE;
4439
4440 if (UTF8_IS_INVARIANT(*s)) {
4441 if (_isQUOTEMETA(*s)) {
4442 to_quote = TRUE;
4443 }
4444 }
4445 else if (UTF8_IS_NEXT_CHAR_DOWNGRADEABLE(s, s + len)) {
4446 if (
4447#ifdef USE_LOCALE_CTYPE
4448 /* In locale, we quote all non-ASCII Latin1 chars.
4449 * Otherwise use the quoting rules */
4450
4451 IN_LC_RUNTIME(LC_CTYPE)
4452 ||
4453#endif
4454 _isQUOTEMETA(EIGHT_BIT_UTF8_TO_NATIVE(*s, *(s + 1))))
4455 {
4456 to_quote = TRUE;
4457 }
4458 }
4459 else if (is_QUOTEMETA_high(s)) {
4460 to_quote = TRUE;
4461 }
4462
4463 if (to_quote) {
4464 *d++ = '\\';
4465 }
4466 if (ulen > len)
4467 ulen = len;
4468 len -= ulen;
4469 while (ulen--)
4470 *d++ = *s++;
4471 }
4472 SvUTF8_on(TARG);
4473 }
4474 else if (IN_UNI_8_BIT) {
4475 while (len--) {
4476 if (_isQUOTEMETA(*s))
4477 *d++ = '\\';
4478 *d++ = *s++;
4479 }
4480 }
4481 else {
4482 /* For non UNI_8_BIT (and hence in locale) just quote all \W
4483 * including everything above ASCII */
4484 while (len--) {
4485 if (!isWORDCHAR_A(*s))
4486 *d++ = '\\';
4487 *d++ = *s++;
4488 }
4489 }
4490 *d = '\0';
4491 SvCUR_set(TARG, d - SvPVX_const(TARG));
4492 (void)SvPOK_only_UTF8(TARG);
4493 }
4494 else
4495 sv_setpvn(TARG, s, len);
4496 SETTARG;
4497 return NORMAL;
4498}
4499
4500PP(pp_fc)
4501{
4502 dTARGET;
4503 dSP;
4504 SV *source = TOPs;
4505 STRLEN len;
4506 STRLEN min;
4507 SV *dest;
4508 const U8 *s;
4509 const U8 *send;
4510 U8 *d;
4511 U8 tmpbuf[UTF8_MAXBYTES_CASE + 1];
4512#if UNICODE_MAJOR_VERSION > 3 /* no multifolds in early Unicode */ \
4513 || (UNICODE_MAJOR_VERSION == 3 && ( UNICODE_DOT_VERSION > 0) \
4514 || UNICODE_DOT_DOT_VERSION > 0)
4515 const bool full_folding = TRUE; /* This variable is here so we can easily
4516 move to more generality later */
4517#else
4518 const bool full_folding = FALSE;
4519#endif
4520 const U8 flags = ( full_folding ? FOLD_FLAGS_FULL : 0 )
4521#ifdef USE_LOCALE_CTYPE
4522 | ( IN_LC_RUNTIME(LC_CTYPE) ? FOLD_FLAGS_LOCALE : 0 )
4523#endif
4524 ;
4525
4526 /* This is a facsimile of pp_lc, but with a thousand bugs thanks to me.
4527 * You are welcome(?) -Hugmeir
4528 */
4529
4530 SvGETMAGIC(source);
4531
4532 dest = TARG;
4533
4534 if (SvOK(source)) {
4535 s = (const U8*)SvPV_nomg_const(source, len);
4536 } else {
4537 if (ckWARN(WARN_UNINITIALIZED))
4538 report_uninit(source);
4539 s = (const U8*)"";
4540 len = 0;
4541 }
4542
4543 min = len + 1;
4544
4545 SvUPGRADE(dest, SVt_PV);
4546 d = (U8*)SvGROW(dest, min);
4547 (void)SvPOK_only(dest);
4548
4549 SETs(dest);
4550
4551 send = s + len;
4552 if (DO_UTF8(source)) { /* UTF-8 flagged string. */
4553 while (s < send) {
4554 const STRLEN u = UTF8SKIP(s);
4555 STRLEN ulen;
4556
4557 _toFOLD_utf8_flags(s, send, tmpbuf, &ulen, flags);
4558
4559 if (ulen > u && (SvLEN(dest) < (min += ulen - u))) {
4560 const UV o = d - (U8*)SvPVX_const(dest);
4561 d = o + (U8*) SvGROW(dest, min);
4562 }
4563
4564 Copy(tmpbuf, d, ulen, U8);
4565 d += ulen;
4566 s += u;
4567 }
4568 SvUTF8_on(dest);
4569 } /* Unflagged string */
4570 else if (len) {
4571#ifdef USE_LOCALE_CTYPE
4572 if ( IN_LC_RUNTIME(LC_CTYPE) ) { /* Under locale */
4573 if (IN_UTF8_CTYPE_LOCALE) {
4574 goto do_uni_folding;
4575 }
4576 _CHECK_AND_WARN_PROBLEMATIC_LOCALE;
4577 for (; s < send; d++, s++)
4578 *d = (U8) toFOLD_LC(*s);
4579 }
4580 else
4581#endif
4582 if ( !IN_UNI_8_BIT ) { /* Under nothing, or bytes */
4583 for (; s < send; d++, s++)
4584 *d = toFOLD(*s);
4585 }
4586 else {
4587#ifdef USE_LOCALE_CTYPE
4588 do_uni_folding:
4589#endif
4590 /* For ASCII and the Latin-1 range, there's only two troublesome
4591 * folds, \x{DF} (\N{LATIN SMALL LETTER SHARP S}), which under full
4592 * casefolding becomes 'ss'; and \x{B5} (\N{MICRO SIGN}), which
4593 * under any fold becomes \x{3BC} (\N{GREEK SMALL LETTER MU}) --
4594 * For the rest, the casefold is their lowercase. */
4595 for (; s < send; d++, s++) {
4596 if (*s == MICRO_SIGN) {
4597 /* \N{MICRO SIGN}'s casefold is \N{GREEK SMALL LETTER MU},
4598 * which is outside of the latin-1 range. There's a couple
4599 * of ways to deal with this -- khw discusses them in
4600 * pp_lc/uc, so go there :) What we do here is upgrade what
4601 * we had already casefolded, then enter an inner loop that
4602 * appends the rest of the characters as UTF-8. */
4603 len = d - (U8*)SvPVX_const(dest);
4604 SvCUR_set(dest, len);
4605 len = sv_utf8_upgrade_flags_grow(dest,
4606 SV_GMAGIC|SV_FORCE_UTF8_UPGRADE,
4607 /* The max expansion for latin1
4608 * chars is 1 byte becomes 2 */
4609 (send -s) * 2 + 1);
4610 d = (U8*)SvPVX(dest) + len;
4611
4612 Copy(GREEK_SMALL_LETTER_MU_UTF8, d, small_mu_len, U8);
4613 d += small_mu_len;
4614 s++;
4615 for (; s < send; s++) {
4616 STRLEN ulen;
4617 UV fc = _to_uni_fold_flags(*s, tmpbuf, &ulen, flags);
4618 if UVCHR_IS_INVARIANT(fc) {
4619 if (full_folding
4620 && *s == LATIN_SMALL_LETTER_SHARP_S)
4621 {
4622 *d++ = 's';
4623 *d++ = 's';
4624 }
4625 else
4626 *d++ = (U8)fc;
4627 }
4628 else {
4629 Copy(tmpbuf, d, ulen, U8);
4630 d += ulen;
4631 }
4632 }
4633 break;
4634 }
4635 else if (full_folding && *s == LATIN_SMALL_LETTER_SHARP_S) {
4636 /* Under full casefolding, LATIN SMALL LETTER SHARP S
4637 * becomes "ss", which may require growing the SV. */
4638 if (SvLEN(dest) < ++min) {
4639 const UV o = d - (U8*)SvPVX_const(dest);
4640 d = o + (U8*) SvGROW(dest, min);
4641 }
4642 *(d)++ = 's';
4643 *d = 's';
4644 }
4645 else { /* If it's not one of those two, the fold is their lower
4646 case */
4647 *d = toLOWER_LATIN1(*s);
4648 }
4649 }
4650 }
4651 }
4652 *d = '\0';
4653 SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
4654
4655#ifdef USE_LOCALE_CTYPE
4656 if (IN_LC_RUNTIME(LC_CTYPE)) {
4657 TAINT;
4658 SvTAINTED_on(dest);
4659 }
4660#endif
4661 if (SvTAINTED(source))
4662 SvTAINT(dest);
4663 SvSETMAGIC(dest);
4664 RETURN;
4665}
4666
4667/* Arrays. */
4668
4669PP(pp_aslice)
4670{
4671 dSP; dMARK; dORIGMARK;
4672 AV *const av = MUTABLE_AV(POPs);
4673 const I32 lval = (PL_op->op_flags & OPf_MOD || LVRET);
4674
4675 if (SvTYPE(av) == SVt_PVAV) {
4676 const bool localizing = PL_op->op_private & OPpLVAL_INTRO;
4677 bool can_preserve = FALSE;
4678
4679 if (localizing) {
4680 MAGIC *mg;
4681 HV *stash;
4682
4683 can_preserve = SvCANEXISTDELETE(av);
4684 }
4685
4686 if (lval && localizing) {
4687 SV **svp;
4688 SSize_t max = -1;
4689 for (svp = MARK + 1; svp <= SP; svp++) {
4690 const SSize_t elem = SvIV(*svp);
4691 if (elem > max)
4692 max = elem;
4693 }
4694 if (max > AvMAX(av))
4695 av_extend(av, max);
4696 }
4697
4698 while (++MARK <= SP) {
4699 SV **svp;
4700 SSize_t elem = SvIV(*MARK);
4701 bool preeminent = TRUE;
4702
4703 if (localizing && can_preserve) {
4704 /* If we can determine whether the element exist,
4705 * Try to preserve the existenceness of a tied array
4706 * element by using EXISTS and DELETE if possible.
4707 * Fallback to FETCH and STORE otherwise. */
4708 preeminent = av_exists(av, elem);
4709 }
4710
4711 svp = av_fetch(av, elem, lval);
4712 if (lval) {
4713 if (!svp || !*svp)
4714 DIE(aTHX_ PL_no_aelem, elem);
4715 if (localizing) {
4716 if (preeminent)
4717 save_aelem(av, elem, svp);
4718 else
4719 SAVEADELETE(av, elem);
4720 }
4721 }
4722 *MARK = svp ? *svp : &PL_sv_undef;
4723 }
4724 }
4725 if (GIMME_V != G_ARRAY) {
4726 MARK = ORIGMARK;
4727 *++MARK = SP > ORIGMARK ? *SP : &PL_sv_undef;
4728 SP = MARK;
4729 }
4730 RETURN;
4731}
4732
4733PP(pp_kvaslice)
4734{
4735 dSP; dMARK;
4736 AV *const av = MUTABLE_AV(POPs);
4737 I32 lval = (PL_op->op_flags & OPf_MOD);
4738 SSize_t items = SP - MARK;
4739
4740 if (PL_op->op_private & OPpMAYBE_LVSUB) {
4741 const I32 flags = is_lvalue_sub();
4742 if (flags) {
4743 if (!(flags & OPpENTERSUB_INARGS))
4744 /* diag_listed_as: Can't modify %s in %s */
4745 Perl_croak(aTHX_ "Can't modify index/value array slice in list assignment");
4746 lval = flags;
4747 }
4748 }
4749
4750 MEXTEND(SP,items);
4751 while (items > 1) {
4752 *(MARK+items*2-1) = *(MARK+items);
4753 items--;
4754 }
4755 items = SP-MARK;
4756 SP += items;
4757
4758 while (++MARK <= SP) {
4759 SV **svp;
4760
4761 svp = av_fetch(av, SvIV(*MARK), lval);
4762 if (lval) {
4763 if (!svp || !*svp || *svp == &PL_sv_undef) {
4764 DIE(aTHX_ PL_no_aelem, SvIV(*MARK));
4765 }
4766 *MARK = sv_mortalcopy(*MARK);
4767 }
4768 *++MARK = svp ? *svp : &PL_sv_undef;
4769 }
4770 if (GIMME_V != G_ARRAY) {
4771 MARK = SP - items*2;
4772 *++MARK = items > 0 ? *SP : &PL_sv_undef;
4773 SP = MARK;
4774 }
4775 RETURN;
4776}
4777
4778
4779PP(pp_aeach)
4780{
4781 dSP;
4782 AV *array = MUTABLE_AV(POPs);
4783 const U8 gimme = GIMME_V;
4784 IV *iterp = Perl_av_iter_p(aTHX_ array);
4785 const IV current = (*iterp)++;
4786
4787 if (current > av_tindex(array)) {
4788 *iterp = 0;
4789 if (gimme == G_SCALAR)
4790 RETPUSHUNDEF;
4791 else
4792 RETURN;
4793 }
4794
4795 EXTEND(SP, 2);
4796 mPUSHi(current);
4797 if (gimme == G_ARRAY) {
4798 SV **const element = av_fetch(array, current, 0);
4799 PUSHs(element ? *element : &PL_sv_undef);
4800 }
4801 RETURN;
4802}
4803
4804/* also used for: pp_avalues()*/
4805PP(pp_akeys)
4806{
4807 dSP;
4808 AV *array = MUTABLE_AV(POPs);
4809 const U8 gimme = GIMME_V;
4810
4811 *Perl_av_iter_p(aTHX_ array) = 0;
4812
4813 if (gimme == G_SCALAR) {
4814 dTARGET;
4815 PUSHi(av_tindex(array) + 1);
4816 }
4817 else if (gimme == G_ARRAY) {
4818 if (UNLIKELY(PL_op->op_private & OPpMAYBE_LVSUB)) {
4819 const I32 flags = is_lvalue_sub();
4820 if (flags && !(flags & OPpENTERSUB_INARGS))
4821 /* diag_listed_as: Can't modify %s in %s */
4822 Perl_croak(aTHX_
4823 "Can't modify keys on array in list assignment");
4824 }
4825 {
4826 IV n = Perl_av_len(aTHX_ array);
4827 IV i;
4828
4829 EXTEND(SP, n + 1);
4830
4831 if ( PL_op->op_type == OP_AKEYS
4832 || ( PL_op->op_type == OP_AVHVSWITCH
4833 && (PL_op->op_private & 3) + OP_AEACH == OP_AKEYS ))
4834 {
4835 for (i = 0; i <= n; i++) {
4836 mPUSHi(i);
4837 }
4838 }
4839 else {
4840 for (i = 0; i <= n; i++) {
4841 SV *const *const elem = Perl_av_fetch(aTHX_ array, i, 0);
4842 PUSHs(elem ? *elem : &PL_sv_undef);
4843 }
4844 }
4845 }
4846 }
4847 RETURN;
4848}
4849
4850/* Associative arrays. */
4851
4852PP(pp_each)
4853{
4854 dSP;
4855 HV * hash = MUTABLE_HV(POPs);
4856 HE *entry;
4857 const U8 gimme = GIMME_V;
4858
4859 entry = hv_iternext(hash);
4860
4861 EXTEND(SP, 2);
4862 if (entry) {
4863 SV* const sv = hv_iterkeysv(entry);
4864 PUSHs(sv);
4865 if (gimme == G_ARRAY) {
4866 SV *val;
4867 val = hv_iterval(hash, entry);
4868 PUSHs(val);
4869 }
4870 }
4871 else if (gimme == G_SCALAR)
4872 RETPUSHUNDEF;
4873
4874 RETURN;
4875}
4876
4877STATIC OP *
4878S_do_delete_local(pTHX)
4879{
4880 dSP;
4881 const U8 gimme = GIMME_V;
4882 const MAGIC *mg;
4883 HV *stash;
4884 const bool sliced = !!(PL_op->op_private & OPpSLICE);
4885 SV **unsliced_keysv = sliced ? NULL : sp--;
4886 SV * const osv = POPs;
4887 SV **mark = sliced ? PL_stack_base + POPMARK : unsliced_keysv-1;
4888 dORIGMARK;
4889 const bool tied = SvRMAGICAL(osv)
4890 && mg_find((const SV *)osv, PERL_MAGIC_tied);
4891 const bool can_preserve = SvCANEXISTDELETE(osv);
4892 const U32 type = SvTYPE(osv);
4893 SV ** const end = sliced ? SP : unsliced_keysv;
4894
4895 if (type == SVt_PVHV) { /* hash element */
4896 HV * const hv = MUTABLE_HV(osv);
4897 while (++MARK <= end) {
4898 SV * const keysv = *MARK;
4899 SV *sv = NULL;
4900 bool preeminent = TRUE;
4901 if (can_preserve)
4902 preeminent = hv_exists_ent(hv, keysv, 0);
4903 if (tied) {
4904 HE *he = hv_fetch_ent(hv, keysv, 1, 0);
4905 if (he)
4906 sv = HeVAL(he);
4907 else
4908 preeminent = FALSE;
4909 }
4910 else {
4911 sv = hv_delete_ent(hv, keysv, 0, 0);
4912 if (preeminent)
4913 SvREFCNT_inc_simple_void(sv); /* De-mortalize */
4914 }
4915 if (preeminent) {
4916 if (!sv) DIE(aTHX_ PL_no_helem_sv, SVfARG(keysv));
4917 save_helem_flags(hv, keysv, &sv, SAVEf_KEEPOLDELEM);
4918 if (tied) {
4919 *MARK = sv_mortalcopy(sv);
4920 mg_clear(sv);
4921 } else
4922 *MARK = sv;
4923 }
4924 else {
4925 SAVEHDELETE(hv, keysv);
4926 *MARK = &PL_sv_undef;
4927 }
4928 }
4929 }
4930 else if (type == SVt_PVAV) { /* array element */
4931 if (PL_op->op_flags & OPf_SPECIAL) {
4932 AV * const av = MUTABLE_AV(osv);
4933 while (++MARK <= end) {
4934 SSize_t idx = SvIV(*MARK);
4935 SV *sv = NULL;
4936 bool preeminent = TRUE;
4937 if (can_preserve)
4938 preeminent = av_exists(av, idx);
4939 if (tied) {
4940 SV **svp = av_fetch(av, idx, 1);
4941 if (svp)
4942 sv = *svp;
4943 else
4944 preeminent = FALSE;
4945 }
4946 else {
4947 sv = av_delete(av, idx, 0);
4948 if (preeminent)
4949 SvREFCNT_inc_simple_void(sv); /* De-mortalize */
4950 }
4951 if (preeminent) {
4952 save_aelem_flags(av, idx, &sv, SAVEf_KEEPOLDELEM);
4953 if (tied) {
4954 *MARK = sv_mortalcopy(sv);
4955 mg_clear(sv);
4956 } else
4957 *MARK = sv;
4958 }
4959 else {
4960 SAVEADELETE(av, idx);
4961 *MARK = &PL_sv_undef;
4962 }
4963 }
4964 }
4965 else
4966 DIE(aTHX_ "panic: avhv_delete no longer supported");
4967 }
4968 else
4969 DIE(aTHX_ "Not a HASH reference");
4970 if (sliced) {
4971 if (gimme == G_VOID)
4972 SP = ORIGMARK;
4973 else if (gimme == G_SCALAR) {
4974 MARK = ORIGMARK;
4975 if (SP > MARK)
4976 *++MARK = *SP;
4977 else
4978 *++MARK = &PL_sv_undef;
4979 SP = MARK;
4980 }
4981 }
4982 else if (gimme != G_VOID)
4983 PUSHs(*unsliced_keysv);
4984
4985 RETURN;
4986}
4987
4988PP(pp_delete)
4989{
4990 dSP;
4991 U8 gimme;
4992 I32 discard;
4993
4994 if (PL_op->op_private & OPpLVAL_INTRO)
4995 return do_delete_local();
4996
4997 gimme = GIMME_V;
4998 discard = (gimme == G_VOID) ? G_DISCARD : 0;
4999
5000 if (PL_op->op_private & OPpSLICE) {
5001 dMARK; dORIGMARK;
5002 HV * const hv = MUTABLE_HV(POPs);
5003 const U32 hvtype = SvTYPE(hv);
5004 if (hvtype == SVt_PVHV) { /* hash element */
5005 while (++MARK <= SP) {
5006 SV * const sv = hv_delete_ent(hv, *MARK, discard, 0);
5007 *MARK = sv ? sv : &PL_sv_undef;
5008 }
5009 }
5010 else if (hvtype == SVt_PVAV) { /* array element */
5011 if (PL_op->op_flags & OPf_SPECIAL) {
5012 while (++MARK <= SP) {
5013 SV * const sv = av_delete(MUTABLE_AV(hv), SvIV(*MARK), discard);
5014 *MARK = sv ? sv : &PL_sv_undef;
5015 }
5016 }
5017 }
5018 else
5019 DIE(aTHX_ "Not a HASH reference");
5020 if (discard)
5021 SP = ORIGMARK;
5022 else if (gimme == G_SCALAR) {
5023 MARK = ORIGMARK;
5024 if (SP > MARK)
5025 *++MARK = *SP;
5026 else
5027 *++MARK = &PL_sv_undef;
5028 SP = MARK;
5029 }
5030 }
5031 else {
5032 SV *keysv = POPs;
5033 HV * const hv = MUTABLE_HV(POPs);
5034 SV *sv = NULL;
5035 if (SvTYPE(hv) == SVt_PVHV)
5036 sv = hv_delete_ent(hv, keysv, discard, 0);
5037 else if (SvTYPE(hv) == SVt_PVAV) {
5038 if (PL_op->op_flags & OPf_SPECIAL)
5039 sv = av_delete(MUTABLE_AV(hv), SvIV(keysv), discard);
5040 else
5041 DIE(aTHX_ "panic: avhv_delete no longer supported");
5042 }
5043 else
5044 DIE(aTHX_ "Not a HASH reference");
5045 if (!sv)
5046 sv = &PL_sv_undef;
5047 if (!discard)
5048 PUSHs(sv);
5049 }
5050 RETURN;
5051}
5052
5053PP(pp_exists)
5054{
5055 dSP;
5056 SV *tmpsv;
5057 HV *hv;
5058
5059 if (UNLIKELY( PL_op->op_private & OPpEXISTS_SUB )) {
5060 GV *gv;
5061 SV * const sv = POPs;
5062 CV * const cv = sv_2cv(sv, &hv, &gv, 0);
5063 if (cv)
5064 RETPUSHYES;
5065 if (gv && isGV(gv) && GvCV(gv) && !GvCVGEN(gv))
5066 RETPUSHYES;
5067 RETPUSHNO;
5068 }
5069 tmpsv = POPs;
5070 hv = MUTABLE_HV(POPs);
5071 if (LIKELY( SvTYPE(hv) == SVt_PVHV )) {
5072 if (hv_exists_ent(hv, tmpsv, 0))
5073 RETPUSHYES;
5074 }
5075 else if (SvTYPE(hv) == SVt_PVAV) {
5076 if (PL_op->op_flags & OPf_SPECIAL) { /* array element */
5077 if (av_exists(MUTABLE_AV(hv), SvIV(tmpsv)))
5078 RETPUSHYES;
5079 }
5080 }
5081 else {
5082 DIE(aTHX_ "Not a HASH reference");
5083 }
5084 RETPUSHNO;
5085}
5086
5087PP(pp_hslice)
5088{
5089 dSP; dMARK; dORIGMARK;
5090 HV * const hv = MUTABLE_HV(POPs);
5091 const I32 lval = (PL_op->op_flags & OPf_MOD || LVRET);
5092 const bool localizing = PL_op->op_private & OPpLVAL_INTRO;
5093 bool can_preserve = FALSE;
5094
5095 if (localizing) {
5096 MAGIC *mg;
5097 HV *stash;
5098
5099 if (SvCANEXISTDELETE(hv))
5100 can_preserve = TRUE;
5101 }
5102
5103 while (++MARK <= SP) {
5104 SV * const keysv = *MARK;
5105 SV **svp;
5106 HE *he;
5107 bool preeminent = TRUE;
5108
5109 if (localizing && can_preserve) {
5110 /* If we can determine whether the element exist,
5111 * try to preserve the existenceness of a tied hash
5112 * element by using EXISTS and DELETE if possible.
5113 * Fallback to FETCH and STORE otherwise. */
5114 preeminent = hv_exists_ent(hv, keysv, 0);
5115 }
5116
5117 he = hv_fetch_ent(hv, keysv, lval, 0);
5118 svp = he ? &HeVAL(he) : NULL;
5119
5120 if (lval) {
5121 if (!svp || !*svp || *svp == &PL_sv_undef) {
5122 DIE(aTHX_ PL_no_helem_sv, SVfARG(keysv));
5123 }
5124 if (localizing) {
5125 if (HvNAME_get(hv) && isGV(*svp))
5126 save_gp(MUTABLE_GV(*svp), !(PL_op->op_flags & OPf_SPECIAL));
5127 else if (preeminent)
5128 save_helem_flags(hv, keysv, svp,
5129 (PL_op->op_flags & OPf_SPECIAL) ? 0 : SAVEf_SETMAGIC);
5130 else
5131 SAVEHDELETE(hv, keysv);
5132 }
5133 }
5134 *MARK = svp && *svp ? *svp : &PL_sv_undef;
5135 }
5136 if (GIMME_V != G_ARRAY) {
5137 MARK = ORIGMARK;
5138 *++MARK = SP > ORIGMARK ? *SP : &PL_sv_undef;
5139 SP = MARK;
5140 }
5141 RETURN;
5142}
5143
5144PP(pp_kvhslice)
5145{
5146 dSP; dMARK;
5147 HV * const hv = MUTABLE_HV(POPs);
5148 I32 lval = (PL_op->op_flags & OPf_MOD);
5149 SSize_t items = SP - MARK;
5150
5151 if (PL_op->op_private & OPpMAYBE_LVSUB) {
5152 const I32 flags = is_lvalue_sub();
5153 if (flags) {
5154 if (!(flags & OPpENTERSUB_INARGS))
5155 /* diag_listed_as: Can't modify %s in %s */
5156 Perl_croak(aTHX_ "Can't modify key/value hash slice in %s assignment",
5157 GIMME_V == G_ARRAY ? "list" : "scalar");
5158 lval = flags;
5159 }
5160 }
5161
5162 MEXTEND(SP,items);
5163 while (items > 1) {
5164 *(MARK+items*2-1) = *(MARK+items);
5165 items--;
5166 }
5167 items = SP-MARK;
5168 SP += items;
5169
5170 while (++MARK <= SP) {
5171 SV * const keysv = *MARK;
5172 SV **svp;
5173 HE *he;
5174
5175 he = hv_fetch_ent(hv, keysv, lval, 0);
5176 svp = he ? &HeVAL(he) : NULL;
5177
5178 if (lval) {
5179 if (!svp || !*svp || *svp == &PL_sv_undef) {
5180 DIE(aTHX_ PL_no_helem_sv, SVfARG(keysv));
5181 }
5182 *MARK = sv_mortalcopy(*MARK);
5183 }
5184 *++MARK = svp && *svp ? *svp : &PL_sv_undef;
5185 }
5186 if (GIMME_V != G_ARRAY) {
5187 MARK = SP - items*2;
5188 *++MARK = items > 0 ? *SP : &PL_sv_undef;
5189 SP = MARK;
5190 }
5191 RETURN;
5192}
5193
5194/* List operators. */
5195
5196PP(pp_list)
5197{
5198 I32 markidx = POPMARK;
5199 if (GIMME_V != G_ARRAY) {
5200 SV **mark = PL_stack_base + markidx;
5201 dSP;
5202 if (++MARK <= SP)
5203 *MARK = *SP; /* unwanted list, return last item */
5204 else
5205 *MARK = &PL_sv_undef;
5206 SP = MARK;
5207 PUTBACK;
5208 }
5209 return NORMAL;
5210}
5211
5212PP(pp_lslice)
5213{
5214 dSP;
5215 SV ** const lastrelem = PL_stack_sp;
5216 SV ** const lastlelem = PL_stack_base + POPMARK;
5217 SV ** const firstlelem = PL_stack_base + POPMARK + 1;
5218 SV ** const firstrelem = lastlelem + 1;
5219 const U8 mod = PL_op->op_flags & OPf_MOD;
5220
5221 const I32 max = lastrelem - lastlelem;
5222 SV **lelem;
5223
5224 if (GIMME_V != G_ARRAY) {
5225 if (lastlelem < firstlelem) {
5226 *firstlelem = &PL_sv_undef;
5227 }
5228 else {
5229 I32 ix = SvIV(*lastlelem);
5230 if (ix < 0)
5231 ix += max;
5232 if (ix < 0 || ix >= max)
5233 *firstlelem = &PL_sv_undef;
5234 else
5235 *firstlelem = firstrelem[ix];
5236 }
5237 SP = firstlelem;
5238 RETURN;
5239 }
5240
5241 if (max == 0) {
5242 SP = firstlelem - 1;
5243 RETURN;
5244 }
5245
5246 for (lelem = firstlelem; lelem <= lastlelem; lelem++) {
5247 I32 ix = SvIV(*lelem);
5248 if (ix < 0)
5249 ix += max;
5250 if (ix < 0 || ix >= max)
5251 *lelem = &PL_sv_undef;
5252 else {
5253 if (!(*lelem = firstrelem[ix]))
5254 *lelem = &PL_sv_undef;
5255 else if (mod && SvPADTMP(*lelem)) {
5256 *lelem = firstrelem[ix] = sv_mortalcopy(*lelem);
5257 }
5258 }
5259 }
5260 SP = lastlelem;
5261 RETURN;
5262}
5263
5264PP(pp_anonlist)
5265{
5266 dSP; dMARK;
5267 const I32 items = SP - MARK;
5268 SV * const av = MUTABLE_SV(av_make(items, MARK+1));
5269 SP = MARK;
5270 mXPUSHs((PL_op->op_flags & OPf_SPECIAL)
5271 ? newRV_noinc(av) : av);
5272 RETURN;
5273}
5274
5275PP(pp_anonhash)
5276{
5277 dSP; dMARK; dORIGMARK;
5278 HV* const hv = newHV();
5279 SV* const retval = sv_2mortal( PL_op->op_flags & OPf_SPECIAL
5280 ? newRV_noinc(MUTABLE_SV(hv))
5281 : MUTABLE_SV(hv) );
5282
5283 while (MARK < SP) {
5284 SV * const key =
5285 (MARK++, SvGMAGICAL(*MARK) ? sv_mortalcopy(*MARK) : *MARK);
5286 SV *val;
5287 if (MARK < SP)
5288 {
5289 MARK++;
5290 SvGETMAGIC(*MARK);
5291 val = newSV(0);
5292 sv_setsv_nomg(val, *MARK);
5293 }
5294 else
5295 {
5296 Perl_ck_warner(aTHX_ packWARN(WARN_MISC), "Odd number of elements in anonymous hash");
5297 val = newSV(0);
5298 }
5299 (void)hv_store_ent(hv,key,val,0);
5300 }
5301 SP = ORIGMARK;
5302 XPUSHs(retval);
5303 RETURN;
5304}
5305
5306PP(pp_splice)
5307{
5308 dSP; dMARK; dORIGMARK;
5309 int num_args = (SP - MARK);
5310 AV *ary = MUTABLE_AV(*++MARK);
5311 SV **src;
5312 SV **dst;
5313 SSize_t i;
5314 SSize_t offset;
5315 SSize_t length;
5316 SSize_t newlen;
5317 SSize_t after;
5318 SSize_t diff;
5319 const MAGIC * const mg = SvTIED_mg((const SV *)ary, PERL_MAGIC_tied);
5320
5321 if (mg) {
5322 return Perl_tied_method(aTHX_ SV_CONST(SPLICE), mark - 1, MUTABLE_SV(ary), mg,
5323 GIMME_V | TIED_METHOD_ARGUMENTS_ON_STACK,
5324 sp - mark);
5325 }
5326
5327 SP++;
5328
5329 if (++MARK < SP) {
5330 offset = i = SvIV(*MARK);
5331 if (offset < 0)
5332 offset += AvFILLp(ary) + 1;
5333 if (offset < 0)
5334 DIE(aTHX_ PL_no_aelem, i);
5335 if (++MARK < SP) {
5336 length = SvIVx(*MARK++);
5337 if (length < 0) {
5338 length += AvFILLp(ary) - offset + 1;
5339 if (length < 0)
5340 length = 0;
5341 }
5342 }
5343 else
5344 length = AvMAX(ary) + 1; /* close enough to infinity */
5345 }
5346 else {
5347 offset = 0;
5348 length = AvMAX(ary) + 1;
5349 }
5350 if (offset > AvFILLp(ary) + 1) {
5351 if (num_args > 2)
5352 Perl_ck_warner(aTHX_ packWARN(WARN_MISC), "splice() offset past end of array" );
5353 offset = AvFILLp(ary) + 1;
5354 }
5355 after = AvFILLp(ary) + 1 - (offset + length);
5356 if (after < 0) { /* not that much array */
5357 length += after; /* offset+length now in array */
5358 after = 0;
5359 if (!AvALLOC(ary))
5360 av_extend(ary, 0);
5361 }
5362
5363 /* At this point, MARK .. SP-1 is our new LIST */
5364
5365 newlen = SP - MARK;
5366 diff = newlen - length;
5367 if (newlen && !AvREAL(ary) && AvREIFY(ary))
5368 av_reify(ary);
5369
5370 /* make new elements SVs now: avoid problems if they're from the array */
5371 for (dst = MARK, i = newlen; i; i--) {
5372 SV * const h = *dst;
5373 *dst++ = newSVsv(h);
5374 }
5375
5376 if (diff < 0) { /* shrinking the area */
5377 SV **tmparyval = NULL;
5378 if (newlen) {
5379 Newx(tmparyval, newlen, SV*); /* so remember insertion */
5380 Copy(MARK, tmparyval, newlen, SV*);
5381 }
5382
5383 MARK = ORIGMARK + 1;
5384 if (GIMME_V == G_ARRAY) { /* copy return vals to stack */
5385 const bool real = cBOOL(AvREAL(ary));
5386 MEXTEND(MARK, length);
5387 if (real)
5388 EXTEND_MORTAL(length);
5389 for (i = 0, dst = MARK; i < length; i++) {
5390 if ((*dst = AvARRAY(ary)[i+offset])) {
5391 if (real)
5392 sv_2mortal(*dst); /* free them eventually */
5393 }
5394 else
5395 *dst = &PL_sv_undef;
5396 dst++;
5397 }
5398 MARK += length - 1;
5399 }
5400 else {
5401 *MARK = AvARRAY(ary)[offset+length-1];
5402 if (AvREAL(ary)) {
5403 sv_2mortal(*MARK);
5404 for (i = length - 1, dst = &AvARRAY(ary)[offset]; i > 0; i--)
5405 SvREFCNT_dec(*dst++); /* free them now */
5406 }
5407 if (!*MARK)
5408 *MARK = &PL_sv_undef;
5409 }
5410 AvFILLp(ary) += diff;
5411
5412 /* pull up or down? */
5413
5414 if (offset < after) { /* easier to pull up */
5415 if (offset) { /* esp. if nothing to pull */
5416 src = &AvARRAY(ary)[offset-1];
5417 dst = src - diff; /* diff is negative */
5418 for (i = offset; i > 0; i--) /* can't trust Copy */
5419 *dst-- = *src--;
5420 }
5421 dst = AvARRAY(ary);
5422 AvARRAY(ary) = AvARRAY(ary) - diff; /* diff is negative */
5423 AvMAX(ary) += diff;
5424 }
5425 else {
5426 if (after) { /* anything to pull down? */
5427 src = AvARRAY(ary) + offset + length;
5428 dst = src + diff; /* diff is negative */
5429 Move(src, dst, after, SV*);
5430 }
5431 dst = &AvARRAY(ary)[AvFILLp(ary)+1];
5432 /* avoid later double free */
5433 }
5434 i = -diff;
5435 while (i)
5436 dst[--i] = NULL;
5437
5438 if (newlen) {
5439 Copy( tmparyval, AvARRAY(ary) + offset, newlen, SV* );
5440 Safefree(tmparyval);
5441 }
5442 }
5443 else { /* no, expanding (or same) */
5444 SV** tmparyval = NULL;
5445 if (length) {
5446 Newx(tmparyval, length, SV*); /* so remember deletion */
5447 Copy(AvARRAY(ary)+offset, tmparyval, length, SV*);
5448 }
5449
5450 if (diff > 0) { /* expanding */
5451 /* push up or down? */
5452 if (offset < after && diff <= AvARRAY(ary) - AvALLOC(ary)) {
5453 if (offset) {
5454 src = AvARRAY(ary);
5455 dst = src - diff;
5456 Move(src, dst, offset, SV*);
5457 }
5458 AvARRAY(ary) = AvARRAY(ary) - diff;/* diff is positive */
5459 AvMAX(ary) += diff;
5460 AvFILLp(ary) += diff;
5461 }
5462 else {
5463 if (AvFILLp(ary) + diff >= AvMAX(ary)) /* oh, well */
5464 av_extend(ary, AvFILLp(ary) + diff);
5465 AvFILLp(ary) += diff;
5466
5467 if (after) {
5468 dst = AvARRAY(ary) + AvFILLp(ary);
5469 src = dst - diff;
5470 for (i = after; i; i--) {
5471 *dst-- = *src--;
5472 }
5473 }
5474 }
5475 }
5476
5477 if (newlen) {
5478 Copy( MARK, AvARRAY(ary) + offset, newlen, SV* );
5479 }
5480
5481 MARK = ORIGMARK + 1;
5482 if (GIMME_V == G_ARRAY) { /* copy return vals to stack */
5483 if (length) {
5484 const bool real = cBOOL(AvREAL(ary));
5485 if (real)
5486 EXTEND_MORTAL(length);
5487 for (i = 0, dst = MARK; i < length; i++) {
5488 if ((*dst = tmparyval[i])) {
5489 if (real)
5490 sv_2mortal(*dst); /* free them eventually */
5491 }
5492 else *dst = &PL_sv_undef;
5493 dst++;
5494 }
5495 }
5496 MARK += length - 1;
5497 }
5498 else if (length--) {
5499 *MARK = tmparyval[length];
5500 if (AvREAL(ary)) {
5501 sv_2mortal(*MARK);
5502 while (length-- > 0)
5503 SvREFCNT_dec(tmparyval[length]);
5504 }
5505 if (!*MARK)
5506 *MARK = &PL_sv_undef;
5507 }
5508 else
5509 *MARK = &PL_sv_undef;
5510 Safefree(tmparyval);
5511 }
5512
5513 if (SvMAGICAL(ary))
5514 mg_set(MUTABLE_SV(ary));
5515
5516 SP = MARK;
5517 RETURN;
5518}
5519
5520PP(pp_push)
5521{
5522 dSP; dMARK; dORIGMARK; dTARGET;
5523 AV * const ary = MUTABLE_AV(*++MARK);
5524 const MAGIC * const mg = SvTIED_mg((const SV *)ary, PERL_MAGIC_tied);
5525
5526 if (mg) {
5527 *MARK-- = SvTIED_obj(MUTABLE_SV(ary), mg);
5528 PUSHMARK(MARK);
5529 PUTBACK;
5530 ENTER_with_name("call_PUSH");
5531 call_sv(SV_CONST(PUSH),G_SCALAR|G_DISCARD|G_METHOD_NAMED);
5532 LEAVE_with_name("call_PUSH");
5533 /* SPAGAIN; not needed: SP is assigned to immediately below */
5534 }
5535 else {
5536 /* PL_delaymagic is restored by JUMPENV_POP on dieing, so we
5537 * only need to save locally, not on the save stack */
5538 U16 old_delaymagic = PL_delaymagic;
5539
5540 if (SvREADONLY(ary) && MARK < SP) Perl_croak_no_modify();
5541 PL_delaymagic = DM_DELAY;
5542 for (++MARK; MARK <= SP; MARK++) {
5543 SV *sv;
5544 if (*MARK) SvGETMAGIC(*MARK);
5545 sv = newSV(0);
5546 if (*MARK)
5547 sv_setsv_nomg(sv, *MARK);
5548 av_store(ary, AvFILLp(ary)+1, sv);
5549 }
5550 if (PL_delaymagic & DM_ARRAY_ISA)
5551 mg_set(MUTABLE_SV(ary));
5552 PL_delaymagic = old_delaymagic;
5553 }
5554 SP = ORIGMARK;
5555 if (OP_GIMME(PL_op, 0) != G_VOID) {
5556 PUSHi( AvFILL(ary) + 1 );
5557 }
5558 RETURN;
5559}
5560
5561/* also used for: pp_pop()*/
5562PP(pp_shift)
5563{
5564 dSP;
5565 AV * const av = PL_op->op_flags & OPf_SPECIAL
5566 ? MUTABLE_AV(GvAVn(PL_defgv)) : MUTABLE_AV(POPs);
5567 SV * const sv = PL_op->op_type == OP_SHIFT ? av_shift(av) : av_pop(av);
5568 EXTEND(SP, 1);
5569 assert (sv);
5570 if (AvREAL(av))
5571 (void)sv_2mortal(sv);
5572 PUSHs(sv);
5573 RETURN;
5574}
5575
5576PP(pp_unshift)
5577{
5578 dSP; dMARK; dORIGMARK; dTARGET;
5579 AV *ary = MUTABLE_AV(*++MARK);
5580 const MAGIC * const mg = SvTIED_mg((const SV *)ary, PERL_MAGIC_tied);
5581
5582 if (mg) {
5583 *MARK-- = SvTIED_obj(MUTABLE_SV(ary), mg);
5584 PUSHMARK(MARK);
5585 PUTBACK;
5586 ENTER_with_name("call_UNSHIFT");
5587 call_sv(SV_CONST(UNSHIFT),G_SCALAR|G_DISCARD|G_METHOD_NAMED);
5588 LEAVE_with_name("call_UNSHIFT");
5589 /* SPAGAIN; not needed: SP is assigned to immediately below */
5590 }
5591 else {
5592 /* PL_delaymagic is restored by JUMPENV_POP on dieing, so we
5593 * only need to save locally, not on the save stack */
5594 U16 old_delaymagic = PL_delaymagic;
5595 SSize_t i = 0;
5596
5597 av_unshift(ary, SP - MARK);
5598 PL_delaymagic = DM_DELAY;
5599 while (MARK < SP) {
5600 SV * const sv = newSVsv(*++MARK);
5601 (void)av_store(ary, i++, sv);
5602 }
5603 if (PL_delaymagic & DM_ARRAY_ISA)
5604 mg_set(MUTABLE_SV(ary));
5605 PL_delaymagic = old_delaymagic;
5606 }
5607 SP = ORIGMARK;
5608 if (OP_GIMME(PL_op, 0) != G_VOID) {
5609 PUSHi( AvFILL(ary) + 1 );
5610 }
5611 RETURN;
5612}
5613
5614PP(pp_reverse)
5615{
5616 dSP; dMARK;
5617
5618 if (GIMME_V == G_ARRAY) {
5619 if (PL_op->op_private & OPpREVERSE_INPLACE) {
5620 AV *av;
5621
5622 /* See pp_sort() */
5623 assert( MARK+1 == SP && *SP && SvTYPE(*SP) == SVt_PVAV);
5624 (void)POPMARK; /* remove mark associated with ex-OP_AASSIGN */
5625 av = MUTABLE_AV((*SP));
5626 /* In-place reversing only happens in void context for the array
5627 * assignment. We don't need to push anything on the stack. */
5628 SP = MARK;
5629
5630 if (SvMAGICAL(av)) {
5631 SSize_t i, j;
5632 SV *tmp = sv_newmortal();
5633 /* For SvCANEXISTDELETE */
5634 HV *stash;
5635 const MAGIC *mg;
5636 bool can_preserve = SvCANEXISTDELETE(av);
5637
5638 for (i = 0, j = av_tindex(av); i < j; ++i, --j) {
5639 SV *begin, *end;
5640
5641 if (can_preserve) {
5642 if (!av_exists(av, i)) {
5643 if (av_exists(av, j)) {
5644 SV *sv = av_delete(av, j, 0);
5645 begin = *av_fetch(av, i, TRUE);
5646 sv_setsv_mg(begin, sv);
5647 }
5648 continue;
5649 }
5650 else if (!av_exists(av, j)) {
5651 SV *sv = av_delete(av, i, 0);
5652 end = *av_fetch(av, j, TRUE);
5653 sv_setsv_mg(end, sv);
5654 continue;
5655 }
5656 }
5657
5658 begin = *av_fetch(av, i, TRUE);
5659 end = *av_fetch(av, j, TRUE);
5660 sv_setsv(tmp, begin);
5661 sv_setsv_mg(begin, end);
5662 sv_setsv_mg(end, tmp);
5663 }
5664 }
5665 else {
5666 SV **begin = AvARRAY(av);
5667
5668 if (begin) {
5669 SV **end = begin + AvFILLp(av);
5670
5671 while (begin < end) {
5672 SV * const tmp = *begin;
5673 *begin++ = *end;
5674 *end-- = tmp;
5675 }
5676 }
5677 }
5678 }
5679 else {
5680 SV **oldsp = SP;
5681 MARK++;
5682 while (MARK < SP) {
5683 SV * const tmp = *MARK;
5684 *MARK++ = *SP;
5685 *SP-- = tmp;
5686 }
5687 /* safe as long as stack cannot get extended in the above */
5688 SP = oldsp;
5689 }
5690 }
5691 else {
5692 char *up;
5693 dTARGET;
5694 STRLEN len;
5695
5696 SvUTF8_off(TARG); /* decontaminate */
5697 if (SP - MARK > 1)
5698 do_join(TARG, &PL_sv_no, MARK, SP);
5699 else {
5700 sv_setsv(TARG, SP > MARK ? *SP : DEFSV);
5701 }
5702
5703 up = SvPV_force(TARG, len);
5704 if (len > 1) {
5705 char *down;
5706 if (DO_UTF8(TARG)) { /* first reverse each character */
5707 U8* s = (U8*)SvPVX(TARG);
5708 const U8* send = (U8*)(s + len);
5709 while (s < send) {
5710 if (UTF8_IS_INVARIANT(*s)) {
5711 s++;
5712 continue;
5713 }
5714 else {
5715 if (!utf8_to_uvchr_buf(s, send, 0))
5716 break;
5717 up = (char*)s;
5718 s += UTF8SKIP(s);
5719 down = (char*)(s - 1);
5720 /* reverse this character */
5721 while (down > up) {
5722 const char tmp = *up;
5723 *up++ = *down;
5724 *down-- = tmp;
5725 }
5726 }
5727 }
5728 up = SvPVX(TARG);
5729 }
5730 down = SvPVX(TARG) + len - 1;
5731 while (down > up) {
5732 const char tmp = *up;
5733 *up++ = *down;
5734 *down-- = tmp;
5735 }
5736 (void)SvPOK_only_UTF8(TARG);
5737 }
5738 SP = MARK + 1;
5739 SETTARG;
5740 }
5741 RETURN;
5742}
5743
5744PP(pp_split)
5745{
5746 dSP; dTARG;
5747 AV *ary = ( (PL_op->op_private & OPpSPLIT_ASSIGN) /* @a = split */
5748 && (PL_op->op_flags & OPf_STACKED)) /* @{expr} = split */
5749 ? (AV *)POPs : NULL;
5750 IV limit = POPi; /* note, negative is forever */
5751 SV * const sv = POPs;
5752 STRLEN len;
5753 const char *s = SvPV_const(sv, len);
5754 const bool do_utf8 = DO_UTF8(sv);
5755 const char *strend = s + len;
5756 PMOP *pm = cPMOPx(PL_op);
5757 REGEXP *rx;
5758 SV *dstr;
5759 const char *m;
5760 SSize_t iters = 0;
5761 const STRLEN slen = do_utf8
5762 ? utf8_length((U8*)s, (U8*)strend)
5763 : (STRLEN)(strend - s);
5764 SSize_t maxiters = slen + 10;
5765 I32 trailing_empty = 0;
5766 const char *orig;
5767 const IV origlimit = limit;
5768 I32 realarray = 0;
5769 I32 base;
5770 const U8 gimme = GIMME_V;
5771 bool gimme_scalar;
5772 I32 oldsave = PL_savestack_ix;
5773 U32 make_mortal = SVs_TEMP;
5774 bool multiline = 0;
5775 MAGIC *mg = NULL;
5776
5777 rx = PM_GETRE(pm);
5778
5779 TAINT_IF(get_regex_charset(RX_EXTFLAGS(rx)) == REGEX_LOCALE_CHARSET &&
5780 (RX_EXTFLAGS(rx) & (RXf_WHITE | RXf_SKIPWHITE)));
5781
5782 /* handle @ary = split(...) optimisation */
5783 if (PL_op->op_private & OPpSPLIT_ASSIGN) {
5784 if (!(PL_op->op_flags & OPf_STACKED)) {
5785 if (PL_op->op_private & OPpSPLIT_LEX) {
5786 if (PL_op->op_private & OPpLVAL_INTRO)
5787 SAVECLEARSV(PAD_SVl(pm->op_pmreplrootu.op_pmtargetoff));
5788 ary = (AV *)PAD_SVl(pm->op_pmreplrootu.op_pmtargetoff);
5789 }
5790 else {
5791 GV *gv =
5792#ifdef USE_ITHREADS
5793 MUTABLE_GV(PAD_SVl(pm->op_pmreplrootu.op_pmtargetoff));
5794#else
5795 pm->op_pmreplrootu.op_pmtargetgv;
5796#endif
5797 if (PL_op->op_private & OPpLVAL_INTRO)
5798 ary = save_ary(gv);
5799 else
5800 ary = GvAVn(gv);
5801 }
5802 /* skip anything pushed by OPpLVAL_INTRO above */
5803 oldsave = PL_savestack_ix;
5804 }
5805
5806 realarray = 1;
5807 PUTBACK;
5808 av_extend(ary,0);
5809 (void)sv_2mortal(SvREFCNT_inc_simple_NN(sv));
5810 av_clear(ary);
5811 SPAGAIN;
5812 if ((mg = SvTIED_mg((const SV *)ary, PERL_MAGIC_tied))) {
5813 PUSHMARK(SP);
5814 XPUSHs(SvTIED_obj(MUTABLE_SV(ary), mg));
5815 }
5816 else {
5817 if (!AvREAL(ary)) {
5818 I32 i;
5819 AvREAL_on(ary);
5820 AvREIFY_off(ary);
5821 for (i = AvFILLp(ary); i >= 0; i--)
5822 AvARRAY(ary)[i] = &PL_sv_undef; /* don't free mere refs */
5823 }
5824 /* temporarily switch stacks */
5825 SAVESWITCHSTACK(PL_curstack, ary);
5826 make_mortal = 0;
5827 }
5828 }
5829
5830 base = SP - PL_stack_base;
5831 orig = s;
5832 if (RX_EXTFLAGS(rx) & RXf_SKIPWHITE) {
5833 if (do_utf8) {
5834 while (s < strend && isSPACE_utf8_safe(s, strend))
5835 s += UTF8SKIP(s);
5836 }
5837 else if (get_regex_charset(RX_EXTFLAGS(rx)) == REGEX_LOCALE_CHARSET) {
5838 while (s < strend && isSPACE_LC(*s))
5839 s++;
5840 }
5841 else {
5842 while (s < strend && isSPACE(*s))
5843 s++;
5844 }
5845 }
5846 if (RX_EXTFLAGS(rx) & RXf_PMf_MULTILINE) {
5847 multiline = 1;
5848 }
5849
5850 gimme_scalar = gimme == G_SCALAR && !ary;
5851
5852 if (!limit)
5853 limit = maxiters + 2;
5854 if (RX_EXTFLAGS(rx) & RXf_WHITE) {
5855 while (--limit) {
5856 m = s;
5857 /* this one uses 'm' and is a negative test */
5858 if (do_utf8) {
5859 while (m < strend && ! isSPACE_utf8_safe(m, strend) ) {
5860 const int t = UTF8SKIP(m);
5861 /* isSPACE_utf8_safe returns FALSE for malform utf8 */
5862 if (strend - m < t)
5863 m = strend;
5864 else
5865 m += t;
5866 }
5867 }
5868 else if (get_regex_charset(RX_EXTFLAGS(rx)) == REGEX_LOCALE_CHARSET)
5869 {
5870 while (m < strend && !isSPACE_LC(*m))
5871 ++m;
5872 } else {
5873 while (m < strend && !isSPACE(*m))
5874 ++m;
5875 }
5876 if (m >= strend)
5877 break;
5878
5879 if (gimme_scalar) {
5880 iters++;
5881 if (m-s == 0)
5882 trailing_empty++;
5883 else
5884 trailing_empty = 0;
5885 } else {
5886 dstr = newSVpvn_flags(s, m-s,
5887 (do_utf8 ? SVf_UTF8 : 0) | make_mortal);
5888 XPUSHs(dstr);
5889 }
5890
5891 /* skip the whitespace found last */
5892 if (do_utf8)
5893 s = m + UTF8SKIP(m);
5894 else
5895 s = m + 1;
5896
5897 /* this one uses 's' and is a positive test */
5898 if (do_utf8) {
5899 while (s < strend && isSPACE_utf8_safe(s, strend) )
5900 s += UTF8SKIP(s);
5901 }
5902 else if (get_regex_charset(RX_EXTFLAGS(rx)) == REGEX_LOCALE_CHARSET)
5903 {
5904 while (s < strend && isSPACE_LC(*s))
5905 ++s;
5906 } else {
5907 while (s < strend && isSPACE(*s))
5908 ++s;
5909 }
5910 }
5911 }
5912 else if (RX_EXTFLAGS(rx) & RXf_START_ONLY) {
5913 while (--limit) {
5914 for (m = s; m < strend && *m != '\n'; m++)
5915 ;
5916 m++;
5917 if (m >= strend)
5918 break;
5919
5920 if (gimme_scalar) {
5921 iters++;
5922 if (m-s == 0)
5923 trailing_empty++;
5924 else
5925 trailing_empty = 0;
5926 } else {
5927 dstr = newSVpvn_flags(s, m-s,
5928 (do_utf8 ? SVf_UTF8 : 0) | make_mortal);
5929 XPUSHs(dstr);
5930 }
5931 s = m;
5932 }
5933 }
5934 else if (RX_EXTFLAGS(rx) & RXf_NULL && !(s >= strend)) {
5935 /*
5936 Pre-extend the stack, either the number of bytes or
5937 characters in the string or a limited amount, triggered by:
5938
5939 my ($x, $y) = split //, $str;
5940 or
5941 split //, $str, $i;
5942 */
5943 if (!gimme_scalar) {
5944 const IV items = limit - 1;
5945 /* setting it to -1 will trigger a panic in EXTEND() */
5946 const SSize_t sslen = slen > SSize_t_MAX ? -1 : (SSize_t)slen;
5947 if (items >=0 && items < sslen)
5948 EXTEND(SP, items);
5949 else
5950 EXTEND(SP, sslen);
5951 }
5952
5953 if (do_utf8) {
5954 while (--limit) {
5955 /* keep track of how many bytes we skip over */
5956 m = s;
5957 s += UTF8SKIP(s);
5958 if (gimme_scalar) {
5959 iters++;
5960 if (s-m == 0)
5961 trailing_empty++;
5962 else
5963 trailing_empty = 0;
5964 } else {
5965 dstr = newSVpvn_flags(m, s-m, SVf_UTF8 | make_mortal);
5966
5967 PUSHs(dstr);
5968 }
5969
5970 if (s >= strend)
5971 break;
5972 }
5973 } else {
5974 while (--limit) {
5975 if (gimme_scalar) {
5976 iters++;
5977 } else {
5978 dstr = newSVpvn(s, 1);
5979
5980
5981 if (make_mortal)
5982 sv_2mortal(dstr);
5983
5984 PUSHs(dstr);
5985 }
5986
5987 s++;
5988
5989 if (s >= strend)
5990 break;
5991 }
5992 }
5993 }
5994 else if (do_utf8 == (RX_UTF8(rx) != 0) &&
5995 (RX_EXTFLAGS(rx) & RXf_USE_INTUIT) && !RX_NPARENS(rx)
5996 && (RX_EXTFLAGS(rx) & RXf_CHECK_ALL)
5997 && !(RX_EXTFLAGS(rx) & RXf_IS_ANCHORED)) {
5998 const int tail = (RX_EXTFLAGS(rx) & RXf_INTUIT_TAIL);
5999 SV * const csv = CALLREG_INTUIT_STRING(rx);
6000
6001 len = RX_MINLENRET(rx);
6002 if (len == 1 && !RX_UTF8(rx) && !tail) {
6003 const char c = *SvPV_nolen_const(csv);
6004 while (--limit) {
6005 for (m = s; m < strend && *m != c; m++)
6006 ;
6007 if (m >= strend)
6008 break;
6009 if (gimme_scalar) {
6010 iters++;
6011 if (m-s == 0)
6012 trailing_empty++;
6013 else
6014 trailing_empty = 0;
6015 } else {
6016 dstr = newSVpvn_flags(s, m-s,
6017 (do_utf8 ? SVf_UTF8 : 0) | make_mortal);
6018 XPUSHs(dstr);
6019 }
6020 /* The rx->minlen is in characters but we want to step
6021 * s ahead by bytes. */
6022 if (do_utf8)
6023 s = (char*)utf8_hop((U8*)m, len);
6024 else
6025 s = m + len; /* Fake \n at the end */
6026 }
6027 }
6028 else {
6029 while (s < strend && --limit &&
6030 (m = fbm_instr((unsigned char*)s, (unsigned char*)strend,
6031 csv, multiline ? FBMrf_MULTILINE : 0)) )
6032 {
6033 if (gimme_scalar) {
6034 iters++;
6035 if (m-s == 0)
6036 trailing_empty++;
6037 else
6038 trailing_empty = 0;
6039 } else {
6040 dstr = newSVpvn_flags(s, m-s,
6041 (do_utf8 ? SVf_UTF8 : 0) | make_mortal);
6042 XPUSHs(dstr);
6043 }
6044 /* The rx->minlen is in characters but we want to step
6045 * s ahead by bytes. */
6046 if (do_utf8)
6047 s = (char*)utf8_hop((U8*)m, len);
6048 else
6049 s = m + len; /* Fake \n at the end */
6050 }
6051 }
6052 }
6053 else {
6054 maxiters += slen * RX_NPARENS(rx);
6055 while (s < strend && --limit)
6056 {
6057 I32 rex_return;
6058 PUTBACK;
6059 rex_return = CALLREGEXEC(rx, (char*)s, (char*)strend, (char*)orig, 1,
6060 sv, NULL, 0);
6061 SPAGAIN;
6062 if (rex_return == 0)
6063 break;
6064 TAINT_IF(RX_MATCH_TAINTED(rx));
6065 /* we never pass the REXEC_COPY_STR flag, so it should
6066 * never get copied */
6067 assert(!RX_MATCH_COPIED(rx));
6068 m = RX_OFFS(rx)[0].start + orig;
6069
6070 if (gimme_scalar) {
6071 iters++;
6072 if (m-s == 0)
6073 trailing_empty++;
6074 else
6075 trailing_empty = 0;
6076 } else {
6077 dstr = newSVpvn_flags(s, m-s,
6078 (do_utf8 ? SVf_UTF8 : 0) | make_mortal);
6079 XPUSHs(dstr);
6080 }
6081 if (RX_NPARENS(rx)) {
6082 I32 i;
6083 for (i = 1; i <= (I32)RX_NPARENS(rx); i++) {
6084 s = RX_OFFS(rx)[i].start + orig;
6085 m = RX_OFFS(rx)[i].end + orig;
6086
6087 /* japhy (07/27/01) -- the (m && s) test doesn't catch
6088 parens that didn't match -- they should be set to
6089 undef, not the empty string */
6090 if (gimme_scalar) {
6091 iters++;
6092 if (m-s == 0)
6093 trailing_empty++;
6094 else
6095 trailing_empty = 0;
6096 } else {
6097 if (m >= orig && s >= orig) {
6098 dstr = newSVpvn_flags(s, m-s,
6099 (do_utf8 ? SVf_UTF8 : 0)
6100 | make_mortal);
6101 }
6102 else
6103 dstr = &PL_sv_undef; /* undef, not "" */
6104 XPUSHs(dstr);
6105 }
6106
6107 }
6108 }
6109 s = RX_OFFS(rx)[0].end + orig;
6110 }
6111 }
6112
6113 if (!gimme_scalar) {
6114 iters = (SP - PL_stack_base) - base;
6115 }
6116 if (iters > maxiters)
6117 DIE(aTHX_ "Split loop");
6118
6119 /* keep field after final delim? */
6120 if (s < strend || (iters && origlimit)) {
6121 if (!gimme_scalar) {
6122 const STRLEN l = strend - s;
6123 dstr = newSVpvn_flags(s, l, (do_utf8 ? SVf_UTF8 : 0) | make_mortal);
6124 XPUSHs(dstr);
6125 }
6126 iters++;
6127 }
6128 else if (!origlimit) {
6129 if (gimme_scalar) {
6130 iters -= trailing_empty;
6131 } else {
6132 while (iters > 0 && (!TOPs || !SvANY(TOPs) || SvCUR(TOPs) == 0)) {
6133 if (TOPs && !make_mortal)
6134 sv_2mortal(TOPs);
6135 *SP-- = NULL;
6136 iters--;
6137 }
6138 }
6139 }
6140
6141 PUTBACK;
6142 LEAVE_SCOPE(oldsave); /* may undo an earlier SWITCHSTACK */
6143 SPAGAIN;
6144 if (realarray) {
6145 if (!mg) {
6146 if (SvSMAGICAL(ary)) {
6147 PUTBACK;
6148 mg_set(MUTABLE_SV(ary));
6149 SPAGAIN;
6150 }
6151 if (gimme == G_ARRAY) {
6152 EXTEND(SP, iters);
6153 Copy(AvARRAY(ary), SP + 1, iters, SV*);
6154 SP += iters;
6155 RETURN;
6156 }
6157 }
6158 else {
6159 PUTBACK;
6160 ENTER_with_name("call_PUSH");
6161 call_sv(SV_CONST(PUSH),G_SCALAR|G_DISCARD|G_METHOD_NAMED);
6162 LEAVE_with_name("call_PUSH");
6163 SPAGAIN;
6164 if (gimme == G_ARRAY) {
6165 SSize_t i;
6166 /* EXTEND should not be needed - we just popped them */
6167 EXTEND(SP, iters);
6168 for (i=0; i < iters; i++) {
6169 SV **svp = av_fetch(ary, i, FALSE);
6170 PUSHs((svp) ? *svp : &PL_sv_undef);
6171 }
6172 RETURN;
6173 }
6174 }
6175 }
6176 else {
6177 if (gimme == G_ARRAY)
6178 RETURN;
6179 }
6180
6181 GETTARGET;
6182 XPUSHi(iters);
6183 RETURN;
6184}
6185
6186PP(pp_once)
6187{
6188 dSP;
6189 SV *const sv = PAD_SVl(PL_op->op_targ);
6190
6191 if (SvPADSTALE(sv)) {
6192 /* First time. */
6193 SvPADSTALE_off(sv);
6194 RETURNOP(cLOGOP->op_other);
6195 }
6196 RETURNOP(cLOGOP->op_next);
6197}
6198
6199PP(pp_lock)
6200{
6201 dSP;
6202 dTOPss;
6203 SV *retsv = sv;
6204 SvLOCK(sv);
6205 if (SvTYPE(retsv) == SVt_PVAV || SvTYPE(retsv) == SVt_PVHV
6206 || SvTYPE(retsv) == SVt_PVCV) {
6207 retsv = refto(retsv);
6208 }
6209 SETs(retsv);
6210 RETURN;
6211}
6212
6213
6214/* used for: pp_padany(), pp_custom(); plus any system ops
6215 * that aren't implemented on a particular platform */
6216
6217PP(unimplemented_op)
6218{
6219 const Optype op_type = PL_op->op_type;
6220 /* Using OP_NAME() isn't going to be helpful here. Firstly, it doesn't cope
6221 with out of range op numbers - it only "special" cases op_custom.
6222 Secondly, as the three ops we "panic" on are padmy, mapstart and custom,
6223 if we get here for a custom op then that means that the custom op didn't
6224 have an implementation. Given that OP_NAME() looks up the custom op
6225 by its pp_addr, likely it will return NULL, unless someone (unhelpfully)
6226 registers &PL_unimplemented_op as the address of their custom op.
6227 NULL doesn't generate a useful error message. "custom" does. */
6228 const char *const name = op_type >= OP_max
6229 ? "[out of range]" : PL_op_name[PL_op->op_type];
6230 if(OP_IS_SOCKET(op_type))
6231 DIE(aTHX_ PL_no_sock_func, name);
6232 DIE(aTHX_ "panic: unimplemented op %s (#%d) called", name, op_type);
6233}
6234
6235static void
6236S_maybe_unwind_defav(pTHX)
6237{
6238 if (CX_CUR()->cx_type & CXp_HASARGS) {
6239 PERL_CONTEXT *cx = CX_CUR();
6240
6241 assert(CxHASARGS(cx));
6242 cx_popsub_args(cx);
6243 cx->cx_type &= ~CXp_HASARGS;
6244 }
6245}
6246
6247/* For sorting out arguments passed to a &CORE:: subroutine */
6248PP(pp_coreargs)
6249{
6250 dSP;
6251 int opnum = SvIOK(cSVOP_sv) ? (int)SvUV(cSVOP_sv) : 0;
6252 int defgv = PL_opargs[opnum] & OA_DEFGV ||opnum==OP_GLOB, whicharg = 0;
6253 AV * const at_ = GvAV(PL_defgv);
6254 SV **svp = at_ ? AvARRAY(at_) : NULL;
6255 I32 minargs = 0, maxargs = 0, numargs = at_ ? AvFILLp(at_)+1 : 0;
6256 I32 oa = opnum ? PL_opargs[opnum] >> OASHIFT : 0;
6257 bool seen_question = 0;
6258 const char *err = NULL;
6259 const bool pushmark = PL_op->op_private & OPpCOREARGS_PUSHMARK;
6260
6261 /* Count how many args there are first, to get some idea how far to
6262 extend the stack. */
6263 while (oa) {
6264 if ((oa & 7) == OA_LIST) { maxargs = I32_MAX; break; }
6265 maxargs++;
6266 if (oa & OA_OPTIONAL) seen_question = 1;
6267 if (!seen_question) minargs++;
6268 oa >>= 4;
6269 }
6270
6271 if(numargs < minargs) err = "Not enough";
6272 else if(numargs > maxargs) err = "Too many";
6273 if (err)
6274 /* diag_listed_as: Too many arguments for %s */
6275 Perl_croak(aTHX_
6276 "%s arguments for %s", err,
6277 opnum ? PL_op_desc[opnum] : SvPV_nolen_const(cSVOP_sv)
6278 );
6279
6280 /* Reset the stack pointer. Without this, we end up returning our own
6281 arguments in list context, in addition to the values we are supposed
6282 to return. nextstate usually does this on sub entry, but we need
6283 to run the next op with the caller's hints, so we cannot have a
6284 nextstate. */
6285 SP = PL_stack_base + CX_CUR()->blk_oldsp;
6286
6287 if(!maxargs) RETURN;
6288
6289 /* We do this here, rather than with a separate pushmark op, as it has
6290 to come in between two things this function does (stack reset and
6291 arg pushing). This seems the easiest way to do it. */
6292 if (pushmark) {
6293 PUTBACK;
6294 (void)Perl_pp_pushmark(aTHX);
6295 }
6296
6297 EXTEND(SP, maxargs == I32_MAX ? numargs : maxargs);
6298 PUTBACK; /* The code below can die in various places. */
6299
6300 oa = PL_opargs[opnum] >> OASHIFT;
6301 for (; oa&&(numargs||!pushmark); (void)(numargs&&(++svp,--numargs))) {
6302 whicharg++;
6303 switch (oa & 7) {
6304 case OA_SCALAR:
6305 try_defsv:
6306 if (!numargs && defgv && whicharg == minargs + 1) {
6307 PUSHs(DEFSV);
6308 }
6309 else PUSHs(numargs ? svp && *svp ? *svp : &PL_sv_undef : NULL);
6310 break;
6311 case OA_LIST:
6312 while (numargs--) {
6313 PUSHs(svp && *svp ? *svp : &PL_sv_undef);
6314 svp++;
6315 }
6316 RETURN;
6317 case OA_AVREF:
6318 if (!numargs) {
6319 GV *gv;
6320 if (CvUNIQUE(find_runcv_where(FIND_RUNCV_level_eq,1,NULL)))
6321 gv = PL_argvgv;
6322 else {
6323 S_maybe_unwind_defav(aTHX);
6324 gv = PL_defgv;
6325 }
6326 PUSHs((SV *)GvAVn(gv));
6327 break;
6328 }
6329 if (!svp || !*svp || !SvROK(*svp)
6330 || SvTYPE(SvRV(*svp)) != SVt_PVAV)
6331 DIE(aTHX_
6332 /* diag_listed_as: Type of arg %d to &CORE::%s must be %s*/
6333 "Type of arg %d to &CORE::%s must be array reference",
6334 whicharg, PL_op_desc[opnum]
6335 );
6336 PUSHs(SvRV(*svp));
6337 break;
6338 case OA_HVREF:
6339 if (!svp || !*svp || !SvROK(*svp)
6340 || ( SvTYPE(SvRV(*svp)) != SVt_PVHV
6341 && ( opnum == OP_DBMCLOSE || opnum == OP_DBMOPEN
6342 || SvTYPE(SvRV(*svp)) != SVt_PVAV )))
6343 DIE(aTHX_
6344 /* diag_listed_as: Type of arg %d to &CORE::%s must be %s*/
6345 "Type of arg %d to &CORE::%s must be hash%s reference",
6346 whicharg, PL_op_desc[opnum],
6347 opnum == OP_DBMCLOSE || opnum == OP_DBMOPEN
6348 ? ""
6349 : " or array"
6350 );
6351 PUSHs(SvRV(*svp));
6352 break;
6353 case OA_FILEREF:
6354 if (!numargs) PUSHs(NULL);
6355 else if(svp && *svp && SvROK(*svp) && isGV_with_GP(SvRV(*svp)))
6356 /* no magic here, as the prototype will have added an extra
6357 refgen and we just want what was there before that */
6358 PUSHs(SvRV(*svp));
6359 else {
6360 const bool constr = PL_op->op_private & whicharg;
6361 PUSHs(S_rv2gv(aTHX_
6362 svp && *svp ? *svp : &PL_sv_undef,
6363 constr, cBOOL(CopHINTS_get(PL_curcop) & HINT_STRICT_REFS),
6364 !constr
6365 ));
6366 }
6367 break;
6368 case OA_SCALARREF:
6369 if (!numargs) goto try_defsv;
6370 else {
6371 const bool wantscalar =
6372 PL_op->op_private & OPpCOREARGS_SCALARMOD;
6373 if (!svp || !*svp || !SvROK(*svp)
6374 /* We have to permit globrefs even for the \$ proto, as
6375 *foo is indistinguishable from ${\*foo}, and the proto-
6376 type permits the latter. */
6377 || SvTYPE(SvRV(*svp)) > (
6378 wantscalar ? SVt_PVLV
6379 : opnum == OP_LOCK || opnum == OP_UNDEF
6380 ? SVt_PVCV
6381 : SVt_PVHV
6382 )
6383 )
6384 DIE(aTHX_
6385 "Type of arg %d to &CORE::%s must be %s",
6386 whicharg, PL_op_name[opnum],
6387 wantscalar
6388 ? "scalar reference"
6389 : opnum == OP_LOCK || opnum == OP_UNDEF
6390 ? "reference to one of [$@%&*]"
6391 : "reference to one of [$@%*]"
6392 );
6393 PUSHs(SvRV(*svp));
6394 if (opnum == OP_UNDEF && SvRV(*svp) == (SV *)PL_defgv) {
6395 /* Undo @_ localisation, so that sub exit does not undo
6396 part of our undeffing. */
6397 S_maybe_unwind_defav(aTHX);
6398 }
6399 }
6400 break;
6401 default:
6402 DIE(aTHX_ "panic: unknown OA_*: %x", (unsigned)(oa&7));
6403 }
6404 oa = oa >> 4;
6405 }
6406
6407 RETURN;
6408}
6409
6410PP(pp_avhvswitch)
6411{
6412 dVAR; dSP;
6413 return PL_ppaddr[
6414 (SvTYPE(TOPs) == SVt_PVAV ? OP_AEACH : OP_EACH)
6415 + (PL_op->op_private & OPpAVHVSWITCH_MASK)
6416 ](aTHX);
6417}
6418
6419PP(pp_runcv)
6420{
6421 dSP;
6422 CV *cv;
6423 if (PL_op->op_private & OPpOFFBYONE) {
6424 cv = find_runcv_where(FIND_RUNCV_level_eq, 1, NULL);
6425 }
6426 else cv = find_runcv(NULL);
6427 XPUSHs(CvEVAL(cv) ? &PL_sv_undef : sv_2mortal(newRV((SV *)cv)));
6428 RETURN;
6429}
6430
6431static void
6432S_localise_aelem_lval(pTHX_ AV * const av, SV * const keysv,
6433 const bool can_preserve)
6434{
6435 const SSize_t ix = SvIV(keysv);
6436 if (can_preserve ? av_exists(av, ix) : TRUE) {
6437 SV ** const svp = av_fetch(av, ix, 1);
6438 if (!svp || !*svp)
6439 Perl_croak(aTHX_ PL_no_aelem, ix);
6440 save_aelem(av, ix, svp);
6441 }
6442 else
6443 SAVEADELETE(av, ix);
6444}
6445
6446static void
6447S_localise_helem_lval(pTHX_ HV * const hv, SV * const keysv,
6448 const bool can_preserve)
6449{
6450 if (can_preserve ? hv_exists_ent(hv, keysv, 0) : TRUE) {
6451 HE * const he = hv_fetch_ent(hv, keysv, 1, 0);
6452 SV ** const svp = he ? &HeVAL(he) : NULL;
6453 if (!svp || !*svp)
6454 Perl_croak(aTHX_ PL_no_helem_sv, SVfARG(keysv));
6455 save_helem_flags(hv, keysv, svp, 0);
6456 }
6457 else
6458 SAVEHDELETE(hv, keysv);
6459}
6460
6461static void
6462S_localise_gv_slot(pTHX_ GV *gv, U8 type)
6463{
6464 if (type == OPpLVREF_SV) {
6465 save_pushptrptr(gv, SvREFCNT_inc_simple(GvSV(gv)), SAVEt_GVSV);
6466 GvSV(gv) = 0;
6467 }
6468 else if (type == OPpLVREF_AV)
6469 /* XXX Inefficient, as it creates a new AV, which we are
6470 about to clobber. */
6471 save_ary(gv);
6472 else {
6473 assert(type == OPpLVREF_HV);
6474 /* XXX Likewise inefficient. */
6475 save_hash(gv);
6476 }
6477}
6478
6479
6480PP(pp_refassign)
6481{
6482 dSP;
6483 SV * const key = PL_op->op_private & OPpLVREF_ELEM ? POPs : NULL;
6484 SV * const left = PL_op->op_flags & OPf_STACKED ? POPs : NULL;
6485 dTOPss;
6486 const char *bad = NULL;
6487 const U8 type = PL_op->op_private & OPpLVREF_TYPE;
6488 if (!SvROK(sv)) DIE(aTHX_ "Assigned value is not a reference");
6489 switch (type) {
6490 case OPpLVREF_SV:
6491 if (SvTYPE(SvRV(sv)) > SVt_PVLV)
6492 bad = " SCALAR";
6493 break;
6494 case OPpLVREF_AV:
6495 if (SvTYPE(SvRV(sv)) != SVt_PVAV)
6496 bad = "n ARRAY";
6497 break;
6498 case OPpLVREF_HV:
6499 if (SvTYPE(SvRV(sv)) != SVt_PVHV)
6500 bad = " HASH";
6501 break;
6502 case OPpLVREF_CV:
6503 if (SvTYPE(SvRV(sv)) != SVt_PVCV)
6504 bad = " CODE";
6505 }
6506 if (bad)
6507 /* diag_listed_as: Assigned value is not %s reference */
6508 DIE(aTHX_ "Assigned value is not a%s reference", bad);
6509 {
6510 MAGIC *mg;
6511 HV *stash;
6512 switch (left ? SvTYPE(left) : 0) {
6513 case 0:
6514 {
6515 SV * const old = PAD_SV(ARGTARG);
6516 PAD_SETSV(ARGTARG, SvREFCNT_inc_NN(SvRV(sv)));
6517 SvREFCNT_dec(old);
6518 if ((PL_op->op_private & (OPpLVAL_INTRO|OPpPAD_STATE))
6519 == OPpLVAL_INTRO)
6520 SAVECLEARSV(PAD_SVl(ARGTARG));
6521 break;
6522 }
6523 case SVt_PVGV:
6524 if (PL_op->op_private & OPpLVAL_INTRO) {
6525 S_localise_gv_slot(aTHX_ (GV *)left, type);
6526 }
6527 gv_setref(left, sv);
6528 SvSETMAGIC(left);
6529 break;
6530 case SVt_PVAV:
6531 assert(key);
6532 if (UNLIKELY(PL_op->op_private & OPpLVAL_INTRO)) {
6533 S_localise_aelem_lval(aTHX_ (AV *)left, key,
6534 SvCANEXISTDELETE(left));
6535 }
6536 av_store((AV *)left, SvIV(key), SvREFCNT_inc_simple_NN(SvRV(sv)));
6537 break;
6538 case SVt_PVHV:
6539 if (UNLIKELY(PL_op->op_private & OPpLVAL_INTRO)) {
6540 assert(key);
6541 S_localise_helem_lval(aTHX_ (HV *)left, key,
6542 SvCANEXISTDELETE(left));
6543 }
6544 (void)hv_store_ent((HV *)left, key, SvREFCNT_inc_simple_NN(SvRV(sv)), 0);
6545 }
6546 if (PL_op->op_flags & OPf_MOD)
6547 SETs(sv_2mortal(newSVsv(sv)));
6548 /* XXX else can weak references go stale before they are read, e.g.,
6549 in leavesub? */
6550 RETURN;
6551 }
6552}
6553
6554PP(pp_lvref)
6555{
6556 dSP;
6557 SV * const ret = sv_2mortal(newSV_type(SVt_PVMG));
6558 SV * const elem = PL_op->op_private & OPpLVREF_ELEM ? POPs : NULL;
6559 SV * const arg = PL_op->op_flags & OPf_STACKED ? POPs : NULL;
6560 MAGIC * const mg = sv_magicext(ret, arg, PERL_MAGIC_lvref,
6561 &PL_vtbl_lvref, (char *)elem,
6562 elem ? HEf_SVKEY : (I32)ARGTARG);
6563 mg->mg_private = PL_op->op_private;
6564 if (PL_op->op_private & OPpLVREF_ITER)
6565 mg->mg_flags |= MGf_PERSIST;
6566 if (UNLIKELY(PL_op->op_private & OPpLVAL_INTRO)) {
6567 if (elem) {
6568 MAGIC *mg;
6569 HV *stash;
6570 assert(arg);
6571 {
6572 const bool can_preserve = SvCANEXISTDELETE(arg);
6573 if (SvTYPE(arg) == SVt_PVAV)
6574 S_localise_aelem_lval(aTHX_ (AV *)arg, elem, can_preserve);
6575 else
6576 S_localise_helem_lval(aTHX_ (HV *)arg, elem, can_preserve);
6577 }
6578 }
6579 else if (arg) {
6580 S_localise_gv_slot(aTHX_ (GV *)arg,
6581 PL_op->op_private & OPpLVREF_TYPE);
6582 }
6583 else if (!(PL_op->op_private & OPpPAD_STATE))
6584 SAVECLEARSV(PAD_SVl(ARGTARG));
6585 }
6586 XPUSHs(ret);
6587 RETURN;
6588}
6589
6590PP(pp_lvrefslice)
6591{
6592 dSP; dMARK;
6593 AV * const av = (AV *)POPs;
6594 const bool localizing = PL_op->op_private & OPpLVAL_INTRO;
6595 bool can_preserve = FALSE;
6596
6597 if (UNLIKELY(localizing)) {
6598 MAGIC *mg;
6599 HV *stash;
6600 SV **svp;
6601
6602 can_preserve = SvCANEXISTDELETE(av);
6603
6604 if (SvTYPE(av) == SVt_PVAV) {
6605 SSize_t max = -1;
6606
6607 for (svp = MARK + 1; svp <= SP; svp++) {
6608 const SSize_t elem = SvIV(*svp);
6609 if (elem > max)
6610 max = elem;
6611 }
6612 if (max > AvMAX(av))
6613 av_extend(av, max);
6614 }
6615 }
6616
6617 while (++MARK <= SP) {
6618 SV * const elemsv = *MARK;
6619 if (SvTYPE(av) == SVt_PVAV)
6620 S_localise_aelem_lval(aTHX_ av, elemsv, can_preserve);
6621 else
6622 S_localise_helem_lval(aTHX_ (HV *)av, elemsv, can_preserve);
6623 *MARK = sv_2mortal(newSV_type(SVt_PVMG));
6624 sv_magic(*MARK,(SV *)av,PERL_MAGIC_lvref,(char *)elemsv,HEf_SVKEY);
6625 }
6626 RETURN;
6627}
6628
6629PP(pp_lvavref)
6630{
6631 if (PL_op->op_flags & OPf_STACKED)
6632 Perl_pp_rv2av(aTHX);
6633 else
6634 Perl_pp_padav(aTHX);
6635 {
6636 dSP;
6637 dTOPss;
6638 SETs(0); /* special alias marker that aassign recognises */
6639 XPUSHs(sv);
6640 RETURN;
6641 }
6642}
6643
6644PP(pp_anonconst)
6645{
6646 dSP;
6647 dTOPss;
6648 SETs(sv_2mortal((SV *)newCONSTSUB(SvTYPE(CopSTASH(PL_curcop))==SVt_PVHV
6649 ? CopSTASH(PL_curcop)
6650 : NULL,
6651 NULL, SvREFCNT_inc_simple_NN(sv))));
6652 RETURN;
6653}
6654
6655
6656/* process one subroutine argument - typically when the sub has a signature:
6657 * introduce PL_curpad[op_targ] and assign to it the value
6658 * for $: (OPf_STACKED ? *sp : $_[N])
6659 * for @/%: @_[N..$#_]
6660 *
6661 * It's equivalent to
6662 * my $foo = $_[N];
6663 * or
6664 * my $foo = (value-on-stack)
6665 * or
6666 * my @foo = @_[N..$#_]
6667 * etc
6668 */
6669
6670PP(pp_argelem)
6671{
6672 dTARG;
6673 SV *val;
6674 SV ** padentry;
6675 OP *o = PL_op;
6676 AV *defav = GvAV(PL_defgv); /* @_ */
6677 IV ix = PTR2IV(cUNOP_AUXo->op_aux);
6678 IV argc;
6679
6680 /* do 'my $var, @var or %var' action */
6681 padentry = &(PAD_SVl(o->op_targ));
6682 save_clearsv(padentry);
6683 targ = *padentry;
6684
6685 if ((o->op_private & OPpARGELEM_MASK) == OPpARGELEM_SV) {
6686 if (o->op_flags & OPf_STACKED) {
6687 dSP;
6688 val = POPs;
6689 PUTBACK;
6690 }
6691 else {
6692 SV **svp;
6693 /* should already have been checked */
6694 assert(ix >= 0);
6695#if IVSIZE > PTRSIZE
6696 assert(ix <= SSize_t_MAX);
6697#endif
6698
6699 svp = av_fetch(defav, ix, FALSE);
6700 val = svp ? *svp : &PL_sv_undef;
6701 }
6702
6703 /* $var = $val */
6704
6705 /* cargo-culted from pp_sassign */
6706 assert(TAINTING_get || !TAINT_get);
6707 if (UNLIKELY(TAINT_get) && !SvTAINTED(val))
6708 TAINT_NOT;
6709
6710 SvSetMagicSV(targ, val);
6711 return o->op_next;
6712 }
6713
6714 /* must be AV or HV */
6715
6716 assert(!(o->op_flags & OPf_STACKED));
6717 argc = ((IV)AvFILL(defav) + 1) - ix;
6718
6719 /* This is a copy of the relevant parts of pp_aassign().
6720 */
6721 if ((o->op_private & OPpARGELEM_MASK) == OPpARGELEM_AV) {
6722 IV i;
6723
6724 if (AvFILL((AV*)targ) > -1) {
6725 /* target should usually be empty. If we get get
6726 * here, someone's been doing some weird closure tricks.
6727 * Make a copy of all args before clearing the array,
6728 * to avoid the equivalent of @a = ($a[0]) prematurely freeing
6729 * elements. See similar code in pp_aassign.
6730 */
6731 for (i = 0; i < argc; i++) {
6732 SV **svp = av_fetch(defav, ix + i, FALSE);
6733 SV *newsv = newSV(0);
6734 sv_setsv_flags(newsv,
6735 svp ? *svp : &PL_sv_undef,
6736 (SV_DO_COW_SVSETSV|SV_NOSTEAL));
6737 if (!av_store(defav, ix + i, newsv))
6738 SvREFCNT_dec_NN(newsv);
6739 }
6740 av_clear((AV*)targ);
6741 }
6742
6743 if (argc <= 0)
6744 return o->op_next;
6745
6746 av_extend((AV*)targ, argc);
6747
6748 i = 0;
6749 while (argc--) {
6750 SV *tmpsv;
6751 SV **svp = av_fetch(defav, ix + i, FALSE);
6752 SV *val = svp ? *svp : &PL_sv_undef;
6753 tmpsv = newSV(0);
6754 sv_setsv(tmpsv, val);
6755 av_store((AV*)targ, i++, tmpsv);
6756 TAINT_NOT;
6757 }
6758
6759 }
6760 else {
6761 IV i;
6762
6763 assert((o->op_private & OPpARGELEM_MASK) == OPpARGELEM_HV);
6764
6765 if (SvRMAGICAL(targ) || HvUSEDKEYS((HV*)targ)) {
6766 /* see "target should usually be empty" comment above */
6767 for (i = 0; i < argc; i++) {
6768 SV **svp = av_fetch(defav, ix + i, FALSE);
6769 SV *newsv = newSV(0);
6770 sv_setsv_flags(newsv,
6771 svp ? *svp : &PL_sv_undef,
6772 (SV_DO_COW_SVSETSV|SV_NOSTEAL));
6773 if (!av_store(defav, ix + i, newsv))
6774 SvREFCNT_dec_NN(newsv);
6775 }
6776 hv_clear((HV*)targ);
6777 }
6778
6779 if (argc <= 0)
6780 return o->op_next;
6781 assert(argc % 2 == 0);
6782
6783 i = 0;
6784 while (argc) {
6785 SV *tmpsv;
6786 SV **svp;
6787 SV *key;
6788 SV *val;
6789
6790 svp = av_fetch(defav, ix + i++, FALSE);
6791 key = svp ? *svp : &PL_sv_undef;
6792 svp = av_fetch(defav, ix + i++, FALSE);
6793 val = svp ? *svp : &PL_sv_undef;
6794
6795 argc -= 2;
6796 if (UNLIKELY(SvGMAGICAL(key)))
6797 key = sv_mortalcopy(key);
6798 tmpsv = newSV(0);
6799 sv_setsv(tmpsv, val);
6800 hv_store_ent((HV*)targ, key, tmpsv, 0);
6801 TAINT_NOT;
6802 }
6803 }
6804
6805 return o->op_next;
6806}
6807
6808/* Handle a default value for one subroutine argument (typically as part
6809 * of a subroutine signature).
6810 * It's equivalent to
6811 * @_ > op_targ ? $_[op_targ] : result_of(op_other)
6812 *
6813 * Intended to be used where op_next is an OP_ARGELEM
6814 *
6815 * We abuse the op_targ field slightly: it's an index into @_ rather than
6816 * into PL_curpad.
6817 */
6818
6819PP(pp_argdefelem)
6820{
6821 OP * const o = PL_op;
6822 AV *defav = GvAV(PL_defgv); /* @_ */
6823 IV ix = (IV)o->op_targ;
6824
6825 assert(ix >= 0);
6826#if IVSIZE > PTRSIZE
6827 assert(ix <= SSize_t_MAX);
6828#endif
6829
6830 if (AvFILL(defav) >= ix) {
6831 dSP;
6832 SV **svp = av_fetch(defav, ix, FALSE);
6833 SV *val = svp ? *svp : &PL_sv_undef;
6834 XPUSHs(val);
6835 RETURN;
6836 }
6837 return cLOGOPo->op_other;
6838}
6839
6840
6841static SV *
6842S_find_runcv_name(void)
6843{
6844 dTHX;
6845 CV *cv;
6846 GV *gv;
6847 SV *sv;
6848
6849 cv = find_runcv(0);
6850 if (!cv)
6851 return &PL_sv_no;
6852
6853 gv = CvGV(cv);
6854 if (!gv)
6855 return &PL_sv_no;
6856
6857 sv = sv_2mortal(newSV(0));
6858 gv_fullname4(sv, gv, NULL, TRUE);
6859 return sv;
6860}
6861
6862/* Check a a subs arguments - i.e. that it has the correct number of args
6863 * (and anything else we might think of in future). Typically used with
6864 * signatured subs.
6865 */
6866
6867PP(pp_argcheck)
6868{
6869 OP * const o = PL_op;
6870 UNOP_AUX_item *aux = cUNOP_AUXo->op_aux;
6871 IV params = aux[0].iv;
6872 IV opt_params = aux[1].iv;
6873 char slurpy = (char)(aux[2].iv);
6874 AV *defav = GvAV(PL_defgv); /* @_ */
6875 IV argc;
6876 bool too_few;
6877
6878 assert(!SvMAGICAL(defav));
6879 argc = (AvFILLp(defav) + 1);
6880 too_few = (argc < (params - opt_params));
6881
6882 if (UNLIKELY(too_few || (!slurpy && argc > params)))
6883 /* diag_listed_as: Too few arguments for subroutine '%s' */
6884 /* diag_listed_as: Too many arguments for subroutine '%s' */
6885 Perl_croak_caller("Too %s arguments for subroutine '%" SVf "'",
6886 too_few ? "few" : "many", S_find_runcv_name());
6887
6888 if (UNLIKELY(slurpy == '%' && argc > params && (argc - params) % 2))
6889 /* diag_listed_as: Odd name/value argument for subroutine '%s' */
6890 Perl_croak_caller("Odd name/value argument for subroutine '%" SVf "'",
6891 S_find_runcv_name());
6892
6893 return NORMAL;
6894}
6895
6896/*
6897 * ex: set ts=8 sts=4 sw=4 et:
6898 */