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