This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
utf8.h: Don't allow zero length malformation unless requested
[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)
147e3846 495 DIE(aTHX_ "Can't find an opnumber for \"%" UTF8f "\"",
b17a0679 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. */
c4ba80c3
NC
661 switch (*elem) {
662 case 'A':
500f3e18 663 if (memEQs(elem, len, "ARRAY"))
e14698d8 664 {
ad64d0ec 665 tmpRef = MUTABLE_SV(GvAV(gv));
e14698d8
FC
666 if (tmpRef && !AvREAL((const AV *)tmpRef)
667 && AvREIFY((const AV *)tmpRef))
668 av_reify(MUTABLE_AV(tmpRef));
669 }
c4ba80c3
NC
670 break;
671 case 'C':
500f3e18 672 if (memEQs(elem, len, "CODE"))
ad64d0ec 673 tmpRef = MUTABLE_SV(GvCVu(gv));
c4ba80c3
NC
674 break;
675 case 'F':
500f3e18 676 if (memEQs(elem, len, "FILEHANDLE")) {
ad64d0ec 677 tmpRef = MUTABLE_SV(GvIOp(gv));
c4ba80c3
NC
678 }
679 else
500f3e18 680 if (memEQs(elem, len, "FORMAT"))
ad64d0ec 681 tmpRef = MUTABLE_SV(GvFORM(gv));
c4ba80c3
NC
682 break;
683 case 'G':
500f3e18 684 if (memEQs(elem, len, "GLOB"))
ad64d0ec 685 tmpRef = MUTABLE_SV(gv);
c4ba80c3
NC
686 break;
687 case 'H':
500f3e18 688 if (memEQs(elem, len, "HASH"))
ad64d0ec 689 tmpRef = MUTABLE_SV(GvHV(gv));
c4ba80c3
NC
690 break;
691 case 'I':
500f3e18 692 if (memEQs(elem, len, "IO"))
ad64d0ec 693 tmpRef = MUTABLE_SV(GvIOp(gv));
c4ba80c3
NC
694 break;
695 case 'N':
500f3e18 696 if (memEQs(elem, len, "NAME"))
a663657d 697 sv = newSVhek(GvNAME_HEK(gv));
c4ba80c3
NC
698 break;
699 case 'P':
500f3e18 700 if (memEQs(elem, len, "PACKAGE")) {
7fa3a4ab
NC
701 const HV * const stash = GvSTASH(gv);
702 const HEK * const hek = stash ? HvNAME_HEK(stash) : NULL;
396482e1 703 sv = hek ? newSVhek(hek) : newSVpvs("__ANON__");
c4ba80c3
NC
704 }
705 break;
706 case 'S':
500f3e18 707 if (memEQs(elem, len, "SCALAR"))
f9d52e31 708 tmpRef = GvSVn(gv);
c4ba80c3 709 break;
39b99f21 710 }
fb73857a 711 }
76e3520e
GS
712 if (tmpRef)
713 sv = newRV(tmpRef);
fb73857a 714 if (sv)
715 sv_2mortal(sv);
716 else
3280af22 717 sv = &PL_sv_undef;
5695161e 718 SETs(sv);
fb73857a 719 RETURN;
720}
721
a0d0e21e 722/* Pattern matching */
79072805 723
a0d0e21e 724PP(pp_study)
79072805 725{
add3e777 726 dSP; dTOPss;
a0d0e21e
LW
727 STRLEN len;
728
1fa930f2 729 (void)SvPV(sv, len);
bc9a5256 730 if (len == 0 || len > I32_MAX || !SvPOK(sv) || SvUTF8(sv) || SvVALID(sv)) {
32f0ea87 731 /* Historically, study was skipped in these cases. */
add3e777
FC
732 SETs(&PL_sv_no);
733 return NORMAL;
a4f4e906
NC
734 }
735
a58a85fa 736 /* Make study a no-op. It's no longer useful and its existence
32f0ea87 737 complicates matters elsewhere. */
add3e777
FC
738 SETs(&PL_sv_yes);
739 return NORMAL;
79072805
LW
740}
741
b1c05ba5
DM
742
743/* also used for: pp_transr() */
744
a0d0e21e 745PP(pp_trans)
79072805 746{
6442877a 747 dSP;
a0d0e21e
LW
748 SV *sv;
749
533c011a 750 if (PL_op->op_flags & OPf_STACKED)
a0d0e21e 751 sv = POPs;
79072805 752 else {
a0d0e21e 753 EXTEND(SP,1);
f605e527 754 if (ARGTARG)
6442877a 755 sv = PAD_SV(ARGTARG);
f605e527
FC
756 else {
757 sv = DEFSV;
758 }
79072805 759 }
bb16bae8 760 if(PL_op->op_type == OP_TRANSR) {
290797f7
FC
761 STRLEN len;
762 const char * const pv = SvPV(sv,len);
763 SV * const newsv = newSVpvn_flags(pv, len, SVs_TEMP|SvUTF8(sv));
bb16bae8 764 do_trans(newsv);
290797f7 765 PUSHs(newsv);
bb16bae8 766 }
5bbe7184 767 else {
bcb10b84
VP
768 I32 i = do_trans(sv);
769 mPUSHi(i);
5bbe7184 770 }
a0d0e21e 771 RETURN;
79072805
LW
772}
773
a0d0e21e 774/* Lvalue operators. */
79072805 775
f595e19f 776static size_t
81745e4e
NC
777S_do_chomp(pTHX_ SV *retval, SV *sv, bool chomping)
778{
81745e4e
NC
779 STRLEN len;
780 char *s;
f595e19f 781 size_t count = 0;
81745e4e
NC
782
783 PERL_ARGS_ASSERT_DO_CHOMP;
784
785 if (chomping && (RsSNARF(PL_rs) || RsRECORD(PL_rs)))
f595e19f 786 return 0;
81745e4e
NC
787 if (SvTYPE(sv) == SVt_PVAV) {
788 I32 i;
789 AV *const av = MUTABLE_AV(sv);
790 const I32 max = AvFILL(av);
791
792 for (i = 0; i <= max; i++) {
793 sv = MUTABLE_SV(av_fetch(av, i, FALSE));
794 if (sv && ((sv = *(SV**)sv), sv != &PL_sv_undef))
f595e19f 795 count += do_chomp(retval, sv, chomping);
81745e4e 796 }
f595e19f 797 return count;
81745e4e
NC
798 }
799 else if (SvTYPE(sv) == SVt_PVHV) {
800 HV* const hv = MUTABLE_HV(sv);
801 HE* entry;
802 (void)hv_iterinit(hv);
803 while ((entry = hv_iternext(hv)))
f595e19f
FC
804 count += do_chomp(retval, hv_iterval(hv,entry), chomping);
805 return count;
81745e4e
NC
806 }
807 else if (SvREADONLY(sv)) {
cb077ed2 808 Perl_croak_no_modify();
81745e4e
NC
809 }
810
81745e4e
NC
811 s = SvPV(sv, len);
812 if (chomping) {
81745e4e 813 if (s && len) {
997c424a
DD
814 char *temp_buffer = NULL;
815 SV *svrecode = NULL;
81745e4e
NC
816 s += --len;
817 if (RsPARA(PL_rs)) {
818 if (*s != '\n')
997c424a 819 goto nope_free_nothing;
f595e19f 820 ++count;
81745e4e
NC
821 while (len && s[-1] == '\n') {
822 --len;
823 --s;
f595e19f 824 ++count;
81745e4e
NC
825 }
826 }
827 else {
828 STRLEN rslen, rs_charlen;
829 const char *rsptr = SvPV_const(PL_rs, rslen);
830
831 rs_charlen = SvUTF8(PL_rs)
832 ? sv_len_utf8(PL_rs)
833 : rslen;
834
835 if (SvUTF8(PL_rs) != SvUTF8(sv)) {
836 /* Assumption is that rs is shorter than the scalar. */
837 if (SvUTF8(PL_rs)) {
838 /* RS is utf8, scalar is 8 bit. */
839 bool is_utf8 = TRUE;
840 temp_buffer = (char*)bytes_from_utf8((U8*)rsptr,
841 &rslen, &is_utf8);
842 if (is_utf8) {
997c424a
DD
843 /* Cannot downgrade, therefore cannot possibly match.
844 At this point, temp_buffer is not alloced, and
845 is the buffer inside PL_rs, so dont free it.
81745e4e
NC
846 */
847 assert (temp_buffer == rsptr);
997c424a 848 goto nope_free_sv;
81745e4e
NC
849 }
850 rsptr = temp_buffer;
851 }
81745e4e
NC
852 else {
853 /* RS is 8 bit, scalar is utf8. */
854 temp_buffer = (char*)bytes_to_utf8((U8*)rsptr, &rslen);
855 rsptr = temp_buffer;
856 }
857 }
858 if (rslen == 1) {
859 if (*s != *rsptr)
997c424a 860 goto nope_free_all;
f595e19f 861 ++count;
81745e4e
NC
862 }
863 else {
864 if (len < rslen - 1)
997c424a 865 goto nope_free_all;
81745e4e
NC
866 len -= rslen - 1;
867 s -= rslen - 1;
868 if (memNE(s, rsptr, rslen))
997c424a 869 goto nope_free_all;
f595e19f 870 count += rs_charlen;
81745e4e
NC
871 }
872 }
3b7ded39 873 SvPV_force_nomg_nolen(sv);
81745e4e
NC
874 SvCUR_set(sv, len);
875 *SvEND(sv) = '\0';
876 SvNIOK_off(sv);
877 SvSETMAGIC(sv);
81745e4e 878
997c424a
DD
879 nope_free_all:
880 Safefree(temp_buffer);
881 nope_free_sv:
882 SvREFCNT_dec(svrecode);
883 nope_free_nothing: ;
884 }
81745e4e 885 } else {
f8c80a8e 886 if (len && (!SvPOK(sv) || SvIsCOW(sv)))
81745e4e
NC
887 s = SvPV_force_nomg(sv, len);
888 if (DO_UTF8(sv)) {
889 if (s && len) {
890 char * const send = s + len;
891 char * const start = s;
892 s = send - 1;
893 while (s > start && UTF8_IS_CONTINUATION(*s))
894 s--;
895 if (is_utf8_string((U8*)s, send - s)) {
896 sv_setpvn(retval, s, send - s);
897 *s = '\0';
898 SvCUR_set(sv, s - start);
899 SvNIOK_off(sv);
900 SvUTF8_on(retval);
901 }
902 }
903 else
500f3e18 904 SvPVCLEAR(retval);
81745e4e
NC
905 }
906 else if (s && len) {
907 s += --len;
908 sv_setpvn(retval, s, 1);
909 *s = '\0';
910 SvCUR_set(sv, len);
911 SvUTF8_off(sv);
912 SvNIOK_off(sv);
913 }
914 else
500f3e18 915 SvPVCLEAR(retval);
81745e4e
NC
916 SvSETMAGIC(sv);
917 }
f595e19f 918 return count;
81745e4e
NC
919}
920
b1c05ba5
DM
921
922/* also used for: pp_schomp() */
923
a0d0e21e
LW
924PP(pp_schop)
925{
20b7effb 926 dSP; dTARGET;
fa54efae
NC
927 const bool chomping = PL_op->op_type == OP_SCHOMP;
928
f595e19f 929 const size_t count = do_chomp(TARG, TOPs, chomping);
fa54efae 930 if (chomping)
f595e19f 931 sv_setiv(TARG, count);
a0d0e21e 932 SETTARG;
ee41d8c7 933 return NORMAL;
79072805
LW
934}
935
b1c05ba5
DM
936
937/* also used for: pp_chomp() */
938
a0d0e21e 939PP(pp_chop)
79072805 940{
20b7effb 941 dSP; dMARK; dTARGET; dORIGMARK;
fa54efae 942 const bool chomping = PL_op->op_type == OP_CHOMP;
f595e19f 943 size_t count = 0;
8ec5e241 944
20cf1f79 945 while (MARK < SP)
f595e19f
FC
946 count += do_chomp(TARG, *++MARK, chomping);
947 if (chomping)
948 sv_setiv(TARG, count);
20cf1f79
NC
949 SP = ORIGMARK;
950 XPUSHTARG;
a0d0e21e 951 RETURN;
79072805
LW
952}
953
a0d0e21e
LW
954PP(pp_undef)
955{
20b7effb 956 dSP;
a0d0e21e
LW
957 SV *sv;
958
533c011a 959 if (!PL_op->op_private) {
774d564b 960 EXTEND(SP, 1);
a0d0e21e 961 RETPUSHUNDEF;
774d564b 962 }
79072805 963
821f14b0 964 sv = TOPs;
a0d0e21e 965 if (!sv)
821f14b0
FC
966 {
967 SETs(&PL_sv_undef);
968 return NORMAL;
969 }
85e6fe83 970
4dda930b
FC
971 if (SvTHINKFIRST(sv))
972 sv_force_normal_flags(sv, SV_COW_DROP_PV|SV_IMMEDIATE_UNREF);
85e6fe83 973
a0d0e21e
LW
974 switch (SvTYPE(sv)) {
975 case SVt_NULL:
976 break;
977 case SVt_PVAV:
60edcf09 978 av_undef(MUTABLE_AV(sv));
a0d0e21e
LW
979 break;
980 case SVt_PVHV:
60edcf09 981 hv_undef(MUTABLE_HV(sv));
a0d0e21e
LW
982 break;
983 case SVt_PVCV:
a2a5de95 984 if (cv_const_sv((const CV *)sv))
714cd18f 985 Perl_ck_warner(aTHX_ packWARN(WARN_MISC),
147e3846 986 "Constant subroutine %" SVf " undefined",
714cd18f
BF
987 SVfARG(CvANON((const CV *)sv)
988 ? newSVpvs_flags("(anonymous)", SVs_TEMP)
bdbfc51a
FC
989 : sv_2mortal(newSVhek(
990 CvNAMED(sv)
991 ? CvNAME_HEK((CV *)sv)
992 : GvENAME_HEK(CvGV((const CV *)sv))
993 ))
994 ));
5f66b61c 995 /* FALLTHROUGH */
9607fc9c 996 case SVt_PVFM:
6fc92669 997 /* let user-undef'd sub keep its identity */
b7acb0a3 998 cv_undef_flags(MUTABLE_CV(sv), CV_UNDEF_KEEP_NAME);
a0d0e21e 999 break;
8e07c86e 1000 case SVt_PVGV:
bc1df6c2
FC
1001 assert(isGV_with_GP(sv));
1002 assert(!SvFAKE(sv));
1003 {
20408e3c 1004 GP *gp;
dd69841b
BB
1005 HV *stash;
1006
dd69841b 1007 /* undef *Pkg::meth_name ... */
e530fb81
FC
1008 bool method_changed
1009 = GvCVu((const GV *)sv) && (stash = GvSTASH((const GV *)sv))
1010 && HvENAME_get(stash);
1011 /* undef *Foo:: */
1012 if((stash = GvHV((const GV *)sv))) {
1013 if(HvENAME_get(stash))
1014 SvREFCNT_inc_simple_void_NN(sv_2mortal((SV *)stash));
1015 else stash = NULL;
1016 }
dd69841b 1017
795eb8c8 1018 SvREFCNT_inc_simple_void_NN(sv_2mortal(sv));
159b6efe 1019 gp_free(MUTABLE_GV(sv));
a02a5408 1020 Newxz(gp, 1, GP);
c43ae56f 1021 GvGP_set(sv, gp_ref(gp));
2e3295e3 1022#ifndef PERL_DONT_CREATE_GVSV
561b68a9 1023 GvSV(sv) = newSV(0);
2e3295e3 1024#endif
57843af0 1025 GvLINE(sv) = CopLINE(PL_curcop);
159b6efe 1026 GvEGV(sv) = MUTABLE_GV(sv);
20408e3c 1027 GvMULTI_on(sv);
e530fb81
FC
1028
1029 if(stash)
afdbe55d 1030 mro_package_moved(NULL, stash, (const GV *)sv, 0);
e530fb81
FC
1031 stash = NULL;
1032 /* undef *Foo::ISA */
1033 if( strEQ(GvNAME((const GV *)sv), "ISA")
1034 && (stash = GvSTASH((const GV *)sv))
1035 && (method_changed || HvENAME(stash)) )
1036 mro_isa_changed_in(stash);
1037 else if(method_changed)
1038 mro_method_changed_in(
da9043f5 1039 GvSTASH((const GV *)sv)
e530fb81
FC
1040 );
1041
6e592b3a 1042 break;
20408e3c 1043 }
a0d0e21e 1044 default:
b15aece3 1045 if (SvTYPE(sv) >= SVt_PV && SvPVX_const(sv) && SvLEN(sv)) {
8bd4d4c5 1046 SvPV_free(sv);
c445ea15 1047 SvPV_set(sv, NULL);
4633a7c4 1048 SvLEN_set(sv, 0);
a0d0e21e 1049 }
0c34ef67 1050 SvOK_off(sv);
4633a7c4 1051 SvSETMAGIC(sv);
79072805 1052 }
a0d0e21e 1053
821f14b0
FC
1054 SETs(&PL_sv_undef);
1055 return NORMAL;
79072805
LW
1056}
1057
b1c05ba5 1058
20e96431 1059/* common "slow" code for pp_postinc and pp_postdec */
b1c05ba5 1060
20e96431
DM
1061static OP *
1062S_postincdec_common(pTHX_ SV *sv, SV *targ)
a0d0e21e 1063{
20e96431 1064 dSP;
c22c99bc
FC
1065 const bool inc =
1066 PL_op->op_type == OP_POSTINC || PL_op->op_type == OP_I_POSTINC;
20e96431
DM
1067
1068 if (SvROK(sv))
7dcb9b98 1069 TARG = sv_newmortal();
20e96431
DM
1070 sv_setsv(TARG, sv);
1071 if (inc)
1072 sv_inc_nomg(sv);
1073 else
1074 sv_dec_nomg(sv);
1075 SvSETMAGIC(sv);
1e54a23f 1076 /* special case for undef: see thread at 2003-03/msg00536.html in archive */
c22c99bc 1077 if (inc && !SvOK(TARG))
a0d0e21e 1078 sv_setiv(TARG, 0);
e87de4ab 1079 SETTARG;
a0d0e21e
LW
1080 return NORMAL;
1081}
79072805 1082
20e96431
DM
1083
1084/* also used for: pp_i_postinc() */
1085
1086PP(pp_postinc)
1087{
1088 dSP; dTARGET;
1089 SV *sv = TOPs;
1090
1091 /* special-case sv being a simple integer */
1092 if (LIKELY(((sv->sv_flags &
1093 (SVf_THINKFIRST|SVs_GMG|SVf_IVisUV|
1094 SVf_IOK|SVf_NOK|SVf_POK|SVp_NOK|SVp_POK|SVf_ROK))
1095 == SVf_IOK))
1096 && SvIVX(sv) != IV_MAX)
1097 {
1098 IV iv = SvIVX(sv);
1099 SvIV_set(sv, iv + 1);
1100 TARGi(iv, 0); /* arg not GMG, so can't be tainted */
1101 SETs(TARG);
1102 return NORMAL;
1103 }
1104
1105 return S_postincdec_common(aTHX_ sv, TARG);
1106}
1107
1108
1109/* also used for: pp_i_postdec() */
1110
1111PP(pp_postdec)
1112{
1113 dSP; dTARGET;
1114 SV *sv = TOPs;
1115
1116 /* special-case sv being a simple integer */
1117 if (LIKELY(((sv->sv_flags &
1118 (SVf_THINKFIRST|SVs_GMG|SVf_IVisUV|
1119 SVf_IOK|SVf_NOK|SVf_POK|SVp_NOK|SVp_POK|SVf_ROK))
1120 == SVf_IOK))
1121 && SvIVX(sv) != IV_MIN)
1122 {
1123 IV iv = SvIVX(sv);
1124 SvIV_set(sv, iv - 1);
1125 TARGi(iv, 0); /* arg not GMG, so can't be tainted */
1126 SETs(TARG);
1127 return NORMAL;
1128 }
1129
1130 return S_postincdec_common(aTHX_ sv, TARG);
1131}
1132
1133
a0d0e21e
LW
1134/* Ordinary operators. */
1135
1136PP(pp_pow)
1137{
20b7effb 1138 dSP; dATARGET; SV *svl, *svr;
58d76dfd 1139#ifdef PERL_PRESERVE_IVUV
52a96ae6
HS
1140 bool is_int = 0;
1141#endif
6f1401dc
DM
1142 tryAMAGICbin_MG(pow_amg, AMGf_assign|AMGf_numeric);
1143 svr = TOPs;
1144 svl = TOPm1s;
52a96ae6
HS
1145#ifdef PERL_PRESERVE_IVUV
1146 /* For integer to integer power, we do the calculation by hand wherever
1147 we're sure it is safe; otherwise we call pow() and try to convert to
1148 integer afterwards. */
01f91bf2 1149 if (SvIV_please_nomg(svr) && SvIV_please_nomg(svl)) {
900658e3
PF
1150 UV power;
1151 bool baseuok;
1152 UV baseuv;
1153
800401ee
JH
1154 if (SvUOK(svr)) {
1155 power = SvUVX(svr);
900658e3 1156 } else {
800401ee 1157 const IV iv = SvIVX(svr);
900658e3
PF
1158 if (iv >= 0) {
1159 power = iv;
1160 } else {
1161 goto float_it; /* Can't do negative powers this way. */
1162 }
1163 }
1164
800401ee 1165 baseuok = SvUOK(svl);
900658e3 1166 if (baseuok) {
800401ee 1167 baseuv = SvUVX(svl);
900658e3 1168 } else {
800401ee 1169 const IV iv = SvIVX(svl);
900658e3
PF
1170 if (iv >= 0) {
1171 baseuv = iv;
1172 baseuok = TRUE; /* effectively it's a UV now */
1173 } else {
1174 baseuv = -iv; /* abs, baseuok == false records sign */
1175 }
1176 }
52a96ae6
HS
1177 /* now we have integer ** positive integer. */
1178 is_int = 1;
1179
1180 /* foo & (foo - 1) is zero only for a power of 2. */
58d76dfd 1181 if (!(baseuv & (baseuv - 1))) {
52a96ae6 1182 /* We are raising power-of-2 to a positive integer.
58d76dfd
JH
1183 The logic here will work for any base (even non-integer
1184 bases) but it can be less accurate than
1185 pow (base,power) or exp (power * log (base)) when the
1186 intermediate values start to spill out of the mantissa.
1187 With powers of 2 we know this can't happen.
1188 And powers of 2 are the favourite thing for perl
1189 programmers to notice ** not doing what they mean. */
1190 NV result = 1.0;
1191 NV base = baseuok ? baseuv : -(NV)baseuv;
900658e3
PF
1192
1193 if (power & 1) {
1194 result *= base;
1195 }
1196 while (power >>= 1) {
1197 base *= base;
1198 if (power & 1) {
1199 result *= base;
1200 }
1201 }
58d76dfd
JH
1202 SP--;
1203 SETn( result );
6f1401dc 1204 SvIV_please_nomg(svr);
58d76dfd 1205 RETURN;
52a96ae6 1206 } else {
eb578fdb
KW
1207 unsigned int highbit = 8 * sizeof(UV);
1208 unsigned int diff = 8 * sizeof(UV);
900658e3
PF
1209 while (diff >>= 1) {
1210 highbit -= diff;
1211 if (baseuv >> highbit) {
1212 highbit += diff;
1213 }
52a96ae6
HS
1214 }
1215 /* we now have baseuv < 2 ** highbit */
1216 if (power * highbit <= 8 * sizeof(UV)) {
1217 /* result will definitely fit in UV, so use UV math
1218 on same algorithm as above */
eb578fdb
KW
1219 UV result = 1;
1220 UV base = baseuv;
f2338a2e 1221 const bool odd_power = cBOOL(power & 1);
900658e3
PF
1222 if (odd_power) {
1223 result *= base;
1224 }
1225 while (power >>= 1) {
1226 base *= base;
1227 if (power & 1) {
52a96ae6 1228 result *= base;
52a96ae6
HS
1229 }
1230 }
1231 SP--;
0615a994 1232 if (baseuok || !odd_power)
52a96ae6
HS
1233 /* answer is positive */
1234 SETu( result );
1235 else if (result <= (UV)IV_MAX)
1236 /* answer negative, fits in IV */
1237 SETi( -(IV)result );
1238 else if (result == (UV)IV_MIN)
1239 /* 2's complement assumption: special case IV_MIN */
1240 SETi( IV_MIN );
1241 else
1242 /* answer negative, doesn't fit */
1243 SETn( -(NV)result );
1244 RETURN;
1245 }
1246 }
58d76dfd 1247 }
52a96ae6 1248 float_it:
58d76dfd 1249#endif
a0d0e21e 1250 {
6f1401dc
DM
1251 NV right = SvNV_nomg(svr);
1252 NV left = SvNV_nomg(svl);
4efa5a16 1253 (void)POPs;
3aaeb624
JA
1254
1255#if defined(USE_LONG_DOUBLE) && defined(HAS_AIX_POWL_NEG_BASE_BUG)
1256 /*
1257 We are building perl with long double support and are on an AIX OS
1258 afflicted with a powl() function that wrongly returns NaNQ for any
1259 negative base. This was reported to IBM as PMR #23047-379 on
1260 03/06/2006. The problem exists in at least the following versions
1261 of AIX and the libm fileset, and no doubt others as well:
1262
1263 AIX 4.3.3-ML10 bos.adt.libm 4.3.3.50
1264 AIX 5.1.0-ML04 bos.adt.libm 5.1.0.29
1265 AIX 5.2.0 bos.adt.libm 5.2.0.85
1266
1267 So, until IBM fixes powl(), we provide the following workaround to
1268 handle the problem ourselves. Our logic is as follows: for
1269 negative bases (left), we use fmod(right, 2) to check if the
1270 exponent is an odd or even integer:
1271
1272 - if odd, powl(left, right) == -powl(-left, right)
1273 - if even, powl(left, right) == powl(-left, right)
1274
1275 If the exponent is not an integer, the result is rightly NaNQ, so
1276 we just return that (as NV_NAN).
1277 */
1278
1279 if (left < 0.0) {
1280 NV mod2 = Perl_fmod( right, 2.0 );
1281 if (mod2 == 1.0 || mod2 == -1.0) { /* odd integer */
1282 SETn( -Perl_pow( -left, right) );
1283 } else if (mod2 == 0.0) { /* even integer */
1284 SETn( Perl_pow( -left, right) );
1285 } else { /* fractional power */
1286 SETn( NV_NAN );
1287 }
1288 } else {
1289 SETn( Perl_pow( left, right) );
1290 }
1291#else
52a96ae6 1292 SETn( Perl_pow( left, right) );
3aaeb624
JA
1293#endif /* HAS_AIX_POWL_NEG_BASE_BUG */
1294
52a96ae6
HS
1295#ifdef PERL_PRESERVE_IVUV
1296 if (is_int)
6f1401dc 1297 SvIV_please_nomg(svr);
52a96ae6
HS
1298#endif
1299 RETURN;
93a17b20 1300 }
a0d0e21e
LW
1301}
1302
1303PP(pp_multiply)
1304{
20b7effb 1305 dSP; dATARGET; SV *svl, *svr;
6f1401dc
DM
1306 tryAMAGICbin_MG(mult_amg, AMGf_assign|AMGf_numeric);
1307 svr = TOPs;
1308 svl = TOPm1s;
230ee21f 1309
28e5dec8 1310#ifdef PERL_PRESERVE_IVUV
230ee21f
DM
1311
1312 /* special-case some simple common cases */
1313 if (!((svl->sv_flags|svr->sv_flags) & (SVf_IVisUV|SVs_GMG))) {
1314 IV il, ir;
1315 U32 flags = (svl->sv_flags & svr->sv_flags);
1316 if (flags & SVf_IOK) {
1317 /* both args are simple IVs */
1318 UV topl, topr;
1319 il = SvIVX(svl);
1320 ir = SvIVX(svr);
1321 do_iv:
1322 topl = ((UV)il) >> (UVSIZE * 4 - 1);
1323 topr = ((UV)ir) >> (UVSIZE * 4 - 1);
1324
1325 /* if both are in a range that can't under/overflow, do a
1326 * simple integer multiply: if the top halves(*) of both numbers
1327 * are 00...00 or 11...11, then it's safe.
1328 * (*) for 32-bits, the "top half" is the top 17 bits,
1329 * for 64-bits, its 33 bits */
1330 if (!(
1331 ((topl+1) | (topr+1))
1332 & ( (((UV)1) << (UVSIZE * 4 + 1)) - 2) /* 11..110 */
1333 )) {
1334 SP--;
1335 TARGi(il * ir, 0); /* args not GMG, so can't be tainted */
1336 SETs(TARG);
1337 RETURN;
1338 }
1339 goto generic;
1340 }
1341 else if (flags & SVf_NOK) {
1342 /* both args are NVs */
1343 NV nl = SvNVX(svl);
1344 NV nr = SvNVX(svr);
1345 NV result;
1346
3336af0b
DD
1347 if (
1348#if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
1349 !Perl_isnan(nl) && nl == (NV)(il = (IV)nl)
1350 && !Perl_isnan(nr) && nr == (NV)(ir = (IV)nr)
1351#else
1352 nl == (NV)(il = (IV)nl) && nr == (NV)(ir = (IV)nr)
1353#endif
1354 )
230ee21f
DM
1355 /* nothing was lost by converting to IVs */
1356 goto do_iv;
1357 SP--;
1358 result = nl * nr;
1f02ab1d 1359# if defined(__sgi) && defined(USE_LONG_DOUBLE) && LONG_DOUBLEKIND == LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_BE_BE && NVSIZE == 16
230ee21f
DM
1360 if (Perl_isinf(result)) {
1361 Zero((U8*)&result + 8, 8, U8);
1362 }
1363# endif
1364 TARGn(result, 0); /* args not GMG, so can't be tainted */
1365 SETs(TARG);
1366 RETURN;
1367 }
1368 }
1369
1370 generic:
1371
01f91bf2 1372 if (SvIV_please_nomg(svr)) {
28e5dec8
JH
1373 /* Unless the left argument is integer in range we are going to have to
1374 use NV maths. Hence only attempt to coerce the right argument if
1375 we know the left is integer. */
1376 /* Left operand is defined, so is it IV? */
01f91bf2 1377 if (SvIV_please_nomg(svl)) {
800401ee
JH
1378 bool auvok = SvUOK(svl);
1379 bool buvok = SvUOK(svr);
28e5dec8
JH
1380 const UV topmask = (~ (UV)0) << (4 * sizeof (UV));
1381 const UV botmask = ~((~ (UV)0) << (4 * sizeof (UV)));
1382 UV alow;
1383 UV ahigh;
1384 UV blow;
1385 UV bhigh;
1386
1387 if (auvok) {
800401ee 1388 alow = SvUVX(svl);
28e5dec8 1389 } else {
800401ee 1390 const IV aiv = SvIVX(svl);
28e5dec8
JH
1391 if (aiv >= 0) {
1392 alow = aiv;
1393 auvok = TRUE; /* effectively it's a UV now */
1394 } else {
53e2bfb7
DM
1395 /* abs, auvok == false records sign */
1396 alow = (aiv == IV_MIN) ? (UV)aiv : (UV)(-aiv);
28e5dec8
JH
1397 }
1398 }
1399 if (buvok) {
800401ee 1400 blow = SvUVX(svr);
28e5dec8 1401 } else {
800401ee 1402 const IV biv = SvIVX(svr);
28e5dec8
JH
1403 if (biv >= 0) {
1404 blow = biv;
1405 buvok = TRUE; /* effectively it's a UV now */
1406 } else {
53e2bfb7
DM
1407 /* abs, buvok == false records sign */
1408 blow = (biv == IV_MIN) ? (UV)biv : (UV)(-biv);
28e5dec8
JH
1409 }
1410 }
1411
1412 /* If this does sign extension on unsigned it's time for plan B */
1413 ahigh = alow >> (4 * sizeof (UV));
1414 alow &= botmask;
1415 bhigh = blow >> (4 * sizeof (UV));
1416 blow &= botmask;
1417 if (ahigh && bhigh) {
6f207bd3 1418 NOOP;
28e5dec8
JH
1419 /* eg 32 bit is at least 0x10000 * 0x10000 == 0x100000000
1420 which is overflow. Drop to NVs below. */
1421 } else if (!ahigh && !bhigh) {
1422 /* eg 32 bit is at most 0xFFFF * 0xFFFF == 0xFFFE0001
1423 so the unsigned multiply cannot overflow. */
c445ea15 1424 const UV product = alow * blow;
28e5dec8
JH
1425 if (auvok == buvok) {
1426 /* -ve * -ve or +ve * +ve gives a +ve result. */
1427 SP--;
1428 SETu( product );
1429 RETURN;
1430 } else if (product <= (UV)IV_MIN) {
1431 /* 2s complement assumption that (UV)-IV_MIN is correct. */
1432 /* -ve result, which could overflow an IV */
1433 SP--;
02b08bbc
DM
1434 /* can't negate IV_MIN, but there are aren't two
1435 * integers such that !ahigh && !bhigh, where the
1436 * product equals 0x800....000 */
1437 assert(product != (UV)IV_MIN);
25716404 1438 SETi( -(IV)product );
28e5dec8
JH
1439 RETURN;
1440 } /* else drop to NVs below. */
1441 } else {
1442 /* One operand is large, 1 small */
1443 UV product_middle;
1444 if (bhigh) {
1445 /* swap the operands */
1446 ahigh = bhigh;
1447 bhigh = blow; /* bhigh now the temp var for the swap */
1448 blow = alow;
1449 alow = bhigh;
1450 }
1451 /* now, ((ahigh * blow) << half_UV_len) + (alow * blow)
1452 multiplies can't overflow. shift can, add can, -ve can. */
1453 product_middle = ahigh * blow;
1454 if (!(product_middle & topmask)) {
1455 /* OK, (ahigh * blow) won't lose bits when we shift it. */
1456 UV product_low;
1457 product_middle <<= (4 * sizeof (UV));
1458 product_low = alow * blow;
1459
1460 /* as for pp_add, UV + something mustn't get smaller.
1461 IIRC ANSI mandates this wrapping *behaviour* for
1462 unsigned whatever the actual representation*/
1463 product_low += product_middle;
1464 if (product_low >= product_middle) {
1465 /* didn't overflow */
1466 if (auvok == buvok) {
1467 /* -ve * -ve or +ve * +ve gives a +ve result. */
1468 SP--;
1469 SETu( product_low );
1470 RETURN;
1471 } else if (product_low <= (UV)IV_MIN) {
1472 /* 2s complement assumption again */
1473 /* -ve result, which could overflow an IV */
1474 SP--;
53e2bfb7
DM
1475 SETi(product_low == (UV)IV_MIN
1476 ? IV_MIN : -(IV)product_low);
28e5dec8
JH
1477 RETURN;
1478 } /* else drop to NVs below. */
1479 }
1480 } /* product_middle too large */
1481 } /* ahigh && bhigh */
800401ee
JH
1482 } /* SvIOK(svl) */
1483 } /* SvIOK(svr) */
28e5dec8 1484#endif
a0d0e21e 1485 {
6f1401dc
DM
1486 NV right = SvNV_nomg(svr);
1487 NV left = SvNV_nomg(svl);
230ee21f
DM
1488 NV result = left * right;
1489
4efa5a16 1490 (void)POPs;
1f02ab1d 1491#if defined(__sgi) && defined(USE_LONG_DOUBLE) && LONG_DOUBLEKIND == LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_BE_BE && NVSIZE == 16
230ee21f
DM
1492 if (Perl_isinf(result)) {
1493 Zero((U8*)&result + 8, 8, U8);
3ec400f5 1494 }
3ec400f5 1495#endif
230ee21f 1496 SETn(result);
a0d0e21e 1497 RETURN;
79072805 1498 }
a0d0e21e
LW
1499}
1500
1501PP(pp_divide)
1502{
20b7effb 1503 dSP; dATARGET; SV *svl, *svr;
6f1401dc
DM
1504 tryAMAGICbin_MG(div_amg, AMGf_assign|AMGf_numeric);
1505 svr = TOPs;
1506 svl = TOPm1s;
5479d192 1507 /* Only try to do UV divide first
68795e93 1508 if ((SLOPPYDIVIDE is true) or
5479d192
NC
1509 (PERL_PRESERVE_IVUV is true and one or both SV is a UV too large
1510 to preserve))
1511 The assumption is that it is better to use floating point divide
1512 whenever possible, only doing integer divide first if we can't be sure.
1513 If NV_PRESERVES_UV is true then we know at compile time that no UV
1514 can be too large to preserve, so don't need to compile the code to
1515 test the size of UVs. */
1516
a0d0e21e 1517#ifdef SLOPPYDIVIDE
5479d192
NC
1518# define PERL_TRY_UV_DIVIDE
1519 /* ensure that 20./5. == 4. */
a0d0e21e 1520#else
5479d192
NC
1521# ifdef PERL_PRESERVE_IVUV
1522# ifndef NV_PRESERVES_UV
1523# define PERL_TRY_UV_DIVIDE
1524# endif
1525# endif
a0d0e21e 1526#endif
5479d192
NC
1527
1528#ifdef PERL_TRY_UV_DIVIDE
01f91bf2 1529 if (SvIV_please_nomg(svr) && SvIV_please_nomg(svl)) {
800401ee
JH
1530 bool left_non_neg = SvUOK(svl);
1531 bool right_non_neg = SvUOK(svr);
5479d192
NC
1532 UV left;
1533 UV right;
1534
1535 if (right_non_neg) {
800401ee 1536 right = SvUVX(svr);
5479d192
NC
1537 }
1538 else {
800401ee 1539 const IV biv = SvIVX(svr);
5479d192
NC
1540 if (biv >= 0) {
1541 right = biv;
1542 right_non_neg = TRUE; /* effectively it's a UV now */
1543 }
1544 else {
02b08bbc 1545 right = (biv == IV_MIN) ? (UV)biv : (UV)(-biv);
5479d192
NC
1546 }
1547 }
1548 /* historically undef()/0 gives a "Use of uninitialized value"
1549 warning before dieing, hence this test goes here.
1550 If it were immediately before the second SvIV_please, then
1551 DIE() would be invoked before left was even inspected, so
486ec47a 1552 no inspection would give no warning. */
5479d192
NC
1553 if (right == 0)
1554 DIE(aTHX_ "Illegal division by zero");
1555
1556 if (left_non_neg) {
800401ee 1557 left = SvUVX(svl);
5479d192
NC
1558 }
1559 else {
800401ee 1560 const IV aiv = SvIVX(svl);
5479d192
NC
1561 if (aiv >= 0) {
1562 left = aiv;
1563 left_non_neg = TRUE; /* effectively it's a UV now */
1564 }
1565 else {
02b08bbc 1566 left = (aiv == IV_MIN) ? (UV)aiv : (UV)(-aiv);
5479d192
NC
1567 }
1568 }
1569
1570 if (left >= right
1571#ifdef SLOPPYDIVIDE
1572 /* For sloppy divide we always attempt integer division. */
1573#else
1574 /* Otherwise we only attempt it if either or both operands
1575 would not be preserved by an NV. If both fit in NVs
0c2ee62a
NC
1576 we fall through to the NV divide code below. However,
1577 as left >= right to ensure integer result here, we know that
1578 we can skip the test on the right operand - right big
1579 enough not to be preserved can't get here unless left is
1580 also too big. */
1581
1582 && (left > ((UV)1 << NV_PRESERVES_UV_BITS))
5479d192
NC
1583#endif
1584 ) {
1585 /* Integer division can't overflow, but it can be imprecise. */
1b6737cc 1586 const UV result = left / right;
5479d192
NC
1587 if (result * right == left) {
1588 SP--; /* result is valid */
1589 if (left_non_neg == right_non_neg) {
1590 /* signs identical, result is positive. */
1591 SETu( result );
1592 RETURN;
1593 }
1594 /* 2s complement assumption */
1595 if (result <= (UV)IV_MIN)
02b08bbc 1596 SETi(result == (UV)IV_MIN ? IV_MIN : -(IV)result);
5479d192
NC
1597 else {
1598 /* It's exact but too negative for IV. */
1599 SETn( -(NV)result );
1600 }
1601 RETURN;
1602 } /* tried integer divide but it was not an integer result */
32fdb065 1603 } /* else (PERL_ABS(result) < 1.0) or (both UVs in range for NV) */
01f91bf2 1604 } /* one operand wasn't SvIOK */
5479d192
NC
1605#endif /* PERL_TRY_UV_DIVIDE */
1606 {
6f1401dc
DM
1607 NV right = SvNV_nomg(svr);
1608 NV left = SvNV_nomg(svl);
4efa5a16 1609 (void)POPs;(void)POPs;
ebc6a117
PD
1610#if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
1611 if (! Perl_isnan(right) && right == 0.0)
1612#else
659c4b96 1613 if (right == 0.0)
ebc6a117 1614#endif
5479d192
NC
1615 DIE(aTHX_ "Illegal division by zero");
1616 PUSHn( left / right );
1617 RETURN;
79072805 1618 }
a0d0e21e
LW
1619}
1620
1621PP(pp_modulo)
1622{
20b7effb 1623 dSP; dATARGET;
6f1401dc 1624 tryAMAGICbin_MG(modulo_amg, AMGf_assign|AMGf_numeric);
a0d0e21e 1625 {
9c5ffd7c
JH
1626 UV left = 0;
1627 UV right = 0;
dc656993
JH
1628 bool left_neg = FALSE;
1629 bool right_neg = FALSE;
e2c88acc
NC
1630 bool use_double = FALSE;
1631 bool dright_valid = FALSE;
9c5ffd7c
JH
1632 NV dright = 0.0;
1633 NV dleft = 0.0;
6f1401dc
DM
1634 SV * const svr = TOPs;
1635 SV * const svl = TOPm1s;
01f91bf2 1636 if (SvIV_please_nomg(svr)) {
800401ee 1637 right_neg = !SvUOK(svr);
e2c88acc 1638 if (!right_neg) {
800401ee 1639 right = SvUVX(svr);
e2c88acc 1640 } else {
800401ee 1641 const IV biv = SvIVX(svr);
e2c88acc
NC
1642 if (biv >= 0) {
1643 right = biv;
1644 right_neg = FALSE; /* effectively it's a UV now */
1645 } else {
02b08bbc 1646 right = (biv == IV_MIN) ? (UV)biv : (UV)(-biv);
e2c88acc
NC
1647 }
1648 }
1649 }
1650 else {
6f1401dc 1651 dright = SvNV_nomg(svr);
787eafbd
IZ
1652 right_neg = dright < 0;
1653 if (right_neg)
1654 dright = -dright;
e2c88acc
NC
1655 if (dright < UV_MAX_P1) {
1656 right = U_V(dright);
1657 dright_valid = TRUE; /* In case we need to use double below. */
1658 } else {
1659 use_double = TRUE;
1660 }
787eafbd 1661 }
a0d0e21e 1662
e2c88acc
NC
1663 /* At this point use_double is only true if right is out of range for
1664 a UV. In range NV has been rounded down to nearest UV and
1665 use_double false. */
01f91bf2 1666 if (!use_double && SvIV_please_nomg(svl)) {
800401ee 1667 left_neg = !SvUOK(svl);
e2c88acc 1668 if (!left_neg) {
800401ee 1669 left = SvUVX(svl);
e2c88acc 1670 } else {
800401ee 1671 const IV aiv = SvIVX(svl);
e2c88acc
NC
1672 if (aiv >= 0) {
1673 left = aiv;
1674 left_neg = FALSE; /* effectively it's a UV now */
1675 } else {
02b08bbc 1676 left = (aiv == IV_MIN) ? (UV)aiv : (UV)(-aiv);
e2c88acc
NC
1677 }
1678 }
e2c88acc 1679 }
787eafbd 1680 else {
6f1401dc 1681 dleft = SvNV_nomg(svl);
787eafbd
IZ
1682 left_neg = dleft < 0;
1683 if (left_neg)
1684 dleft = -dleft;
68dc0745 1685
e2c88acc
NC
1686 /* This should be exactly the 5.6 behaviour - if left and right are
1687 both in range for UV then use U_V() rather than floor. */
1688 if (!use_double) {
1689 if (dleft < UV_MAX_P1) {
1690 /* right was in range, so is dleft, so use UVs not double.
1691 */
1692 left = U_V(dleft);
1693 }
1694 /* left is out of range for UV, right was in range, so promote
1695 right (back) to double. */
1696 else {
1697 /* The +0.5 is used in 5.6 even though it is not strictly
1698 consistent with the implicit +0 floor in the U_V()
1699 inside the #if 1. */
1700 dleft = Perl_floor(dleft + 0.5);
1701 use_double = TRUE;
1702 if (dright_valid)
1703 dright = Perl_floor(dright + 0.5);
1704 else
1705 dright = right;
1706 }
1707 }
1708 }
6f1401dc 1709 sp -= 2;
787eafbd 1710 if (use_double) {
65202027 1711 NV dans;
787eafbd 1712
659c4b96 1713 if (!dright)
cea2e8a9 1714 DIE(aTHX_ "Illegal modulus zero");
787eafbd 1715
65202027 1716 dans = Perl_fmod(dleft, dright);
659c4b96 1717 if ((left_neg != right_neg) && dans)
787eafbd
IZ
1718 dans = dright - dans;
1719 if (right_neg)
1720 dans = -dans;
1721 sv_setnv(TARG, dans);
1722 }
1723 else {
1724 UV ans;
1725
787eafbd 1726 if (!right)
cea2e8a9 1727 DIE(aTHX_ "Illegal modulus zero");
787eafbd
IZ
1728
1729 ans = left % right;
1730 if ((left_neg != right_neg) && ans)
1731 ans = right - ans;
1732 if (right_neg) {
1733 /* XXX may warn: unary minus operator applied to unsigned type */
1734 /* could change -foo to be (~foo)+1 instead */
1735 if (ans <= ~((UV)IV_MAX)+1)
1736 sv_setiv(TARG, ~ans+1);
1737 else
65202027 1738 sv_setnv(TARG, -(NV)ans);
787eafbd
IZ
1739 }
1740 else
1741 sv_setuv(TARG, ans);
1742 }
1743 PUSHTARG;
1744 RETURN;
79072805 1745 }
a0d0e21e 1746}
79072805 1747
a0d0e21e
LW
1748PP(pp_repeat)
1749{
20b7effb 1750 dSP; dATARGET;
eb578fdb 1751 IV count;
6f1401dc 1752 SV *sv;
02a7a248 1753 bool infnan = FALSE;
6f1401dc 1754
82334630 1755 if (GIMME_V == G_ARRAY && PL_op->op_private & OPpREPEAT_DOLIST) {
6f1401dc
DM
1756 /* TODO: think of some way of doing list-repeat overloading ??? */
1757 sv = POPs;
1758 SvGETMAGIC(sv);
1759 }
1760 else {
3a100dab
FC
1761 if (UNLIKELY(PL_op->op_private & OPpREPEAT_DOLIST)) {
1762 /* The parser saw this as a list repeat, and there
1763 are probably several items on the stack. But we're
1764 in scalar/void context, and there's no pp_list to save us
1765 now. So drop the rest of the items -- robin@kitsite.com
1766 */
1767 dMARK;
1768 if (MARK + 1 < SP) {
1769 MARK[1] = TOPm1s;
1770 MARK[2] = TOPs;
1771 }
1772 else {
1773 dTOPss;
1774 ASSUME(MARK + 1 == SP);
1775 XPUSHs(sv);
1776 MARK[1] = &PL_sv_undef;
1777 }
1778 SP = MARK + 2;
1779 }
6f1401dc
DM
1780 tryAMAGICbin_MG(repeat_amg, AMGf_assign);
1781 sv = POPs;
1782 }
1783
2b573ace
JH
1784 if (SvIOKp(sv)) {
1785 if (SvUOK(sv)) {
6f1401dc 1786 const UV uv = SvUV_nomg(sv);
2b573ace
JH
1787 if (uv > IV_MAX)
1788 count = IV_MAX; /* The best we can do? */
1789 else
1790 count = uv;
1791 } else {
b3211734 1792 count = SvIV_nomg(sv);
2b573ace
JH
1793 }
1794 }
1795 else if (SvNOKp(sv)) {
02a7a248
JH
1796 const NV nv = SvNV_nomg(sv);
1797 infnan = Perl_isinfnan(nv);
1798 if (UNLIKELY(infnan)) {
1799 count = 0;
1800 } else {
1801 if (nv < 0.0)
1802 count = -1; /* An arbitrary negative integer */
1803 else
1804 count = (IV)nv;
1805 }
2b573ace
JH
1806 }
1807 else
02a7a248 1808 count = SvIV_nomg(sv);
6f1401dc 1809
02a7a248
JH
1810 if (infnan) {
1811 Perl_ck_warner(aTHX_ packWARN(WARN_NUMERIC),
1812 "Non-finite repeat count does nothing");
1813 } else if (count < 0) {
b3211734
KW
1814 count = 0;
1815 Perl_ck_warner(aTHX_ packWARN(WARN_NUMERIC),
02a7a248 1816 "Negative repeat count does nothing");
b3211734
KW
1817 }
1818
82334630 1819 if (GIMME_V == G_ARRAY && PL_op->op_private & OPpREPEAT_DOLIST) {
a0d0e21e 1820 dMARK;
052a7c76 1821 const SSize_t items = SP - MARK;
da9e430b 1822 const U8 mod = PL_op->op_flags & OPf_MOD;
79072805 1823
a0d0e21e 1824 if (count > 1) {
052a7c76 1825 SSize_t max;
b3b27d01 1826
052a7c76
DM
1827 if ( items > SSize_t_MAX / count /* max would overflow */
1828 /* repeatcpy would overflow */
1829 || items > I32_MAX / (I32)sizeof(SV *)
b3b27d01
DM
1830 )
1831 Perl_croak(aTHX_ "%s","Out of memory during list extend");
1832 max = items * count;
1833 MEXTEND(MARK, max);
1834
a0d0e21e 1835 while (SP > MARK) {
60779a30
DM
1836 if (*SP) {
1837 if (mod && SvPADTMP(*SP)) {
da9e430b 1838 *SP = sv_mortalcopy(*SP);
60779a30 1839 }
976c8a39 1840 SvTEMP_off((*SP));
da9e430b 1841 }
a0d0e21e 1842 SP--;
79072805 1843 }
a0d0e21e
LW
1844 MARK++;
1845 repeatcpy((char*)(MARK + items), (char*)MARK,
ad64d0ec 1846 items * sizeof(const SV *), count - 1);
a0d0e21e 1847 SP += max;
79072805 1848 }
a0d0e21e 1849 else if (count <= 0)
052a7c76 1850 SP = MARK;
79072805 1851 }
a0d0e21e 1852 else { /* Note: mark already snarfed by pp_list */
0bd48802 1853 SV * const tmpstr = POPs;
a0d0e21e 1854 STRLEN len;
9b877dbb 1855 bool isutf;
a0d0e21e 1856
6f1401dc
DM
1857 if (TARG != tmpstr)
1858 sv_setsv_nomg(TARG, tmpstr);
1859 SvPV_force_nomg(TARG, len);
9b877dbb 1860 isutf = DO_UTF8(TARG);
8ebc5c01 1861 if (count != 1) {
1862 if (count < 1)
1863 SvCUR_set(TARG, 0);
1864 else {
b3b27d01
DM
1865 STRLEN max;
1866
1867 if ( len > (MEM_SIZE_MAX-1) / (UV)count /* max would overflow */
1868 || len > (U32)I32_MAX /* repeatcpy would overflow */
1869 )
1870 Perl_croak(aTHX_ "%s",
1871 "Out of memory during string extend");
1872 max = (UV)count * len + 1;
1873 SvGROW(TARG, max);
1874
a0d0e21e 1875 repeatcpy(SvPVX(TARG) + len, SvPVX(TARG), len, count - 1);
b162af07 1876 SvCUR_set(TARG, SvCUR(TARG) * count);
7a4c00b4 1877 }
a0d0e21e 1878 *SvEND(TARG) = '\0';
a0d0e21e 1879 }
dfcb284a
GS
1880 if (isutf)
1881 (void)SvPOK_only_UTF8(TARG);
1882 else
1883 (void)SvPOK_only(TARG);
b80b6069 1884
a0d0e21e 1885 PUSHTARG;
79072805 1886 }
a0d0e21e
LW
1887 RETURN;
1888}
79072805 1889
a0d0e21e
LW
1890PP(pp_subtract)
1891{
20b7effb 1892 dSP; dATARGET; bool useleft; SV *svl, *svr;
6f1401dc
DM
1893 tryAMAGICbin_MG(subtr_amg, AMGf_assign|AMGf_numeric);
1894 svr = TOPs;
1895 svl = TOPm1s;
230ee21f 1896
28e5dec8 1897#ifdef PERL_PRESERVE_IVUV
230ee21f
DM
1898
1899 /* special-case some simple common cases */
1900 if (!((svl->sv_flags|svr->sv_flags) & (SVf_IVisUV|SVs_GMG))) {
1901 IV il, ir;
1902 U32 flags = (svl->sv_flags & svr->sv_flags);
1903 if (flags & SVf_IOK) {
1904 /* both args are simple IVs */
1905 UV topl, topr;
1906 il = SvIVX(svl);
1907 ir = SvIVX(svr);
1908 do_iv:
1909 topl = ((UV)il) >> (UVSIZE * 8 - 2);
1910 topr = ((UV)ir) >> (UVSIZE * 8 - 2);
1911
1912 /* if both are in a range that can't under/overflow, do a
1913 * simple integer subtract: if the top of both numbers
1914 * are 00 or 11, then it's safe */
1915 if (!( ((topl+1) | (topr+1)) & 2)) {
1916 SP--;
1917 TARGi(il - ir, 0); /* args not GMG, so can't be tainted */
1918 SETs(TARG);
1919 RETURN;
1920 }
1921 goto generic;
1922 }
1923 else if (flags & SVf_NOK) {
1924 /* both args are NVs */
1925 NV nl = SvNVX(svl);
1926 NV nr = SvNVX(svr);
1927
3336af0b
DD
1928 if (
1929#if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
1930 !Perl_isnan(nl) && nl == (NV)(il = (IV)nl)
1931 && !Perl_isnan(nr) && nr == (NV)(ir = (IV)nr)
1932#else
1933 nl == (NV)(il = (IV)nl) && nr == (NV)(ir = (IV)nr)
1934#endif
1935 )
230ee21f
DM
1936 /* nothing was lost by converting to IVs */
1937 goto do_iv;
1938 SP--;
1939 TARGn(nl - nr, 0); /* args not GMG, so can't be tainted */
1940 SETs(TARG);
1941 RETURN;
1942 }
1943 }
1944
1945 generic:
1946
1947 useleft = USE_LEFT(svl);
7dca457a
NC
1948 /* See comments in pp_add (in pp_hot.c) about Overflow, and how
1949 "bad things" happen if you rely on signed integers wrapping. */
01f91bf2 1950 if (SvIV_please_nomg(svr)) {
28e5dec8
JH
1951 /* Unless the left argument is integer in range we are going to have to
1952 use NV maths. Hence only attempt to coerce the right argument if
1953 we know the left is integer. */
eb578fdb 1954 UV auv = 0;
9c5ffd7c 1955 bool auvok = FALSE;
7dca457a
NC
1956 bool a_valid = 0;
1957
28e5dec8 1958 if (!useleft) {
7dca457a
NC
1959 auv = 0;
1960 a_valid = auvok = 1;
1961 /* left operand is undef, treat as zero. */
28e5dec8
JH
1962 } else {
1963 /* Left operand is defined, so is it IV? */
01f91bf2 1964 if (SvIV_please_nomg(svl)) {
800401ee
JH
1965 if ((auvok = SvUOK(svl)))
1966 auv = SvUVX(svl);
7dca457a 1967 else {
eb578fdb 1968 const IV aiv = SvIVX(svl);
7dca457a
NC
1969 if (aiv >= 0) {
1970 auv = aiv;
1971 auvok = 1; /* Now acting as a sign flag. */
1972 } else { /* 2s complement assumption for IV_MIN */
53e2bfb7 1973 auv = (aiv == IV_MIN) ? (UV)aiv : (UV)-aiv;
28e5dec8 1974 }
7dca457a
NC
1975 }
1976 a_valid = 1;
1977 }
1978 }
1979 if (a_valid) {
1980 bool result_good = 0;
1981 UV result;
eb578fdb 1982 UV buv;
800401ee 1983 bool buvok = SvUOK(svr);
9041c2e3 1984
7dca457a 1985 if (buvok)
800401ee 1986 buv = SvUVX(svr);
7dca457a 1987 else {
eb578fdb 1988 const IV biv = SvIVX(svr);
7dca457a
NC
1989 if (biv >= 0) {
1990 buv = biv;
1991 buvok = 1;
1992 } else
53e2bfb7 1993 buv = (biv == IV_MIN) ? (UV)biv : (UV)-biv;
7dca457a
NC
1994 }
1995 /* ?uvok if value is >= 0. basically, flagged as UV if it's +ve,
602f51c4 1996 else "IV" now, independent of how it came in.
7dca457a
NC
1997 if a, b represents positive, A, B negative, a maps to -A etc
1998 a - b => (a - b)
1999 A - b => -(a + b)
2000 a - B => (a + b)
2001 A - B => -(a - b)
2002 all UV maths. negate result if A negative.
2003 subtract if signs same, add if signs differ. */
2004
2005 if (auvok ^ buvok) {
2006 /* Signs differ. */
2007 result = auv + buv;
2008 if (result >= auv)
2009 result_good = 1;
2010 } else {
2011 /* Signs same */
2012 if (auv >= buv) {
2013 result = auv - buv;
2014 /* Must get smaller */
2015 if (result <= auv)
2016 result_good = 1;
2017 } else {
2018 result = buv - auv;
2019 if (result <= buv) {
2020 /* result really should be -(auv-buv). as its negation
2021 of true value, need to swap our result flag */
2022 auvok = !auvok;
2023 result_good = 1;
28e5dec8 2024 }
28e5dec8
JH
2025 }
2026 }
7dca457a
NC
2027 if (result_good) {
2028 SP--;
2029 if (auvok)
2030 SETu( result );
2031 else {
2032 /* Negate result */
2033 if (result <= (UV)IV_MIN)
53e2bfb7
DM
2034 SETi(result == (UV)IV_MIN
2035 ? IV_MIN : -(IV)result);
7dca457a
NC
2036 else {
2037 /* result valid, but out of range for IV. */
2038 SETn( -(NV)result );
2039 }
2040 }
2041 RETURN;
2042 } /* Overflow, drop through to NVs. */
28e5dec8
JH
2043 }
2044 }
230ee21f
DM
2045#else
2046 useleft = USE_LEFT(svl);
28e5dec8 2047#endif
a0d0e21e 2048 {
6f1401dc 2049 NV value = SvNV_nomg(svr);
4efa5a16
RD
2050 (void)POPs;
2051
28e5dec8
JH
2052 if (!useleft) {
2053 /* left operand is undef, treat as zero - value */
2054 SETn(-value);
2055 RETURN;
2056 }
6f1401dc 2057 SETn( SvNV_nomg(svl) - value );
28e5dec8 2058 RETURN;
79072805 2059 }
a0d0e21e 2060}
79072805 2061
b3498293
JH
2062#define IV_BITS (IVSIZE * 8)
2063
2064static UV S_uv_shift(UV uv, int shift, bool left)
2065{
2066 if (shift < 0) {
2067 shift = -shift;
2068 left = !left;
2069 }
2070 if (shift >= IV_BITS) {
2071 return 0;
2072 }
2073 return left ? uv << shift : uv >> shift;
2074}
2075
2076static IV S_iv_shift(IV iv, int shift, bool left)
2077{
2078 if (shift < 0) {
2079 shift = -shift;
2080 left = !left;
2081 }
2082 if (shift >= IV_BITS) {
b69687e7 2083 return iv < 0 && !left ? -1 : 0;
b3498293
JH
2084 }
2085 return left ? iv << shift : iv >> shift;
2086}
2087
2088#define UV_LEFT_SHIFT(uv, shift) S_uv_shift(uv, shift, TRUE)
2089#define UV_RIGHT_SHIFT(uv, shift) S_uv_shift(uv, shift, FALSE)
2090#define IV_LEFT_SHIFT(iv, shift) S_iv_shift(iv, shift, TRUE)
2091#define IV_RIGHT_SHIFT(iv, shift) S_iv_shift(iv, shift, FALSE)
2092
a0d0e21e
LW
2093PP(pp_left_shift)
2094{
20b7effb 2095 dSP; dATARGET; SV *svl, *svr;
a42d0242 2096 tryAMAGICbin_MG(lshift_amg, AMGf_assign|AMGf_numeric);
6f1401dc
DM
2097 svr = POPs;
2098 svl = TOPs;
a0d0e21e 2099 {
6f1401dc 2100 const IV shift = SvIV_nomg(svr);
d0ba1bd2 2101 if (PL_op->op_private & HINT_INTEGER) {
b3498293 2102 SETi(IV_LEFT_SHIFT(SvIV_nomg(svl), shift));
d0ba1bd2
JH
2103 }
2104 else {
b3498293 2105 SETu(UV_LEFT_SHIFT(SvUV_nomg(svl), shift));
d0ba1bd2 2106 }
55497cff 2107 RETURN;
79072805 2108 }
a0d0e21e 2109}
79072805 2110
a0d0e21e
LW
2111PP(pp_right_shift)
2112{
20b7effb 2113 dSP; dATARGET; SV *svl, *svr;
a42d0242 2114 tryAMAGICbin_MG(rshift_amg, AMGf_assign|AMGf_numeric);
6f1401dc
DM
2115 svr = POPs;
2116 svl = TOPs;
a0d0e21e 2117 {
6f1401dc 2118 const IV shift = SvIV_nomg(svr);
d0ba1bd2 2119 if (PL_op->op_private & HINT_INTEGER) {
b3498293 2120 SETi(IV_RIGHT_SHIFT(SvIV_nomg(svl), shift));
d0ba1bd2
JH
2121 }
2122 else {
b3498293 2123 SETu(UV_RIGHT_SHIFT(SvUV_nomg(svl), shift));
d0ba1bd2 2124 }
a0d0e21e 2125 RETURN;
93a17b20 2126 }
79072805
LW
2127}
2128
a0d0e21e 2129PP(pp_lt)
79072805 2130{
20b7effb 2131 dSP;
33efebe6
DM
2132 SV *left, *right;
2133
a42d0242 2134 tryAMAGICbin_MG(lt_amg, AMGf_set|AMGf_numeric);
33efebe6
DM
2135 right = POPs;
2136 left = TOPs;
2137 SETs(boolSV(
2138 (SvIOK_notUV(left) && SvIOK_notUV(right))
2139 ? (SvIVX(left) < SvIVX(right))
2140 : (do_ncmp(left, right) == -1)
2141 ));
2142 RETURN;
a0d0e21e 2143}
79072805 2144
a0d0e21e
LW
2145PP(pp_gt)
2146{
20b7effb 2147 dSP;
33efebe6 2148 SV *left, *right;
1b6737cc 2149
33efebe6
DM
2150 tryAMAGICbin_MG(gt_amg, AMGf_set|AMGf_numeric);
2151 right = POPs;
2152 left = TOPs;
2153 SETs(boolSV(
2154 (SvIOK_notUV(left) && SvIOK_notUV(right))
2155 ? (SvIVX(left) > SvIVX(right))
2156 : (do_ncmp(left, right) == 1)
2157 ));
2158 RETURN;
a0d0e21e
LW
2159}
2160
2161PP(pp_le)
2162{
20b7effb 2163 dSP;
33efebe6 2164 SV *left, *right;
1b6737cc 2165
33efebe6
DM
2166 tryAMAGICbin_MG(le_amg, AMGf_set|AMGf_numeric);
2167 right = POPs;
2168 left = TOPs;
2169 SETs(boolSV(
2170 (SvIOK_notUV(left) && SvIOK_notUV(right))
2171 ? (SvIVX(left) <= SvIVX(right))
2172 : (do_ncmp(left, right) <= 0)
2173 ));
2174 RETURN;
a0d0e21e
LW
2175}
2176
2177PP(pp_ge)
2178{
20b7effb 2179 dSP;
33efebe6
DM
2180 SV *left, *right;
2181
2182 tryAMAGICbin_MG(ge_amg, AMGf_set|AMGf_numeric);
2183 right = POPs;
2184 left = TOPs;
2185 SETs(boolSV(
2186 (SvIOK_notUV(left) && SvIOK_notUV(right))
2187 ? (SvIVX(left) >= SvIVX(right))
2188 : ( (do_ncmp(left, right) & 2) == 0)
2189 ));
2190 RETURN;
2191}
1b6737cc 2192
33efebe6
DM
2193PP(pp_ne)
2194{
20b7effb 2195 dSP;
33efebe6
DM
2196 SV *left, *right;
2197
2198 tryAMAGICbin_MG(ne_amg, AMGf_set|AMGf_numeric);
2199 right = POPs;
2200 left = TOPs;
2201 SETs(boolSV(
2202 (SvIOK_notUV(left) && SvIOK_notUV(right))
2203 ? (SvIVX(left) != SvIVX(right))
2204 : (do_ncmp(left, right) != 0)
2205 ));
2206 RETURN;
2207}
1b6737cc 2208
33efebe6
DM
2209/* compare left and right SVs. Returns:
2210 * -1: <
2211 * 0: ==
2212 * 1: >
2213 * 2: left or right was a NaN
2214 */
2215I32
2216Perl_do_ncmp(pTHX_ SV* const left, SV * const right)
2217{
33efebe6
DM
2218 PERL_ARGS_ASSERT_DO_NCMP;
2219#ifdef PERL_PRESERVE_IVUV
33efebe6 2220 /* Fortunately it seems NaN isn't IOK */
01f91bf2 2221 if (SvIV_please_nomg(right) && SvIV_please_nomg(left)) {
33efebe6
DM
2222 if (!SvUOK(left)) {
2223 const IV leftiv = SvIVX(left);
2224 if (!SvUOK(right)) {
2225 /* ## IV <=> IV ## */
2226 const IV rightiv = SvIVX(right);
2227 return (leftiv > rightiv) - (leftiv < rightiv);
28e5dec8 2228 }
33efebe6
DM
2229 /* ## IV <=> UV ## */
2230 if (leftiv < 0)
2231 /* As (b) is a UV, it's >=0, so it must be < */
2232 return -1;
2233 {
2234 const UV rightuv = SvUVX(right);
2235 return ((UV)leftiv > rightuv) - ((UV)leftiv < rightuv);
28e5dec8 2236 }
28e5dec8 2237 }
79072805 2238
33efebe6
DM
2239 if (SvUOK(right)) {
2240 /* ## UV <=> UV ## */
2241 const UV leftuv = SvUVX(left);
2242 const UV rightuv = SvUVX(right);
2243 return (leftuv > rightuv) - (leftuv < rightuv);
28e5dec8 2244 }
33efebe6
DM
2245 /* ## UV <=> IV ## */
2246 {
2247 const IV rightiv = SvIVX(right);
2248 if (rightiv < 0)
2249 /* As (a) is a UV, it's >=0, so it cannot be < */
2250 return 1;
2251 {
2252 const UV leftuv = SvUVX(left);
2253 return (leftuv > (UV)rightiv) - (leftuv < (UV)rightiv);
28e5dec8 2254 }
28e5dec8 2255 }
e5964223 2256 NOT_REACHED; /* NOTREACHED */
28e5dec8
JH
2257 }
2258#endif
a0d0e21e 2259 {
33efebe6
DM
2260 NV const rnv = SvNV_nomg(right);
2261 NV const lnv = SvNV_nomg(left);
2262
cab190d4 2263#if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
33efebe6
DM
2264 if (Perl_isnan(lnv) || Perl_isnan(rnv)) {
2265 return 2;
2266 }
2267 return (lnv > rnv) - (lnv < rnv);
cab190d4 2268#else
33efebe6
DM
2269 if (lnv < rnv)
2270 return -1;
2271 if (lnv > rnv)
2272 return 1;
659c4b96 2273 if (lnv == rnv)
33efebe6
DM
2274 return 0;
2275 return 2;
cab190d4 2276#endif
a0d0e21e 2277 }
79072805
LW
2278}
2279
33efebe6 2280
a0d0e21e 2281PP(pp_ncmp)
79072805 2282{
20b7effb 2283 dSP;
33efebe6
DM
2284 SV *left, *right;
2285 I32 value;
a42d0242 2286 tryAMAGICbin_MG(ncmp_amg, AMGf_numeric);
33efebe6
DM
2287 right = POPs;
2288 left = TOPs;
2289 value = do_ncmp(left, right);
2290 if (value == 2) {
3280af22 2291 SETs(&PL_sv_undef);
79072805 2292 }
33efebe6
DM
2293 else {
2294 dTARGET;
2295 SETi(value);
2296 }
2297 RETURN;
a0d0e21e 2298}
79072805 2299
b1c05ba5
DM
2300
2301/* also used for: pp_sge() pp_sgt() pp_slt() */
2302
afd9910b 2303PP(pp_sle)
a0d0e21e 2304{
20b7effb 2305 dSP;
79072805 2306
afd9910b
NC
2307 int amg_type = sle_amg;
2308 int multiplier = 1;
2309 int rhs = 1;
79072805 2310
afd9910b
NC
2311 switch (PL_op->op_type) {
2312 case OP_SLT:
2313 amg_type = slt_amg;
2314 /* cmp < 0 */
2315 rhs = 0;
2316 break;
2317 case OP_SGT:
2318 amg_type = sgt_amg;
2319 /* cmp > 0 */
2320 multiplier = -1;
2321 rhs = 0;
2322 break;
2323 case OP_SGE:
2324 amg_type = sge_amg;
2325 /* cmp >= 0 */
2326 multiplier = -1;
2327 break;
79072805 2328 }
79072805 2329
6f1401dc 2330 tryAMAGICbin_MG(amg_type, AMGf_set);
a0d0e21e
LW
2331 {
2332 dPOPTOPssrl;
130c5df3 2333 const int cmp =
5778acb6 2334#ifdef USE_LOCALE_COLLATE
130c5df3
KW
2335 (IN_LC_RUNTIME(LC_COLLATE))
2336 ? sv_cmp_locale_flags(left, right, 0)
2337 :
2338#endif
2339 sv_cmp_flags(left, right, 0);
afd9910b 2340 SETs(boolSV(cmp * multiplier < rhs));
a0d0e21e
LW
2341 RETURN;
2342 }
2343}
79072805 2344
36477c24 2345PP(pp_seq)
2346{
20b7effb 2347 dSP;
6f1401dc 2348 tryAMAGICbin_MG(seq_amg, AMGf_set);
36477c24 2349 {
2350 dPOPTOPssrl;
078504b2 2351 SETs(boolSV(sv_eq_flags(left, right, 0)));
a0d0e21e
LW
2352 RETURN;
2353 }
2354}
79072805 2355
a0d0e21e 2356PP(pp_sne)
79072805 2357{
20b7effb 2358 dSP;
6f1401dc 2359 tryAMAGICbin_MG(sne_amg, AMGf_set);
a0d0e21e
LW
2360 {
2361 dPOPTOPssrl;
078504b2 2362 SETs(boolSV(!sv_eq_flags(left, right, 0)));
a0d0e21e 2363 RETURN;
463ee0b2 2364 }
79072805
LW
2365}
2366
a0d0e21e 2367PP(pp_scmp)
79072805 2368{
20b7effb 2369 dSP; dTARGET;
6f1401dc 2370 tryAMAGICbin_MG(scmp_amg, 0);
a0d0e21e
LW
2371 {
2372 dPOPTOPssrl;
130c5df3 2373 const int cmp =
5778acb6 2374#ifdef USE_LOCALE_COLLATE
130c5df3
KW
2375 (IN_LC_RUNTIME(LC_COLLATE))
2376 ? sv_cmp_locale_flags(left, right, 0)
2377 :
2378#endif
2379 sv_cmp_flags(left, right, 0);
bbce6d69 2380 SETi( cmp );
a0d0e21e
LW
2381 RETURN;
2382 }
2383}
79072805 2384
55497cff 2385PP(pp_bit_and)
2386{
20b7effb 2387 dSP; dATARGET;
6f1401dc 2388 tryAMAGICbin_MG(band_amg, AMGf_assign);
a0d0e21e
LW
2389 {
2390 dPOPTOPssrl;
4633a7c4 2391 if (SvNIOKp(left) || SvNIOKp(right)) {
b20c4ee1
FC
2392 const bool left_ro_nonnum = !SvNIOKp(left) && SvREADONLY(left);
2393 const bool right_ro_nonnum = !SvNIOKp(right) && SvREADONLY(right);
d0ba1bd2 2394 if (PL_op->op_private & HINT_INTEGER) {
1b6737cc 2395 const IV i = SvIV_nomg(left) & SvIV_nomg(right);
972b05a9 2396 SETi(i);
d0ba1bd2
JH
2397 }
2398 else {
1b6737cc 2399 const UV u = SvUV_nomg(left) & SvUV_nomg(right);
972b05a9 2400 SETu(u);
d0ba1bd2 2401 }
5ee80e13 2402 if (left_ro_nonnum && left != TARG) SvNIOK_off(left);
b20c4ee1 2403 if (right_ro_nonnum) SvNIOK_off(right);
a0d0e21e
LW
2404 }
2405 else {
533c011a 2406 do_vop(PL_op->op_type, TARG, left, right);
a0d0e21e
LW
2407 SETTARG;
2408 }
2409 RETURN;
2410 }
2411}
79072805 2412
5d01050a
FC
2413PP(pp_nbit_and)
2414{
2415 dSP;
636ac8fc 2416 tryAMAGICbin_MG(band_amg, AMGf_assign|AMGf_numarg);
5d01050a
FC
2417 {
2418 dATARGET; dPOPTOPssrl;
2419 if (PL_op->op_private & HINT_INTEGER) {
2420 const IV i = SvIV_nomg(left) & SvIV_nomg(right);
2421 SETi(i);
2422 }
2423 else {
2424 const UV u = SvUV_nomg(left) & SvUV_nomg(right);
2425 SETu(u);
2426 }
2427 }
2428 RETURN;
2429}
2430
2431PP(pp_sbit_and)
2432{
2433 dSP;
2434 tryAMAGICbin_MG(sband_amg, AMGf_assign);
2435 {
2436 dATARGET; dPOPTOPssrl;
2437 do_vop(OP_BIT_AND, TARG, left, right);
2438 RETSETTARG;
2439 }
2440}
b1c05ba5
DM
2441
2442/* also used for: pp_bit_xor() */
2443
a0d0e21e
LW
2444PP(pp_bit_or)
2445{
20b7effb 2446 dSP; dATARGET;
3658c1f1
NC
2447 const int op_type = PL_op->op_type;
2448
6f1401dc 2449 tryAMAGICbin_MG((op_type == OP_BIT_OR ? bor_amg : bxor_amg), AMGf_assign);
a0d0e21e
LW
2450 {
2451 dPOPTOPssrl;
4633a7c4 2452 if (SvNIOKp(left) || SvNIOKp(right)) {
b20c4ee1
FC
2453 const bool left_ro_nonnum = !SvNIOKp(left) && SvREADONLY(left);
2454 const bool right_ro_nonnum = !SvNIOKp(right) && SvREADONLY(right);
d0ba1bd2 2455 if (PL_op->op_private & HINT_INTEGER) {
3658c1f1
NC
2456 const IV l = (USE_LEFT(left) ? SvIV_nomg(left) : 0);
2457 const IV r = SvIV_nomg(right);
2458 const IV result = op_type == OP_BIT_OR ? (l | r) : (l ^ r);
2459 SETi(result);
d0ba1bd2
JH
2460 }
2461 else {
3658c1f1
NC
2462 const UV l = (USE_LEFT(left) ? SvUV_nomg(left) : 0);
2463 const UV r = SvUV_nomg(right);
2464 const UV result = op_type == OP_BIT_OR ? (l | r) : (l ^ r);
2465 SETu(result);
d0ba1bd2 2466 }
5ee80e13 2467 if (left_ro_nonnum && left != TARG) SvNIOK_off(left);
b20c4ee1 2468 if (right_ro_nonnum) SvNIOK_off(right);
a0d0e21e
LW
2469 }
2470 else {
3658c1f1 2471 do_vop(op_type, TARG, left, right);
a0d0e21e
LW
2472 SETTARG;
2473 }
2474 RETURN;
79072805 2475 }
a0d0e21e 2476}
79072805 2477
5d01050a
FC
2478/* also used for: pp_nbit_xor() */
2479
2480PP(pp_nbit_or)
2481{
2482 dSP;
2483 const int op_type = PL_op->op_type;
2484
2485 tryAMAGICbin_MG((op_type == OP_NBIT_OR ? bor_amg : bxor_amg),
636ac8fc 2486 AMGf_assign|AMGf_numarg);
5d01050a
FC
2487 {
2488 dATARGET; dPOPTOPssrl;
2489 if (PL_op->op_private & HINT_INTEGER) {
2490 const IV l = (USE_LEFT(left) ? SvIV_nomg(left) : 0);
2491 const IV r = SvIV_nomg(right);
2492 const IV result = op_type == OP_NBIT_OR ? (l | r) : (l ^ r);
2493 SETi(result);
2494 }
2495 else {
2496 const UV l = (USE_LEFT(left) ? SvUV_nomg(left) : 0);
2497 const UV r = SvUV_nomg(right);
2498 const UV result = op_type == OP_NBIT_OR ? (l | r) : (l ^ r);
2499 SETu(result);
2500 }
2501 }
2502 RETURN;
2503}
2504
2505/* also used for: pp_sbit_xor() */
2506
2507PP(pp_sbit_or)
2508{
2509 dSP;
2510 const int op_type = PL_op->op_type;
2511
2512 tryAMAGICbin_MG((op_type == OP_SBIT_OR ? sbor_amg : sbxor_amg),
2513 AMGf_assign);
2514 {
2515 dATARGET; dPOPTOPssrl;
2516 do_vop(op_type == OP_SBIT_OR ? OP_BIT_OR : OP_BIT_XOR, TARG, left,
2517 right);
2518 RETSETTARG;
2519 }
2520}
2521
1c2b3fd6
FC
2522PERL_STATIC_INLINE bool
2523S_negate_string(pTHX)
2524{
2525 dTARGET; dSP;
2526 STRLEN len;
2527 const char *s;
2528 SV * const sv = TOPs;
2529 if (!SvPOKp(sv) || SvNIOK(sv) || (!SvPOK(sv) && SvNIOKp(sv)))
2530 return FALSE;
2531 s = SvPV_nomg_const(sv, len);
2532 if (isIDFIRST(*s)) {
2533 sv_setpvs(TARG, "-");
2534 sv_catsv(TARG, sv);
2535 }
2536 else if (*s == '+' || (*s == '-' && !looks_like_number(sv))) {
2537 sv_setsv_nomg(TARG, sv);
2538 *SvPV_force_nomg(TARG, len) = *s == '-' ? '+' : '-';
2539 }
2540 else return FALSE;
245d035e 2541 SETTARG;
1c2b3fd6
FC
2542 return TRUE;
2543}
2544
a0d0e21e
LW
2545PP(pp_negate)
2546{
20b7effb 2547 dSP; dTARGET;
6f1401dc 2548 tryAMAGICun_MG(neg_amg, AMGf_numeric);
1c2b3fd6 2549 if (S_negate_string(aTHX)) return NORMAL;
a0d0e21e 2550 {
6f1401dc 2551 SV * const sv = TOPs;
a5b92898 2552
d96ab1b5 2553 if (SvIOK(sv)) {
7dbe3150 2554 /* It's publicly an integer */
28e5dec8 2555 oops_its_an_int:
9b0e499b
GS
2556 if (SvIsUV(sv)) {
2557 if (SvIVX(sv) == IV_MIN) {
28e5dec8 2558 /* 2s complement assumption. */
d14578b8
KW
2559 SETi(SvIVX(sv)); /* special case: -((UV)IV_MAX+1) ==
2560 IV_MIN */
245d035e 2561 return NORMAL;
9b0e499b
GS
2562 }
2563 else if (SvUVX(sv) <= IV_MAX) {
beccb14c 2564 SETi(-SvIVX(sv));
245d035e 2565 return NORMAL;
9b0e499b
GS
2566 }
2567 }
2568 else if (SvIVX(sv) != IV_MIN) {
2569 SETi(-SvIVX(sv));
245d035e 2570 return NORMAL;
9b0e499b 2571 }
28e5dec8
JH
2572#ifdef PERL_PRESERVE_IVUV
2573 else {
2574 SETu((UV)IV_MIN);
245d035e 2575 return NORMAL;
28e5dec8
JH
2576 }
2577#endif
9b0e499b 2578 }
8a5decd8 2579 if (SvNIOKp(sv) && (SvNIOK(sv) || !SvPOK(sv)))
6f1401dc 2580 SETn(-SvNV_nomg(sv));
1c2b3fd6 2581 else if (SvPOKp(sv) && SvIV_please_nomg(sv))
8eb28a70 2582 goto oops_its_an_int;
4633a7c4 2583 else
6f1401dc 2584 SETn(-SvNV_nomg(sv));
79072805 2585 }
245d035e 2586 return NORMAL;
79072805
LW
2587}
2588
a0d0e21e 2589PP(pp_not)
79072805 2590{
20b7effb 2591 dSP;
6f1401dc 2592 tryAMAGICun_MG(not_amg, AMGf_set);
06c841cf 2593 *PL_stack_sp = boolSV(!SvTRUE_nomg(*PL_stack_sp));
a0d0e21e 2594 return NORMAL;
79072805
LW
2595}
2596
5d01050a
FC
2597static void
2598S_scomplement(pTHX_ SV *targ, SV *sv)
79072805 2599{
eb578fdb
KW
2600 U8 *tmps;
2601 I32 anum;
a0d0e21e
LW
2602 STRLEN len;
2603
85b0ee6e
FC
2604 sv_copypv_nomg(TARG, sv);
2605 tmps = (U8*)SvPV_nomg(TARG, len);
a0d0e21e 2606 anum = len;
1d68d6cd 2607 if (SvUTF8(TARG)) {
a1ca4561 2608 /* Calculate exact length, let's not estimate. */
1d68d6cd 2609 STRLEN targlen = 0;
ba210ebe 2610 STRLEN l;
a1ca4561
YST
2611 UV nchar = 0;
2612 UV nwide = 0;
01f6e806 2613 U8 * const send = tmps + len;
74d49cd0
TS
2614 U8 * const origtmps = tmps;
2615 const UV utf8flags = UTF8_ALLOW_ANYUV;
1d68d6cd 2616
1d68d6cd 2617 while (tmps < send) {
74d49cd0
TS
2618 const UV c = utf8n_to_uvchr(tmps, send-tmps, &l, utf8flags);
2619 tmps += l;
5f560d8a 2620 targlen += UVCHR_SKIP(~c);
a1ca4561
YST
2621 nchar++;
2622 if (c > 0xff)
2623 nwide++;
1d68d6cd
SC
2624 }
2625
2626 /* Now rewind strings and write them. */
74d49cd0 2627 tmps = origtmps;
a1ca4561
YST
2628
2629 if (nwide) {
01f6e806
AL
2630 U8 *result;
2631 U8 *p;
2632
87e05d1a
KW
2633 Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED),
2634 deprecated_above_ff_msg, PL_op_desc[PL_op->op_type]);
74d49cd0 2635 Newx(result, targlen + 1, U8);
01f6e806 2636 p = result;
a1ca4561 2637 while (tmps < send) {
74d49cd0
TS
2638 const UV c = utf8n_to_uvchr(tmps, send-tmps, &l, utf8flags);
2639 tmps += l;
01f6e806 2640 p = uvchr_to_utf8_flags(p, ~c, UNICODE_ALLOW_ANY);
a1ca4561 2641 }
01f6e806 2642 *p = '\0';
c1c21316
NC
2643 sv_usepvn_flags(TARG, (char*)result, targlen,
2644 SV_HAS_TRAILING_NUL);
a1ca4561
YST
2645 SvUTF8_on(TARG);
2646 }
2647 else {
01f6e806
AL
2648 U8 *result;
2649 U8 *p;
2650
74d49cd0 2651 Newx(result, nchar + 1, U8);
01f6e806 2652 p = result;
a1ca4561 2653 while (tmps < send) {
74d49cd0
TS
2654 const U8 c = (U8)utf8n_to_uvchr(tmps, send-tmps, &l, utf8flags);
2655 tmps += l;
01f6e806 2656 *p++ = ~c;
a1ca4561 2657 }
01f6e806 2658 *p = '\0';
c1c21316 2659 sv_usepvn_flags(TARG, (char*)result, nchar, SV_HAS_TRAILING_NUL);
d0a21e00 2660 SvUTF8_off(TARG);
1d68d6cd 2661 }
5d01050a 2662 return;
1d68d6cd 2663 }
a0d0e21e 2664#ifdef LIBERAL
51723571 2665 {
eb578fdb 2666 long *tmpl;
51723571
JH
2667 for ( ; anum && (unsigned long)tmps % sizeof(long); anum--, tmps++)
2668 *tmps = ~*tmps;
2669 tmpl = (long*)tmps;
bb7a0f54 2670 for ( ; anum >= (I32)sizeof(long); anum -= (I32)sizeof(long), tmpl++)
51723571
JH
2671 *tmpl = ~*tmpl;
2672 tmps = (U8*)tmpl;
2673 }
a0d0e21e
LW
2674#endif
2675 for ( ; anum > 0; anum--, tmps++)
2676 *tmps = ~*tmps;
5d01050a
FC
2677}
2678
2679PP(pp_complement)
2680{
2681 dSP; dTARGET;
2682 tryAMAGICun_MG(compl_amg, AMGf_numeric);
2683 {
2684 dTOPss;
2685 if (SvNIOKp(sv)) {
2686 if (PL_op->op_private & HINT_INTEGER) {
2687 const IV i = ~SvIV_nomg(sv);
2688 SETi(i);
2689 }
2690 else {
2691 const UV u = ~SvUV_nomg(sv);
2692 SETu(u);
2693 }
2694 }
2695 else {
2696 S_scomplement(aTHX_ TARG, sv);
ec93b65f 2697 SETTARG;
a0d0e21e 2698 }
24840750 2699 return NORMAL;
5d01050a
FC
2700 }
2701}
2702
2703PP(pp_ncomplement)
2704{
2705 dSP;
636ac8fc 2706 tryAMAGICun_MG(compl_amg, AMGf_numeric|AMGf_numarg);
5d01050a
FC
2707 {
2708 dTARGET; dTOPss;
2709 if (PL_op->op_private & HINT_INTEGER) {
2710 const IV i = ~SvIV_nomg(sv);
2711 SETi(i);
2712 }
2713 else {
2714 const UV u = ~SvUV_nomg(sv);
2715 SETu(u);
2716 }
2717 }
2718 return NORMAL;
2719}
2720
2721PP(pp_scomplement)
2722{
2723 dSP;
2724 tryAMAGICun_MG(scompl_amg, AMGf_numeric);
2725 {
2726 dTARGET; dTOPss;
2727 S_scomplement(aTHX_ TARG, sv);
2728 SETTARG;
2729 return NORMAL;
a0d0e21e 2730 }
79072805
LW
2731}
2732
a0d0e21e
LW
2733/* integer versions of some of the above */
2734
a0d0e21e 2735PP(pp_i_multiply)
79072805 2736{
20b7effb 2737 dSP; dATARGET;
6f1401dc 2738 tryAMAGICbin_MG(mult_amg, AMGf_assign);
a0d0e21e 2739 {
6f1401dc 2740 dPOPTOPiirl_nomg;
a0d0e21e
LW
2741 SETi( left * right );
2742 RETURN;
2743 }
79072805
LW
2744}
2745
a0d0e21e 2746PP(pp_i_divide)
79072805 2747{
85935d8e 2748 IV num;
20b7effb 2749 dSP; dATARGET;
6f1401dc 2750 tryAMAGICbin_MG(div_amg, AMGf_assign);
a0d0e21e 2751 {
6f1401dc 2752 dPOPTOPssrl;
85935d8e 2753 IV value = SvIV_nomg(right);
a0d0e21e 2754 if (value == 0)
ece1bcef 2755 DIE(aTHX_ "Illegal division by zero");
85935d8e 2756 num = SvIV_nomg(left);
a0cec769
YST
2757
2758 /* avoid FPE_INTOVF on some platforms when num is IV_MIN */
2759 if (value == -1)
2760 value = - num;
2761 else
2762 value = num / value;
6f1401dc 2763 SETi(value);
a0d0e21e
LW
2764 RETURN;
2765 }
79072805
LW
2766}
2767
befad5d1 2768PP(pp_i_modulo)
224ec323
JH
2769{
2770 /* This is the vanilla old i_modulo. */
20b7effb 2771 dSP; dATARGET;
6f1401dc 2772 tryAMAGICbin_MG(modulo_amg, AMGf_assign);
224ec323 2773 {
6f1401dc 2774 dPOPTOPiirl_nomg;
224ec323
JH
2775 if (!right)
2776 DIE(aTHX_ "Illegal modulus zero");
a0cec769
YST
2777 /* avoid FPE_INTOVF on some platforms when left is IV_MIN */
2778 if (right == -1)
2779 SETi( 0 );
2780 else
2781 SETi( left % right );
224ec323
JH
2782 RETURN;
2783 }
2784}
2785
0927ade0 2786#if defined(__GLIBC__) && IVSIZE == 8 \
bf3d06aa 2787 && ( __GLIBC__ < 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ < 8))
befad5d1 2788
0927ade0 2789PP(pp_i_modulo_glibc_bugfix)
224ec323 2790{
224ec323 2791 /* This is the i_modulo with the workaround for the _moddi3 bug
fce2b89e 2792 * in (at least) glibc 2.2.5 (the PERL_ABS() the workaround).
224ec323 2793 * See below for pp_i_modulo. */
20b7effb 2794 dSP; dATARGET;
6f1401dc 2795 tryAMAGICbin_MG(modulo_amg, AMGf_assign);
224ec323 2796 {
6f1401dc 2797 dPOPTOPiirl_nomg;
224ec323
JH
2798 if (!right)
2799 DIE(aTHX_ "Illegal modulus zero");
a0cec769
YST
2800 /* avoid FPE_INTOVF on some platforms when left is IV_MIN */
2801 if (right == -1)
2802 SETi( 0 );
2803 else
2804 SETi( left % PERL_ABS(right) );
224ec323
JH
2805 RETURN;
2806 }
224ec323 2807}
befad5d1 2808#endif
79072805 2809
a0d0e21e 2810PP(pp_i_add)
79072805 2811{
20b7effb 2812 dSP; dATARGET;
6f1401dc 2813 tryAMAGICbin_MG(add_amg, AMGf_assign);
a0d0e21e 2814 {
6f1401dc 2815 dPOPTOPiirl_ul_nomg;
a0d0e21e
LW
2816 SETi( left + right );
2817 RETURN;
79072805 2818 }
79072805
LW
2819}
2820
a0d0e21e 2821PP(pp_i_subtract)
79072805 2822{
20b7effb 2823 dSP; dATARGET;
6f1401dc 2824 tryAMAGICbin_MG(subtr_amg, AMGf_assign);
a0d0e21e 2825 {
6f1401dc 2826 dPOPTOPiirl_ul_nomg;
a0d0e21e
LW
2827 SETi( left - right );
2828 RETURN;
79072805 2829 }
79072805
LW
2830}
2831
a0d0e21e 2832PP(pp_i_lt)
79072805 2833{
20b7effb 2834 dSP;
6f1401dc 2835 tryAMAGICbin_MG(lt_amg, AMGf_set);
a0d0e21e 2836 {
96b6b87f 2837 dPOPTOPiirl_nomg;
54310121 2838 SETs(boolSV(left < right));
a0d0e21e
LW
2839 RETURN;
2840 }
79072805
LW
2841}
2842
a0d0e21e 2843PP(pp_i_gt)
79072805 2844{
20b7effb 2845 dSP;
6f1401dc 2846 tryAMAGICbin_MG(gt_amg, AMGf_set);
a0d0e21e 2847 {
96b6b87f 2848 dPOPTOPiirl_nomg;
54310121 2849 SETs(boolSV(left > right));
a0d0e21e
LW
2850 RETURN;
2851 }
79072805
LW
2852}
2853
a0d0e21e 2854PP(pp_i_le)
79072805 2855{
20b7effb 2856 dSP;
6f1401dc 2857 tryAMAGICbin_MG(le_amg, AMGf_set);
a0d0e21e 2858 {
96b6b87f 2859 dPOPTOPiirl_nomg;
54310121 2860 SETs(boolSV(left <= right));
a0d0e21e 2861 RETURN;
85e6fe83 2862 }
79072805
LW
2863}
2864
a0d0e21e 2865PP(pp_i_ge)
79072805 2866{
20b7effb 2867 dSP;
6f1401dc 2868 tryAMAGICbin_MG(ge_amg, AMGf_set);
a0d0e21e 2869 {
96b6b87f 2870 dPOPTOPiirl_nomg;
54310121 2871 SETs(boolSV(left >= right));
a0d0e21e
LW
2872 RETURN;
2873 }
79072805
LW
2874}
2875
a0d0e21e 2876PP(pp_i_eq)
79072805 2877{
20b7effb 2878 dSP;
6f1401dc 2879 tryAMAGICbin_MG(eq_amg, AMGf_set);
a0d0e21e 2880 {
96b6b87f 2881 dPOPTOPiirl_nomg;
54310121 2882 SETs(boolSV(left == right));
a0d0e21e
LW
2883 RETURN;
2884 }
79072805
LW
2885}
2886
a0d0e21e 2887PP(pp_i_ne)
79072805 2888{
20b7effb 2889 dSP;
6f1401dc 2890 tryAMAGICbin_MG(ne_amg, AMGf_set);
a0d0e21e 2891 {
96b6b87f 2892 dPOPTOPiirl_nomg;
54310121 2893 SETs(boolSV(left != right));
a0d0e21e
LW
2894 RETURN;
2895 }
79072805
LW
2896}
2897
a0d0e21e 2898PP(pp_i_ncmp)
79072805 2899{
20b7effb 2900 dSP; dTARGET;
6f1401dc 2901 tryAMAGICbin_MG(ncmp_amg, 0);
a0d0e21e 2902 {
96b6b87f 2903 dPOPTOPiirl_nomg;
a0d0e21e 2904 I32 value;
79072805 2905
a0d0e21e 2906 if (left > right)
79072805 2907 value = 1;
a0d0e21e 2908 else if (left < right)
79072805 2909 value = -1;
a0d0e21e 2910 else
79072805 2911 value = 0;
a0d0e21e
LW
2912 SETi(value);
2913 RETURN;
79072805 2914 }
85e6fe83
LW
2915}
2916
2917PP(pp_i_negate)
2918{
20b7effb 2919 dSP; dTARGET;
6f1401dc 2920 tryAMAGICun_MG(neg_amg, 0);
1c2b3fd6 2921 if (S_negate_string(aTHX)) return NORMAL;
6f1401dc
DM
2922 {
2923 SV * const sv = TOPs;
2924 IV const i = SvIV_nomg(sv);
2925 SETi(-i);
ae642386 2926 return NORMAL;
6f1401dc 2927 }
85e6fe83
LW
2928}
2929
79072805
LW
2930/* High falutin' math. */
2931
2932PP(pp_atan2)
2933{
20b7effb 2934 dSP; dTARGET;
6f1401dc 2935 tryAMAGICbin_MG(atan2_amg, 0);
a0d0e21e 2936 {
096c060c 2937 dPOPTOPnnrl_nomg;
a1021d57 2938 SETn(Perl_atan2(left, right));
a0d0e21e
LW
2939 RETURN;
2940 }
79072805
LW
2941}
2942
b1c05ba5
DM
2943
2944/* also used for: pp_cos() pp_exp() pp_log() pp_sqrt() */
2945
79072805
LW
2946PP(pp_sin)
2947{
20b7effb 2948 dSP; dTARGET;
af71714e 2949 int amg_type = fallback_amg;
71302fe3 2950 const char *neg_report = NULL;
71302fe3
NC
2951 const int op_type = PL_op->op_type;
2952
2953 switch (op_type) {
af71714e
JH
2954 case OP_SIN: amg_type = sin_amg; break;
2955 case OP_COS: amg_type = cos_amg; break;
2956 case OP_EXP: amg_type = exp_amg; break;
2957 case OP_LOG: amg_type = log_amg; neg_report = "log"; break;
2958 case OP_SQRT: amg_type = sqrt_amg; neg_report = "sqrt"; break;
a0d0e21e 2959 }
79072805 2960
af71714e 2961 assert(amg_type != fallback_amg);
6f1401dc
DM
2962
2963 tryAMAGICun_MG(amg_type, 0);
a0d0e21e 2964 {
8c78ed36 2965 SV * const arg = TOPs;
6f1401dc 2966 const NV value = SvNV_nomg(arg);
a5dc2484 2967#ifdef NV_NAN
f256868e 2968 NV result = NV_NAN;
a5dc2484
JH
2969#else
2970 NV result = 0.0;
2971#endif
af71714e 2972 if (neg_report) { /* log or sqrt */
a3463d96
DD
2973 if (
2974#if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
2975 ! Perl_isnan(value) &&
2976#endif
2977 (op_type == OP_LOG ? (value <= 0.0) : (value < 0.0))) {
71302fe3 2978 SET_NUMERIC_STANDARD();
dcbac5bb 2979 /* diag_listed_as: Can't take log of %g */
147e3846 2980 DIE(aTHX_ "Can't take %s of %" NVgf, neg_report, value);
71302fe3
NC
2981 }
2982 }
af71714e 2983 switch (op_type) {
f256868e 2984 default:
af71714e
JH
2985 case OP_SIN: result = Perl_sin(value); break;
2986 case OP_COS: result = Perl_cos(value); break;
2987 case OP_EXP: result = Perl_exp(value); break;
2988 case OP_LOG: result = Perl_log(value); break;
2989 case OP_SQRT: result = Perl_sqrt(value); break;
2990 }
8c78ed36
FC
2991 SETn(result);
2992 return NORMAL;
a0d0e21e 2993 }
79072805
LW
2994}
2995
56cb0a1c
AD
2996/* Support Configure command-line overrides for rand() functions.
2997 After 5.005, perhaps we should replace this by Configure support
2998 for drand48(), random(), or rand(). For 5.005, though, maintain
2999 compatibility by calling rand() but allow the user to override it.
3000 See INSTALL for details. --Andy Dougherty 15 July 1998
3001*/
85ab1d1d
JH
3002/* Now it's after 5.005, and Configure supports drand48() and random(),
3003 in addition to rand(). So the overrides should not be needed any more.
3004 --Jarkko Hietaniemi 27 September 1998
3005 */
3006
79072805
LW
3007PP(pp_rand)
3008{
80252599 3009 if (!PL_srand_called) {
85ab1d1d 3010 (void)seedDrand01((Rand_seed_t)seed());
80252599 3011 PL_srand_called = TRUE;
93dc8474 3012 }
fdf4dddd
DD
3013 {
3014 dSP;
3015 NV value;
fdf4dddd
DD
3016
3017 if (MAXARG < 1)
7e9044f9
FC
3018 {
3019 EXTEND(SP, 1);
fdf4dddd 3020 value = 1.0;
7e9044f9 3021 }
fdf4dddd
DD
3022 else {
3023 SV * const sv = POPs;
3024 if(!sv)
3025 value = 1.0;
3026 else
3027 value = SvNV(sv);
3028 }
3029 /* 1 of 2 things can be carried through SvNV, SP or TARG, SP was carried */
a3463d96
DD
3030#if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
3031 if (! Perl_isnan(value) && value == 0.0)
3032#else
659c4b96 3033 if (value == 0.0)
a3463d96 3034#endif
fdf4dddd
DD
3035 value = 1.0;
3036 {
3037 dTARGET;
3038 PUSHs(TARG);
3039 PUTBACK;
3040 value *= Drand01();
3041 sv_setnv_mg(TARG, value);
3042 }
3043 }
3044 return NORMAL;
79072805
LW
3045}
3046
3047PP(pp_srand)
3048{
20b7effb 3049 dSP; dTARGET;
f914a682
JL
3050 UV anum;
3051
0a5f3363 3052 if (MAXARG >= 1 && (TOPs || POPs)) {
f914a682
JL
3053 SV *top;
3054 char *pv;
3055 STRLEN len;
3056 int flags;
3057
3058 top = POPs;
3059 pv = SvPV(top, len);
3060 flags = grok_number(pv, len, &anum);
3061
3062 if (!(flags & IS_NUMBER_IN_UV)) {
3063 Perl_ck_warner_d(aTHX_ packWARN(WARN_OVERFLOW),
3064 "Integer overflow in srand");
3065 anum = UV_MAX;
3066 }
3067 }
3068 else {
3069 anum = seed();
3070 }
3071
85ab1d1d 3072 (void)seedDrand01((Rand_seed_t)anum);
80252599 3073 PL_srand_called = TRUE;
da1010ec
NC
3074 if (anum)
3075 XPUSHu(anum);
3076 else {
3077 /* Historically srand always returned true. We can avoid breaking
3078 that like this: */
3079 sv_setpvs(TARG, "0 but true");
3080 XPUSHTARG;
3081 }
83832992 3082 RETURN;
79072805
LW
3083}
3084
79072805
LW
3085PP(pp_int)
3086{
20b7effb 3087 dSP; dTARGET;
6f1401dc 3088 tryAMAGICun_MG(int_amg, AMGf_numeric);
774d564b 3089 {
6f1401dc
DM
3090 SV * const sv = TOPs;
3091 const IV iv = SvIV_nomg(sv);
28e5dec8
JH
3092 /* XXX it's arguable that compiler casting to IV might be subtly
3093 different from modf (for numbers inside (IV_MIN,UV_MAX)) in which
3094 else preferring IV has introduced a subtle behaviour change bug. OTOH
3095 relying on floating point to be accurate is a bug. */
3096
c781a409 3097 if (!SvOK(sv)) {
922c4365 3098 SETu(0);
c781a409
RD
3099 }
3100 else if (SvIOK(sv)) {
3101 if (SvIsUV(sv))
6f1401dc 3102 SETu(SvUV_nomg(sv));
c781a409 3103 else
28e5dec8 3104 SETi(iv);
c781a409 3105 }
c781a409 3106 else {
6f1401dc 3107 const NV value = SvNV_nomg(sv);
b9d05018
FC
3108 if (UNLIKELY(Perl_isinfnan(value)))
3109 SETn(value);
5bf8b78e 3110 else if (value >= 0.0) {
28e5dec8
JH
3111 if (value < (NV)UV_MAX + 0.5) {
3112 SETu(U_V(value));
3113 } else {
059a1014 3114 SETn(Perl_floor(value));
28e5dec8 3115 }
1048ea30 3116 }
28e5dec8
JH
3117 else {
3118 if (value > (NV)IV_MIN - 0.5) {
3119 SETi(I_V(value));
3120 } else {
1bbae031 3121 SETn(Perl_ceil(value));
28e5dec8
JH
3122 }
3123 }
774d564b 3124 }
79072805 3125 }
699e9491 3126 return NORMAL;
79072805
LW
3127}
3128
463ee0b2
LW
3129PP(pp_abs)
3130{
20b7effb 3131 dSP; dTARGET;
6f1401dc 3132 tryAMAGICun_MG(abs_amg, AMGf_numeric);
a0d0e21e 3133 {
6f1401dc 3134 SV * const sv = TOPs;
28e5dec8 3135 /* This will cache the NV value if string isn't actually integer */
6f1401dc 3136 const IV iv = SvIV_nomg(sv);
a227d84d 3137
800401ee 3138 if (!SvOK(sv)) {
922c4365 3139 SETu(0);
800401ee
JH
3140 }
3141 else if (SvIOK(sv)) {
28e5dec8 3142 /* IVX is precise */
800401ee 3143 if (SvIsUV(sv)) {
6f1401dc 3144 SETu(SvUV_nomg(sv)); /* force it to be numeric only */
28e5dec8
JH
3145 } else {
3146 if (iv >= 0) {
3147 SETi(iv);
3148 } else {
3149 if (iv != IV_MIN) {
3150 SETi(-iv);
3151 } else {
3152 /* 2s complement assumption. Also, not really needed as
3153 IV_MIN and -IV_MIN should both be %100...00 and NV-able */
b396d0d8 3154 SETu((UV)IV_MIN);
28e5dec8 3155 }
a227d84d 3156 }
28e5dec8
JH
3157 }
3158 } else{
6f1401dc 3159 const NV value = SvNV_nomg(sv);
774d564b 3160 if (value < 0.0)
1b6737cc 3161 SETn(-value);
a4474c9e
DD
3162 else
3163 SETn(value);
774d564b 3164 }
a0d0e21e 3165 }
067b7929 3166 return NORMAL;
463ee0b2
LW
3167}
3168
b1c05ba5
DM
3169
3170/* also used for: pp_hex() */
3171
79072805
LW
3172PP(pp_oct)
3173{
20b7effb 3174 dSP; dTARGET;
5c144d81 3175 const char *tmps;
53305cf1 3176 I32 flags = PERL_SCAN_ALLOW_UNDERSCORES;
6f894ead 3177 STRLEN len;
53305cf1
NC
3178 NV result_nv;
3179 UV result_uv;
4e51bcca 3180 SV* const sv = TOPs;
79072805 3181
349d4f2f 3182 tmps = (SvPV_const(sv, len));
2bc69dc4
NIS
3183 if (DO_UTF8(sv)) {
3184 /* If Unicode, try to downgrade
3185 * If not possible, croak. */
1b6737cc 3186 SV* const tsv = sv_2mortal(newSVsv(sv));
2bc69dc4
NIS
3187
3188 SvUTF8_on(tsv);
3189 sv_utf8_downgrade(tsv, FALSE);
349d4f2f 3190 tmps = SvPV_const(tsv, len);
2bc69dc4 3191 }
daa2adfd
NC
3192 if (PL_op->op_type == OP_HEX)
3193 goto hex;
3194
6f894ead 3195 while (*tmps && len && isSPACE(*tmps))
53305cf1 3196 tmps++, len--;
9e24b6e2 3197 if (*tmps == '0')
53305cf1 3198 tmps++, len--;
305b8651 3199 if (isALPHA_FOLD_EQ(*tmps, 'x')) {
daa2adfd 3200 hex:
53305cf1 3201 result_uv = grok_hex (tmps, &len, &flags, &result_nv);
daa2adfd 3202 }
305b8651 3203 else if (isALPHA_FOLD_EQ(*tmps, 'b'))
53305cf1 3204 result_uv = grok_bin (tmps, &len, &flags, &result_nv);
464e2e8a 3205 else
53305cf1
NC
3206 result_uv = grok_oct (tmps, &len, &flags, &result_nv);
3207
3208 if (flags & PERL_SCAN_GREATER_THAN_UV_MAX) {
4e51bcca 3209 SETn(result_nv);
53305cf1
NC
3210 }
3211 else {
4e51bcca 3212 SETu(result_uv);
53305cf1 3213 }
4e51bcca 3214 return NORMAL;
79072805
LW
3215}
3216
3217/* String stuff. */
3218
3219PP(pp_length)
3220{
20b7effb 3221 dSP; dTARGET;
0bd48802 3222 SV * const sv = TOPs;
a0ed51b3 3223
7776003e
DD
3224 U32 in_bytes = IN_BYTES;
3225 /* simplest case shortcut */
3226 /* turn off SVf_UTF8 in tmp flags if HINT_BYTES on*/
3227 U32 svflags = (SvFLAGS(sv) ^ (in_bytes << 26)) & (SVf_POK|SVs_GMG|SVf_UTF8);
6d59e610 3228 STATIC_ASSERT_STMT(HINT_BYTES == 0x00000008 && SVf_UTF8 == 0x20000000 && (SVf_UTF8 == HINT_BYTES << 26));
7776003e
DD
3229 SETs(TARG);
3230
3231 if(LIKELY(svflags == SVf_POK))
3232 goto simple_pv;
3233 if(svflags & SVs_GMG)
3234 mg_get(sv);
0f43fd57 3235 if (SvOK(sv)) {
7776003e
DD
3236 if (!IN_BYTES) /* reread to avoid using an C auto/register */
3237 sv_setiv(TARG, (IV)sv_len_utf8_nomg(sv));
9f621bb0 3238 else
0f43fd57
FC
3239 {
3240 STRLEN len;
7776003e
DD
3241 /* unrolled SvPV_nomg_const(sv,len) */
3242 if(SvPOK_nog(sv)){
3243 simple_pv:
3244 len = SvCUR(sv);
3245 } else {
3246 (void)sv_2pv_flags(sv, &len, 0|SV_CONST_RETURN);
3247 }
3248 sv_setiv(TARG, (IV)(len));
0f43fd57 3249 }
656266fc 3250 } else {
9407f9c1 3251 if (!SvPADTMP(TARG)) {
e03e82a0 3252 sv_set_undef(TARG);
7776003e
DD
3253 } else { /* TARG is on stack at this point and is overwriten by SETs.
3254 This branch is the odd one out, so put TARG by default on
3255 stack earlier to let local SP go out of liveness sooner */
3256 SETs(&PL_sv_undef);
3257 goto no_set_magic;
3258 }
92331800 3259 }
7776003e
DD
3260 SvSETMAGIC(TARG);
3261 no_set_magic:
3262 return NORMAL; /* no putback, SP didn't move in this opcode */
79072805
LW
3263}
3264
83f78d1a
FC
3265/* Returns false if substring is completely outside original string.
3266 No length is indicated by len_iv = 0 and len_is_uv = 0. len_is_uv must
3267 always be true for an explicit 0.
3268*/
3269bool
ddeaf645
DD
3270Perl_translate_substr_offsets( STRLEN curlen, IV pos1_iv,
3271 bool pos1_is_uv, IV len_iv,
3272 bool len_is_uv, STRLEN *posp,
3273 STRLEN *lenp)
83f78d1a
FC
3274{
3275 IV pos2_iv;
3276 int pos2_is_uv;
3277
3278 PERL_ARGS_ASSERT_TRANSLATE_SUBSTR_OFFSETS;
3279
3280 if (!pos1_is_uv && pos1_iv < 0 && curlen) {
3281 pos1_is_uv = curlen-1 > ~(UV)pos1_iv;
3282 pos1_iv += curlen;
3283 }
3284 if ((pos1_is_uv || pos1_iv > 0) && (UV)pos1_iv > curlen)
3285 return FALSE;
3286
3287 if (len_iv || len_is_uv) {
3288 if (!len_is_uv && len_iv < 0) {
3289 pos2_iv = curlen + len_iv;
3290 if (curlen)
3291 pos2_is_uv = curlen-1 > ~(UV)len_iv;
3292 else
3293 pos2_is_uv = 0;
3294 } else { /* len_iv >= 0 */
3295 if (!pos1_is_uv && pos1_iv < 0) {
3296 pos2_iv = pos1_iv + len_iv;
3297 pos2_is_uv = (UV)len_iv > (UV)IV_MAX;
3298 } else {
3299 if ((UV)len_iv > curlen-(UV)pos1_iv)
3300 pos2_iv = curlen;
3301 else
3302 pos2_iv = pos1_iv+len_iv;
3303 pos2_is_uv = 1;
3304 }
3305 }
3306 }
3307 else {
3308 pos2_iv = curlen;
3309 pos2_is_uv = 1;
3310 }
3311
3312 if (!pos2_is_uv && pos2_iv < 0) {
3313 if (!pos1_is_uv && pos1_iv < 0)
3314 return FALSE;
3315 pos2_iv = 0;
3316 }
3317 else if (!pos1_is_uv && pos1_iv < 0)
3318 pos1_iv = 0;
3319
3320 if ((UV)pos2_iv < (UV)pos1_iv)
3321 pos2_iv = pos1_iv;
3322 if ((UV)pos2_iv > curlen)
3323 pos2_iv = curlen;
3324
3325 /* pos1_iv and pos2_iv both in 0..curlen, so the cast is safe */
3326 *posp = (STRLEN)( (UV)pos1_iv );
3327 *lenp = (STRLEN)( (UV)pos2_iv - (UV)pos1_iv );
3328
3329 return TRUE;
3330}
3331
79072805
LW
3332PP(pp_substr)
3333{
20b7effb 3334 dSP; dTARGET;
79072805 3335 SV *sv;
463ee0b2 3336 STRLEN curlen;
9402d6ed 3337 STRLEN utf8_curlen;
777f7c56
EB
3338 SV * pos_sv;
3339 IV pos1_iv;
3340 int pos1_is_uv;
777f7c56
EB
3341 SV * len_sv;
3342 IV len_iv = 0;
83f78d1a 3343 int len_is_uv = 0;
24fcb59f 3344 I32 lvalue = PL_op->op_flags & OPf_MOD || LVRET;
bbddc9e0 3345 const bool rvalue = (GIMME_V != G_VOID);
e1ec3a88 3346 const char *tmps;
9402d6ed 3347 SV *repl_sv = NULL;
cbbf8932 3348 const char *repl = NULL;
7b8d334a 3349 STRLEN repl_len;
7bc95ae1 3350 int num_args = PL_op->op_private & 7;
13e30c65 3351 bool repl_need_utf8_upgrade = FALSE;
79072805 3352
78f9721b
SM
3353 if (num_args > 2) {
3354 if (num_args > 3) {
24fcb59f 3355 if(!(repl_sv = POPs)) num_args--;
7bc95ae1
FC
3356 }
3357 if ((len_sv = POPs)) {
3358 len_iv = SvIV(len_sv);
83f78d1a 3359 len_is_uv = len_iv ? SvIOK_UV(len_sv) : 1;
7b8d334a 3360 }
7bc95ae1 3361 else num_args--;
5d82c453 3362 }
777f7c56
EB
3363 pos_sv = POPs;
3364 pos1_iv = SvIV(pos_sv);
3365 pos1_is_uv = SvIOK_UV(pos_sv);
79072805 3366 sv = POPs;
24fcb59f
FC
3367 if (PL_op->op_private & OPpSUBSTR_REPL_FIRST) {
3368 assert(!repl_sv);
3369 repl_sv = POPs;
3370 }
6582db62 3371 if (lvalue && !repl_sv) {
83f78d1a
FC
3372 SV * ret;
3373 ret = sv_2mortal(newSV_type(SVt_PVLV)); /* Not TARG RT#67838 */
3374 sv_magic(ret, NULL, PERL_MAGIC_substr, NULL, 0);
3375 LvTYPE(ret) = 'x';
3376 LvTARG(ret) = SvREFCNT_inc_simple(sv);
3377 LvTARGOFF(ret) =
3378 pos1_is_uv || pos1_iv >= 0
3379 ? (STRLEN)(UV)pos1_iv
3380 : (LvFLAGS(ret) |= 1, (STRLEN)(UV)-pos1_iv);
3381 LvTARGLEN(ret) =
3382 len_is_uv || len_iv > 0
3383 ? (STRLEN)(UV)len_iv
3384 : (LvFLAGS(ret) |= 2, (STRLEN)(UV)-len_iv);
3385
83f78d1a
FC
3386 PUSHs(ret); /* avoid SvSETMAGIC here */
3387 RETURN;
a74fb2cd 3388 }
6582db62
FC
3389 if (repl_sv) {
3390 repl = SvPV_const(repl_sv, repl_len);
3391 SvGETMAGIC(sv);
3392 if (SvROK(sv))
3393 Perl_ck_warner(aTHX_ packWARN(WARN_SUBSTR),
3394 "Attempt to use reference as lvalue in substr"
3395 );
3396 tmps = SvPV_force_nomg(sv, curlen);
3397 if (DO_UTF8(repl_sv) && repl_len) {
3398 if (!DO_UTF8(sv)) {
01680ee9 3399 sv_utf8_upgrade_nomg(sv);
6582db62
FC
3400 curlen = SvCUR(sv);
3401 }
3402 }
3403 else if (DO_UTF8(sv))
3404 repl_need_utf8_upgrade = TRUE;
3405 }
3406 else tmps = SvPV_const(sv, curlen);
7e2040f0 3407 if (DO_UTF8(sv)) {
0d788f38 3408 utf8_curlen = sv_or_pv_len_utf8(sv, tmps, curlen);
9402d6ed
JH
3409 if (utf8_curlen == curlen)
3410 utf8_curlen = 0;
a0ed51b3 3411 else
9402d6ed 3412 curlen = utf8_curlen;
a0ed51b3 3413 }
d1c2b58a 3414 else
9402d6ed 3415 utf8_curlen = 0;
a0ed51b3 3416
83f78d1a
FC
3417 {
3418 STRLEN pos, len, byte_len, byte_pos;
777f7c56 3419
83f78d1a
FC
3420 if (!translate_substr_offsets(
3421 curlen, pos1_iv, pos1_is_uv, len_iv, len_is_uv, &pos, &len
3422 )) goto bound_fail;
777f7c56 3423
83f78d1a
FC
3424 byte_len = len;
3425 byte_pos = utf8_curlen
0d788f38 3426 ? sv_or_pv_pos_u2b(sv, tmps, pos, &byte_len) : pos;
d931b1be 3427
2154eca7 3428 tmps += byte_pos;
bbddc9e0
CS
3429
3430 if (rvalue) {
3431 SvTAINTED_off(TARG); /* decontaminate */
3432 SvUTF8_off(TARG); /* decontaminate */
3433 sv_setpvn(TARG, tmps, byte_len);
12aa1545 3434#ifdef USE_LOCALE_COLLATE
bbddc9e0 3435 sv_unmagic(TARG, PERL_MAGIC_collxfrm);
12aa1545 3436#endif
bbddc9e0
CS
3437 if (utf8_curlen)
3438 SvUTF8_on(TARG);
3439 }
2154eca7 3440
f7928d6c 3441 if (repl) {
13e30c65
JH
3442 SV* repl_sv_copy = NULL;
3443
3444 if (repl_need_utf8_upgrade) {
3445 repl_sv_copy = newSVsv(repl_sv);
3446 sv_utf8_upgrade(repl_sv_copy);
349d4f2f 3447 repl = SvPV_const(repl_sv_copy, repl_len);
13e30c65 3448 }
502d9230 3449 if (!SvOK(sv))
500f3e18 3450 SvPVCLEAR(sv);
777f7c56 3451 sv_insert_flags(sv, byte_pos, byte_len, repl, repl_len, 0);
ef8d46e8 3452 SvREFCNT_dec(repl_sv_copy);
f7928d6c 3453 }
79072805 3454 }
6a9665b0
FC
3455 if (PL_op->op_private & OPpSUBSTR_REPL_FIRST)
3456 SP++;
3457 else if (rvalue) {
bbddc9e0
CS
3458 SvSETMAGIC(TARG);
3459 PUSHs(TARG);
3460 }
79072805 3461 RETURN;
777f7c56 3462
7b52d656 3463 bound_fail:
83f78d1a 3464 if (repl)
777f7c56
EB
3465 Perl_croak(aTHX_ "substr outside of string");
3466 Perl_ck_warner(aTHX_ packWARN(WARN_SUBSTR), "substr outside of string");
3467 RETPUSHUNDEF;
79072805
LW
3468}
3469
3470PP(pp_vec)
3471{
20b7effb 3472 dSP;
eb578fdb
KW
3473 const IV size = POPi;
3474 const IV offset = POPi;
3475 SV * const src = POPs;
1b6737cc 3476 const I32 lvalue = PL_op->op_flags & OPf_MOD || LVRET;
2154eca7 3477 SV * ret;
a0d0e21e 3478
81e118e0 3479 if (lvalue) { /* it's an lvalue! */
2154eca7
EB
3480 ret = sv_2mortal(newSV_type(SVt_PVLV)); /* Not TARG RT#67838 */
3481 sv_magic(ret, NULL, PERL_MAGIC_vec, NULL, 0);
3482 LvTYPE(ret) = 'v';
3483 LvTARG(ret) = SvREFCNT_inc_simple(src);
3484 LvTARGOFF(ret) = offset;
3485 LvTARGLEN(ret) = size;
3486 }
3487 else {
3488 dTARGET;
3489 SvTAINTED_off(TARG); /* decontaminate */
3490 ret = TARG;
79072805
LW
3491 }
3492
2154eca7 3493 sv_setuv(ret, do_vecget(src, offset, size));
f9e95907
FC
3494 if (!lvalue)
3495 SvSETMAGIC(ret);
2154eca7 3496 PUSHs(ret);
79072805
LW
3497 RETURN;
3498}
3499
b1c05ba5
DM
3500
3501/* also used for: pp_rindex() */
3502
79072805
LW
3503PP(pp_index)
3504{
20b7effb 3505 dSP; dTARGET;
79072805
LW
3506 SV *big;
3507 SV *little;
c445ea15 3508 SV *temp = NULL;
ad66a58c 3509 STRLEN biglen;
2723d216 3510 STRLEN llen = 0;
b464e2b7
TC
3511 SSize_t offset = 0;
3512 SSize_t retval;
73ee8be2
NC
3513 const char *big_p;
3514 const char *little_p;
2f040f7f
NC
3515 bool big_utf8;
3516 bool little_utf8;
2723d216 3517 const bool is_index = PL_op->op_type == OP_INDEX;
d3e26383 3518 const bool threeargs = MAXARG >= 3 && (TOPs || ((void)POPs,0));
79072805 3519
e1dccc0d
Z
3520 if (threeargs)
3521 offset = POPi;
79072805
LW
3522 little = POPs;
3523 big = POPs;
73ee8be2
NC
3524 big_p = SvPV_const(big, biglen);
3525 little_p = SvPV_const(little, llen);
3526
e609e586
NC
3527 big_utf8 = DO_UTF8(big);
3528 little_utf8 = DO_UTF8(little);
3529 if (big_utf8 ^ little_utf8) {
3530 /* One needs to be upgraded. */
8df0e7a2 3531 if (little_utf8) {
2f040f7f
NC
3532 /* Well, maybe instead we might be able to downgrade the small
3533 string? */
1eced8f8 3534 char * const pv = (char*)bytes_from_utf8((U8 *)little_p, &llen,
2f040f7f
NC
3535 &little_utf8);
3536 if (little_utf8) {
3537 /* If the large string is ISO-8859-1, and it's not possible to
3538 convert the small string to ISO-8859-1, then there is no
3539 way that it could be found anywhere by index. */
3540 retval = -1;
3541 goto fail;
3542 }
e609e586 3543
2f040f7f
NC
3544 /* At this point, pv is a malloc()ed string. So donate it to temp
3545 to ensure it will get free()d */
3546 little = temp = newSV(0);
73ee8be2
NC
3547 sv_usepvn(temp, pv, llen);
3548 little_p = SvPVX(little);
e609e586 3549 } else {
20e67ba1 3550 temp = newSVpvn(little_p, llen);
2f040f7f 3551
8df0e7a2 3552 sv_utf8_upgrade(temp);
20e67ba1
FC
3553 little = temp;
3554 little_p = SvPV_const(little, llen);
e609e586
NC
3555 }
3556 }
73ee8be2
NC
3557 if (SvGAMAGIC(big)) {
3558 /* Life just becomes a lot easier if I use a temporary here.
3559 Otherwise I need to avoid calls to sv_pos_u2b(), which (dangerously)
3560 will trigger magic and overloading again, as will fbm_instr()
3561 */
59cd0e26
NC
3562 big = newSVpvn_flags(big_p, biglen,
3563 SVs_TEMP | (big_utf8 ? SVf_UTF8 : 0));
73ee8be2
NC
3564 big_p = SvPVX(big);
3565 }
e4e44778 3566 if (SvGAMAGIC(little) || (is_index && !SvOK(little))) {
73ee8be2
NC
3567 /* index && SvOK() is a hack. fbm_instr() calls SvPV_const, which will
3568 warn on undef, and we've already triggered a warning with the
3569 SvPV_const some lines above. We can't remove that, as we need to
3570 call some SvPV to trigger overloading early and find out if the
3571 string is UTF-8.
8bd97c0c 3572 This is all getting too messy. The API isn't quite clean enough,
73ee8be2
NC
3573 because data access has side effects.
3574 */
59cd0e26
NC
3575 little = newSVpvn_flags(little_p, llen,
3576 SVs_TEMP | (little_utf8 ? SVf_UTF8 : 0));
73ee8be2
NC
3577 little_p = SvPVX(little);
3578 }
e609e586 3579
d3e26383 3580 if (!threeargs)
2723d216 3581 offset = is_index ? 0 : biglen;
a0ed51b3 3582 else {
ad66a58c 3583 if (big_utf8 && offset > 0)
b464e2b7 3584 offset = sv_pos_u2b_flags(big, offset, 0, SV_CONST_RETURN);
73ee8be2
NC
3585 if (!is_index)
3586 offset += llen;
a0ed51b3 3587 }
79072805
LW
3588 if (offset < 0)
3589 offset = 0;
b464e2b7 3590 else if (offset > (SSize_t)biglen)
ad66a58c 3591 offset = biglen;
73ee8be2
NC
3592 if (!(little_p = is_index
3593 ? fbm_instr((unsigned char*)big_p + offset,
3594 (unsigned char*)big_p + biglen, little, 0)
3595 : rninstr(big_p, big_p + offset,
3596 little_p, little_p + llen)))
a0ed51b3 3597 retval = -1;
ad66a58c 3598 else {
73ee8be2 3599 retval = little_p - big_p;
15c41403 3600 if (retval > 1 && big_utf8)
b464e2b7 3601 retval = sv_pos_b2u_flags(big, retval, SV_CONST_RETURN);
ad66a58c 3602 }
ef8d46e8 3603 SvREFCNT_dec(temp);
2723d216 3604 fail:
e1dccc0d 3605 PUSHi(retval);
79072805
LW
3606 RETURN;
3607}
3608
3609PP(pp_sprintf)
3610{
20b7effb 3611 dSP; dMARK; dORIGMARK; dTARGET;
3e6bd4bf 3612 SvTAINTED_off(TARG);
79072805 3613 do_sprintf(TARG, SP-MARK, MARK+1);
bbce6d69 3614 TAINT_IF(SvTAINTED(TARG));
79072805
LW
3615 SP = ORIGMARK;
3616 PUSHTARG;
3617 RETURN;
3618}
3619
79072805
LW
3620PP(pp_ord)
3621{
20b7effb 3622 dSP; dTARGET;
1eced8f8 3623
6ba92227 3624 SV *argsv = TOPs;
ba210ebe 3625 STRLEN len;
349d4f2f 3626 const U8 *s = (U8*)SvPV_const(argsv, len);
121910a4 3627
6ba92227 3628 SETu(DO_UTF8(argsv)
4f6386b6 3629 ? utf8n_to_uvchr(s, len, 0, UTF8_ALLOW_ANYUV)
f3943cf2 3630 : (UV)(*s));
68795e93 3631
6ba92227 3632 return NORMAL;
79072805
LW
3633}
3634
463ee0b2
LW
3635PP(pp_chr)
3636{
20b7effb 3637 dSP; dTARGET;
463ee0b2 3638 char *tmps;
8a064bd6 3639 UV value;
d3261b99 3640 SV *top = TOPs;
8a064bd6 3641
71739502 3642 SvGETMAGIC(top);
9911fc4e
FC
3643 if (UNLIKELY(SvAMAGIC(top)))
3644 top = sv_2num(top);
99f450cc 3645 if (UNLIKELY(isinfnansv(top)))
147e3846 3646 Perl_croak(aTHX_ "Cannot chr %" NVgf, SvNV(top));
1cd88304
JH
3647 else {
3648 if (!IN_BYTES /* under bytes, chr(-1) eq chr(0xff), etc. */
3649 && ((SvIOKp(top) && !SvIsUV(top) && SvIV_nomg(top) < 0)
3650 ||
3651 ((SvNOKp(top) || (SvOK(top) && !SvIsUV(top)))
2cc2a5a0
KW
3652 && SvNV_nomg(top) < 0.0)))
3653 {
b3fe8680
FC
3654 if (ckWARN(WARN_UTF8)) {
3655 if (SvGMAGICAL(top)) {
3656 SV *top2 = sv_newmortal();
3657 sv_setsv_nomg(top2, top);
3658 top = top2;
3659 }
1cd88304 3660 Perl_warner(aTHX_ packWARN(WARN_UTF8),
147e3846 3661 "Invalid negative number (%" SVf ") in chr", SVfARG(top));
1cd88304
JH
3662 }
3663 value = UNICODE_REPLACEMENT;
3664 } else {
3665 value = SvUV_nomg(top);
3666 }
8a064bd6 3667 }
463ee0b2 3668
862a34c6 3669 SvUPGRADE(TARG,SVt_PV);
a0ed51b3 3670
0064a8a9 3671 if (value > 255 && !IN_BYTES) {
5f560d8a 3672 SvGROW(TARG, (STRLEN)UVCHR_SKIP(value)+1);
62961d2e 3673 tmps = (char*)uvchr_to_utf8_flags((U8*)SvPVX(TARG), value, 0);
349d4f2f 3674 SvCUR_set(TARG, tmps - SvPVX_const(TARG));
a0ed51b3
LW
3675 *tmps = '\0';
3676 (void)SvPOK_only(TARG);
aa6ffa16 3677 SvUTF8_on(TARG);
d3261b99
FC
3678 SETTARG;
3679 return NORMAL;
a0ed51b3
LW
3680 }
3681
748a9306 3682 SvGROW(TARG,2);
463ee0b2
LW
3683 SvCUR_set(TARG, 1);
3684 tmps = SvPVX(TARG);
eb160463 3685 *tmps++ = (char)value;
748a9306 3686 *tmps = '\0';
a0d0e21e 3687 (void)SvPOK_only(TARG);
4c5ed6e2 3688
d3261b99
FC
3689 SETTARG;
3690 return NORMAL;
463ee0b2
LW
3691}
3692
79072805
LW
3693PP(pp_crypt)
3694{
79072805 3695#ifdef HAS_CRYPT
20b7effb 3696 dSP; dTARGET;
5f74f29c 3697 dPOPTOPssrl;
85c16d83 3698 STRLEN len;
10516c54 3699 const char *tmps = SvPV_const(left, len);
2bc69dc4 3700
85c16d83 3701 if (DO_UTF8(left)) {
2bc69dc4 3702 /* If Unicode, try to downgrade.
f2791508
JH
3703 * If not possible, croak.
3704 * Yes, we made this up. */
659fbb76 3705 SV* const tsv = newSVpvn_flags(tmps, len, SVf_UTF8|SVs_TEMP);
2bc69dc4 3706
2bc69dc4 3707 sv_utf8_downgrade(tsv, FALSE);
349d4f2f 3708 tmps = SvPV_const(tsv, len);
85c16d83 3709 }
05404ffe
JH
3710# ifdef USE_ITHREADS
3711# ifdef HAS_CRYPT_R
3712 if (!PL_reentrant_buffer->_crypt_struct_buffer) {
3713 /* This should be threadsafe because in ithreads there is only
3714 * one thread per interpreter. If this would not be true,
3715 * we would need a mutex to protect this malloc. */
3716 PL_reentrant_buffer->_crypt_struct_buffer =
3717 (struct crypt_data *)safemalloc(sizeof(struct crypt_data));
3718#if defined(__GLIBC__) || defined(__EMX__)
3719 if (PL_reentrant_buffer->_crypt_struct_buffer) {
3720 PL_reentrant_buffer->_crypt_struct_buffer->initialized = 0;
3721 /* work around glibc-2.2.5 bug */
3722 PL_reentrant_buffer->_crypt_struct_buffer->current_saltbits = 0;
3723 }
05404ffe 3724#endif
6ab58e4d 3725 }
05404ffe
JH
3726# endif /* HAS_CRYPT_R */
3727# endif /* USE_ITHREADS */
5f74f29c 3728# ifdef FCRYPT
83003860 3729 sv_setpv(TARG, fcrypt(tmps, SvPV_nolen_const(right)));
5f74f29c 3730# else
83003860 3731 sv_setpv(TARG, PerlProc_crypt(tmps, SvPV_nolen_const(right)));
5f74f29c 3732# endif
fbc76eb3 3733 SvUTF8_off(TARG);
ec93b65f 3734 SETTARG;
4808266b 3735 RETURN;
79072805 3736#else
b13b2135 3737 DIE(aTHX_
79072805
LW
3738 "The crypt() function is unimplemented due to excessive paranoia.");
3739#endif
79072805
LW
3740}
3741
00f254e2
KW
3742/* Generally UTF-8 and UTF-EBCDIC are indistinguishable at this level. So
3743 * most comments below say UTF-8, when in fact they mean UTF-EBCDIC as well */
3744
b1c05ba5
DM
3745
3746/* also used for: pp_lcfirst() */
3747
79072805
LW
3748PP(pp_ucfirst)
3749{
00f254e2
KW
3750 /* Actually is both lcfirst() and ucfirst(). Only the first character
3751 * changes. This means that possibly we can change in-place, ie., just
3752 * take the source and change that one character and store it back, but not
3753 * if read-only etc, or if the length changes */
3754
39644a26 3755 dSP;
d54190f6 3756 SV *source = TOPs;
00f254e2 3757 STRLEN slen; /* slen is the byte length of the whole SV. */
d54190f6
NC
3758 STRLEN need;
3759 SV *dest;
00f254e2
KW
3760 bool inplace; /* ? Convert first char only, in-place */
3761 bool doing_utf8 = FALSE; /* ? using utf8 */
3762 bool convert_source_to_utf8 = FALSE; /* ? need to convert */
12e9c124 3763 const int op_type = PL_op->op_type;
d54190f6
NC
3764 const U8 *s;
3765 U8 *d;
3766 U8 tmpbuf[UTF8_MAXBYTES_CASE+1];
00f254e2
KW
3767 STRLEN ulen; /* ulen is the byte length of the original Unicode character
3768 * stored as UTF-8 at s. */
3769 STRLEN tculen; /* tculen is the byte length of the freshly titlecased (or
3770 * lowercased) character stored in tmpbuf. May be either
3771 * UTF-8 or not, but in either case is the number of bytes */
d54190f6 3772
841a5e18 3773 s = (const U8*)SvPV_const(source, slen);
a0ed51b3 3774
00f254e2
KW
3775 /* We may be able to get away with changing only the first character, in
3776 * place, but not if read-only, etc. Later we may discover more reasons to
3777 * not convert in-place. */
1921e031 3778 inplace = !SvREADONLY(source) && SvPADTMP(source);
00f254e2
KW
3779
3780 /* First calculate what the changed first character should be. This affects
3781 * whether we can just swap it out, leaving the rest of the string unchanged,
3782 * or even if have to convert the dest to UTF-8 when the source isn't */
3783
3784 if (! slen) { /* If empty */
3785 need = 1; /* still need a trailing NUL */
b7576bcb 3786 ulen = 0;
00f254e2
KW
3787 }
3788 else if (DO_UTF8(source)) { /* Is the source utf8? */
d54190f6 3789 doing_utf8 = TRUE;
17e95c9d 3790 ulen = UTF8SKIP(s);
094a2f8c 3791 if (op_type == OP_UCFIRST) {
130c5df3 3792#ifdef USE_LOCALE_CTYPE
5a6bb681 3793 _to_utf8_title_flags(s, tmpbuf, &tculen, IN_LC_RUNTIME(LC_CTYPE));
130c5df3 3794#else
5a6bb681 3795 _to_utf8_title_flags(s, tmpbuf, &tculen, 0);
130c5df3 3796#endif
094a2f8c
KW
3797 }
3798 else {
130c5df3 3799#ifdef USE_LOCALE_CTYPE
5a6bb681 3800 _to_utf8_lower_flags(s, tmpbuf, &tculen, IN_LC_RUNTIME(LC_CTYPE));
130c5df3 3801#else
5a6bb681 3802 _to_utf8_lower_flags(s, tmpbuf, &tculen, 0);
130c5df3 3803#endif
094a2f8c 3804 }
00f254e2 3805
17e95c9d
KW
3806 /* we can't do in-place if the length changes. */
3807 if (ulen != tculen) inplace = FALSE;
3808 need = slen + 1 - ulen + tculen;
d54190f6 3809 }
00f254e2
KW
3810 else { /* Non-zero length, non-UTF-8, Need to consider locale and if
3811 * latin1 is treated as caseless. Note that a locale takes
3812 * precedence */
167d19f2 3813 ulen = 1; /* Original character is 1 byte */
00f254e2
KW
3814 tculen = 1; /* Most characters will require one byte, but this will
3815 * need to be overridden for the tricky ones */
3816 need = slen + 1;
3817
3818 if (op_type == OP_LCFIRST) {
d54190f6 3819
00f254e2 3820 /* lower case the first letter: no trickiness for any character */
130c5df3 3821#ifdef USE_LOCALE_CTYPE
780fcc9f
KW
3822 if (IN_LC_RUNTIME(LC_CTYPE)) {
3823 _CHECK_AND_WARN_PROBLEMATIC_LOCALE;
3824 *tmpbuf = toLOWER_LC(*s);
3825 }
3826 else
130c5df3 3827#endif
780fcc9f
KW
3828 {
3829 *tmpbuf = (IN_UNI_8_BIT)
3830 ? toLOWER_LATIN1(*s)
3831 : toLOWER(*s);
3832 }
00f254e2 3833 }
130c5df3 3834#ifdef USE_LOCALE_CTYPE
780fcc9f 3835 /* is ucfirst() */
d6ded950 3836 else if (IN_LC_RUNTIME(LC_CTYPE)) {
31f05a37
KW
3837 if (IN_UTF8_CTYPE_LOCALE) {
3838 goto do_uni_rules;
3839 }
3840
780fcc9f 3841 _CHECK_AND_WARN_PROBLEMATIC_LOCALE;
31f05a37
KW
3842 *tmpbuf = (U8) toUPPER_LC(*s); /* This would be a bug if any
3843 locales have upper and title case
3844 different */
00f254e2 3845 }
130c5df3 3846#endif
00f254e2
KW
3847 else if (! IN_UNI_8_BIT) {
3848 *tmpbuf = toUPPER(*s); /* Returns caseless for non-ascii, or
3849 * on EBCDIC machines whatever the
3850 * native function does */
3851 }
31f05a37
KW
3852 else {
3853 /* Here, is ucfirst non-UTF-8, not in locale (unless that locale is
3854 * UTF-8, which we treat as not in locale), and cased latin1 */
3855 UV title_ord;
91191cf7 3856#ifdef USE_LOCALE_CTYPE
31f05a37 3857 do_uni_rules:
91191cf7 3858#endif
31f05a37
KW
3859
3860 title_ord = _to_upper_title_latin1(*s, tmpbuf, &tculen, 's');
167d19f2
KW
3861 if (tculen > 1) {
3862 assert(tculen == 2);
3863
3864 /* If the result is an upper Latin1-range character, it can
3865 * still be represented in one byte, which is its ordinal */
3866 if (UTF8_IS_DOWNGRADEABLE_START(*tmpbuf)) {
3867 *tmpbuf = (U8) title_ord;
3868 tculen = 1;
00f254e2
KW
3869 }
3870 else {
167d19f2
KW
3871 /* Otherwise it became more than one ASCII character (in
3872 * the case of LATIN_SMALL_LETTER_SHARP_S) or changed to
3873 * beyond Latin1, so the number of bytes changed, so can't
3874 * replace just the first character in place. */
3875 inplace = FALSE;
3876
d14578b8
KW
3877 /* If the result won't fit in a byte, the entire result
3878 * will have to be in UTF-8. Assume worst case sizing in
3879 * conversion. (all latin1 characters occupy at most two
3880 * bytes in utf8) */
167d19f2
KW
3881 if (title_ord > 255) {
3882 doing_utf8 = TRUE;
3883 convert_source_to_utf8 = TRUE;
3884 need = slen * 2 + 1;
3885
3886 /* The (converted) UTF-8 and UTF-EBCDIC lengths of all
3887 * (both) characters whose title case is above 255 is
3888 * 2. */
3889 ulen = 2;
3890 }
3891 else { /* LATIN_SMALL_LETTER_SHARP_S expands by 1 byte */
3892 need = slen + 1 + 1;
3893 }
00f254e2 3894 }
167d19f2 3895 }
00f254e2
KW
3896 } /* End of use Unicode (Latin1) semantics */
3897 } /* End of changing the case of the first character */
3898
3899 /* Here, have the first character's changed case stored in tmpbuf. Ready to
3900 * generate the result */
3901 if (inplace) {
3902
3903 /* We can convert in place. This means we change just the first
3904 * character without disturbing the rest; no need to grow */
d54190f6
NC
3905 dest = source;
3906 s = d = (U8*)SvPV_force_nomg(source, slen);
3907 } else {
3908 dTARGET;
3909
3910 dest = TARG;
3911
00f254e2
KW
3912 /* Here, we can't convert in place; we earlier calculated how much
3913 * space we will need, so grow to accommodate that */
d54190f6 3914 SvUPGRADE(dest, SVt_PV);
3b416f41 3915 d = (U8*)SvGROW(dest, need);
d54190f6
NC
3916 (void)SvPOK_only(dest);
3917
3918 SETs(dest);
d54190f6 3919 }
44bc797b 3920
d54190f6 3921 if (doing_utf8) {
00f254e2
KW
3922 if (! inplace) {
3923 if (! convert_source_to_utf8) {
3924
3925 /* Here both source and dest are in UTF-8, but have to create
3926 * the entire output. We initialize the result to be the
3927 * title/lower cased first character, and then append the rest
3928 * of the string. */
3929 sv_setpvn(dest, (char*)tmpbuf, tculen);
3930 if (slen > ulen) {
3931 sv_catpvn(dest, (char*)(s + ulen), slen - ulen);
3932 }
3933 }
3934 else {
3935 const U8 *const send = s + slen;
3936
3937 /* Here the dest needs to be in UTF-8, but the source isn't,
3938 * except we earlier UTF-8'd the first character of the source
3939 * into tmpbuf. First put that into dest, and then append the
3940 * rest of the source, converting it to UTF-8 as we go. */
3941
3942 /* Assert tculen is 2 here because the only two characters that
3943 * get to this part of the code have 2-byte UTF-8 equivalents */
3944 *d++ = *tmpbuf;
3945 *d++ = *(tmpbuf + 1);
3946 s++; /* We have just processed the 1st char */
3947
3948 for (; s < send; s++) {
3949 d = uvchr_to_utf8(d, *s);
3950 }
3951 *d = '\0';
3952 SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
3953 }
d54190f6 3954 SvUTF8_on(dest);
a0ed51b3 3955 }
00f254e2 3956 else { /* in-place UTF-8. Just overwrite the first character */
d54190f6
NC
3957 Copy(tmpbuf, d, tculen, U8);
3958 SvCUR_set(dest, need - 1);
a0ed51b3 3959 }
094a2f8c 3960
a0ed51b3 3961 }
00f254e2
KW
3962 else { /* Neither source nor dest are in or need to be UTF-8 */
3963 if (slen) {
00f254e2
KW
3964 if (inplace) { /* in-place, only need to change the 1st char */
3965 *d = *tmpbuf;
3966 }
3967 else { /* Not in-place */
3968
3969 /* Copy the case-changed character(s) from tmpbuf */
3970 Copy(tmpbuf, d, tculen, U8);
3971 d += tculen - 1; /* Code below expects d to point to final
3972 * character stored */
3973 }
3974 }
3975 else { /* empty source */
3976 /* See bug #39028: Don't taint if empty */
d54190f6
NC
3977 *d = *s;
3978 }
3979
00f254e2
KW
3980 /* In a "use bytes" we don't treat the source as UTF-8, but, still want
3981 * the destination to retain that flag */
93e088e8 3982 if (SvUTF8(source) && ! IN_BYTES)
d54190f6
NC
3983 SvUTF8_on(dest);
3984
00f254e2 3985 if (!inplace) { /* Finish the rest of the string, unchanged */
d54190f6
NC
3986 /* This will copy the trailing NUL */
3987 Copy(s + 1, d + 1, slen, U8);
3988 SvCUR_set(dest, need - 1);
bbce6d69 3989 }
bbce6d69 3990 }
130c5df3 3991#ifdef USE_LOCALE_CTYPE
d6ded950 3992 if (IN_LC_RUNTIME(LC_CTYPE)) {
445bf929
KW
3993 TAINT;
3994 SvTAINTED_on(dest);
3995 }
130c5df3 3996#endif
539689e7
FC
3997 if (dest != source && SvTAINTED(source))
3998 SvTAINT(dest);
d54190f6 3999 SvSETMAGIC(dest);
3cb4e04f 4000 return NORMAL;
79072805
LW
4001}
4002
67306194
NC
4003/* There's so much setup/teardown code common between uc and lc, I wonder if
4004 it would be worth merging the two, and just having a switch outside each
00f254e2 4005 of the three tight loops. There is less and less commonality though */
79072805
LW
4006PP(pp_uc)
4007{
39644a26 4008 dSP;
67306194 4009 SV *source = TOPs;
463ee0b2 4010 STRLEN len;
67306194
NC
4011 STRLEN min;
4012 SV *dest;
4013 const U8 *s;
4014 U8 *d;
79072805 4015
67306194
NC
4016 SvGETMAGIC(source);
4017
1921e031 4018 if ( SvPADTMP(source)
5cd5e2d6
FC
4019 && !SvREADONLY(source) && SvPOK(source)
4020 && !DO_UTF8(source)
130c5df3
KW
4021 && (
4022#ifdef USE_LOCALE_CTYPE
4023 (IN_LC_RUNTIME(LC_CTYPE))
31f05a37 4024 ? ! IN_UTF8_CTYPE_LOCALE
130c5df3
KW
4025 :
4026#endif
4027 ! IN_UNI_8_BIT))
31f05a37
KW
4028 {
4029
4030 /* We can convert in place. The reason we can't if in UNI_8_BIT is to
4031 * make the loop tight, so we overwrite the source with the dest before
4032 * looking at it, and we need to look at the original source
4033 * afterwards. There would also need to be code added to handle
4034 * switching to not in-place in midstream if we run into characters
4035 * that change the length. Since being in locale overrides UNI_8_BIT,
4036 * that latter becomes irrelevant in the above test; instead for
4037 * locale, the size can't normally change, except if the locale is a
4038 * UTF-8 one */
67306194
NC
4039 dest = source;
4040 s = d = (U8*)SvPV_force_nomg(source, len);
4041 min = len + 1;
4042 } else {
a0ed51b3 4043 dTARGET;
a0ed51b3 4044
67306194 4045 dest = TARG;
128c9517 4046
841a5e18 4047 s = (const U8*)SvPV_nomg_const(source, len);
67306194
NC
4048 min = len + 1;
4049
4050 SvUPGRADE(dest, SVt_PV);
3b416f41 4051 d = (U8*)SvGROW(dest, min);
67306194
NC
4052 (void)SvPOK_only(dest);
4053
4054 SETs(dest);
a0ed51b3 4055 }
31351b04 4056
67306194
NC
4057 /* Overloaded values may have toggled the UTF-8 flag on source, so we need
4058 to check DO_UTF8 again here. */
4059
4060 if (DO_UTF8(source)) {
4061 const U8 *const send = s + len;
bfac13d4 4062 U8 tmpbuf[UTF8_MAXBYTES_CASE+1];
67306194 4063
4c8a458a
KW
4064 /* All occurrences of these are to be moved to follow any other marks.
4065 * This is context-dependent. We may not be passed enough context to
4066 * move the iota subscript beyond all of them, but we do the best we can
4067 * with what we're given. The result is always better than if we
4068 * hadn't done this. And, the problem would only arise if we are
4069 * passed a character without all its combining marks, which would be
4070 * the caller's mistake. The information this is based on comes from a
4071 * comment in Unicode SpecialCasing.txt, (and the Standard's text
4072 * itself) and so can't be checked properly to see if it ever gets
4073 * revised. But the likelihood of it changing is remote */
00f254e2 4074 bool in_iota_subscript = FALSE;
00f254e2 4075
67306194 4076 while (s < send) {
3e16b0e6
KW
4077 STRLEN u;
4078 STRLEN ulen;
4079 UV uv;
7dbf68d2 4080 if (in_iota_subscript && ! _is_utf8_mark(s)) {
3e16b0e6 4081
00f254e2 4082 /* A non-mark. Time to output the iota subscript */
a78bc3c6
KW
4083 Copy(GREEK_CAPITAL_LETTER_IOTA_UTF8, d, capital_iota_len, U8);
4084 d += capital_iota_len;
00f254e2 4085 in_iota_subscript = FALSE;
8e058693 4086 }
00f254e2 4087
8e058693
KW
4088 /* Then handle the current character. Get the changed case value
4089 * and copy it to the output buffer */
00f254e2 4090
8e058693 4091 u = UTF8SKIP(s);
130c5df3 4092#ifdef USE_LOCALE_CTYPE
5a6bb681 4093 uv = _to_utf8_upper_flags(s, tmpbuf, &ulen, IN_LC_RUNTIME(LC_CTYPE));
130c5df3 4094#else
5a6bb681 4095 uv = _to_utf8_upper_flags(s, tmpbuf, &ulen, 0);
130c5df3 4096#endif
a78bc3c6
KW
4097#define GREEK_CAPITAL_LETTER_IOTA 0x0399
4098#define COMBINING_GREEK_YPOGEGRAMMENI 0x0345
8e058693 4099 if (uv == GREEK_CAPITAL_LETTER_IOTA
4b88fb76 4100 && utf8_to_uvchr_buf(s, send, 0) == COMBINING_GREEK_YPOGEGRAMMENI)
8e058693
KW
4101 {
4102 in_iota_subscript = TRUE;
4103 }
4104 else {
4105 if (ulen > u && (SvLEN(dest) < (min += ulen - u))) {
4106 /* If the eventually required minimum size outgrows the
4107 * available space, we need to grow. */
4108 const UV o = d - (U8*)SvPVX_const(dest);
4109
4110 /* If someone uppercases one million U+03B0s we SvGROW()
4111 * one million times. Or we could try guessing how much to
4112 * allocate without allocating too much. Such is life.
4113 * See corresponding comment in lc code for another option
4114 * */
10656159 4115 d = o + (U8*) SvGROW(dest, min);
8e058693
KW
4116 }
4117 Copy(tmpbuf, d, ulen, U8);
4118 d += ulen;
4119 }
4120 s += u;
67306194 4121 }
4c8a458a 4122 if (in_iota_subscript) {
a78bc3c6
KW
4123 Copy(GREEK_CAPITAL_LETTER_IOTA_UTF8, d, capital_iota_len, U8);
4124 d += capital_iota_len;
4c8a458a 4125 }
67306194
NC
4126 SvUTF8_on(dest);
4127 *d = '\0';
094a2f8c 4128
67306194 4129 SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
4c8a458a
KW
4130 }
4131 else { /* Not UTF-8 */
67306194
NC
4132 if (len) {
4133 const U8 *const send = s + len;
00f254e2
KW
4134
4135 /* Use locale casing if in locale; regular style if not treating
4136 * latin1 as having case; otherwise the latin1 casing. Do the
4137 * whole thing in a tight loop, for speed, */
130c5df3 4138#ifdef USE_LOCALE_CTYPE
d6ded950 4139 if (IN_LC_RUNTIME(LC_CTYPE)) {
31f05a37
KW
4140 if (IN_UTF8_CTYPE_LOCALE) {
4141 goto do_uni_rules;
4142 }
780fcc9f 4143 _CHECK_AND_WARN_PROBLEMATIC_LOCALE;
67306194 4144 for (; s < send; d++, s++)
31f05a37 4145 *d = (U8) toUPPER_LC(*s);
31351b04 4146 }
130c5df3
KW
4147 else
4148#endif
4149 if (! IN_UNI_8_BIT) {
00f254e2 4150 for (; s < send; d++, s++) {
67306194 4151 *d = toUPPER(*s);
00f254e2 4152 }
31351b04 4153 }
00f254e2 4154 else {
91191cf7 4155#ifdef USE_LOCALE_CTYPE
31f05a37 4156 do_uni_rules:
91191cf7 4157#endif
00f254e2
KW
4158 for (; s < send; d++, s++) {
4159 *d = toUPPER_LATIN1_MOD(*s);
d14578b8
KW
4160 if (LIKELY(*d != LATIN_SMALL_LETTER_Y_WITH_DIAERESIS)) {
4161 continue;
4162 }
00f254e2
KW
4163
4164 /* The mainstream case is the tight loop above. To avoid
4165 * extra tests in that, all three characters that require
4166 * special handling are mapped by the MOD to the one tested
4167 * just above.
4168 * Use the source to distinguish between the three cases */
4169
79e064b9
KW
4170#if UNICODE_MAJOR_VERSION > 2 \
4171 || (UNICODE_MAJOR_VERSION == 2 && UNICODE_DOT_VERSION >= 1 \
4172 && UNICODE_DOT_DOT_VERSION >= 8)
00f254e2
KW
4173 if (*s == LATIN_SMALL_LETTER_SHARP_S) {
4174
4175 /* uc() of this requires 2 characters, but they are
4176 * ASCII. If not enough room, grow the string */
4177 if (SvLEN(dest) < ++min) {
4178 const UV o = d - (U8*)SvPVX_const(dest);
10656159 4179 d = o + (U8*) SvGROW(dest, min);
00f254e2
KW
4180 }
4181 *d++ = 'S'; *d = 'S'; /* upper case is 'SS' */
4182 continue; /* Back to the tight loop; still in ASCII */
4183 }
79e064b9 4184#endif
00f254e2
KW
4185
4186 /* The other two special handling characters have their
4187 * upper cases outside the latin1 range, hence need to be
4188 * in UTF-8, so the whole result needs to be in UTF-8. So,
4189 * here we are somewhere in the middle of processing a
4190 * non-UTF-8 string, and realize that we will have to convert
4191 * the whole thing to UTF-8. What to do? There are
4192 * several possibilities. The simplest to code is to
4193 * convert what we have so far, set a flag, and continue on
4194 * in the loop. The flag would be tested each time through
4195 * the loop, and if set, the next character would be
4196 * converted to UTF-8 and stored. But, I (khw) didn't want
4197 * to slow down the mainstream case at all for this fairly
4198 * rare case, so I didn't want to add a test that didn't
4199 * absolutely have to be there in the loop, besides the
4200 * possibility that it would get too complicated for
4201 * optimizers to deal with. Another possibility is to just
4202 * give up, convert the source to UTF-8, and restart the
4203 * function that way. Another possibility is to convert
4204 * both what has already been processed and what is yet to
4205 * come separately to UTF-8, then jump into the loop that
4206 * handles UTF-8. But the most efficient time-wise of the
4207 * ones I could think of is what follows, and turned out to
4208 * not require much extra code. */
4209
4210 /* Convert what we have so far into UTF-8, telling the
4211 * function that we know it should be converted, and to
4212 * allow extra space for what we haven't processed yet.
4213 * Assume the worst case space requirements for converting
4214 * what we haven't processed so far: that it will require
4215 * two bytes for each remaining source character, plus the
4216 * NUL at the end. This may cause the string pointer to
4217 * move, so re-find it. */
4218
4219 len = d - (U8*)SvPVX_const(dest);
4220 SvCUR_set(dest, len);
4221 len = sv_utf8_upgrade_flags_grow(dest,
4222 SV_GMAGIC|SV_FORCE_UTF8_UPGRADE,
4223 (send -s) * 2 + 1);
4224 d = (U8*)SvPVX(dest) + len;
4225
00f254e2
KW
4226 /* Now process the remainder of the source, converting to
4227 * upper and UTF-8. If a resulting byte is invariant in
4228 * UTF-8, output it as-is, otherwise convert to UTF-8 and
4229 * append it to the output. */
00f254e2 4230 for (; s < send; s++) {
0ecfbd28
KW
4231 (void) _to_upper_title_latin1(*s, d, &len, 'S');
4232 d += len;
00f254e2
KW
4233 }
4234
4235 /* Here have processed the whole source; no need to continue
4236 * with the outer loop. Each character has been converted
4237 * to upper case and converted to UTF-8 */
4238
4239 break;
4240 } /* End of processing all latin1-style chars */
4241 } /* End of processing all chars */
4242 } /* End of source is not empty */
4243
67306194 4244 if (source != dest) {
00f254e2 4245 *d = '\0'; /* Here d points to 1 after last char, add NUL */
67306194
NC
4246 SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
4247 }
00f254e2 4248 } /* End of isn't utf8 */
130c5df3 4249#ifdef USE_LOCALE_CTYPE
d6ded950 4250 if (IN_LC_RUNTIME(LC_CTYPE)) {
445bf929
KW
4251 TAINT;
4252 SvTAINTED_on(dest);
4253 }
130c5df3 4254#endif
539689e7
FC
4255 if (dest != source && SvTAINTED(source))
4256 SvTAINT(dest);
67306194 4257 SvSETMAGIC(dest);
3cb4e04f 4258 return NORMAL;
79072805
LW
4259}
4260
4261PP(pp_lc)
4262{
39644a26 4263 dSP;
ec9af7d4 4264 SV *source = TOPs;
463ee0b2 4265 STRLEN len;
ec9af7d4
NC
4266 STRLEN min;
4267 SV *dest;
4268 const U8 *s;
4269 U8 *d;
79072805 4270
ec9af7d4
NC
4271 SvGETMAGIC(source);
4272
1921e031 4273 if ( SvPADTMP(source)
5cd5e2d6
FC
4274 && !SvREADONLY(source) && SvPOK(source)
4275 && !DO_UTF8(source)) {
ec9af7d4 4276
00f254e2
KW
4277 /* We can convert in place, as lowercasing anything in the latin1 range
4278 * (or else DO_UTF8 would have been on) doesn't lengthen it */
ec9af7d4
NC
4279 dest = source;
4280 s = d = (U8*)SvPV_force_nomg(source, len);
4281 min = len + 1;
4282 } else {
a0ed51b3 4283 dTARGET;
a0ed51b3 4284
ec9af7d4
NC
4285 dest = TARG;
4286
841a5e18 4287 s = (const U8*)SvPV_nomg_const(source, len);
ec9af7d4 4288 min = len + 1;
128c9517 4289
ec9af7d4 4290 SvUPGRADE(dest, SVt_PV);
3b416f41 4291 d = (U8*)SvGROW(dest, min);
ec9af7d4
NC
4292 (void)SvPOK_only(dest);
4293
4294 SETs(dest);
4295 }
4296
4297 /* Overloaded values may have toggled the UTF-8 flag on source, so we need
4298 to check DO_UTF8 again here. */
4299
4300 if (DO_UTF8(source)) {
4301 const U8 *const send = s + len;
4302 U8 tmpbuf[UTF8_MAXBYTES_CASE+1];
4303
4304 while (s < send) {
06b5486a
KW
4305 const STRLEN u = UTF8SKIP(s);
4306 STRLEN ulen;
00f254e2 4307
130c5df3 4308#ifdef USE_LOCALE_CTYPE
5a6bb681 4309 _to_utf8_lower_flags(s, tmpbuf, &ulen, IN_LC_RUNTIME(LC_CTYPE));
130c5df3 4310#else
5a6bb681 4311 _to_utf8_lower_flags(s, tmpbuf, &ulen, 0);
130c5df3 4312#endif
00f254e2 4313
06b5486a 4314 /* Here is where we would do context-sensitive actions. See the
6006ebd0 4315 * commit message for 86510fb15 for why there isn't any */
00f254e2 4316
06b5486a 4317 if (ulen > u && (SvLEN(dest) < (min += ulen - u))) {
fdb34c52 4318
06b5486a
KW
4319 /* If the eventually required minimum size outgrows the
4320 * available space, we need to grow. */
4321 const UV o = d - (U8*)SvPVX_const(dest);
fdb34c52 4322
06b5486a
KW
4323 /* If someone lowercases one million U+0130s we SvGROW() one
4324 * million times. Or we could try guessing how much to
4325 * allocate without allocating too much. Such is life.
4326 * Another option would be to grow an extra byte or two more
4327 * each time we need to grow, which would cut down the million
4328 * to 500K, with little waste */
10656159 4329 d = o + (U8*) SvGROW(dest, min);
06b5486a 4330 }
86510fb1 4331
06b5486a
KW
4332 /* Copy the newly lowercased letter to the output buffer we're
4333 * building */
4334 Copy(tmpbuf, d, ulen, U8);
4335 d += ulen;
4336 s += u;
00f254e2 4337 } /* End of looping through the source string */
ec9af7d4
NC
4338 SvUTF8_on(dest);
4339 *d = '\0';
4340 SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
00f254e2 4341 } else { /* Not utf8 */
31351b04 4342 if (len) {
ec9af7d4 4343 const U8 *const send = s + len;
00f254e2
KW
4344
4345 /* Use locale casing if in locale; regular style if not treating
4346 * latin1 as having case; otherwise the latin1 casing. Do the
4347 * whole thing in a tight loop, for speed, */
130c5df3 4348#ifdef USE_LOCALE_CTYPE
d6ded950 4349 if (IN_LC_RUNTIME(LC_CTYPE)) {
780fcc9f 4350 _CHECK_AND_WARN_PROBLEMATIC_LOCALE;
ec9af7d4
NC
4351 for (; s < send; d++, s++)
4352 *d = toLOWER_LC(*s);
445bf929 4353 }
130c5df3
KW
4354 else
4355#endif
4356 if (! IN_UNI_8_BIT) {
00f254e2 4357 for (; s < send; d++, s++) {
ec9af7d4 4358 *d = toLOWER(*s);
00f254e2
KW
4359 }
4360 }
4361 else {
4362 for (; s < send; d++, s++) {
4363 *d = toLOWER_LATIN1(*s);
4364 }
31351b04 4365 }
bbce6d69 4366 }
ec9af7d4
NC
4367 if (source != dest) {
4368 *d = '\0';
4369 SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
4370 }
79072805 4371 }
130c5df3 4372#ifdef USE_LOCALE_CTYPE
d6ded950 4373 if (IN_LC_RUNTIME(LC_CTYPE)) {
445bf929
KW
4374 TAINT;
4375 SvTAINTED_on(dest);
4376 }
130c5df3 4377#endif
539689e7
FC
4378 if (dest != source && SvTAINTED(source))
4379 SvTAINT(dest);
ec9af7d4 4380 SvSETMAGIC(dest);
3cb4e04f 4381 return NORMAL;
79072805
LW
4382}
4383
a0d0e21e 4384PP(pp_quotemeta)
79072805 4385{
20b7effb 4386 dSP; dTARGET;
1b6737cc 4387 SV * const sv = TOPs;
a0d0e21e 4388 STRLEN len;
eb578fdb 4389 const char *s = SvPV_const(sv,len);
79072805 4390
7e2040f0 4391 SvUTF8_off(TARG); /* decontaminate */
a0d0e21e 4392 if (len) {
eb578fdb 4393 char *d;
862a34c6 4394 SvUPGRADE(TARG, SVt_PV);
c07a80fd 4395 SvGROW(TARG, (len * 2) + 1);
a0d0e21e 4396 d = SvPVX(TARG);
7e2040f0 4397 if (DO_UTF8(sv)) {
0dd2cdef 4398 while (len) {
29050de5 4399 STRLEN ulen = UTF8SKIP(s);
2e2b2571
KW
4400 bool to_quote = FALSE;
4401
4402 if (UTF8_IS_INVARIANT(*s)) {
4403 if (_isQUOTEMETA(*s)) {
4404 to_quote = TRUE;
4405 }
4406 }
4407 else if (UTF8_IS_DOWNGRADEABLE_START(*s)) {
3fea7d29 4408 if (
130c5df3 4409#ifdef USE_LOCALE_CTYPE
20adcf7c
KW
4410 /* In locale, we quote all non-ASCII Latin1 chars.
4411 * Otherwise use the quoting rules */
3fea7d29
BF
4412
4413 IN_LC_RUNTIME(LC_CTYPE)
4414 ||
4415#endif
a62b247b 4416 _isQUOTEMETA(EIGHT_BIT_UTF8_TO_NATIVE(*s, *(s + 1))))
2e2b2571
KW
4417 {
4418 to_quote = TRUE;
4419 }
4420 }
685289b5 4421 else if (is_QUOTEMETA_high(s)) {
2e2b2571
KW
4422 to_quote = TRUE;
4423 }
4424
4425 if (to_quote) {
4426 *d++ = '\\';
4427 }
29050de5
KW
4428 if (ulen > len)
4429 ulen = len;
4430 len -= ulen;
4431 while (ulen--)
4432 *d++ = *s++;
0dd2cdef 4433 }
7e2040f0 4434 SvUTF8_on(TARG);
0dd2cdef 4435 }
2e2b2571
KW
4436 else if (IN_UNI_8_BIT) {
4437 while (len--) {
4438 if (_isQUOTEMETA(*s))
4439 *d++ = '\\';
4440 *d++ = *s++;
4441 }
4442 }
0dd2cdef 4443 else {
2e2b2571
KW
4444 /* For non UNI_8_BIT (and hence in locale) just quote all \W
4445 * including everything above ASCII */
0dd2cdef 4446 while (len--) {
adfec831 4447 if (!isWORDCHAR_A(*s))
0dd2cdef
LW
4448 *d++ = '\\';
4449 *d++ = *s++;
4450 }
79072805 4451 }
a0d0e21e 4452 *d = '\0';
349d4f2f 4453 SvCUR_set(TARG, d - SvPVX_const(TARG));
3aa33fe5 4454 (void)SvPOK_only_UTF8(TARG);
79072805 4455 }
a0d0e21e
LW
4456 else
4457 sv_setpvn(TARG, s, len);
ec93b65f 4458 SETTARG;
cfe40115 4459 return NORMAL;
79072805
LW
4460}
4461
838f2281
BF
4462PP(pp_fc)
4463{
838f2281
BF
4464 dTARGET;
4465 dSP;
4466 SV *source = TOPs;
4467 STRLEN len;
4468 STRLEN min;
4469 SV *dest;
4470 const U8 *s;
4471 const U8 *send;
4472 U8 *d;
bfac13d4 4473 U8 tmpbuf[UTF8_MAXBYTES_CASE + 1];
9b63e895
KW
4474#if UNICODE_MAJOR_VERSION > 3 /* no multifolds in early Unicode */ \
4475 || (UNICODE_MAJOR_VERSION == 3 && ( UNICODE_DOT_VERSION > 0) \
4476 || UNICODE_DOT_DOT_VERSION > 0)
a4b69695
KW
4477 const bool full_folding = TRUE; /* This variable is here so we can easily
4478 move to more generality later */
9b63e895
KW
4479#else
4480 const bool full_folding = FALSE;
4481#endif
838f2281 4482 const U8 flags = ( full_folding ? FOLD_FLAGS_FULL : 0 )
130c5df3
KW
4483#ifdef USE_LOCALE_CTYPE
4484 | ( IN_LC_RUNTIME(LC_CTYPE) ? FOLD_FLAGS_LOCALE : 0 )
4485#endif
4486 ;
838f2281
BF
4487
4488 /* This is a facsimile of pp_lc, but with a thousand bugs thanks to me.
4489 * You are welcome(?) -Hugmeir
4490 */
4491
4492 SvGETMAGIC(source);
4493
4494 dest = TARG;
4495
4496 if (SvOK(source)) {
4497 s = (const U8*)SvPV_nomg_const(source, len);
4498 } else {
4499 if (ckWARN(WARN_UNINITIALIZED))
4500 report_uninit(source);
4501 s = (const U8*)"";
4502 len = 0;
4503 }
4504
4505 min = len + 1;
4506
4507 SvUPGRADE(dest, SVt_PV);
4508 d = (U8*)SvGROW(dest, min);
4509 (void)SvPOK_only(dest);
4510
4511 SETs(dest);
4512
4513 send = s + len;
4514 if (DO_UTF8(source)) { /* UTF-8 flagged string. */
838f2281
BF
4515 while (s < send) {
4516 const STRLEN u = UTF8SKIP(s);
4517 STRLEN ulen;
4518
445bf929 4519 _to_utf8_fold_flags(s, tmpbuf, &ulen, flags);
838f2281
BF
4520
4521 if (ulen > u && (SvLEN(dest) < (min += ulen - u))) {
4522 const UV o = d - (U8*)SvPVX_const(dest);
10656159 4523 d = o + (U8*) SvGROW(dest, min);
838f2281
BF
4524 }
4525
4526 Copy(tmpbuf, d, ulen, U8);
4527 d += ulen;
4528 s += u;
4529 }
4530 SvUTF8_on(dest);
838f2281 4531 } /* Unflagged string */
0902dd32 4532 else if (len) {
130c5df3 4533#ifdef USE_LOCALE_CTYPE
d6ded950 4534 if ( IN_LC_RUNTIME(LC_CTYPE) ) { /* Under locale */
31f05a37
KW
4535 if (IN_UTF8_CTYPE_LOCALE) {
4536 goto do_uni_folding;
4537 }
780fcc9f 4538 _CHECK_AND_WARN_PROBLEMATIC_LOCALE;
838f2281 4539 for (; s < send; d++, s++)
ea36a843 4540 *d = (U8) toFOLD_LC(*s);
838f2281 4541 }
130c5df3
KW
4542 else
4543#endif
4544 if ( !IN_UNI_8_BIT ) { /* Under nothing, or bytes */
838f2281 4545 for (; s < send; d++, s++)
d22b930b 4546 *d = toFOLD(*s);
838f2281
BF
4547 }
4548 else {
91191cf7 4549#ifdef USE_LOCALE_CTYPE
31f05a37 4550 do_uni_folding:
91191cf7 4551#endif
d14578b8
KW
4552 /* For ASCII and the Latin-1 range, there's only two troublesome
4553 * folds, \x{DF} (\N{LATIN SMALL LETTER SHARP S}), which under full
22e255cb 4554 * casefolding becomes 'ss'; and \x{B5} (\N{MICRO SIGN}), which
d14578b8
KW
4555 * under any fold becomes \x{3BC} (\N{GREEK SMALL LETTER MU}) --
4556 * For the rest, the casefold is their lowercase. */
838f2281
BF
4557 for (; s < send; d++, s++) {
4558 if (*s == MICRO_SIGN) {
d14578b8
KW
4559 /* \N{MICRO SIGN}'s casefold is \N{GREEK SMALL LETTER MU},
4560 * which is outside of the latin-1 range. There's a couple
4561 * of ways to deal with this -- khw discusses them in
4562 * pp_lc/uc, so go there :) What we do here is upgrade what
4563 * we had already casefolded, then enter an inner loop that
4564 * appends the rest of the characters as UTF-8. */
838f2281
BF
4565 len = d - (U8*)SvPVX_const(dest);
4566 SvCUR_set(dest, len);
4567 len = sv_utf8_upgrade_flags_grow(dest,
4568 SV_GMAGIC|SV_FORCE_UTF8_UPGRADE,
ea4d335b
KW
4569 /* The max expansion for latin1
4570 * chars is 1 byte becomes 2 */
4571 (send -s) * 2 + 1);
838f2281
BF
4572 d = (U8*)SvPVX(dest) + len;
4573
a78bc3c6
KW
4574 Copy(GREEK_SMALL_LETTER_MU_UTF8, d, small_mu_len, U8);
4575 d += small_mu_len;
838f2281
BF
4576 s++;
4577 for (; s < send; s++) {
4578 STRLEN ulen;
4579 UV fc = _to_uni_fold_flags(*s, tmpbuf, &ulen, flags);
6f2d5cbc 4580 if UVCHR_IS_INVARIANT(fc) {
d14578b8
KW
4581 if (full_folding
4582 && *s == LATIN_SMALL_LETTER_SHARP_S)
4583 {
838f2281
BF
4584 *d++ = 's';
4585 *d++ = 's';
4586 }
4587 else
4588 *d++ = (U8)fc;
4589 }
4590 else {
4591 Copy(tmpbuf, d, ulen, U8);
4592 d += ulen;
4593 }
4594 }
4595 break;
4596 }
4597 else if (full_folding && *s == LATIN_SMALL_LETTER_SHARP_S) {
d14578b8
KW
4598 /* Under full casefolding, LATIN SMALL LETTER SHARP S
4599 * becomes "ss", which may require growing the SV. */
838f2281
BF
4600 if (SvLEN(dest) < ++min) {
4601 const UV o = d - (U8*)SvPVX_const(dest);
10656159 4602 d = o + (U8*) SvGROW(dest, min);
838f2281
BF
4603 }
4604 *(d)++ = 's';
4605 *d = 's';
4606 }
d14578b8
KW
4607 else { /* If it's not one of those two, the fold is their lower
4608 case */
838f2281
BF
4609 *d = toLOWER_LATIN1(*s);
4610 }
4611 }
4612 }
4613 }
4614 *d = '\0';
4615 SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
4616
130c5df3 4617#ifdef USE_LOCALE_CTYPE
d6ded950 4618 if (IN_LC_RUNTIME(LC_CTYPE)) {
445bf929
KW
4619 TAINT;
4620 SvTAINTED_on(dest);
4621 }
130c5df3 4622#endif
838f2281
BF
4623 if (SvTAINTED(source))
4624 SvTAINT(dest);
4625 SvSETMAGIC(dest);
4626 RETURN;
4627}
4628
a0d0e21e 4629/* Arrays. */
79072805 4630
a0d0e21e 4631PP(pp_aslice)
79072805 4632{
20b7effb 4633 dSP; dMARK; dORIGMARK;
eb578fdb
KW
4634 AV *const av = MUTABLE_AV(POPs);
4635 const I32 lval = (PL_op->op_flags & OPf_MOD || LVRET);
79072805 4636
a0d0e21e 4637 if (SvTYPE(av) == SVt_PVAV) {
4ad10a0b
VP
4638 const bool localizing = PL_op->op_private & OPpLVAL_INTRO;
4639 bool can_preserve = FALSE;
4640
4641 if (localizing) {
4642 MAGIC *mg;
4643 HV *stash;
4644
4645 can_preserve = SvCANEXISTDELETE(av);
4646 }
4647
4648 if (lval && localizing) {
eb578fdb 4649 SV **svp;
c70927a6 4650 SSize_t max = -1;
924508f0 4651 for (svp = MARK + 1; svp <= SP; svp++) {
c70927a6 4652 const SSize_t elem = SvIV(*svp);
748a9306
LW
4653 if (elem > max)
4654 max = elem;
4655 }
4656 if (max > AvMAX(av))
4657 av_extend(av, max);
4658 }
4ad10a0b 4659
a0d0e21e 4660 while (++MARK <= SP) {
eb578fdb 4661 SV **svp;
c70927a6 4662 SSize_t elem = SvIV(*MARK);
4ad10a0b 4663 bool preeminent = TRUE;
a0d0e21e 4664
4ad10a0b
VP
4665 if (localizing && can_preserve) {
4666 /* If we can determine whether the element exist,
4667 * Try to preserve the existenceness of a tied array
4668 * element by using EXISTS and DELETE if possible.
4669 * Fallback to FETCH and STORE otherwise. */
4670 preeminent = av_exists(av, elem);
4671 }
4672
a0d0e21e
LW
4673 svp = av_fetch(av, elem, lval);
4674 if (lval) {
ce0d59fd 4675 if (!svp || !*svp)
cea2e8a9 4676 DIE(aTHX_ PL_no_aelem, elem);
4ad10a0b
VP
4677 if (localizing) {
4678 if (preeminent)
4679 save_aelem(av, elem, svp);
4680 else
4681 SAVEADELETE(av, elem);
4682 }
79072805 4683 }
3280af22 4684 *MARK = svp ? *svp : &PL_sv_undef;
79072805
LW
4685 }
4686 }
82334630 4687 if (GIMME_V != G_ARRAY) {
a0d0e21e 4688 MARK = ORIGMARK;
04ab2c87 4689 *++MARK = SP > ORIGMARK ? *SP : &PL_sv_undef;
a0d0e21e
LW
4690 SP = MARK;
4691 }
79072805
LW
4692 RETURN;
4693}
4694
6dd3e0f2
RZ
4695PP(pp_kvaslice)
4696{
20b7effb 4697 dSP; dMARK;
6dd3e0f2
RZ
4698 AV *const av = MUTABLE_AV(POPs);
4699 I32 lval = (PL_op->op_flags & OPf_MOD);
adad97db 4700 SSize_t items = SP - MARK;
6dd3e0f2
RZ
4701
4702 if (PL_op->op_private & OPpMAYBE_LVSUB) {
4703 const I32 flags = is_lvalue_sub();
4704 if (flags) {
4705 if (!(flags & OPpENTERSUB_INARGS))
7aae0299 4706 /* diag_listed_as: Can't modify %s in %s */
6dd3e0f2
RZ
4707 Perl_croak(aTHX_ "Can't modify index/value array slice in list assignment");
4708 lval = flags;
4709 }
4710 }
4711
4712 MEXTEND(SP,items);
4713 while (items > 1) {
4714 *(MARK+items*2-1) = *(MARK+items);
4715 items--;
4716 }
4717 items = SP-MARK;
4718 SP += items;
4719
4720 while (++MARK <= SP) {
4721 SV **svp;
4722
4723 svp = av_fetch(av, SvIV(*MARK), lval);
4724 if (lval) {
4725 if (!svp || !*svp || *svp == &PL_sv_undef) {
4726 DIE(aTHX_ PL_no_aelem, SvIV(*MARK));
4727 }
4728 *MARK = sv_mortalcopy(*MARK);
4729 }
4730 *++MARK = svp ? *svp : &PL_sv_undef;
4731 }
82334630 4732 if (GIMME_V != G_ARRAY) {
6dd3e0f2
RZ
4733 MARK = SP - items*2;
4734 *++MARK = items > 0 ? *SP : &PL_sv_undef;
4735 SP = MARK;
4736 }
4737 RETURN;
4738}
4739
b1c05ba5 4740
878d132a
NC
4741PP(pp_aeach)
4742{
878d132a 4743 dSP;
502c6561 4744 AV *array = MUTABLE_AV(POPs);
1c23e2bd 4745 const U8 gimme = GIMME_V;
453d94a9 4746 IV *iterp = Perl_av_iter_p(aTHX_ array);
878d132a
NC
4747 const IV current = (*iterp)++;
4748
b9f2b683 4749 if (current > av_tindex(array)) {
878d132a
NC
4750 *iterp = 0;
4751 if (gimme == G_SCALAR)
4752 RETPUSHUNDEF;
4753 else
4754 RETURN;
4755 }
4756
4757 EXTEND(SP, 2);
e1dccc0d 4758 mPUSHi(current);
878d132a
NC
4759 if (gimme == G_ARRAY) {
4760 SV **const element = av_fetch(array, current, 0);
4761 PUSHs(element ? *element : &PL_sv_undef);
4762 }
4763 RETURN;
4764}
4765
b1c05ba5 4766/* also used for: pp_avalues()*/
878d132a
NC
4767PP(pp_akeys)
4768{
878d132a 4769 dSP;
502c6561 4770 AV *array = MUTABLE_AV(POPs);
1c23e2bd 4771 const U8 gimme = GIMME_V;
878d132a
NC
4772
4773 *Perl_av_iter_p(aTHX_ array) = 0;
4774
4775 if (gimme == G_SCALAR) {
4776 dTARGET;
b9f2b683 4777 PUSHi(av_tindex(array) + 1);
878d132a
NC
4778 }
4779 else if (gimme == G_ARRAY) {
738155d2
FC
4780 if (UNLIKELY(PL_op->op_private & OPpMAYBE_LVSUB)) {
4781 const I32 flags = is_lvalue_sub();
4782 if (flags && !(flags & OPpENTERSUB_INARGS))
4783 /* diag_listed_as: Can't modify %s in %s */
4784 Perl_croak(aTHX_
4785 "Can't modify keys on array in list assignment");
4786 }
4787 {
878d132a 4788 IV n = Perl_av_len(aTHX_ array);
e1dccc0d 4789 IV i;
878d132a
NC
4790
4791 EXTEND(SP, n + 1);
4792
73665bc4
FC
4793 if ( PL_op->op_type == OP_AKEYS
4794 || ( PL_op->op_type == OP_AVHVSWITCH
cd642408 4795 && (PL_op->op_private & 3) + OP_AEACH == OP_AKEYS ))
73665bc4 4796 {
e1dccc0d 4797 for (i = 0; i <= n; i++) {
878d132a
NC
4798 mPUSHi(i);
4799 }
4800 }
4801 else {
4802 for (i = 0; i <= n; i++) {
4803 SV *const *const elem = Perl_av_fetch(aTHX_ array, i, 0);
4804 PUSHs(elem ? *elem : &PL_sv_undef);
4805 }
4806 }
738155d2 4807 }
878d132a
NC
4808 }
4809 RETURN;
4810}
4811
79072805
LW
4812/* Associative arrays. */
4813
4814PP(pp_each)
4815{
39644a26 4816 dSP;
85fbaab2 4817 HV * hash = MUTABLE_HV(POPs);
c07a80fd 4818 HE *entry;
1c23e2bd 4819 const U8 gimme = GIMME_V;
8ec5e241 4820
6d822dc4 4821 entry = hv_iternext(hash);
79072805 4822
79072805
LW
4823 EXTEND(SP, 2);
4824 if (entry) {
1b6737cc 4825 SV* const sv = hv_iterkeysv(entry);
2b32fed8 4826 PUSHs(sv);
54310121 4827 if (gimme == G_ARRAY) {
59af0135 4828 SV *val;
6d822dc4 4829 val = hv_iterval(hash, entry);
59af0135 4830 PUSHs(val);
79072805 4831 }
79072805 4832 }
54310121 4833 else if (gimme == G_SCALAR)
79072805
LW
4834 RETPUSHUNDEF;
4835
4836 RETURN;
4837}
4838
7332a6c4
VP
4839STATIC OP *
4840S_do_delete_local(pTHX)
79072805 4841{
39644a26 4842 dSP;
1c23e2bd 4843 const U8 gimme = GIMME_V;
7332a6c4
VP
4844 const MAGIC *mg;
4845 HV *stash;
ca3f996a 4846 const bool sliced = !!(PL_op->op_private & OPpSLICE);
626040f7 4847 SV **unsliced_keysv = sliced ? NULL : sp--;
ca3f996a 4848 SV * const osv = POPs;
626040f7 4849 SV **mark = sliced ? PL_stack_base + POPMARK : unsliced_keysv-1;
ca3f996a
FC
4850 dORIGMARK;
4851 const bool tied = SvRMAGICAL(osv)
7332a6c4 4852 && mg_find((const SV *)osv, PERL_MAGIC_tied);
ca3f996a
FC
4853 const bool can_preserve = SvCANEXISTDELETE(osv);
4854 const U32 type = SvTYPE(osv);
626040f7 4855 SV ** const end = sliced ? SP : unsliced_keysv;
ca3f996a
FC
4856
4857 if (type == SVt_PVHV) { /* hash element */
7332a6c4 4858 HV * const hv = MUTABLE_HV(osv);
ca3f996a 4859 while (++MARK <= end) {
7332a6c4
VP
4860 SV * const keysv = *MARK;
4861 SV *sv = NULL;
4862 bool preeminent = TRUE;
4863 if (can_preserve)
4864 preeminent = hv_exists_ent(hv, keysv, 0);
4865 if (tied) {
4866 HE *he = hv_fetch_ent(hv, keysv, 1, 0);
4867 if (he)
4868 sv = HeVAL(he);
4869 else
4870 preeminent = FALSE;
4871 }
4872 else {
4873 sv = hv_delete_ent(hv, keysv, 0, 0);
9332b95f
FC
4874 if (preeminent)
4875 SvREFCNT_inc_simple_void(sv); /* De-mortalize */
7332a6c4
VP
4876 }
4877 if (preeminent) {
be6064fd 4878 if (!sv) DIE(aTHX_ PL_no_helem_sv, SVfARG(keysv));
7332a6c4
VP
4879 save_helem_flags(hv, keysv, &sv, SAVEf_KEEPOLDELEM);
4880 if (tied) {
4881 *MARK = sv_mortalcopy(sv);
4882 mg_clear(sv);
4883 } else
4884 *MARK = sv;
4885 }
4886 else {
4887 SAVEHDELETE(hv, keysv);
4888 *MARK = &PL_sv_undef;
4889 }
4890 }
ca3f996a
FC
4891 }
4892 else if (type == SVt_PVAV) { /* array element */
7332a6c4
VP
4893 if (PL_op->op_flags & OPf_SPECIAL) {
4894 AV * const av = MUTABLE_AV(osv);
ca3f996a 4895 while (++MARK <= end) {
c70927a6 4896 SSize_t idx = SvIV(*MARK);
7332a6c4
VP
4897 SV *sv = NULL;
4898 bool preeminent = TRUE;
4899 if (can_preserve)
4900 preeminent = av_exists(av, idx);
4901 if (tied) {
4902 SV **svp = av_fetch(av, idx, 1);
4903 if (svp)
4904 sv = *svp;
4905 else
4906 preeminent = FALSE;
4907 }
4908 else {
4909 sv = av_delete(av, idx, 0);
9332b95f
FC
4910 if (preeminent)
4911 SvREFCNT_inc_simple_void(sv); /* De-mortalize */
7332a6c4
VP
4912 }
4913 if (preeminent) {
4914 save_aelem_flags(av, idx, &sv, SAVEf_KEEPOLDELEM);
4915 if (tied) {
4916 *MARK = sv_mortalcopy(sv);
4917 mg_clear(sv);
4918 } else
4919 *MARK = sv;
4920 }
4921 else {
4922 SAVEADELETE(av, idx);
4923 *MARK = &PL_sv_undef;
4924 }
4925 }
4926 }
ca3f996a
FC
4927 else
4928 DIE(aTHX_ "panic: avhv_delete no longer supported");
4929 }
4930 else
7332a6c4 4931 DIE(aTHX_ "Not a HASH reference");
ca3f996a 4932 if (sliced) {
7332a6c4
VP
4933 if (gimme == G_VOID)
4934 SP = ORIGMARK;
4935 else if (gimme == G_SCALAR) {
4936 MARK = ORIGMARK;
4937 if (SP > MARK)
4938 *++MARK = *SP;
4939 else
4940 *++MARK = &PL_sv_undef;
4941 SP = MARK;
4942 }
4943 }
ca3f996a 4944 else if (gimme != G_VOID)
626040f7 4945 PUSHs(*unsliced_keysv);
7332a6c4
VP
4946
4947 RETURN;
4948}
4949
4950PP(pp_delete)
4951{
7332a6c4 4952 dSP;
1c23e2bd 4953 U8 gimme;
7332a6c4
VP
4954 I32 discard;
4955
4956 if (PL_op->op_private & OPpLVAL_INTRO)
4957 return do_delete_local();
4958
4959 gimme = GIMME_V;
4960 discard = (gimme == G_VOID) ? G_DISCARD : 0;
5f05dabc 4961
533c011a 4962 if (PL_op->op_private & OPpSLICE) {
5f05dabc 4963 dMARK; dORIGMARK;
85fbaab2 4964 HV * const hv = MUTABLE_HV(POPs);
1b6737cc 4965 const U32 hvtype = SvTYPE(hv);
01020589
GS
4966 if (hvtype == SVt_PVHV) { /* hash element */
4967 while (++MARK <= SP) {
1b6737cc 4968 SV * const sv = hv_delete_ent(hv, *MARK, discard, 0);
01020589
GS
4969 *MARK = sv ? sv : &PL_sv_undef;
4970 }
5f05dabc 4971 }
6d822dc4
MS
4972 else if (hvtype == SVt_PVAV) { /* array element */
4973 if (PL_op->op_flags & OPf_SPECIAL) {
4974 while (++MARK <= SP) {
502c6561 4975 SV * const sv = av_delete(MUTABLE_AV(hv), SvIV(*MARK), discard);
6d822dc4
MS
4976 *MARK = sv ? sv : &PL_sv_undef;
4977 }
4978 }
01020589
GS
4979 }
4980 else
4981 DIE(aTHX_ "Not a HASH reference");
54310121 4982 if (discard)
4983 SP = ORIGMARK;
4984 else if (gimme == G_SCALAR) {
5f05dabc 4985 MARK = ORIGMARK;
9111c9c0
DM
4986 if (SP > MARK)
4987 *++MARK = *SP;
4988 else
4989 *++MARK = &PL_sv_undef;
5f05dabc 4990 SP = MARK;
4991 }
4992 }
4993 else {
4994 SV *keysv = POPs;
85fbaab2 4995 HV * const hv = MUTABLE_HV(POPs);
295d248e 4996 SV *sv = NULL;
97fcbf96
MB
4997 if (SvTYPE(hv) == SVt_PVHV)
4998 sv = hv_delete_ent(hv, keysv, discard, 0);
01020589
GS
4999 else if (SvTYPE(hv) == SVt_PVAV) {
5000 if (PL_op->op_flags & OPf_SPECIAL)
502c6561 5001 sv = av_delete(MUTABLE_AV(hv), SvIV(keysv), discard);
af288a60
HS
5002 else
5003 DIE(aTHX_ "panic: avhv_delete no longer supported");
01020589 5004 }
97fcbf96 5005 else
cea2e8a9 5006 DIE(aTHX_ "Not a HASH reference");
5f05dabc 5007 if (!sv)
3280af22 5008 sv = &PL_sv_undef;
54310121 5009 if (!discard)
5010 PUSHs(sv);
79072805 5011 }
79072805
LW
5012 RETURN;
5013}
5014
a0d0e21e 5015PP(pp_exists)
79072805 5016{
39644a26 5017 dSP;
afebc493
GS
5018 SV *tmpsv;
5019 HV *hv;
5020
c7e88ff3 5021 if (UNLIKELY( PL_op->op_private & OPpEXISTS_SUB )) {
afebc493 5022 GV *gv;
0bd48802 5023 SV * const sv = POPs;
f2c0649b 5024 CV * const cv = sv_2cv(sv, &hv, &gv, 0);
afebc493
GS
5025 if (cv)
5026 RETPUSHYES;
5027 if (gv && isGV(gv) && GvCV(gv) && !GvCVGEN(gv))
5028 RETPUSHYES;
5029 RETPUSHNO;
5030 }
5031 tmpsv = POPs;
85fbaab2 5032 hv = MUTABLE_HV(POPs);
c7e88ff3 5033 if (LIKELY( SvTYPE(hv) == SVt_PVHV )) {
ae77835f 5034 if (hv_exists_ent(hv, tmpsv, 0))
c750a3ec 5035 RETPUSHYES;
ef54e1a4
JH
5036 }
5037 else if (SvTYPE(hv) == SVt_PVAV) {
01020589 5038 if (PL_op->op_flags & OPf_SPECIAL) { /* array element */
502c6561 5039 if (av_exists(MUTABLE_AV(hv), SvIV(tmpsv)))
01020589
GS
5040 RETPUSHYES;
5041 }
ef54e1a4
JH
5042 }
5043 else {
cea2e8a9 5044 DIE(aTHX_ "Not a HASH reference");
a0d0e21e 5045 }
a0d0e21e
LW
5046 RETPUSHNO;
5047}
79072805 5048
a0d0e21e
LW
5049PP(pp_hslice)
5050{
20b7effb 5051 dSP; dMARK; dORIGMARK;
eb578fdb
KW
5052 HV * const hv = MUTABLE_HV(POPs);
5053 const I32 lval = (PL_op->op_flags & OPf_MOD || LVRET);
1b6737cc 5054 const bool localizing = PL_op->op_private & OPpLVAL_INTRO;
d30e492c 5055 bool can_preserve = FALSE;
79072805 5056
eb85dfd3
DM
5057 if (localizing) {
5058 MAGIC *mg;
5059 HV *stash;
5060
2c5f48c2 5061 if (SvCANEXISTDELETE(hv))
d30e492c 5062 can_preserve = TRUE;
eb85dfd3
DM
5063 }
5064
6d822dc4 5065 while (++MARK <= SP) {
1b6737cc 5066 SV * const keysv = *MARK;
6d822dc4
MS
5067 SV **svp;
5068 HE *he;
d30e492c
VP
5069 bool preeminent = TRUE;
5070
5071 if (localizing && can_preserve) {
5072 /* If we can determine whether the element exist,
5073 * try to preserve the existenceness of a tied hash
5074 * element by using EXISTS and DELETE if possible.
5075 * Fallback to FETCH and STORE otherwise. */
5076 preeminent = hv_exists_ent(hv, keysv, 0);
6d822dc4 5077 }
eb85dfd3 5078
6d822dc4 5079 he = hv_fetch_ent(hv, keysv, lval, 0);
fe5bfecd 5080 svp = he ? &HeVAL(he) : NULL;
eb85dfd3 5081
6d822dc4 5082 if (lval) {
746f6409 5083 if (!svp || !*svp || *svp == &PL_sv_undef) {
be2597df 5084 DIE(aTHX_ PL_no_helem_sv, SVfARG(keysv));
6d822dc4
MS
5085 }
5086 if (localizing) {
7a2e501a 5087 if (HvNAME_get(hv) && isGV(*svp))
159b6efe 5088 save_gp(MUTABLE_GV(*svp), !(PL_op->op_flags & OPf_SPECIAL));
47cfc530
VP
5089 else if (preeminent)
5090 save_helem_flags(hv, keysv, svp,
5091 (PL_op->op_flags & OPf_SPECIAL) ? 0 : SAVEf_SETMAGIC);
5092 else
5093 SAVEHDELETE(hv, keysv);
6d822dc4
MS
5094 }
5095 }
746f6409 5096 *MARK = svp && *svp ? *svp : &PL_sv_undef;
79072805 5097 }
82334630 5098 if (GIMME_V != G_ARRAY) {
a0d0e21e 5099 MARK = ORIGMARK;
04ab2c87 5100 *++MARK = SP > ORIGMARK ? *SP : &PL_sv_undef;
a0d0e21e 5101 SP = MARK;
79072805 5102 }
a0d0e21e
LW
5103 RETURN;
5104}
5105
5cae3edb
RZ
5106PP(pp_kvhslice)
5107{
20b7effb 5108 dSP; dMARK;
5cae3edb
RZ
5109 HV * const hv = MUTABLE_HV(POPs);
5110 I32 lval = (PL_op->op_flags & OPf_MOD);
adad97db 5111 SSize_t items = SP - MARK;
5cae3edb
RZ
5112
5113 if (PL_op->op_private & OPpMAYBE_LVSUB) {
5114 const I32 flags = is_lvalue_sub();
5115 if (flags) {
5116 if (!(flags & OPpENTERSUB_INARGS))
7aae0299 5117 /* diag_listed_as: Can't modify %s in %s */
cc5f9b8a
FC
5118 Perl_croak(aTHX_ "Can't modify key/value hash slice in %s assignment",
5119 GIMME_V == G_ARRAY ? "list" : "scalar");
5cae3edb
RZ
5120 lval = flags;
5121 }
5122 }
5123
5124 MEXTEND(SP,items);
5125 while (items > 1) {
5126 *(MARK+items*2-1) = *(MARK+items);
5127 items--;
5128 }
5129 items = SP-MARK;
5130 SP += items;
5131
5132 while (++MARK <= SP) {
5133 SV * const keysv = *MARK;
5134 SV **svp;
5135 HE *he;
5136
5137 he = hv_fetch_ent(hv, keysv, lval, 0);
5138 svp = he ? &HeVAL(he) : NULL;
5139
5140 if (lval) {
5141 if (!svp || !*svp || *svp == &PL_sv_undef) {
5142 DIE(aTHX_ PL_no_helem_sv, SVfARG(keysv));
5143 }
5144 *MARK = sv_mortalcopy(*MARK);
5145 }
5146 *++MARK = svp && *svp ? *svp : &PL_sv_undef;
5147 }
82334630 5148 if (GIMME_V != G_ARRAY) {
5cae3edb
RZ
5149 MARK = SP - items*2;
5150 *++MARK = items > 0 ? *SP : &PL_sv_undef;
5151 SP = MARK;
5152 }
5153 RETURN;
5154}
5155
a0d0e21e
LW
5156/* List operators. */
5157
5158PP(pp_list)
5159{
4fa715fa 5160 I32 markidx = POPMARK;
82334630 5161 if (GIMME_V != G_ARRAY) {
4fa715fa
DD
5162 SV **mark = PL_stack_base + markidx;
5163 dSP;
a0d0e21e
LW
5164 if (++MARK <= SP)
5165 *MARK = *SP; /* unwanted list, return last item */
8990e307 5166 else
3280af22 5167 *MARK = &PL_sv_undef;
a0d0e21e 5168 SP = MARK;
4fa715fa 5169 PUTBACK;
79072805 5170 }
4fa715fa 5171 return NORMAL;
79072805
LW
5172}
5173
a0d0e21e 5174PP(pp_lslice)
79072805 5175{
39644a26 5176 dSP;
1b6737cc
AL
5177 SV ** const lastrelem = PL_stack_sp;
5178 SV ** const lastlelem = PL_stack_base + POPMARK;
5179 SV ** const firstlelem = PL_stack_base + POPMARK + 1;
eb578fdb 5180 SV ** const firstrelem = lastlelem + 1;
706a6ebc 5181 const U8 mod = PL_op->op_flags & OPf_MOD;
1b6737cc 5182
eb578fdb
KW
5183 const I32 max = lastrelem - lastlelem;
5184 SV **lelem;
a0d0e21e 5185
82334630 5186 if (GIMME_V != G_ARRAY) {
9e59c36b
TC
5187 if (lastlelem < firstlelem) {
5188 *firstlelem = &PL_sv_undef;
5189 }
5190 else {
5191 I32 ix = SvIV(*lastlelem);
5192 if (ix < 0)
5193 ix += max;
5194 if (ix < 0 || ix >= max)
5195 *firstlelem = &PL_sv_undef;
5196 else
5197 *firstlelem = firstrelem[ix];
5198 }
5199 SP = firstlelem;
5200 RETURN;
a0d0e21e
LW
5201 }
5202
5203 if (max == 0) {
5204 SP = firstlelem - 1;
5205 RETURN;
5206 }
5207
5208 for (lelem = firstlelem; lelem <= lastlelem; lelem++) {
4ea561bc 5209 I32 ix = SvIV(*lelem);
c73bf8e3 5210 if (ix < 0)
a0d0e21e 5211 ix += max;
c73bf8e3
HS
5212 if (ix < 0 || ix >= max)
5213 *lelem = &PL_sv_undef;
5214 else {
c73bf8e3 5215 if (!(*lelem = firstrelem[ix]))
3280af22 5216 *lelem = &PL_sv_undef;
60779a30 5217 else if (mod && SvPADTMP(*lelem)) {
706a6ebc 5218 *lelem = firstrelem[ix] = sv_mortalcopy(*lelem);
60779a30 5219 }
748a9306 5220 }
79072805 5221 }
cbce292e 5222 SP = lastlelem;
79072805
LW
5223 RETURN;
5224}
5225
a0d0e21e
LW
5226PP(pp_anonlist)
5227{
20b7effb 5228 dSP; dMARK;
1b6737cc 5229 const I32 items = SP - MARK;
ad64d0ec 5230 SV * const av = MUTABLE_SV(av_make(items, MARK+1));
31476221 5231 SP = MARK;
6e449a3a
MHM
5232 mXPUSHs((PL_op->op_flags & OPf_SPECIAL)
5233 ? newRV_noinc(av) : av);
a0d0e21e
LW
5234 RETURN;
5235}
5236
5237PP(pp_anonhash)
79072805 5238{
20b7effb 5239 dSP; dMARK; dORIGMARK;
67e67fd7 5240 HV* const hv = newHV();
8d455b9f 5241 SV* const retval = sv_2mortal( PL_op->op_flags & OPf_SPECIAL
67e67fd7 5242 ? newRV_noinc(MUTABLE_SV(hv))
8d455b9f 5243 : MUTABLE_SV(hv) );
a0d0e21e
LW
5244
5245 while (MARK < SP) {
3ed356df
FC
5246 SV * const key =
5247 (MARK++, SvGMAGICAL(*MARK) ? sv_mortalcopy(*MARK) : *MARK);
5248 SV *val;
a0d0e21e 5249 if (MARK < SP)
3ed356df
FC
5250 {
5251 MARK++;
5252 SvGETMAGIC(*MARK);
5253 val = newSV(0);
d187b712 5254 sv_setsv_nomg(val, *MARK);
3ed356df 5255 }
a2a5de95 5256 else
3ed356df 5257 {
a2a5de95 5258 Perl_ck_warner(aTHX_ packWARN(WARN_MISC), "Odd number of elements in anonymous hash");
3ed356df
FC
5259 val = newSV(0);
5260 }
f12c7020 5261 (void)hv_store_ent(hv,key,val,0);
79072805 5262 }
a0d0e21e 5263 SP = ORIGMARK;
8d455b9f 5264 XPUSHs(retval);
79072805
LW
5265 RETURN;
5266}
5267
a0d0e21e 5268PP(pp_splice)
79072805 5269{
20b7effb 5270 dSP; dMARK; dORIGMARK;
5cd408a2 5271 int num_args = (SP - MARK);
00576728 5272 AV *ary = MUTABLE_AV(*++MARK);
eb578fdb
KW
5273 SV **src;
5274 SV **dst;
c70927a6
FC
5275 SSize_t i;
5276 SSize_t offset;
5277 SSize_t length;
5278 SSize_t newlen;
5279 SSize_t after;
5280 SSize_t diff;
ad64d0ec 5281 const MAGIC * const mg = SvTIED_mg((const SV *)ary, PERL_MAGIC_tied);
93965878 5282
1b6737cc 5283 if (mg) {
3e0cb5de 5284 return Perl_tied_method(aTHX_ SV_CONST(SPLICE), mark - 1, MUTABLE_SV(ary), mg,
af71faff
NC
5285 GIMME_V | TIED_METHOD_ARGUMENTS_ON_STACK,
5286 sp - mark);
93965878 5287 }
79072805 5288
a0d0e21e 5289 SP++;
79072805 5290
a0d0e21e 5291 if (++MARK < SP) {
4ea561bc 5292 offset = i = SvIV(*MARK);
a0d0e21e 5293 if (offset < 0)
93965878 5294 offset += AvFILLp(ary) + 1;
84902520 5295 if (offset < 0)
cea2e8a9 5296 DIE(aTHX_ PL_no_aelem, i);
a0d0e21e
LW
5297 if (++MARK < SP) {
5298 length = SvIVx(*MARK++);
48cdf507
GA
5299 if (length < 0) {
5300 length += AvFILLp(ary) - offset + 1;
5301 if (length < 0)
5302 length = 0;
5303 }
79072805
LW
5304 }
5305 else
a0d0e21e 5306 length = AvMAX(ary) + 1; /* close enough to infinity */
79072805 5307 }
a0d0e21e
LW
5308 else {
5309 offset = 0;
5310 length = AvMAX(ary) + 1;
5311 }
8cbc2e3b 5312 if (offset > AvFILLp(ary) + 1) {
5cd408a2
EB
5313 if (num_args > 2)
5314 Perl_ck_warner(aTHX_ packWARN(WARN_MISC), "splice() offset past end of array" );
93965878 5315 offset = AvFILLp(ary) + 1;
8cbc2e3b 5316 }
93965878 5317 after = AvFILLp(ary) + 1 - (offset + length);
a0d0e21e
LW
5318 if (after < 0) { /* not that much array */
5319 length += after; /* offset+length now in array */
5320 after = 0;
5321 if (!AvALLOC(ary))
5322 av_extend(ary, 0);
5323 }
5324
5325 /* At this point, MARK .. SP-1 is our new LIST */
5326
5327 newlen = SP - MARK;
5328 diff = newlen - length;
13d7cbc1
GS
5329 if (newlen && !AvREAL(ary) && AvREIFY(ary))
5330 av_reify(ary);
a0d0e21e 5331
50528de0
WL
5332 /* make new elements SVs now: avoid problems if they're from the array */
5333 for (dst = MARK, i = newlen; i; i--) {
1b6737cc 5334 SV * const h = *dst;
f2b990bf 5335 *dst++ = newSVsv(h);
50528de0
WL
5336 }
5337
a0d0e21e 5338 if (diff < 0) { /* shrinking the area */
95b63a38 5339 SV **tmparyval = NULL;
a0d0e21e 5340 if (newlen) {
a02a5408 5341 Newx(tmparyval, newlen, SV*); /* so remember insertion */
a0d0e21e 5342 Copy(MARK, tmparyval, newlen, SV*);
79072805 5343 }
a0d0e21e
LW
5344
5345 MARK = ORIGMARK + 1;
82334630 5346 if (GIMME_V == G_ARRAY) { /* copy return vals to stack */
31c61add 5347 const bool real = cBOOL(AvREAL(ary));
a0d0e21e 5348 MEXTEND(MARK, length);
31c61add 5349 if (real)
bbce6d69 5350 EXTEND_MORTAL(length);
31c61add
FC
5351 for (i = 0, dst = MARK; i < length; i++) {
5352 if ((*dst = AvARRAY(ary)[i+offset])) {
5353 if (real)
486ec47a 5354 sv_2mortal(*dst); /* free them eventually */
36477c24 5355 }
31c61add
FC
5356 else
5357 *dst = &PL_sv_undef;
5358 dst++;
a0d0e21e
LW
5359 }
5360 MARK += length - 1;
79072805 5361 }
a0d0e21e
LW
5362 else {
5363 *MARK = AvARRAY(ary)[offset+length-1];
5364 if (AvREAL(ary)) {
d689ffdd 5365 sv_2mortal(*MARK);
a0d0e21e
LW
5366 for (i = length - 1, dst = &AvARRAY(ary)[offset]; i > 0; i--)
5367 SvREFCNT_dec(*dst++); /* free them now */
79072805 5368 }
92b69f65
FC
5369 if (!*MARK)
5370 *MARK = &PL_sv_undef;
a0d0e21e 5371 }
93965878 5372 AvFILLp(ary) += diff;
a0d0e21e
LW
5373
5374 /* pull up or down? */
5375
5376 if (offset < after) { /* easier to pull up */
5377 if (offset) { /* esp. if nothing to pull */
5378 src = &AvARRAY(ary)[offset-1];
5379 dst = src - diff; /* diff is negative */
5380 for (i = offset; i > 0; i--) /* can't trust Copy */
5381 *dst-- = *src--;
79072805 5382 }
a0d0e21e 5383 dst = AvARRAY(ary);
9c6bc640 5384 AvARRAY(ary) = AvARRAY(ary) - diff; /* diff is negative */
a0d0e21e
LW
5385 AvMAX(ary) += diff;
5386 }
5387 else {
5388 if (after) { /* anything to pull down? */
5389 src = AvARRAY(ary) + offset + length;
5390 dst = src + diff; /* diff is negative */
5391 Move(src, dst, after, SV*);
79072805 5392 }
93965878 5393 dst = &AvARRAY(ary)[AvFILLp(ary)+1];
a0d0e21e
LW
5394 /* avoid later double free */
5395 }
5396 i = -diff;
5397 while (i)
ce0d59fd 5398 dst[--i] = NULL;
a0d0e21e
LW
5399
5400 if (newlen) {
50528de0 5401 Copy( tmparyval, AvARRAY(ary) + offset, newlen, SV* );
a0d0e21e
LW
5402 Safefree(tmparyval);
5403 }
5404 }
5405 else { /* no, expanding (or same) */
d3961450 5406 SV** tmparyval = NULL;
a0d0e21e 5407 if (length) {
a02a5408 5408 Newx(tmparyval, length, SV*); /* so remember deletion */
a0d0e21e
LW
5409 Copy(AvARRAY(ary)+offset, tmparyval, length, SV*);
5410 }
5411
5412 if (diff > 0) { /* expanding */
a0d0e21e 5413 /* push up or down? */
a0d0e21e
LW
5414 if (offset < after && diff <= AvARRAY(ary) - AvALLOC(ary)) {
5415 if (offset) {
5416 src = AvARRAY(ary);
5417 dst = src - diff;
5418 Move(src, dst, offset, SV*);
79072805 5419 }
9c6bc640 5420 AvARRAY(ary) = AvARRAY(ary) - diff;/* diff is positive */
a0d0e21e 5421 AvMAX(ary) += diff;
93965878 5422 AvFILLp(ary) += diff;
79072805
LW
5423 }
5424 else {
93965878
NIS
5425 if (AvFILLp(ary) + diff >= AvMAX(ary)) /* oh, well */
5426 av_extend(ary, AvFILLp(ary) + diff);
5427 AvFILLp(ary) += diff;
a0d0e21e
LW
5428
5429 if (after) {
93965878 5430 dst = AvARRAY(ary) + AvFILLp(ary);
a0d0e21e
LW
5431 src = dst - diff;
5432 for (i = after; i; i--) {
5433 *dst-- = *src--;
5434 }
79072805
LW
5435 }
5436 }
a0d0e21e
LW
5437 }
5438
50528de0
WL
5439 if (newlen) {
5440 Copy( MARK, AvARRAY(ary) + offset, newlen, SV* );
a0d0e21e 5441 }
50528de0 5442
a0d0e21e 5443 MARK = ORIGMARK + 1;
82334630 5444 if (GIMME_V == G_ARRAY) { /* copy return vals to stack */
a0d0e21e 5445 if (length) {
31c61add
FC
5446 const bool real = cBOOL(AvREAL(ary));
5447 if (real)
bbce6d69 5448 EXTEND_MORTAL(length);
31c61add
FC
5449 for (i = 0, dst = MARK; i < length; i++) {
5450 if ((*dst = tmparyval[i])) {
5451 if (real)
486ec47a 5452 sv_2mortal(*dst); /* free them eventually */
36477c24 5453 }
31c61add
FC
5454 else *dst = &PL_sv_undef;
5455 dst++;
79072805
LW
5456 }
5457 }
a0d0e21e
LW
5458 MARK += length - 1;
5459 }
5460 else if (length--) {
5461 *MARK = tmparyval[length];
5462 if (AvREAL(ary)) {
d689ffdd 5463 sv_2mortal(*MARK);
a0d0e21e
LW
5464 while (length-- > 0)
5465 SvREFCNT_dec(tmparyval[length]);
79072805 5466 }
92b69f65
FC
5467 if (!*MARK)
5468 *MARK = &PL_sv_undef;
79072805 5469 }
a0d0e21e 5470 else
3280af22 5471 *MARK = &PL_sv_undef;
d3961450 5472 Safefree(tmparyval);
79072805 5473 }
474af990
FR
5474
5475 if (SvMAGICAL(ary))
5476 mg_set(MUTABLE_SV(ary));
5477
a0d0e21e 5478 SP = MARK;
79072805
LW
5479 RETURN;
5480}
5481
a0d0e21e 5482PP(pp_push)
79072805 5483{
20b7effb 5484 dSP; dMARK; dORIGMARK; dTARGET;
00576728 5485 AV * const ary = MUTABLE_AV(*++MARK);
ad64d0ec 5486 const MAGIC * const mg = SvTIED_mg((const SV *)ary, PERL_MAGIC_tied);
79072805 5487
1b6737cc 5488 if (mg) {
ad64d0ec 5489 *MARK-- = SvTIED_obj(MUTABLE_SV(ary), mg);
93965878
NIS
5490 PUSHMARK(MARK);
5491 PUTBACK;
d343c3ef 5492 ENTER_with_name("call_PUSH");
3e0cb5de 5493 call_sv(SV_CONST(PUSH),G_SCALAR|G_DISCARD|G_METHOD_NAMED);
d343c3ef 5494 LEAVE_with_name("call_PUSH");
01072573 5495 /* SPAGAIN; not needed: SP is assigned to immediately below */
93965878 5496 }
a60c0954 5497 else {
a68090fe
DM
5498 /* PL_delaymagic is restored by JUMPENV_POP on dieing, so we
5499 * only need to save locally, not on the save stack */
5500 U16 old_delaymagic = PL_delaymagic;
5501
cb077ed2 5502 if (SvREADONLY(ary) && MARK < SP) Perl_croak_no_modify();
89c14e2e 5503 PL_delaymagic = DM_DELAY;
a60c0954 5504 for (++MARK; MARK <= SP; MARK++) {
3ed356df
FC
5505 SV *sv;
5506 if (*MARK) SvGETMAGIC(*MARK);
5507 sv = newSV(0);
a60c0954 5508 if (*MARK)
3ed356df 5509 sv_setsv_nomg(sv, *MARK);
0a75904b 5510 av_store(ary, AvFILLp(ary)+1, sv);
a60c0954 5511 }
354b0578 5512 if (PL_delaymagic & DM_ARRAY_ISA)
ad64d0ec 5513 mg_set(MUTABLE_SV(ary));
a68090fe 5514 PL_delaymagic = old_delaymagic;
6eeabd23
VP
5515 }
5516 SP = ORIGMARK;
5517 if (OP_GIMME(PL_op, 0) != G_VOID) {
5518 PUSHi( AvFILL(ary) + 1 );
79072805 5519 }
79072805
LW
5520 RETURN;
5521}
5522
b1c05ba5 5523/* also used for: pp_pop()*/
a0d0e21e 5524PP(pp_shift)
79072805 5525{
39644a26 5526 dSP;
538f5756 5527 AV * const av = PL_op->op_flags & OPf_SPECIAL
94f9945d 5528 ? MUTABLE_AV(GvAVn(PL_defgv)) : MUTABLE_AV(POPs);
789b4bc9 5529 SV * const sv = PL_op->op_type == OP_SHIFT ? av_shift(av) : av_pop(av);
79072805 5530 EXTEND(SP, 1);
c2b4a044 5531 assert (sv);
d689ffdd 5532 if (AvREAL(av))
a0d0e21e
LW
5533 (void)sv_2mortal(sv);
5534 PUSHs(sv);
79072805 5535 RETURN;
79072805
LW
5536}
5537
a0d0e21e 5538PP(pp_unshift)
79072805 5539{
20b7effb 5540 dSP; dMARK; dORIGMARK; dTARGET;
00576728 5541 AV *ary = MUTABLE_AV(*++MARK);
ad64d0ec 5542 const MAGIC * const mg = SvTIED_mg((const SV *)ary, PERL_MAGIC_tied);
93965878 5543
1b6737cc 5544 if (mg) {
ad64d0ec 5545 *MARK-- = SvTIED_obj(MUTABLE_SV(ary), mg);
7fd66d9d 5546 PUSHMARK(MARK);
93965878 5547 PUTBACK;
d343c3ef 5548 ENTER_with_name("call_UNSHIFT");
36925d9e 5549 call_sv(SV_CONST(UNSHIFT),G_SCALAR|G_DISCARD|G_METHOD_NAMED);
d343c3ef 5550 LEAVE_with_name("call_UNSHIFT");
01072573 5551 /* SPAGAIN; not needed: SP is assigned to immediately below */
93965878 5552 }
a60c0954 5553 else {
a68090fe
DM
5554 /* PL_delaymagic is restored by JUMPENV_POP on dieing, so we
5555 * only need to save locally, not on the save stack */
5556 U16 old_delaymagic = PL_delaymagic;
c70927a6 5557 SSize_t i = 0;
a68090fe 5558
a60c0954 5559 av_unshift(ary, SP - MARK);
39539141 5560 PL_delaymagic = DM_DELAY;
a60c0954 5561 while (MARK < SP) {
1b6737cc 5562 SV * const sv = newSVsv(*++MARK);
a60c0954
NIS
5563 (void)av_store(ary, i++, sv);
5564 }
39539141
DIM
5565 if (PL_delaymagic & DM_ARRAY_ISA)
5566 mg_set(MUTABLE_SV(ary));
a68090fe 5567 PL_delaymagic = old_delaymagic;
79072805 5568 }
a0d0e21e 5569 SP = ORIGMARK;
6eeabd23 5570 if (OP_GIMME(PL_op, 0) != G_VOID) {
5658d0a9
LR
5571 PUSHi( AvFILL(ary) + 1 );
5572 }
79072805 5573 RETURN;
79072805
LW
5574}
5575
a0d0e21e 5576PP(pp_reverse)
79072805 5577{
20b7effb 5578 dSP; dMARK;
79072805 5579
82334630 5580 if (GIMME_V == G_ARRAY) {
484c818f
VP
5581 if (PL_op->op_private & OPpREVERSE_INPLACE) {
5582 AV *av;
5583
5584 /* See pp_sort() */
5585 assert( MARK+1 == SP && *SP && SvTYPE(*SP) == SVt_PVAV);
5586 (void)POPMARK; /* remove mark associated with ex-OP_AASSIGN */
5587 av = MUTABLE_AV((*SP));
5588 /* In-place reversing only happens in void context for the array
5589 * assignment. We don't need to push anything on the stack. */
5590 SP = MARK;
5591
5592 if (SvMAGICAL(av)) {
c70927a6 5593 SSize_t i, j;
eb578fdb 5594 SV *tmp = sv_newmortal();
484c818f
VP
5595 /* For SvCANEXISTDELETE */
5596 HV *stash;
5597 const MAGIC *mg;
5598 bool can_preserve = SvCANEXISTDELETE(av);
5599
b9f2b683 5600 for (i = 0, j = av_tindex(av); i < j; ++i, --j) {
eb578fdb 5601 SV *begin, *end;
484c818f
VP
5602
5603 if (can_preserve) {
5604 if (!av_exists(av, i)) {
5605 if (av_exists(av, j)) {
eb578fdb 5606 SV *sv = av_delete(av, j, 0);
484c818f
VP
5607 begin = *av_fetch(av, i, TRUE);
5608 sv_setsv_mg(begin, sv);
5609 }
5610 continue;
5611 }
5612 else if (!av_exists(av, j)) {
eb578fdb 5613 SV *sv = av_delete(av, i, 0);
484c818f
VP
5614 end = *av_fetch(av, j, TRUE);
5615 sv_setsv_mg(end, sv);
5616 continue;
5617 }
5618 }
5619
5620 begin = *av_fetch(av, i, TRUE);
5621 end = *av_fetch(av, j, TRUE);
5622 sv_setsv(tmp, begin);
5623 sv_setsv_mg(begin, end);
5624 sv_setsv_mg(end, tmp);
5625 }
5626 }
5627 else {
5628 SV **begin = AvARRAY(av);
484c818f 5629
95a26d8e
VP
5630 if (begin) {
5631 SV **end = begin + AvFILLp(av);
5632
5633 while (begin < end) {
eb578fdb 5634 SV * const tmp = *begin;
95a26d8e
VP
5635 *begin++ = *end;
5636 *end-- = tmp;
5637 }
484c818f
VP
5638 }
5639 }
5640 }
5641 else {
5642 SV **oldsp = SP;
5643 MARK++;
5644 while (MARK < SP) {
eb578fdb 5645 SV * const tmp = *MARK;
484c818f
VP
5646 *MARK++ = *SP;
5647 *SP-- = tmp;
5648 }
5649 /* safe as long as stack cannot get extended in the above */
5650 SP = oldsp;
a0d0e21e 5651 }
79072805
LW
5652 }
5653 else {
eb578fdb
KW
5654 char *up;
5655 char *down;
5656 I32 tmp;
a0d0e21e
LW
5657 dTARGET;
5658 STRLEN len;
79072805 5659
7e2040f0 5660 SvUTF8_off(TARG); /* decontaminate */
a0d0e21e 5661 if (SP - MARK > 1)
3280af22 5662 do_join(TARG, &PL_sv_no, MARK, SP);
1e21d011 5663 else {
64d3d9fe 5664 sv_setsv(TARG, SP > MARK ? *SP : DEFSV);
1e21d011
B
5665 }
5666
a0d0e21e
LW
5667 up = SvPV_force(TARG, len);
5668 if (len > 1) {
7e2040f0 5669 if (DO_UTF8(TARG)) { /* first reverse each character */
dfe13c55 5670 U8* s = (U8*)SvPVX(TARG);
349d4f2f 5671 const U8* send = (U8*)(s + len);
a0ed51b3 5672 while (s < send) {
d742c382 5673 if (UTF8_IS_INVARIANT(*s)) {
a0ed51b3
LW
5674 s++;
5675 continue;
5676 }
5677 else {
4b88fb76 5678 if (!utf8_to_uvchr_buf(s, send, 0))
a0dbb045 5679 break;
dfe13c55 5680 up = (char*)s;
a0ed51b3 5681 s += UTF8SKIP(s);
dfe13c55 5682 down = (char*)(s - 1);
a0dbb045 5683 /* reverse this character */
a0ed51b3
LW
5684 while (down > up) {
5685 tmp = *up;
5686 *up++ = *down;
eb160463 5687 *down-- = (char)tmp;
a0ed51b3
LW
5688 }
5689 }
5690 }
5691 up = SvPVX(TARG);
5692 }
a0d0e21e
LW
5693 down = SvPVX(TARG) + len - 1;
5694 while (down > up) {
5695 tmp = *up;
5696 *up++ = *down;
eb160463 5697 *down-- = (char)tmp;
a0d0e21e 5698 }
3aa33fe5 5699 (void)SvPOK_only_UTF8(TARG);
79072805 5700 }
a0d0e21e
LW
5701 SP = MARK + 1;
5702 SETTARG;
79072805 5703 }
a0d0e21e 5704 RETURN;
79072805
LW
5705}
5706
a0d0e21e 5707PP(pp_split)
79072805 5708{
20b7effb 5709 dSP; dTARG;
692044df
DM
5710 AV *ary = ( (PL_op->op_private & OPpSPLIT_ASSIGN) /* @a = split */
5711 && (PL_op->op_flags & OPf_STACKED)) /* @{expr} = split */
5012eebe 5712 ? (AV *)POPs : NULL;
eb578fdb 5713 IV limit = POPi; /* note, negative is forever */
1b6737cc 5714 SV * const sv = POPs;
a0d0e21e 5715 STRLEN len;
eb578fdb 5716 const char *s = SvPV_const(sv, len);
1b6737cc 5717 const bool do_utf8 = DO_UTF8(sv);
727b7506 5718 const char *strend = s + len;
5012eebe 5719 PMOP *pm = cPMOPx(PL_op);
eb578fdb
KW
5720 REGEXP *rx;
5721 SV *dstr;
5722 const char *m;
c70927a6 5723 SSize_t iters = 0;
d14578b8
KW
5724 const STRLEN slen = do_utf8
5725 ? utf8_length((U8*)s, (U8*)strend)
5726 : (STRLEN)(strend - s);
c70927a6 5727 SSize_t maxiters = slen + 10;
c1a7495a 5728 I32 trailing_empty = 0;
727b7506 5729 const char *orig;
052a7c76 5730 const IV origlimit = limit;
a0d0e21e
LW
5731 I32 realarray = 0;
5732 I32 base;
1c23e2bd 5733 const U8 gimme = GIMME_V;
941446f6 5734 bool gimme_scalar;
692044df 5735 I32 oldsave = PL_savestack_ix;
437d3b4e 5736 U32 make_mortal = SVs_TEMP;
7fba1cd6 5737 bool multiline = 0;
b37c2d43 5738 MAGIC *mg = NULL;
79072805 5739
aaa362c4 5740 rx = PM_GETRE(pm);
bbce6d69 5741
a62b1201 5742 TAINT_IF(get_regex_charset(RX_EXTFLAGS(rx)) == REGEX_LOCALE_CHARSET &&
dbc200c5 5743 (RX_EXTFLAGS(rx) & (RXf_WHITE | RXf_SKIPWHITE)));
bbce6d69 5744
692044df 5745 /* handle @ary = split(...) optimisation */
5012eebe
DM
5746 if (PL_op->op_private & OPpSPLIT_ASSIGN) {
5747 if (!(PL_op->op_flags & OPf_STACKED)) {
692044df
DM
5748 if (PL_op->op_private & OPpSPLIT_LEX) {
5749 if (PL_op->op_private & OPpLVAL_INTRO)
5750 SAVECLEARSV(PAD_SVl(pm->op_pmreplrootu.op_pmtargetoff));
5012eebe 5751 ary = (AV *)PAD_SVl(pm->op_pmreplrootu.op_pmtargetoff);
692044df 5752 }
5012eebe
DM
5753 else {
5754 GV *gv =
971a9dd3 5755#ifdef USE_ITHREADS
5012eebe 5756 MUTABLE_GV(PAD_SVl(pm->op_pmreplrootu.op_pmtargetoff));
971a9dd3 5757#else
5012eebe 5758 pm->op_pmreplrootu.op_pmtargetgv;
20e98b0f 5759#endif
692044df
DM
5760 if (PL_op->op_private & OPpLVAL_INTRO)
5761 ary = save_ary(gv);
5762 else
5763 ary = GvAVn(gv);
5012eebe 5764 }
692044df
DM
5765 /* skip anything pushed by OPpLVAL_INTRO above */
5766 oldsave = PL_savestack_ix;
5012eebe
DM
5767 }
5768
a0d0e21e 5769 realarray = 1;
8ec5e241 5770 PUTBACK;
a0d0e21e 5771 av_extend(ary,0);
821956c5 5772 (void)sv_2mortal(SvREFCNT_inc_simple_NN(sv));
a0d0e21e 5773 av_clear(ary);
8ec5e241 5774 SPAGAIN;
ad64d0ec 5775 if ((mg = SvTIED_mg((const SV *)ary, PERL_MAGIC_tied))) {
8ec5e241 5776 PUSHMARK(SP);
ad64d0ec 5777 XPUSHs(SvTIED_obj(MUTABLE_SV(ary), mg));
8ec5e241
NIS
5778 }
5779 else {
1c0b011c 5780 if (!AvREAL(ary)) {
1b6737cc 5781 I32 i;
1c0b011c 5782 AvREAL_on(ary);
abff13bb 5783 AvREIFY_off(ary);
1c0b011c 5784 for (i = AvFILLp(ary); i >= 0; i--)
d14578b8 5785 AvARRAY(ary)[i] = &PL_sv_undef; /* don't free mere refs */
1c0b011c
NIS
5786 }
5787 /* temporarily switch stacks */
8b7059b1 5788 SAVESWITCHSTACK(PL_curstack, ary);
8ec5e241 5789 make_mortal = 0;
1c0b011c 5790 }
79072805 5791 }
5012eebe 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) {
7a207065 5797 while (isSPACE_utf8_safe(s, strend))
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) {
7a207065 5822 while (m < strend && ! isSPACE_utf8_safe(m, strend) ) {
613f191e 5823 const int t = UTF8SKIP(m);
7a207065 5824 /* isSPACE_utf8_safe 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) {
7a207065 5862 while (s < strend && isSPACE_utf8_safe(s, strend) )
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);
71ca73e5 6098 *SP-- = NULL;
c1a7495a
BB
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)
e1e26374 6378 + (PL_op->op_private & OPpAVHVSWITCH_MASK)
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 */