This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Update Test::Harness 3.36 -> 3.38
[perl5.git] / pp.c
CommitLineData
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 )
b243b193 153 SETs(HvUSEDKEYS(TARG) ? &PL_sv_yes : &PL_sv_no);
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)) {
41b1e858
AC
3399 /* Upgrade the dest, and recalculate tmps in case the buffer
3400 * got reallocated; curlen may also have been changed */
01680ee9 3401 sv_utf8_upgrade_nomg(sv);
41b1e858 3402 tmps = SvPV_nomg(sv, curlen);
6582db62
FC
3403 }
3404 }
3405 else if (DO_UTF8(sv))
3406 repl_need_utf8_upgrade = TRUE;
3407 }
3408 else tmps = SvPV_const(sv, curlen);
7e2040f0 3409 if (DO_UTF8(sv)) {
0d788f38 3410 utf8_curlen = sv_or_pv_len_utf8(sv, tmps, curlen);
9402d6ed
JH
3411 if (utf8_curlen == curlen)
3412 utf8_curlen = 0;
a0ed51b3 3413 else
9402d6ed 3414 curlen = utf8_curlen;
a0ed51b3 3415 }
d1c2b58a 3416 else
9402d6ed 3417 utf8_curlen = 0;
a0ed51b3 3418
83f78d1a
FC
3419 {
3420 STRLEN pos, len, byte_len, byte_pos;
777f7c56 3421
83f78d1a
FC
3422 if (!translate_substr_offsets(
3423 curlen, pos1_iv, pos1_is_uv, len_iv, len_is_uv, &pos, &len
3424 )) goto bound_fail;
777f7c56 3425
83f78d1a
FC
3426 byte_len = len;
3427 byte_pos = utf8_curlen
0d788f38 3428 ? sv_or_pv_pos_u2b(sv, tmps, pos, &byte_len) : pos;
d931b1be 3429
2154eca7 3430 tmps += byte_pos;
bbddc9e0
CS
3431
3432 if (rvalue) {
3433 SvTAINTED_off(TARG); /* decontaminate */
3434 SvUTF8_off(TARG); /* decontaminate */
3435 sv_setpvn(TARG, tmps, byte_len);
12aa1545 3436#ifdef USE_LOCALE_COLLATE
bbddc9e0 3437 sv_unmagic(TARG, PERL_MAGIC_collxfrm);
12aa1545 3438#endif
bbddc9e0
CS
3439 if (utf8_curlen)
3440 SvUTF8_on(TARG);
3441 }
2154eca7 3442
f7928d6c 3443 if (repl) {
13e30c65
JH
3444 SV* repl_sv_copy = NULL;
3445
3446 if (repl_need_utf8_upgrade) {
3447 repl_sv_copy = newSVsv(repl_sv);
3448 sv_utf8_upgrade(repl_sv_copy);
349d4f2f 3449 repl = SvPV_const(repl_sv_copy, repl_len);
13e30c65 3450 }
502d9230 3451 if (!SvOK(sv))
500f3e18 3452 SvPVCLEAR(sv);
777f7c56 3453 sv_insert_flags(sv, byte_pos, byte_len, repl, repl_len, 0);
ef8d46e8 3454 SvREFCNT_dec(repl_sv_copy);
f7928d6c 3455 }
79072805 3456 }
6a9665b0
FC
3457 if (PL_op->op_private & OPpSUBSTR_REPL_FIRST)
3458 SP++;
3459 else if (rvalue) {
bbddc9e0
CS
3460 SvSETMAGIC(TARG);
3461 PUSHs(TARG);
3462 }
79072805 3463 RETURN;
777f7c56 3464
7b52d656 3465 bound_fail:
83f78d1a 3466 if (repl)
777f7c56
EB
3467 Perl_croak(aTHX_ "substr outside of string");
3468 Perl_ck_warner(aTHX_ packWARN(WARN_SUBSTR), "substr outside of string");
3469 RETPUSHUNDEF;
79072805
LW
3470}
3471
3472PP(pp_vec)
3473{
20b7effb 3474 dSP;
eb578fdb 3475 const IV size = POPi;
d69c4304 3476 SV* offsetsv = POPs;
eb578fdb 3477 SV * const src = POPs;
1b6737cc 3478 const I32 lvalue = PL_op->op_flags & OPf_MOD || LVRET;
2154eca7 3479 SV * ret;
d69c4304
DM
3480 UV retuv = 0;
3481 STRLEN offset;
3482
3483 /* extract a STRLEN-ranged integer value from offsetsv into offset,
3484 * or die trying */
3485 {
3486 IV iv = SvIV(offsetsv);
3487
3488 /* avoid a large UV being wrapped to a negative value */
3489 if (SvIOK_UV(offsetsv) && SvUVX(offsetsv) > (UV)IV_MAX) {
3490 if (!lvalue)
3491 goto return_val; /* out of range: return 0 */
3492 Perl_croak_nocontext("Out of memory!");
3493 }
3494
3495 if (iv < 0) {
3496 if (!lvalue)
3497 goto return_val; /* out of range: return 0 */
3498 Perl_croak_nocontext("Negative offset to vec in lvalue context");
3499 }
3500
3501#if PTRSIZE < IVSIZE
3502 if (iv > Size_t_MAX) {
3503 if (!lvalue)
3504 goto return_val; /* out of range: return 0 */
3505 Perl_croak_nocontext("Out of memory!");
3506 }
3507#endif
3508
3509 offset = (STRLEN)iv;
3510 }
3511
3512 retuv = do_vecget(src, offset, size);
3513
3514 return_val:
a0d0e21e 3515
81e118e0 3516 if (lvalue) { /* it's an lvalue! */
2154eca7
EB
3517 ret = sv_2mortal(newSV_type(SVt_PVLV)); /* Not TARG RT#67838 */
3518 sv_magic(ret, NULL, PERL_MAGIC_vec, NULL, 0);
3519 LvTYPE(ret) = 'v';
3520 LvTARG(ret) = SvREFCNT_inc_simple(src);
3521 LvTARGOFF(ret) = offset;
3522 LvTARGLEN(ret) = size;
3523 }
3524 else {
3525 dTARGET;
3526 SvTAINTED_off(TARG); /* decontaminate */
3527 ret = TARG;
79072805
LW
3528 }
3529
d69c4304
DM
3530
3531 sv_setuv(ret, retuv);
f9e95907
FC
3532 if (!lvalue)
3533 SvSETMAGIC(ret);
2154eca7 3534 PUSHs(ret);
79072805
LW
3535 RETURN;
3536}
3537
b1c05ba5
DM
3538
3539/* also used for: pp_rindex() */
3540
79072805
LW
3541PP(pp_index)
3542{
20b7effb 3543 dSP; dTARGET;
79072805
LW
3544 SV *big;
3545 SV *little;
c445ea15 3546 SV *temp = NULL;
ad66a58c 3547 STRLEN biglen;
2723d216 3548 STRLEN llen = 0;
b464e2b7
TC
3549 SSize_t offset = 0;
3550 SSize_t retval;
73ee8be2
NC
3551 const char *big_p;
3552 const char *little_p;
2f040f7f
NC
3553 bool big_utf8;
3554 bool little_utf8;
2723d216 3555 const bool is_index = PL_op->op_type == OP_INDEX;
d3e26383 3556 const bool threeargs = MAXARG >= 3 && (TOPs || ((void)POPs,0));
79072805 3557
e1dccc0d
Z
3558 if (threeargs)
3559 offset = POPi;
79072805
LW
3560 little = POPs;
3561 big = POPs;
73ee8be2
NC
3562 big_p = SvPV_const(big, biglen);
3563 little_p = SvPV_const(little, llen);
3564
e609e586
NC
3565 big_utf8 = DO_UTF8(big);
3566 little_utf8 = DO_UTF8(little);
3567 if (big_utf8 ^ little_utf8) {
3568 /* One needs to be upgraded. */
8df0e7a2 3569 if (little_utf8) {
2f040f7f
NC
3570 /* Well, maybe instead we might be able to downgrade the small
3571 string? */
1eced8f8 3572 char * const pv = (char*)bytes_from_utf8((U8 *)little_p, &llen,
2f040f7f
NC
3573 &little_utf8);
3574 if (little_utf8) {
3575 /* If the large string is ISO-8859-1, and it's not possible to
3576 convert the small string to ISO-8859-1, then there is no
3577 way that it could be found anywhere by index. */
3578 retval = -1;
3579 goto fail;
3580 }
e609e586 3581
2f040f7f
NC
3582 /* At this point, pv is a malloc()ed string. So donate it to temp
3583 to ensure it will get free()d */
3584 little = temp = newSV(0);
73ee8be2
NC
3585 sv_usepvn(temp, pv, llen);
3586 little_p = SvPVX(little);
e609e586 3587 } else {
20e67ba1 3588 temp = newSVpvn(little_p, llen);
2f040f7f 3589
8df0e7a2 3590 sv_utf8_upgrade(temp);
20e67ba1
FC
3591 little = temp;
3592 little_p = SvPV_const(little, llen);
e609e586
NC
3593 }
3594 }
73ee8be2
NC
3595 if (SvGAMAGIC(big)) {
3596 /* Life just becomes a lot easier if I use a temporary here.
3597 Otherwise I need to avoid calls to sv_pos_u2b(), which (dangerously)
3598 will trigger magic and overloading again, as will fbm_instr()
3599 */
59cd0e26
NC
3600 big = newSVpvn_flags(big_p, biglen,
3601 SVs_TEMP | (big_utf8 ? SVf_UTF8 : 0));
73ee8be2
NC
3602 big_p = SvPVX(big);
3603 }
e4e44778 3604 if (SvGAMAGIC(little) || (is_index && !SvOK(little))) {
73ee8be2
NC
3605 /* index && SvOK() is a hack. fbm_instr() calls SvPV_const, which will
3606 warn on undef, and we've already triggered a warning with the
3607 SvPV_const some lines above. We can't remove that, as we need to
3608 call some SvPV to trigger overloading early and find out if the
3609 string is UTF-8.
8bd97c0c 3610 This is all getting too messy. The API isn't quite clean enough,
73ee8be2
NC
3611 because data access has side effects.
3612 */
59cd0e26
NC
3613 little = newSVpvn_flags(little_p, llen,
3614 SVs_TEMP | (little_utf8 ? SVf_UTF8 : 0));
73ee8be2
NC
3615 little_p = SvPVX(little);
3616 }
e609e586 3617
d3e26383 3618 if (!threeargs)
2723d216 3619 offset = is_index ? 0 : biglen;
a0ed51b3 3620 else {
ad66a58c 3621 if (big_utf8 && offset > 0)
b464e2b7 3622 offset = sv_pos_u2b_flags(big, offset, 0, SV_CONST_RETURN);
73ee8be2
NC
3623 if (!is_index)
3624 offset += llen;
a0ed51b3 3625 }
79072805
LW
3626 if (offset < 0)
3627 offset = 0;
b464e2b7 3628 else if (offset > (SSize_t)biglen)
ad66a58c 3629 offset = biglen;
73ee8be2
NC
3630 if (!(little_p = is_index
3631 ? fbm_instr((unsigned char*)big_p + offset,
3632 (unsigned char*)big_p + biglen, little, 0)
3633 : rninstr(big_p, big_p + offset,
3634 little_p, little_p + llen)))
a0ed51b3 3635 retval = -1;
ad66a58c 3636 else {
73ee8be2 3637 retval = little_p - big_p;
15c41403 3638 if (retval > 1 && big_utf8)
b464e2b7 3639 retval = sv_pos_b2u_flags(big, retval, SV_CONST_RETURN);
ad66a58c 3640 }
ef8d46e8 3641 SvREFCNT_dec(temp);
2723d216 3642 fail:
e1dccc0d 3643 PUSHi(retval);
79072805
LW
3644 RETURN;
3645}
3646
3647PP(pp_sprintf)
3648{
20b7effb 3649 dSP; dMARK; dORIGMARK; dTARGET;
3e6bd4bf 3650 SvTAINTED_off(TARG);
79072805 3651 do_sprintf(TARG, SP-MARK, MARK+1);
bbce6d69 3652 TAINT_IF(SvTAINTED(TARG));
79072805
LW
3653 SP = ORIGMARK;
3654 PUSHTARG;
3655 RETURN;
3656}
3657
79072805
LW
3658PP(pp_ord)
3659{
20b7effb 3660 dSP; dTARGET;
1eced8f8 3661
6ba92227 3662 SV *argsv = TOPs;
ba210ebe 3663 STRLEN len;
349d4f2f 3664 const U8 *s = (U8*)SvPV_const(argsv, len);
121910a4 3665
6ba92227 3666 SETu(DO_UTF8(argsv)
aee9b917 3667 ? (len ? utf8n_to_uvchr(s, len, 0, UTF8_ALLOW_ANYUV) : 0)
f3943cf2 3668 : (UV)(*s));
68795e93 3669
6ba92227 3670 return NORMAL;
79072805
LW
3671}
3672
463ee0b2
LW
3673PP(pp_chr)
3674{
20b7effb 3675 dSP; dTARGET;
463ee0b2 3676 char *tmps;
8a064bd6 3677 UV value;
d3261b99 3678 SV *top = TOPs;
8a064bd6 3679
71739502 3680 SvGETMAGIC(top);
9911fc4e
FC
3681 if (UNLIKELY(SvAMAGIC(top)))
3682 top = sv_2num(top);
99f450cc 3683 if (UNLIKELY(isinfnansv(top)))
147e3846 3684 Perl_croak(aTHX_ "Cannot chr %" NVgf, SvNV(top));
1cd88304
JH
3685 else {
3686 if (!IN_BYTES /* under bytes, chr(-1) eq chr(0xff), etc. */
3687 && ((SvIOKp(top) && !SvIsUV(top) && SvIV_nomg(top) < 0)
3688 ||
3689 ((SvNOKp(top) || (SvOK(top) && !SvIsUV(top)))
2cc2a5a0
KW
3690 && SvNV_nomg(top) < 0.0)))
3691 {
b3fe8680
FC
3692 if (ckWARN(WARN_UTF8)) {
3693 if (SvGMAGICAL(top)) {
3694 SV *top2 = sv_newmortal();
3695 sv_setsv_nomg(top2, top);
3696 top = top2;
3697 }
1cd88304 3698 Perl_warner(aTHX_ packWARN(WARN_UTF8),
147e3846 3699 "Invalid negative number (%" SVf ") in chr", SVfARG(top));
1cd88304
JH
3700 }
3701 value = UNICODE_REPLACEMENT;
3702 } else {
3703 value = SvUV_nomg(top);
3704 }
8a064bd6 3705 }
463ee0b2 3706
862a34c6 3707 SvUPGRADE(TARG,SVt_PV);
a0ed51b3 3708
0064a8a9 3709 if (value > 255 && !IN_BYTES) {
5f560d8a 3710 SvGROW(TARG, (STRLEN)UVCHR_SKIP(value)+1);
62961d2e 3711 tmps = (char*)uvchr_to_utf8_flags((U8*)SvPVX(TARG), value, 0);
349d4f2f 3712 SvCUR_set(TARG, tmps - SvPVX_const(TARG));
a0ed51b3
LW
3713 *tmps = '\0';
3714 (void)SvPOK_only(TARG);
aa6ffa16 3715 SvUTF8_on(TARG);
d3261b99
FC
3716 SETTARG;
3717 return NORMAL;
a0ed51b3
LW
3718 }
3719
748a9306 3720 SvGROW(TARG,2);
463ee0b2
LW
3721 SvCUR_set(TARG, 1);
3722 tmps = SvPVX(TARG);
eb160463 3723 *tmps++ = (char)value;
748a9306 3724 *tmps = '\0';
a0d0e21e 3725 (void)SvPOK_only(TARG);
4c5ed6e2 3726
d3261b99
FC
3727 SETTARG;
3728 return NORMAL;
463ee0b2
LW
3729}
3730
79072805
LW
3731PP(pp_crypt)
3732{
79072805 3733#ifdef HAS_CRYPT
20b7effb 3734 dSP; dTARGET;
5f74f29c 3735 dPOPTOPssrl;
85c16d83 3736 STRLEN len;
10516c54 3737 const char *tmps = SvPV_const(left, len);
2bc69dc4 3738
85c16d83 3739 if (DO_UTF8(left)) {
2bc69dc4 3740 /* If Unicode, try to downgrade.
f2791508
JH
3741 * If not possible, croak.
3742 * Yes, we made this up. */
659fbb76 3743 SV* const tsv = newSVpvn_flags(tmps, len, SVf_UTF8|SVs_TEMP);
2bc69dc4 3744
2bc69dc4 3745 sv_utf8_downgrade(tsv, FALSE);
349d4f2f 3746 tmps = SvPV_const(tsv, len);
85c16d83 3747 }
05404ffe
JH
3748# ifdef USE_ITHREADS
3749# ifdef HAS_CRYPT_R
3750 if (!PL_reentrant_buffer->_crypt_struct_buffer) {
3751 /* This should be threadsafe because in ithreads there is only
3752 * one thread per interpreter. If this would not be true,
3753 * we would need a mutex to protect this malloc. */
3754 PL_reentrant_buffer->_crypt_struct_buffer =
3755 (struct crypt_data *)safemalloc(sizeof(struct crypt_data));
3756#if defined(__GLIBC__) || defined(__EMX__)
3757 if (PL_reentrant_buffer->_crypt_struct_buffer) {
3758 PL_reentrant_buffer->_crypt_struct_buffer->initialized = 0;
3759 /* work around glibc-2.2.5 bug */
3760 PL_reentrant_buffer->_crypt_struct_buffer->current_saltbits = 0;
3761 }
05404ffe 3762#endif
6ab58e4d 3763 }
05404ffe
JH
3764# endif /* HAS_CRYPT_R */
3765# endif /* USE_ITHREADS */
5f74f29c 3766# ifdef FCRYPT
83003860 3767 sv_setpv(TARG, fcrypt(tmps, SvPV_nolen_const(right)));
5f74f29c 3768# else
83003860 3769 sv_setpv(TARG, PerlProc_crypt(tmps, SvPV_nolen_const(right)));
5f74f29c 3770# endif
fbc76eb3 3771 SvUTF8_off(TARG);
ec93b65f 3772 SETTARG;
4808266b 3773 RETURN;
79072805 3774#else
b13b2135 3775 DIE(aTHX_
79072805
LW
3776 "The crypt() function is unimplemented due to excessive paranoia.");
3777#endif
79072805
LW
3778}
3779
00f254e2
KW
3780/* Generally UTF-8 and UTF-EBCDIC are indistinguishable at this level. So
3781 * most comments below say UTF-8, when in fact they mean UTF-EBCDIC as well */
3782
b1c05ba5
DM
3783
3784/* also used for: pp_lcfirst() */
3785
79072805
LW
3786PP(pp_ucfirst)
3787{
00f254e2
KW
3788 /* Actually is both lcfirst() and ucfirst(). Only the first character
3789 * changes. This means that possibly we can change in-place, ie., just
3790 * take the source and change that one character and store it back, but not
3791 * if read-only etc, or if the length changes */
3792
39644a26 3793 dSP;
d54190f6 3794 SV *source = TOPs;
00f254e2 3795 STRLEN slen; /* slen is the byte length of the whole SV. */
d54190f6
NC
3796 STRLEN need;
3797 SV *dest;
00f254e2
KW
3798 bool inplace; /* ? Convert first char only, in-place */
3799 bool doing_utf8 = FALSE; /* ? using utf8 */
3800 bool convert_source_to_utf8 = FALSE; /* ? need to convert */
12e9c124 3801 const int op_type = PL_op->op_type;
d54190f6
NC
3802 const U8 *s;
3803 U8 *d;
3804 U8 tmpbuf[UTF8_MAXBYTES_CASE+1];
00f254e2
KW
3805 STRLEN ulen; /* ulen is the byte length of the original Unicode character
3806 * stored as UTF-8 at s. */
3807 STRLEN tculen; /* tculen is the byte length of the freshly titlecased (or
3808 * lowercased) character stored in tmpbuf. May be either
3809 * UTF-8 or not, but in either case is the number of bytes */
d54190f6 3810
841a5e18 3811 s = (const U8*)SvPV_const(source, slen);
a0ed51b3 3812
00f254e2
KW
3813 /* We may be able to get away with changing only the first character, in
3814 * place, but not if read-only, etc. Later we may discover more reasons to
3815 * not convert in-place. */
1921e031 3816 inplace = !SvREADONLY(source) && SvPADTMP(source);
00f254e2
KW
3817
3818 /* First calculate what the changed first character should be. This affects
3819 * whether we can just swap it out, leaving the rest of the string unchanged,
3820 * or even if have to convert the dest to UTF-8 when the source isn't */
3821
3822 if (! slen) { /* If empty */
3823 need = 1; /* still need a trailing NUL */
b7576bcb 3824 ulen = 0;
00f254e2
KW
3825 }
3826 else if (DO_UTF8(source)) { /* Is the source utf8? */
d54190f6 3827 doing_utf8 = TRUE;
17e95c9d 3828 ulen = UTF8SKIP(s);
094a2f8c 3829 if (op_type == OP_UCFIRST) {
130c5df3 3830#ifdef USE_LOCALE_CTYPE
a1a5ec35 3831 _toTITLE_utf8_flags(s, s +slen, tmpbuf, &tculen, IN_LC_RUNTIME(LC_CTYPE));
130c5df3 3832#else
a1a5ec35 3833 _toTITLE_utf8_flags(s, s +slen, tmpbuf, &tculen, 0);
130c5df3 3834#endif
094a2f8c
KW
3835 }
3836 else {
130c5df3 3837#ifdef USE_LOCALE_CTYPE
a1a5ec35 3838 _toLOWER_utf8_flags(s, s + slen, tmpbuf, &tculen, IN_LC_RUNTIME(LC_CTYPE));
130c5df3 3839#else
a1a5ec35 3840 _toLOWER_utf8_flags(s, s + slen, tmpbuf, &tculen, 0);
130c5df3 3841#endif
094a2f8c 3842 }
00f254e2 3843
17e95c9d
KW
3844 /* we can't do in-place if the length changes. */
3845 if (ulen != tculen) inplace = FALSE;
3846 need = slen + 1 - ulen + tculen;
d54190f6 3847 }
00f254e2
KW
3848 else { /* Non-zero length, non-UTF-8, Need to consider locale and if
3849 * latin1 is treated as caseless. Note that a locale takes
3850 * precedence */
167d19f2 3851 ulen = 1; /* Original character is 1 byte */
00f254e2
KW
3852 tculen = 1; /* Most characters will require one byte, but this will
3853 * need to be overridden for the tricky ones */
3854 need = slen + 1;
3855
3856 if (op_type == OP_LCFIRST) {
d54190f6 3857
00f254e2 3858 /* lower case the first letter: no trickiness for any character */
130c5df3 3859#ifdef USE_LOCALE_CTYPE
780fcc9f
KW
3860 if (IN_LC_RUNTIME(LC_CTYPE)) {
3861 _CHECK_AND_WARN_PROBLEMATIC_LOCALE;
3862 *tmpbuf = toLOWER_LC(*s);
3863 }
3864 else
130c5df3 3865#endif
780fcc9f
KW
3866 {
3867 *tmpbuf = (IN_UNI_8_BIT)
3868 ? toLOWER_LATIN1(*s)
3869 : toLOWER(*s);
3870 }
00f254e2 3871 }
130c5df3 3872#ifdef USE_LOCALE_CTYPE
780fcc9f 3873 /* is ucfirst() */
d6ded950 3874 else if (IN_LC_RUNTIME(LC_CTYPE)) {
31f05a37
KW
3875 if (IN_UTF8_CTYPE_LOCALE) {
3876 goto do_uni_rules;
3877 }
3878
780fcc9f 3879 _CHECK_AND_WARN_PROBLEMATIC_LOCALE;
31f05a37
KW
3880 *tmpbuf = (U8) toUPPER_LC(*s); /* This would be a bug if any
3881 locales have upper and title case
3882 different */
00f254e2 3883 }
130c5df3 3884#endif
00f254e2
KW
3885 else if (! IN_UNI_8_BIT) {
3886 *tmpbuf = toUPPER(*s); /* Returns caseless for non-ascii, or
3887 * on EBCDIC machines whatever the
3888 * native function does */
3889 }
31f05a37
KW
3890 else {
3891 /* Here, is ucfirst non-UTF-8, not in locale (unless that locale is
3892 * UTF-8, which we treat as not in locale), and cased latin1 */
3893 UV title_ord;
91191cf7 3894#ifdef USE_LOCALE_CTYPE
31f05a37 3895 do_uni_rules:
91191cf7 3896#endif
31f05a37
KW
3897
3898 title_ord = _to_upper_title_latin1(*s, tmpbuf, &tculen, 's');
167d19f2
KW
3899 if (tculen > 1) {
3900 assert(tculen == 2);
3901
3902 /* If the result is an upper Latin1-range character, it can
3903 * still be represented in one byte, which is its ordinal */
3904 if (UTF8_IS_DOWNGRADEABLE_START(*tmpbuf)) {
3905 *tmpbuf = (U8) title_ord;
3906 tculen = 1;
00f254e2
KW
3907 }
3908 else {
167d19f2
KW
3909 /* Otherwise it became more than one ASCII character (in
3910 * the case of LATIN_SMALL_LETTER_SHARP_S) or changed to
3911 * beyond Latin1, so the number of bytes changed, so can't
3912 * replace just the first character in place. */
3913 inplace = FALSE;
3914
d14578b8
KW
3915 /* If the result won't fit in a byte, the entire result
3916 * will have to be in UTF-8. Assume worst case sizing in
3917 * conversion. (all latin1 characters occupy at most two
3918 * bytes in utf8) */
167d19f2
KW
3919 if (title_ord > 255) {
3920 doing_utf8 = TRUE;
3921 convert_source_to_utf8 = TRUE;
3922 need = slen * 2 + 1;
3923
3924 /* The (converted) UTF-8 and UTF-EBCDIC lengths of all
3925 * (both) characters whose title case is above 255 is
3926 * 2. */
3927 ulen = 2;
3928 }
3929 else { /* LATIN_SMALL_LETTER_SHARP_S expands by 1 byte */
3930 need = slen + 1 + 1;
3931 }
00f254e2 3932 }
167d19f2 3933 }
00f254e2
KW
3934 } /* End of use Unicode (Latin1) semantics */
3935 } /* End of changing the case of the first character */
3936
3937 /* Here, have the first character's changed case stored in tmpbuf. Ready to
3938 * generate the result */
3939 if (inplace) {
3940
3941 /* We can convert in place. This means we change just the first
3942 * character without disturbing the rest; no need to grow */
d54190f6
NC
3943 dest = source;
3944 s = d = (U8*)SvPV_force_nomg(source, slen);
3945 } else {
3946 dTARGET;
3947
3948 dest = TARG;
3949
00f254e2
KW
3950 /* Here, we can't convert in place; we earlier calculated how much
3951 * space we will need, so grow to accommodate that */
d54190f6 3952 SvUPGRADE(dest, SVt_PV);
3b416f41 3953 d = (U8*)SvGROW(dest, need);
d54190f6
NC
3954 (void)SvPOK_only(dest);
3955
3956 SETs(dest);
d54190f6 3957 }
44bc797b 3958
d54190f6 3959 if (doing_utf8) {
00f254e2
KW
3960 if (! inplace) {
3961 if (! convert_source_to_utf8) {
3962
3963 /* Here both source and dest are in UTF-8, but have to create
3964 * the entire output. We initialize the result to be the
3965 * title/lower cased first character, and then append the rest
3966 * of the string. */
3967 sv_setpvn(dest, (char*)tmpbuf, tculen);
3968 if (slen > ulen) {
3969 sv_catpvn(dest, (char*)(s + ulen), slen - ulen);
3970 }
3971 }
3972 else {
3973 const U8 *const send = s + slen;
3974
3975 /* Here the dest needs to be in UTF-8, but the source isn't,
3976 * except we earlier UTF-8'd the first character of the source
3977 * into tmpbuf. First put that into dest, and then append the
3978 * rest of the source, converting it to UTF-8 as we go. */
3979
3980 /* Assert tculen is 2 here because the only two characters that
3981 * get to this part of the code have 2-byte UTF-8 equivalents */
3982 *d++ = *tmpbuf;
3983 *d++ = *(tmpbuf + 1);
3984 s++; /* We have just processed the 1st char */
3985
3986 for (; s < send; s++) {
3987 d = uvchr_to_utf8(d, *s);
3988 }
3989 *d = '\0';
3990 SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
3991 }
d54190f6 3992 SvUTF8_on(dest);
a0ed51b3 3993 }
00f254e2 3994 else { /* in-place UTF-8. Just overwrite the first character */
d54190f6
NC
3995 Copy(tmpbuf, d, tculen, U8);
3996 SvCUR_set(dest, need - 1);
a0ed51b3 3997 }
094a2f8c 3998
a0ed51b3 3999 }
00f254e2
KW
4000 else { /* Neither source nor dest are in or need to be UTF-8 */
4001 if (slen) {
00f254e2
KW
4002 if (inplace) { /* in-place, only need to change the 1st char */
4003 *d = *tmpbuf;
4004 }
4005 else { /* Not in-place */
4006
4007 /* Copy the case-changed character(s) from tmpbuf */
4008 Copy(tmpbuf, d, tculen, U8);
4009 d += tculen - 1; /* Code below expects d to point to final
4010 * character stored */
4011 }
4012 }
4013 else { /* empty source */
4014 /* See bug #39028: Don't taint if empty */
d54190f6
NC
4015 *d = *s;
4016 }
4017
00f254e2
KW
4018 /* In a "use bytes" we don't treat the source as UTF-8, but, still want
4019 * the destination to retain that flag */
93e088e8 4020 if (SvUTF8(source) && ! IN_BYTES)
d54190f6
NC
4021 SvUTF8_on(dest);
4022
00f254e2 4023 if (!inplace) { /* Finish the rest of the string, unchanged */
d54190f6
NC
4024 /* This will copy the trailing NUL */
4025 Copy(s + 1, d + 1, slen, U8);
4026 SvCUR_set(dest, need - 1);
bbce6d69 4027 }
bbce6d69 4028 }
130c5df3 4029#ifdef USE_LOCALE_CTYPE
d6ded950 4030 if (IN_LC_RUNTIME(LC_CTYPE)) {
445bf929
KW
4031 TAINT;
4032 SvTAINTED_on(dest);
4033 }
130c5df3 4034#endif
539689e7
FC
4035 if (dest != source && SvTAINTED(source))
4036 SvTAINT(dest);
d54190f6 4037 SvSETMAGIC(dest);
3cb4e04f 4038 return NORMAL;
79072805
LW
4039}
4040
67306194
NC
4041/* There's so much setup/teardown code common between uc and lc, I wonder if
4042 it would be worth merging the two, and just having a switch outside each
00f254e2 4043 of the three tight loops. There is less and less commonality though */
79072805
LW
4044PP(pp_uc)
4045{
39644a26 4046 dSP;
67306194 4047 SV *source = TOPs;
463ee0b2 4048 STRLEN len;
67306194
NC
4049 STRLEN min;
4050 SV *dest;
4051 const U8 *s;
4052 U8 *d;
79072805 4053
67306194
NC
4054 SvGETMAGIC(source);
4055
1921e031 4056 if ( SvPADTMP(source)
5cd5e2d6
FC
4057 && !SvREADONLY(source) && SvPOK(source)
4058 && !DO_UTF8(source)
130c5df3
KW
4059 && (
4060#ifdef USE_LOCALE_CTYPE
4061 (IN_LC_RUNTIME(LC_CTYPE))
31f05a37 4062 ? ! IN_UTF8_CTYPE_LOCALE
130c5df3
KW
4063 :
4064#endif
4065 ! IN_UNI_8_BIT))
31f05a37
KW
4066 {
4067
4068 /* We can convert in place. The reason we can't if in UNI_8_BIT is to
4069 * make the loop tight, so we overwrite the source with the dest before
4070 * looking at it, and we need to look at the original source
4071 * afterwards. There would also need to be code added to handle
4072 * switching to not in-place in midstream if we run into characters
4073 * that change the length. Since being in locale overrides UNI_8_BIT,
4074 * that latter becomes irrelevant in the above test; instead for
4075 * locale, the size can't normally change, except if the locale is a
4076 * UTF-8 one */
67306194
NC
4077 dest = source;
4078 s = d = (U8*)SvPV_force_nomg(source, len);
4079 min = len + 1;
4080 } else {
a0ed51b3 4081 dTARGET;
a0ed51b3 4082
67306194 4083 dest = TARG;
128c9517 4084
841a5e18 4085 s = (const U8*)SvPV_nomg_const(source, len);
67306194
NC
4086 min = len + 1;
4087
4088 SvUPGRADE(dest, SVt_PV);
3b416f41 4089 d = (U8*)SvGROW(dest, min);
67306194
NC
4090 (void)SvPOK_only(dest);
4091
4092 SETs(dest);
a0ed51b3 4093 }
31351b04 4094
67306194
NC
4095 /* Overloaded values may have toggled the UTF-8 flag on source, so we need
4096 to check DO_UTF8 again here. */
4097
4098 if (DO_UTF8(source)) {
4099 const U8 *const send = s + len;
bfac13d4 4100 U8 tmpbuf[UTF8_MAXBYTES_CASE+1];
67306194 4101
4c8a458a
KW
4102 /* All occurrences of these are to be moved to follow any other marks.
4103 * This is context-dependent. We may not be passed enough context to
4104 * move the iota subscript beyond all of them, but we do the best we can
4105 * with what we're given. The result is always better than if we
4106 * hadn't done this. And, the problem would only arise if we are
4107 * passed a character without all its combining marks, which would be
4108 * the caller's mistake. The information this is based on comes from a
4109 * comment in Unicode SpecialCasing.txt, (and the Standard's text
4110 * itself) and so can't be checked properly to see if it ever gets
4111 * revised. But the likelihood of it changing is remote */
00f254e2 4112 bool in_iota_subscript = FALSE;
00f254e2 4113
67306194 4114 while (s < send) {
3e16b0e6
KW
4115 STRLEN u;
4116 STRLEN ulen;
4117 UV uv;
7dbf68d2 4118 if (in_iota_subscript && ! _is_utf8_mark(s)) {
3e16b0e6 4119
00f254e2 4120 /* A non-mark. Time to output the iota subscript */
a78bc3c6
KW
4121 Copy(GREEK_CAPITAL_LETTER_IOTA_UTF8, d, capital_iota_len, U8);
4122 d += capital_iota_len;
00f254e2 4123 in_iota_subscript = FALSE;
8e058693 4124 }
00f254e2 4125
8e058693
KW
4126 /* Then handle the current character. Get the changed case value
4127 * and copy it to the output buffer */
00f254e2 4128
8e058693 4129 u = UTF8SKIP(s);
130c5df3 4130#ifdef USE_LOCALE_CTYPE
a1a5ec35 4131 uv = _toUPPER_utf8_flags(s, send, tmpbuf, &ulen, IN_LC_RUNTIME(LC_CTYPE));
130c5df3 4132#else
a1a5ec35 4133 uv = _toUPPER_utf8_flags(s, send, tmpbuf, &ulen, 0);
130c5df3 4134#endif
a78bc3c6
KW
4135#define GREEK_CAPITAL_LETTER_IOTA 0x0399
4136#define COMBINING_GREEK_YPOGEGRAMMENI 0x0345
8e058693 4137 if (uv == GREEK_CAPITAL_LETTER_IOTA
4b88fb76 4138 && utf8_to_uvchr_buf(s, send, 0) == COMBINING_GREEK_YPOGEGRAMMENI)
8e058693
KW
4139 {
4140 in_iota_subscript = TRUE;
4141 }
4142 else {
4143 if (ulen > u && (SvLEN(dest) < (min += ulen - u))) {
4144 /* If the eventually required minimum size outgrows the
4145 * available space, we need to grow. */
4146 const UV o = d - (U8*)SvPVX_const(dest);
4147
4148 /* If someone uppercases one million U+03B0s we SvGROW()
4149 * one million times. Or we could try guessing how much to
4150 * allocate without allocating too much. Such is life.
4151 * See corresponding comment in lc code for another option
4152 * */
10656159 4153 d = o + (U8*) SvGROW(dest, min);
8e058693
KW
4154 }
4155 Copy(tmpbuf, d, ulen, U8);
4156 d += ulen;
4157 }
4158 s += u;
67306194 4159 }
4c8a458a 4160 if (in_iota_subscript) {
a78bc3c6
KW
4161 Copy(GREEK_CAPITAL_LETTER_IOTA_UTF8, d, capital_iota_len, U8);
4162 d += capital_iota_len;
4c8a458a 4163 }
67306194
NC
4164 SvUTF8_on(dest);
4165 *d = '\0';
094a2f8c 4166
67306194 4167 SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
4c8a458a
KW
4168 }
4169 else { /* Not UTF-8 */
67306194
NC
4170 if (len) {
4171 const U8 *const send = s + len;
00f254e2
KW
4172
4173 /* Use locale casing if in locale; regular style if not treating
4174 * latin1 as having case; otherwise the latin1 casing. Do the
4175 * whole thing in a tight loop, for speed, */
130c5df3 4176#ifdef USE_LOCALE_CTYPE
d6ded950 4177 if (IN_LC_RUNTIME(LC_CTYPE)) {
31f05a37
KW
4178 if (IN_UTF8_CTYPE_LOCALE) {
4179 goto do_uni_rules;
4180 }
780fcc9f 4181 _CHECK_AND_WARN_PROBLEMATIC_LOCALE;
67306194 4182 for (; s < send; d++, s++)
31f05a37 4183 *d = (U8) toUPPER_LC(*s);
31351b04 4184 }
130c5df3
KW
4185 else
4186#endif
4187 if (! IN_UNI_8_BIT) {
00f254e2 4188 for (; s < send; d++, s++) {
67306194 4189 *d = toUPPER(*s);
00f254e2 4190 }
31351b04 4191 }
00f254e2 4192 else {
91191cf7 4193#ifdef USE_LOCALE_CTYPE
31f05a37 4194 do_uni_rules:
91191cf7 4195#endif
00f254e2
KW
4196 for (; s < send; d++, s++) {
4197 *d = toUPPER_LATIN1_MOD(*s);
d14578b8
KW
4198 if (LIKELY(*d != LATIN_SMALL_LETTER_Y_WITH_DIAERESIS)) {
4199 continue;
4200 }
00f254e2
KW
4201
4202 /* The mainstream case is the tight loop above. To avoid
4203 * extra tests in that, all three characters that require
4204 * special handling are mapped by the MOD to the one tested
4205 * just above.
4206 * Use the source to distinguish between the three cases */
4207
79e064b9
KW
4208#if UNICODE_MAJOR_VERSION > 2 \
4209 || (UNICODE_MAJOR_VERSION == 2 && UNICODE_DOT_VERSION >= 1 \
4210 && UNICODE_DOT_DOT_VERSION >= 8)
00f254e2
KW
4211 if (*s == LATIN_SMALL_LETTER_SHARP_S) {
4212
4213 /* uc() of this requires 2 characters, but they are
4214 * ASCII. If not enough room, grow the string */
4215 if (SvLEN(dest) < ++min) {
4216 const UV o = d - (U8*)SvPVX_const(dest);
10656159 4217 d = o + (U8*) SvGROW(dest, min);
00f254e2
KW
4218 }
4219 *d++ = 'S'; *d = 'S'; /* upper case is 'SS' */
4220 continue; /* Back to the tight loop; still in ASCII */
4221 }
79e064b9 4222#endif
00f254e2
KW
4223
4224 /* The other two special handling characters have their
4225 * upper cases outside the latin1 range, hence need to be
4226 * in UTF-8, so the whole result needs to be in UTF-8. So,
4227 * here we are somewhere in the middle of processing a
4228 * non-UTF-8 string, and realize that we will have to convert
4229 * the whole thing to UTF-8. What to do? There are
4230 * several possibilities. The simplest to code is to
4231 * convert what we have so far, set a flag, and continue on
4232 * in the loop. The flag would be tested each time through
4233 * the loop, and if set, the next character would be
4234 * converted to UTF-8 and stored. But, I (khw) didn't want
4235 * to slow down the mainstream case at all for this fairly
4236 * rare case, so I didn't want to add a test that didn't
4237 * absolutely have to be there in the loop, besides the
4238 * possibility that it would get too complicated for
4239 * optimizers to deal with. Another possibility is to just
4240 * give up, convert the source to UTF-8, and restart the
4241 * function that way. Another possibility is to convert
4242 * both what has already been processed and what is yet to
4243 * come separately to UTF-8, then jump into the loop that
4244 * handles UTF-8. But the most efficient time-wise of the
4245 * ones I could think of is what follows, and turned out to
4246 * not require much extra code. */
4247
4248 /* Convert what we have so far into UTF-8, telling the
4249 * function that we know it should be converted, and to
4250 * allow extra space for what we haven't processed yet.
4251 * Assume the worst case space requirements for converting
4252 * what we haven't processed so far: that it will require
4253 * two bytes for each remaining source character, plus the
4254 * NUL at the end. This may cause the string pointer to
4255 * move, so re-find it. */
4256
4257 len = d - (U8*)SvPVX_const(dest);
4258 SvCUR_set(dest, len);
4259 len = sv_utf8_upgrade_flags_grow(dest,
4260 SV_GMAGIC|SV_FORCE_UTF8_UPGRADE,
4261 (send -s) * 2 + 1);
4262 d = (U8*)SvPVX(dest) + len;
4263
00f254e2
KW
4264 /* Now process the remainder of the source, converting to
4265 * upper and UTF-8. If a resulting byte is invariant in
4266 * UTF-8, output it as-is, otherwise convert to UTF-8 and
4267 * append it to the output. */
00f254e2 4268 for (; s < send; s++) {
0ecfbd28
KW
4269 (void) _to_upper_title_latin1(*s, d, &len, 'S');
4270 d += len;
00f254e2
KW
4271 }
4272
4273 /* Here have processed the whole source; no need to continue
4274 * with the outer loop. Each character has been converted
4275 * to upper case and converted to UTF-8 */
4276
4277 break;
4278 } /* End of processing all latin1-style chars */
4279 } /* End of processing all chars */
4280 } /* End of source is not empty */
4281
67306194 4282 if (source != dest) {
00f254e2 4283 *d = '\0'; /* Here d points to 1 after last char, add NUL */
67306194
NC
4284 SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
4285 }
00f254e2 4286 } /* End of isn't utf8 */
130c5df3 4287#ifdef USE_LOCALE_CTYPE
d6ded950 4288 if (IN_LC_RUNTIME(LC_CTYPE)) {
445bf929
KW
4289 TAINT;
4290 SvTAINTED_on(dest);
4291 }
130c5df3 4292#endif
539689e7
FC
4293 if (dest != source && SvTAINTED(source))
4294 SvTAINT(dest);
67306194 4295 SvSETMAGIC(dest);
3cb4e04f 4296 return NORMAL;
79072805
LW
4297}
4298
4299PP(pp_lc)
4300{
39644a26 4301 dSP;
ec9af7d4 4302 SV *source = TOPs;
463ee0b2 4303 STRLEN len;
ec9af7d4
NC
4304 STRLEN min;
4305 SV *dest;
4306 const U8 *s;
4307 U8 *d;
79072805 4308
ec9af7d4
NC
4309 SvGETMAGIC(source);
4310
1921e031 4311 if ( SvPADTMP(source)
5cd5e2d6
FC
4312 && !SvREADONLY(source) && SvPOK(source)
4313 && !DO_UTF8(source)) {
ec9af7d4 4314
00f254e2
KW
4315 /* We can convert in place, as lowercasing anything in the latin1 range
4316 * (or else DO_UTF8 would have been on) doesn't lengthen it */
ec9af7d4
NC
4317 dest = source;
4318 s = d = (U8*)SvPV_force_nomg(source, len);
4319 min = len + 1;
4320 } else {
a0ed51b3 4321 dTARGET;
a0ed51b3 4322
ec9af7d4
NC
4323 dest = TARG;
4324
841a5e18 4325 s = (const U8*)SvPV_nomg_const(source, len);
ec9af7d4 4326 min = len + 1;
128c9517 4327
ec9af7d4 4328 SvUPGRADE(dest, SVt_PV);
3b416f41 4329 d = (U8*)SvGROW(dest, min);
ec9af7d4
NC
4330 (void)SvPOK_only(dest);
4331
4332 SETs(dest);
4333 }
4334
4335 /* Overloaded values may have toggled the UTF-8 flag on source, so we need
4336 to check DO_UTF8 again here. */
4337
4338 if (DO_UTF8(source)) {
4339 const U8 *const send = s + len;
4340 U8 tmpbuf[UTF8_MAXBYTES_CASE+1];
4341
4342 while (s < send) {
06b5486a
KW
4343 const STRLEN u = UTF8SKIP(s);
4344 STRLEN ulen;
00f254e2 4345
130c5df3 4346#ifdef USE_LOCALE_CTYPE
a1a5ec35 4347 _toLOWER_utf8_flags(s, send, tmpbuf, &ulen, IN_LC_RUNTIME(LC_CTYPE));
130c5df3 4348#else
a1a5ec35 4349 _toLOWER_utf8_flags(s, send, tmpbuf, &ulen, 0);
130c5df3 4350#endif
00f254e2 4351
06b5486a 4352 /* Here is where we would do context-sensitive actions. See the
6006ebd0 4353 * commit message for 86510fb15 for why there isn't any */
00f254e2 4354
06b5486a 4355 if (ulen > u && (SvLEN(dest) < (min += ulen - u))) {
fdb34c52 4356
06b5486a
KW
4357 /* If the eventually required minimum size outgrows the
4358 * available space, we need to grow. */
4359 const UV o = d - (U8*)SvPVX_const(dest);
fdb34c52 4360
06b5486a
KW
4361 /* If someone lowercases one million U+0130s we SvGROW() one
4362 * million times. Or we could try guessing how much to
4363 * allocate without allocating too much. Such is life.
4364 * Another option would be to grow an extra byte or two more
4365 * each time we need to grow, which would cut down the million
4366 * to 500K, with little waste */
10656159 4367 d = o + (U8*) SvGROW(dest, min);
06b5486a 4368 }
86510fb1 4369
06b5486a
KW
4370 /* Copy the newly lowercased letter to the output buffer we're
4371 * building */
4372 Copy(tmpbuf, d, ulen, U8);
4373 d += ulen;
4374 s += u;
00f254e2 4375 } /* End of looping through the source string */
ec9af7d4
NC
4376 SvUTF8_on(dest);
4377 *d = '\0';
4378 SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
00f254e2 4379 } else { /* Not utf8 */
31351b04 4380 if (len) {
ec9af7d4 4381 const U8 *const send = s + len;
00f254e2
KW
4382
4383 /* Use locale casing if in locale; regular style if not treating
4384 * latin1 as having case; otherwise the latin1 casing. Do the
4385 * whole thing in a tight loop, for speed, */
130c5df3 4386#ifdef USE_LOCALE_CTYPE
d6ded950 4387 if (IN_LC_RUNTIME(LC_CTYPE)) {
780fcc9f 4388 _CHECK_AND_WARN_PROBLEMATIC_LOCALE;
ec9af7d4
NC
4389 for (; s < send; d++, s++)
4390 *d = toLOWER_LC(*s);
445bf929 4391 }
130c5df3
KW
4392 else
4393#endif
4394 if (! IN_UNI_8_BIT) {
00f254e2 4395 for (; s < send; d++, s++) {
ec9af7d4 4396 *d = toLOWER(*s);
00f254e2
KW
4397 }
4398 }
4399 else {
4400 for (; s < send; d++, s++) {
4401 *d = toLOWER_LATIN1(*s);
4402 }
31351b04 4403 }
bbce6d69 4404 }
ec9af7d4
NC
4405 if (source != dest) {
4406 *d = '\0';
4407 SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
4408 }
79072805 4409 }
130c5df3 4410#ifdef USE_LOCALE_CTYPE
d6ded950 4411 if (IN_LC_RUNTIME(LC_CTYPE)) {
445bf929
KW
4412 TAINT;
4413 SvTAINTED_on(dest);
4414 }
130c5df3 4415#endif
539689e7
FC
4416 if (dest != source && SvTAINTED(source))
4417 SvTAINT(dest);
ec9af7d4 4418 SvSETMAGIC(dest);
3cb4e04f 4419 return NORMAL;
79072805
LW
4420}
4421
a0d0e21e 4422PP(pp_quotemeta)
79072805 4423{
20b7effb 4424 dSP; dTARGET;
1b6737cc 4425 SV * const sv = TOPs;
a0d0e21e 4426 STRLEN len;
eb578fdb 4427 const char *s = SvPV_const(sv,len);
79072805 4428
7e2040f0 4429 SvUTF8_off(TARG); /* decontaminate */
a0d0e21e 4430 if (len) {
eb578fdb 4431 char *d;
862a34c6 4432 SvUPGRADE(TARG, SVt_PV);
c07a80fd 4433 SvGROW(TARG, (len * 2) + 1);
a0d0e21e 4434 d = SvPVX(TARG);
7e2040f0 4435 if (DO_UTF8(sv)) {
0dd2cdef 4436 while (len) {
29050de5 4437 STRLEN ulen = UTF8SKIP(s);
2e2b2571
KW
4438 bool to_quote = FALSE;
4439
4440 if (UTF8_IS_INVARIANT(*s)) {
4441 if (_isQUOTEMETA(*s)) {
4442 to_quote = TRUE;
4443 }
4444 }
042d9e50 4445 else if (UTF8_IS_NEXT_CHAR_DOWNGRADEABLE(s, s + len)) {
3fea7d29 4446 if (
130c5df3 4447#ifdef USE_LOCALE_CTYPE
20adcf7c
KW
4448 /* In locale, we quote all non-ASCII Latin1 chars.
4449 * Otherwise use the quoting rules */
3fea7d29
BF
4450
4451 IN_LC_RUNTIME(LC_CTYPE)
4452 ||
4453#endif
a62b247b 4454 _isQUOTEMETA(EIGHT_BIT_UTF8_TO_NATIVE(*s, *(s + 1))))
2e2b2571
KW
4455 {
4456 to_quote = TRUE;
4457 }
4458 }
685289b5 4459 else if (is_QUOTEMETA_high(s)) {
2e2b2571
KW
4460 to_quote = TRUE;
4461 }
4462
4463 if (to_quote) {
4464 *d++ = '\\';
4465 }
29050de5
KW
4466 if (ulen > len)
4467 ulen = len;
4468 len -= ulen;
4469 while (ulen--)
4470 *d++ = *s++;
0dd2cdef 4471 }
7e2040f0 4472 SvUTF8_on(TARG);
0dd2cdef 4473 }
2e2b2571
KW
4474 else if (IN_UNI_8_BIT) {
4475 while (len--) {
4476 if (_isQUOTEMETA(*s))
4477 *d++ = '\\';
4478 *d++ = *s++;
4479 }
4480 }
0dd2cdef 4481 else {
2e2b2571
KW
4482 /* For non UNI_8_BIT (and hence in locale) just quote all \W
4483 * including everything above ASCII */
0dd2cdef 4484 while (len--) {
adfec831 4485 if (!isWORDCHAR_A(*s))
0dd2cdef
LW
4486 *d++ = '\\';
4487 *d++ = *s++;
4488 }
79072805 4489 }
a0d0e21e 4490 *d = '\0';
349d4f2f 4491 SvCUR_set(TARG, d - SvPVX_const(TARG));
3aa33fe5 4492 (void)SvPOK_only_UTF8(TARG);
79072805 4493 }
a0d0e21e
LW
4494 else
4495 sv_setpvn(TARG, s, len);
ec93b65f 4496 SETTARG;
cfe40115 4497 return NORMAL;
79072805
LW
4498}
4499
838f2281
BF
4500PP(pp_fc)
4501{
838f2281
BF
4502 dTARGET;
4503 dSP;
4504 SV *source = TOPs;
4505 STRLEN len;
4506 STRLEN min;
4507 SV *dest;
4508 const U8 *s;
4509 const U8 *send;
4510 U8 *d;
bfac13d4 4511 U8 tmpbuf[UTF8_MAXBYTES_CASE + 1];
9b63e895
KW
4512#if UNICODE_MAJOR_VERSION > 3 /* no multifolds in early Unicode */ \
4513 || (UNICODE_MAJOR_VERSION == 3 && ( UNICODE_DOT_VERSION > 0) \
4514 || UNICODE_DOT_DOT_VERSION > 0)
a4b69695
KW
4515 const bool full_folding = TRUE; /* This variable is here so we can easily
4516 move to more generality later */
9b63e895
KW
4517#else
4518 const bool full_folding = FALSE;
4519#endif
838f2281 4520 const U8 flags = ( full_folding ? FOLD_FLAGS_FULL : 0 )
130c5df3
KW
4521#ifdef USE_LOCALE_CTYPE
4522 | ( IN_LC_RUNTIME(LC_CTYPE) ? FOLD_FLAGS_LOCALE : 0 )
4523#endif
4524 ;
838f2281
BF
4525
4526 /* This is a facsimile of pp_lc, but with a thousand bugs thanks to me.
4527 * You are welcome(?) -Hugmeir
4528 */
4529
4530 SvGETMAGIC(source);
4531
4532 dest = TARG;
4533
4534 if (SvOK(source)) {
4535 s = (const U8*)SvPV_nomg_const(source, len);
4536 } else {
4537 if (ckWARN(WARN_UNINITIALIZED))
4538 report_uninit(source);
4539 s = (const U8*)"";
4540 len = 0;
4541 }
4542
4543 min = len + 1;
4544
4545 SvUPGRADE(dest, SVt_PV);
4546 d = (U8*)SvGROW(dest, min);
4547 (void)SvPOK_only(dest);
4548
4549 SETs(dest);
4550
4551 send = s + len;
4552 if (DO_UTF8(source)) { /* UTF-8 flagged string. */
838f2281
BF
4553 while (s < send) {
4554 const STRLEN u = UTF8SKIP(s);
4555 STRLEN ulen;
4556
a1a5ec35 4557 _toFOLD_utf8_flags(s, send, tmpbuf, &ulen, flags);
838f2281
BF
4558
4559 if (ulen > u && (SvLEN(dest) < (min += ulen - u))) {
4560 const UV o = d - (U8*)SvPVX_const(dest);
10656159 4561 d = o + (U8*) SvGROW(dest, min);
838f2281
BF
4562 }
4563
4564 Copy(tmpbuf, d, ulen, U8);
4565 d += ulen;
4566 s += u;
4567 }
4568 SvUTF8_on(dest);
838f2281 4569 } /* Unflagged string */
0902dd32 4570 else if (len) {
130c5df3 4571#ifdef USE_LOCALE_CTYPE
d6ded950 4572 if ( IN_LC_RUNTIME(LC_CTYPE) ) { /* Under locale */
31f05a37
KW
4573 if (IN_UTF8_CTYPE_LOCALE) {
4574 goto do_uni_folding;
4575 }
780fcc9f 4576 _CHECK_AND_WARN_PROBLEMATIC_LOCALE;
838f2281 4577 for (; s < send; d++, s++)
ea36a843 4578 *d = (U8) toFOLD_LC(*s);
838f2281 4579 }
130c5df3
KW
4580 else
4581#endif
4582 if ( !IN_UNI_8_BIT ) { /* Under nothing, or bytes */
838f2281 4583 for (; s < send; d++, s++)
d22b930b 4584 *d = toFOLD(*s);
838f2281
BF
4585 }
4586 else {
91191cf7 4587#ifdef USE_LOCALE_CTYPE
31f05a37 4588 do_uni_folding:
91191cf7 4589#endif
d14578b8
KW
4590 /* For ASCII and the Latin-1 range, there's only two troublesome
4591 * folds, \x{DF} (\N{LATIN SMALL LETTER SHARP S}), which under full
22e255cb 4592 * casefolding becomes 'ss'; and \x{B5} (\N{MICRO SIGN}), which
d14578b8
KW
4593 * under any fold becomes \x{3BC} (\N{GREEK SMALL LETTER MU}) --
4594 * For the rest, the casefold is their lowercase. */
838f2281
BF
4595 for (; s < send; d++, s++) {
4596 if (*s == MICRO_SIGN) {
d14578b8
KW
4597 /* \N{MICRO SIGN}'s casefold is \N{GREEK SMALL LETTER MU},
4598 * which is outside of the latin-1 range. There's a couple
4599 * of ways to deal with this -- khw discusses them in
4600 * pp_lc/uc, so go there :) What we do here is upgrade what
4601 * we had already casefolded, then enter an inner loop that
4602 * appends the rest of the characters as UTF-8. */
838f2281
BF
4603 len = d - (U8*)SvPVX_const(dest);
4604 SvCUR_set(dest, len);
4605 len = sv_utf8_upgrade_flags_grow(dest,
4606 SV_GMAGIC|SV_FORCE_UTF8_UPGRADE,
ea4d335b
KW
4607 /* The max expansion for latin1
4608 * chars is 1 byte becomes 2 */
4609 (send -s) * 2 + 1);
838f2281
BF
4610 d = (U8*)SvPVX(dest) + len;
4611
a78bc3c6
KW
4612 Copy(GREEK_SMALL_LETTER_MU_UTF8, d, small_mu_len, U8);
4613 d += small_mu_len;
838f2281
BF
4614 s++;
4615 for (; s < send; s++) {
4616 STRLEN ulen;
4617 UV fc = _to_uni_fold_flags(*s, tmpbuf, &ulen, flags);
6f2d5cbc 4618 if UVCHR_IS_INVARIANT(fc) {
d14578b8
KW
4619 if (full_folding
4620 && *s == LATIN_SMALL_LETTER_SHARP_S)
4621 {
838f2281
BF
4622 *d++ = 's';
4623 *d++ = 's';
4624 }
4625 else
4626 *d++ = (U8)fc;
4627 }
4628 else {
4629 Copy(tmpbuf, d, ulen, U8);
4630 d += ulen;
4631 }
4632 }
4633 break;
4634 }
4635 else if (full_folding && *s == LATIN_SMALL_LETTER_SHARP_S) {
d14578b8
KW
4636 /* Under full casefolding, LATIN SMALL LETTER SHARP S
4637 * becomes "ss", which may require growing the SV. */
838f2281
BF
4638 if (SvLEN(dest) < ++min) {
4639 const UV o = d - (U8*)SvPVX_const(dest);
10656159 4640 d = o + (U8*) SvGROW(dest, min);
838f2281
BF
4641 }
4642 *(d)++ = 's';
4643 *d = 's';
4644 }
d14578b8
KW
4645 else { /* If it's not one of those two, the fold is their lower
4646 case */
838f2281
BF
4647 *d = toLOWER_LATIN1(*s);
4648 }
4649 }
4650 }
4651 }
4652 *d = '\0';
4653 SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
4654
130c5df3 4655#ifdef USE_LOCALE_CTYPE
d6ded950 4656 if (IN_LC_RUNTIME(LC_CTYPE)) {
445bf929
KW
4657 TAINT;
4658 SvTAINTED_on(dest);
4659 }
130c5df3 4660#endif
838f2281
BF
4661 if (SvTAINTED(source))
4662 SvTAINT(dest);
4663 SvSETMAGIC(dest);
4664 RETURN;
4665}
4666
a0d0e21e 4667/* Arrays. */
79072805 4668
a0d0e21e 4669PP(pp_aslice)
79072805 4670{
20b7effb 4671 dSP; dMARK; dORIGMARK;
eb578fdb
KW
4672 AV *const av = MUTABLE_AV(POPs);
4673 const I32 lval = (PL_op->op_flags & OPf_MOD || LVRET);
79072805 4674
a0d0e21e 4675 if (SvTYPE(av) == SVt_PVAV) {
4ad10a0b
VP
4676 const bool localizing = PL_op->op_private & OPpLVAL_INTRO;
4677 bool can_preserve = FALSE;
4678
4679 if (localizing) {
4680 MAGIC *mg;
4681 HV *stash;
4682
4683 can_preserve = SvCANEXISTDELETE(av);
4684 }
4685
4686 if (lval && localizing) {
eb578fdb 4687 SV **svp;
c70927a6 4688 SSize_t max = -1;
924508f0 4689 for (svp = MARK + 1; svp <= SP; svp++) {
c70927a6 4690 const SSize_t elem = SvIV(*svp);
748a9306
LW
4691 if (elem > max)
4692 max = elem;
4693 }
4694 if (max > AvMAX(av))
4695 av_extend(av, max);
4696 }
4ad10a0b 4697
a0d0e21e 4698 while (++MARK <= SP) {
eb578fdb 4699 SV **svp;
c70927a6 4700 SSize_t elem = SvIV(*MARK);
4ad10a0b 4701 bool preeminent = TRUE;
a0d0e21e 4702
4ad10a0b
VP
4703 if (localizing && can_preserve) {
4704 /* If we can determine whether the element exist,
4705 * Try to preserve the existenceness of a tied array
4706 * element by using EXISTS and DELETE if possible.
4707 * Fallback to FETCH and STORE otherwise. */
4708 preeminent = av_exists(av, elem);
4709 }
4710
a0d0e21e
LW
4711 svp = av_fetch(av, elem, lval);
4712 if (lval) {
ce0d59fd 4713 if (!svp || !*svp)
cea2e8a9 4714 DIE(aTHX_ PL_no_aelem, elem);
4ad10a0b
VP
4715 if (localizing) {
4716 if (preeminent)
4717 save_aelem(av, elem, svp);
4718 else
4719 SAVEADELETE(av, elem);
4720 }
79072805 4721 }
3280af22 4722 *MARK = svp ? *svp : &PL_sv_undef;
79072805
LW
4723 }
4724 }
82334630 4725 if (GIMME_V != G_ARRAY) {
a0d0e21e 4726 MARK = ORIGMARK;
04ab2c87 4727 *++MARK = SP > ORIGMARK ? *SP : &PL_sv_undef;
a0d0e21e
LW
4728 SP = MARK;
4729 }
79072805
LW
4730 RETURN;
4731}
4732
6dd3e0f2
RZ
4733PP(pp_kvaslice)
4734{
20b7effb 4735 dSP; dMARK;
6dd3e0f2
RZ
4736 AV *const av = MUTABLE_AV(POPs);
4737 I32 lval = (PL_op->op_flags & OPf_MOD);
adad97db 4738 SSize_t items = SP - MARK;
6dd3e0f2
RZ
4739
4740 if (PL_op->op_private & OPpMAYBE_LVSUB) {
4741 const I32 flags = is_lvalue_sub();
4742 if (flags) {
4743 if (!(flags & OPpENTERSUB_INARGS))
7aae0299 4744 /* diag_listed_as: Can't modify %s in %s */
6dd3e0f2
RZ
4745 Perl_croak(aTHX_ "Can't modify index/value array slice in list assignment");
4746 lval = flags;
4747 }
4748 }
4749
4750 MEXTEND(SP,items);
4751 while (items > 1) {
4752 *(MARK+items*2-1) = *(MARK+items);
4753 items--;
4754 }
4755 items = SP-MARK;
4756 SP += items;
4757
4758 while (++MARK <= SP) {
4759 SV **svp;
4760
4761 svp = av_fetch(av, SvIV(*MARK), lval);
4762 if (lval) {
4763 if (!svp || !*svp || *svp == &PL_sv_undef) {
4764 DIE(aTHX_ PL_no_aelem, SvIV(*MARK));
4765 }
4766 *MARK = sv_mortalcopy(*MARK);
4767 }
4768 *++MARK = svp ? *svp : &PL_sv_undef;
4769 }
82334630 4770 if (GIMME_V != G_ARRAY) {
6dd3e0f2
RZ
4771 MARK = SP - items*2;
4772 *++MARK = items > 0 ? *SP : &PL_sv_undef;
4773 SP = MARK;
4774 }
4775 RETURN;
4776}
4777
b1c05ba5 4778
878d132a
NC
4779PP(pp_aeach)
4780{
878d132a 4781 dSP;
502c6561 4782 AV *array = MUTABLE_AV(POPs);
1c23e2bd 4783 const U8 gimme = GIMME_V;
453d94a9 4784 IV *iterp = Perl_av_iter_p(aTHX_ array);
878d132a
NC
4785 const IV current = (*iterp)++;
4786
b9f2b683 4787 if (current > av_tindex(array)) {
878d132a
NC
4788 *iterp = 0;
4789 if (gimme == G_SCALAR)
4790 RETPUSHUNDEF;
4791 else
4792 RETURN;
4793 }
4794
4795 EXTEND(SP, 2);
e1dccc0d 4796 mPUSHi(current);
878d132a
NC
4797 if (gimme == G_ARRAY) {
4798 SV **const element = av_fetch(array, current, 0);
4799 PUSHs(element ? *element : &PL_sv_undef);
4800 }
4801 RETURN;
4802}
4803
b1c05ba5 4804/* also used for: pp_avalues()*/
878d132a
NC
4805PP(pp_akeys)
4806{
878d132a 4807 dSP;
502c6561 4808 AV *array = MUTABLE_AV(POPs);
1c23e2bd 4809 const U8 gimme = GIMME_V;
878d132a
NC
4810
4811 *Perl_av_iter_p(aTHX_ array) = 0;
4812
4813 if (gimme == G_SCALAR) {
4814 dTARGET;
b9f2b683 4815 PUSHi(av_tindex(array) + 1);
878d132a
NC
4816 }
4817 else if (gimme == G_ARRAY) {
738155d2
FC
4818 if (UNLIKELY(PL_op->op_private & OPpMAYBE_LVSUB)) {
4819 const I32 flags = is_lvalue_sub();
4820 if (flags && !(flags & OPpENTERSUB_INARGS))
4821 /* diag_listed_as: Can't modify %s in %s */
4822 Perl_croak(aTHX_
4823 "Can't modify keys on array in list assignment");
4824 }
4825 {
878d132a 4826 IV n = Perl_av_len(aTHX_ array);
e1dccc0d 4827 IV i;
878d132a
NC
4828
4829 EXTEND(SP, n + 1);
4830
73665bc4
FC
4831 if ( PL_op->op_type == OP_AKEYS
4832 || ( PL_op->op_type == OP_AVHVSWITCH
cd642408 4833 && (PL_op->op_private & 3) + OP_AEACH == OP_AKEYS ))
73665bc4 4834 {
e1dccc0d 4835 for (i = 0; i <= n; i++) {
878d132a
NC
4836 mPUSHi(i);
4837 }
4838 }
4839 else {
4840 for (i = 0; i <= n; i++) {
4841 SV *const *const elem = Perl_av_fetch(aTHX_ array, i, 0);
4842 PUSHs(elem ? *elem : &PL_sv_undef);
4843 }
4844 }
738155d2 4845 }
878d132a
NC
4846 }
4847 RETURN;
4848}
4849
79072805
LW
4850/* Associative arrays. */
4851
4852PP(pp_each)
4853{
39644a26 4854 dSP;
85fbaab2 4855 HV * hash = MUTABLE_HV(POPs);
c07a80fd 4856 HE *entry;
1c23e2bd 4857 const U8 gimme = GIMME_V;
8ec5e241 4858
6d822dc4 4859 entry = hv_iternext(hash);
79072805 4860
79072805
LW
4861 EXTEND(SP, 2);
4862 if (entry) {
1b6737cc 4863 SV* const sv = hv_iterkeysv(entry);
2b32fed8 4864 PUSHs(sv);
54310121 4865 if (gimme == G_ARRAY) {
59af0135 4866 SV *val;
6d822dc4 4867 val = hv_iterval(hash, entry);
59af0135 4868 PUSHs(val);
79072805 4869 }
79072805 4870 }
54310121 4871 else if (gimme == G_SCALAR)
79072805
LW
4872 RETPUSHUNDEF;
4873
4874 RETURN;
4875}
4876
7332a6c4
VP
4877STATIC OP *
4878S_do_delete_local(pTHX)
79072805 4879{
39644a26 4880 dSP;
1c23e2bd 4881 const U8 gimme = GIMME_V;
7332a6c4
VP
4882 const MAGIC *mg;
4883 HV *stash;
ca3f996a 4884 const bool sliced = !!(PL_op->op_private & OPpSLICE);
626040f7 4885 SV **unsliced_keysv = sliced ? NULL : sp--;
ca3f996a 4886 SV * const osv = POPs;
626040f7 4887 SV **mark = sliced ? PL_stack_base + POPMARK : unsliced_keysv-1;
ca3f996a
FC
4888 dORIGMARK;
4889 const bool tied = SvRMAGICAL(osv)
7332a6c4 4890 && mg_find((const SV *)osv, PERL_MAGIC_tied);
ca3f996a
FC
4891 const bool can_preserve = SvCANEXISTDELETE(osv);
4892 const U32 type = SvTYPE(osv);
626040f7 4893 SV ** const end = sliced ? SP : unsliced_keysv;
ca3f996a
FC
4894
4895 if (type == SVt_PVHV) { /* hash element */
7332a6c4 4896 HV * const hv = MUTABLE_HV(osv);
ca3f996a 4897 while (++MARK <= end) {
7332a6c4
VP
4898 SV * const keysv = *MARK;
4899 SV *sv = NULL;
4900 bool preeminent = TRUE;
4901 if (can_preserve)
4902 preeminent = hv_exists_ent(hv, keysv, 0);
4903 if (tied) {
4904 HE *he = hv_fetch_ent(hv, keysv, 1, 0);
4905 if (he)
4906 sv = HeVAL(he);
4907 else
4908 preeminent = FALSE;
4909 }
4910 else {
4911 sv = hv_delete_ent(hv, keysv, 0, 0);
9332b95f
FC
4912 if (preeminent)
4913 SvREFCNT_inc_simple_void(sv); /* De-mortalize */
7332a6c4
VP
4914 }
4915 if (preeminent) {
be6064fd 4916 if (!sv) DIE(aTHX_ PL_no_helem_sv, SVfARG(keysv));
7332a6c4
VP
4917 save_helem_flags(hv, keysv, &sv, SAVEf_KEEPOLDELEM);
4918 if (tied) {
4919 *MARK = sv_mortalcopy(sv);
4920 mg_clear(sv);
4921 } else
4922 *MARK = sv;
4923 }
4924 else {
4925 SAVEHDELETE(hv, keysv);
4926 *MARK = &PL_sv_undef;
4927 }
4928 }
ca3f996a
FC
4929 }
4930 else if (type == SVt_PVAV) { /* array element */
7332a6c4
VP
4931 if (PL_op->op_flags & OPf_SPECIAL) {
4932 AV * const av = MUTABLE_AV(osv);
ca3f996a 4933 while (++MARK <= end) {
c70927a6 4934 SSize_t idx = SvIV(*MARK);
7332a6c4
VP
4935 SV *sv = NULL;
4936 bool preeminent = TRUE;
4937 if (can_preserve)
4938 preeminent = av_exists(av, idx);
4939 if (tied) {
4940 SV **svp = av_fetch(av, idx, 1);
4941 if (svp)
4942 sv = *svp;
4943 else
4944 preeminent = FALSE;
4945 }
4946 else {
4947 sv = av_delete(av, idx, 0);
9332b95f
FC
4948 if (preeminent)
4949 SvREFCNT_inc_simple_void(sv); /* De-mortalize */
7332a6c4
VP
4950 }
4951 if (preeminent) {
4952 save_aelem_flags(av, idx, &sv, SAVEf_KEEPOLDELEM);
4953 if (tied) {
4954 *MARK = sv_mortalcopy(sv);
4955 mg_clear(sv);
4956 } else
4957 *MARK = sv;
4958 }
4959 else {
4960 SAVEADELETE(av, idx);
4961 *MARK = &PL_sv_undef;
4962 }
4963 }
4964 }
ca3f996a
FC
4965 else
4966 DIE(aTHX_ "panic: avhv_delete no longer supported");
4967 }
4968 else
7332a6c4 4969 DIE(aTHX_ "Not a HASH reference");
ca3f996a 4970 if (sliced) {
7332a6c4
VP
4971 if (gimme == G_VOID)
4972 SP = ORIGMARK;
4973 else if (gimme == G_SCALAR) {
4974 MARK = ORIGMARK;
4975 if (SP > MARK)
4976 *++MARK = *SP;
4977 else
4978 *++MARK = &PL_sv_undef;
4979 SP = MARK;
4980 }
4981 }
ca3f996a 4982 else if (gimme != G_VOID)
626040f7 4983 PUSHs(*unsliced_keysv);
7332a6c4
VP
4984
4985 RETURN;
4986}
4987
4988PP(pp_delete)
4989{
7332a6c4 4990 dSP;
1c23e2bd 4991 U8 gimme;
7332a6c4
VP
4992 I32 discard;
4993
4994 if (PL_op->op_private & OPpLVAL_INTRO)
4995 return do_delete_local();
4996
4997 gimme = GIMME_V;
4998 discard = (gimme == G_VOID) ? G_DISCARD : 0;
5f05dabc 4999
533c011a 5000 if (PL_op->op_private & OPpSLICE) {
5f05dabc 5001 dMARK; dORIGMARK;
85fbaab2 5002 HV * const hv = MUTABLE_HV(POPs);
1b6737cc 5003 const U32 hvtype = SvTYPE(hv);
01020589
GS
5004 if (hvtype == SVt_PVHV) { /* hash element */
5005 while (++MARK <= SP) {
1b6737cc 5006 SV * const sv = hv_delete_ent(hv, *MARK, discard, 0);
01020589
GS
5007 *MARK = sv ? sv : &PL_sv_undef;
5008 }
5f05dabc 5009 }
6d822dc4
MS
5010 else if (hvtype == SVt_PVAV) { /* array element */
5011 if (PL_op->op_flags & OPf_SPECIAL) {
5012 while (++MARK <= SP) {
502c6561 5013 SV * const sv = av_delete(MUTABLE_AV(hv), SvIV(*MARK), discard);
6d822dc4
MS
5014 *MARK = sv ? sv : &PL_sv_undef;
5015 }
5016 }
01020589
GS
5017 }
5018 else
5019 DIE(aTHX_ "Not a HASH reference");
54310121 5020 if (discard)
5021 SP = ORIGMARK;
5022 else if (gimme == G_SCALAR) {
5f05dabc 5023 MARK = ORIGMARK;
9111c9c0
DM
5024 if (SP > MARK)
5025 *++MARK = *SP;
5026 else
5027 *++MARK = &PL_sv_undef;
5f05dabc 5028 SP = MARK;
5029 }
5030 }
5031 else {
5032 SV *keysv = POPs;
85fbaab2 5033 HV * const hv = MUTABLE_HV(POPs);
295d248e 5034 SV *sv = NULL;
97fcbf96
MB
5035 if (SvTYPE(hv) == SVt_PVHV)
5036 sv = hv_delete_ent(hv, keysv, discard, 0);
01020589
GS
5037 else if (SvTYPE(hv) == SVt_PVAV) {
5038 if (PL_op->op_flags & OPf_SPECIAL)
502c6561 5039 sv = av_delete(MUTABLE_AV(hv), SvIV(keysv), discard);
af288a60
HS
5040 else
5041 DIE(aTHX_ "panic: avhv_delete no longer supported");
01020589 5042 }
97fcbf96 5043 else
cea2e8a9 5044 DIE(aTHX_ "Not a HASH reference");
5f05dabc 5045 if (!sv)
3280af22 5046 sv = &PL_sv_undef;
54310121 5047 if (!discard)
5048 PUSHs(sv);
79072805 5049 }
79072805
LW
5050 RETURN;
5051}
5052
a0d0e21e 5053PP(pp_exists)
79072805 5054{
39644a26 5055 dSP;
afebc493
GS
5056 SV *tmpsv;
5057 HV *hv;
5058
c7e88ff3 5059 if (UNLIKELY( PL_op->op_private & OPpEXISTS_SUB )) {
afebc493 5060 GV *gv;
0bd48802 5061 SV * const sv = POPs;
f2c0649b 5062 CV * const cv = sv_2cv(sv, &hv, &gv, 0);
afebc493
GS
5063 if (cv)
5064 RETPUSHYES;
5065 if (gv && isGV(gv) && GvCV(gv) && !GvCVGEN(gv))
5066 RETPUSHYES;
5067 RETPUSHNO;
5068 }
5069 tmpsv = POPs;
85fbaab2 5070 hv = MUTABLE_HV(POPs);
c7e88ff3 5071 if (LIKELY( SvTYPE(hv) == SVt_PVHV )) {
ae77835f 5072 if (hv_exists_ent(hv, tmpsv, 0))
c750a3ec 5073 RETPUSHYES;
ef54e1a4
JH
5074 }
5075 else if (SvTYPE(hv) == SVt_PVAV) {
01020589 5076 if (PL_op->op_flags & OPf_SPECIAL) { /* array element */
502c6561 5077 if (av_exists(MUTABLE_AV(hv), SvIV(tmpsv)))
01020589
GS
5078 RETPUSHYES;
5079 }
ef54e1a4
JH
5080 }
5081 else {
cea2e8a9 5082 DIE(aTHX_ "Not a HASH reference");
a0d0e21e 5083 }
a0d0e21e
LW
5084 RETPUSHNO;
5085}
79072805 5086
a0d0e21e
LW
5087PP(pp_hslice)
5088{
20b7effb 5089 dSP; dMARK; dORIGMARK;
eb578fdb
KW
5090 HV * const hv = MUTABLE_HV(POPs);
5091 const I32 lval = (PL_op->op_flags & OPf_MOD || LVRET);
1b6737cc 5092 const bool localizing = PL_op->op_private & OPpLVAL_INTRO;
d30e492c 5093 bool can_preserve = FALSE;
79072805 5094
eb85dfd3
DM
5095 if (localizing) {
5096 MAGIC *mg;
5097 HV *stash;
5098
2c5f48c2 5099 if (SvCANEXISTDELETE(hv))
d30e492c 5100 can_preserve = TRUE;
eb85dfd3
DM
5101 }
5102
6d822dc4 5103 while (++MARK <= SP) {
1b6737cc 5104 SV * const keysv = *MARK;
6d822dc4
MS
5105 SV **svp;
5106 HE *he;
d30e492c
VP
5107 bool preeminent = TRUE;
5108
5109 if (localizing && can_preserve) {
5110 /* If we can determine whether the element exist,
5111 * try to preserve the existenceness of a tied hash
5112 * element by using EXISTS and DELETE if possible.
5113 * Fallback to FETCH and STORE otherwise. */
5114 preeminent = hv_exists_ent(hv, keysv, 0);
6d822dc4 5115 }
eb85dfd3 5116
6d822dc4 5117 he = hv_fetch_ent(hv, keysv, lval, 0);
fe5bfecd 5118 svp = he ? &HeVAL(he) : NULL;
eb85dfd3 5119
6d822dc4 5120 if (lval) {
746f6409 5121 if (!svp || !*svp || *svp == &PL_sv_undef) {
be2597df 5122 DIE(aTHX_ PL_no_helem_sv, SVfARG(keysv));
6d822dc4
MS
5123 }
5124 if (localizing) {
7a2e501a 5125 if (HvNAME_get(hv) && isGV(*svp))
159b6efe 5126 save_gp(MUTABLE_GV(*svp), !(PL_op->op_flags & OPf_SPECIAL));
47cfc530
VP
5127 else if (preeminent)
5128 save_helem_flags(hv, keysv, svp,
5129 (PL_op->op_flags & OPf_SPECIAL) ? 0 : SAVEf_SETMAGIC);
5130 else
5131 SAVEHDELETE(hv, keysv);
6d822dc4
MS
5132 }
5133 }
746f6409 5134 *MARK = svp && *svp ? *svp : &PL_sv_undef;
79072805 5135 }
82334630 5136 if (GIMME_V != G_ARRAY) {
a0d0e21e 5137 MARK = ORIGMARK;
04ab2c87 5138 *++MARK = SP > ORIGMARK ? *SP : &PL_sv_undef;
a0d0e21e 5139 SP = MARK;
79072805 5140 }
a0d0e21e
LW
5141 RETURN;
5142}
5143
5cae3edb
RZ
5144PP(pp_kvhslice)
5145{
20b7effb 5146 dSP; dMARK;
5cae3edb
RZ
5147 HV * const hv = MUTABLE_HV(POPs);
5148 I32 lval = (PL_op->op_flags & OPf_MOD);
adad97db 5149 SSize_t items = SP - MARK;
5cae3edb
RZ
5150
5151 if (PL_op->op_private & OPpMAYBE_LVSUB) {
5152 const I32 flags = is_lvalue_sub();
5153 if (flags) {
5154 if (!(flags & OPpENTERSUB_INARGS))
7aae0299 5155 /* diag_listed_as: Can't modify %s in %s */
cc5f9b8a
FC
5156 Perl_croak(aTHX_ "Can't modify key/value hash slice in %s assignment",
5157 GIMME_V == G_ARRAY ? "list" : "scalar");
5cae3edb
RZ
5158 lval = flags;
5159 }
5160 }
5161
5162 MEXTEND(SP,items);
5163 while (items > 1) {
5164 *(MARK+items*2-1) = *(MARK+items);
5165 items--;
5166 }
5167 items = SP-MARK;
5168 SP += items;
5169
5170 while (++MARK <= SP) {
5171 SV * const keysv = *MARK;
5172 SV **svp;
5173 HE *he;
5174
5175 he = hv_fetch_ent(hv, keysv, lval, 0);
5176 svp = he ? &HeVAL(he) : NULL;
5177
5178 if (lval) {
5179 if (!svp || !*svp || *svp == &PL_sv_undef) {
5180 DIE(aTHX_ PL_no_helem_sv, SVfARG(keysv));
5181 }
5182 *MARK = sv_mortalcopy(*MARK);
5183 }
5184 *++MARK = svp && *svp ? *svp : &PL_sv_undef;
5185 }
82334630 5186 if (GIMME_V != G_ARRAY) {
5cae3edb
RZ
5187 MARK = SP - items*2;
5188 *++MARK = items > 0 ? *SP : &PL_sv_undef;
5189 SP = MARK;
5190 }
5191 RETURN;
5192}
5193
a0d0e21e
LW
5194/* List operators. */
5195
5196PP(pp_list)
5197{
4fa715fa 5198 I32 markidx = POPMARK;
82334630 5199 if (GIMME_V != G_ARRAY) {
4fa715fa
DD
5200 SV **mark = PL_stack_base + markidx;
5201 dSP;
a0d0e21e
LW
5202 if (++MARK <= SP)
5203 *MARK = *SP; /* unwanted list, return last item */
8990e307 5204 else
3280af22 5205 *MARK = &PL_sv_undef;
a0d0e21e 5206 SP = MARK;
4fa715fa 5207 PUTBACK;
79072805 5208 }
4fa715fa 5209 return NORMAL;
79072805
LW
5210}
5211
a0d0e21e 5212PP(pp_lslice)
79072805 5213{
39644a26 5214 dSP;
1b6737cc
AL
5215 SV ** const lastrelem = PL_stack_sp;
5216 SV ** const lastlelem = PL_stack_base + POPMARK;
5217 SV ** const firstlelem = PL_stack_base + POPMARK + 1;
eb578fdb 5218 SV ** const firstrelem = lastlelem + 1;
706a6ebc 5219 const U8 mod = PL_op->op_flags & OPf_MOD;
1b6737cc 5220
eb578fdb
KW
5221 const I32 max = lastrelem - lastlelem;
5222 SV **lelem;
a0d0e21e 5223
82334630 5224 if (GIMME_V != G_ARRAY) {
9e59c36b
TC
5225 if (lastlelem < firstlelem) {
5226 *firstlelem = &PL_sv_undef;
5227 }
5228 else {
5229 I32 ix = SvIV(*lastlelem);
5230 if (ix < 0)
5231 ix += max;
5232 if (ix < 0 || ix >= max)
5233 *firstlelem = &PL_sv_undef;
5234 else
5235 *firstlelem = firstrelem[ix];
5236 }
5237 SP = firstlelem;
5238 RETURN;
a0d0e21e
LW
5239 }
5240
5241 if (max == 0) {
5242 SP = firstlelem - 1;
5243 RETURN;
5244 }
5245
5246 for (lelem = firstlelem; lelem <= lastlelem; lelem++) {
4ea561bc 5247 I32 ix = SvIV(*lelem);
c73bf8e3 5248 if (ix < 0)
a0d0e21e 5249 ix += max;
c73bf8e3
HS
5250 if (ix < 0 || ix >= max)
5251 *lelem = &PL_sv_undef;
5252 else {
c73bf8e3 5253 if (!(*lelem = firstrelem[ix]))
3280af22 5254 *lelem = &PL_sv_undef;
60779a30 5255 else if (mod && SvPADTMP(*lelem)) {
706a6ebc 5256 *lelem = firstrelem[ix] = sv_mortalcopy(*lelem);
60779a30 5257 }
748a9306 5258 }
79072805 5259 }
cbce292e 5260 SP = lastlelem;
79072805
LW
5261 RETURN;
5262}
5263
a0d0e21e
LW
5264PP(pp_anonlist)
5265{
20b7effb 5266 dSP; dMARK;
1b6737cc 5267 const I32 items = SP - MARK;
ad64d0ec 5268 SV * const av = MUTABLE_SV(av_make(items, MARK+1));
31476221 5269 SP = MARK;
6e449a3a
MHM
5270 mXPUSHs((PL_op->op_flags & OPf_SPECIAL)
5271 ? newRV_noinc(av) : av);
a0d0e21e
LW
5272 RETURN;
5273}
5274
5275PP(pp_anonhash)
79072805 5276{
20b7effb 5277 dSP; dMARK; dORIGMARK;
67e67fd7 5278 HV* const hv = newHV();
8d455b9f 5279 SV* const retval = sv_2mortal( PL_op->op_flags & OPf_SPECIAL
67e67fd7 5280 ? newRV_noinc(MUTABLE_SV(hv))
8d455b9f 5281 : MUTABLE_SV(hv) );
a0d0e21e
LW
5282
5283 while (MARK < SP) {
3ed356df
FC
5284 SV * const key =
5285 (MARK++, SvGMAGICAL(*MARK) ? sv_mortalcopy(*MARK) : *MARK);
5286 SV *val;
a0d0e21e 5287 if (MARK < SP)
3ed356df
FC
5288 {
5289 MARK++;
5290 SvGETMAGIC(*MARK);
5291 val = newSV(0);
d187b712 5292 sv_setsv_nomg(val, *MARK);
3ed356df 5293 }
a2a5de95 5294 else
3ed356df 5295 {
a2a5de95 5296 Perl_ck_warner(aTHX_ packWARN(WARN_MISC), "Odd number of elements in anonymous hash");
3ed356df
FC
5297 val = newSV(0);
5298 }
f12c7020 5299 (void)hv_store_ent(hv,key,val,0);
79072805 5300 }
a0d0e21e 5301 SP = ORIGMARK;
8d455b9f 5302 XPUSHs(retval);
79072805
LW
5303 RETURN;
5304}
5305
a0d0e21e 5306PP(pp_splice)
79072805 5307{
20b7effb 5308 dSP; dMARK; dORIGMARK;
5cd408a2 5309 int num_args = (SP - MARK);
00576728 5310 AV *ary = MUTABLE_AV(*++MARK);
eb578fdb
KW
5311 SV **src;
5312 SV **dst;
c70927a6
FC
5313 SSize_t i;
5314 SSize_t offset;
5315 SSize_t length;
5316 SSize_t newlen;
5317 SSize_t after;
5318 SSize_t diff;
ad64d0ec 5319 const MAGIC * const mg = SvTIED_mg((const SV *)ary, PERL_MAGIC_tied);
93965878 5320
1b6737cc 5321 if (mg) {
3e0cb5de 5322 return Perl_tied_method(aTHX_ SV_CONST(SPLICE), mark - 1, MUTABLE_SV(ary), mg,
af71faff
NC
5323 GIMME_V | TIED_METHOD_ARGUMENTS_ON_STACK,
5324 sp - mark);
93965878 5325 }
79072805 5326
a0d0e21e 5327 SP++;
79072805 5328
a0d0e21e 5329 if (++MARK < SP) {
4ea561bc 5330 offset = i = SvIV(*MARK);
a0d0e21e 5331 if (offset < 0)
93965878 5332 offset += AvFILLp(ary) + 1;
84902520 5333 if (offset < 0)
cea2e8a9 5334 DIE(aTHX_ PL_no_aelem, i);
a0d0e21e
LW
5335 if (++MARK < SP) {
5336 length = SvIVx(*MARK++);
48cdf507
GA
5337 if (length < 0) {
5338 length += AvFILLp(ary) - offset + 1;
5339 if (length < 0)
5340 length = 0;
5341 }
79072805
LW
5342 }
5343 else
a0d0e21e 5344 length = AvMAX(ary) + 1; /* close enough to infinity */
79072805 5345 }
a0d0e21e
LW
5346 else {
5347 offset = 0;
5348 length = AvMAX(ary) + 1;
5349 }
8cbc2e3b 5350 if (offset > AvFILLp(ary) + 1) {
5cd408a2
EB
5351 if (num_args > 2)
5352 Perl_ck_warner(aTHX_ packWARN(WARN_MISC), "splice() offset past end of array" );
93965878 5353 offset = AvFILLp(ary) + 1;
8cbc2e3b 5354 }
93965878 5355 after = AvFILLp(ary) + 1 - (offset + length);
a0d0e21e
LW
5356 if (after < 0) { /* not that much array */
5357 length += after; /* offset+length now in array */
5358 after = 0;
5359 if (!AvALLOC(ary))
5360 av_extend(ary, 0);
5361 }
5362
5363 /* At this point, MARK .. SP-1 is our new LIST */
5364
5365 newlen = SP - MARK;
5366 diff = newlen - length;
13d7cbc1
GS
5367 if (newlen && !AvREAL(ary) && AvREIFY(ary))
5368 av_reify(ary);
a0d0e21e 5369
50528de0
WL
5370 /* make new elements SVs now: avoid problems if they're from the array */
5371 for (dst = MARK, i = newlen; i; i--) {
1b6737cc 5372 SV * const h = *dst;
f2b990bf 5373 *dst++ = newSVsv(h);
50528de0
WL
5374 }
5375
a0d0e21e 5376 if (diff < 0) { /* shrinking the area */
95b63a38 5377 SV **tmparyval = NULL;
a0d0e21e 5378 if (newlen) {
a02a5408 5379 Newx(tmparyval, newlen, SV*); /* so remember insertion */
a0d0e21e 5380 Copy(MARK, tmparyval, newlen, SV*);
79072805 5381 }
a0d0e21e
LW
5382
5383 MARK = ORIGMARK + 1;
82334630 5384 if (GIMME_V == G_ARRAY) { /* copy return vals to stack */
31c61add 5385 const bool real = cBOOL(AvREAL(ary));
a0d0e21e 5386 MEXTEND(MARK, length);
31c61add 5387 if (real)
bbce6d69 5388 EXTEND_MORTAL(length);
31c61add
FC
5389 for (i = 0, dst = MARK; i < length; i++) {
5390 if ((*dst = AvARRAY(ary)[i+offset])) {
5391 if (real)
486ec47a 5392 sv_2mortal(*dst); /* free them eventually */
36477c24 5393 }
31c61add
FC
5394 else
5395 *dst = &PL_sv_undef;
5396 dst++;
a0d0e21e
LW
5397 }
5398 MARK += length - 1;
79072805 5399 }
a0d0e21e
LW
5400 else {
5401 *MARK = AvARRAY(ary)[offset+length-1];
5402 if (AvREAL(ary)) {
d689ffdd 5403 sv_2mortal(*MARK);
a0d0e21e
LW
5404 for (i = length - 1, dst = &AvARRAY(ary)[offset]; i > 0; i--)
5405 SvREFCNT_dec(*dst++); /* free them now */
79072805 5406 }
92b69f65
FC
5407 if (!*MARK)
5408 *MARK = &PL_sv_undef;
a0d0e21e 5409 }
93965878 5410 AvFILLp(ary) += diff;
a0d0e21e
LW
5411
5412 /* pull up or down? */
5413
5414 if (offset < after) { /* easier to pull up */
5415 if (offset) { /* esp. if nothing to pull */
5416 src = &AvARRAY(ary)[offset-1];
5417 dst = src - diff; /* diff is negative */
5418 for (i = offset; i > 0; i--) /* can't trust Copy */
5419 *dst-- = *src--;
79072805 5420 }
a0d0e21e 5421 dst = AvARRAY(ary);
9c6bc640 5422 AvARRAY(ary) = AvARRAY(ary) - diff; /* diff is negative */
a0d0e21e
LW
5423 AvMAX(ary) += diff;
5424 }
5425 else {
5426 if (after) { /* anything to pull down? */
5427 src = AvARRAY(ary) + offset + length;
5428 dst = src + diff; /* diff is negative */
5429 Move(src, dst, after, SV*);
79072805 5430 }
93965878 5431 dst = &AvARRAY(ary)[AvFILLp(ary)+1];
a0d0e21e
LW
5432 /* avoid later double free */
5433 }
5434 i = -diff;
5435 while (i)
ce0d59fd 5436 dst[--i] = NULL;
a0d0e21e
LW
5437
5438 if (newlen) {
50528de0 5439 Copy( tmparyval, AvARRAY(ary) + offset, newlen, SV* );
a0d0e21e
LW
5440 Safefree(tmparyval);
5441 }
5442 }
5443 else { /* no, expanding (or same) */
d3961450 5444 SV** tmparyval = NULL;
a0d0e21e 5445 if (length) {
a02a5408 5446 Newx(tmparyval, length, SV*); /* so remember deletion */
a0d0e21e
LW
5447 Copy(AvARRAY(ary)+offset, tmparyval, length, SV*);
5448 }
5449
5450 if (diff > 0) { /* expanding */
a0d0e21e 5451 /* push up or down? */
a0d0e21e
LW
5452 if (offset < after && diff <= AvARRAY(ary) - AvALLOC(ary)) {
5453 if (offset) {
5454 src = AvARRAY(ary);
5455 dst = src - diff;
5456 Move(src, dst, offset, SV*);
79072805 5457 }
9c6bc640 5458 AvARRAY(ary) = AvARRAY(ary) - diff;/* diff is positive */
a0d0e21e 5459 AvMAX(ary) += diff;
93965878 5460 AvFILLp(ary) += diff;
79072805
LW
5461 }
5462 else {
93965878
NIS
5463 if (AvFILLp(ary) + diff >= AvMAX(ary)) /* oh, well */
5464 av_extend(ary, AvFILLp(ary) + diff);
5465 AvFILLp(ary) += diff;
a0d0e21e
LW
5466
5467 if (after) {
93965878 5468 dst = AvARRAY(ary) + AvFILLp(ary);
a0d0e21e
LW
5469 src = dst - diff;
5470 for (i = after; i; i--) {
5471 *dst-- = *src--;
5472 }
79072805
LW
5473 }
5474 }
a0d0e21e
LW
5475 }
5476
50528de0
WL
5477 if (newlen) {
5478 Copy( MARK, AvARRAY(ary) + offset, newlen, SV* );
a0d0e21e 5479 }
50528de0 5480
a0d0e21e 5481 MARK = ORIGMARK + 1;
82334630 5482 if (GIMME_V == G_ARRAY) { /* copy return vals to stack */
a0d0e21e 5483 if (length) {
31c61add
FC
5484 const bool real = cBOOL(AvREAL(ary));
5485 if (real)
bbce6d69 5486 EXTEND_MORTAL(length);
31c61add
FC
5487 for (i = 0, dst = MARK; i < length; i++) {
5488 if ((*dst = tmparyval[i])) {
5489 if (real)
486ec47a 5490 sv_2mortal(*dst); /* free them eventually */
36477c24 5491 }
31c61add
FC
5492 else *dst = &PL_sv_undef;
5493 dst++;
79072805
LW
5494 }
5495 }
a0d0e21e
LW
5496 MARK += length - 1;
5497 }
5498 else if (length--) {
5499 *MARK = tmparyval[length];
5500 if (AvREAL(ary)) {
d689ffdd 5501 sv_2mortal(*MARK);
a0d0e21e
LW
5502 while (length-- > 0)
5503 SvREFCNT_dec(tmparyval[length]);
79072805 5504 }
92b69f65
FC
5505 if (!*MARK)
5506 *MARK = &PL_sv_undef;
79072805 5507 }
a0d0e21e 5508 else
3280af22 5509 *MARK = &PL_sv_undef;
d3961450 5510 Safefree(tmparyval);
79072805 5511 }
474af990
FR
5512
5513 if (SvMAGICAL(ary))
5514 mg_set(MUTABLE_SV(ary));
5515
a0d0e21e 5516 SP = MARK;
79072805
LW
5517 RETURN;
5518}
5519
a0d0e21e 5520PP(pp_push)
79072805 5521{
20b7effb 5522 dSP; dMARK; dORIGMARK; dTARGET;
00576728 5523 AV * const ary = MUTABLE_AV(*++MARK);
ad64d0ec 5524 const MAGIC * const mg = SvTIED_mg((const SV *)ary, PERL_MAGIC_tied);
79072805 5525
1b6737cc 5526 if (mg) {
ad64d0ec 5527 *MARK-- = SvTIED_obj(MUTABLE_SV(ary), mg);
93965878
NIS
5528 PUSHMARK(MARK);
5529 PUTBACK;
d343c3ef 5530 ENTER_with_name("call_PUSH");
3e0cb5de 5531 call_sv(SV_CONST(PUSH),G_SCALAR|G_DISCARD|G_METHOD_NAMED);
d343c3ef 5532 LEAVE_with_name("call_PUSH");
01072573 5533 /* SPAGAIN; not needed: SP is assigned to immediately below */
93965878 5534 }
a60c0954 5535 else {
a68090fe
DM
5536 /* PL_delaymagic is restored by JUMPENV_POP on dieing, so we
5537 * only need to save locally, not on the save stack */
5538 U16 old_delaymagic = PL_delaymagic;
5539
cb077ed2 5540 if (SvREADONLY(ary) && MARK < SP) Perl_croak_no_modify();
89c14e2e 5541 PL_delaymagic = DM_DELAY;
a60c0954 5542 for (++MARK; MARK <= SP; MARK++) {
3ed356df
FC
5543 SV *sv;
5544 if (*MARK) SvGETMAGIC(*MARK);
5545 sv = newSV(0);
a60c0954 5546 if (*MARK)
3ed356df 5547 sv_setsv_nomg(sv, *MARK);
0a75904b 5548 av_store(ary, AvFILLp(ary)+1, sv);
a60c0954 5549 }
354b0578 5550 if (PL_delaymagic & DM_ARRAY_ISA)
ad64d0ec 5551 mg_set(MUTABLE_SV(ary));
a68090fe 5552 PL_delaymagic = old_delaymagic;
6eeabd23
VP
5553 }
5554 SP = ORIGMARK;
5555 if (OP_GIMME(PL_op, 0) != G_VOID) {
5556 PUSHi( AvFILL(ary) + 1 );
79072805 5557 }
79072805
LW
5558 RETURN;
5559}
5560
b1c05ba5 5561/* also used for: pp_pop()*/
a0d0e21e 5562PP(pp_shift)
79072805 5563{
39644a26 5564 dSP;
538f5756 5565 AV * const av = PL_op->op_flags & OPf_SPECIAL
94f9945d 5566 ? MUTABLE_AV(GvAVn(PL_defgv)) : MUTABLE_AV(POPs);
789b4bc9 5567 SV * const sv = PL_op->op_type == OP_SHIFT ? av_shift(av) : av_pop(av);
79072805 5568 EXTEND(SP, 1);
c2b4a044 5569 assert (sv);
d689ffdd 5570 if (AvREAL(av))
a0d0e21e
LW
5571 (void)sv_2mortal(sv);
5572 PUSHs(sv);
79072805 5573 RETURN;
79072805
LW
5574}
5575
a0d0e21e 5576PP(pp_unshift)
79072805 5577{
20b7effb 5578 dSP; dMARK; dORIGMARK; dTARGET;
00576728 5579 AV *ary = MUTABLE_AV(*++MARK);
ad64d0ec 5580 const MAGIC * const mg = SvTIED_mg((const SV *)ary, PERL_MAGIC_tied);
93965878 5581
1b6737cc 5582 if (mg) {
ad64d0ec 5583 *MARK-- = SvTIED_obj(MUTABLE_SV(ary), mg);
7fd66d9d 5584 PUSHMARK(MARK);
93965878 5585 PUTBACK;
d343c3ef 5586 ENTER_with_name("call_UNSHIFT");
36925d9e 5587 call_sv(SV_CONST(UNSHIFT),G_SCALAR|G_DISCARD|G_METHOD_NAMED);
d343c3ef 5588 LEAVE_with_name("call_UNSHIFT");
01072573 5589 /* SPAGAIN; not needed: SP is assigned to immediately below */
93965878 5590 }
a60c0954 5591 else {
a68090fe
DM
5592 /* PL_delaymagic is restored by JUMPENV_POP on dieing, so we
5593 * only need to save locally, not on the save stack */
5594 U16 old_delaymagic = PL_delaymagic;
c70927a6 5595 SSize_t i = 0;
a68090fe 5596
a60c0954 5597 av_unshift(ary, SP - MARK);
39539141 5598 PL_delaymagic = DM_DELAY;
a60c0954 5599 while (MARK < SP) {
1b6737cc 5600 SV * const sv = newSVsv(*++MARK);
a60c0954
NIS
5601 (void)av_store(ary, i++, sv);
5602 }
39539141
DIM
5603 if (PL_delaymagic & DM_ARRAY_ISA)
5604 mg_set(MUTABLE_SV(ary));
a68090fe 5605 PL_delaymagic = old_delaymagic;
79072805 5606 }
a0d0e21e 5607 SP = ORIGMARK;
6eeabd23 5608 if (OP_GIMME(PL_op, 0) != G_VOID) {
5658d0a9
LR
5609 PUSHi( AvFILL(ary) + 1 );
5610 }
79072805 5611 RETURN;
79072805
LW
5612}
5613
a0d0e21e 5614PP(pp_reverse)
79072805 5615{
20b7effb 5616 dSP; dMARK;
79072805 5617
82334630 5618 if (GIMME_V == G_ARRAY) {
484c818f
VP
5619 if (PL_op->op_private & OPpREVERSE_INPLACE) {
5620 AV *av;
5621
5622 /* See pp_sort() */
5623 assert( MARK+1 == SP && *SP && SvTYPE(*SP) == SVt_PVAV);
5624 (void)POPMARK; /* remove mark associated with ex-OP_AASSIGN */
5625 av = MUTABLE_AV((*SP));
5626 /* In-place reversing only happens in void context for the array
5627 * assignment. We don't need to push anything on the stack. */
5628 SP = MARK;
5629
5630 if (SvMAGICAL(av)) {
c70927a6 5631 SSize_t i, j;
eb578fdb 5632 SV *tmp = sv_newmortal();
484c818f
VP
5633 /* For SvCANEXISTDELETE */
5634 HV *stash;
5635 const MAGIC *mg;
5636 bool can_preserve = SvCANEXISTDELETE(av);
5637
b9f2b683 5638 for (i = 0, j = av_tindex(av); i < j; ++i, --j) {
eb578fdb 5639 SV *begin, *end;
484c818f
VP
5640
5641 if (can_preserve) {
5642 if (!av_exists(av, i)) {
5643 if (av_exists(av, j)) {
eb578fdb 5644 SV *sv = av_delete(av, j, 0);
484c818f
VP
5645 begin = *av_fetch(av, i, TRUE);
5646 sv_setsv_mg(begin, sv);
5647 }
5648 continue;
5649 }
5650 else if (!av_exists(av, j)) {
eb578fdb 5651 SV *sv = av_delete(av, i, 0);
484c818f
VP
5652 end = *av_fetch(av, j, TRUE);
5653 sv_setsv_mg(end, sv);
5654 continue;
5655 }
5656 }
5657
5658 begin = *av_fetch(av, i, TRUE);
5659 end = *av_fetch(av, j, TRUE);
5660 sv_setsv(tmp, begin);
5661 sv_setsv_mg(begin, end);
5662 sv_setsv_mg(end, tmp);
5663 }
5664 }
5665 else {
5666 SV **begin = AvARRAY(av);
484c818f 5667
95a26d8e
VP
5668 if (begin) {
5669 SV **end = begin + AvFILLp(av);
5670
5671 while (begin < end) {
eb578fdb 5672 SV * const tmp = *begin;
95a26d8e
VP
5673 *begin++ = *end;
5674 *end-- = tmp;
5675 }
484c818f
VP
5676 }
5677 }
5678 }
5679 else {
5680 SV **oldsp = SP;
5681 MARK++;
5682 while (MARK < SP) {
eb578fdb 5683 SV * const tmp = *MARK;
484c818f
VP
5684 *MARK++ = *SP;
5685 *SP-- = tmp;
5686 }
5687 /* safe as long as stack cannot get extended in the above */
5688 SP = oldsp;
a0d0e21e 5689 }
79072805
LW
5690 }
5691 else {
eb578fdb 5692 char *up;
a0d0e21e
LW
5693 dTARGET;
5694 STRLEN len;
79072805 5695
7e2040f0 5696 SvUTF8_off(TARG); /* decontaminate */
a0d0e21e 5697 if (SP - MARK > 1)
3280af22 5698 do_join(TARG, &PL_sv_no, MARK, SP);
1e21d011 5699 else {
64d3d9fe 5700 sv_setsv(TARG, SP > MARK ? *SP : DEFSV);
1e21d011
B
5701 }
5702
a0d0e21e
LW
5703 up = SvPV_force(TARG, len);
5704 if (len > 1) {
19742f39 5705 char *down;
7e2040f0 5706 if (DO_UTF8(TARG)) { /* first reverse each character */
dfe13c55 5707 U8* s = (U8*)SvPVX(TARG);
349d4f2f 5708 const U8* send = (U8*)(s + len);
a0ed51b3 5709 while (s < send) {
d742c382 5710 if (UTF8_IS_INVARIANT(*s)) {
a0ed51b3
LW
5711 s++;
5712 continue;
5713 }
5714 else {
4b88fb76 5715 if (!utf8_to_uvchr_buf(s, send, 0))
a0dbb045 5716 break;
dfe13c55 5717 up = (char*)s;
a0ed51b3 5718 s += UTF8SKIP(s);
dfe13c55 5719 down = (char*)(s - 1);
a0dbb045 5720 /* reverse this character */
a0ed51b3 5721 while (down > up) {
19742f39 5722 const char tmp = *up;
a0ed51b3 5723 *up++ = *down;
19742f39 5724 *down-- = tmp;
a0ed51b3
LW
5725 }
5726 }
5727 }
5728 up = SvPVX(TARG);
5729 }
a0d0e21e
LW
5730 down = SvPVX(TARG) + len - 1;
5731 while (down > up) {
19742f39 5732 const char tmp = *up;
a0d0e21e 5733 *up++ = *down;
19742f39 5734 *down-- = tmp;
a0d0e21e 5735 }
3aa33fe5 5736 (void)SvPOK_only_UTF8(TARG);
79072805 5737 }
a0d0e21e
LW
5738 SP = MARK + 1;
5739 SETTARG;
79072805 5740 }
a0d0e21e 5741 RETURN;
79072805
LW
5742}
5743
a0d0e21e 5744PP(pp_split)
79072805 5745{
20b7effb 5746 dSP; dTARG;
692044df
DM
5747 AV *ary = ( (PL_op->op_private & OPpSPLIT_ASSIGN) /* @a = split */
5748 && (PL_op->op_flags & OPf_STACKED)) /* @{expr} = split */
5012eebe 5749 ? (AV *)POPs : NULL;
eb578fdb 5750 IV limit = POPi; /* note, negative is forever */
1b6737cc 5751 SV * const sv = POPs;
a0d0e21e 5752 STRLEN len;
eb578fdb 5753 const char *s = SvPV_const(sv, len);
1b6737cc 5754 const bool do_utf8 = DO_UTF8(sv);
727b7506 5755 const char *strend = s + len;
5012eebe 5756 PMOP *pm = cPMOPx(PL_op);
eb578fdb
KW
5757 REGEXP *rx;
5758 SV *dstr;
5759 const char *m;
c70927a6 5760 SSize_t iters = 0;
d14578b8
KW
5761 const STRLEN slen = do_utf8
5762 ? utf8_length((U8*)s, (U8*)strend)
5763 : (STRLEN)(strend - s);
c70927a6 5764 SSize_t maxiters = slen + 10;
c1a7495a 5765 I32 trailing_empty = 0;
727b7506 5766 const char *orig;
052a7c76 5767 const IV origlimit = limit;
a0d0e21e
LW
5768 I32 realarray = 0;
5769 I32 base;
1c23e2bd 5770 const U8 gimme = GIMME_V;
941446f6 5771 bool gimme_scalar;
692044df 5772 I32 oldsave = PL_savestack_ix;
437d3b4e 5773 U32 make_mortal = SVs_TEMP;
7fba1cd6 5774 bool multiline = 0;
b37c2d43 5775 MAGIC *mg = NULL;
79072805 5776
aaa362c4 5777 rx = PM_GETRE(pm);
bbce6d69 5778
a62b1201 5779 TAINT_IF(get_regex_charset(RX_EXTFLAGS(rx)) == REGEX_LOCALE_CHARSET &&
dbc200c5 5780 (RX_EXTFLAGS(rx) & (RXf_WHITE | RXf_SKIPWHITE)));
bbce6d69 5781
692044df 5782 /* handle @ary = split(...) optimisation */
5012eebe
DM
5783 if (PL_op->op_private & OPpSPLIT_ASSIGN) {
5784 if (!(PL_op->op_flags & OPf_STACKED)) {
692044df
DM
5785 if (PL_op->op_private & OPpSPLIT_LEX) {
5786 if (PL_op->op_private & OPpLVAL_INTRO)
5787 SAVECLEARSV(PAD_SVl(pm->op_pmreplrootu.op_pmtargetoff));
5012eebe 5788 ary = (AV *)PAD_SVl(pm->op_pmreplrootu.op_pmtargetoff);
692044df 5789 }
5012eebe
DM
5790 else {
5791 GV *gv =
971a9dd3 5792#ifdef USE_ITHREADS
5012eebe 5793 MUTABLE_GV(PAD_SVl(pm->op_pmreplrootu.op_pmtargetoff));
971a9dd3 5794#else
5012eebe 5795 pm->op_pmreplrootu.op_pmtargetgv;
20e98b0f 5796#endif
692044df
DM
5797 if (PL_op->op_private & OPpLVAL_INTRO)
5798 ary = save_ary(gv);
5799 else
5800 ary = GvAVn(gv);
5012eebe 5801 }
692044df
DM
5802 /* skip anything pushed by OPpLVAL_INTRO above */
5803 oldsave = PL_savestack_ix;
5012eebe
DM
5804 }
5805
a0d0e21e 5806 realarray = 1;
8ec5e241 5807 PUTBACK;
a0d0e21e 5808 av_extend(ary,0);
821956c5 5809 (void)sv_2mortal(SvREFCNT_inc_simple_NN(sv));
a0d0e21e 5810 av_clear(ary);
8ec5e241 5811 SPAGAIN;
ad64d0ec 5812 if ((mg = SvTIED_mg((const SV *)ary, PERL_MAGIC_tied))) {
8ec5e241 5813 PUSHMARK(SP);
ad64d0ec 5814 XPUSHs(SvTIED_obj(MUTABLE_SV(ary), mg));
8ec5e241
NIS
5815 }
5816 else {
1c0b011c 5817 if (!AvREAL(ary)) {
1b6737cc 5818 I32 i;
1c0b011c 5819 AvREAL_on(ary);
abff13bb 5820 AvREIFY_off(ary);
1c0b011c 5821 for (i = AvFILLp(ary); i >= 0; i--)
d14578b8 5822 AvARRAY(ary)[i] = &PL_sv_undef; /* don't free mere refs */
1c0b011c
NIS
5823 }
5824 /* temporarily switch stacks */
8b7059b1 5825 SAVESWITCHSTACK(PL_curstack, ary);
8ec5e241 5826 make_mortal = 0;
1c0b011c 5827 }
79072805 5828 }
5012eebe 5829
3280af22 5830 base = SP - PL_stack_base;
a0d0e21e 5831 orig = s;
dbc200c5 5832 if (RX_EXTFLAGS(rx) & RXf_SKIPWHITE) {
613f191e 5833 if (do_utf8) {
d720149d 5834 while (s < strend && isSPACE_utf8_safe(s, strend))
613f191e
TS
5835 s += UTF8SKIP(s);
5836 }
a62b1201 5837 else if (get_regex_charset(RX_EXTFLAGS(rx)) == REGEX_LOCALE_CHARSET) {
d720149d 5838 while (s < strend && isSPACE_LC(*s))
bbce6d69 5839 s++;
5840 }
5841 else {
d720149d 5842 while (s < strend && isSPACE(*s))
bbce6d69 5843 s++;
5844 }
a0d0e21e 5845 }
73134a2e 5846 if (RX_EXTFLAGS(rx) & RXf_PMf_MULTILINE) {
7fba1cd6 5847 multiline = 1;
c07a80fd 5848 }
5849
941446f6
FC
5850 gimme_scalar = gimme == G_SCALAR && !ary;
5851
a0d0e21e
LW
5852 if (!limit)
5853 limit = maxiters + 2;
dbc200c5 5854 if (RX_EXTFLAGS(rx) & RXf_WHITE) {
a0d0e21e 5855 while (--limit) {
bbce6d69 5856 m = s;
8727f688
YO
5857 /* this one uses 'm' and is a negative test */
5858 if (do_utf8) {
7a207065 5859 while (m < strend && ! isSPACE_utf8_safe(m, strend) ) {
613f191e 5860 const int t = UTF8SKIP(m);
7a207065 5861 /* isSPACE_utf8_safe returns FALSE for malform utf8 */
613f191e
TS
5862 if (strend - m < t)
5863 m = strend;
5864 else
5865 m += t;
5866 }
a62b1201 5867 }
d14578b8
KW
5868 else if (get_regex_charset(RX_EXTFLAGS(rx)) == REGEX_LOCALE_CHARSET)
5869 {
8727f688
YO
5870 while (m < strend && !isSPACE_LC(*m))
5871 ++m;
5872 } else {
5873 while (m < strend && !isSPACE(*m))
5874 ++m;
5875 }
a0d0e21e
LW
5876 if (m >= strend)
5877 break;
bbce6d69 5878
c1a7495a
BB
5879 if (gimme_scalar) {
5880 iters++;
5881 if (m-s == 0)
5882 trailing_empty++;
5883 else
5884 trailing_empty = 0;
5885 } else {
5886 dstr = newSVpvn_flags(s, m-s,
5887 (do_utf8 ? SVf_UTF8 : 0) | make_mortal);
5888 XPUSHs(dstr);
5889 }
bbce6d69 5890
613f191e
TS
5891 /* skip the whitespace found last */
5892 if (do_utf8)
5893 s = m + UTF8SKIP(m);
5894 else
5895 s = m + 1;
5896
8727f688
YO
5897 /* this one uses 's' and is a positive test */
5898 if (do_utf8) {
7a207065 5899 while (s < strend && isSPACE_utf8_safe(s, strend) )
8727f688 5900 s += UTF8SKIP(s);
a62b1201 5901 }
d14578b8
KW
5902 else if (get_regex_charset(RX_EXTFLAGS(rx)) == REGEX_LOCALE_CHARSET)
5903 {
8727f688
YO
5904 while (s < strend && isSPACE_LC(*s))
5905 ++s;
5906 } else {
5907 while (s < strend && isSPACE(*s))
5908 ++s;
5909 }
79072805
LW
5910 }
5911 }
07bc277f 5912 else if (RX_EXTFLAGS(rx) & RXf_START_ONLY) {
a0d0e21e 5913 while (--limit) {
a6e20a40
AL
5914 for (m = s; m < strend && *m != '\n'; m++)
5915 ;
a0d0e21e
LW
5916 m++;
5917 if (m >= strend)
5918 break;
c1a7495a
BB
5919
5920 if (gimme_scalar) {
5921 iters++;
5922 if (m-s == 0)
5923 trailing_empty++;
5924 else
5925 trailing_empty = 0;
5926 } else {
5927 dstr = newSVpvn_flags(s, m-s,
5928 (do_utf8 ? SVf_UTF8 : 0) | make_mortal);
5929 XPUSHs(dstr);
5930 }
a0d0e21e
LW
5931 s = m;
5932 }
5933 }
07bc277f 5934 else if (RX_EXTFLAGS(rx) & RXf_NULL && !(s >= strend)) {
640f820d
AB
5935 /*
5936 Pre-extend the stack, either the number of bytes or
5937 characters in the string or a limited amount, triggered by:
5938
5939 my ($x, $y) = split //, $str;
5940 or
5941 split //, $str, $i;
5942 */
c1a7495a 5943 if (!gimme_scalar) {
052a7c76
DM
5944 const IV items = limit - 1;
5945 /* setting it to -1 will trigger a panic in EXTEND() */
5946 const SSize_t sslen = slen > SSize_t_MAX ? -1 : (SSize_t)slen;
5947 if (items >=0 && items < sslen)
c1a7495a
BB
5948 EXTEND(SP, items);
5949 else
052a7c76 5950 EXTEND(SP, sslen);
c1a7495a 5951 }
640f820d 5952
e9515b0f
AB
5953 if (do_utf8) {
5954 while (--limit) {
5955 /* keep track of how many bytes we skip over */
5956 m = s;
640f820d 5957 s += UTF8SKIP(s);
c1a7495a
BB
5958 if (gimme_scalar) {
5959 iters++;
5960 if (s-m == 0)
5961 trailing_empty++;
5962 else
5963 trailing_empty = 0;
5964 } else {
5965 dstr = newSVpvn_flags(m, s-m, SVf_UTF8 | make_mortal);
640f820d 5966
c1a7495a
BB
5967 PUSHs(dstr);
5968 }
640f820d 5969
e9515b0f
AB
5970 if (s >= strend)
5971 break;
5972 }
5973 } else {
5974 while (--limit) {
c1a7495a
BB
5975 if (gimme_scalar) {
5976 iters++;
5977 } else {
5978 dstr = newSVpvn(s, 1);
e9515b0f 5979
e9515b0f 5980
c1a7495a
BB
5981 if (make_mortal)
5982 sv_2mortal(dstr);
640f820d 5983
c1a7495a
BB
5984 PUSHs(dstr);
5985 }
5986
5987 s++;
e9515b0f
AB
5988
5989 if (s >= strend)
5990 break;
5991 }
640f820d
AB
5992 }
5993 }
3c8556c3 5994 else if (do_utf8 == (RX_UTF8(rx) != 0) &&
07bc277f
NC
5995 (RX_EXTFLAGS(rx) & RXf_USE_INTUIT) && !RX_NPARENS(rx)
5996 && (RX_EXTFLAGS(rx) & RXf_CHECK_ALL)
8e1490ee 5997 && !(RX_EXTFLAGS(rx) & RXf_IS_ANCHORED)) {
07bc277f 5998 const int tail = (RX_EXTFLAGS(rx) & RXf_INTUIT_TAIL);
f9f4320a 5999 SV * const csv = CALLREG_INTUIT_STRING(rx);
cf93c79d 6000
07bc277f 6001 len = RX_MINLENRET(rx);
3c8556c3 6002 if (len == 1 && !RX_UTF8(rx) && !tail) {
1b6737cc 6003 const char c = *SvPV_nolen_const(csv);
a0d0e21e 6004 while (--limit) {
a6e20a40
AL
6005 for (m = s; m < strend && *m != c; m++)
6006 ;
a0d0e21e
LW
6007 if (m >= strend)
6008 break;
c1a7495a
BB
6009 if (gimme_scalar) {
6010 iters++;
6011 if (m-s == 0)
6012 trailing_empty++;
6013 else
6014 trailing_empty = 0;
6015 } else {
6016 dstr = newSVpvn_flags(s, m-s,
d14578b8 6017 (do_utf8 ? SVf_UTF8 : 0) | make_mortal);
c1a7495a
BB
6018 XPUSHs(dstr);
6019 }
93f04dac
JH
6020 /* The rx->minlen is in characters but we want to step
6021 * s ahead by bytes. */
1aa99e6b
IH
6022 if (do_utf8)
6023 s = (char*)utf8_hop((U8*)m, len);
6024 else
6025 s = m + len; /* Fake \n at the end */
a0d0e21e
LW
6026 }
6027 }
6028 else {
a0d0e21e 6029 while (s < strend && --limit &&
f722798b 6030 (m = fbm_instr((unsigned char*)s, (unsigned char*)strend,
7fba1cd6 6031 csv, multiline ? FBMrf_MULTILINE : 0)) )
a0d0e21e 6032 {
c1a7495a
BB
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,
d14578b8 6041 (do_utf8 ? SVf_UTF8 : 0) | make_mortal);
c1a7495a
BB
6042 XPUSHs(dstr);
6043 }
93f04dac
JH
6044 /* The rx->minlen is in characters but we want to step
6045 * s ahead by bytes. */
1aa99e6b
IH
6046 if (do_utf8)
6047 s = (char*)utf8_hop((U8*)m, len);
6048 else
6049 s = m + len; /* Fake \n at the end */
a0d0e21e 6050 }
463ee0b2 6051 }
463ee0b2 6052 }
a0d0e21e 6053 else {
07bc277f 6054 maxiters += slen * RX_NPARENS(rx);
080c2dec 6055 while (s < strend && --limit)
bbce6d69 6056 {
1b6737cc 6057 I32 rex_return;
080c2dec 6058 PUTBACK;
d14578b8 6059 rex_return = CALLREGEXEC(rx, (char*)s, (char*)strend, (char*)orig, 1,
c33e64f0 6060 sv, NULL, 0);
080c2dec 6061 SPAGAIN;
1b6737cc 6062 if (rex_return == 0)
080c2dec 6063 break;
d9f97599 6064 TAINT_IF(RX_MATCH_TAINTED(rx));
6502e081
DM
6065 /* we never pass the REXEC_COPY_STR flag, so it should
6066 * never get copied */
6067 assert(!RX_MATCH_COPIED(rx));
07bc277f 6068 m = RX_OFFS(rx)[0].start + orig;
c1a7495a
BB
6069
6070 if (gimme_scalar) {
6071 iters++;
6072 if (m-s == 0)
6073 trailing_empty++;
6074 else
6075 trailing_empty = 0;
6076 } else {
6077 dstr = newSVpvn_flags(s, m-s,
6078 (do_utf8 ? SVf_UTF8 : 0) | make_mortal);
6079 XPUSHs(dstr);
6080 }
07bc277f 6081 if (RX_NPARENS(rx)) {
1b6737cc 6082 I32 i;
07bc277f
NC
6083 for (i = 1; i <= (I32)RX_NPARENS(rx); i++) {
6084 s = RX_OFFS(rx)[i].start + orig;
6085 m = RX_OFFS(rx)[i].end + orig;
6de67870
JP
6086
6087 /* japhy (07/27/01) -- the (m && s) test doesn't catch
6088 parens that didn't match -- they should be set to
6089 undef, not the empty string */
c1a7495a
BB
6090 if (gimme_scalar) {
6091 iters++;
6092 if (m-s == 0)
6093 trailing_empty++;
6094 else
6095 trailing_empty = 0;
6096 } else {
6097 if (m >= orig && s >= orig) {
6098 dstr = newSVpvn_flags(s, m-s,
6099 (do_utf8 ? SVf_UTF8 : 0)
6100 | make_mortal);
6101 }
6102 else
6103 dstr = &PL_sv_undef; /* undef, not "" */
6104 XPUSHs(dstr);
748a9306 6105 }
c1a7495a 6106
a0d0e21e
LW
6107 }
6108 }
07bc277f 6109 s = RX_OFFS(rx)[0].end + orig;
a0d0e21e 6110 }
79072805 6111 }
8ec5e241 6112
c1a7495a
BB
6113 if (!gimme_scalar) {
6114 iters = (SP - PL_stack_base) - base;
6115 }
a0d0e21e 6116 if (iters > maxiters)
cea2e8a9 6117 DIE(aTHX_ "Split loop");
8ec5e241 6118
a0d0e21e
LW
6119 /* keep field after final delim? */
6120 if (s < strend || (iters && origlimit)) {
c1a7495a
BB
6121 if (!gimme_scalar) {
6122 const STRLEN l = strend - s;
6123 dstr = newSVpvn_flags(s, l, (do_utf8 ? SVf_UTF8 : 0) | make_mortal);
6124 XPUSHs(dstr);
6125 }
a0d0e21e 6126 iters++;
79072805 6127 }
a0d0e21e 6128 else if (!origlimit) {
c1a7495a
BB
6129 if (gimme_scalar) {
6130 iters -= trailing_empty;
6131 } else {
6132 while (iters > 0 && (!TOPs || !SvANY(TOPs) || SvCUR(TOPs) == 0)) {
6133 if (TOPs && !make_mortal)
6134 sv_2mortal(TOPs);
71ca73e5 6135 *SP-- = NULL;
c1a7495a
BB
6136 iters--;
6137 }
89900bd3 6138 }
a0d0e21e 6139 }
8ec5e241 6140
8b7059b1
DM
6141 PUTBACK;
6142 LEAVE_SCOPE(oldsave); /* may undo an earlier SWITCHSTACK */
6143 SPAGAIN;
a0d0e21e 6144 if (realarray) {
8ec5e241 6145 if (!mg) {
1c0b011c
NIS
6146 if (SvSMAGICAL(ary)) {
6147 PUTBACK;
ad64d0ec 6148 mg_set(MUTABLE_SV(ary));
1c0b011c
NIS
6149 SPAGAIN;
6150 }
6151 if (gimme == G_ARRAY) {
6152 EXTEND(SP, iters);
6153 Copy(AvARRAY(ary), SP + 1, iters, SV*);
6154 SP += iters;
6155 RETURN;
6156 }
8ec5e241 6157 }
1c0b011c 6158 else {
fb73857a 6159 PUTBACK;
d343c3ef 6160 ENTER_with_name("call_PUSH");
36925d9e 6161 call_sv(SV_CONST(PUSH),G_SCALAR|G_DISCARD|G_METHOD_NAMED);
d343c3ef 6162 LEAVE_with_name("call_PUSH");
fb73857a 6163 SPAGAIN;
8ec5e241 6164 if (gimme == G_ARRAY) {
c70927a6 6165 SSize_t i;
8ec5e241
NIS
6166 /* EXTEND should not be needed - we just popped them */
6167 EXTEND(SP, iters);
6168 for (i=0; i < iters; i++) {
6169 SV **svp = av_fetch(ary, i, FALSE);
3280af22 6170 PUSHs((svp) ? *svp : &PL_sv_undef);
8ec5e241 6171 }
1c0b011c
NIS
6172 RETURN;
6173 }
a0d0e21e
LW
6174 }
6175 }
6176 else {
6177 if (gimme == G_ARRAY)
6178 RETURN;
6179 }
7f18b612
YST
6180
6181 GETTARGET;
02c161ef 6182 XPUSHi(iters);
7f18b612 6183 RETURN;
79072805 6184}
85e6fe83 6185
c5917253
NC
6186PP(pp_once)
6187{
6188 dSP;
6189 SV *const sv = PAD_SVl(PL_op->op_targ);
6190
6191 if (SvPADSTALE(sv)) {
6192 /* First time. */
6193 SvPADSTALE_off(sv);
6194 RETURNOP(cLOGOP->op_other);
6195 }
6196 RETURNOP(cLOGOP->op_next);
6197}
6198
c0329465
MB
6199PP(pp_lock)
6200{
39644a26 6201 dSP;
c0329465 6202 dTOPss;
e55aaa0e 6203 SV *retsv = sv;
68795e93 6204 SvLOCK(sv);
f79aa60b
FC
6205 if (SvTYPE(retsv) == SVt_PVAV || SvTYPE(retsv) == SVt_PVHV
6206 || SvTYPE(retsv) == SVt_PVCV) {
e55aaa0e
MB
6207 retsv = refto(retsv);
6208 }
6209 SETs(retsv);
c0329465
MB
6210 RETURN;
6211}
a863c7d1 6212
65bca31a 6213
10088f56 6214/* used for: pp_padany(), pp_custom(); plus any system ops
b1c05ba5
DM
6215 * that aren't implemented on a particular platform */
6216
65bca31a
NC
6217PP(unimplemented_op)
6218{
361ed549
NC
6219 const Optype op_type = PL_op->op_type;
6220 /* Using OP_NAME() isn't going to be helpful here. Firstly, it doesn't cope
6221 with out of range op numbers - it only "special" cases op_custom.
6222 Secondly, as the three ops we "panic" on are padmy, mapstart and custom,
6223 if we get here for a custom op then that means that the custom op didn't
6224 have an implementation. Given that OP_NAME() looks up the custom op
6225 by its pp_addr, likely it will return NULL, unless someone (unhelpfully)
6226 registers &PL_unimplemented_op as the address of their custom op.
6227 NULL doesn't generate a useful error message. "custom" does. */
6228 const char *const name = op_type >= OP_max
6229 ? "[out of range]" : PL_op_name[PL_op->op_type];
7627e6d0
NC
6230 if(OP_IS_SOCKET(op_type))
6231 DIE(aTHX_ PL_no_sock_func, name);
361ed549 6232 DIE(aTHX_ "panic: unimplemented op %s (#%d) called", name, op_type);
65bca31a
NC
6233}
6234
bea284c8
FC
6235static void
6236S_maybe_unwind_defav(pTHX)
6237{
6238 if (CX_CUR()->cx_type & CXp_HASARGS) {
6239 PERL_CONTEXT *cx = CX_CUR();
6240
6241 assert(CxHASARGS(cx));
6242 cx_popsub_args(cx);
6243 cx->cx_type &= ~CXp_HASARGS;
6244 }
6245}
6246
deb8a388
FC
6247/* For sorting out arguments passed to a &CORE:: subroutine */
6248PP(pp_coreargs)
6249{
6250 dSP;
7fa5bd9b 6251 int opnum = SvIOK(cSVOP_sv) ? (int)SvUV(cSVOP_sv) : 0;
498a02d8 6252 int defgv = PL_opargs[opnum] & OA_DEFGV ||opnum==OP_GLOB, whicharg = 0;
7fa5bd9b 6253 AV * const at_ = GvAV(PL_defgv);
0e80230d
FC
6254 SV **svp = at_ ? AvARRAY(at_) : NULL;
6255 I32 minargs = 0, maxargs = 0, numargs = at_ ? AvFILLp(at_)+1 : 0;
7fa5bd9b 6256 I32 oa = opnum ? PL_opargs[opnum] >> OASHIFT : 0;
46e00a91 6257 bool seen_question = 0;
7fa5bd9b 6258 const char *err = NULL;
3e6568b4 6259 const bool pushmark = PL_op->op_private & OPpCOREARGS_PUSHMARK;
7fa5bd9b 6260
46e00a91
FC
6261 /* Count how many args there are first, to get some idea how far to
6262 extend the stack. */
7fa5bd9b 6263 while (oa) {
bf0571fd 6264 if ((oa & 7) == OA_LIST) { maxargs = I32_MAX; break; }
7fa5bd9b 6265 maxargs++;
46e00a91
FC
6266 if (oa & OA_OPTIONAL) seen_question = 1;
6267 if (!seen_question) minargs++;
7fa5bd9b
FC
6268 oa >>= 4;
6269 }
6270
6271 if(numargs < minargs) err = "Not enough";
6272 else if(numargs > maxargs) err = "Too many";
6273 if (err)
6274 /* diag_listed_as: Too many arguments for %s */
6275 Perl_croak(aTHX_
6276 "%s arguments for %s", err,
2a90c7c6 6277 opnum ? PL_op_desc[opnum] : SvPV_nolen_const(cSVOP_sv)
7fa5bd9b
FC
6278 );
6279
6280 /* Reset the stack pointer. Without this, we end up returning our own
6281 arguments in list context, in addition to the values we are supposed
6282 to return. nextstate usually does this on sub entry, but we need
e1fa07e3 6283 to run the next op with the caller's hints, so we cannot have a
7fa5bd9b 6284 nextstate. */
4ebe6e95 6285 SP = PL_stack_base + CX_CUR()->blk_oldsp;
7fa5bd9b 6286
46e00a91
FC
6287 if(!maxargs) RETURN;
6288
bf0571fd
FC
6289 /* We do this here, rather than with a separate pushmark op, as it has
6290 to come in between two things this function does (stack reset and
6291 arg pushing). This seems the easiest way to do it. */
3e6568b4 6292 if (pushmark) {
bf0571fd
FC
6293 PUTBACK;
6294 (void)Perl_pp_pushmark(aTHX);
6295 }
6296
6297 EXTEND(SP, maxargs == I32_MAX ? numargs : maxargs);
c931b036 6298 PUTBACK; /* The code below can die in various places. */
46e00a91
FC
6299
6300 oa = PL_opargs[opnum] >> OASHIFT;
3e6568b4 6301 for (; oa&&(numargs||!pushmark); (void)(numargs&&(++svp,--numargs))) {
c931b036 6302 whicharg++;
46e00a91
FC
6303 switch (oa & 7) {
6304 case OA_SCALAR:
1efec5ed 6305 try_defsv:
d6d78e19 6306 if (!numargs && defgv && whicharg == minargs + 1) {
195eefec 6307 PUSHs(DEFSV);
d6d78e19
FC
6308 }
6309 else PUSHs(numargs ? svp && *svp ? *svp : &PL_sv_undef : NULL);
46e00a91 6310 break;
bf0571fd
FC
6311 case OA_LIST:
6312 while (numargs--) {
6313 PUSHs(svp && *svp ? *svp : &PL_sv_undef);
6314 svp++;
6315 }
6316 RETURN;
bea284c8
FC
6317 case OA_AVREF:
6318 if (!numargs) {
6319 GV *gv;
6320 if (CvUNIQUE(find_runcv_where(FIND_RUNCV_level_eq,1,NULL)))
6321 gv = PL_argvgv;
6322 else {
6323 S_maybe_unwind_defav(aTHX);
6324 gv = PL_defgv;
6325 }
6326 PUSHs((SV *)GvAVn(gv));
6327 break;
6328 }
6329 if (!svp || !*svp || !SvROK(*svp)
6330 || SvTYPE(SvRV(*svp)) != SVt_PVAV)
6331 DIE(aTHX_
6332 /* diag_listed_as: Type of arg %d to &CORE::%s must be %s*/
6333 "Type of arg %d to &CORE::%s must be array reference",
6334 whicharg, PL_op_desc[opnum]
6335 );
6336 PUSHs(SvRV(*svp));
6337 break;
19c481f4
FC
6338 case OA_HVREF:
6339 if (!svp || !*svp || !SvROK(*svp)
73665bc4
FC
6340 || ( SvTYPE(SvRV(*svp)) != SVt_PVHV
6341 && ( opnum == OP_DBMCLOSE || opnum == OP_DBMOPEN
6342 || SvTYPE(SvRV(*svp)) != SVt_PVAV )))
19c481f4
FC
6343 DIE(aTHX_
6344 /* diag_listed_as: Type of arg %d to &CORE::%s must be %s*/
73665bc4
FC
6345 "Type of arg %d to &CORE::%s must be hash%s reference",
6346 whicharg, PL_op_desc[opnum],
6347 opnum == OP_DBMCLOSE || opnum == OP_DBMOPEN
6348 ? ""
6349 : " or array"
19c481f4
FC
6350 );
6351 PUSHs(SvRV(*svp));
6352 break;
c931b036 6353 case OA_FILEREF:
30901a8a
FC
6354 if (!numargs) PUSHs(NULL);
6355 else if(svp && *svp && SvROK(*svp) && isGV_with_GP(SvRV(*svp)))
c931b036
FC
6356 /* no magic here, as the prototype will have added an extra
6357 refgen and we just want what was there before that */
6358 PUSHs(SvRV(*svp));
6359 else {
6360 const bool constr = PL_op->op_private & whicharg;
6361 PUSHs(S_rv2gv(aTHX_
6362 svp && *svp ? *svp : &PL_sv_undef,
b54f893d 6363 constr, cBOOL(CopHINTS_get(PL_curcop) & HINT_STRICT_REFS),
c931b036
FC
6364 !constr
6365 ));
6366 }
6367 break;
c72a5629 6368 case OA_SCALARREF:
1efec5ed
FC
6369 if (!numargs) goto try_defsv;
6370 else {
17008668
FC
6371 const bool wantscalar =
6372 PL_op->op_private & OPpCOREARGS_SCALARMOD;
c72a5629 6373 if (!svp || !*svp || !SvROK(*svp)
17008668
FC
6374 /* We have to permit globrefs even for the \$ proto, as
6375 *foo is indistinguishable from ${\*foo}, and the proto-
6376 type permits the latter. */
6377 || SvTYPE(SvRV(*svp)) > (
efe889ae 6378 wantscalar ? SVt_PVLV
46bef06f
FC
6379 : opnum == OP_LOCK || opnum == OP_UNDEF
6380 ? SVt_PVCV
efe889ae 6381 : SVt_PVHV
17008668 6382 )
c72a5629
FC
6383 )
6384 DIE(aTHX_
17008668 6385 "Type of arg %d to &CORE::%s must be %s",
46bef06f 6386 whicharg, PL_op_name[opnum],
17008668
FC
6387 wantscalar
6388 ? "scalar reference"
46bef06f 6389 : opnum == OP_LOCK || opnum == OP_UNDEF
efe889ae
FC
6390 ? "reference to one of [$@%&*]"
6391 : "reference to one of [$@%*]"
c72a5629
FC
6392 );
6393 PUSHs(SvRV(*svp));
bea284c8 6394 if (opnum == OP_UNDEF && SvRV(*svp) == (SV *)PL_defgv) {
88bb468b 6395 /* Undo @_ localisation, so that sub exit does not undo
04e686b8 6396 part of our undeffing. */
bea284c8 6397 S_maybe_unwind_defav(aTHX);
88bb468b 6398 }
17008668 6399 }
1efec5ed 6400 break;
46e00a91 6401 default:
46e00a91
FC
6402 DIE(aTHX_ "panic: unknown OA_*: %x", (unsigned)(oa&7));
6403 }
6404 oa = oa >> 4;
6405 }
6406
deb8a388
FC
6407 RETURN;
6408}
6409
88101882
FC
6410PP(pp_avhvswitch)
6411{
a73158aa 6412 dVAR; dSP;
73665bc4
FC
6413 return PL_ppaddr[
6414 (SvTYPE(TOPs) == SVt_PVAV ? OP_AEACH : OP_EACH)
e1e26374 6415 + (PL_op->op_private & OPpAVHVSWITCH_MASK)
73665bc4 6416 ](aTHX);
88101882
FC
6417}
6418
84ed0108
FC
6419PP(pp_runcv)
6420{
6421 dSP;
6422 CV *cv;
6423 if (PL_op->op_private & OPpOFFBYONE) {
db4cf31d 6424 cv = find_runcv_where(FIND_RUNCV_level_eq, 1, NULL);
84ed0108
FC
6425 }
6426 else cv = find_runcv(NULL);
e157a82b 6427 XPUSHs(CvEVAL(cv) ? &PL_sv_undef : sv_2mortal(newRV((SV *)cv)));
84ed0108
FC
6428 RETURN;
6429}
6430
05a34802 6431static void
2331e434 6432S_localise_aelem_lval(pTHX_ AV * const av, SV * const keysv,
05a34802
FC
6433 const bool can_preserve)
6434{
2331e434 6435 const SSize_t ix = SvIV(keysv);
05a34802
FC
6436 if (can_preserve ? av_exists(av, ix) : TRUE) {
6437 SV ** const svp = av_fetch(av, ix, 1);
6438 if (!svp || !*svp)
6439 Perl_croak(aTHX_ PL_no_aelem, ix);
6440 save_aelem(av, ix, svp);
6441 }
6442 else
6443 SAVEADELETE(av, ix);
6444}
6445
5f94141d
FC
6446static void
6447S_localise_helem_lval(pTHX_ HV * const hv, SV * const keysv,
6448 const bool can_preserve)
6449{
6450 if (can_preserve ? hv_exists_ent(hv, keysv, 0) : TRUE) {
6451 HE * const he = hv_fetch_ent(hv, keysv, 1, 0);
6452 SV ** const svp = he ? &HeVAL(he) : NULL;
6453 if (!svp || !*svp)
6454 Perl_croak(aTHX_ PL_no_helem_sv, SVfARG(keysv));
6455 save_helem_flags(hv, keysv, svp, 0);
6456 }
6457 else
6458 SAVEHDELETE(hv, keysv);
6459}
6460
9782ce69
FC
6461static void
6462S_localise_gv_slot(pTHX_ GV *gv, U8 type)
6463{
6464 if (type == OPpLVREF_SV) {
6465 save_pushptrptr(gv, SvREFCNT_inc_simple(GvSV(gv)), SAVEt_GVSV);
6466 GvSV(gv) = 0;
6467 }
6468 else if (type == OPpLVREF_AV)
6469 /* XXX Inefficient, as it creates a new AV, which we are
6470 about to clobber. */
6471 save_ary(gv);
6472 else {
6473 assert(type == OPpLVREF_HV);
6474 /* XXX Likewise inefficient. */
6475 save_hash(gv);
6476 }
6477}
6478
6479
254da51f
FC
6480PP(pp_refassign)
6481{
4fec8804 6482 dSP;
6102323a 6483 SV * const key = PL_op->op_private & OPpLVREF_ELEM ? POPs : NULL;
d8a875d9 6484 SV * const left = PL_op->op_flags & OPf_STACKED ? POPs : NULL;
4fec8804 6485 dTOPss;
3f114923 6486 const char *bad = NULL;
ac0da85a 6487 const U8 type = PL_op->op_private & OPpLVREF_TYPE;
4fec8804 6488 if (!SvROK(sv)) DIE(aTHX_ "Assigned value is not a reference");
ac0da85a 6489 switch (type) {
3f114923
FC
6490 case OPpLVREF_SV:
6491 if (SvTYPE(SvRV(sv)) > SVt_PVLV)
6492 bad = " SCALAR";
6493 break;
6494 case OPpLVREF_AV:
6495 if (SvTYPE(SvRV(sv)) != SVt_PVAV)
6496 bad = "n ARRAY";
6497 break;
6498 case OPpLVREF_HV:
6499 if (SvTYPE(SvRV(sv)) != SVt_PVHV)
6500 bad = " HASH";
6501 break;
6502 case OPpLVREF_CV:
6503 if (SvTYPE(SvRV(sv)) != SVt_PVCV)
6504 bad = " CODE";
6505 }
6506 if (bad)
1f8155a2 6507 /* diag_listed_as: Assigned value is not %s reference */
3f114923 6508 DIE(aTHX_ "Assigned value is not a%s reference", bad);
b943805e
JH
6509 {
6510 MAGIC *mg;
6511 HV *stash;
d8a875d9
FC
6512 switch (left ? SvTYPE(left) : 0) {
6513 case 0:
cf5d2d91
FC
6514 {
6515 SV * const old = PAD_SV(ARGTARG);
d8a875d9 6516 PAD_SETSV(ARGTARG, SvREFCNT_inc_NN(SvRV(sv)));
cf5d2d91 6517 SvREFCNT_dec(old);
3ad7d304
FC
6518 if ((PL_op->op_private & (OPpLVAL_INTRO|OPpPAD_STATE))
6519 == OPpLVAL_INTRO)
fc048fcf 6520 SAVECLEARSV(PAD_SVl(ARGTARG));
d8a875d9 6521 break;
cf5d2d91 6522 }
d8a875d9 6523 case SVt_PVGV:
2a57afb1 6524 if (PL_op->op_private & OPpLVAL_INTRO) {
9782ce69 6525 S_localise_gv_slot(aTHX_ (GV *)left, type);
2a57afb1 6526 }
d8a875d9
FC
6527 gv_setref(left, sv);
6528 SvSETMAGIC(left);
6102323a
FC
6529 break;
6530 case SVt_PVAV:
69a23520 6531 assert(key);
40d2b828 6532 if (UNLIKELY(PL_op->op_private & OPpLVAL_INTRO)) {
2331e434 6533 S_localise_aelem_lval(aTHX_ (AV *)left, key,
05a34802 6534 SvCANEXISTDELETE(left));
40d2b828 6535 }
6102323a
FC
6536 av_store((AV *)left, SvIV(key), SvREFCNT_inc_simple_NN(SvRV(sv)));
6537 break;
5f94141d 6538 case SVt_PVHV:
69a23520
JH
6539 if (UNLIKELY(PL_op->op_private & OPpLVAL_INTRO)) {
6540 assert(key);
5f94141d
FC
6541 S_localise_helem_lval(aTHX_ (HV *)left, key,
6542 SvCANEXISTDELETE(left));
69a23520 6543 }
7fcb36d5 6544 (void)hv_store_ent((HV *)left, key, SvREFCNT_inc_simple_NN(SvRV(sv)), 0);
d8a875d9 6545 }
4fec8804
FC
6546 if (PL_op->op_flags & OPf_MOD)
6547 SETs(sv_2mortal(newSVsv(sv)));
6548 /* XXX else can weak references go stale before they are read, e.g.,
6549 in leavesub? */
6550 RETURN;
b943805e 6551 }
254da51f
FC
6552}
6553
4c5bab50
FC
6554PP(pp_lvref)
6555{
26a50d99
FC
6556 dSP;
6557 SV * const ret = sv_2mortal(newSV_type(SVt_PVMG));
6102323a 6558 SV * const elem = PL_op->op_private & OPpLVREF_ELEM ? POPs : NULL;
2a57afb1 6559 SV * const arg = PL_op->op_flags & OPf_STACKED ? POPs : NULL;
9782ce69
FC
6560 MAGIC * const mg = sv_magicext(ret, arg, PERL_MAGIC_lvref,
6561 &PL_vtbl_lvref, (char *)elem,
23270f96 6562 elem ? HEf_SVKEY : (I32)ARGTARG);
9782ce69 6563 mg->mg_private = PL_op->op_private;
d39c26a6
FC
6564 if (PL_op->op_private & OPpLVREF_ITER)
6565 mg->mg_flags |= MGf_PERSIST;
9846cd95 6566 if (UNLIKELY(PL_op->op_private & OPpLVAL_INTRO)) {
40d2b828 6567 if (elem) {
38bb0011
JH
6568 MAGIC *mg;
6569 HV *stash;
6570 assert(arg);
6571 {
6572 const bool can_preserve = SvCANEXISTDELETE(arg);
6573 if (SvTYPE(arg) == SVt_PVAV)
6574 S_localise_aelem_lval(aTHX_ (AV *)arg, elem, can_preserve);
6575 else
6576 S_localise_helem_lval(aTHX_ (HV *)arg, elem, can_preserve);
6577 }
40d2b828
FC
6578 }
6579 else if (arg) {
9782ce69
FC
6580 S_localise_gv_slot(aTHX_ (GV *)arg,
6581 PL_op->op_private & OPpLVREF_TYPE);
2a57afb1 6582 }
3ad7d304 6583 else if (!(PL_op->op_private & OPpPAD_STATE))
c146a62a 6584 SAVECLEARSV(PAD_SVl(ARGTARG));
1199b01a 6585 }
c146a62a
FC
6586 XPUSHs(ret);
6587 RETURN;
4c5bab50 6588}
84ed0108 6589
16b99412
FC
6590PP(pp_lvrefslice)
6591{
a95dad8a 6592 dSP; dMARK;
0ca7b7f7
FC
6593 AV * const av = (AV *)POPs;
6594 const bool localizing = PL_op->op_private & OPpLVAL_INTRO;
6595 bool can_preserve = FALSE;
6596
9846cd95 6597 if (UNLIKELY(localizing)) {
0ca7b7f7
FC
6598 MAGIC *mg;
6599 HV *stash;
6600 SV **svp;
6601
6602 can_preserve = SvCANEXISTDELETE(av);
6603
6604 if (SvTYPE(av) == SVt_PVAV) {
6605 SSize_t max = -1;
6606
6607 for (svp = MARK + 1; svp <= SP; svp++) {
6608 const SSize_t elem = SvIV(*svp);
6609 if (elem > max)
6610 max = elem;
6611 }
6612 if (max > AvMAX(av))
6613 av_extend(av, max);
6614 }
6615 }
6616
6617 while (++MARK <= SP) {
6618 SV * const elemsv = *MARK;
5f94141d 6619 if (SvTYPE(av) == SVt_PVAV)
2331e434 6620 S_localise_aelem_lval(aTHX_ av, elemsv, can_preserve);
5f94141d
FC
6621 else
6622 S_localise_helem_lval(aTHX_ (HV *)av, elemsv, can_preserve);
0ca7b7f7
FC
6623 *MARK = sv_2mortal(newSV_type(SVt_PVMG));
6624 sv_magic(*MARK,(SV *)av,PERL_MAGIC_lvref,(char *)elemsv,HEf_SVKEY);
6625 }
6626 RETURN;
16b99412
FC
6627}
6628
2882b3ff
FC
6629PP(pp_lvavref)
6630{
bdaf10a5
FC
6631 if (PL_op->op_flags & OPf_STACKED)
6632 Perl_pp_rv2av(aTHX);
6633 else
6634 Perl_pp_padav(aTHX);
6635 {
6636 dSP;
6637 dTOPss;
6638 SETs(0); /* special alias marker that aassign recognises */
6639 XPUSHs(sv);
6640 RETURN;
6641 }
2882b3ff
FC
6642}
6643
b77472f9
FC
6644PP(pp_anonconst)
6645{
6646 dSP;
6647 dTOPss;
6648 SETs(sv_2mortal((SV *)newCONSTSUB(SvTYPE(CopSTASH(PL_curcop))==SVt_PVHV
6649 ? CopSTASH(PL_curcop)
6650 : NULL,
6651 NULL, SvREFCNT_inc_simple_NN(sv))));
6652 RETURN;
6653}
6654
4fa06845
DM
6655
6656/* process one subroutine argument - typically when the sub has a signature:
6657 * introduce PL_curpad[op_targ] and assign to it the value
6658 * for $: (OPf_STACKED ? *sp : $_[N])
6659 * for @/%: @_[N..$#_]
6660 *
6661 * It's equivalent to
6662 * my $foo = $_[N];
6663 * or
6664 * my $foo = (value-on-stack)
6665 * or
6666 * my @foo = @_[N..$#_]
6667 * etc
4fa06845
DM
6668 */
6669
6670PP(pp_argelem)
6671{
6672 dTARG;
6673 SV *val;
6674 SV ** padentry;
6675 OP *o = PL_op;
6676 AV *defav = GvAV(PL_defgv); /* @_ */
6daeaaa3 6677 IV ix = PTR2IV(cUNOP_AUXo->op_aux);
4fa06845 6678 IV argc;
4fa06845
DM
6679
6680 /* do 'my $var, @var or %var' action */
6681 padentry = &(PAD_SVl(o->op_targ));
6682 save_clearsv(padentry);
6683 targ = *padentry;
6684
6685 if ((o->op_private & OPpARGELEM_MASK) == OPpARGELEM_SV) {
6686 if (o->op_flags & OPf_STACKED) {
6687 dSP;
6688 val = POPs;
6689 PUTBACK;
6690 }
6691 else {
f6ca42c7 6692 SV **svp;
4fa06845 6693 /* should already have been checked */
f6ca42c7 6694 assert(ix >= 0);
6daeaaa3
DM
6695#if IVSIZE > PTRSIZE
6696 assert(ix <= SSize_t_MAX);
6697#endif
f6ca42c7
DM
6698
6699 svp = av_fetch(defav, ix, FALSE);
6700 val = svp ? *svp : &PL_sv_undef;
4fa06845
DM
6701 }
6702
6703 /* $var = $val */
6704
6705 /* cargo-culted from pp_sassign */
6706 assert(TAINTING_get || !TAINT_get);
6707 if (UNLIKELY(TAINT_get) && !SvTAINTED(val))
6708 TAINT_NOT;
6709
f6ca42c7 6710 SvSetMagicSV(targ, val);
4fa06845
DM
6711 return o->op_next;
6712 }
6713
6714 /* must be AV or HV */
6715
6716 assert(!(o->op_flags & OPf_STACKED));
f6ca42c7 6717 argc = ((IV)AvFILL(defav) + 1) - ix;
4fa06845
DM
6718
6719 /* This is a copy of the relevant parts of pp_aassign().
4fa06845
DM
6720 */
6721 if ((o->op_private & OPpARGELEM_MASK) == OPpARGELEM_AV) {
f6ca42c7
DM
6722 IV i;
6723
6724 if (AvFILL((AV*)targ) > -1) {
6725 /* target should usually be empty. If we get get
6726 * here, someone's been doing some weird closure tricks.
6727 * Make a copy of all args before clearing the array,
6728 * to avoid the equivalent of @a = ($a[0]) prematurely freeing
6729 * elements. See similar code in pp_aassign.
6730 */
6731 for (i = 0; i < argc; i++) {
6732 SV **svp = av_fetch(defav, ix + i, FALSE);
6733 SV *newsv = newSV(0);
6734 sv_setsv_flags(newsv,
6735 svp ? *svp : &PL_sv_undef,
6736 (SV_DO_COW_SVSETSV|SV_NOSTEAL));
6737 if (!av_store(defav, ix + i, newsv))
6738 SvREFCNT_dec_NN(newsv);
6739 }
6740 av_clear((AV*)targ);
6741 }
6742
6743 if (argc <= 0)
6744 return o->op_next;
4fa06845 6745
4fa06845
DM
6746 av_extend((AV*)targ, argc);
6747
f6ca42c7 6748 i = 0;
4fa06845
DM
6749 while (argc--) {
6750 SV *tmpsv;
f6ca42c7
DM
6751 SV **svp = av_fetch(defav, ix + i, FALSE);
6752 SV *val = svp ? *svp : &PL_sv_undef;
4fa06845 6753 tmpsv = newSV(0);
f6ca42c7 6754 sv_setsv(tmpsv, val);
4fa06845
DM
6755 av_store((AV*)targ, i++, tmpsv);
6756 TAINT_NOT;
6757 }
6758
6759 }
6760 else {
f6ca42c7
DM
6761 IV i;
6762
4fa06845
DM
6763 assert((o->op_private & OPpARGELEM_MASK) == OPpARGELEM_HV);
6764
f6ca42c7
DM
6765 if (SvRMAGICAL(targ) || HvUSEDKEYS((HV*)targ)) {
6766 /* see "target should usually be empty" comment above */
6767 for (i = 0; i < argc; i++) {
6768 SV **svp = av_fetch(defav, ix + i, FALSE);
6769 SV *newsv = newSV(0);
6770 sv_setsv_flags(newsv,
6771 svp ? *svp : &PL_sv_undef,
6772 (SV_DO_COW_SVSETSV|SV_NOSTEAL));
6773 if (!av_store(defav, ix + i, newsv))
6774 SvREFCNT_dec_NN(newsv);
6775 }
6776 hv_clear((HV*)targ);
6777 }
6778
6779 if (argc <= 0)
6780 return o->op_next;
4fa06845 6781 assert(argc % 2 == 0);
4fa06845 6782
f6ca42c7 6783 i = 0;
4fa06845
DM
6784 while (argc) {
6785 SV *tmpsv;
f6ca42c7
DM
6786 SV **svp;
6787 SV *key;
6788 SV *val;
6789
6790 svp = av_fetch(defav, ix + i++, FALSE);
6791 key = svp ? *svp : &PL_sv_undef;
6792 svp = av_fetch(defav, ix + i++, FALSE);
6793 val = svp ? *svp : &PL_sv_undef;
4fa06845 6794
4fa06845
DM
6795 argc -= 2;
6796 if (UNLIKELY(SvGMAGICAL(key)))
6797 key = sv_mortalcopy(key);
6798 tmpsv = newSV(0);
6799 sv_setsv(tmpsv, val);
6800 hv_store_ent((HV*)targ, key, tmpsv, 0);
6801 TAINT_NOT;
6802 }
6803 }
6804
6805 return o->op_next;
6806}
6807
6808/* Handle a default value for one subroutine argument (typically as part
6809 * of a subroutine signature).
6810 * It's equivalent to
6811 * @_ > op_targ ? $_[op_targ] : result_of(op_other)
6812 *
6813 * Intended to be used where op_next is an OP_ARGELEM
6814 *
6815 * We abuse the op_targ field slightly: it's an index into @_ rather than
6816 * into PL_curpad.
6817 */
6818
6819PP(pp_argdefelem)
6820{
6821 OP * const o = PL_op;
6822 AV *defav = GvAV(PL_defgv); /* @_ */
6daeaaa3 6823 IV ix = (IV)o->op_targ;
4fa06845 6824
f6ca42c7 6825 assert(ix >= 0);
6daeaaa3
DM
6826#if IVSIZE > PTRSIZE
6827 assert(ix <= SSize_t_MAX);
6828#endif
f6ca42c7
DM
6829
6830 if (AvFILL(defav) >= ix) {
4fa06845 6831 dSP;
f6ca42c7
DM
6832 SV **svp = av_fetch(defav, ix, FALSE);
6833 SV *val = svp ? *svp : &PL_sv_undef;
6834 XPUSHs(val);
4fa06845
DM
6835 RETURN;
6836 }
6837 return cLOGOPo->op_other;
6838}
6839
6840
ac7609e4
AC
6841static SV *
6842S_find_runcv_name(void)
6843{
6844 dTHX;
6845 CV *cv;
6846 GV *gv;
6847 SV *sv;
6848
6849 cv = find_runcv(0);
6850 if (!cv)
6851 return &PL_sv_no;
6852
6853 gv = CvGV(cv);
6854 if (!gv)
6855 return &PL_sv_no;
6856
6857 sv = sv_2mortal(newSV(0));
6858 gv_fullname4(sv, gv, NULL, TRUE);
6859 return sv;
6860}
4fa06845
DM
6861
6862/* Check a a subs arguments - i.e. that it has the correct number of args
6863 * (and anything else we might think of in future). Typically used with
6864 * signatured subs.
6865 */
6866
6867PP(pp_argcheck)
6868{
6869 OP * const o = PL_op;
6870 UNOP_AUX_item *aux = cUNOP_AUXo->op_aux;
6daeaaa3
DM
6871 IV params = aux[0].iv;
6872 IV opt_params = aux[1].iv;
4fa06845
DM
6873 char slurpy = (char)(aux[2].iv);
6874 AV *defav = GvAV(PL_defgv); /* @_ */
6daeaaa3 6875 IV argc;
4fa06845
DM
6876 bool too_few;
6877
6878 assert(!SvMAGICAL(defav));
6daeaaa3 6879 argc = (AvFILLp(defav) + 1);
4fa06845
DM
6880 too_few = (argc < (params - opt_params));
6881
6882 if (UNLIKELY(too_few || (!slurpy && argc > params)))
ac7609e4
AC
6883 /* diag_listed_as: Too few arguments for subroutine '%s' */
6884 /* diag_listed_as: Too many arguments for subroutine '%s' */
6885 Perl_croak_caller("Too %s arguments for subroutine '%" SVf "'",
6886 too_few ? "few" : "many", S_find_runcv_name());
4fa06845
DM
6887
6888 if (UNLIKELY(slurpy == '%' && argc > params && (argc - params) % 2))
ac7609e4
AC
6889 /* diag_listed_as: Odd name/value argument for subroutine '%s' */
6890 Perl_croak_caller("Odd name/value argument for subroutine '%" SVf "'",
6891 S_find_runcv_name());
4fa06845
DM
6892
6893 return NORMAL;
6894}
6895
e609e586 6896/*
14d04a33 6897 * ex: set ts=8 sts=4 sw=4 et:
37442d52 6898 */