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