This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Correct spelling error
[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;
490b24f6 1674 const U8 gimme = GIMME_V;
6f1401dc 1675
490b24f6 1676 if (gimme == G_ARRAY && PL_op->op_private & OPpREPEAT_DOLIST) {
6f1401dc
DM
1677 /* TODO: think of some way of doing list-repeat overloading ??? */
1678 sv = POPs;
1679 SvGETMAGIC(sv);
1680 }
1681 else {
3a100dab
FC
1682 if (UNLIKELY(PL_op->op_private & OPpREPEAT_DOLIST)) {
1683 /* The parser saw this as a list repeat, and there
1684 are probably several items on the stack. But we're
1685 in scalar/void context, and there's no pp_list to save us
1686 now. So drop the rest of the items -- robin@kitsite.com
1687 */
1688 dMARK;
1689 if (MARK + 1 < SP) {
1690 MARK[1] = TOPm1s;
1691 MARK[2] = TOPs;
1692 }
1693 else {
1694 dTOPss;
1695 ASSUME(MARK + 1 == SP);
1696 XPUSHs(sv);
1697 MARK[1] = &PL_sv_undef;
1698 }
1699 SP = MARK + 2;
1700 }
6f1401dc
DM
1701 tryAMAGICbin_MG(repeat_amg, AMGf_assign);
1702 sv = POPs;
1703 }
1704
2b573ace
JH
1705 if (SvIOKp(sv)) {
1706 if (SvUOK(sv)) {
6f1401dc 1707 const UV uv = SvUV_nomg(sv);
2b573ace
JH
1708 if (uv > IV_MAX)
1709 count = IV_MAX; /* The best we can do? */
1710 else
1711 count = uv;
1712 } else {
b3211734 1713 count = SvIV_nomg(sv);
2b573ace
JH
1714 }
1715 }
1716 else if (SvNOKp(sv)) {
02a7a248
JH
1717 const NV nv = SvNV_nomg(sv);
1718 infnan = Perl_isinfnan(nv);
1719 if (UNLIKELY(infnan)) {
1720 count = 0;
1721 } else {
1722 if (nv < 0.0)
1723 count = -1; /* An arbitrary negative integer */
1724 else
1725 count = (IV)nv;
1726 }
2b573ace
JH
1727 }
1728 else
02a7a248 1729 count = SvIV_nomg(sv);
6f1401dc 1730
02a7a248
JH
1731 if (infnan) {
1732 Perl_ck_warner(aTHX_ packWARN(WARN_NUMERIC),
1733 "Non-finite repeat count does nothing");
1734 } else if (count < 0) {
b3211734
KW
1735 count = 0;
1736 Perl_ck_warner(aTHX_ packWARN(WARN_NUMERIC),
02a7a248 1737 "Negative repeat count does nothing");
b3211734
KW
1738 }
1739
490b24f6 1740 if (gimme == G_ARRAY && PL_op->op_private & OPpREPEAT_DOLIST) {
a0d0e21e 1741 dMARK;
052a7c76 1742 const SSize_t items = SP - MARK;
da9e430b 1743 const U8 mod = PL_op->op_flags & OPf_MOD;
79072805 1744
a0d0e21e 1745 if (count > 1) {
052a7c76 1746 SSize_t max;
b3b27d01 1747
052a7c76
DM
1748 if ( items > SSize_t_MAX / count /* max would overflow */
1749 /* repeatcpy would overflow */
1750 || items > I32_MAX / (I32)sizeof(SV *)
b3b27d01
DM
1751 )
1752 Perl_croak(aTHX_ "%s","Out of memory during list extend");
1753 max = items * count;
1754 MEXTEND(MARK, max);
1755
a0d0e21e 1756 while (SP > MARK) {
60779a30
DM
1757 if (*SP) {
1758 if (mod && SvPADTMP(*SP)) {
da9e430b 1759 *SP = sv_mortalcopy(*SP);
60779a30 1760 }
976c8a39 1761 SvTEMP_off((*SP));
da9e430b 1762 }
a0d0e21e 1763 SP--;
79072805 1764 }
a0d0e21e
LW
1765 MARK++;
1766 repeatcpy((char*)(MARK + items), (char*)MARK,
ad64d0ec 1767 items * sizeof(const SV *), count - 1);
a0d0e21e 1768 SP += max;
79072805 1769 }
a0d0e21e 1770 else if (count <= 0)
052a7c76 1771 SP = MARK;
79072805 1772 }
a0d0e21e 1773 else { /* Note: mark already snarfed by pp_list */
0bd48802 1774 SV * const tmpstr = POPs;
a0d0e21e 1775 STRLEN len;
9b877dbb 1776 bool isutf;
a0d0e21e 1777
6f1401dc
DM
1778 if (TARG != tmpstr)
1779 sv_setsv_nomg(TARG, tmpstr);
1780 SvPV_force_nomg(TARG, len);
9b877dbb 1781 isutf = DO_UTF8(TARG);
8ebc5c01 1782 if (count != 1) {
1783 if (count < 1)
1784 SvCUR_set(TARG, 0);
1785 else {
b3b27d01
DM
1786 STRLEN max;
1787
1788 if ( len > (MEM_SIZE_MAX-1) / (UV)count /* max would overflow */
1789 || len > (U32)I32_MAX /* repeatcpy would overflow */
1790 )
1791 Perl_croak(aTHX_ "%s",
1792 "Out of memory during string extend");
1793 max = (UV)count * len + 1;
1794 SvGROW(TARG, max);
1795
a0d0e21e 1796 repeatcpy(SvPVX(TARG) + len, SvPVX(TARG), len, count - 1);
b162af07 1797 SvCUR_set(TARG, SvCUR(TARG) * count);
7a4c00b4 1798 }
a0d0e21e 1799 *SvEND(TARG) = '\0';
a0d0e21e 1800 }
dfcb284a
GS
1801 if (isutf)
1802 (void)SvPOK_only_UTF8(TARG);
1803 else
1804 (void)SvPOK_only(TARG);
b80b6069 1805
a0d0e21e 1806 PUSHTARG;
79072805 1807 }
a0d0e21e
LW
1808 RETURN;
1809}
79072805 1810
a0d0e21e
LW
1811PP(pp_subtract)
1812{
20b7effb 1813 dSP; dATARGET; bool useleft; SV *svl, *svr;
6f1401dc
DM
1814 tryAMAGICbin_MG(subtr_amg, AMGf_assign|AMGf_numeric);
1815 svr = TOPs;
1816 svl = TOPm1s;
230ee21f 1817
28e5dec8 1818#ifdef PERL_PRESERVE_IVUV
230ee21f
DM
1819
1820 /* special-case some simple common cases */
1821 if (!((svl->sv_flags|svr->sv_flags) & (SVf_IVisUV|SVs_GMG))) {
1822 IV il, ir;
1823 U32 flags = (svl->sv_flags & svr->sv_flags);
1824 if (flags & SVf_IOK) {
1825 /* both args are simple IVs */
1826 UV topl, topr;
1827 il = SvIVX(svl);
1828 ir = SvIVX(svr);
1829 do_iv:
1830 topl = ((UV)il) >> (UVSIZE * 8 - 2);
1831 topr = ((UV)ir) >> (UVSIZE * 8 - 2);
1832
1833 /* if both are in a range that can't under/overflow, do a
1834 * simple integer subtract: if the top of both numbers
1835 * are 00 or 11, then it's safe */
1836 if (!( ((topl+1) | (topr+1)) & 2)) {
1837 SP--;
1838 TARGi(il - ir, 0); /* args not GMG, so can't be tainted */
1839 SETs(TARG);
1840 RETURN;
1841 }
1842 goto generic;
1843 }
1844 else if (flags & SVf_NOK) {
1845 /* both args are NVs */
1846 NV nl = SvNVX(svl);
1847 NV nr = SvNVX(svr);
1848
3336af0b
DD
1849 if (
1850#if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
1851 !Perl_isnan(nl) && nl == (NV)(il = (IV)nl)
1852 && !Perl_isnan(nr) && nr == (NV)(ir = (IV)nr)
1853#else
1854 nl == (NV)(il = (IV)nl) && nr == (NV)(ir = (IV)nr)
1855#endif
1856 )
230ee21f
DM
1857 /* nothing was lost by converting to IVs */
1858 goto do_iv;
1859 SP--;
1860 TARGn(nl - nr, 0); /* args not GMG, so can't be tainted */
1861 SETs(TARG);
1862 RETURN;
1863 }
1864 }
1865
1866 generic:
1867
1868 useleft = USE_LEFT(svl);
7dca457a
NC
1869 /* See comments in pp_add (in pp_hot.c) about Overflow, and how
1870 "bad things" happen if you rely on signed integers wrapping. */
01f91bf2 1871 if (SvIV_please_nomg(svr)) {
28e5dec8
JH
1872 /* Unless the left argument is integer in range we are going to have to
1873 use NV maths. Hence only attempt to coerce the right argument if
1874 we know the left is integer. */
eb578fdb 1875 UV auv = 0;
9c5ffd7c 1876 bool auvok = FALSE;
7dca457a
NC
1877 bool a_valid = 0;
1878
28e5dec8 1879 if (!useleft) {
7dca457a
NC
1880 auv = 0;
1881 a_valid = auvok = 1;
1882 /* left operand is undef, treat as zero. */
28e5dec8
JH
1883 } else {
1884 /* Left operand is defined, so is it IV? */
01f91bf2 1885 if (SvIV_please_nomg(svl)) {
800401ee
JH
1886 if ((auvok = SvUOK(svl)))
1887 auv = SvUVX(svl);
7dca457a 1888 else {
eb578fdb 1889 const IV aiv = SvIVX(svl);
7dca457a
NC
1890 if (aiv >= 0) {
1891 auv = aiv;
1892 auvok = 1; /* Now acting as a sign flag. */
1893 } else { /* 2s complement assumption for IV_MIN */
53e2bfb7 1894 auv = (aiv == IV_MIN) ? (UV)aiv : (UV)-aiv;
28e5dec8 1895 }
7dca457a
NC
1896 }
1897 a_valid = 1;
1898 }
1899 }
1900 if (a_valid) {
1901 bool result_good = 0;
1902 UV result;
eb578fdb 1903 UV buv;
800401ee 1904 bool buvok = SvUOK(svr);
9041c2e3 1905
7dca457a 1906 if (buvok)
800401ee 1907 buv = SvUVX(svr);
7dca457a 1908 else {
eb578fdb 1909 const IV biv = SvIVX(svr);
7dca457a
NC
1910 if (biv >= 0) {
1911 buv = biv;
1912 buvok = 1;
1913 } else
53e2bfb7 1914 buv = (biv == IV_MIN) ? (UV)biv : (UV)-biv;
7dca457a
NC
1915 }
1916 /* ?uvok if value is >= 0. basically, flagged as UV if it's +ve,
602f51c4 1917 else "IV" now, independent of how it came in.
7dca457a
NC
1918 if a, b represents positive, A, B negative, a maps to -A etc
1919 a - b => (a - b)
1920 A - b => -(a + b)
1921 a - B => (a + b)
1922 A - B => -(a - b)
1923 all UV maths. negate result if A negative.
1924 subtract if signs same, add if signs differ. */
1925
1926 if (auvok ^ buvok) {
1927 /* Signs differ. */
1928 result = auv + buv;
1929 if (result >= auv)
1930 result_good = 1;
1931 } else {
1932 /* Signs same */
1933 if (auv >= buv) {
1934 result = auv - buv;
1935 /* Must get smaller */
1936 if (result <= auv)
1937 result_good = 1;
1938 } else {
1939 result = buv - auv;
1940 if (result <= buv) {
1941 /* result really should be -(auv-buv). as its negation
1942 of true value, need to swap our result flag */
1943 auvok = !auvok;
1944 result_good = 1;
28e5dec8 1945 }
28e5dec8
JH
1946 }
1947 }
7dca457a
NC
1948 if (result_good) {
1949 SP--;
1950 if (auvok)
1951 SETu( result );
1952 else {
1953 /* Negate result */
1954 if (result <= (UV)IV_MIN)
53e2bfb7
DM
1955 SETi(result == (UV)IV_MIN
1956 ? IV_MIN : -(IV)result);
7dca457a
NC
1957 else {
1958 /* result valid, but out of range for IV. */
1959 SETn( -(NV)result );
1960 }
1961 }
1962 RETURN;
1963 } /* Overflow, drop through to NVs. */
28e5dec8
JH
1964 }
1965 }
230ee21f
DM
1966#else
1967 useleft = USE_LEFT(svl);
28e5dec8 1968#endif
a0d0e21e 1969 {
6f1401dc 1970 NV value = SvNV_nomg(svr);
4efa5a16
RD
1971 (void)POPs;
1972
28e5dec8
JH
1973 if (!useleft) {
1974 /* left operand is undef, treat as zero - value */
1975 SETn(-value);
1976 RETURN;
1977 }
6f1401dc 1978 SETn( SvNV_nomg(svl) - value );
28e5dec8 1979 RETURN;
79072805 1980 }
a0d0e21e 1981}
79072805 1982
b3498293
JH
1983#define IV_BITS (IVSIZE * 8)
1984
1985static UV S_uv_shift(UV uv, int shift, bool left)
1986{
1987 if (shift < 0) {
1988 shift = -shift;
1989 left = !left;
1990 }
1991 if (shift >= IV_BITS) {
1992 return 0;
1993 }
1994 return left ? uv << shift : uv >> shift;
1995}
1996
1997static IV S_iv_shift(IV iv, int shift, bool left)
1998{
1999 if (shift < 0) {
2000 shift = -shift;
2001 left = !left;
2002 }
2003 if (shift >= IV_BITS) {
b69687e7 2004 return iv < 0 && !left ? -1 : 0;
b3498293
JH
2005 }
2006 return left ? iv << shift : iv >> shift;
2007}
2008
2009#define UV_LEFT_SHIFT(uv, shift) S_uv_shift(uv, shift, TRUE)
2010#define UV_RIGHT_SHIFT(uv, shift) S_uv_shift(uv, shift, FALSE)
2011#define IV_LEFT_SHIFT(iv, shift) S_iv_shift(iv, shift, TRUE)
2012#define IV_RIGHT_SHIFT(iv, shift) S_iv_shift(iv, shift, FALSE)
2013
a0d0e21e
LW
2014PP(pp_left_shift)
2015{
20b7effb 2016 dSP; dATARGET; SV *svl, *svr;
a42d0242 2017 tryAMAGICbin_MG(lshift_amg, AMGf_assign|AMGf_numeric);
6f1401dc
DM
2018 svr = POPs;
2019 svl = TOPs;
a0d0e21e 2020 {
6f1401dc 2021 const IV shift = SvIV_nomg(svr);
d0ba1bd2 2022 if (PL_op->op_private & HINT_INTEGER) {
b3498293 2023 SETi(IV_LEFT_SHIFT(SvIV_nomg(svl), shift));
d0ba1bd2
JH
2024 }
2025 else {
b3498293 2026 SETu(UV_LEFT_SHIFT(SvUV_nomg(svl), shift));
d0ba1bd2 2027 }
55497cff 2028 RETURN;
79072805 2029 }
a0d0e21e 2030}
79072805 2031
a0d0e21e
LW
2032PP(pp_right_shift)
2033{
20b7effb 2034 dSP; dATARGET; SV *svl, *svr;
a42d0242 2035 tryAMAGICbin_MG(rshift_amg, AMGf_assign|AMGf_numeric);
6f1401dc
DM
2036 svr = POPs;
2037 svl = TOPs;
a0d0e21e 2038 {
6f1401dc 2039 const IV shift = SvIV_nomg(svr);
d0ba1bd2 2040 if (PL_op->op_private & HINT_INTEGER) {
b3498293 2041 SETi(IV_RIGHT_SHIFT(SvIV_nomg(svl), shift));
d0ba1bd2
JH
2042 }
2043 else {
b3498293 2044 SETu(UV_RIGHT_SHIFT(SvUV_nomg(svl), shift));
d0ba1bd2 2045 }
a0d0e21e 2046 RETURN;
93a17b20 2047 }
79072805
LW
2048}
2049
a0d0e21e 2050PP(pp_lt)
79072805 2051{
20b7effb 2052 dSP;
33efebe6
DM
2053 SV *left, *right;
2054
a42d0242 2055 tryAMAGICbin_MG(lt_amg, AMGf_set|AMGf_numeric);
33efebe6
DM
2056 right = POPs;
2057 left = TOPs;
2058 SETs(boolSV(
2059 (SvIOK_notUV(left) && SvIOK_notUV(right))
2060 ? (SvIVX(left) < SvIVX(right))
2061 : (do_ncmp(left, right) == -1)
2062 ));
2063 RETURN;
a0d0e21e 2064}
79072805 2065
a0d0e21e
LW
2066PP(pp_gt)
2067{
20b7effb 2068 dSP;
33efebe6 2069 SV *left, *right;
1b6737cc 2070
33efebe6
DM
2071 tryAMAGICbin_MG(gt_amg, AMGf_set|AMGf_numeric);
2072 right = POPs;
2073 left = TOPs;
2074 SETs(boolSV(
2075 (SvIOK_notUV(left) && SvIOK_notUV(right))
2076 ? (SvIVX(left) > SvIVX(right))
2077 : (do_ncmp(left, right) == 1)
2078 ));
2079 RETURN;
a0d0e21e
LW
2080}
2081
2082PP(pp_le)
2083{
20b7effb 2084 dSP;
33efebe6 2085 SV *left, *right;
1b6737cc 2086
33efebe6
DM
2087 tryAMAGICbin_MG(le_amg, AMGf_set|AMGf_numeric);
2088 right = POPs;
2089 left = TOPs;
2090 SETs(boolSV(
2091 (SvIOK_notUV(left) && SvIOK_notUV(right))
2092 ? (SvIVX(left) <= SvIVX(right))
2093 : (do_ncmp(left, right) <= 0)
2094 ));
2095 RETURN;
a0d0e21e
LW
2096}
2097
2098PP(pp_ge)
2099{
20b7effb 2100 dSP;
33efebe6
DM
2101 SV *left, *right;
2102
2103 tryAMAGICbin_MG(ge_amg, AMGf_set|AMGf_numeric);
2104 right = POPs;
2105 left = TOPs;
2106 SETs(boolSV(
2107 (SvIOK_notUV(left) && SvIOK_notUV(right))
2108 ? (SvIVX(left) >= SvIVX(right))
2109 : ( (do_ncmp(left, right) & 2) == 0)
2110 ));
2111 RETURN;
2112}
1b6737cc 2113
33efebe6
DM
2114PP(pp_ne)
2115{
20b7effb 2116 dSP;
33efebe6
DM
2117 SV *left, *right;
2118
2119 tryAMAGICbin_MG(ne_amg, AMGf_set|AMGf_numeric);
2120 right = POPs;
2121 left = TOPs;
2122 SETs(boolSV(
2123 (SvIOK_notUV(left) && SvIOK_notUV(right))
2124 ? (SvIVX(left) != SvIVX(right))
2125 : (do_ncmp(left, right) != 0)
2126 ));
2127 RETURN;
2128}
1b6737cc 2129
33efebe6
DM
2130/* compare left and right SVs. Returns:
2131 * -1: <
2132 * 0: ==
2133 * 1: >
2134 * 2: left or right was a NaN
2135 */
2136I32
2137Perl_do_ncmp(pTHX_ SV* const left, SV * const right)
2138{
33efebe6
DM
2139 PERL_ARGS_ASSERT_DO_NCMP;
2140#ifdef PERL_PRESERVE_IVUV
33efebe6 2141 /* Fortunately it seems NaN isn't IOK */
01f91bf2 2142 if (SvIV_please_nomg(right) && SvIV_please_nomg(left)) {
33efebe6
DM
2143 if (!SvUOK(left)) {
2144 const IV leftiv = SvIVX(left);
2145 if (!SvUOK(right)) {
2146 /* ## IV <=> IV ## */
2147 const IV rightiv = SvIVX(right);
2148 return (leftiv > rightiv) - (leftiv < rightiv);
28e5dec8 2149 }
33efebe6
DM
2150 /* ## IV <=> UV ## */
2151 if (leftiv < 0)
2152 /* As (b) is a UV, it's >=0, so it must be < */
2153 return -1;
2154 {
2155 const UV rightuv = SvUVX(right);
2156 return ((UV)leftiv > rightuv) - ((UV)leftiv < rightuv);
28e5dec8 2157 }
28e5dec8 2158 }
79072805 2159
33efebe6
DM
2160 if (SvUOK(right)) {
2161 /* ## UV <=> UV ## */
2162 const UV leftuv = SvUVX(left);
2163 const UV rightuv = SvUVX(right);
2164 return (leftuv > rightuv) - (leftuv < rightuv);
28e5dec8 2165 }
33efebe6
DM
2166 /* ## UV <=> IV ## */
2167 {
2168 const IV rightiv = SvIVX(right);
2169 if (rightiv < 0)
2170 /* As (a) is a UV, it's >=0, so it cannot be < */
2171 return 1;
2172 {
2173 const UV leftuv = SvUVX(left);
2174 return (leftuv > (UV)rightiv) - (leftuv < (UV)rightiv);
28e5dec8 2175 }
28e5dec8 2176 }
e5964223 2177 NOT_REACHED; /* NOTREACHED */
28e5dec8
JH
2178 }
2179#endif
a0d0e21e 2180 {
33efebe6
DM
2181 NV const rnv = SvNV_nomg(right);
2182 NV const lnv = SvNV_nomg(left);
2183
cab190d4 2184#if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
33efebe6
DM
2185 if (Perl_isnan(lnv) || Perl_isnan(rnv)) {
2186 return 2;
2187 }
2188 return (lnv > rnv) - (lnv < rnv);
cab190d4 2189#else
33efebe6
DM
2190 if (lnv < rnv)
2191 return -1;
2192 if (lnv > rnv)
2193 return 1;
659c4b96 2194 if (lnv == rnv)
33efebe6
DM
2195 return 0;
2196 return 2;
cab190d4 2197#endif
a0d0e21e 2198 }
79072805
LW
2199}
2200
33efebe6 2201
a0d0e21e 2202PP(pp_ncmp)
79072805 2203{
20b7effb 2204 dSP;
33efebe6
DM
2205 SV *left, *right;
2206 I32 value;
a42d0242 2207 tryAMAGICbin_MG(ncmp_amg, AMGf_numeric);
33efebe6
DM
2208 right = POPs;
2209 left = TOPs;
2210 value = do_ncmp(left, right);
2211 if (value == 2) {
3280af22 2212 SETs(&PL_sv_undef);
79072805 2213 }
33efebe6
DM
2214 else {
2215 dTARGET;
2216 SETi(value);
2217 }
2218 RETURN;
a0d0e21e 2219}
79072805 2220
b1c05ba5
DM
2221
2222/* also used for: pp_sge() pp_sgt() pp_slt() */
2223
afd9910b 2224PP(pp_sle)
a0d0e21e 2225{
20b7effb 2226 dSP;
79072805 2227
afd9910b
NC
2228 int amg_type = sle_amg;
2229 int multiplier = 1;
2230 int rhs = 1;
79072805 2231
afd9910b
NC
2232 switch (PL_op->op_type) {
2233 case OP_SLT:
2234 amg_type = slt_amg;
2235 /* cmp < 0 */
2236 rhs = 0;
2237 break;
2238 case OP_SGT:
2239 amg_type = sgt_amg;
2240 /* cmp > 0 */
2241 multiplier = -1;
2242 rhs = 0;
2243 break;
2244 case OP_SGE:
2245 amg_type = sge_amg;
2246 /* cmp >= 0 */
2247 multiplier = -1;
2248 break;
79072805 2249 }
79072805 2250
6f1401dc 2251 tryAMAGICbin_MG(amg_type, AMGf_set);
a0d0e21e
LW
2252 {
2253 dPOPTOPssrl;
130c5df3 2254 const int cmp =
5778acb6 2255#ifdef USE_LOCALE_COLLATE
130c5df3
KW
2256 (IN_LC_RUNTIME(LC_COLLATE))
2257 ? sv_cmp_locale_flags(left, right, 0)
2258 :
2259#endif
2260 sv_cmp_flags(left, right, 0);
afd9910b 2261 SETs(boolSV(cmp * multiplier < rhs));
a0d0e21e
LW
2262 RETURN;
2263 }
2264}
79072805 2265
36477c24 2266PP(pp_seq)
2267{
20b7effb 2268 dSP;
6f1401dc 2269 tryAMAGICbin_MG(seq_amg, AMGf_set);
36477c24 2270 {
2271 dPOPTOPssrl;
078504b2 2272 SETs(boolSV(sv_eq_flags(left, right, 0)));
a0d0e21e
LW
2273 RETURN;
2274 }
2275}
79072805 2276
a0d0e21e 2277PP(pp_sne)
79072805 2278{
20b7effb 2279 dSP;
6f1401dc 2280 tryAMAGICbin_MG(sne_amg, AMGf_set);
a0d0e21e
LW
2281 {
2282 dPOPTOPssrl;
078504b2 2283 SETs(boolSV(!sv_eq_flags(left, right, 0)));
a0d0e21e 2284 RETURN;
463ee0b2 2285 }
79072805
LW
2286}
2287
a0d0e21e 2288PP(pp_scmp)
79072805 2289{
20b7effb 2290 dSP; dTARGET;
6f1401dc 2291 tryAMAGICbin_MG(scmp_amg, 0);
a0d0e21e
LW
2292 {
2293 dPOPTOPssrl;
130c5df3 2294 const int cmp =
5778acb6 2295#ifdef USE_LOCALE_COLLATE
130c5df3
KW
2296 (IN_LC_RUNTIME(LC_COLLATE))
2297 ? sv_cmp_locale_flags(left, right, 0)
2298 :
2299#endif
2300 sv_cmp_flags(left, right, 0);
bbce6d69 2301 SETi( cmp );
a0d0e21e
LW
2302 RETURN;
2303 }
2304}
79072805 2305
55497cff 2306PP(pp_bit_and)
2307{
20b7effb 2308 dSP; dATARGET;
6f1401dc 2309 tryAMAGICbin_MG(band_amg, AMGf_assign);
a0d0e21e
LW
2310 {
2311 dPOPTOPssrl;
4633a7c4 2312 if (SvNIOKp(left) || SvNIOKp(right)) {
b20c4ee1
FC
2313 const bool left_ro_nonnum = !SvNIOKp(left) && SvREADONLY(left);
2314 const bool right_ro_nonnum = !SvNIOKp(right) && SvREADONLY(right);
d0ba1bd2 2315 if (PL_op->op_private & HINT_INTEGER) {
1b6737cc 2316 const IV i = SvIV_nomg(left) & SvIV_nomg(right);
972b05a9 2317 SETi(i);
d0ba1bd2
JH
2318 }
2319 else {
1b6737cc 2320 const UV u = SvUV_nomg(left) & SvUV_nomg(right);
972b05a9 2321 SETu(u);
d0ba1bd2 2322 }
5ee80e13 2323 if (left_ro_nonnum && left != TARG) SvNIOK_off(left);
b20c4ee1 2324 if (right_ro_nonnum) SvNIOK_off(right);
a0d0e21e
LW
2325 }
2326 else {
533c011a 2327 do_vop(PL_op->op_type, TARG, left, right);
a0d0e21e
LW
2328 SETTARG;
2329 }
2330 RETURN;
2331 }
2332}
79072805 2333
5d01050a
FC
2334PP(pp_nbit_and)
2335{
2336 dSP;
636ac8fc 2337 tryAMAGICbin_MG(band_amg, AMGf_assign|AMGf_numarg);
5d01050a
FC
2338 {
2339 dATARGET; dPOPTOPssrl;
2340 if (PL_op->op_private & HINT_INTEGER) {
2341 const IV i = SvIV_nomg(left) & SvIV_nomg(right);
2342 SETi(i);
2343 }
2344 else {
2345 const UV u = SvUV_nomg(left) & SvUV_nomg(right);
2346 SETu(u);
2347 }
2348 }
2349 RETURN;
2350}
2351
2352PP(pp_sbit_and)
2353{
2354 dSP;
2355 tryAMAGICbin_MG(sband_amg, AMGf_assign);
2356 {
2357 dATARGET; dPOPTOPssrl;
2358 do_vop(OP_BIT_AND, TARG, left, right);
2359 RETSETTARG;
2360 }
2361}
b1c05ba5
DM
2362
2363/* also used for: pp_bit_xor() */
2364
a0d0e21e
LW
2365PP(pp_bit_or)
2366{
20b7effb 2367 dSP; dATARGET;
3658c1f1
NC
2368 const int op_type = PL_op->op_type;
2369
6f1401dc 2370 tryAMAGICbin_MG((op_type == OP_BIT_OR ? bor_amg : bxor_amg), AMGf_assign);
a0d0e21e
LW
2371 {
2372 dPOPTOPssrl;
4633a7c4 2373 if (SvNIOKp(left) || SvNIOKp(right)) {
b20c4ee1
FC
2374 const bool left_ro_nonnum = !SvNIOKp(left) && SvREADONLY(left);
2375 const bool right_ro_nonnum = !SvNIOKp(right) && SvREADONLY(right);
d0ba1bd2 2376 if (PL_op->op_private & HINT_INTEGER) {
3658c1f1
NC
2377 const IV l = (USE_LEFT(left) ? SvIV_nomg(left) : 0);
2378 const IV r = SvIV_nomg(right);
2379 const IV result = op_type == OP_BIT_OR ? (l | r) : (l ^ r);
2380 SETi(result);
d0ba1bd2
JH
2381 }
2382 else {
3658c1f1
NC
2383 const UV l = (USE_LEFT(left) ? SvUV_nomg(left) : 0);
2384 const UV r = SvUV_nomg(right);
2385 const UV result = op_type == OP_BIT_OR ? (l | r) : (l ^ r);
2386 SETu(result);
d0ba1bd2 2387 }
5ee80e13 2388 if (left_ro_nonnum && left != TARG) SvNIOK_off(left);
b20c4ee1 2389 if (right_ro_nonnum) SvNIOK_off(right);
a0d0e21e
LW
2390 }
2391 else {
3658c1f1 2392 do_vop(op_type, TARG, left, right);
a0d0e21e
LW
2393 SETTARG;
2394 }
2395 RETURN;
79072805 2396 }
a0d0e21e 2397}
79072805 2398
5d01050a
FC
2399/* also used for: pp_nbit_xor() */
2400
2401PP(pp_nbit_or)
2402{
2403 dSP;
2404 const int op_type = PL_op->op_type;
2405
2406 tryAMAGICbin_MG((op_type == OP_NBIT_OR ? bor_amg : bxor_amg),
636ac8fc 2407 AMGf_assign|AMGf_numarg);
5d01050a
FC
2408 {
2409 dATARGET; dPOPTOPssrl;
2410 if (PL_op->op_private & HINT_INTEGER) {
2411 const IV l = (USE_LEFT(left) ? SvIV_nomg(left) : 0);
2412 const IV r = SvIV_nomg(right);
2413 const IV result = op_type == OP_NBIT_OR ? (l | r) : (l ^ r);
2414 SETi(result);
2415 }
2416 else {
2417 const UV l = (USE_LEFT(left) ? SvUV_nomg(left) : 0);
2418 const UV r = SvUV_nomg(right);
2419 const UV result = op_type == OP_NBIT_OR ? (l | r) : (l ^ r);
2420 SETu(result);
2421 }
2422 }
2423 RETURN;
2424}
2425
2426/* also used for: pp_sbit_xor() */
2427
2428PP(pp_sbit_or)
2429{
2430 dSP;
2431 const int op_type = PL_op->op_type;
2432
2433 tryAMAGICbin_MG((op_type == OP_SBIT_OR ? sbor_amg : sbxor_amg),
2434 AMGf_assign);
2435 {
2436 dATARGET; dPOPTOPssrl;
2437 do_vop(op_type == OP_SBIT_OR ? OP_BIT_OR : OP_BIT_XOR, TARG, left,
2438 right);
2439 RETSETTARG;
2440 }
2441}
2442
1c2b3fd6
FC
2443PERL_STATIC_INLINE bool
2444S_negate_string(pTHX)
2445{
2446 dTARGET; dSP;
2447 STRLEN len;
2448 const char *s;
2449 SV * const sv = TOPs;
2450 if (!SvPOKp(sv) || SvNIOK(sv) || (!SvPOK(sv) && SvNIOKp(sv)))
2451 return FALSE;
2452 s = SvPV_nomg_const(sv, len);
2453 if (isIDFIRST(*s)) {
2454 sv_setpvs(TARG, "-");
2455 sv_catsv(TARG, sv);
2456 }
2457 else if (*s == '+' || (*s == '-' && !looks_like_number(sv))) {
2458 sv_setsv_nomg(TARG, sv);
2459 *SvPV_force_nomg(TARG, len) = *s == '-' ? '+' : '-';
2460 }
2461 else return FALSE;
245d035e 2462 SETTARG;
1c2b3fd6
FC
2463 return TRUE;
2464}
2465
a0d0e21e
LW
2466PP(pp_negate)
2467{
20b7effb 2468 dSP; dTARGET;
6f1401dc 2469 tryAMAGICun_MG(neg_amg, AMGf_numeric);
1c2b3fd6 2470 if (S_negate_string(aTHX)) return NORMAL;
a0d0e21e 2471 {
6f1401dc 2472 SV * const sv = TOPs;
a5b92898 2473
d96ab1b5 2474 if (SvIOK(sv)) {
7dbe3150 2475 /* It's publicly an integer */
28e5dec8 2476 oops_its_an_int:
9b0e499b
GS
2477 if (SvIsUV(sv)) {
2478 if (SvIVX(sv) == IV_MIN) {
28e5dec8 2479 /* 2s complement assumption. */
d14578b8
KW
2480 SETi(SvIVX(sv)); /* special case: -((UV)IV_MAX+1) ==
2481 IV_MIN */
245d035e 2482 return NORMAL;
9b0e499b
GS
2483 }
2484 else if (SvUVX(sv) <= IV_MAX) {
beccb14c 2485 SETi(-SvIVX(sv));
245d035e 2486 return NORMAL;
9b0e499b
GS
2487 }
2488 }
2489 else if (SvIVX(sv) != IV_MIN) {
2490 SETi(-SvIVX(sv));
245d035e 2491 return NORMAL;
9b0e499b 2492 }
28e5dec8
JH
2493#ifdef PERL_PRESERVE_IVUV
2494 else {
2495 SETu((UV)IV_MIN);
245d035e 2496 return NORMAL;
28e5dec8
JH
2497 }
2498#endif
9b0e499b 2499 }
8a5decd8 2500 if (SvNIOKp(sv) && (SvNIOK(sv) || !SvPOK(sv)))
6f1401dc 2501 SETn(-SvNV_nomg(sv));
1c2b3fd6 2502 else if (SvPOKp(sv) && SvIV_please_nomg(sv))
8eb28a70 2503 goto oops_its_an_int;
4633a7c4 2504 else
6f1401dc 2505 SETn(-SvNV_nomg(sv));
79072805 2506 }
245d035e 2507 return NORMAL;
79072805
LW
2508}
2509
a0d0e21e 2510PP(pp_not)
79072805 2511{
20b7effb 2512 dSP;
f4c975aa
DM
2513 SV *sv;
2514
6f1401dc 2515 tryAMAGICun_MG(not_amg, AMGf_set);
f4c975aa
DM
2516 sv = *PL_stack_sp;
2517 *PL_stack_sp = boolSV(!SvTRUE_nomg_NN(sv));
a0d0e21e 2518 return NORMAL;
79072805
LW
2519}
2520
5d01050a
FC
2521static void
2522S_scomplement(pTHX_ SV *targ, SV *sv)
79072805 2523{
eb578fdb
KW
2524 U8 *tmps;
2525 I32 anum;
a0d0e21e
LW
2526 STRLEN len;
2527
85b0ee6e
FC
2528 sv_copypv_nomg(TARG, sv);
2529 tmps = (U8*)SvPV_nomg(TARG, len);
08b6664b 2530
1d68d6cd 2531 if (SvUTF8(TARG)) {
08b6664b 2532 if (len && ! utf8_to_bytes(tmps, &len)) {
814eedc8 2533 Perl_croak(aTHX_ FATAL_ABOVE_FF_MSG, PL_op_desc[PL_op->op_type]);
08b6664b
KW
2534 }
2535 SvCUR(TARG) = len;
2536 SvUTF8_off(TARG);
2537 }
2538
2539 anum = len;
1d68d6cd 2540
a0d0e21e 2541#ifdef LIBERAL
51723571 2542 {
eb578fdb 2543 long *tmpl;
51723571
JH
2544 for ( ; anum && (unsigned long)tmps % sizeof(long); anum--, tmps++)
2545 *tmps = ~*tmps;
2546 tmpl = (long*)tmps;
bb7a0f54 2547 for ( ; anum >= (I32)sizeof(long); anum -= (I32)sizeof(long), tmpl++)
51723571
JH
2548 *tmpl = ~*tmpl;
2549 tmps = (U8*)tmpl;
2550 }
a0d0e21e
LW
2551#endif
2552 for ( ; anum > 0; anum--, tmps++)
2553 *tmps = ~*tmps;
5d01050a
FC
2554}
2555
2556PP(pp_complement)
2557{
2558 dSP; dTARGET;
2559 tryAMAGICun_MG(compl_amg, AMGf_numeric);
2560 {
2561 dTOPss;
2562 if (SvNIOKp(sv)) {
2563 if (PL_op->op_private & HINT_INTEGER) {
2564 const IV i = ~SvIV_nomg(sv);
2565 SETi(i);
2566 }
2567 else {
2568 const UV u = ~SvUV_nomg(sv);
2569 SETu(u);
2570 }
2571 }
2572 else {
2573 S_scomplement(aTHX_ TARG, sv);
ec93b65f 2574 SETTARG;
a0d0e21e 2575 }
24840750 2576 return NORMAL;
5d01050a
FC
2577 }
2578}
2579
2580PP(pp_ncomplement)
2581{
2582 dSP;
636ac8fc 2583 tryAMAGICun_MG(compl_amg, AMGf_numeric|AMGf_numarg);
5d01050a
FC
2584 {
2585 dTARGET; dTOPss;
2586 if (PL_op->op_private & HINT_INTEGER) {
2587 const IV i = ~SvIV_nomg(sv);
2588 SETi(i);
2589 }
2590 else {
2591 const UV u = ~SvUV_nomg(sv);
2592 SETu(u);
2593 }
2594 }
2595 return NORMAL;
2596}
2597
2598PP(pp_scomplement)
2599{
2600 dSP;
2601 tryAMAGICun_MG(scompl_amg, AMGf_numeric);
2602 {
2603 dTARGET; dTOPss;
2604 S_scomplement(aTHX_ TARG, sv);
2605 SETTARG;
2606 return NORMAL;
a0d0e21e 2607 }
79072805
LW
2608}
2609
a0d0e21e
LW
2610/* integer versions of some of the above */
2611
a0d0e21e 2612PP(pp_i_multiply)
79072805 2613{
20b7effb 2614 dSP; dATARGET;
6f1401dc 2615 tryAMAGICbin_MG(mult_amg, AMGf_assign);
a0d0e21e 2616 {
6f1401dc 2617 dPOPTOPiirl_nomg;
a0d0e21e
LW
2618 SETi( left * right );
2619 RETURN;
2620 }
79072805
LW
2621}
2622
a0d0e21e 2623PP(pp_i_divide)
79072805 2624{
85935d8e 2625 IV num;
20b7effb 2626 dSP; dATARGET;
6f1401dc 2627 tryAMAGICbin_MG(div_amg, AMGf_assign);
a0d0e21e 2628 {
6f1401dc 2629 dPOPTOPssrl;
85935d8e 2630 IV value = SvIV_nomg(right);
a0d0e21e 2631 if (value == 0)
ece1bcef 2632 DIE(aTHX_ "Illegal division by zero");
85935d8e 2633 num = SvIV_nomg(left);
a0cec769
YST
2634
2635 /* avoid FPE_INTOVF on some platforms when num is IV_MIN */
2636 if (value == -1)
2637 value = - num;
2638 else
2639 value = num / value;
6f1401dc 2640 SETi(value);
a0d0e21e
LW
2641 RETURN;
2642 }
79072805
LW
2643}
2644
befad5d1 2645PP(pp_i_modulo)
224ec323
JH
2646{
2647 /* This is the vanilla old i_modulo. */
20b7effb 2648 dSP; dATARGET;
6f1401dc 2649 tryAMAGICbin_MG(modulo_amg, AMGf_assign);
224ec323 2650 {
6f1401dc 2651 dPOPTOPiirl_nomg;
224ec323
JH
2652 if (!right)
2653 DIE(aTHX_ "Illegal modulus zero");
a0cec769
YST
2654 /* avoid FPE_INTOVF on some platforms when left is IV_MIN */
2655 if (right == -1)
2656 SETi( 0 );
2657 else
2658 SETi( left % right );
224ec323
JH
2659 RETURN;
2660 }
2661}
2662
0927ade0 2663#if defined(__GLIBC__) && IVSIZE == 8 \
bf3d06aa 2664 && ( __GLIBC__ < 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ < 8))
befad5d1 2665
0927ade0 2666PP(pp_i_modulo_glibc_bugfix)
224ec323 2667{
224ec323 2668 /* This is the i_modulo with the workaround for the _moddi3 bug
fce2b89e 2669 * in (at least) glibc 2.2.5 (the PERL_ABS() the workaround).
224ec323 2670 * See below for pp_i_modulo. */
20b7effb 2671 dSP; dATARGET;
6f1401dc 2672 tryAMAGICbin_MG(modulo_amg, AMGf_assign);
224ec323 2673 {
6f1401dc 2674 dPOPTOPiirl_nomg;
224ec323
JH
2675 if (!right)
2676 DIE(aTHX_ "Illegal modulus zero");
a0cec769
YST
2677 /* avoid FPE_INTOVF on some platforms when left is IV_MIN */
2678 if (right == -1)
2679 SETi( 0 );
2680 else
2681 SETi( left % PERL_ABS(right) );
224ec323
JH
2682 RETURN;
2683 }
224ec323 2684}
befad5d1 2685#endif
79072805 2686
a0d0e21e 2687PP(pp_i_add)
79072805 2688{
20b7effb 2689 dSP; dATARGET;
6f1401dc 2690 tryAMAGICbin_MG(add_amg, AMGf_assign);
a0d0e21e 2691 {
6f1401dc 2692 dPOPTOPiirl_ul_nomg;
a0d0e21e
LW
2693 SETi( left + right );
2694 RETURN;
79072805 2695 }
79072805
LW
2696}
2697
a0d0e21e 2698PP(pp_i_subtract)
79072805 2699{
20b7effb 2700 dSP; dATARGET;
6f1401dc 2701 tryAMAGICbin_MG(subtr_amg, AMGf_assign);
a0d0e21e 2702 {
6f1401dc 2703 dPOPTOPiirl_ul_nomg;
a0d0e21e
LW
2704 SETi( left - right );
2705 RETURN;
79072805 2706 }
79072805
LW
2707}
2708
a0d0e21e 2709PP(pp_i_lt)
79072805 2710{
20b7effb 2711 dSP;
6f1401dc 2712 tryAMAGICbin_MG(lt_amg, AMGf_set);
a0d0e21e 2713 {
96b6b87f 2714 dPOPTOPiirl_nomg;
54310121 2715 SETs(boolSV(left < right));
a0d0e21e
LW
2716 RETURN;
2717 }
79072805
LW
2718}
2719
a0d0e21e 2720PP(pp_i_gt)
79072805 2721{
20b7effb 2722 dSP;
6f1401dc 2723 tryAMAGICbin_MG(gt_amg, AMGf_set);
a0d0e21e 2724 {
96b6b87f 2725 dPOPTOPiirl_nomg;
54310121 2726 SETs(boolSV(left > right));
a0d0e21e
LW
2727 RETURN;
2728 }
79072805
LW
2729}
2730
a0d0e21e 2731PP(pp_i_le)
79072805 2732{
20b7effb 2733 dSP;
6f1401dc 2734 tryAMAGICbin_MG(le_amg, AMGf_set);
a0d0e21e 2735 {
96b6b87f 2736 dPOPTOPiirl_nomg;
54310121 2737 SETs(boolSV(left <= right));
a0d0e21e 2738 RETURN;
85e6fe83 2739 }
79072805
LW
2740}
2741
a0d0e21e 2742PP(pp_i_ge)
79072805 2743{
20b7effb 2744 dSP;
6f1401dc 2745 tryAMAGICbin_MG(ge_amg, AMGf_set);
a0d0e21e 2746 {
96b6b87f 2747 dPOPTOPiirl_nomg;
54310121 2748 SETs(boolSV(left >= right));
a0d0e21e
LW
2749 RETURN;
2750 }
79072805
LW
2751}
2752
a0d0e21e 2753PP(pp_i_eq)
79072805 2754{
20b7effb 2755 dSP;
6f1401dc 2756 tryAMAGICbin_MG(eq_amg, AMGf_set);
a0d0e21e 2757 {
96b6b87f 2758 dPOPTOPiirl_nomg;
54310121 2759 SETs(boolSV(left == right));
a0d0e21e
LW
2760 RETURN;
2761 }
79072805
LW
2762}
2763
a0d0e21e 2764PP(pp_i_ne)
79072805 2765{
20b7effb 2766 dSP;
6f1401dc 2767 tryAMAGICbin_MG(ne_amg, AMGf_set);
a0d0e21e 2768 {
96b6b87f 2769 dPOPTOPiirl_nomg;
54310121 2770 SETs(boolSV(left != right));
a0d0e21e
LW
2771 RETURN;
2772 }
79072805
LW
2773}
2774
a0d0e21e 2775PP(pp_i_ncmp)
79072805 2776{
20b7effb 2777 dSP; dTARGET;
6f1401dc 2778 tryAMAGICbin_MG(ncmp_amg, 0);
a0d0e21e 2779 {
96b6b87f 2780 dPOPTOPiirl_nomg;
a0d0e21e 2781 I32 value;
79072805 2782
a0d0e21e 2783 if (left > right)
79072805 2784 value = 1;
a0d0e21e 2785 else if (left < right)
79072805 2786 value = -1;
a0d0e21e 2787 else
79072805 2788 value = 0;
a0d0e21e
LW
2789 SETi(value);
2790 RETURN;
79072805 2791 }
85e6fe83
LW
2792}
2793
2794PP(pp_i_negate)
2795{
20b7effb 2796 dSP; dTARGET;
6f1401dc 2797 tryAMAGICun_MG(neg_amg, 0);
1c2b3fd6 2798 if (S_negate_string(aTHX)) return NORMAL;
6f1401dc
DM
2799 {
2800 SV * const sv = TOPs;
2801 IV const i = SvIV_nomg(sv);
2802 SETi(-i);
ae642386 2803 return NORMAL;
6f1401dc 2804 }
85e6fe83
LW
2805}
2806
79072805
LW
2807/* High falutin' math. */
2808
2809PP(pp_atan2)
2810{
20b7effb 2811 dSP; dTARGET;
6f1401dc 2812 tryAMAGICbin_MG(atan2_amg, 0);
a0d0e21e 2813 {
096c060c 2814 dPOPTOPnnrl_nomg;
a1021d57 2815 SETn(Perl_atan2(left, right));
a0d0e21e
LW
2816 RETURN;
2817 }
79072805
LW
2818}
2819
b1c05ba5
DM
2820
2821/* also used for: pp_cos() pp_exp() pp_log() pp_sqrt() */
2822
79072805
LW
2823PP(pp_sin)
2824{
20b7effb 2825 dSP; dTARGET;
af71714e 2826 int amg_type = fallback_amg;
71302fe3 2827 const char *neg_report = NULL;
71302fe3
NC
2828 const int op_type = PL_op->op_type;
2829
2830 switch (op_type) {
af71714e
JH
2831 case OP_SIN: amg_type = sin_amg; break;
2832 case OP_COS: amg_type = cos_amg; break;
2833 case OP_EXP: amg_type = exp_amg; break;
2834 case OP_LOG: amg_type = log_amg; neg_report = "log"; break;
2835 case OP_SQRT: amg_type = sqrt_amg; neg_report = "sqrt"; break;
a0d0e21e 2836 }
79072805 2837
af71714e 2838 assert(amg_type != fallback_amg);
6f1401dc
DM
2839
2840 tryAMAGICun_MG(amg_type, 0);
a0d0e21e 2841 {
8c78ed36 2842 SV * const arg = TOPs;
6f1401dc 2843 const NV value = SvNV_nomg(arg);
a5dc2484 2844#ifdef NV_NAN
f256868e 2845 NV result = NV_NAN;
a5dc2484
JH
2846#else
2847 NV result = 0.0;
2848#endif
af71714e 2849 if (neg_report) { /* log or sqrt */
a3463d96
DD
2850 if (
2851#if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
2852 ! Perl_isnan(value) &&
2853#endif
2854 (op_type == OP_LOG ? (value <= 0.0) : (value < 0.0))) {
71302fe3 2855 SET_NUMERIC_STANDARD();
dcbac5bb 2856 /* diag_listed_as: Can't take log of %g */
147e3846 2857 DIE(aTHX_ "Can't take %s of %" NVgf, neg_report, value);
71302fe3
NC
2858 }
2859 }
af71714e 2860 switch (op_type) {
f256868e 2861 default:
af71714e
JH
2862 case OP_SIN: result = Perl_sin(value); break;
2863 case OP_COS: result = Perl_cos(value); break;
2864 case OP_EXP: result = Perl_exp(value); break;
2865 case OP_LOG: result = Perl_log(value); break;
2866 case OP_SQRT: result = Perl_sqrt(value); break;
2867 }
8c78ed36
FC
2868 SETn(result);
2869 return NORMAL;
a0d0e21e 2870 }
79072805
LW
2871}
2872
56cb0a1c
AD
2873/* Support Configure command-line overrides for rand() functions.
2874 After 5.005, perhaps we should replace this by Configure support
2875 for drand48(), random(), or rand(). For 5.005, though, maintain
2876 compatibility by calling rand() but allow the user to override it.
2877 See INSTALL for details. --Andy Dougherty 15 July 1998
2878*/
85ab1d1d
JH
2879/* Now it's after 5.005, and Configure supports drand48() and random(),
2880 in addition to rand(). So the overrides should not be needed any more.
2881 --Jarkko Hietaniemi 27 September 1998
2882 */
2883
79072805
LW
2884PP(pp_rand)
2885{
80252599 2886 if (!PL_srand_called) {
85ab1d1d 2887 (void)seedDrand01((Rand_seed_t)seed());
80252599 2888 PL_srand_called = TRUE;
93dc8474 2889 }
fdf4dddd
DD
2890 {
2891 dSP;
2892 NV value;
fdf4dddd
DD
2893
2894 if (MAXARG < 1)
7e9044f9
FC
2895 {
2896 EXTEND(SP, 1);
fdf4dddd 2897 value = 1.0;
7e9044f9 2898 }
fdf4dddd
DD
2899 else {
2900 SV * const sv = POPs;
2901 if(!sv)
2902 value = 1.0;
2903 else
2904 value = SvNV(sv);
2905 }
2906 /* 1 of 2 things can be carried through SvNV, SP or TARG, SP was carried */
a3463d96
DD
2907#if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
2908 if (! Perl_isnan(value) && value == 0.0)
2909#else
659c4b96 2910 if (value == 0.0)
a3463d96 2911#endif
fdf4dddd
DD
2912 value = 1.0;
2913 {
2914 dTARGET;
2915 PUSHs(TARG);
2916 PUTBACK;
2917 value *= Drand01();
2918 sv_setnv_mg(TARG, value);
2919 }
2920 }
2921 return NORMAL;
79072805
LW
2922}
2923
2924PP(pp_srand)
2925{
20b7effb 2926 dSP; dTARGET;
f914a682
JL
2927 UV anum;
2928
0a5f3363 2929 if (MAXARG >= 1 && (TOPs || POPs)) {
f914a682
JL
2930 SV *top;
2931 char *pv;
2932 STRLEN len;
2933 int flags;
2934
2935 top = POPs;
2936 pv = SvPV(top, len);
2937 flags = grok_number(pv, len, &anum);
2938
2939 if (!(flags & IS_NUMBER_IN_UV)) {
2940 Perl_ck_warner_d(aTHX_ packWARN(WARN_OVERFLOW),
2941 "Integer overflow in srand");
2942 anum = UV_MAX;
2943 }
2944 }
2945 else {
2946 anum = seed();
2947 }
2948
85ab1d1d 2949 (void)seedDrand01((Rand_seed_t)anum);
80252599 2950 PL_srand_called = TRUE;
da1010ec
NC
2951 if (anum)
2952 XPUSHu(anum);
2953 else {
2954 /* Historically srand always returned true. We can avoid breaking
2955 that like this: */
2956 sv_setpvs(TARG, "0 but true");
2957 XPUSHTARG;
2958 }
83832992 2959 RETURN;
79072805
LW
2960}
2961
79072805
LW
2962PP(pp_int)
2963{
20b7effb 2964 dSP; dTARGET;
6f1401dc 2965 tryAMAGICun_MG(int_amg, AMGf_numeric);
774d564b 2966 {
6f1401dc
DM
2967 SV * const sv = TOPs;
2968 const IV iv = SvIV_nomg(sv);
28e5dec8
JH
2969 /* XXX it's arguable that compiler casting to IV might be subtly
2970 different from modf (for numbers inside (IV_MIN,UV_MAX)) in which
2971 else preferring IV has introduced a subtle behaviour change bug. OTOH
2972 relying on floating point to be accurate is a bug. */
2973
c781a409 2974 if (!SvOK(sv)) {
922c4365 2975 SETu(0);
c781a409
RD
2976 }
2977 else if (SvIOK(sv)) {
2978 if (SvIsUV(sv))
6f1401dc 2979 SETu(SvUV_nomg(sv));
c781a409 2980 else
28e5dec8 2981 SETi(iv);
c781a409 2982 }
c781a409 2983 else {
6f1401dc 2984 const NV value = SvNV_nomg(sv);
b9d05018
FC
2985 if (UNLIKELY(Perl_isinfnan(value)))
2986 SETn(value);
5bf8b78e 2987 else if (value >= 0.0) {
28e5dec8
JH
2988 if (value < (NV)UV_MAX + 0.5) {
2989 SETu(U_V(value));
2990 } else {
059a1014 2991 SETn(Perl_floor(value));
28e5dec8 2992 }
1048ea30 2993 }
28e5dec8
JH
2994 else {
2995 if (value > (NV)IV_MIN - 0.5) {
2996 SETi(I_V(value));
2997 } else {
1bbae031 2998 SETn(Perl_ceil(value));
28e5dec8
JH
2999 }
3000 }
774d564b 3001 }
79072805 3002 }
699e9491 3003 return NORMAL;
79072805
LW
3004}
3005
463ee0b2
LW
3006PP(pp_abs)
3007{
20b7effb 3008 dSP; dTARGET;
6f1401dc 3009 tryAMAGICun_MG(abs_amg, AMGf_numeric);
a0d0e21e 3010 {
6f1401dc 3011 SV * const sv = TOPs;
28e5dec8 3012 /* This will cache the NV value if string isn't actually integer */
6f1401dc 3013 const IV iv = SvIV_nomg(sv);
a227d84d 3014
800401ee 3015 if (!SvOK(sv)) {
922c4365 3016 SETu(0);
800401ee
JH
3017 }
3018 else if (SvIOK(sv)) {
28e5dec8 3019 /* IVX is precise */
800401ee 3020 if (SvIsUV(sv)) {
6f1401dc 3021 SETu(SvUV_nomg(sv)); /* force it to be numeric only */
28e5dec8
JH
3022 } else {
3023 if (iv >= 0) {
3024 SETi(iv);
3025 } else {
3026 if (iv != IV_MIN) {
3027 SETi(-iv);
3028 } else {
3029 /* 2s complement assumption. Also, not really needed as
3030 IV_MIN and -IV_MIN should both be %100...00 and NV-able */
b396d0d8 3031 SETu((UV)IV_MIN);
28e5dec8 3032 }
a227d84d 3033 }
28e5dec8
JH
3034 }
3035 } else{
6f1401dc 3036 const NV value = SvNV_nomg(sv);
774d564b 3037 if (value < 0.0)
1b6737cc 3038 SETn(-value);
a4474c9e
DD
3039 else
3040 SETn(value);
774d564b 3041 }
a0d0e21e 3042 }
067b7929 3043 return NORMAL;
463ee0b2
LW
3044}
3045
b1c05ba5
DM
3046
3047/* also used for: pp_hex() */
3048
79072805
LW
3049PP(pp_oct)
3050{
20b7effb 3051 dSP; dTARGET;
5c144d81 3052 const char *tmps;
53305cf1 3053 I32 flags = PERL_SCAN_ALLOW_UNDERSCORES;
6f894ead 3054 STRLEN len;
53305cf1
NC
3055 NV result_nv;
3056 UV result_uv;
4e51bcca 3057 SV* const sv = TOPs;
79072805 3058
349d4f2f 3059 tmps = (SvPV_const(sv, len));
2bc69dc4
NIS
3060 if (DO_UTF8(sv)) {
3061 /* If Unicode, try to downgrade
3062 * If not possible, croak. */
1b6737cc 3063 SV* const tsv = sv_2mortal(newSVsv(sv));
2bc69dc4
NIS
3064
3065 SvUTF8_on(tsv);
3066 sv_utf8_downgrade(tsv, FALSE);
349d4f2f 3067 tmps = SvPV_const(tsv, len);
2bc69dc4 3068 }
daa2adfd
NC
3069 if (PL_op->op_type == OP_HEX)
3070 goto hex;
3071
6f894ead 3072 while (*tmps && len && isSPACE(*tmps))
53305cf1 3073 tmps++, len--;
9e24b6e2 3074 if (*tmps == '0')
53305cf1 3075 tmps++, len--;
305b8651 3076 if (isALPHA_FOLD_EQ(*tmps, 'x')) {
daa2adfd 3077 hex:
53305cf1 3078 result_uv = grok_hex (tmps, &len, &flags, &result_nv);
daa2adfd 3079 }
305b8651 3080 else if (isALPHA_FOLD_EQ(*tmps, 'b'))
53305cf1 3081 result_uv = grok_bin (tmps, &len, &flags, &result_nv);
464e2e8a 3082 else
53305cf1
NC
3083 result_uv = grok_oct (tmps, &len, &flags, &result_nv);
3084
3085 if (flags & PERL_SCAN_GREATER_THAN_UV_MAX) {
4e51bcca 3086 SETn(result_nv);
53305cf1
NC
3087 }
3088 else {
4e51bcca 3089 SETu(result_uv);
53305cf1 3090 }
4e51bcca 3091 return NORMAL;
79072805
LW
3092}
3093
3094/* String stuff. */
3095
5febd2ff 3096
79072805
LW
3097PP(pp_length)
3098{
20b7effb 3099 dSP; dTARGET;
0bd48802 3100 SV * const sv = TOPs;
a0ed51b3 3101
7776003e 3102 U32 in_bytes = IN_BYTES;
5febd2ff
DM
3103 /* Simplest case shortcut:
3104 * set svflags to just the SVf_POK|SVs_GMG|SVf_UTF8 from the SV,
3105 * with the SVf_UTF8 flag inverted if under 'use bytes' (HINT_BYTES
3106 * set)
3107 */
7776003e 3108 U32 svflags = (SvFLAGS(sv) ^ (in_bytes << 26)) & (SVf_POK|SVs_GMG|SVf_UTF8);
5febd2ff
DM
3109
3110 STATIC_ASSERT_STMT(SVf_UTF8 == (HINT_BYTES << 26));
7776003e
DD
3111 SETs(TARG);
3112
5febd2ff 3113 if (LIKELY(svflags == SVf_POK))
7776003e 3114 goto simple_pv;
5febd2ff
DM
3115
3116 if (svflags & SVs_GMG)
7776003e 3117 mg_get(sv);
5febd2ff 3118
0f43fd57 3119 if (SvOK(sv)) {
5b750817 3120 STRLEN len;
f446eca7
DM
3121 if (!IN_BYTES) { /* reread to avoid using an C auto/register */
3122 if ((SvFLAGS(sv) & (SVf_POK|SVf_UTF8)) == SVf_POK)
3123 goto simple_pv;
7b394f12
DM
3124 if ( SvPOK(sv) && (PL_op->op_private & OPpTRUEBOOL)) {
3125 /* no need to convert from bytes to chars */
3126 len = SvCUR(sv);
3127 goto return_bool;
3128 }
5b750817 3129 len = sv_len_utf8_nomg(sv);
f446eca7 3130 }
5febd2ff 3131 else {
7776003e 3132 /* unrolled SvPV_nomg_const(sv,len) */
5febd2ff
DM
3133 if (SvPOK_nog(sv)) {
3134 simple_pv:
7776003e 3135 len = SvCUR(sv);
7b394f12
DM
3136 if (PL_op->op_private & OPpTRUEBOOL) {
3137 return_bool:
3138 SETs(len ? &PL_sv_yes : &PL_sv_zero);
3139 return NORMAL;
3140 }
5febd2ff
DM
3141 }
3142 else {
7776003e
DD
3143 (void)sv_2pv_flags(sv, &len, 0|SV_CONST_RETURN);
3144 }
0f43fd57 3145 }
5b750817 3146 TARGi((IV)(len), 1);
5febd2ff
DM
3147 }
3148 else {
9407f9c1 3149 if (!SvPADTMP(TARG)) {
5febd2ff 3150 /* OPpTARGET_MY: targ is var in '$lex = length()' */
e03e82a0 3151 sv_set_undef(TARG);
5b750817 3152 SvSETMAGIC(TARG);
5febd2ff
DM
3153 }
3154 else
3155 /* TARG is on stack at this point and is overwriten by SETs.
3156 * This branch is the odd one out, so put TARG by default on
3157 * stack earlier to let local SP go out of liveness sooner */
7776003e 3158 SETs(&PL_sv_undef);
92331800 3159 }
7776003e 3160 return NORMAL; /* no putback, SP didn't move in this opcode */
79072805
LW
3161}
3162
5febd2ff 3163
83f78d1a
FC
3164/* Returns false if substring is completely outside original string.
3165 No length is indicated by len_iv = 0 and len_is_uv = 0. len_is_uv must
3166 always be true for an explicit 0.
3167*/
3168bool
ddeaf645
DD
3169Perl_translate_substr_offsets( STRLEN curlen, IV pos1_iv,
3170 bool pos1_is_uv, IV len_iv,
3171 bool len_is_uv, STRLEN *posp,
3172 STRLEN *lenp)
83f78d1a
FC
3173{
3174 IV pos2_iv;
3175 int pos2_is_uv;
3176
3177 PERL_ARGS_ASSERT_TRANSLATE_SUBSTR_OFFSETS;
3178
3179 if (!pos1_is_uv && pos1_iv < 0 && curlen) {
3180 pos1_is_uv = curlen-1 > ~(UV)pos1_iv;
3181 pos1_iv += curlen;
3182 }
3183 if ((pos1_is_uv || pos1_iv > 0) && (UV)pos1_iv > curlen)
3184 return FALSE;
3185
3186 if (len_iv || len_is_uv) {
3187 if (!len_is_uv && len_iv < 0) {
3188 pos2_iv = curlen + len_iv;
3189 if (curlen)
3190 pos2_is_uv = curlen-1 > ~(UV)len_iv;
3191 else
3192 pos2_is_uv = 0;
3193 } else { /* len_iv >= 0 */
3194 if (!pos1_is_uv && pos1_iv < 0) {
3195 pos2_iv = pos1_iv + len_iv;
3196 pos2_is_uv = (UV)len_iv > (UV)IV_MAX;
3197 } else {
3198 if ((UV)len_iv > curlen-(UV)pos1_iv)
3199 pos2_iv = curlen;
3200 else
3201 pos2_iv = pos1_iv+len_iv;
3202 pos2_is_uv = 1;
3203 }
3204 }
3205 }
3206 else {
3207 pos2_iv = curlen;
3208 pos2_is_uv = 1;
3209 }
3210
3211 if (!pos2_is_uv && pos2_iv < 0) {
3212 if (!pos1_is_uv && pos1_iv < 0)
3213 return FALSE;
3214 pos2_iv = 0;
3215 }
3216 else if (!pos1_is_uv && pos1_iv < 0)
3217 pos1_iv = 0;
3218
3219 if ((UV)pos2_iv < (UV)pos1_iv)
3220 pos2_iv = pos1_iv;
3221 if ((UV)pos2_iv > curlen)
3222 pos2_iv = curlen;
3223
3224 /* pos1_iv and pos2_iv both in 0..curlen, so the cast is safe */
3225 *posp = (STRLEN)( (UV)pos1_iv );
3226 *lenp = (STRLEN)( (UV)pos2_iv - (UV)pos1_iv );
3227
3228 return TRUE;
3229}
3230
79072805
LW
3231PP(pp_substr)
3232{
20b7effb 3233 dSP; dTARGET;
79072805 3234 SV *sv;
463ee0b2 3235 STRLEN curlen;
9402d6ed 3236 STRLEN utf8_curlen;
777f7c56
EB
3237 SV * pos_sv;
3238 IV pos1_iv;
3239 int pos1_is_uv;
777f7c56
EB
3240 SV * len_sv;
3241 IV len_iv = 0;
83f78d1a 3242 int len_is_uv = 0;
24fcb59f 3243 I32 lvalue = PL_op->op_flags & OPf_MOD || LVRET;
bbddc9e0 3244 const bool rvalue = (GIMME_V != G_VOID);
e1ec3a88 3245 const char *tmps;
9402d6ed 3246 SV *repl_sv = NULL;
cbbf8932 3247 const char *repl = NULL;
7b8d334a 3248 STRLEN repl_len;
7bc95ae1 3249 int num_args = PL_op->op_private & 7;
13e30c65 3250 bool repl_need_utf8_upgrade = FALSE;
79072805 3251
78f9721b
SM
3252 if (num_args > 2) {
3253 if (num_args > 3) {
24fcb59f 3254 if(!(repl_sv = POPs)) num_args--;
7bc95ae1
FC
3255 }
3256 if ((len_sv = POPs)) {
3257 len_iv = SvIV(len_sv);
83f78d1a 3258 len_is_uv = len_iv ? SvIOK_UV(len_sv) : 1;
7b8d334a 3259 }
7bc95ae1 3260 else num_args--;
5d82c453 3261 }
777f7c56
EB
3262 pos_sv = POPs;
3263 pos1_iv = SvIV(pos_sv);
3264 pos1_is_uv = SvIOK_UV(pos_sv);
79072805 3265 sv = POPs;
24fcb59f
FC
3266 if (PL_op->op_private & OPpSUBSTR_REPL_FIRST) {
3267 assert(!repl_sv);
3268 repl_sv = POPs;
3269 }
6582db62 3270 if (lvalue && !repl_sv) {
83f78d1a
FC
3271 SV * ret;
3272 ret = sv_2mortal(newSV_type(SVt_PVLV)); /* Not TARG RT#67838 */
3273 sv_magic(ret, NULL, PERL_MAGIC_substr, NULL, 0);
3274 LvTYPE(ret) = 'x';
3275 LvTARG(ret) = SvREFCNT_inc_simple(sv);
3276 LvTARGOFF(ret) =
3277 pos1_is_uv || pos1_iv >= 0
3278 ? (STRLEN)(UV)pos1_iv
b063b0a8 3279 : (LvFLAGS(ret) |= LVf_NEG_OFF, (STRLEN)(UV)-pos1_iv);
83f78d1a
FC
3280 LvTARGLEN(ret) =
3281 len_is_uv || len_iv > 0
3282 ? (STRLEN)(UV)len_iv
b063b0a8 3283 : (LvFLAGS(ret) |= LVf_NEG_LEN, (STRLEN)(UV)-len_iv);
83f78d1a 3284
83f78d1a
FC
3285 PUSHs(ret); /* avoid SvSETMAGIC here */
3286 RETURN;
a74fb2cd 3287 }
6582db62
FC
3288 if (repl_sv) {
3289 repl = SvPV_const(repl_sv, repl_len);
3290 SvGETMAGIC(sv);
3291 if (SvROK(sv))
3292 Perl_ck_warner(aTHX_ packWARN(WARN_SUBSTR),
3293 "Attempt to use reference as lvalue in substr"
3294 );
3295 tmps = SvPV_force_nomg(sv, curlen);
3296 if (DO_UTF8(repl_sv) && repl_len) {
3297 if (!DO_UTF8(sv)) {
41b1e858
AC
3298 /* Upgrade the dest, and recalculate tmps in case the buffer
3299 * got reallocated; curlen may also have been changed */
01680ee9 3300 sv_utf8_upgrade_nomg(sv);
41b1e858 3301 tmps = SvPV_nomg(sv, curlen);
6582db62
FC
3302 }
3303 }
3304 else if (DO_UTF8(sv))
3305 repl_need_utf8_upgrade = TRUE;
3306 }
3307 else tmps = SvPV_const(sv, curlen);
7e2040f0 3308 if (DO_UTF8(sv)) {
0d788f38 3309 utf8_curlen = sv_or_pv_len_utf8(sv, tmps, curlen);
9402d6ed
JH
3310 if (utf8_curlen == curlen)
3311 utf8_curlen = 0;
a0ed51b3 3312 else
9402d6ed 3313 curlen = utf8_curlen;
a0ed51b3 3314 }
d1c2b58a 3315 else
9402d6ed 3316 utf8_curlen = 0;
a0ed51b3 3317
83f78d1a
FC
3318 {
3319 STRLEN pos, len, byte_len, byte_pos;
777f7c56 3320
83f78d1a
FC
3321 if (!translate_substr_offsets(
3322 curlen, pos1_iv, pos1_is_uv, len_iv, len_is_uv, &pos, &len
3323 )) goto bound_fail;
777f7c56 3324
83f78d1a
FC
3325 byte_len = len;
3326 byte_pos = utf8_curlen
0d788f38 3327 ? sv_or_pv_pos_u2b(sv, tmps, pos, &byte_len) : pos;
d931b1be 3328
2154eca7 3329 tmps += byte_pos;
bbddc9e0
CS
3330
3331 if (rvalue) {
3332 SvTAINTED_off(TARG); /* decontaminate */
3333 SvUTF8_off(TARG); /* decontaminate */
3334 sv_setpvn(TARG, tmps, byte_len);
12aa1545 3335#ifdef USE_LOCALE_COLLATE
bbddc9e0 3336 sv_unmagic(TARG, PERL_MAGIC_collxfrm);
12aa1545 3337#endif
bbddc9e0
CS
3338 if (utf8_curlen)
3339 SvUTF8_on(TARG);
3340 }
2154eca7 3341
f7928d6c 3342 if (repl) {
13e30c65
JH
3343 SV* repl_sv_copy = NULL;
3344
3345 if (repl_need_utf8_upgrade) {
3346 repl_sv_copy = newSVsv(repl_sv);
3347 sv_utf8_upgrade(repl_sv_copy);
349d4f2f 3348 repl = SvPV_const(repl_sv_copy, repl_len);
13e30c65 3349 }
502d9230 3350 if (!SvOK(sv))
500f3e18 3351 SvPVCLEAR(sv);
777f7c56 3352 sv_insert_flags(sv, byte_pos, byte_len, repl, repl_len, 0);
ef8d46e8 3353 SvREFCNT_dec(repl_sv_copy);
f7928d6c 3354 }
79072805 3355 }
6a9665b0
FC
3356 if (PL_op->op_private & OPpSUBSTR_REPL_FIRST)
3357 SP++;
3358 else if (rvalue) {
bbddc9e0
CS
3359 SvSETMAGIC(TARG);
3360 PUSHs(TARG);
3361 }
79072805 3362 RETURN;
777f7c56 3363
7b52d656 3364 bound_fail:
83f78d1a 3365 if (repl)
777f7c56
EB
3366 Perl_croak(aTHX_ "substr outside of string");
3367 Perl_ck_warner(aTHX_ packWARN(WARN_SUBSTR), "substr outside of string");
3368 RETPUSHUNDEF;
79072805
LW
3369}
3370
3371PP(pp_vec)
3372{
20b7effb 3373 dSP;
eb578fdb 3374 const IV size = POPi;
d69c4304 3375 SV* offsetsv = POPs;
eb578fdb 3376 SV * const src = POPs;
1b6737cc 3377 const I32 lvalue = PL_op->op_flags & OPf_MOD || LVRET;
2154eca7 3378 SV * ret;
1b92e694
DM
3379 UV retuv;
3380 STRLEN offset = 0;
3381 char errflags = 0;
d69c4304
DM
3382
3383 /* extract a STRLEN-ranged integer value from offsetsv into offset,
1b92e694 3384 * or flag that its out of range */
d69c4304
DM
3385 {
3386 IV iv = SvIV(offsetsv);
3387
3388 /* avoid a large UV being wrapped to a negative value */
1b92e694 3389 if (SvIOK_UV(offsetsv) && SvUVX(offsetsv) > (UV)IV_MAX)
b063b0a8 3390 errflags = LVf_OUT_OF_RANGE;
1b92e694 3391 else if (iv < 0)
b063b0a8 3392 errflags = (LVf_NEG_OFF|LVf_OUT_OF_RANGE);
d69c4304 3393#if PTRSIZE < IVSIZE
1b92e694 3394 else if (iv > Size_t_MAX)
b063b0a8 3395 errflags = LVf_OUT_OF_RANGE;
d69c4304 3396#endif
1b92e694
DM
3397 else
3398 offset = (STRLEN)iv;
d69c4304
DM
3399 }
3400
1b92e694 3401 retuv = errflags ? 0 : do_vecget(src, offset, size);
a0d0e21e 3402
81e118e0 3403 if (lvalue) { /* it's an lvalue! */
2154eca7
EB
3404 ret = sv_2mortal(newSV_type(SVt_PVLV)); /* Not TARG RT#67838 */
3405 sv_magic(ret, NULL, PERL_MAGIC_vec, NULL, 0);
3406 LvTYPE(ret) = 'v';
3407 LvTARG(ret) = SvREFCNT_inc_simple(src);
3408 LvTARGOFF(ret) = offset;
3409 LvTARGLEN(ret) = size;
1b92e694 3410 LvFLAGS(ret) = errflags;
2154eca7
EB
3411 }
3412 else {
3413 dTARGET;
3414 SvTAINTED_off(TARG); /* decontaminate */
3415 ret = TARG;
79072805
LW
3416 }
3417
d69c4304 3418 sv_setuv(ret, retuv);
f9e95907
FC
3419 if (!lvalue)
3420 SvSETMAGIC(ret);
2154eca7 3421 PUSHs(ret);
79072805
LW
3422 RETURN;
3423}
3424
b1c05ba5
DM
3425
3426/* also used for: pp_rindex() */
3427
79072805
LW
3428PP(pp_index)
3429{
20b7effb 3430 dSP; dTARGET;
79072805
LW
3431 SV *big;
3432 SV *little;
c445ea15 3433 SV *temp = NULL;
ad66a58c 3434 STRLEN biglen;
2723d216 3435 STRLEN llen = 0;
b464e2b7
TC
3436 SSize_t offset = 0;
3437 SSize_t retval;
73ee8be2
NC
3438 const char *big_p;
3439 const char *little_p;
2f040f7f
NC
3440 bool big_utf8;
3441 bool little_utf8;
2723d216 3442 const bool is_index = PL_op->op_type == OP_INDEX;
d3e26383 3443 const bool threeargs = MAXARG >= 3 && (TOPs || ((void)POPs,0));
79072805 3444
e1dccc0d
Z
3445 if (threeargs)
3446 offset = POPi;
79072805
LW
3447 little = POPs;
3448 big = POPs;
73ee8be2
NC
3449 big_p = SvPV_const(big, biglen);
3450 little_p = SvPV_const(little, llen);
3451
e609e586
NC
3452 big_utf8 = DO_UTF8(big);
3453 little_utf8 = DO_UTF8(little);
3454 if (big_utf8 ^ little_utf8) {
3455 /* One needs to be upgraded. */
8df0e7a2 3456 if (little_utf8) {
2f040f7f
NC
3457 /* Well, maybe instead we might be able to downgrade the small
3458 string? */
1eced8f8 3459 char * const pv = (char*)bytes_from_utf8((U8 *)little_p, &llen,
2f040f7f
NC
3460 &little_utf8);
3461 if (little_utf8) {
3462 /* If the large string is ISO-8859-1, and it's not possible to
3463 convert the small string to ISO-8859-1, then there is no
3464 way that it could be found anywhere by index. */
3465 retval = -1;
7e8d786b 3466 goto push_result;
2f040f7f 3467 }
e609e586 3468
2f040f7f
NC
3469 /* At this point, pv is a malloc()ed string. So donate it to temp
3470 to ensure it will get free()d */
3471 little = temp = newSV(0);
73ee8be2
NC
3472 sv_usepvn(temp, pv, llen);
3473 little_p = SvPVX(little);
e609e586 3474 } else {
20e67ba1 3475 temp = newSVpvn(little_p, llen);
2f040f7f 3476
8df0e7a2 3477 sv_utf8_upgrade(temp);
20e67ba1
FC
3478 little = temp;
3479 little_p = SvPV_const(little, llen);
e609e586
NC
3480 }
3481 }
73ee8be2
NC
3482 if (SvGAMAGIC(big)) {
3483 /* Life just becomes a lot easier if I use a temporary here.
3484 Otherwise I need to avoid calls to sv_pos_u2b(), which (dangerously)
3485 will trigger magic and overloading again, as will fbm_instr()
3486 */
59cd0e26
NC
3487 big = newSVpvn_flags(big_p, biglen,
3488 SVs_TEMP | (big_utf8 ? SVf_UTF8 : 0));
73ee8be2
NC
3489 big_p = SvPVX(big);
3490 }
e4e44778 3491 if (SvGAMAGIC(little) || (is_index && !SvOK(little))) {
73ee8be2
NC
3492 /* index && SvOK() is a hack. fbm_instr() calls SvPV_const, which will
3493 warn on undef, and we've already triggered a warning with the
3494 SvPV_const some lines above. We can't remove that, as we need to
3495 call some SvPV to trigger overloading early and find out if the
3496 string is UTF-8.
8bd97c0c 3497 This is all getting too messy. The API isn't quite clean enough,
73ee8be2
NC
3498 because data access has side effects.
3499 */
59cd0e26
NC
3500 little = newSVpvn_flags(little_p, llen,
3501 SVs_TEMP | (little_utf8 ? SVf_UTF8 : 0));
73ee8be2
NC
3502 little_p = SvPVX(little);
3503 }
e609e586 3504
d3e26383 3505 if (!threeargs)
2723d216 3506 offset = is_index ? 0 : biglen;
a0ed51b3 3507 else {
ad66a58c 3508 if (big_utf8 && offset > 0)
b464e2b7 3509 offset = sv_pos_u2b_flags(big, offset, 0, SV_CONST_RETURN);
73ee8be2
NC
3510 if (!is_index)
3511 offset += llen;
a0ed51b3 3512 }
79072805
LW
3513 if (offset < 0)
3514 offset = 0;
b464e2b7 3515 else if (offset > (SSize_t)biglen)
ad66a58c 3516 offset = biglen;
73ee8be2
NC
3517 if (!(little_p = is_index
3518 ? fbm_instr((unsigned char*)big_p + offset,
3519 (unsigned char*)big_p + biglen, little, 0)
3520 : rninstr(big_p, big_p + offset,
3521 little_p, little_p + llen)))
a0ed51b3 3522 retval = -1;
ad66a58c 3523 else {
73ee8be2 3524 retval = little_p - big_p;
15c41403 3525 if (retval > 1 && big_utf8)
b464e2b7 3526 retval = sv_pos_b2u_flags(big, retval, SV_CONST_RETURN);
ad66a58c 3527 }
ef8d46e8 3528 SvREFCNT_dec(temp);
7e8d786b
DM
3529
3530 push_result:
3531 /* OPpTRUEBOOL indicates an '== -1' has been optimised away */
3532 if (PL_op->op_private & OPpTRUEBOOL) {
3533 PUSHs( ((retval != -1) ^ cBOOL(PL_op->op_private & OPpINDEX_BOOLNEG))
3534 ? &PL_sv_yes : &PL_sv_no);
3535 if (PL_op->op_private & OPpTARGET_MY)
3536 /* $lex = (index() == -1) */
3537 sv_setsv(TARG, TOPs);
3538 }
3539 else
3540 PUSHi(retval);
79072805
LW
3541 RETURN;
3542}
3543
3544PP(pp_sprintf)
3545{
20b7effb 3546 dSP; dMARK; dORIGMARK; dTARGET;
3e6bd4bf 3547 SvTAINTED_off(TARG);
79072805 3548 do_sprintf(TARG, SP-MARK, MARK+1);
bbce6d69 3549 TAINT_IF(SvTAINTED(TARG));
79072805
LW
3550 SP = ORIGMARK;
3551 PUSHTARG;
3552 RETURN;
3553}
3554
79072805
LW
3555PP(pp_ord)
3556{
20b7effb 3557 dSP; dTARGET;
1eced8f8 3558
6ba92227 3559 SV *argsv = TOPs;
ba210ebe 3560 STRLEN len;
349d4f2f 3561 const U8 *s = (U8*)SvPV_const(argsv, len);
121910a4 3562
6ba92227 3563 SETu(DO_UTF8(argsv)
aee9b917 3564 ? (len ? utf8n_to_uvchr(s, len, 0, UTF8_ALLOW_ANYUV) : 0)
f3943cf2 3565 : (UV)(*s));
68795e93 3566
6ba92227 3567 return NORMAL;
79072805
LW
3568}
3569
463ee0b2
LW
3570PP(pp_chr)
3571{
20b7effb 3572 dSP; dTARGET;
463ee0b2 3573 char *tmps;
8a064bd6 3574 UV value;
d3261b99 3575 SV *top = TOPs;
8a064bd6 3576
71739502 3577 SvGETMAGIC(top);
9911fc4e
FC
3578 if (UNLIKELY(SvAMAGIC(top)))
3579 top = sv_2num(top);
99f450cc 3580 if (UNLIKELY(isinfnansv(top)))
147e3846 3581 Perl_croak(aTHX_ "Cannot chr %" NVgf, SvNV(top));
1cd88304
JH
3582 else {
3583 if (!IN_BYTES /* under bytes, chr(-1) eq chr(0xff), etc. */
3584 && ((SvIOKp(top) && !SvIsUV(top) && SvIV_nomg(top) < 0)
3585 ||
3586 ((SvNOKp(top) || (SvOK(top) && !SvIsUV(top)))
2cc2a5a0
KW
3587 && SvNV_nomg(top) < 0.0)))
3588 {
b3fe8680
FC
3589 if (ckWARN(WARN_UTF8)) {
3590 if (SvGMAGICAL(top)) {
3591 SV *top2 = sv_newmortal();
3592 sv_setsv_nomg(top2, top);
3593 top = top2;
3594 }
1cd88304 3595 Perl_warner(aTHX_ packWARN(WARN_UTF8),
147e3846 3596 "Invalid negative number (%" SVf ") in chr", SVfARG(top));
1cd88304
JH
3597 }
3598 value = UNICODE_REPLACEMENT;
3599 } else {
3600 value = SvUV_nomg(top);
3601 }
8a064bd6 3602 }
463ee0b2 3603
862a34c6 3604 SvUPGRADE(TARG,SVt_PV);
a0ed51b3 3605
0064a8a9 3606 if (value > 255 && !IN_BYTES) {
5f560d8a 3607 SvGROW(TARG, (STRLEN)UVCHR_SKIP(value)+1);
62961d2e 3608 tmps = (char*)uvchr_to_utf8_flags((U8*)SvPVX(TARG), value, 0);
349d4f2f 3609 SvCUR_set(TARG, tmps - SvPVX_const(TARG));
a0ed51b3
LW
3610 *tmps = '\0';
3611 (void)SvPOK_only(TARG);
aa6ffa16 3612 SvUTF8_on(TARG);
d3261b99
FC
3613 SETTARG;
3614 return NORMAL;
a0ed51b3
LW
3615 }
3616
748a9306 3617 SvGROW(TARG,2);
463ee0b2
LW
3618 SvCUR_set(TARG, 1);
3619 tmps = SvPVX(TARG);
eb160463 3620 *tmps++ = (char)value;
748a9306 3621 *tmps = '\0';
a0d0e21e 3622 (void)SvPOK_only(TARG);
4c5ed6e2 3623
d3261b99
FC
3624 SETTARG;
3625 return NORMAL;
463ee0b2
LW
3626}
3627
79072805
LW
3628PP(pp_crypt)
3629{
79072805 3630#ifdef HAS_CRYPT
20b7effb 3631 dSP; dTARGET;
5f74f29c 3632 dPOPTOPssrl;
85c16d83 3633 STRLEN len;
10516c54 3634 const char *tmps = SvPV_const(left, len);
2bc69dc4 3635
85c16d83 3636 if (DO_UTF8(left)) {
2bc69dc4 3637 /* If Unicode, try to downgrade.
f2791508
JH
3638 * If not possible, croak.
3639 * Yes, we made this up. */
659fbb76 3640 SV* const tsv = newSVpvn_flags(tmps, len, SVf_UTF8|SVs_TEMP);
2bc69dc4 3641
2bc69dc4 3642 sv_utf8_downgrade(tsv, FALSE);
349d4f2f 3643 tmps = SvPV_const(tsv, len);
85c16d83 3644 }
05404ffe
JH
3645# ifdef USE_ITHREADS
3646# ifdef HAS_CRYPT_R
3647 if (!PL_reentrant_buffer->_crypt_struct_buffer) {
3648 /* This should be threadsafe because in ithreads there is only
3649 * one thread per interpreter. If this would not be true,
3650 * we would need a mutex to protect this malloc. */
3651 PL_reentrant_buffer->_crypt_struct_buffer =
3652 (struct crypt_data *)safemalloc(sizeof(struct crypt_data));
3653#if defined(__GLIBC__) || defined(__EMX__)
3654 if (PL_reentrant_buffer->_crypt_struct_buffer) {
3655 PL_reentrant_buffer->_crypt_struct_buffer->initialized = 0;
e9c9cf57
DM
3656#if (defined(__GLIBC__) && __GLIBC__ == 2) && \
3657 (defined(__GLIBC_MINOR__) && __GLIBC_MINOR__ >= 2 && __GLIBC_MINOR__ < 4)
3658 /* work around glibc-2.2.5 bug, has been fixed at some
3659 * time in glibc-2.3.X */
05404ffe 3660 PL_reentrant_buffer->_crypt_struct_buffer->current_saltbits = 0;
e9c9cf57 3661#endif
05404ffe 3662 }
05404ffe 3663#endif
6ab58e4d 3664 }
05404ffe
JH
3665# endif /* HAS_CRYPT_R */
3666# endif /* USE_ITHREADS */
5f74f29c 3667# ifdef FCRYPT
83003860 3668 sv_setpv(TARG, fcrypt(tmps, SvPV_nolen_const(right)));
5f74f29c 3669# else
83003860 3670 sv_setpv(TARG, PerlProc_crypt(tmps, SvPV_nolen_const(right)));
5f74f29c 3671# endif
fbc76eb3 3672 SvUTF8_off(TARG);
ec93b65f 3673 SETTARG;
4808266b 3674 RETURN;
79072805 3675#else
b13b2135 3676 DIE(aTHX_
79072805
LW
3677 "The crypt() function is unimplemented due to excessive paranoia.");
3678#endif
79072805
LW
3679}
3680
00f254e2
KW
3681/* Generally UTF-8 and UTF-EBCDIC are indistinguishable at this level. So
3682 * most comments below say UTF-8, when in fact they mean UTF-EBCDIC as well */
3683
b1c05ba5
DM
3684
3685/* also used for: pp_lcfirst() */
3686
79072805
LW
3687PP(pp_ucfirst)
3688{
00f254e2
KW
3689 /* Actually is both lcfirst() and ucfirst(). Only the first character
3690 * changes. This means that possibly we can change in-place, ie., just
3691 * take the source and change that one character and store it back, but not
3692 * if read-only etc, or if the length changes */
3693
39644a26 3694 dSP;
d54190f6 3695 SV *source = TOPs;
00f254e2 3696 STRLEN slen; /* slen is the byte length of the whole SV. */
d54190f6
NC
3697 STRLEN need;
3698 SV *dest;
00f254e2
KW
3699 bool inplace; /* ? Convert first char only, in-place */
3700 bool doing_utf8 = FALSE; /* ? using utf8 */
3701 bool convert_source_to_utf8 = FALSE; /* ? need to convert */
12e9c124 3702 const int op_type = PL_op->op_type;
d54190f6
NC
3703 const U8 *s;
3704 U8 *d;
3705 U8 tmpbuf[UTF8_MAXBYTES_CASE+1];
00f254e2
KW
3706 STRLEN ulen; /* ulen is the byte length of the original Unicode character
3707 * stored as UTF-8 at s. */
3708 STRLEN tculen; /* tculen is the byte length of the freshly titlecased (or
3709 * lowercased) character stored in tmpbuf. May be either
3710 * UTF-8 or not, but in either case is the number of bytes */
d54190f6 3711
841a5e18 3712 s = (const U8*)SvPV_const(source, slen);
a0ed51b3 3713
00f254e2
KW
3714 /* We may be able to get away with changing only the first character, in
3715 * place, but not if read-only, etc. Later we may discover more reasons to
3716 * not convert in-place. */
1921e031 3717 inplace = !SvREADONLY(source) && SvPADTMP(source);
00f254e2 3718
8b7358b9
KW
3719#ifdef USE_LOCALE_CTYPE
3720
3721 if (IN_LC_RUNTIME(LC_CTYPE)) {
3722 _CHECK_AND_WARN_PROBLEMATIC_LOCALE;
3723 }
3724
3725#endif
3726
00f254e2
KW
3727 /* First calculate what the changed first character should be. This affects
3728 * whether we can just swap it out, leaving the rest of the string unchanged,
3729 * or even if have to convert the dest to UTF-8 when the source isn't */
3730
3731 if (! slen) { /* If empty */
3732 need = 1; /* still need a trailing NUL */
b7576bcb 3733 ulen = 0;
62e6b705 3734 *tmpbuf = '\0';
00f254e2
KW
3735 }
3736 else if (DO_UTF8(source)) { /* Is the source utf8? */
d54190f6 3737 doing_utf8 = TRUE;
17e95c9d 3738 ulen = UTF8SKIP(s);
094a2f8c 3739 if (op_type == OP_UCFIRST) {
130c5df3 3740#ifdef USE_LOCALE_CTYPE
a1a5ec35 3741 _toTITLE_utf8_flags(s, s +slen, tmpbuf, &tculen, IN_LC_RUNTIME(LC_CTYPE));
130c5df3 3742#else
a1a5ec35 3743 _toTITLE_utf8_flags(s, s +slen, tmpbuf, &tculen, 0);
130c5df3 3744#endif
094a2f8c
KW
3745 }
3746 else {
130c5df3 3747#ifdef USE_LOCALE_CTYPE
a1a5ec35 3748 _toLOWER_utf8_flags(s, s + slen, tmpbuf, &tculen, IN_LC_RUNTIME(LC_CTYPE));
130c5df3 3749#else
a1a5ec35 3750 _toLOWER_utf8_flags(s, s + slen, tmpbuf, &tculen, 0);
130c5df3 3751#endif
094a2f8c 3752 }
00f254e2 3753
17e95c9d
KW
3754 /* we can't do in-place if the length changes. */
3755 if (ulen != tculen) inplace = FALSE;
3756 need = slen + 1 - ulen + tculen;
d54190f6 3757 }
00f254e2
KW
3758 else { /* Non-zero length, non-UTF-8, Need to consider locale and if
3759 * latin1 is treated as caseless. Note that a locale takes
3760 * precedence */
167d19f2 3761 ulen = 1; /* Original character is 1 byte */
00f254e2
KW
3762 tculen = 1; /* Most characters will require one byte, but this will
3763 * need to be overridden for the tricky ones */
3764 need = slen + 1;
3765
3766 if (op_type == OP_LCFIRST) {
d54190f6 3767
00f254e2 3768 /* lower case the first letter: no trickiness for any character */
130c5df3 3769#ifdef USE_LOCALE_CTYPE
780fcc9f 3770 if (IN_LC_RUNTIME(LC_CTYPE)) {
780fcc9f
KW
3771 *tmpbuf = toLOWER_LC(*s);
3772 }
3773 else
130c5df3 3774#endif
780fcc9f
KW
3775 {
3776 *tmpbuf = (IN_UNI_8_BIT)
3777 ? toLOWER_LATIN1(*s)
3778 : toLOWER(*s);
3779 }
00f254e2 3780 }
130c5df3 3781#ifdef USE_LOCALE_CTYPE
780fcc9f 3782 /* is ucfirst() */
d6ded950 3783 else if (IN_LC_RUNTIME(LC_CTYPE)) {
31f05a37
KW
3784 if (IN_UTF8_CTYPE_LOCALE) {
3785 goto do_uni_rules;
3786 }
3787
3788 *tmpbuf = (U8) toUPPER_LC(*s); /* This would be a bug if any
3789 locales have upper and title case
3790 different */
00f254e2 3791 }
130c5df3 3792#endif
00f254e2
KW
3793 else if (! IN_UNI_8_BIT) {
3794 *tmpbuf = toUPPER(*s); /* Returns caseless for non-ascii, or
3795 * on EBCDIC machines whatever the
3796 * native function does */
3797 }
31f05a37
KW
3798 else {
3799 /* Here, is ucfirst non-UTF-8, not in locale (unless that locale is
3800 * UTF-8, which we treat as not in locale), and cased latin1 */
3801 UV title_ord;
91191cf7 3802#ifdef USE_LOCALE_CTYPE
31f05a37 3803 do_uni_rules:
91191cf7 3804#endif
31f05a37
KW
3805
3806 title_ord = _to_upper_title_latin1(*s, tmpbuf, &tculen, 's');
167d19f2
KW
3807 if (tculen > 1) {
3808 assert(tculen == 2);
3809
3810 /* If the result is an upper Latin1-range character, it can
3811 * still be represented in one byte, which is its ordinal */
3812 if (UTF8_IS_DOWNGRADEABLE_START(*tmpbuf)) {
3813 *tmpbuf = (U8) title_ord;
3814 tculen = 1;
00f254e2
KW
3815 }
3816 else {
167d19f2
KW
3817 /* Otherwise it became more than one ASCII character (in
3818 * the case of LATIN_SMALL_LETTER_SHARP_S) or changed to
3819 * beyond Latin1, so the number of bytes changed, so can't
3820 * replace just the first character in place. */
3821 inplace = FALSE;
3822
d14578b8
KW
3823 /* If the result won't fit in a byte, the entire result
3824 * will have to be in UTF-8. Assume worst case sizing in
3825 * conversion. (all latin1 characters occupy at most two
3826 * bytes in utf8) */
167d19f2
KW
3827 if (title_ord > 255) {
3828 doing_utf8 = TRUE;
3829 convert_source_to_utf8 = TRUE;
3830 need = slen * 2 + 1;
3831
3832 /* The (converted) UTF-8 and UTF-EBCDIC lengths of all
3833 * (both) characters whose title case is above 255 is
3834 * 2. */
3835 ulen = 2;
3836 }
3837 else { /* LATIN_SMALL_LETTER_SHARP_S expands by 1 byte */
3838 need = slen + 1 + 1;
3839 }
00f254e2 3840 }
167d19f2 3841 }
00f254e2
KW
3842 } /* End of use Unicode (Latin1) semantics */
3843 } /* End of changing the case of the first character */
3844
3845 /* Here, have the first character's changed case stored in tmpbuf. Ready to
3846 * generate the result */
3847 if (inplace) {
3848
3849 /* We can convert in place. This means we change just the first
3850 * character without disturbing the rest; no need to grow */
d54190f6
NC
3851 dest = source;
3852 s = d = (U8*)SvPV_force_nomg(source, slen);
3853 } else {
3854 dTARGET;
3855
3856 dest = TARG;
3857
00f254e2
KW
3858 /* Here, we can't convert in place; we earlier calculated how much
3859 * space we will need, so grow to accommodate that */
d54190f6 3860 SvUPGRADE(dest, SVt_PV);
3b416f41 3861 d = (U8*)SvGROW(dest, need);
d54190f6
NC
3862 (void)SvPOK_only(dest);
3863
3864 SETs(dest);
d54190f6 3865 }
44bc797b 3866
d54190f6 3867 if (doing_utf8) {
00f254e2
KW
3868 if (! inplace) {
3869 if (! convert_source_to_utf8) {
3870
3871 /* Here both source and dest are in UTF-8, but have to create
3872 * the entire output. We initialize the result to be the
3873 * title/lower cased first character, and then append the rest
3874 * of the string. */
3875 sv_setpvn(dest, (char*)tmpbuf, tculen);
3876 if (slen > ulen) {
3877 sv_catpvn(dest, (char*)(s + ulen), slen - ulen);
3878 }
3879 }
3880 else {
3881 const U8 *const send = s + slen;
3882
3883 /* Here the dest needs to be in UTF-8, but the source isn't,
3884 * except we earlier UTF-8'd the first character of the source
3885 * into tmpbuf. First put that into dest, and then append the
3886 * rest of the source, converting it to UTF-8 as we go. */
3887
3888 /* Assert tculen is 2 here because the only two characters that
3889 * get to this part of the code have 2-byte UTF-8 equivalents */
3890 *d++ = *tmpbuf;
3891 *d++ = *(tmpbuf + 1);
3892 s++; /* We have just processed the 1st char */
3893
3894 for (; s < send; s++) {
3895 d = uvchr_to_utf8(d, *s);
3896 }
3897 *d = '\0';
3898 SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
3899 }
d54190f6 3900 SvUTF8_on(dest);
a0ed51b3 3901 }
00f254e2 3902 else { /* in-place UTF-8. Just overwrite the first character */
d54190f6
NC
3903 Copy(tmpbuf, d, tculen, U8);
3904 SvCUR_set(dest, need - 1);
a0ed51b3 3905 }
094a2f8c 3906
a0ed51b3 3907 }
00f254e2
KW
3908 else { /* Neither source nor dest are in or need to be UTF-8 */
3909 if (slen) {
00f254e2
KW
3910 if (inplace) { /* in-place, only need to change the 1st char */
3911 *d = *tmpbuf;
3912 }
3913 else { /* Not in-place */
3914
3915 /* Copy the case-changed character(s) from tmpbuf */
3916 Copy(tmpbuf, d, tculen, U8);
3917 d += tculen - 1; /* Code below expects d to point to final
3918 * character stored */
3919 }
3920 }
3921 else { /* empty source */
3922 /* See bug #39028: Don't taint if empty */
d54190f6
NC
3923 *d = *s;
3924 }
3925
00f254e2
KW
3926 /* In a "use bytes" we don't treat the source as UTF-8, but, still want
3927 * the destination to retain that flag */
93e088e8 3928 if (SvUTF8(source) && ! IN_BYTES)
d54190f6
NC
3929 SvUTF8_on(dest);
3930
00f254e2 3931 if (!inplace) { /* Finish the rest of the string, unchanged */
d54190f6
NC
3932 /* This will copy the trailing NUL */
3933 Copy(s + 1, d + 1, slen, U8);
3934 SvCUR_set(dest, need - 1);
bbce6d69 3935 }
bbce6d69 3936 }
130c5df3 3937#ifdef USE_LOCALE_CTYPE
d6ded950 3938 if (IN_LC_RUNTIME(LC_CTYPE)) {
445bf929
KW
3939 TAINT;
3940 SvTAINTED_on(dest);
3941 }
130c5df3 3942#endif
539689e7
FC
3943 if (dest != source && SvTAINTED(source))
3944 SvTAINT(dest);
d54190f6 3945 SvSETMAGIC(dest);
3cb4e04f 3946 return NORMAL;
79072805
LW
3947}
3948
67306194
NC
3949/* There's so much setup/teardown code common between uc and lc, I wonder if
3950 it would be worth merging the two, and just having a switch outside each
00f254e2 3951 of the three tight loops. There is less and less commonality though */
79072805
LW
3952PP(pp_uc)
3953{
39644a26 3954 dSP;
67306194 3955 SV *source = TOPs;
463ee0b2 3956 STRLEN len;
67306194
NC
3957 STRLEN min;
3958 SV *dest;
3959 const U8 *s;
3960 U8 *d;
79072805 3961
67306194
NC
3962 SvGETMAGIC(source);
3963
1921e031 3964 if ( SvPADTMP(source)
5cd5e2d6
FC
3965 && !SvREADONLY(source) && SvPOK(source)
3966 && !DO_UTF8(source)
130c5df3
KW
3967 && (
3968#ifdef USE_LOCALE_CTYPE
3969 (IN_LC_RUNTIME(LC_CTYPE))
31f05a37 3970 ? ! IN_UTF8_CTYPE_LOCALE
130c5df3
KW
3971 :
3972#endif
3973 ! IN_UNI_8_BIT))
31f05a37
KW
3974 {
3975
3976 /* We can convert in place. The reason we can't if in UNI_8_BIT is to
3977 * make the loop tight, so we overwrite the source with the dest before
3978 * looking at it, and we need to look at the original source
3979 * afterwards. There would also need to be code added to handle
3980 * switching to not in-place in midstream if we run into characters
3981 * that change the length. Since being in locale overrides UNI_8_BIT,
3982 * that latter becomes irrelevant in the above test; instead for
3983 * locale, the size can't normally change, except if the locale is a
3984 * UTF-8 one */
67306194
NC
3985 dest = source;
3986 s = d = (U8*)SvPV_force_nomg(source, len);
3987 min = len + 1;
3988 } else {
a0ed51b3 3989 dTARGET;
a0ed51b3 3990
67306194 3991 dest = TARG;
128c9517 3992
841a5e18 3993 s = (const U8*)SvPV_nomg_const(source, len);
67306194
NC
3994 min = len + 1;
3995
3996 SvUPGRADE(dest, SVt_PV);
3b416f41 3997 d = (U8*)SvGROW(dest, min);
67306194
NC
3998 (void)SvPOK_only(dest);
3999
4000 SETs(dest);
a0ed51b3 4001 }
31351b04 4002
8b7358b9
KW
4003#ifdef USE_LOCALE_CTYPE
4004
4005 if (IN_LC_RUNTIME(LC_CTYPE)) {
4006 _CHECK_AND_WARN_PROBLEMATIC_LOCALE;
4007 }
4008
4009#endif
4010
67306194
NC
4011 /* Overloaded values may have toggled the UTF-8 flag on source, so we need
4012 to check DO_UTF8 again here. */
4013
4014 if (DO_UTF8(source)) {
4015 const U8 *const send = s + len;
bfac13d4 4016 U8 tmpbuf[UTF8_MAXBYTES_CASE+1];
67306194 4017
4c8a458a
KW
4018 /* All occurrences of these are to be moved to follow any other marks.
4019 * This is context-dependent. We may not be passed enough context to
4020 * move the iota subscript beyond all of them, but we do the best we can
4021 * with what we're given. The result is always better than if we
4022 * hadn't done this. And, the problem would only arise if we are
4023 * passed a character without all its combining marks, which would be
4024 * the caller's mistake. The information this is based on comes from a
4025 * comment in Unicode SpecialCasing.txt, (and the Standard's text
4026 * itself) and so can't be checked properly to see if it ever gets
4027 * revised. But the likelihood of it changing is remote */
00f254e2 4028 bool in_iota_subscript = FALSE;
00f254e2 4029
67306194 4030 while (s < send) {
3e16b0e6
KW
4031 STRLEN u;
4032 STRLEN ulen;
4033 UV uv;
7dbf68d2 4034 if (in_iota_subscript && ! _is_utf8_mark(s)) {
3e16b0e6 4035
00f254e2 4036 /* A non-mark. Time to output the iota subscript */
a78bc3c6
KW
4037 Copy(GREEK_CAPITAL_LETTER_IOTA_UTF8, d, capital_iota_len, U8);
4038 d += capital_iota_len;
00f254e2 4039 in_iota_subscript = FALSE;
8e058693 4040 }
00f254e2 4041
8e058693
KW
4042 /* Then handle the current character. Get the changed case value
4043 * and copy it to the output buffer */
00f254e2 4044
8e058693 4045 u = UTF8SKIP(s);
130c5df3 4046#ifdef USE_LOCALE_CTYPE
a1a5ec35 4047 uv = _toUPPER_utf8_flags(s, send, tmpbuf, &ulen, IN_LC_RUNTIME(LC_CTYPE));
130c5df3 4048#else
a1a5ec35 4049 uv = _toUPPER_utf8_flags(s, send, tmpbuf, &ulen, 0);
130c5df3 4050#endif
a78bc3c6
KW
4051#define GREEK_CAPITAL_LETTER_IOTA 0x0399
4052#define COMBINING_GREEK_YPOGEGRAMMENI 0x0345
8e058693 4053 if (uv == GREEK_CAPITAL_LETTER_IOTA
4b88fb76 4054 && utf8_to_uvchr_buf(s, send, 0) == COMBINING_GREEK_YPOGEGRAMMENI)
8e058693
KW
4055 {
4056 in_iota_subscript = TRUE;
4057 }
4058 else {
4059 if (ulen > u && (SvLEN(dest) < (min += ulen - u))) {
4060 /* If the eventually required minimum size outgrows the
4061 * available space, we need to grow. */
4062 const UV o = d - (U8*)SvPVX_const(dest);
4063
4064 /* If someone uppercases one million U+03B0s we SvGROW()
4065 * one million times. Or we could try guessing how much to
4066 * allocate without allocating too much. Such is life.
4067 * See corresponding comment in lc code for another option
4068 * */
10656159 4069 d = o + (U8*) SvGROW(dest, min);
8e058693
KW
4070 }
4071 Copy(tmpbuf, d, ulen, U8);
4072 d += ulen;
4073 }
4074 s += u;
67306194 4075 }
4c8a458a 4076 if (in_iota_subscript) {
a78bc3c6
KW
4077 Copy(GREEK_CAPITAL_LETTER_IOTA_UTF8, d, capital_iota_len, U8);
4078 d += capital_iota_len;
4c8a458a 4079 }
67306194
NC
4080 SvUTF8_on(dest);
4081 *d = '\0';
094a2f8c 4082
67306194 4083 SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
4c8a458a
KW
4084 }
4085 else { /* Not UTF-8 */
67306194
NC
4086 if (len) {
4087 const U8 *const send = s + len;
00f254e2
KW
4088
4089 /* Use locale casing if in locale; regular style if not treating
4090 * latin1 as having case; otherwise the latin1 casing. Do the
4091 * whole thing in a tight loop, for speed, */
130c5df3 4092#ifdef USE_LOCALE_CTYPE
d6ded950 4093 if (IN_LC_RUNTIME(LC_CTYPE)) {
31f05a37
KW
4094 if (IN_UTF8_CTYPE_LOCALE) {
4095 goto do_uni_rules;
4096 }
67306194 4097 for (; s < send; d++, s++)
31f05a37 4098 *d = (U8) toUPPER_LC(*s);
31351b04 4099 }
130c5df3
KW
4100 else
4101#endif
4102 if (! IN_UNI_8_BIT) {
00f254e2 4103 for (; s < send; d++, s++) {
67306194 4104 *d = toUPPER(*s);
00f254e2 4105 }
31351b04 4106 }
00f254e2 4107 else {
91191cf7 4108#ifdef USE_LOCALE_CTYPE
31f05a37 4109 do_uni_rules:
91191cf7 4110#endif
00f254e2
KW
4111 for (; s < send; d++, s++) {
4112 *d = toUPPER_LATIN1_MOD(*s);
d14578b8
KW
4113 if (LIKELY(*d != LATIN_SMALL_LETTER_Y_WITH_DIAERESIS)) {
4114 continue;
4115 }
00f254e2
KW
4116
4117 /* The mainstream case is the tight loop above. To avoid
4118 * extra tests in that, all three characters that require
4119 * special handling are mapped by the MOD to the one tested
4120 * just above.
4121 * Use the source to distinguish between the three cases */
4122
79e064b9
KW
4123#if UNICODE_MAJOR_VERSION > 2 \
4124 || (UNICODE_MAJOR_VERSION == 2 && UNICODE_DOT_VERSION >= 1 \
4125 && UNICODE_DOT_DOT_VERSION >= 8)
00f254e2
KW
4126 if (*s == LATIN_SMALL_LETTER_SHARP_S) {
4127
4128 /* uc() of this requires 2 characters, but they are
4129 * ASCII. If not enough room, grow the string */
4130 if (SvLEN(dest) < ++min) {
4131 const UV o = d - (U8*)SvPVX_const(dest);
10656159 4132 d = o + (U8*) SvGROW(dest, min);
00f254e2
KW
4133 }
4134 *d++ = 'S'; *d = 'S'; /* upper case is 'SS' */
4135 continue; /* Back to the tight loop; still in ASCII */
4136 }
79e064b9 4137#endif
00f254e2
KW
4138
4139 /* The other two special handling characters have their
4140 * upper cases outside the latin1 range, hence need to be
4141 * in UTF-8, so the whole result needs to be in UTF-8. So,
4142 * here we are somewhere in the middle of processing a
4143 * non-UTF-8 string, and realize that we will have to convert
4144 * the whole thing to UTF-8. What to do? There are
4145 * several possibilities. The simplest to code is to
4146 * convert what we have so far, set a flag, and continue on
4147 * in the loop. The flag would be tested each time through
4148 * the loop, and if set, the next character would be
4149 * converted to UTF-8 and stored. But, I (khw) didn't want
4150 * to slow down the mainstream case at all for this fairly
4151 * rare case, so I didn't want to add a test that didn't
4152 * absolutely have to be there in the loop, besides the
4153 * possibility that it would get too complicated for
4154 * optimizers to deal with. Another possibility is to just
4155 * give up, convert the source to UTF-8, and restart the
4156 * function that way. Another possibility is to convert
4157 * both what has already been processed and what is yet to
4158 * come separately to UTF-8, then jump into the loop that
4159 * handles UTF-8. But the most efficient time-wise of the
4160 * ones I could think of is what follows, and turned out to
4161 * not require much extra code. */
4162
4163 /* Convert what we have so far into UTF-8, telling the
4164 * function that we know it should be converted, and to
4165 * allow extra space for what we haven't processed yet.
4166 * Assume the worst case space requirements for converting
4167 * what we haven't processed so far: that it will require
4168 * two bytes for each remaining source character, plus the
4169 * NUL at the end. This may cause the string pointer to
4170 * move, so re-find it. */
4171
4172 len = d - (U8*)SvPVX_const(dest);
4173 SvCUR_set(dest, len);
4174 len = sv_utf8_upgrade_flags_grow(dest,
4175 SV_GMAGIC|SV_FORCE_UTF8_UPGRADE,
4176 (send -s) * 2 + 1);
4177 d = (U8*)SvPVX(dest) + len;
4178
00f254e2
KW
4179 /* Now process the remainder of the source, converting to
4180 * upper and UTF-8. If a resulting byte is invariant in
4181 * UTF-8, output it as-is, otherwise convert to UTF-8 and
4182 * append it to the output. */
00f254e2 4183 for (; s < send; s++) {
0ecfbd28
KW
4184 (void) _to_upper_title_latin1(*s, d, &len, 'S');
4185 d += len;
00f254e2
KW
4186 }
4187
4188 /* Here have processed the whole source; no need to continue
4189 * with the outer loop. Each character has been converted
4190 * to upper case and converted to UTF-8 */
4191
4192 break;
4193 } /* End of processing all latin1-style chars */
4194 } /* End of processing all chars */
4195 } /* End of source is not empty */
4196
67306194 4197 if (source != dest) {
00f254e2 4198 *d = '\0'; /* Here d points to 1 after last char, add NUL */
67306194
NC
4199 SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
4200 }
00f254e2 4201 } /* End of isn't utf8 */
130c5df3 4202#ifdef USE_LOCALE_CTYPE
d6ded950 4203 if (IN_LC_RUNTIME(LC_CTYPE)) {
445bf929
KW
4204 TAINT;
4205 SvTAINTED_on(dest);
4206 }
130c5df3 4207#endif
539689e7
FC
4208 if (dest != source && SvTAINTED(source))
4209 SvTAINT(dest);
67306194 4210 SvSETMAGIC(dest);
3cb4e04f 4211 return NORMAL;
79072805
LW
4212}
4213
4214PP(pp_lc)
4215{
39644a26 4216 dSP;
ec9af7d4 4217 SV *source = TOPs;
463ee0b2 4218 STRLEN len;
ec9af7d4
NC
4219 STRLEN min;
4220 SV *dest;
4221 const U8 *s;
4222 U8 *d;
79072805 4223
ec9af7d4
NC
4224 SvGETMAGIC(source);
4225
1921e031 4226 if ( SvPADTMP(source)
5cd5e2d6
FC
4227 && !SvREADONLY(source) && SvPOK(source)
4228 && !DO_UTF8(source)) {
ec9af7d4 4229
00f254e2
KW
4230 /* We can convert in place, as lowercasing anything in the latin1 range
4231 * (or else DO_UTF8 would have been on) doesn't lengthen it */
ec9af7d4
NC
4232 dest = source;
4233 s = d = (U8*)SvPV_force_nomg(source, len);
4234 min = len + 1;
4235 } else {
a0ed51b3 4236 dTARGET;
a0ed51b3 4237
ec9af7d4
NC
4238 dest = TARG;
4239
841a5e18 4240 s = (const U8*)SvPV_nomg_const(source, len);
ec9af7d4 4241 min = len + 1;
128c9517 4242
ec9af7d4 4243 SvUPGRADE(dest, SVt_PV);
3b416f41 4244 d = (U8*)SvGROW(dest, min);
ec9af7d4
NC
4245 (void)SvPOK_only(dest);
4246
4247 SETs(dest);
4248 }
4249
8b7358b9
KW
4250#ifdef USE_LOCALE_CTYPE
4251
4252 if (IN_LC_RUNTIME(LC_CTYPE)) {
4253 _CHECK_AND_WARN_PROBLEMATIC_LOCALE;
4254 }
4255
4256#endif
4257
ec9af7d4
NC
4258 /* Overloaded values may have toggled the UTF-8 flag on source, so we need
4259 to check DO_UTF8 again here. */
4260
4261 if (DO_UTF8(source)) {
4262 const U8 *const send = s + len;
4263 U8 tmpbuf[UTF8_MAXBYTES_CASE+1];
4264
4265 while (s < send) {
06b5486a
KW
4266 const STRLEN u = UTF8SKIP(s);
4267 STRLEN ulen;
00f254e2 4268
130c5df3 4269#ifdef USE_LOCALE_CTYPE
a1a5ec35 4270 _toLOWER_utf8_flags(s, send, tmpbuf, &ulen, IN_LC_RUNTIME(LC_CTYPE));
130c5df3 4271#else
a1a5ec35 4272 _toLOWER_utf8_flags(s, send, tmpbuf, &ulen, 0);
130c5df3 4273#endif
00f254e2 4274
06b5486a 4275 /* Here is where we would do context-sensitive actions. See the
6006ebd0 4276 * commit message for 86510fb15 for why there isn't any */
00f254e2 4277
06b5486a 4278 if (ulen > u && (SvLEN(dest) < (min += ulen - u))) {
fdb34c52 4279
06b5486a
KW
4280 /* If the eventually required minimum size outgrows the
4281 * available space, we need to grow. */
4282 const UV o = d - (U8*)SvPVX_const(dest);
fdb34c52 4283
06b5486a
KW
4284 /* If someone lowercases one million U+0130s we SvGROW() one
4285 * million times. Or we could try guessing how much to
4286 * allocate without allocating too much. Such is life.
4287 * Another option would be to grow an extra byte or two more
4288 * each time we need to grow, which would cut down the million
4289 * to 500K, with little waste */
10656159 4290 d = o + (U8*) SvGROW(dest, min);
06b5486a 4291 }
86510fb1 4292
06b5486a
KW
4293 /* Copy the newly lowercased letter to the output buffer we're
4294 * building */
4295 Copy(tmpbuf, d, ulen, U8);
4296 d += ulen;
4297 s += u;
00f254e2 4298 } /* End of looping through the source string */
ec9af7d4
NC
4299 SvUTF8_on(dest);
4300 *d = '\0';
4301 SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
00f254e2 4302 } else { /* Not utf8 */
31351b04 4303 if (len) {
ec9af7d4 4304 const U8 *const send = s + len;
00f254e2
KW
4305
4306 /* Use locale casing if in locale; regular style if not treating
4307 * latin1 as having case; otherwise the latin1 casing. Do the
4308 * whole thing in a tight loop, for speed, */
130c5df3 4309#ifdef USE_LOCALE_CTYPE
d6ded950 4310 if (IN_LC_RUNTIME(LC_CTYPE)) {
ec9af7d4
NC
4311 for (; s < send; d++, s++)
4312 *d = toLOWER_LC(*s);
445bf929 4313 }
130c5df3
KW
4314 else
4315#endif
4316 if (! IN_UNI_8_BIT) {
00f254e2 4317 for (; s < send; d++, s++) {
ec9af7d4 4318 *d = toLOWER(*s);
00f254e2
KW
4319 }
4320 }
4321 else {
4322 for (; s < send; d++, s++) {
4323 *d = toLOWER_LATIN1(*s);
4324 }
31351b04 4325 }
bbce6d69 4326 }
ec9af7d4
NC
4327 if (source != dest) {
4328 *d = '\0';
4329 SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
4330 }
79072805 4331 }
130c5df3 4332#ifdef USE_LOCALE_CTYPE
d6ded950 4333 if (IN_LC_RUNTIME(LC_CTYPE)) {
445bf929
KW
4334 TAINT;
4335 SvTAINTED_on(dest);
4336 }
130c5df3 4337#endif
539689e7
FC
4338 if (dest != source && SvTAINTED(source))
4339 SvTAINT(dest);
ec9af7d4 4340 SvSETMAGIC(dest);
3cb4e04f 4341 return NORMAL;
79072805
LW
4342}
4343
a0d0e21e 4344PP(pp_quotemeta)
79072805 4345{
20b7effb 4346 dSP; dTARGET;
1b6737cc 4347 SV * const sv = TOPs;
a0d0e21e 4348 STRLEN len;
eb578fdb 4349 const char *s = SvPV_const(sv,len);
79072805 4350
7e2040f0 4351 SvUTF8_off(TARG); /* decontaminate */
a0d0e21e 4352 if (len) {
eb578fdb 4353 char *d;
862a34c6 4354 SvUPGRADE(TARG, SVt_PV);
c07a80fd 4355 SvGROW(TARG, (len * 2) + 1);
a0d0e21e 4356 d = SvPVX(TARG);
7e2040f0 4357 if (DO_UTF8(sv)) {
0dd2cdef 4358 while (len) {
29050de5 4359 STRLEN ulen = UTF8SKIP(s);
2e2b2571
KW
4360 bool to_quote = FALSE;
4361
4362 if (UTF8_IS_INVARIANT(*s)) {
4363 if (_isQUOTEMETA(*s)) {
4364 to_quote = TRUE;
4365 }
4366 }
042d9e50 4367 else if (UTF8_IS_NEXT_CHAR_DOWNGRADEABLE(s, s + len)) {
3fea7d29 4368 if (
130c5df3 4369#ifdef USE_LOCALE_CTYPE
20adcf7c
KW
4370 /* In locale, we quote all non-ASCII Latin1 chars.
4371 * Otherwise use the quoting rules */
3fea7d29
BF
4372
4373 IN_LC_RUNTIME(LC_CTYPE)
4374 ||
4375#endif
a62b247b 4376 _isQUOTEMETA(EIGHT_BIT_UTF8_TO_NATIVE(*s, *(s + 1))))
2e2b2571
KW
4377 {
4378 to_quote = TRUE;
4379 }
4380 }
685289b5 4381 else if (is_QUOTEMETA_high(s)) {
2e2b2571
KW
4382 to_quote = TRUE;
4383 }
4384
4385 if (to_quote) {
4386 *d++ = '\\';
4387 }
29050de5
KW
4388 if (ulen > len)
4389 ulen = len;
4390 len -= ulen;
4391 while (ulen--)
4392 *d++ = *s++;
0dd2cdef 4393 }
7e2040f0 4394 SvUTF8_on(TARG);
0dd2cdef 4395 }
2e2b2571
KW
4396 else if (IN_UNI_8_BIT) {
4397 while (len--) {
4398 if (_isQUOTEMETA(*s))
4399 *d++ = '\\';
4400 *d++ = *s++;
4401 }
4402 }
0dd2cdef 4403 else {
2e2b2571
KW
4404 /* For non UNI_8_BIT (and hence in locale) just quote all \W
4405 * including everything above ASCII */
0dd2cdef 4406 while (len--) {
adfec831 4407 if (!isWORDCHAR_A(*s))
0dd2cdef
LW
4408 *d++ = '\\';
4409 *d++ = *s++;
4410 }
79072805 4411 }
a0d0e21e 4412 *d = '\0';
349d4f2f 4413 SvCUR_set(TARG, d - SvPVX_const(TARG));
3aa33fe5 4414 (void)SvPOK_only_UTF8(TARG);
79072805 4415 }
a0d0e21e
LW
4416 else
4417 sv_setpvn(TARG, s, len);
ec93b65f 4418 SETTARG;
cfe40115 4419 return NORMAL;
79072805
LW
4420}
4421
838f2281
BF
4422PP(pp_fc)
4423{
838f2281
BF
4424 dTARGET;
4425 dSP;
4426 SV *source = TOPs;
4427 STRLEN len;
4428 STRLEN min;
4429 SV *dest;
4430 const U8 *s;
4431 const U8 *send;
4432 U8 *d;
bfac13d4 4433 U8 tmpbuf[UTF8_MAXBYTES_CASE + 1];
9b63e895
KW
4434#if UNICODE_MAJOR_VERSION > 3 /* no multifolds in early Unicode */ \
4435 || (UNICODE_MAJOR_VERSION == 3 && ( UNICODE_DOT_VERSION > 0) \
4436 || UNICODE_DOT_DOT_VERSION > 0)
a4b69695
KW
4437 const bool full_folding = TRUE; /* This variable is here so we can easily
4438 move to more generality later */
9b63e895
KW
4439#else
4440 const bool full_folding = FALSE;
4441#endif
838f2281 4442 const U8 flags = ( full_folding ? FOLD_FLAGS_FULL : 0 )
130c5df3
KW
4443#ifdef USE_LOCALE_CTYPE
4444 | ( IN_LC_RUNTIME(LC_CTYPE) ? FOLD_FLAGS_LOCALE : 0 )
4445#endif
4446 ;
838f2281
BF
4447
4448 /* This is a facsimile of pp_lc, but with a thousand bugs thanks to me.
4449 * You are welcome(?) -Hugmeir
4450 */
4451
4452 SvGETMAGIC(source);
4453
4454 dest = TARG;
4455
4456 if (SvOK(source)) {
4457 s = (const U8*)SvPV_nomg_const(source, len);
4458 } else {
4459 if (ckWARN(WARN_UNINITIALIZED))
4460 report_uninit(source);
4461 s = (const U8*)"";
4462 len = 0;
4463 }
4464
4465 min = len + 1;
4466
4467 SvUPGRADE(dest, SVt_PV);
4468 d = (U8*)SvGROW(dest, min);
4469 (void)SvPOK_only(dest);
4470
4471 SETs(dest);
4472
4473 send = s + len;
8b7358b9
KW
4474
4475#ifdef USE_LOCALE_CTYPE
4476
4477 if ( IN_LC_RUNTIME(LC_CTYPE) ) { /* Under locale */
4478 _CHECK_AND_WARN_PROBLEMATIC_LOCALE;
4479 }
4480
4481#endif
4482
838f2281 4483 if (DO_UTF8(source)) { /* UTF-8 flagged string. */
838f2281
BF
4484 while (s < send) {
4485 const STRLEN u = UTF8SKIP(s);
4486 STRLEN ulen;
4487
a1a5ec35 4488 _toFOLD_utf8_flags(s, send, tmpbuf, &ulen, flags);
838f2281
BF
4489
4490 if (ulen > u && (SvLEN(dest) < (min += ulen - u))) {
4491 const UV o = d - (U8*)SvPVX_const(dest);
10656159 4492 d = o + (U8*) SvGROW(dest, min);
838f2281
BF
4493 }
4494
4495 Copy(tmpbuf, d, ulen, U8);
4496 d += ulen;
4497 s += u;
4498 }
4499 SvUTF8_on(dest);
838f2281 4500 } /* Unflagged string */
0902dd32 4501 else if (len) {
130c5df3 4502#ifdef USE_LOCALE_CTYPE
d6ded950 4503 if ( IN_LC_RUNTIME(LC_CTYPE) ) { /* Under locale */
31f05a37
KW
4504 if (IN_UTF8_CTYPE_LOCALE) {
4505 goto do_uni_folding;
4506 }
838f2281 4507 for (; s < send; d++, s++)
ea36a843 4508 *d = (U8) toFOLD_LC(*s);
838f2281 4509 }
130c5df3
KW
4510 else
4511#endif
4512 if ( !IN_UNI_8_BIT ) { /* Under nothing, or bytes */
838f2281 4513 for (; s < send; d++, s++)
d22b930b 4514 *d = toFOLD(*s);
838f2281
BF
4515 }
4516 else {
91191cf7 4517#ifdef USE_LOCALE_CTYPE
31f05a37 4518 do_uni_folding:
91191cf7 4519#endif
d14578b8
KW
4520 /* For ASCII and the Latin-1 range, there's only two troublesome
4521 * folds, \x{DF} (\N{LATIN SMALL LETTER SHARP S}), which under full
22e255cb 4522 * casefolding becomes 'ss'; and \x{B5} (\N{MICRO SIGN}), which
d14578b8
KW
4523 * under any fold becomes \x{3BC} (\N{GREEK SMALL LETTER MU}) --
4524 * For the rest, the casefold is their lowercase. */
838f2281
BF
4525 for (; s < send; d++, s++) {
4526 if (*s == MICRO_SIGN) {
d14578b8
KW
4527 /* \N{MICRO SIGN}'s casefold is \N{GREEK SMALL LETTER MU},
4528 * which is outside of the latin-1 range. There's a couple
4529 * of ways to deal with this -- khw discusses them in
4530 * pp_lc/uc, so go there :) What we do here is upgrade what
4531 * we had already casefolded, then enter an inner loop that
4532 * appends the rest of the characters as UTF-8. */
838f2281
BF
4533 len = d - (U8*)SvPVX_const(dest);
4534 SvCUR_set(dest, len);
4535 len = sv_utf8_upgrade_flags_grow(dest,
4536 SV_GMAGIC|SV_FORCE_UTF8_UPGRADE,
ea4d335b
KW
4537 /* The max expansion for latin1
4538 * chars is 1 byte becomes 2 */
4539 (send -s) * 2 + 1);
838f2281
BF
4540 d = (U8*)SvPVX(dest) + len;
4541
a78bc3c6
KW
4542 Copy(GREEK_SMALL_LETTER_MU_UTF8, d, small_mu_len, U8);
4543 d += small_mu_len;
838f2281
BF
4544 s++;
4545 for (; s < send; s++) {
4546 STRLEN ulen;
4547 UV fc = _to_uni_fold_flags(*s, tmpbuf, &ulen, flags);
6f2d5cbc 4548 if UVCHR_IS_INVARIANT(fc) {
d14578b8
KW
4549 if (full_folding
4550 && *s == LATIN_SMALL_LETTER_SHARP_S)
4551 {
838f2281
BF
4552 *d++ = 's';
4553 *d++ = 's';
4554 }
4555 else
4556 *d++ = (U8)fc;
4557 }
4558 else {
4559 Copy(tmpbuf, d, ulen, U8);
4560 d += ulen;
4561 }
4562 }
4563 break;
4564 }
4565 else if (full_folding && *s == LATIN_SMALL_LETTER_SHARP_S) {
d14578b8
KW
4566 /* Under full casefolding, LATIN SMALL LETTER SHARP S
4567 * becomes "ss", which may require growing the SV. */
838f2281
BF
4568 if (SvLEN(dest) < ++min) {
4569 const UV o = d - (U8*)SvPVX_const(dest);
10656159 4570 d = o + (U8*) SvGROW(dest, min);
838f2281
BF
4571 }
4572 *(d)++ = 's';
4573 *d = 's';
4574 }
d14578b8
KW
4575 else { /* If it's not one of those two, the fold is their lower
4576 case */
838f2281
BF
4577 *d = toLOWER_LATIN1(*s);
4578 }
4579 }
4580 }
4581 }
4582 *d = '\0';
4583 SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
4584
130c5df3 4585#ifdef USE_LOCALE_CTYPE
d6ded950 4586 if (IN_LC_RUNTIME(LC_CTYPE)) {
445bf929
KW
4587 TAINT;
4588 SvTAINTED_on(dest);
4589 }
130c5df3 4590#endif
838f2281
BF
4591 if (SvTAINTED(source))
4592 SvTAINT(dest);
4593 SvSETMAGIC(dest);
4594 RETURN;
4595}
4596
a0d0e21e 4597/* Arrays. */
79072805 4598
a0d0e21e 4599PP(pp_aslice)
79072805 4600{
20b7effb 4601 dSP; dMARK; dORIGMARK;
eb578fdb
KW
4602 AV *const av = MUTABLE_AV(POPs);
4603 const I32 lval = (PL_op->op_flags & OPf_MOD || LVRET);
79072805 4604
a0d0e21e 4605 if (SvTYPE(av) == SVt_PVAV) {
4ad10a0b
VP
4606 const bool localizing = PL_op->op_private & OPpLVAL_INTRO;
4607 bool can_preserve = FALSE;
4608
4609 if (localizing) {
4610 MAGIC *mg;
4611 HV *stash;
4612
4613 can_preserve = SvCANEXISTDELETE(av);
4614 }
4615
4616 if (lval && localizing) {
eb578fdb 4617 SV **svp;
c70927a6 4618 SSize_t max = -1;
924508f0 4619 for (svp = MARK + 1; svp <= SP; svp++) {
c70927a6 4620 const SSize_t elem = SvIV(*svp);
748a9306
LW
4621 if (elem > max)
4622 max = elem;
4623 }
4624 if (max > AvMAX(av))
4625 av_extend(av, max);
4626 }
4ad10a0b 4627
a0d0e21e 4628 while (++MARK <= SP) {
eb578fdb 4629 SV **svp;
c70927a6 4630 SSize_t elem = SvIV(*MARK);
4ad10a0b 4631 bool preeminent = TRUE;
a0d0e21e 4632
4ad10a0b
VP
4633 if (localizing && can_preserve) {
4634 /* If we can determine whether the element exist,
4635 * Try to preserve the existenceness of a tied array
4636 * element by using EXISTS and DELETE if possible.
4637 * Fallback to FETCH and STORE otherwise. */
4638 preeminent = av_exists(av, elem);
4639 }
4640
a0d0e21e
LW
4641 svp = av_fetch(av, elem, lval);
4642 if (lval) {
ce0d59fd 4643 if (!svp || !*svp)
cea2e8a9 4644 DIE(aTHX_ PL_no_aelem, elem);
4ad10a0b
VP
4645 if (localizing) {
4646 if (preeminent)
4647 save_aelem(av, elem, svp);
4648 else
4649 SAVEADELETE(av, elem);
4650 }
79072805 4651 }
3280af22 4652 *MARK = svp ? *svp : &PL_sv_undef;
79072805
LW
4653 }
4654 }
82334630 4655 if (GIMME_V != G_ARRAY) {
a0d0e21e 4656 MARK = ORIGMARK;
04ab2c87 4657 *++MARK = SP > ORIGMARK ? *SP : &PL_sv_undef;
a0d0e21e
LW
4658 SP = MARK;
4659 }
79072805
LW
4660 RETURN;
4661}
4662
6dd3e0f2
RZ
4663PP(pp_kvaslice)
4664{
20b7effb 4665 dSP; dMARK;
6dd3e0f2
RZ
4666 AV *const av = MUTABLE_AV(POPs);
4667 I32 lval = (PL_op->op_flags & OPf_MOD);
adad97db 4668 SSize_t items = SP - MARK;
6dd3e0f2
RZ
4669
4670 if (PL_op->op_private & OPpMAYBE_LVSUB) {
4671 const I32 flags = is_lvalue_sub();
4672 if (flags) {
4673 if (!(flags & OPpENTERSUB_INARGS))
7aae0299 4674 /* diag_listed_as: Can't modify %s in %s */
6dd3e0f2
RZ
4675 Perl_croak(aTHX_ "Can't modify index/value array slice in list assignment");
4676 lval = flags;
4677 }
4678 }
4679
4680 MEXTEND(SP,items);
4681 while (items > 1) {
4682 *(MARK+items*2-1) = *(MARK+items);
4683 items--;
4684 }
4685 items = SP-MARK;
4686 SP += items;
4687
4688 while (++MARK <= SP) {
4689 SV **svp;
4690
4691 svp = av_fetch(av, SvIV(*MARK), lval);
4692 if (lval) {
4693 if (!svp || !*svp || *svp == &PL_sv_undef) {
4694 DIE(aTHX_ PL_no_aelem, SvIV(*MARK));
4695 }
4696 *MARK = sv_mortalcopy(*MARK);
4697 }
4698 *++MARK = svp ? *svp : &PL_sv_undef;
4699 }
82334630 4700 if (GIMME_V != G_ARRAY) {
6dd3e0f2
RZ
4701 MARK = SP - items*2;
4702 *++MARK = items > 0 ? *SP : &PL_sv_undef;
4703 SP = MARK;
4704 }
4705 RETURN;
4706}
4707
b1c05ba5 4708
878d132a
NC
4709PP(pp_aeach)
4710{
878d132a 4711 dSP;
502c6561 4712 AV *array = MUTABLE_AV(POPs);
1c23e2bd 4713 const U8 gimme = GIMME_V;
453d94a9 4714 IV *iterp = Perl_av_iter_p(aTHX_ array);
878d132a
NC
4715 const IV current = (*iterp)++;
4716
b9f2b683 4717 if (current > av_tindex(array)) {
878d132a
NC
4718 *iterp = 0;
4719 if (gimme == G_SCALAR)
4720 RETPUSHUNDEF;
4721 else
4722 RETURN;
4723 }
4724
4725 EXTEND(SP, 2);
e1dccc0d 4726 mPUSHi(current);
878d132a
NC
4727 if (gimme == G_ARRAY) {
4728 SV **const element = av_fetch(array, current, 0);
4729 PUSHs(element ? *element : &PL_sv_undef);
4730 }
4731 RETURN;
4732}
4733
b1c05ba5 4734/* also used for: pp_avalues()*/
878d132a
NC
4735PP(pp_akeys)
4736{
878d132a 4737 dSP;
502c6561 4738 AV *array = MUTABLE_AV(POPs);
1c23e2bd 4739 const U8 gimme = GIMME_V;
878d132a
NC
4740
4741 *Perl_av_iter_p(aTHX_ array) = 0;
4742
4743 if (gimme == G_SCALAR) {
4744 dTARGET;
b9f2b683 4745 PUSHi(av_tindex(array) + 1);
878d132a
NC
4746 }
4747 else if (gimme == G_ARRAY) {
738155d2
FC
4748 if (UNLIKELY(PL_op->op_private & OPpMAYBE_LVSUB)) {
4749 const I32 flags = is_lvalue_sub();
4750 if (flags && !(flags & OPpENTERSUB_INARGS))
4751 /* diag_listed_as: Can't modify %s in %s */
4752 Perl_croak(aTHX_
4753 "Can't modify keys on array in list assignment");
4754 }
4755 {
878d132a 4756 IV n = Perl_av_len(aTHX_ array);
e1dccc0d 4757 IV i;
878d132a
NC
4758
4759 EXTEND(SP, n + 1);
4760
73665bc4
FC
4761 if ( PL_op->op_type == OP_AKEYS
4762 || ( PL_op->op_type == OP_AVHVSWITCH
cd642408 4763 && (PL_op->op_private & 3) + OP_AEACH == OP_AKEYS ))
73665bc4 4764 {
e1dccc0d 4765 for (i = 0; i <= n; i++) {
878d132a
NC
4766 mPUSHi(i);
4767 }
4768 }
4769 else {
4770 for (i = 0; i <= n; i++) {
4771 SV *const *const elem = Perl_av_fetch(aTHX_ array, i, 0);
4772 PUSHs(elem ? *elem : &PL_sv_undef);
4773 }
4774 }
738155d2 4775 }
878d132a
NC
4776 }
4777 RETURN;
4778}
4779
79072805
LW
4780/* Associative arrays. */
4781
4782PP(pp_each)
4783{
39644a26 4784 dSP;
85fbaab2 4785 HV * hash = MUTABLE_HV(POPs);
c07a80fd 4786 HE *entry;
1c23e2bd 4787 const U8 gimme = GIMME_V;
8ec5e241 4788
6d822dc4 4789 entry = hv_iternext(hash);
79072805 4790
79072805
LW
4791 EXTEND(SP, 2);
4792 if (entry) {
1b6737cc 4793 SV* const sv = hv_iterkeysv(entry);
2b32fed8 4794 PUSHs(sv);
54310121 4795 if (gimme == G_ARRAY) {
59af0135 4796 SV *val;
6d822dc4 4797 val = hv_iterval(hash, entry);
59af0135 4798 PUSHs(val);
79072805 4799 }
79072805 4800 }
54310121 4801 else if (gimme == G_SCALAR)
79072805
LW
4802 RETPUSHUNDEF;
4803
4804 RETURN;
4805}
4806
7332a6c4
VP
4807STATIC OP *
4808S_do_delete_local(pTHX)
79072805 4809{
39644a26 4810 dSP;
1c23e2bd 4811 const U8 gimme = GIMME_V;
7332a6c4
VP
4812 const MAGIC *mg;
4813 HV *stash;
ca3f996a 4814 const bool sliced = !!(PL_op->op_private & OPpSLICE);
626040f7 4815 SV **unsliced_keysv = sliced ? NULL : sp--;
ca3f996a 4816 SV * const osv = POPs;
626040f7 4817 SV **mark = sliced ? PL_stack_base + POPMARK : unsliced_keysv-1;
ca3f996a
FC
4818 dORIGMARK;
4819 const bool tied = SvRMAGICAL(osv)
7332a6c4 4820 && mg_find((const SV *)osv, PERL_MAGIC_tied);
ca3f996a
FC
4821 const bool can_preserve = SvCANEXISTDELETE(osv);
4822 const U32 type = SvTYPE(osv);
626040f7 4823 SV ** const end = sliced ? SP : unsliced_keysv;
ca3f996a
FC
4824
4825 if (type == SVt_PVHV) { /* hash element */
7332a6c4 4826 HV * const hv = MUTABLE_HV(osv);
ca3f996a 4827 while (++MARK <= end) {
7332a6c4
VP
4828 SV * const keysv = *MARK;
4829 SV *sv = NULL;
4830 bool preeminent = TRUE;
4831 if (can_preserve)
4832 preeminent = hv_exists_ent(hv, keysv, 0);
4833 if (tied) {
4834 HE *he = hv_fetch_ent(hv, keysv, 1, 0);
4835 if (he)
4836 sv = HeVAL(he);
4837 else
4838 preeminent = FALSE;
4839 }
4840 else {
4841 sv = hv_delete_ent(hv, keysv, 0, 0);
9332b95f
FC
4842 if (preeminent)
4843 SvREFCNT_inc_simple_void(sv); /* De-mortalize */
7332a6c4
VP
4844 }
4845 if (preeminent) {
be6064fd 4846 if (!sv) DIE(aTHX_ PL_no_helem_sv, SVfARG(keysv));
7332a6c4
VP
4847 save_helem_flags(hv, keysv, &sv, SAVEf_KEEPOLDELEM);
4848 if (tied) {
4849 *MARK = sv_mortalcopy(sv);
4850 mg_clear(sv);
4851 } else
4852 *MARK = sv;
4853 }
4854 else {
4855 SAVEHDELETE(hv, keysv);
4856 *MARK = &PL_sv_undef;
4857 }
4858 }
ca3f996a
FC
4859 }
4860 else if (type == SVt_PVAV) { /* array element */
7332a6c4
VP
4861 if (PL_op->op_flags & OPf_SPECIAL) {
4862 AV * const av = MUTABLE_AV(osv);
ca3f996a 4863 while (++MARK <= end) {
c70927a6 4864 SSize_t idx = SvIV(*MARK);
7332a6c4
VP
4865 SV *sv = NULL;
4866 bool preeminent = TRUE;
4867 if (can_preserve)
4868 preeminent = av_exists(av, idx);
4869 if (tied) {
4870 SV **svp = av_fetch(av, idx, 1);
4871 if (svp)
4872 sv = *svp;
4873 else
4874 preeminent = FALSE;
4875 }
4876 else {
4877 sv = av_delete(av, idx, 0);
9332b95f
FC
4878 if (preeminent)
4879 SvREFCNT_inc_simple_void(sv); /* De-mortalize */
7332a6c4
VP
4880 }
4881 if (preeminent) {
4882 save_aelem_flags(av, idx, &sv, SAVEf_KEEPOLDELEM);
4883 if (tied) {
4884 *MARK = sv_mortalcopy(sv);
4885 mg_clear(sv);
4886 } else
4887 *MARK = sv;
4888 }
4889 else {
4890 SAVEADELETE(av, idx);
4891 *MARK = &PL_sv_undef;
4892 }
4893 }
4894 }
ca3f996a
FC
4895 else
4896 DIE(aTHX_ "panic: avhv_delete no longer supported");
4897 }
4898 else
7332a6c4 4899 DIE(aTHX_ "Not a HASH reference");
ca3f996a 4900 if (sliced) {
7332a6c4
VP
4901 if (gimme == G_VOID)
4902 SP = ORIGMARK;
4903 else if (gimme == G_SCALAR) {
4904 MARK = ORIGMARK;
4905 if (SP > MARK)
4906 *++MARK = *SP;
4907 else
4908 *++MARK = &PL_sv_undef;
4909 SP = MARK;
4910 }
4911 }
ca3f996a 4912 else if (gimme != G_VOID)
626040f7 4913 PUSHs(*unsliced_keysv);
7332a6c4
VP
4914
4915 RETURN;
4916}
4917
4918PP(pp_delete)
4919{
7332a6c4 4920 dSP;
1c23e2bd 4921 U8 gimme;
7332a6c4
VP
4922 I32 discard;
4923
4924 if (PL_op->op_private & OPpLVAL_INTRO)
4925 return do_delete_local();
4926
4927 gimme = GIMME_V;
4928 discard = (gimme == G_VOID) ? G_DISCARD : 0;
5f05dabc 4929
cc0776d6 4930 if (PL_op->op_private & (OPpSLICE|OPpKVSLICE)) {
5f05dabc 4931 dMARK; dORIGMARK;
85fbaab2 4932 HV * const hv = MUTABLE_HV(POPs);
1b6737cc 4933 const U32 hvtype = SvTYPE(hv);
cc0776d6
DIM
4934 int skip = 0;
4935 if (PL_op->op_private & OPpKVSLICE) {
4936 SSize_t items = SP - MARK;
4937
4938 MEXTEND(SP,items);
4939 while (items > 1) {
4940 *(MARK+items*2-1) = *(MARK+items);
4941 items--;
4942 }
4943 items = SP - MARK;
4944 SP += items;
4945 skip = 1;
4946 }
01020589 4947 if (hvtype == SVt_PVHV) { /* hash element */
cc0776d6
DIM
4948 while ((MARK += (1+skip)) <= SP) {
4949 SV * const sv = hv_delete_ent(hv, *(MARK-skip), discard, 0);
01020589
GS
4950 *MARK = sv ? sv : &PL_sv_undef;
4951 }
5f05dabc 4952 }
6d822dc4
MS
4953 else if (hvtype == SVt_PVAV) { /* array element */
4954 if (PL_op->op_flags & OPf_SPECIAL) {
cc0776d6
DIM
4955 while ((MARK += (1+skip)) <= SP) {
4956 SV * const sv = av_delete(MUTABLE_AV(hv), SvIV(*(MARK-skip)), discard);
6d822dc4
MS
4957 *MARK = sv ? sv : &PL_sv_undef;
4958 }
4959 }
01020589
GS
4960 }
4961 else
4962 DIE(aTHX_ "Not a HASH reference");
54310121 4963 if (discard)
4964 SP = ORIGMARK;
4965 else if (gimme == G_SCALAR) {
5f05dabc 4966 MARK = ORIGMARK;
9111c9c0
DM
4967 if (SP > MARK)
4968 *++MARK = *SP;
4969 else
4970 *++MARK = &PL_sv_undef;
5f05dabc 4971 SP = MARK;
4972 }
4973 }
4974 else {
4975 SV *keysv = POPs;
85fbaab2 4976 HV * const hv = MUTABLE_HV(POPs);
295d248e 4977 SV *sv = NULL;
97fcbf96
MB
4978 if (SvTYPE(hv) == SVt_PVHV)
4979 sv = hv_delete_ent(hv, keysv, discard, 0);
01020589
GS
4980 else if (SvTYPE(hv) == SVt_PVAV) {
4981 if (PL_op->op_flags & OPf_SPECIAL)
502c6561 4982 sv = av_delete(MUTABLE_AV(hv), SvIV(keysv), discard);
af288a60
HS
4983 else
4984 DIE(aTHX_ "panic: avhv_delete no longer supported");
01020589 4985 }
97fcbf96 4986 else
cea2e8a9 4987 DIE(aTHX_ "Not a HASH reference");
5f05dabc 4988 if (!sv)
3280af22 4989 sv = &PL_sv_undef;
54310121 4990 if (!discard)
4991 PUSHs(sv);
79072805 4992 }
79072805
LW
4993 RETURN;
4994}
4995
a0d0e21e 4996PP(pp_exists)
79072805 4997{
39644a26 4998 dSP;
afebc493
GS
4999 SV *tmpsv;
5000 HV *hv;
5001
c7e88ff3 5002 if (UNLIKELY( PL_op->op_private & OPpEXISTS_SUB )) {
afebc493 5003 GV *gv;
0bd48802 5004 SV * const sv = POPs;
f2c0649b 5005 CV * const cv = sv_2cv(sv, &hv, &gv, 0);
afebc493
GS
5006 if (cv)
5007 RETPUSHYES;
5008 if (gv && isGV(gv) && GvCV(gv) && !GvCVGEN(gv))
5009 RETPUSHYES;
5010 RETPUSHNO;
5011 }
5012 tmpsv = POPs;
85fbaab2 5013 hv = MUTABLE_HV(POPs);
c7e88ff3 5014 if (LIKELY( SvTYPE(hv) == SVt_PVHV )) {
ae77835f 5015 if (hv_exists_ent(hv, tmpsv, 0))
c750a3ec 5016 RETPUSHYES;
ef54e1a4
JH
5017 }
5018 else if (SvTYPE(hv) == SVt_PVAV) {
01020589 5019 if (PL_op->op_flags & OPf_SPECIAL) { /* array element */
502c6561 5020 if (av_exists(MUTABLE_AV(hv), SvIV(tmpsv)))
01020589
GS
5021 RETPUSHYES;
5022 }
ef54e1a4
JH
5023 }
5024 else {
cea2e8a9 5025 DIE(aTHX_ "Not a HASH reference");
a0d0e21e 5026 }
a0d0e21e
LW
5027 RETPUSHNO;
5028}
79072805 5029
a0d0e21e
LW
5030PP(pp_hslice)
5031{
20b7effb 5032 dSP; dMARK; dORIGMARK;
eb578fdb
KW
5033 HV * const hv = MUTABLE_HV(POPs);
5034 const I32 lval = (PL_op->op_flags & OPf_MOD || LVRET);
1b6737cc 5035 const bool localizing = PL_op->op_private & OPpLVAL_INTRO;
d30e492c 5036 bool can_preserve = FALSE;
79072805 5037
eb85dfd3
DM
5038 if (localizing) {
5039 MAGIC *mg;
5040 HV *stash;
5041
2c5f48c2 5042 if (SvCANEXISTDELETE(hv))
d30e492c 5043 can_preserve = TRUE;
eb85dfd3
DM
5044 }
5045
6d822dc4 5046 while (++MARK <= SP) {
1b6737cc 5047 SV * const keysv = *MARK;
6d822dc4
MS
5048 SV **svp;
5049 HE *he;
d30e492c
VP
5050 bool preeminent = TRUE;
5051
5052 if (localizing && can_preserve) {
5053 /* If we can determine whether the element exist,
5054 * try to preserve the existenceness of a tied hash
5055 * element by using EXISTS and DELETE if possible.
5056 * Fallback to FETCH and STORE otherwise. */
5057 preeminent = hv_exists_ent(hv, keysv, 0);
6d822dc4 5058 }
eb85dfd3 5059
6d822dc4 5060 he = hv_fetch_ent(hv, keysv, lval, 0);
fe5bfecd 5061 svp = he ? &HeVAL(he) : NULL;
eb85dfd3 5062
6d822dc4 5063 if (lval) {
746f6409 5064 if (!svp || !*svp || *svp == &PL_sv_undef) {
be2597df 5065 DIE(aTHX_ PL_no_helem_sv, SVfARG(keysv));
6d822dc4
MS
5066 }
5067 if (localizing) {
6881372e 5068 if (HvNAME_get(hv) && isGV_or_RVCV(*svp))
159b6efe 5069 save_gp(MUTABLE_GV(*svp), !(PL_op->op_flags & OPf_SPECIAL));
47cfc530
VP
5070 else if (preeminent)
5071 save_helem_flags(hv, keysv, svp,
5072 (PL_op->op_flags & OPf_SPECIAL) ? 0 : SAVEf_SETMAGIC);
5073 else
5074 SAVEHDELETE(hv, keysv);
6d822dc4
MS
5075 }
5076 }
746f6409 5077 *MARK = svp && *svp ? *svp : &PL_sv_undef;
79072805 5078 }
82334630 5079 if (GIMME_V != G_ARRAY) {
a0d0e21e 5080 MARK = ORIGMARK;
04ab2c87 5081 *++MARK = SP > ORIGMARK ? *SP : &PL_sv_undef;
a0d0e21e 5082 SP = MARK;
79072805 5083 }
a0d0e21e
LW
5084 RETURN;
5085}
5086
5cae3edb
RZ
5087PP(pp_kvhslice)
5088{
20b7effb 5089 dSP; dMARK;
5cae3edb
RZ
5090 HV * const hv = MUTABLE_HV(POPs);
5091 I32 lval = (PL_op->op_flags & OPf_MOD);
adad97db 5092 SSize_t items = SP - MARK;
5cae3edb
RZ
5093
5094 if (PL_op->op_private & OPpMAYBE_LVSUB) {
5095 const I32 flags = is_lvalue_sub();
5096 if (flags) {
5097 if (!(flags & OPpENTERSUB_INARGS))
7aae0299 5098 /* diag_listed_as: Can't modify %s in %s */
cc5f9b8a
FC
5099 Perl_croak(aTHX_ "Can't modify key/value hash slice in %s assignment",
5100 GIMME_V == G_ARRAY ? "list" : "scalar");
5cae3edb
RZ
5101 lval = flags;
5102 }
5103 }
5104
5105 MEXTEND(SP,items);
5106 while (items > 1) {
5107 *(MARK+items*2-1) = *(MARK+items);
5108 items--;
5109 }
5110 items = SP-MARK;
5111 SP += items;
5112
5113 while (++MARK <= SP) {
5114 SV * const keysv = *MARK;
5115 SV **svp;
5116 HE *he;
5117
5118 he = hv_fetch_ent(hv, keysv, lval, 0);
5119 svp = he ? &HeVAL(he) : NULL;
5120
5121 if (lval) {
5122 if (!svp || !*svp || *svp == &PL_sv_undef) {
5123 DIE(aTHX_ PL_no_helem_sv, SVfARG(keysv));
5124 }
5125 *MARK = sv_mortalcopy(*MARK);
5126 }
5127 *++MARK = svp && *svp ? *svp : &PL_sv_undef;
5128 }
82334630 5129 if (GIMME_V != G_ARRAY) {
5cae3edb
RZ
5130 MARK = SP - items*2;
5131 *++MARK = items > 0 ? *SP : &PL_sv_undef;
5132 SP = MARK;
5133 }
5134 RETURN;
5135}
5136
a0d0e21e
LW
5137/* List operators. */
5138
5139PP(pp_list)
5140{
4fa715fa 5141 I32 markidx = POPMARK;
82334630 5142 if (GIMME_V != G_ARRAY) {
57bd6600
TC
5143 /* don't initialize mark here, EXTEND() may move the stack */
5144 SV **mark;
4fa715fa 5145 dSP;
b54564c3 5146 EXTEND(SP, 1); /* in case no arguments, as in @empty */
57bd6600 5147 mark = PL_stack_base + markidx;
a0d0e21e
LW
5148 if (++MARK <= SP)
5149 *MARK = *SP; /* unwanted list, return last item */
8990e307 5150 else
3280af22 5151 *MARK = &PL_sv_undef;
a0d0e21e 5152 SP = MARK;
4fa715fa 5153 PUTBACK;
79072805 5154 }
4fa715fa 5155 return NORMAL;
79072805
LW
5156}
5157
a0d0e21e 5158PP(pp_lslice)
79072805 5159{
39644a26 5160 dSP;
1b6737cc
AL
5161 SV ** const lastrelem = PL_stack_sp;
5162 SV ** const lastlelem = PL_stack_base + POPMARK;
5163 SV ** const firstlelem = PL_stack_base + POPMARK + 1;
eb578fdb 5164 SV ** const firstrelem = lastlelem + 1;
706a6ebc 5165 const U8 mod = PL_op->op_flags & OPf_MOD;
1b6737cc 5166
eb578fdb
KW
5167 const I32 max = lastrelem - lastlelem;
5168 SV **lelem;
a0d0e21e 5169
82334630 5170 if (GIMME_V != G_ARRAY) {
9e59c36b 5171 if (lastlelem < firstlelem) {
7da51ead 5172 EXTEND(SP, 1);
9e59c36b
TC
5173 *firstlelem = &PL_sv_undef;
5174 }
5175 else {
5176 I32 ix = SvIV(*lastlelem);
5177 if (ix < 0)
5178 ix += max;
5179 if (ix < 0 || ix >= max)
5180 *firstlelem = &PL_sv_undef;
5181 else
5182 *firstlelem = firstrelem[ix];
5183 }
5184 SP = firstlelem;
5185 RETURN;
a0d0e21e
LW
5186 }
5187
5188 if (max == 0) {
5189 SP = firstlelem - 1;
5190 RETURN;
5191 }
5192
5193 for (lelem = firstlelem; lelem <= lastlelem; lelem++) {
4ea561bc 5194 I32 ix = SvIV(*lelem);
c73bf8e3 5195 if (ix < 0)
a0d0e21e 5196 ix += max;
c73bf8e3
HS
5197 if (ix < 0 || ix >= max)
5198 *lelem = &PL_sv_undef;
5199 else {
c73bf8e3 5200 if (!(*lelem = firstrelem[ix]))
3280af22 5201 *lelem = &PL_sv_undef;
60779a30 5202 else if (mod && SvPADTMP(*lelem)) {
706a6ebc 5203 *lelem = firstrelem[ix] = sv_mortalcopy(*lelem);
60779a30 5204 }
748a9306 5205 }
79072805 5206 }
cbce292e 5207 SP = lastlelem;
79072805
LW
5208 RETURN;
5209}
5210
a0d0e21e
LW
5211PP(pp_anonlist)
5212{
20b7effb 5213 dSP; dMARK;
1b6737cc 5214 const I32 items = SP - MARK;
ad64d0ec 5215 SV * const av = MUTABLE_SV(av_make(items, MARK+1));
31476221 5216 SP = MARK;
6e449a3a
MHM
5217 mXPUSHs((PL_op->op_flags & OPf_SPECIAL)
5218 ? newRV_noinc(av) : av);
a0d0e21e
LW
5219 RETURN;
5220}
5221
5222PP(pp_anonhash)
79072805 5223{
20b7effb 5224 dSP; dMARK; dORIGMARK;
67e67fd7 5225 HV* const hv = newHV();
8d455b9f 5226 SV* const retval = sv_2mortal( PL_op->op_flags & OPf_SPECIAL
67e67fd7 5227 ? newRV_noinc(MUTABLE_SV(hv))
8d455b9f 5228 : MUTABLE_SV(hv) );
a0d0e21e
LW
5229
5230 while (MARK < SP) {
3ed356df
FC
5231 SV * const key =
5232 (MARK++, SvGMAGICAL(*MARK) ? sv_mortalcopy(*MARK) : *MARK);
5233 SV *val;
a0d0e21e 5234 if (MARK < SP)
3ed356df
FC
5235 {
5236 MARK++;
5237 SvGETMAGIC(*MARK);
5238 val = newSV(0);
d187b712 5239 sv_setsv_nomg(val, *MARK);
3ed356df 5240 }
a2a5de95 5241 else
3ed356df 5242 {
a2a5de95 5243 Perl_ck_warner(aTHX_ packWARN(WARN_MISC), "Odd number of elements in anonymous hash");
3ed356df
FC
5244 val = newSV(0);
5245 }
f12c7020 5246 (void)hv_store_ent(hv,key,val,0);
79072805 5247 }
a0d0e21e 5248 SP = ORIGMARK;
8d455b9f 5249 XPUSHs(retval);
79072805
LW
5250 RETURN;
5251}
5252
a0d0e21e 5253PP(pp_splice)
79072805 5254{
20b7effb 5255 dSP; dMARK; dORIGMARK;
5cd408a2 5256 int num_args = (SP - MARK);
00576728 5257 AV *ary = MUTABLE_AV(*++MARK);
eb578fdb
KW
5258 SV **src;
5259 SV **dst;
c70927a6
FC
5260 SSize_t i;
5261 SSize_t offset;
5262 SSize_t length;
5263 SSize_t newlen;
5264 SSize_t after;
5265 SSize_t diff;
ad64d0ec 5266 const MAGIC * const mg = SvTIED_mg((const SV *)ary, PERL_MAGIC_tied);
93965878 5267
1b6737cc 5268 if (mg) {
3e0cb5de 5269 return Perl_tied_method(aTHX_ SV_CONST(SPLICE), mark - 1, MUTABLE_SV(ary), mg,
af71faff
NC
5270 GIMME_V | TIED_METHOD_ARGUMENTS_ON_STACK,
5271 sp - mark);
93965878 5272 }
79072805 5273
3275d25a
AC
5274 if (SvREADONLY(ary))
5275 Perl_croak_no_modify();
5276
a0d0e21e 5277 SP++;
79072805 5278
a0d0e21e 5279 if (++MARK < SP) {
4ea561bc 5280 offset = i = SvIV(*MARK);
a0d0e21e 5281 if (offset < 0)
93965878 5282 offset += AvFILLp(ary) + 1;
84902520 5283 if (offset < 0)
cea2e8a9 5284 DIE(aTHX_ PL_no_aelem, i);
a0d0e21e
LW
5285 if (++MARK < SP) {
5286 length = SvIVx(*MARK++);
48cdf507
GA
5287 if (length < 0) {
5288 length += AvFILLp(ary) - offset + 1;
5289 if (length < 0)
5290 length = 0;
5291 }
79072805
LW
5292 }
5293 else
a0d0e21e 5294 length = AvMAX(ary) + 1; /* close enough to infinity */
79072805 5295 }
a0d0e21e
LW
5296 else {
5297 offset = 0;
5298 length = AvMAX(ary) + 1;
5299 }
8cbc2e3b 5300 if (offset > AvFILLp(ary) + 1) {
5cd408a2
EB
5301 if (num_args > 2)
5302 Perl_ck_warner(aTHX_ packWARN(WARN_MISC), "splice() offset past end of array" );
93965878 5303 offset = AvFILLp(ary) + 1;
8cbc2e3b 5304 }
93965878 5305 after = AvFILLp(ary) + 1 - (offset + length);
a0d0e21e
LW
5306 if (after < 0) { /* not that much array */
5307 length += after; /* offset+length now in array */
5308 after = 0;
5309 if (!AvALLOC(ary))
5310 av_extend(ary, 0);
5311 }
5312
5313 /* At this point, MARK .. SP-1 is our new LIST */
5314
5315 newlen = SP - MARK;
5316 diff = newlen - length;
13d7cbc1
GS
5317 if (newlen && !AvREAL(ary) && AvREIFY(ary))
5318 av_reify(ary);
a0d0e21e 5319
50528de0
WL
5320 /* make new elements SVs now: avoid problems if they're from the array */
5321 for (dst = MARK, i = newlen; i; i--) {
1b6737cc 5322 SV * const h = *dst;
f2b990bf 5323 *dst++ = newSVsv(h);
50528de0
WL
5324 }
5325
a0d0e21e 5326 if (diff < 0) { /* shrinking the area */
95b63a38 5327 SV **tmparyval = NULL;
a0d0e21e 5328 if (newlen) {
a02a5408 5329 Newx(tmparyval, newlen, SV*); /* so remember insertion */
a0d0e21e 5330 Copy(MARK, tmparyval, newlen, SV*);
79072805 5331 }
a0d0e21e
LW
5332
5333 MARK = ORIGMARK + 1;
82334630 5334 if (GIMME_V == G_ARRAY) { /* copy return vals to stack */
31c61add 5335 const bool real = cBOOL(AvREAL(ary));
a0d0e21e 5336 MEXTEND(MARK, length);
31c61add 5337 if (real)
bbce6d69 5338 EXTEND_MORTAL(length);
31c61add
FC
5339 for (i = 0, dst = MARK; i < length; i++) {
5340 if ((*dst = AvARRAY(ary)[i+offset])) {
5341 if (real)
486ec47a 5342 sv_2mortal(*dst); /* free them eventually */
36477c24 5343 }
31c61add
FC
5344 else
5345 *dst = &PL_sv_undef;
5346 dst++;
a0d0e21e
LW
5347 }
5348 MARK += length - 1;
79072805 5349 }
a0d0e21e
LW
5350 else {
5351 *MARK = AvARRAY(ary)[offset+length-1];
5352 if (AvREAL(ary)) {
d689ffdd 5353 sv_2mortal(*MARK);
a0d0e21e
LW
5354 for (i = length - 1, dst = &AvARRAY(ary)[offset]; i > 0; i--)
5355 SvREFCNT_dec(*dst++); /* free them now */
79072805 5356 }
92b69f65
FC
5357 if (!*MARK)
5358 *MARK = &PL_sv_undef;
a0d0e21e 5359 }
93965878 5360 AvFILLp(ary) += diff;
a0d0e21e
LW
5361
5362 /* pull up or down? */
5363
5364 if (offset < after) { /* easier to pull up */
5365 if (offset) { /* esp. if nothing to pull */
5366 src = &AvARRAY(ary)[offset-1];
5367 dst = src - diff; /* diff is negative */
5368 for (i = offset; i > 0; i--) /* can't trust Copy */
5369 *dst-- = *src--;
79072805 5370 }
a0d0e21e 5371 dst = AvARRAY(ary);
9c6bc640 5372 AvARRAY(ary) = AvARRAY(ary) - diff; /* diff is negative */
a0d0e21e
LW
5373 AvMAX(ary) += diff;
5374 }
5375 else {
5376 if (after) { /* anything to pull down? */
5377 src = AvARRAY(ary) + offset + length;
5378 dst = src + diff; /* diff is negative */
5379 Move(src, dst, after, SV*);
79072805 5380 }
93965878 5381 dst = &AvARRAY(ary)[AvFILLp(ary)+1];
a0d0e21e
LW
5382 /* avoid later double free */
5383 }
5384 i = -diff;
5385 while (i)
ce0d59fd 5386 dst[--i] = NULL;
a0d0e21e
LW
5387
5388 if (newlen) {
50528de0 5389 Copy( tmparyval, AvARRAY(ary) + offset, newlen, SV* );
a0d0e21e
LW
5390 Safefree(tmparyval);
5391 }
5392 }
5393 else { /* no, expanding (or same) */
d3961450 5394 SV** tmparyval = NULL;
a0d0e21e 5395 if (length) {
a02a5408 5396 Newx(tmparyval, length, SV*); /* so remember deletion */
a0d0e21e
LW
5397 Copy(AvARRAY(ary)+offset, tmparyval, length, SV*);
5398 }
5399
5400 if (diff > 0) { /* expanding */
a0d0e21e 5401 /* push up or down? */
a0d0e21e
LW
5402 if (offset < after && diff <= AvARRAY(ary) - AvALLOC(ary)) {
5403 if (offset) {
5404 src = AvARRAY(ary);
5405 dst = src - diff;
5406 Move(src, dst, offset, SV*);
79072805 5407 }
9c6bc640 5408 AvARRAY(ary) = AvARRAY(ary) - diff;/* diff is positive */
a0d0e21e 5409 AvMAX(ary) += diff;
93965878 5410 AvFILLp(ary) += diff;
79072805
LW
5411 }
5412 else {
93965878
NIS
5413 if (AvFILLp(ary) + diff >= AvMAX(ary)) /* oh, well */
5414 av_extend(ary, AvFILLp(ary) + diff);
5415 AvFILLp(ary) += diff;
a0d0e21e
LW
5416
5417 if (after) {
93965878 5418 dst = AvARRAY(ary) + AvFILLp(ary);
a0d0e21e
LW
5419 src = dst - diff;
5420 for (i = after; i; i--) {
5421 *dst-- = *src--;
5422 }
79072805
LW
5423 }
5424 }
a0d0e21e
LW
5425 }
5426
50528de0
WL
5427 if (newlen) {
5428 Copy( MARK, AvARRAY(ary) + offset, newlen, SV* );
a0d0e21e 5429 }
50528de0 5430
a0d0e21e 5431 MARK = ORIGMARK + 1;
82334630 5432 if (GIMME_V == G_ARRAY) { /* copy return vals to stack */
a0d0e21e 5433 if (length) {
31c61add
FC
5434 const bool real = cBOOL(AvREAL(ary));
5435 if (real)
bbce6d69 5436 EXTEND_MORTAL(length);
31c61add
FC
5437 for (i = 0, dst = MARK; i < length; i++) {
5438 if ((*dst = tmparyval[i])) {
5439 if (real)
486ec47a 5440 sv_2mortal(*dst); /* free them eventually */
36477c24 5441 }
31c61add
FC
5442 else *dst = &PL_sv_undef;
5443 dst++;
79072805
LW
5444 }
5445 }
a0d0e21e
LW
5446 MARK += length - 1;
5447 }
5448 else if (length--) {
5449 *MARK = tmparyval[length];
5450 if (AvREAL(ary)) {
d689ffdd 5451 sv_2mortal(*MARK);
a0d0e21e
LW
5452 while (length-- > 0)
5453 SvREFCNT_dec(tmparyval[length]);
79072805 5454 }
92b69f65
FC
5455 if (!*MARK)
5456 *MARK = &PL_sv_undef;
79072805 5457 }
a0d0e21e 5458 else
3280af22 5459 *MARK = &PL_sv_undef;
d3961450 5460 Safefree(tmparyval);
79072805 5461 }
474af990
FR
5462
5463 if (SvMAGICAL(ary))
5464 mg_set(MUTABLE_SV(ary));
5465
a0d0e21e 5466 SP = MARK;
79072805
LW
5467 RETURN;
5468}
5469
a0d0e21e 5470PP(pp_push)
79072805 5471{
20b7effb 5472 dSP; dMARK; dORIGMARK; dTARGET;
00576728 5473 AV * const ary = MUTABLE_AV(*++MARK);
ad64d0ec 5474 const MAGIC * const mg = SvTIED_mg((const SV *)ary, PERL_MAGIC_tied);
79072805 5475
1b6737cc 5476 if (mg) {
ad64d0ec 5477 *MARK-- = SvTIED_obj(MUTABLE_SV(ary), mg);
93965878
NIS
5478 PUSHMARK(MARK);
5479 PUTBACK;
d343c3ef 5480 ENTER_with_name("call_PUSH");
3e0cb5de 5481 call_sv(SV_CONST(PUSH),G_SCALAR|G_DISCARD|G_METHOD_NAMED);
d343c3ef 5482 LEAVE_with_name("call_PUSH");
01072573 5483 /* SPAGAIN; not needed: SP is assigned to immediately below */
93965878 5484 }
a60c0954 5485 else {
a68090fe
DM
5486 /* PL_delaymagic is restored by JUMPENV_POP on dieing, so we
5487 * only need to save locally, not on the save stack */
5488 U16 old_delaymagic = PL_delaymagic;
5489
cb077ed2 5490 if (SvREADONLY(ary) && MARK < SP) Perl_croak_no_modify();
89c14e2e 5491 PL_delaymagic = DM_DELAY;
a60c0954 5492 for (++MARK; MARK <= SP; MARK++) {
3ed356df
FC
5493 SV *sv;
5494 if (*MARK) SvGETMAGIC(*MARK);
5495 sv = newSV(0);
a60c0954 5496 if (*MARK)
3ed356df 5497 sv_setsv_nomg(sv, *MARK);
0a75904b 5498 av_store(ary, AvFILLp(ary)+1, sv);
a60c0954 5499 }
354b0578 5500 if (PL_delaymagic & DM_ARRAY_ISA)
ad64d0ec 5501 mg_set(MUTABLE_SV(ary));
a68090fe 5502 PL_delaymagic = old_delaymagic;
6eeabd23
VP
5503 }
5504 SP = ORIGMARK;
5505 if (OP_GIMME(PL_op, 0) != G_VOID) {
5506 PUSHi( AvFILL(ary) + 1 );
79072805 5507 }
79072805
LW
5508 RETURN;
5509}
5510
b1c05ba5 5511/* also used for: pp_pop()*/
a0d0e21e 5512PP(pp_shift)
79072805 5513{
39644a26 5514 dSP;
538f5756 5515 AV * const av = PL_op->op_flags & OPf_SPECIAL
94f9945d 5516 ? MUTABLE_AV(GvAVn(PL_defgv)) : MUTABLE_AV(POPs);
789b4bc9 5517 SV * const sv = PL_op->op_type == OP_SHIFT ? av_shift(av) : av_pop(av);
79072805 5518 EXTEND(SP, 1);
c2b4a044 5519 assert (sv);
d689ffdd 5520 if (AvREAL(av))
a0d0e21e
LW
5521 (void)sv_2mortal(sv);
5522 PUSHs(sv);
79072805 5523 RETURN;
79072805
LW
5524}
5525
a0d0e21e 5526PP(pp_unshift)
79072805 5527{
20b7effb 5528 dSP; dMARK; dORIGMARK; dTARGET;
00576728 5529 AV *ary = MUTABLE_AV(*++MARK);
ad64d0ec 5530 const MAGIC * const mg = SvTIED_mg((const SV *)ary, PERL_MAGIC_tied);
93965878 5531
1b6737cc 5532 if (mg) {
ad64d0ec 5533 *MARK-- = SvTIED_obj(MUTABLE_SV(ary), mg);
7fd66d9d 5534 PUSHMARK(MARK);
93965878 5535 PUTBACK;
d343c3ef 5536 ENTER_with_name("call_UNSHIFT");
36925d9e 5537 call_sv(SV_CONST(UNSHIFT),G_SCALAR|G_DISCARD|G_METHOD_NAMED);
d343c3ef 5538 LEAVE_with_name("call_UNSHIFT");
01072573 5539 /* SPAGAIN; not needed: SP is assigned to immediately below */
93965878 5540 }
a60c0954 5541 else {
a68090fe
DM
5542 /* PL_delaymagic is restored by JUMPENV_POP on dieing, so we
5543 * only need to save locally, not on the save stack */
5544 U16 old_delaymagic = PL_delaymagic;
c70927a6 5545 SSize_t i = 0;
a68090fe 5546
a60c0954 5547 av_unshift(ary, SP - MARK);
39539141 5548 PL_delaymagic = DM_DELAY;
a60c0954 5549 while (MARK < SP) {
1b6737cc 5550 SV * const sv = newSVsv(*++MARK);
a60c0954
NIS
5551 (void)av_store(ary, i++, sv);
5552 }
39539141
DIM
5553 if (PL_delaymagic & DM_ARRAY_ISA)
5554 mg_set(MUTABLE_SV(ary));
a68090fe 5555 PL_delaymagic = old_delaymagic;
79072805 5556 }
a0d0e21e 5557 SP = ORIGMARK;
6eeabd23 5558 if (OP_GIMME(PL_op, 0) != G_VOID) {
5658d0a9
LR
5559 PUSHi( AvFILL(ary) + 1 );
5560 }
79072805 5561 RETURN;
79072805
LW
5562}
5563
a0d0e21e 5564PP(pp_reverse)
79072805 5565{
20b7effb 5566 dSP; dMARK;
79072805 5567
82334630 5568 if (GIMME_V == G_ARRAY) {
484c818f
VP
5569 if (PL_op->op_private & OPpREVERSE_INPLACE) {
5570 AV *av;
5571
5572 /* See pp_sort() */
5573 assert( MARK+1 == SP && *SP && SvTYPE(*SP) == SVt_PVAV);
5574 (void)POPMARK; /* remove mark associated with ex-OP_AASSIGN */
5575 av = MUTABLE_AV((*SP));
5576 /* In-place reversing only happens in void context for the array
5577 * assignment. We don't need to push anything on the stack. */
5578 SP = MARK;
5579
5580 if (SvMAGICAL(av)) {
c70927a6 5581 SSize_t i, j;
eb578fdb 5582 SV *tmp = sv_newmortal();
484c818f
VP
5583 /* For SvCANEXISTDELETE */
5584 HV *stash;
5585 const MAGIC *mg;
5586 bool can_preserve = SvCANEXISTDELETE(av);
5587
b9f2b683 5588 for (i = 0, j = av_tindex(av); i < j; ++i, --j) {
eb578fdb 5589 SV *begin, *end;
484c818f
VP
5590
5591 if (can_preserve) {
5592 if (!av_exists(av, i)) {
5593 if (av_exists(av, j)) {
eb578fdb 5594 SV *sv = av_delete(av, j, 0);
484c818f
VP
5595 begin = *av_fetch(av, i, TRUE);
5596 sv_setsv_mg(begin, sv);
5597 }
5598 continue;
5599 }
5600 else if (!av_exists(av, j)) {
eb578fdb 5601 SV *sv = av_delete(av, i, 0);
484c818f
VP
5602 end = *av_fetch(av, j, TRUE);
5603 sv_setsv_mg(end, sv);
5604 continue;
5605 }
5606 }
5607
5608 begin = *av_fetch(av, i, TRUE);
5609 end = *av_fetch(av, j, TRUE);
5610 sv_setsv(tmp, begin);
5611 sv_setsv_mg(begin, end);
5612 sv_setsv_mg(end, tmp);
5613 }
5614 }
5615 else {
5616 SV **begin = AvARRAY(av);
484c818f 5617
95a26d8e
VP
5618 if (begin) {
5619 SV **end = begin + AvFILLp(av);
5620
5621 while (begin < end) {
eb578fdb 5622 SV * const tmp = *begin;
95a26d8e
VP
5623 *begin++ = *end;
5624 *end-- = tmp;
5625 }
484c818f
VP
5626 }
5627 }
5628 }
5629 else {
5630 SV **oldsp = SP;
5631 MARK++;
5632 while (MARK < SP) {
eb578fdb 5633 SV * const tmp = *MARK;
484c818f
VP
5634 *MARK++ = *SP;
5635 *SP-- = tmp;
5636 }
5637 /* safe as long as stack cannot get extended in the above */
5638 SP = oldsp;
a0d0e21e 5639 }
79072805
LW
5640 }
5641 else {
eb578fdb 5642 char *up;
a0d0e21e
LW
5643 dTARGET;
5644 STRLEN len;
79072805 5645
7e2040f0 5646 SvUTF8_off(TARG); /* decontaminate */
47836a13 5647 if (SP - MARK > 1) {
3280af22 5648 do_join(TARG, &PL_sv_no, MARK, SP);
47836a13
Z
5649 SP = MARK + 1;
5650 SETs(TARG);
5651 } else if (SP > MARK) {
d5d91c1e 5652 sv_setsv(TARG, *SP);
47836a13
Z
5653 SETs(TARG);
5654 } else {
d5d91c1e 5655 sv_setsv(TARG, DEFSV);
47836a13 5656 XPUSHs(TARG);
1e21d011
B
5657 }
5658
a0d0e21e
LW
5659 up = SvPV_force(TARG, len);
5660 if (len > 1) {
19742f39 5661 char *down;
7e2040f0 5662 if (DO_UTF8(TARG)) { /* first reverse each character */
dfe13c55 5663 U8* s = (U8*)SvPVX(TARG);
349d4f2f 5664 const U8* send = (U8*)(s + len);
a0ed51b3 5665 while (s < send) {
d742c382 5666 if (UTF8_IS_INVARIANT(*s)) {
a0ed51b3
LW
5667 s++;
5668 continue;
5669 }
5670 else {
4b88fb76 5671 if (!utf8_to_uvchr_buf(s, send, 0))
a0dbb045 5672 break;
dfe13c55 5673 up = (char*)s;
a0ed51b3 5674 s += UTF8SKIP(s);
dfe13c55 5675 down = (char*)(s - 1);
a0dbb045 5676 /* reverse this character */
a0ed51b3 5677 while (down > up) {
19742f39 5678 const char tmp = *up;
a0ed51b3 5679 *up++ = *down;
19742f39 5680 *down-- = tmp;
a0ed51b3
LW
5681 }
5682 }
5683 }
5684 up = SvPVX(TARG);
5685 }
a0d0e21e
LW
5686 down = SvPVX(TARG) + len - 1;
5687 while (down > up) {
19742f39 5688 const char tmp = *up;
a0d0e21e 5689 *up++ = *down;
19742f39 5690 *down-- = tmp;
a0d0e21e 5691 }
3aa33fe5 5692 (void)SvPOK_only_UTF8(TARG);
79072805 5693 }
79072805 5694 }
a0d0e21e 5695 RETURN;
79072805
LW
5696}
5697
a0d0e21e 5698PP(pp_split)
79072805 5699{
20b7effb 5700 dSP; dTARG;
692044df
DM
5701 AV *ary = ( (PL_op->op_private & OPpSPLIT_ASSIGN) /* @a = split */
5702 && (PL_op->op_flags & OPf_STACKED)) /* @{expr} = split */
5012eebe 5703 ? (AV *)POPs : NULL;
eb578fdb 5704 IV limit = POPi; /* note, negative is forever */
1b6737cc 5705 SV * const sv = POPs;
a0d0e21e 5706 STRLEN len;
eb578fdb 5707 const char *s = SvPV_const(sv, len);
1b6737cc 5708 const bool do_utf8 = DO_UTF8(sv);
20ae58f7 5709 const bool in_uni_8_bit = IN_UNI_8_BIT;
727b7506 5710 const char *strend = s + len;
5012eebe 5711 PMOP *pm = cPMOPx(PL_op);
eb578fdb
KW
5712 REGEXP *rx;
5713 SV *dstr;
5714 const char *m;
c70927a6 5715 SSize_t iters = 0;
d14578b8
KW
5716 const STRLEN slen = do_utf8
5717 ? utf8_length((U8*)s, (U8*)strend)
5718 : (STRLEN)(strend - s);
c70927a6 5719 SSize_t maxiters = slen + 10;
c1a7495a 5720 I32 trailing_empty = 0;
727b7506 5721 const char *orig;
052a7c76 5722 const IV origlimit = limit;
a0d0e21e
LW
5723 I32 realarray = 0;
5724 I32 base;
1c23e2bd 5725 const U8 gimme = GIMME_V;
941446f6 5726 bool gimme_scalar;
692044df 5727 I32 oldsave = PL_savestack_ix;
437d3b4e 5728 U32 make_mortal = SVs_TEMP;
7fba1cd6 5729 bool multiline = 0;
b37c2d43 5730 MAGIC *mg = NULL;
79072805 5731
aaa362c4 5732 rx = PM_GETRE(pm);
bbce6d69 5733
a62b1201 5734 TAINT_IF(get_regex_charset(RX_EXTFLAGS(rx)) == REGEX_LOCALE_CHARSET &&
dbc200c5 5735 (RX_EXTFLAGS(rx) & (RXf_WHITE | RXf_SKIPWHITE)));
bbce6d69 5736
692044df 5737 /* handle @ary = split(...) optimisation */
5012eebe
DM
5738 if (PL_op->op_private & OPpSPLIT_ASSIGN) {
5739 if (!(PL_op->op_flags & OPf_STACKED)) {
692044df
DM
5740 if (PL_op->op_private & OPpSPLIT_LEX) {
5741 if (PL_op->op_private & OPpLVAL_INTRO)
5742 SAVECLEARSV(PAD_SVl(pm->op_pmreplrootu.op_pmtargetoff));
5012eebe 5743 ary = (AV *)PAD_SVl(pm->op_pmreplrootu.op_pmtargetoff);
692044df 5744 }
5012eebe
DM
5745 else {
5746 GV *gv =
971a9dd3 5747#ifdef USE_ITHREADS
5012eebe 5748 MUTABLE_GV(PAD_SVl(pm->op_pmreplrootu.op_pmtargetoff));
971a9dd3 5749#else
5012eebe 5750 pm->op_pmreplrootu.op_pmtargetgv;
20e98b0f 5751#endif
692044df
DM
5752 if (PL_op->op_private & OPpLVAL_INTRO)
5753 ary = save_ary(gv);
5754 else
5755 ary = GvAVn(gv);
5012eebe 5756 }
692044df
DM
5757 /* skip anything pushed by OPpLVAL_INTRO above */
5758 oldsave = PL_savestack_ix;
5012eebe
DM
5759 }
5760
a0d0e21e 5761 realarray = 1;
8ec5e241 5762 PUTBACK;
a0d0e21e 5763 av_extend(ary,0);
821956c5 5764 (void)sv_2mortal(SvREFCNT_inc_simple_NN(sv));
a0d0e21e 5765 av_clear(ary);
8ec5e241 5766 SPAGAIN;
ad64d0ec 5767 if ((mg = SvTIED_mg((const SV *)ary, PERL_MAGIC_tied))) {
8ec5e241 5768 PUSHMARK(SP);
ad64d0ec 5769 XPUSHs(SvTIED_obj(MUTABLE_SV(ary), mg));
8ec5e241
NIS
5770 }
5771 else {
1c0b011c 5772 if (!AvREAL(ary)) {
1b6737cc 5773 I32 i;
1c0b011c 5774 AvREAL_on(ary);
abff13bb 5775 AvREIFY_off(ary);
1c0b011c 5776 for (i = AvFILLp(ary); i >= 0; i--)
d14578b8 5777 AvARRAY(ary)[i] = &PL_sv_undef; /* don't free mere refs */
1c0b011c
NIS
5778 }
5779 /* temporarily switch stacks */
8b7059b1 5780 SAVESWITCHSTACK(PL_curstack, ary);
8ec5e241 5781 make_mortal = 0;
1c0b011c 5782 }
79072805 5783 }
5012eebe 5784
3280af22 5785 base = SP - PL_stack_base;
a0d0e21e 5786 orig = s;
dbc200c5 5787 if (RX_EXTFLAGS(rx) & RXf_SKIPWHITE) {
613f191e 5788 if (do_utf8) {
d720149d 5789 while (s < strend && isSPACE_utf8_safe(s, strend))
613f191e
TS
5790 s += UTF8SKIP(s);
5791 }
a62b1201 5792 else if (get_regex_charset(RX_EXTFLAGS(rx)) == REGEX_LOCALE_CHARSET) {
d720149d 5793 while (s < strend && isSPACE_LC(*s))
bbce6d69 5794 s++;
5795 }
20ae58f7
AC
5796 else if (in_uni_8_bit) {
5797 while (s < strend && isSPACE_L1(*s))
5798 s++;
5799 }
bbce6d69 5800 else {
d720149d 5801 while (s < strend && isSPACE(*s))
bbce6d69 5802 s++;
5803 }
a0d0e21e 5804 }
73134a2e 5805 if (RX_EXTFLAGS(rx) & RXf_PMf_MULTILINE) {
7fba1cd6 5806 multiline = 1;
c07a80fd 5807 }
5808
941446f6
FC
5809 gimme_scalar = gimme == G_SCALAR && !ary;
5810
a0d0e21e
LW
5811 if (!limit)
5812 limit = maxiters + 2;
dbc200c5 5813 if (RX_EXTFLAGS(rx) & RXf_WHITE) {
a0d0e21e 5814 while (--limit) {
bbce6d69 5815 m = s;
8727f688
YO
5816 /* this one uses 'm' and is a negative test */
5817 if (do_utf8) {
7a207065 5818 while (m < strend && ! isSPACE_utf8_safe(m, strend) ) {
613f191e 5819 const int t = UTF8SKIP(m);
7a207065 5820 /* isSPACE_utf8_safe returns FALSE for malform utf8 */
613f191e
TS
5821 if (strend - m < t)
5822 m = strend;
5823 else
5824 m += t;
5825 }
a62b1201 5826 }
d14578b8
KW
5827 else if (get_regex_charset(RX_EXTFLAGS(rx)) == REGEX_LOCALE_CHARSET)
5828 {
8727f688
YO
5829 while (m < strend && !isSPACE_LC(*m))
5830 ++m;
20ae58f7
AC
5831 }
5832 else if (in_uni_8_bit) {
5833 while (m < strend && !isSPACE_L1(*m))
5834 ++m;
8727f688
YO
5835 } else {
5836 while (m < strend && !isSPACE(*m))
5837 ++m;
5838 }
a0d0e21e
LW
5839 if (m >= strend)
5840 break;
bbce6d69 5841
c1a7495a
BB
5842 if (gimme_scalar) {
5843 iters++;
5844 if (m-s == 0)
5845 trailing_empty++;
5846 else
5847 trailing_empty = 0;
5848 } else {
5849 dstr = newSVpvn_flags(s, m-s,
5850 (do_utf8 ? SVf_UTF8 : 0) | make_mortal);
5851 XPUSHs(dstr);
5852 }
bbce6d69 5853
613f191e
TS
5854 /* skip the whitespace found last */
5855 if (do_utf8)
5856 s = m + UTF8SKIP(m);
5857 else
5858 s = m + 1;
5859
8727f688
YO
5860 /* this one uses 's' and is a positive test */
5861 if (do_utf8) {
7a207065 5862 while (s < strend && isSPACE_utf8_safe(s, strend) )
8727f688 5863 s += UTF8SKIP(s);
a62b1201 5864 }
d14578b8
KW
5865 else if (get_regex_charset(RX_EXTFLAGS(rx)) == REGEX_LOCALE_CHARSET)
5866 {
8727f688
YO
5867 while (s < strend && isSPACE_LC(*s))
5868 ++s;
20ae58f7
AC
5869 }
5870 else if (in_uni_8_bit) {
5871 while (s < strend && isSPACE_L1(*s))
5872 ++s;
8727f688
YO
5873 } else {
5874 while (s < strend && isSPACE(*s))
5875 ++s;
5876 }
79072805
LW
5877 }
5878 }
07bc277f 5879 else if (RX_EXTFLAGS(rx) & RXf_START_ONLY) {
a0d0e21e 5880 while (--limit) {
a6e20a40
AL
5881 for (m = s; m < strend && *m != '\n'; m++)
5882 ;
a0d0e21e
LW
5883 m++;
5884 if (m >= strend)
5885 break;
c1a7495a
BB
5886
5887 if (gimme_scalar) {
5888 iters++;
5889 if (m-s == 0)
5890 trailing_empty++;
5891 else
5892 trailing_empty = 0;
5893 } else {
5894 dstr = newSVpvn_flags(s, m-s,
5895 (do_utf8 ? SVf_UTF8 : 0) | make_mortal);
5896 XPUSHs(dstr);
5897 }
a0d0e21e
LW
5898 s = m;
5899 }
5900 }
07bc277f 5901 else if (RX_EXTFLAGS(rx) & RXf_NULL && !(s >= strend)) {
640f820d
AB
5902 /*
5903 Pre-extend the stack, either the number of bytes or
5904 characters in the string or a limited amount, triggered by:
5905
5906 my ($x, $y) = split //, $str;
5907 or
5908 split //, $str, $i;
5909 */
c1a7495a 5910 if (!gimme_scalar) {
052a7c76
DM
5911 const IV items = limit - 1;
5912 /* setting it to -1 will trigger a panic in EXTEND() */
5913 const SSize_t sslen = slen > SSize_t_MAX ? -1 : (SSize_t)slen;
5914 if (items >=0 && items < sslen)
c1a7495a
BB
5915 EXTEND(SP, items);
5916 else
052a7c76 5917 EXTEND(SP, sslen);
c1a7495a 5918 }
640f820d 5919
e9515b0f
AB
5920 if (do_utf8) {
5921 while (--limit) {
5922 /* keep track of how many bytes we skip over */
5923 m = s;
640f820d 5924 s += UTF8SKIP(s);
c1a7495a
BB
5925 if (gimme_scalar) {
5926 iters++;
5927 if (s-m == 0)
5928 trailing_empty++;
5929 else
5930 trailing_empty = 0;
5931 } else {
5932 dstr = newSVpvn_flags(m, s-m, SVf_UTF8 | make_mortal);
640f820d 5933
c1a7495a
BB
5934 PUSHs(dstr);
5935 }
640f820d 5936
e9515b0f
AB
5937 if (s >= strend)
5938 break;
5939 }
5940 } else {
5941 while (--limit) {
c1a7495a
BB
5942 if (gimme_scalar) {
5943 iters++;
5944 } else {
5945 dstr = newSVpvn(s, 1);
e9515b0f 5946
e9515b0f 5947
c1a7495a
BB
5948 if (make_mortal)
5949 sv_2mortal(dstr);
640f820d 5950
c1a7495a
BB
5951 PUSHs(dstr);
5952 }
5953
5954 s++;
e9515b0f
AB
5955
5956 if (s >= strend)
5957 break;
5958 }
640f820d
AB
5959 }
5960 }
3c8556c3 5961 else if (do_utf8 == (RX_UTF8(rx) != 0) &&
07bc277f
NC
5962 (RX_EXTFLAGS(rx) & RXf_USE_INTUIT) && !RX_NPARENS(rx)
5963 && (RX_EXTFLAGS(rx) & RXf_CHECK_ALL)
8e1490ee 5964 && !(RX_EXTFLAGS(rx) & RXf_IS_ANCHORED)) {
07bc277f 5965 const int tail = (RX_EXTFLAGS(rx) & RXf_INTUIT_TAIL);
f9f4320a 5966 SV * const csv = CALLREG_INTUIT_STRING(rx);
cf93c79d 5967
07bc277f 5968 len = RX_MINLENRET(rx);
3c8556c3 5969 if (len == 1 && !RX_UTF8(rx) && !tail) {
1b6737cc 5970 const char c = *SvPV_nolen_const(csv);
a0d0e21e 5971 while (--limit) {
a6e20a40
AL
5972 for (m = s; m < strend && *m != c; m++)
5973 ;
a0d0e21e
LW
5974 if (m >= strend)
5975 break;
c1a7495a
BB
5976 if (gimme_scalar) {
5977 iters++;
5978 if (m-s == 0)
5979 trailing_empty++;
5980 else
5981 trailing_empty = 0;
5982 } else {
5983 dstr = newSVpvn_flags(s, m-s,
d14578b8 5984 (do_utf8 ? SVf_UTF8 : 0) | make_mortal);
c1a7495a
BB
5985 XPUSHs(dstr);
5986 }
93f04dac
JH
5987 /* The rx->minlen is in characters but we want to step
5988 * s ahead by bytes. */
1aa99e6b
IH
5989 if (do_utf8)
5990 s = (char*)utf8_hop((U8*)m, len);
5991 else
5992 s = m + len; /* Fake \n at the end */
a0d0e21e
LW
5993 }
5994 }
5995 else {
a0d0e21e 5996 while (s < strend && --limit &&
f722798b 5997 (m = fbm_instr((unsigned char*)s, (unsigned char*)strend,
7fba1cd6 5998 csv, multiline ? FBMrf_MULTILINE : 0)) )
a0d0e21e 5999 {
c1a7495a
BB
6000 if (gimme_scalar) {
6001 iters++;
6002 if (m-s == 0)
6003 trailing_empty++;
6004 else
6005 trailing_empty = 0;
6006 } else {
6007 dstr = newSVpvn_flags(s, m-s,
d14578b8 6008 (do_utf8 ? SVf_UTF8 : 0) | make_mortal);
c1a7495a
BB
6009 XPUSHs(dstr);
6010 }
93f04dac
JH
6011 /* The rx->minlen is in characters but we want to step
6012 * s ahead by bytes. */
1aa99e6b
IH
6013 if (do_utf8)
6014 s = (char*)utf8_hop((U8*)m, len);
6015 else
6016 s = m + len; /* Fake \n at the end */
a0d0e21e 6017 }
463ee0b2 6018 }
463ee0b2 6019 }
a0d0e21e 6020 else {
07bc277f 6021 maxiters += slen * RX_NPARENS(rx);
080c2dec 6022 while (s < strend && --limit)
bbce6d69 6023 {
1b6737cc 6024 I32 rex_return;
080c2dec 6025 PUTBACK;
d14578b8 6026 rex_return = CALLREGEXEC(rx, (char*)s, (char*)strend, (char*)orig, 1,
c33e64f0 6027 sv, NULL, 0);
080c2dec 6028 SPAGAIN;
1b6737cc 6029 if (rex_return == 0)
080c2dec 6030 break;
d9f97599 6031 TAINT_IF(RX_MATCH_TAINTED(rx));
6502e081
DM
6032 /* we never pass the REXEC_COPY_STR flag, so it should
6033 * never get copied */
6034 assert(!RX_MATCH_COPIED(rx));
07bc277f 6035 m = RX_OFFS(rx)[0].start + orig;
c1a7495a
BB
6036
6037 if (gimme_scalar) {
6038 iters++;
6039 if (m-s == 0)
6040 trailing_empty++;
6041 else
6042 trailing_empty = 0;
6043 } else {
6044 dstr = newSVpvn_flags(s, m-s,
6045 (do_utf8 ? SVf_UTF8 : 0) | make_mortal);
6046 XPUSHs(dstr);
6047 }
07bc277f 6048 if (RX_NPARENS(rx)) {
1b6737cc 6049 I32 i;
07bc277f
NC
6050 for (i = 1; i <= (I32)RX_NPARENS(rx); i++) {
6051 s = RX_OFFS(rx)[i].start + orig;
6052 m = RX_OFFS(rx)[i].end + orig;
6de67870
JP
6053
6054 /* japhy (07/27/01) -- the (m && s) test doesn't catch
6055 parens that didn't match -- they should be set to
6056 undef, not the empty string */
c1a7495a
BB
6057 if (gimme_scalar) {
6058 iters++;
6059 if (m-s == 0)
6060 trailing_empty++;
6061 else
6062 trailing_empty = 0;
6063 } else {
6064 if (m >= orig && s >= orig) {
6065 dstr = newSVpvn_flags(s, m-s,
6066 (do_utf8 ? SVf_UTF8 : 0)
6067 | make_mortal);
6068 }
6069 else
6070 dstr = &PL_sv_undef; /* undef, not "" */
6071 XPUSHs(dstr);
748a9306 6072 }
c1a7495a 6073
a0d0e21e
LW
6074 }
6075 }
07bc277f 6076 s = RX_OFFS(rx)[0].end + orig;
a0d0e21e 6077 }
79072805 6078 }
8ec5e241 6079
c1a7495a
BB
6080 if (!gimme_scalar) {
6081 iters = (SP - PL_stack_base) - base;
6082 }
a0d0e21e 6083 if (iters > maxiters)
cea2e8a9 6084 DIE(aTHX_ "Split loop");
8ec5e241 6085
a0d0e21e
LW
6086 /* keep field after final delim? */
6087 if (s < strend || (iters && origlimit)) {
c1a7495a
BB
6088 if (!gimme_scalar) {
6089 const STRLEN l = strend - s;
6090 dstr = newSVpvn_flags(s, l, (do_utf8 ? SVf_UTF8 : 0) | make_mortal);
6091 XPUSHs(dstr);
6092 }
a0d0e21e 6093 iters++;
79072805 6094 }
a0d0e21e 6095 else if (!origlimit) {
c1a7495a
BB
6096 if (gimme_scalar) {
6097 iters -= trailing_empty;
6098 } else {
6099 while (iters > 0 && (!TOPs || !SvANY(TOPs) || SvCUR(TOPs) == 0)) {
6100 if (TOPs && !make_mortal)
6101 sv_2mortal(TOPs);
71ca73e5 6102 *SP-- = NULL;
c1a7495a
BB
6103 iters--;
6104 }
89900bd3 6105 }
a0d0e21e 6106 }
8ec5e241 6107
8b7059b1
DM
6108 PUTBACK;
6109 LEAVE_SCOPE(oldsave); /* may undo an earlier SWITCHSTACK */
6110 SPAGAIN;
a0d0e21e 6111 if (realarray) {
8ec5e241 6112 if (!mg) {
1c0b011c
NIS
6113 if (SvSMAGICAL(ary)) {
6114 PUTBACK;
ad64d0ec 6115 mg_set(MUTABLE_SV(ary));
1c0b011c
NIS
6116 SPAGAIN;
6117 }
6118 if (gimme == G_ARRAY) {
6119 EXTEND(SP, iters);
6120 Copy(AvARRAY(ary), SP + 1, iters, SV*);
6121 SP += iters;
6122 RETURN;
6123 }
8ec5e241 6124 }
1c0b011c 6125 else {
fb73857a 6126 PUTBACK;
d343c3ef 6127 ENTER_with_name("call_PUSH");
36925d9e 6128 call_sv(SV_CONST(PUSH),G_SCALAR|G_DISCARD|G_METHOD_NAMED);
d343c3ef 6129 LEAVE_with_name("call_PUSH");
fb73857a 6130 SPAGAIN;
8ec5e241 6131 if (gimme == G_ARRAY) {
c70927a6 6132 SSize_t i;
8ec5e241
NIS
6133 /* EXTEND should not be needed - we just popped them */
6134 EXTEND(SP, iters);
6135 for (i=0; i < iters; i++) {
6136 SV **svp = av_fetch(ary, i, FALSE);
3280af22 6137 PUSHs((svp) ? *svp : &PL_sv_undef);
8ec5e241 6138 }
1c0b011c
NIS
6139 RETURN;
6140 }
a0d0e21e
LW
6141 }
6142 }
6143 else {
6144 if (gimme == G_ARRAY)
6145 RETURN;
6146 }
7f18b612
YST
6147
6148 GETTARGET;
02c161ef 6149 XPUSHi(iters);
7f18b612 6150 RETURN;
79072805 6151}
85e6fe83 6152
c5917253
NC
6153PP(pp_once)
6154{
6155 dSP;
6156 SV *const sv = PAD_SVl(PL_op->op_targ);
6157
6158 if (SvPADSTALE(sv)) {
6159 /* First time. */
6160 SvPADSTALE_off(sv);
6161 RETURNOP(cLOGOP->op_other);
6162 }
6163 RETURNOP(cLOGOP->op_next);
6164}
6165
c0329465
MB
6166PP(pp_lock)
6167{
39644a26 6168 dSP;
c0329465 6169 dTOPss;
e55aaa0e 6170 SV *retsv = sv;
68795e93 6171 SvLOCK(sv);
f79aa60b
FC
6172 if (SvTYPE(retsv) == SVt_PVAV || SvTYPE(retsv) == SVt_PVHV
6173 || SvTYPE(retsv) == SVt_PVCV) {
e55aaa0e
MB
6174 retsv = refto(retsv);
6175 }
6176 SETs(retsv);
c0329465
MB
6177 RETURN;
6178}
a863c7d1 6179
65bca31a 6180
10088f56 6181/* used for: pp_padany(), pp_custom(); plus any system ops
b1c05ba5
DM
6182 * that aren't implemented on a particular platform */
6183
65bca31a
NC
6184PP(unimplemented_op)
6185{
361ed549
NC
6186 const Optype op_type = PL_op->op_type;
6187 /* Using OP_NAME() isn't going to be helpful here. Firstly, it doesn't cope
6188 with out of range op numbers - it only "special" cases op_custom.
6189 Secondly, as the three ops we "panic" on are padmy, mapstart and custom,
6190 if we get here for a custom op then that means that the custom op didn't
6191 have an implementation. Given that OP_NAME() looks up the custom op
6192 by its pp_addr, likely it will return NULL, unless someone (unhelpfully)
6193 registers &PL_unimplemented_op as the address of their custom op.
6194 NULL doesn't generate a useful error message. "custom" does. */
6195 const char *const name = op_type >= OP_max
6196 ? "[out of range]" : PL_op_name[PL_op->op_type];
7627e6d0
NC
6197 if(OP_IS_SOCKET(op_type))
6198 DIE(aTHX_ PL_no_sock_func, name);
361ed549 6199 DIE(aTHX_ "panic: unimplemented op %s (#%d) called", name, op_type);
65bca31a
NC
6200}
6201
bea284c8
FC
6202static void
6203S_maybe_unwind_defav(pTHX)
6204{
6205 if (CX_CUR()->cx_type & CXp_HASARGS) {
6206 PERL_CONTEXT *cx = CX_CUR();
6207
6208 assert(CxHASARGS(cx));
6209 cx_popsub_args(cx);
6210 cx->cx_type &= ~CXp_HASARGS;
6211 }
6212}
6213
deb8a388
FC
6214/* For sorting out arguments passed to a &CORE:: subroutine */
6215PP(pp_coreargs)
6216{
6217 dSP;
7fa5bd9b 6218 int opnum = SvIOK(cSVOP_sv) ? (int)SvUV(cSVOP_sv) : 0;
498a02d8 6219 int defgv = PL_opargs[opnum] & OA_DEFGV ||opnum==OP_GLOB, whicharg = 0;
7fa5bd9b 6220 AV * const at_ = GvAV(PL_defgv);
0e80230d
FC
6221 SV **svp = at_ ? AvARRAY(at_) : NULL;
6222 I32 minargs = 0, maxargs = 0, numargs = at_ ? AvFILLp(at_)+1 : 0;
7fa5bd9b 6223 I32 oa = opnum ? PL_opargs[opnum] >> OASHIFT : 0;
46e00a91 6224 bool seen_question = 0;
7fa5bd9b 6225 const char *err = NULL;
3e6568b4 6226 const bool pushmark = PL_op->op_private & OPpCOREARGS_PUSHMARK;
7fa5bd9b 6227
46e00a91
FC
6228 /* Count how many args there are first, to get some idea how far to
6229 extend the stack. */
7fa5bd9b 6230 while (oa) {
bf0571fd 6231 if ((oa & 7) == OA_LIST) { maxargs = I32_MAX; break; }
7fa5bd9b 6232 maxargs++;
46e00a91
FC
6233 if (oa & OA_OPTIONAL) seen_question = 1;
6234 if (!seen_question) minargs++;
7fa5bd9b
FC
6235 oa >>= 4;
6236 }
6237
6238 if(numargs < minargs) err = "Not enough";
6239 else if(numargs > maxargs) err = "Too many";
6240 if (err)
6241 /* diag_listed_as: Too many arguments for %s */
6242 Perl_croak(aTHX_
6243 "%s arguments for %s", err,
2a90c7c6 6244 opnum ? PL_op_desc[opnum] : SvPV_nolen_const(cSVOP_sv)
7fa5bd9b
FC
6245 );
6246
6247 /* Reset the stack pointer. Without this, we end up returning our own
6248 arguments in list context, in addition to the values we are supposed
6249 to return. nextstate usually does this on sub entry, but we need
e1fa07e3 6250 to run the next op with the caller's hints, so we cannot have a
7fa5bd9b 6251 nextstate. */
4ebe6e95 6252 SP = PL_stack_base + CX_CUR()->blk_oldsp;
7fa5bd9b 6253
46e00a91
FC
6254 if(!maxargs) RETURN;
6255
bf0571fd
FC
6256 /* We do this here, rather than with a separate pushmark op, as it has
6257 to come in between two things this function does (stack reset and
6258 arg pushing). This seems the easiest way to do it. */
3e6568b4 6259 if (pushmark) {
bf0571fd
FC
6260 PUTBACK;
6261 (void)Perl_pp_pushmark(aTHX);
6262 }
6263
6264 EXTEND(SP, maxargs == I32_MAX ? numargs : maxargs);
c931b036 6265 PUTBACK; /* The code below can die in various places. */
46e00a91
FC
6266
6267 oa = PL_opargs[opnum] >> OASHIFT;
3e6568b4 6268 for (; oa&&(numargs||!pushmark); (void)(numargs&&(++svp,--numargs))) {
c931b036 6269 whicharg++;
46e00a91
FC
6270 switch (oa & 7) {
6271 case OA_SCALAR:
1efec5ed 6272 try_defsv:
d6d78e19 6273 if (!numargs && defgv && whicharg == minargs + 1) {
195eefec 6274 PUSHs(DEFSV);
d6d78e19
FC
6275 }
6276 else PUSHs(numargs ? svp && *svp ? *svp : &PL_sv_undef : NULL);
46e00a91 6277 break;
bf0571fd
FC
6278 case OA_LIST:
6279 while (numargs--) {
6280 PUSHs(svp && *svp ? *svp : &PL_sv_undef);
6281 svp++;
6282 }
6283 RETURN;
bea284c8
FC
6284 case OA_AVREF:
6285 if (!numargs) {
6286 GV *gv;
6287 if (CvUNIQUE(find_runcv_where(FIND_RUNCV_level_eq,1,NULL)))
6288 gv = PL_argvgv;
6289 else {
6290 S_maybe_unwind_defav(aTHX);
6291 gv = PL_defgv;
6292 }
6293 PUSHs((SV *)GvAVn(gv));
6294 break;
6295 }
6296 if (!svp || !*svp || !SvROK(*svp)
6297 || SvTYPE(SvRV(*svp)) != SVt_PVAV)
6298 DIE(aTHX_
6299 /* diag_listed_as: Type of arg %d to &CORE::%s must be %s*/
6300 "Type of arg %d to &CORE::%s must be array reference",
6301 whicharg, PL_op_desc[opnum]
6302 );
6303 PUSHs(SvRV(*svp));
6304 break;
19c481f4
FC
6305 case OA_HVREF:
6306 if (!svp || !*svp || !SvROK(*svp)
73665bc4
FC
6307 || ( SvTYPE(SvRV(*svp)) != SVt_PVHV
6308 && ( opnum == OP_DBMCLOSE || opnum == OP_DBMOPEN
6309 || SvTYPE(SvRV(*svp)) != SVt_PVAV )))
19c481f4
FC
6310 DIE(aTHX_
6311 /* diag_listed_as: Type of arg %d to &CORE::%s must be %s*/
73665bc4
FC
6312 "Type of arg %d to &CORE::%s must be hash%s reference",
6313 whicharg, PL_op_desc[opnum],
6314 opnum == OP_DBMCLOSE || opnum == OP_DBMOPEN
6315 ? ""
6316 : " or array"
19c481f4
FC
6317 );
6318 PUSHs(SvRV(*svp));
6319 break;
c931b036 6320 case OA_FILEREF:
30901a8a
FC
6321 if (!numargs) PUSHs(NULL);
6322 else if(svp && *svp && SvROK(*svp) && isGV_with_GP(SvRV(*svp)))
c931b036
FC
6323 /* no magic here, as the prototype will have added an extra
6324 refgen and we just want what was there before that */
6325 PUSHs(SvRV(*svp));
6326 else {
6327 const bool constr = PL_op->op_private & whicharg;
6328 PUSHs(S_rv2gv(aTHX_
6329 svp && *svp ? *svp : &PL_sv_undef,
b54f893d 6330 constr, cBOOL(CopHINTS_get(PL_curcop) & HINT_STRICT_REFS),
c931b036
FC
6331 !constr
6332 ));
6333 }
6334 break;
c72a5629 6335 case OA_SCALARREF:
1efec5ed
FC
6336 if (!numargs) goto try_defsv;
6337 else {
17008668
FC
6338 const bool wantscalar =
6339 PL_op->op_private & OPpCOREARGS_SCALARMOD;
c72a5629 6340 if (!svp || !*svp || !SvROK(*svp)
17008668
FC
6341 /* We have to permit globrefs even for the \$ proto, as
6342 *foo is indistinguishable from ${\*foo}, and the proto-
6343 type permits the latter. */
6344 || SvTYPE(SvRV(*svp)) > (
efe889ae 6345 wantscalar ? SVt_PVLV
46bef06f
FC
6346 : opnum == OP_LOCK || opnum == OP_UNDEF
6347 ? SVt_PVCV
efe889ae 6348 : SVt_PVHV
17008668 6349 )
c72a5629
FC
6350 )
6351 DIE(aTHX_
17008668 6352 "Type of arg %d to &CORE::%s must be %s",
46bef06f 6353 whicharg, PL_op_name[opnum],
17008668
FC
6354 wantscalar
6355 ? "scalar reference"
46bef06f 6356 : opnum == OP_LOCK || opnum == OP_UNDEF
efe889ae
FC
6357 ? "reference to one of [$@%&*]"
6358 : "reference to one of [$@%*]"
c72a5629
FC
6359 );
6360 PUSHs(SvRV(*svp));
bea284c8 6361 if (opnum == OP_UNDEF && SvRV(*svp) == (SV *)PL_defgv) {
88bb468b 6362 /* Undo @_ localisation, so that sub exit does not undo
04e686b8 6363 part of our undeffing. */
bea284c8 6364 S_maybe_unwind_defav(aTHX);
88bb468b 6365 }
17008668 6366 }
1efec5ed 6367 break;
46e00a91 6368 default:
46e00a91
FC
6369 DIE(aTHX_ "panic: unknown OA_*: %x", (unsigned)(oa&7));
6370 }
6371 oa = oa >> 4;
6372 }
6373
deb8a388
FC
6374 RETURN;
6375}
6376
a2232057
DM
6377/* Implement CORE::keys(),values(),each().
6378 *
6379 * We won't know until run-time whether the arg is an array or hash,
6380 * so this op calls
6381 *
6382 * pp_keys/pp_values/pp_each
6383 * or
6384 * pp_akeys/pp_avalues/pp_aeach
6385 *
6386 * as appropriate (or whatever pp function actually implements the OP_FOO
6387 * functionality for each FOO).
6388 */
6389
88101882
FC
6390PP(pp_avhvswitch)
6391{
a73158aa 6392 dVAR; dSP;
73665bc4
FC
6393 return PL_ppaddr[
6394 (SvTYPE(TOPs) == SVt_PVAV ? OP_AEACH : OP_EACH)
e1e26374 6395 + (PL_op->op_private & OPpAVHVSWITCH_MASK)
73665bc4 6396 ](aTHX);
88101882
FC
6397}
6398
84ed0108
FC
6399PP(pp_runcv)
6400{
6401 dSP;
6402 CV *cv;
6403 if (PL_op->op_private & OPpOFFBYONE) {
db4cf31d 6404 cv = find_runcv_where(FIND_RUNCV_level_eq, 1, NULL);
84ed0108
FC
6405 }
6406 else cv = find_runcv(NULL);
e157a82b 6407 XPUSHs(CvEVAL(cv) ? &PL_sv_undef : sv_2mortal(newRV((SV *)cv)));
84ed0108
FC
6408 RETURN;
6409}
6410
05a34802 6411static void
2331e434 6412S_localise_aelem_lval(pTHX_ AV * const av, SV * const keysv,
05a34802
FC
6413 const bool can_preserve)
6414{
2331e434 6415 const SSize_t ix = SvIV(keysv);
05a34802
FC
6416 if (can_preserve ? av_exists(av, ix) : TRUE) {
6417 SV ** const svp = av_fetch(av, ix, 1);
6418 if (!svp || !*svp)
6419 Perl_croak(aTHX_ PL_no_aelem, ix);
6420 save_aelem(av, ix, svp);
6421 }
6422 else
6423 SAVEADELETE(av, ix);
6424}
6425
5f94141d
FC
6426static void
6427S_localise_helem_lval(pTHX_ HV * const hv, SV * const keysv,
6428 const bool can_preserve)
6429{
6430 if (can_preserve ? hv_exists_ent(hv, keysv, 0) : TRUE) {
6431 HE * const he = hv_fetch_ent(hv, keysv, 1, 0);
6432 SV ** const svp = he ? &HeVAL(he) : NULL;
6433 if (!svp || !*svp)
6434 Perl_croak(aTHX_ PL_no_helem_sv, SVfARG(keysv));
6435 save_helem_flags(hv, keysv, svp, 0);
6436 }
6437 else
6438 SAVEHDELETE(hv, keysv);
6439}
6440
9782ce69
FC
6441static void
6442S_localise_gv_slot(pTHX_ GV *gv, U8 type)
6443{
6444 if (type == OPpLVREF_SV) {
6445 save_pushptrptr(gv, SvREFCNT_inc_simple(GvSV(gv)), SAVEt_GVSV);
6446 GvSV(gv) = 0;
6447 }
6448 else if (type == OPpLVREF_AV)
6449 /* XXX Inefficient, as it creates a new AV, which we are
6450 about to clobber. */
6451 save_ary(gv);
6452 else {
6453 assert(type == OPpLVREF_HV);
6454 /* XXX Likewise inefficient. */
6455 save_hash(gv);
6456 }
6457}
6458
6459
254da51f
FC
6460PP(pp_refassign)
6461{
4fec8804 6462 dSP;
6102323a 6463 SV * const key = PL_op->op_private & OPpLVREF_ELEM ? POPs : NULL;
d8a875d9 6464 SV * const left = PL_op->op_flags & OPf_STACKED ? POPs : NULL;
4fec8804 6465 dTOPss;
3f114923 6466 const char *bad = NULL;
ac0da85a 6467 const U8 type = PL_op->op_private & OPpLVREF_TYPE;
4fec8804 6468 if (!SvROK(sv)) DIE(aTHX_ "Assigned value is not a reference");
ac0da85a 6469 switch (type) {
3f114923
FC
6470 case OPpLVREF_SV:
6471 if (SvTYPE(SvRV(sv)) > SVt_PVLV)
6472 bad = " SCALAR";
6473 break;
6474 case OPpLVREF_AV:
6475 if (SvTYPE(SvRV(sv)) != SVt_PVAV)
6476 bad = "n ARRAY";
6477 break;
6478 case OPpLVREF_HV:
6479 if (SvTYPE(SvRV(sv)) != SVt_PVHV)
6480 bad = " HASH";
6481 break;
6482 case OPpLVREF_CV:
6483 if (SvTYPE(SvRV(sv)) != SVt_PVCV)
6484 bad = " CODE";
6485 }
6486 if (bad)
1f8155a2 6487 /* diag_listed_as: Assigned value is not %s reference */
3f114923 6488 DIE(aTHX_ "Assigned value is not a%s reference", bad);
b943805e
JH
6489 {
6490 MAGIC *mg;
6491 HV *stash;
d8a875d9
FC
6492 switch (left ? SvTYPE(left) : 0) {
6493 case 0:
cf5d2d91
FC
6494 {
6495 SV * const old = PAD_SV(ARGTARG);
d8a875d9 6496 PAD_SETSV(ARGTARG, SvREFCNT_inc_NN(SvRV(sv)));
cf5d2d91 6497 SvREFCNT_dec(old);
3ad7d304
FC
6498 if ((PL_op->op_private & (OPpLVAL_INTRO|OPpPAD_STATE))
6499 == OPpLVAL_INTRO)
fc048fcf 6500 SAVECLEARSV(PAD_SVl(ARGTARG));
d8a875d9 6501 break;
cf5d2d91 6502 }
d8a875d9 6503 case SVt_PVGV:
2a57afb1 6504 if (PL_op->op_private & OPpLVAL_INTRO) {
9782ce69 6505 S_localise_gv_slot(aTHX_ (GV *)left, type);
2a57afb1 6506 }
d8a875d9
FC
6507 gv_setref(left, sv);
6508 SvSETMAGIC(left);
6102323a
FC
6509 break;
6510 case SVt_PVAV:
69a23520 6511 assert(key);
40d2b828 6512 if (UNLIKELY(PL_op->op_private & OPpLVAL_INTRO)) {
2331e434 6513 S_localise_aelem_lval(aTHX_ (AV *)left, key,
05a34802 6514 SvCANEXISTDELETE(left));
40d2b828 6515 }
6102323a
FC
6516 av_store((AV *)left, SvIV(key), SvREFCNT_inc_simple_NN(SvRV(sv)));
6517 break;
5f94141d 6518 case SVt_PVHV:
69a23520
JH
6519 if (UNLIKELY(PL_op->op_private & OPpLVAL_INTRO)) {
6520 assert(key);
5f94141d
FC
6521 S_localise_helem_lval(aTHX_ (HV *)left, key,
6522 SvCANEXISTDELETE(left));
69a23520 6523 }
7fcb36d5 6524 (void)hv_store_ent((HV *)left, key, SvREFCNT_inc_simple_NN(SvRV(sv)), 0);
d8a875d9 6525 }
4fec8804
FC
6526 if (PL_op->op_flags & OPf_MOD)
6527 SETs(sv_2mortal(newSVsv(sv)));
6528 /* XXX else can weak references go stale before they are read, e.g.,
6529 in leavesub? */
6530 RETURN;
b943805e 6531 }
254da51f
FC
6532}
6533
4c5bab50
FC
6534PP(pp_lvref)
6535{
26a50d99
FC
6536 dSP;
6537 SV * const ret = sv_2mortal(newSV_type(SVt_PVMG));
6102323a 6538 SV * const elem = PL_op->op_private & OPpLVREF_ELEM ? POPs : NULL;
2a57afb1 6539 SV * const arg = PL_op->op_flags & OPf_STACKED ? POPs : NULL;
9782ce69
FC
6540 MAGIC * const mg = sv_magicext(ret, arg, PERL_MAGIC_lvref,
6541 &PL_vtbl_lvref, (char *)elem,
23270f96 6542 elem ? HEf_SVKEY : (I32)ARGTARG);
9782ce69 6543 mg->mg_private = PL_op->op_private;
d39c26a6
FC
6544 if (PL_op->op_private & OPpLVREF_ITER)
6545 mg->mg_flags |= MGf_PERSIST;
9846cd95 6546 if (UNLIKELY(PL_op->op_private & OPpLVAL_INTRO)) {
40d2b828 6547 if (elem) {
38bb0011
JH
6548 MAGIC *mg;
6549 HV *stash;
6550 assert(arg);
6551 {
6552 const bool can_preserve = SvCANEXISTDELETE(arg);
6553 if (SvTYPE(arg) == SVt_PVAV)
6554 S_localise_aelem_lval(aTHX_ (AV *)arg, elem, can_preserve);
6555 else
6556 S_localise_helem_lval(aTHX_ (HV *)arg, elem, can_preserve);
6557 }
40d2b828
FC
6558 }
6559 else if (arg) {
9782ce69
FC
6560 S_localise_gv_slot(aTHX_ (GV *)arg,
6561 PL_op->op_private & OPpLVREF_TYPE);
2a57afb1 6562 }
3ad7d304 6563 else if (!(PL_op->op_private & OPpPAD_STATE))
c146a62a 6564 SAVECLEARSV(PAD_SVl(ARGTARG));
1199b01a 6565 }
c146a62a
FC
6566 XPUSHs(ret);
6567 RETURN;
4c5bab50 6568}
84ed0108 6569
16b99412
FC
6570PP(pp_lvrefslice)
6571{
a95dad8a 6572 dSP; dMARK;
0ca7b7f7
FC
6573 AV * const av = (AV *)POPs;
6574 const bool localizing = PL_op->op_private & OPpLVAL_INTRO;
6575 bool can_preserve = FALSE;
6576
9846cd95 6577 if (UNLIKELY(localizing)) {
0ca7b7f7
FC
6578 MAGIC *mg;
6579 HV *stash;
6580 SV **svp;
6581
6582 can_preserve = SvCANEXISTDELETE(av);
6583
6584 if (SvTYPE(av) == SVt_PVAV) {
6585 SSize_t max = -1;
6586
6587 for (svp = MARK + 1; svp <= SP; svp++) {
6588 const SSize_t elem = SvIV(*svp);
6589 if (elem > max)
6590 max = elem;
6591 }
6592 if (max > AvMAX(av))
6593 av_extend(av, max);
6594 }
6595 }
6596
6597 while (++MARK <= SP) {
6598 SV * const elemsv = *MARK;
5f94141d 6599 if (SvTYPE(av) == SVt_PVAV)
2331e434 6600 S_localise_aelem_lval(aTHX_ av, elemsv, can_preserve);
5f94141d
FC
6601 else
6602 S_localise_helem_lval(aTHX_ (HV *)av, elemsv, can_preserve);
0ca7b7f7
FC
6603 *MARK = sv_2mortal(newSV_type(SVt_PVMG));
6604 sv_magic(*MARK,(SV *)av,PERL_MAGIC_lvref,(char *)elemsv,HEf_SVKEY);
6605 }
6606 RETURN;
16b99412
FC
6607}
6608
2882b3ff
FC
6609PP(pp_lvavref)
6610{
bdaf10a5
FC
6611 if (PL_op->op_flags & OPf_STACKED)
6612 Perl_pp_rv2av(aTHX);
6613 else
6614 Perl_pp_padav(aTHX);
6615 {
6616 dSP;
6617 dTOPss;
6618 SETs(0); /* special alias marker that aassign recognises */
6619 XPUSHs(sv);
6620 RETURN;
6621 }
2882b3ff
FC
6622}
6623
b77472f9
FC
6624PP(pp_anonconst)
6625{
6626 dSP;
6627 dTOPss;
6628 SETs(sv_2mortal((SV *)newCONSTSUB(SvTYPE(CopSTASH(PL_curcop))==SVt_PVHV
6629 ? CopSTASH(PL_curcop)
6630 : NULL,
6631 NULL, SvREFCNT_inc_simple_NN(sv))));
6632 RETURN;
6633}
6634
4fa06845
DM
6635
6636/* process one subroutine argument - typically when the sub has a signature:
6637 * introduce PL_curpad[op_targ] and assign to it the value
6638 * for $: (OPf_STACKED ? *sp : $_[N])
6639 * for @/%: @_[N..$#_]
6640 *
6641 * It's equivalent to
6642 * my $foo = $_[N];
6643 * or
6644 * my $foo = (value-on-stack)
6645 * or
6646 * my @foo = @_[N..$#_]
6647 * etc
4fa06845
DM
6648 */
6649
6650PP(pp_argelem)
6651{
6652 dTARG;
6653 SV *val;
6654 SV ** padentry;
6655 OP *o = PL_op;
6656 AV *defav = GvAV(PL_defgv); /* @_ */
6daeaaa3 6657 IV ix = PTR2IV(cUNOP_AUXo->op_aux);
4fa06845 6658 IV argc;
4fa06845
DM
6659
6660 /* do 'my $var, @var or %var' action */
6661 padentry = &(PAD_SVl(o->op_targ));
6662 save_clearsv(padentry);
6663 targ = *padentry;
6664
6665 if ((o->op_private & OPpARGELEM_MASK) == OPpARGELEM_SV) {
6666 if (o->op_flags & OPf_STACKED) {
6667 dSP;
6668 val = POPs;
6669 PUTBACK;
6670 }
6671 else {
f6ca42c7 6672 SV **svp;
4fa06845 6673 /* should already have been checked */
f6ca42c7 6674 assert(ix >= 0);
6daeaaa3
DM
6675#if IVSIZE > PTRSIZE
6676 assert(ix <= SSize_t_MAX);
6677#endif
f6ca42c7
DM
6678
6679 svp = av_fetch(defav, ix, FALSE);
6680 val = svp ? *svp : &PL_sv_undef;
4fa06845
DM
6681 }
6682
6683 /* $var = $val */
6684
6685 /* cargo-culted from pp_sassign */
6686 assert(TAINTING_get || !TAINT_get);
6687 if (UNLIKELY(TAINT_get) && !SvTAINTED(val))
6688 TAINT_NOT;
6689
f6ca42c7 6690 SvSetMagicSV(targ, val);
4fa06845
DM
6691 return o->op_next;
6692 }
6693
6694 /* must be AV or HV */
6695
6696 assert(!(o->op_flags & OPf_STACKED));
f6ca42c7 6697 argc = ((IV)AvFILL(defav) + 1) - ix;
4fa06845
DM
6698
6699 /* This is a copy of the relevant parts of pp_aassign().
4fa06845
DM
6700 */
6701 if ((o->op_private & OPpARGELEM_MASK) == OPpARGELEM_AV) {
f6ca42c7
DM
6702 IV i;
6703
6704 if (AvFILL((AV*)targ) > -1) {
6705 /* target should usually be empty. If we get get
6706 * here, someone's been doing some weird closure tricks.
6707 * Make a copy of all args before clearing the array,
6708 * to avoid the equivalent of @a = ($a[0]) prematurely freeing
6709 * elements. See similar code in pp_aassign.
6710 */
6711 for (i = 0; i < argc; i++) {
6712 SV **svp = av_fetch(defav, ix + i, FALSE);
6713 SV *newsv = newSV(0);
6714 sv_setsv_flags(newsv,
6715 svp ? *svp : &PL_sv_undef,
6716 (SV_DO_COW_SVSETSV|SV_NOSTEAL));
6717 if (!av_store(defav, ix + i, newsv))
6718 SvREFCNT_dec_NN(newsv);
6719 }
6720 av_clear((AV*)targ);
6721 }
6722
6723 if (argc <= 0)
6724 return o->op_next;
4fa06845 6725
4fa06845
DM
6726 av_extend((AV*)targ, argc);
6727
f6ca42c7 6728 i = 0;
4fa06845
DM
6729 while (argc--) {
6730 SV *tmpsv;
f6ca42c7
DM
6731 SV **svp = av_fetch(defav, ix + i, FALSE);
6732 SV *val = svp ? *svp : &PL_sv_undef;
4fa06845 6733 tmpsv = newSV(0);
f6ca42c7 6734 sv_setsv(tmpsv, val);
4fa06845
DM
6735 av_store((AV*)targ, i++, tmpsv);
6736 TAINT_NOT;
6737 }
6738
6739 }
6740 else {
f6ca42c7
DM
6741 IV i;
6742
4fa06845
DM
6743 assert((o->op_private & OPpARGELEM_MASK) == OPpARGELEM_HV);
6744
f6ca42c7
DM
6745 if (SvRMAGICAL(targ) || HvUSEDKEYS((HV*)targ)) {
6746 /* see "target should usually be empty" comment above */
6747 for (i = 0; i < argc; i++) {
6748 SV **svp = av_fetch(defav, ix + i, FALSE);
6749 SV *newsv = newSV(0);
6750 sv_setsv_flags(newsv,
6751 svp ? *svp : &PL_sv_undef,
6752 (SV_DO_COW_SVSETSV|SV_NOSTEAL));
6753 if (!av_store(defav, ix + i, newsv))
6754 SvREFCNT_dec_NN(newsv);
6755 }
6756 hv_clear((HV*)targ);
6757 }
6758
6759 if (argc <= 0)
6760 return o->op_next;
4fa06845 6761 assert(argc % 2 == 0);
4fa06845 6762
f6ca42c7 6763 i = 0;
4fa06845
DM
6764 while (argc) {
6765 SV *tmpsv;
f6ca42c7
DM
6766 SV **svp;
6767 SV *key;
6768 SV *val;
6769
6770 svp = av_fetch(defav, ix + i++, FALSE);
6771 key = svp ? *svp : &PL_sv_undef;
6772 svp = av_fetch(defav, ix + i++, FALSE);
6773 val = svp ? *svp : &PL_sv_undef;
4fa06845 6774
4fa06845
DM
6775 argc -= 2;
6776 if (UNLIKELY(SvGMAGICAL(key)))
6777 key = sv_mortalcopy(key);
6778 tmpsv = newSV(0);
6779 sv_setsv(tmpsv, val);
6780 hv_store_ent((HV*)targ, key, tmpsv, 0);
6781 TAINT_NOT;
6782 }
6783 }
6784
6785 return o->op_next;
6786}
6787
6788/* Handle a default value for one subroutine argument (typically as part
6789 * of a subroutine signature).
6790 * It's equivalent to
6791 * @_ > op_targ ? $_[op_targ] : result_of(op_other)
6792 *
6793 * Intended to be used where op_next is an OP_ARGELEM
6794 *
6795 * We abuse the op_targ field slightly: it's an index into @_ rather than
6796 * into PL_curpad.
6797 */
6798
6799PP(pp_argdefelem)
6800{
6801 OP * const o = PL_op;
6802 AV *defav = GvAV(PL_defgv); /* @_ */
6daeaaa3 6803 IV ix = (IV)o->op_targ;
4fa06845 6804
f6ca42c7 6805 assert(ix >= 0);
6daeaaa3
DM
6806#if IVSIZE > PTRSIZE
6807 assert(ix <= SSize_t_MAX);
6808#endif
f6ca42c7
DM
6809
6810 if (AvFILL(defav) >= ix) {
4fa06845 6811 dSP;
f6ca42c7
DM
6812 SV **svp = av_fetch(defav, ix, FALSE);
6813 SV *val = svp ? *svp : &PL_sv_undef;
6814 XPUSHs(val);
4fa06845
DM
6815 RETURN;
6816 }
6817 return cLOGOPo->op_other;
6818}
6819
6820
ac7609e4
AC
6821static SV *
6822S_find_runcv_name(void)
6823{
6824 dTHX;
6825 CV *cv;
6826 GV *gv;
6827 SV *sv;
6828
6829 cv = find_runcv(0);
6830 if (!cv)
6831 return &PL_sv_no;
6832
6833 gv = CvGV(cv);
6834 if (!gv)
6835 return &PL_sv_no;
6836
6837 sv = sv_2mortal(newSV(0));
6838 gv_fullname4(sv, gv, NULL, TRUE);
6839 return sv;
6840}
4fa06845
DM
6841
6842/* Check a a subs arguments - i.e. that it has the correct number of args
6843 * (and anything else we might think of in future). Typically used with
6844 * signatured subs.
6845 */
6846
6847PP(pp_argcheck)
6848{
6849 OP * const o = PL_op;
6850 UNOP_AUX_item *aux = cUNOP_AUXo->op_aux;
6daeaaa3
DM
6851 IV params = aux[0].iv;
6852 IV opt_params = aux[1].iv;
4fa06845
DM
6853 char slurpy = (char)(aux[2].iv);
6854 AV *defav = GvAV(PL_defgv); /* @_ */
6daeaaa3 6855 IV argc;
4fa06845
DM
6856 bool too_few;
6857
6858 assert(!SvMAGICAL(defav));
6daeaaa3 6859 argc = (AvFILLp(defav) + 1);
4fa06845
DM
6860 too_few = (argc < (params - opt_params));
6861
6862 if (UNLIKELY(too_few || (!slurpy && argc > params)))
ac7609e4
AC
6863 /* diag_listed_as: Too few arguments for subroutine '%s' */
6864 /* diag_listed_as: Too many arguments for subroutine '%s' */
6865 Perl_croak_caller("Too %s arguments for subroutine '%" SVf "'",
6866 too_few ? "few" : "many", S_find_runcv_name());
4fa06845
DM
6867
6868 if (UNLIKELY(slurpy == '%' && argc > params && (argc - params) % 2))
ac7609e4
AC
6869 /* diag_listed_as: Odd name/value argument for subroutine '%s' */
6870 Perl_croak_caller("Odd name/value argument for subroutine '%" SVf "'",
6871 S_find_runcv_name());
4fa06845
DM
6872
6873 return NORMAL;
6874}
6875
e609e586 6876/*
14d04a33 6877 * ex: set ts=8 sts=4 sw=4 et:
37442d52 6878 */