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