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