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