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