This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
fileno() was failing when passed a NULL. I'm guessing that we don't really need...
[perl5.git] / pp.c
CommitLineData
a0d0e21e 1/* pp.c
79072805 2 *
1129b882
NC
3 * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
4 * 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 by Larry Wall and others
79072805 5 *
a0d0e21e
LW
6 * You may distribute under the terms of either the GNU General Public
7 * License or the Artistic License, as specified in the README file.
79072805 8 *
a0d0e21e
LW
9 */
10
11/*
4ac71550
TC
12 * 'It's a big house this, and very peculiar. Always a bit more
13 * to discover, and no knowing what you'll find round a corner.
14 * And Elves, sir!' --Samwise Gamgee
15 *
16 * [p.225 of _The Lord of the Rings_, II/i: "Many Meetings"]
a0d0e21e 17 */
79072805 18
166f8a29
DM
19/* This file contains general pp ("push/pop") functions that execute the
20 * opcodes that make up a perl program. A typical pp function expects to
21 * find its arguments on the stack, and usually pushes its results onto
22 * the stack, hence the 'pp' terminology. Each OP structure contains
23 * a pointer to the relevant pp_foo() function.
24 */
25
79072805 26#include "EXTERN.h"
864dbfa3 27#define PERL_IN_PP_C
79072805 28#include "perl.h"
77bc9082 29#include "keywords.h"
79072805 30
a4af207c
JH
31#include "reentr.h"
32
dfe9444c
AD
33/* XXX I can't imagine anyone who doesn't have this actually _needs_
34 it, since pid_t is an integral type.
35 --AD 2/20/1998
36*/
37#ifdef NEED_GETPID_PROTO
38extern Pid_t getpid (void);
8ac85365
NIS
39#endif
40
0630166f
SP
41/*
42 * Some BSDs and Cygwin default to POSIX math instead of IEEE.
43 * This switches them over to IEEE.
44 */
45#if defined(LIBM_LIB_VERSION)
46 _LIB_VERSION_TYPE _LIB_VERSION = _IEEE_;
47#endif
48
13017935
SM
49/* variations on pp_null */
50
93a17b20
LW
51PP(pp_stub)
52{
97aff369 53 dVAR;
39644a26 54 dSP;
54310121 55 if (GIMME_V == G_SCALAR)
3280af22 56 XPUSHs(&PL_sv_undef);
93a17b20
LW
57 RETURN;
58}
59
79072805
LW
60/* Pushy stuff. */
61
93a17b20
LW
62PP(pp_padav)
63{
97aff369 64 dVAR; dSP; dTARGET;
13017935 65 I32 gimme;
533c011a 66 if (PL_op->op_private & OPpLVAL_INTRO)
a5911867
RGS
67 if (!(PL_op->op_private & OPpPAD_STATE))
68 SAVECLEARSV(PAD_SVl(PL_op->op_targ));
85e6fe83 69 EXTEND(SP, 1);
533c011a 70 if (PL_op->op_flags & OPf_REF) {
85e6fe83 71 PUSHs(TARG);
93a17b20 72 RETURN;
78f9721b
SM
73 } else if (LVRET) {
74 if (GIMME == G_SCALAR)
75 Perl_croak(aTHX_ "Can't return array to lvalue scalar context");
76 PUSHs(TARG);
77 RETURN;
85e6fe83 78 }
13017935
SM
79 gimme = GIMME_V;
80 if (gimme == G_ARRAY) {
502c6561 81 const I32 maxarg = AvFILL(MUTABLE_AV(TARG)) + 1;
85e6fe83 82 EXTEND(SP, maxarg);
93965878
NIS
83 if (SvMAGICAL(TARG)) {
84 U32 i;
eb160463 85 for (i=0; i < (U32)maxarg; i++) {
502c6561 86 SV * const * const svp = av_fetch(MUTABLE_AV(TARG), i, FALSE);
3280af22 87 SP[i+1] = (svp) ? *svp : &PL_sv_undef;
93965878
NIS
88 }
89 }
90 else {
502c6561 91 Copy(AvARRAY((const AV *)TARG), SP+1, maxarg, SV*);
93965878 92 }
85e6fe83
LW
93 SP += maxarg;
94 }
13017935 95 else if (gimme == G_SCALAR) {
1b6737cc 96 SV* const sv = sv_newmortal();
502c6561 97 const I32 maxarg = AvFILL(MUTABLE_AV(TARG)) + 1;
85e6fe83
LW
98 sv_setiv(sv, maxarg);
99 PUSHs(sv);
100 }
101 RETURN;
93a17b20
LW
102}
103
104PP(pp_padhv)
105{
97aff369 106 dVAR; dSP; dTARGET;
54310121 107 I32 gimme;
108
93a17b20 109 XPUSHs(TARG);
533c011a 110 if (PL_op->op_private & OPpLVAL_INTRO)
a5911867
RGS
111 if (!(PL_op->op_private & OPpPAD_STATE))
112 SAVECLEARSV(PAD_SVl(PL_op->op_targ));
533c011a 113 if (PL_op->op_flags & OPf_REF)
93a17b20 114 RETURN;
78f9721b
SM
115 else if (LVRET) {
116 if (GIMME == G_SCALAR)
117 Perl_croak(aTHX_ "Can't return hash to lvalue scalar context");
118 RETURN;
119 }
54310121 120 gimme = GIMME_V;
121 if (gimme == G_ARRAY) {
cea2e8a9 122 RETURNOP(do_kv());
85e6fe83 123 }
54310121 124 else if (gimme == G_SCALAR) {
85fbaab2 125 SV* const sv = Perl_hv_scalar(aTHX_ MUTABLE_HV(TARG));
85e6fe83 126 SETs(sv);
85e6fe83 127 }
54310121 128 RETURN;
93a17b20
LW
129}
130
79072805
LW
131/* Translations. */
132
133PP(pp_rv2gv)
134{
97aff369 135 dVAR; dSP; dTOPss;
8ec5e241 136
ed6116ce 137 if (SvROK(sv)) {
a0d0e21e 138 wasref:
f5284f61
IZ
139 tryAMAGICunDEREF(to_gv);
140
ed6116ce 141 sv = SvRV(sv);
b1dadf13 142 if (SvTYPE(sv) == SVt_PVIO) {
159b6efe 143 GV * const gv = MUTABLE_GV(sv_newmortal());
b1dadf13 144 gv_init(gv, 0, "", 0, 0);
a45c7426 145 GvIOp(gv) = MUTABLE_IO(sv);
b37c2d43 146 SvREFCNT_inc_void_NN(sv);
ad64d0ec 147 sv = MUTABLE_SV(gv);
ef54e1a4 148 }
6e592b3a 149 else if (!isGV_with_GP(sv))
cea2e8a9 150 DIE(aTHX_ "Not a GLOB reference");
79072805
LW
151 }
152 else {
6e592b3a 153 if (!isGV_with_GP(sv)) {
a0d0e21e
LW
154 if (SvGMAGICAL(sv)) {
155 mg_get(sv);
156 if (SvROK(sv))
157 goto wasref;
158 }
afd1915d 159 if (!SvOK(sv) && sv != &PL_sv_undef) {
b13b2135 160 /* If this is a 'my' scalar and flag is set then vivify
853846ea 161 * NI-S 1999/05/07
b13b2135 162 */
ac53db4c 163 if (SvREADONLY(sv))
f1f66076 164 Perl_croak(aTHX_ "%s", PL_no_modify);
1d8d4d2a 165 if (PL_op->op_private & OPpDEREF) {
2c8ac474
GS
166 GV *gv;
167 if (cUNOP->op_targ) {
168 STRLEN len;
0bd48802
AL
169 SV * const namesv = PAD_SV(cUNOP->op_targ);
170 const char * const name = SvPV(namesv, len);
159b6efe 171 gv = MUTABLE_GV(newSV(0));
2c8ac474
GS
172 gv_init(gv, CopSTASH(PL_curcop), name, len, 0);
173 }
174 else {
0bd48802 175 const char * const name = CopSTASHPV(PL_curcop);
2c8ac474 176 gv = newGVgen(name);
1d8d4d2a 177 }
43230e26 178 prepare_SV_for_RV(sv);
ad64d0ec 179 SvRV_set(sv, MUTABLE_SV(gv));
853846ea 180 SvROK_on(sv);
1d8d4d2a 181 SvSETMAGIC(sv);
853846ea 182 goto wasref;
2c8ac474 183 }
533c011a
NIS
184 if (PL_op->op_flags & OPf_REF ||
185 PL_op->op_private & HINT_STRICT_REFS)
cea2e8a9 186 DIE(aTHX_ PL_no_usym, "a symbol");
599cee73 187 if (ckWARN(WARN_UNINITIALIZED))
29489e7c 188 report_uninit(sv);
a0d0e21e
LW
189 RETSETUNDEF;
190 }
35cd451c
GS
191 if ((PL_op->op_flags & OPf_SPECIAL) &&
192 !(PL_op->op_flags & OPf_MOD))
193 {
ad64d0ec 194 SV * const temp = MUTABLE_SV(gv_fetchsv(sv, 0, SVt_PVGV));
7a5fd60d
NC
195 if (!temp
196 && (!is_gv_magical_sv(sv,0)
ad64d0ec
NC
197 || !(sv = MUTABLE_SV(gv_fetchsv(sv, GV_ADD,
198 SVt_PVGV))))) {
35cd451c 199 RETSETUNDEF;
c9d5ac95 200 }
7a5fd60d 201 sv = temp;
35cd451c
GS
202 }
203 else {
204 if (PL_op->op_private & HINT_STRICT_REFS)
7a5fd60d 205 DIE(aTHX_ PL_no_symref_sv, sv, "a symbol");
e26df76a
NC
206 if ((PL_op->op_private & (OPpLVAL_INTRO|OPpDONT_INIT_GV))
207 == OPpDONT_INIT_GV) {
208 /* We are the target of a coderef assignment. Return
209 the scalar unchanged, and let pp_sasssign deal with
210 things. */
211 RETURN;
212 }
ad64d0ec 213 sv = MUTABLE_SV(gv_fetchsv(sv, GV_ADD, SVt_PVGV));
35cd451c 214 }
93a17b20 215 }
79072805 216 }
533c011a 217 if (PL_op->op_private & OPpLVAL_INTRO)
159b6efe 218 save_gp(MUTABLE_GV(sv), !(PL_op->op_flags & OPf_SPECIAL));
79072805
LW
219 SETs(sv);
220 RETURN;
221}
222
dc3c76f8
NC
223/* Helper function for pp_rv2sv and pp_rv2av */
224GV *
fe9845cc
RB
225Perl_softref2xv(pTHX_ SV *const sv, const char *const what,
226 const svtype type, SV ***spp)
dc3c76f8
NC
227{
228 dVAR;
229 GV *gv;
230
7918f24d
NC
231 PERL_ARGS_ASSERT_SOFTREF2XV;
232
dc3c76f8
NC
233 if (PL_op->op_private & HINT_STRICT_REFS) {
234 if (SvOK(sv))
235 Perl_die(aTHX_ PL_no_symref_sv, sv, what);
236 else
237 Perl_die(aTHX_ PL_no_usym, what);
238 }
239 if (!SvOK(sv)) {
240 if (PL_op->op_flags & OPf_REF)
241 Perl_die(aTHX_ PL_no_usym, what);
242 if (ckWARN(WARN_UNINITIALIZED))
243 report_uninit(sv);
244 if (type != SVt_PV && GIMME_V == G_ARRAY) {
245 (*spp)--;
246 return NULL;
247 }
248 **spp = &PL_sv_undef;
249 return NULL;
250 }
251 if ((PL_op->op_flags & OPf_SPECIAL) &&
252 !(PL_op->op_flags & OPf_MOD))
253 {
81e3fc25 254 gv = gv_fetchsv(sv, 0, type);
dc3c76f8
NC
255 if (!gv
256 && (!is_gv_magical_sv(sv,0)
81e3fc25 257 || !(gv = gv_fetchsv(sv, GV_ADD, type))))
dc3c76f8
NC
258 {
259 **spp = &PL_sv_undef;
260 return NULL;
261 }
262 }
263 else {
81e3fc25 264 gv = gv_fetchsv(sv, GV_ADD, type);
dc3c76f8
NC
265 }
266 return gv;
267}
268
79072805
LW
269PP(pp_rv2sv)
270{
97aff369 271 dVAR; dSP; dTOPss;
c445ea15 272 GV *gv = NULL;
79072805 273
ed6116ce 274 if (SvROK(sv)) {
a0d0e21e 275 wasref:
f5284f61
IZ
276 tryAMAGICunDEREF(to_sv);
277
ed6116ce 278 sv = SvRV(sv);
79072805
LW
279 switch (SvTYPE(sv)) {
280 case SVt_PVAV:
281 case SVt_PVHV:
282 case SVt_PVCV:
cbae9b9f
YST
283 case SVt_PVFM:
284 case SVt_PVIO:
cea2e8a9 285 DIE(aTHX_ "Not a SCALAR reference");
42d0e0b7 286 default: NOOP;
79072805
LW
287 }
288 }
289 else {
159b6efe 290 gv = MUTABLE_GV(sv);
748a9306 291
6e592b3a 292 if (!isGV_with_GP(gv)) {
a0d0e21e
LW
293 if (SvGMAGICAL(sv)) {
294 mg_get(sv);
295 if (SvROK(sv))
296 goto wasref;
297 }
dc3c76f8
NC
298 gv = Perl_softref2xv(aTHX_ sv, "a SCALAR", SVt_PV, &sp);
299 if (!gv)
300 RETURN;
463ee0b2 301 }
29c711a3 302 sv = GvSVn(gv);
a0d0e21e 303 }
533c011a 304 if (PL_op->op_flags & OPf_MOD) {
82d03984
RGS
305 if (PL_op->op_private & OPpLVAL_INTRO) {
306 if (cUNOP->op_first->op_type == OP_NULL)
159b6efe 307 sv = save_scalar(MUTABLE_GV(TOPs));
82d03984
RGS
308 else if (gv)
309 sv = save_scalar(gv);
310 else
f1f66076 311 Perl_croak(aTHX_ "%s", PL_no_localize_ref);
82d03984 312 }
533c011a
NIS
313 else if (PL_op->op_private & OPpDEREF)
314 vivify_ref(sv, PL_op->op_private & OPpDEREF);
79072805 315 }
a0d0e21e 316 SETs(sv);
79072805
LW
317 RETURN;
318}
319
320PP(pp_av2arylen)
321{
97aff369 322 dVAR; dSP;
502c6561
NC
323 AV * const av = MUTABLE_AV(TOPs);
324 SV ** const sv = Perl_av_arylen_p(aTHX_ MUTABLE_AV(av));
a3874608 325 if (!*sv) {
b9f83d2f 326 *sv = newSV_type(SVt_PVMG);
ad64d0ec 327 sv_magic(*sv, MUTABLE_SV(av), PERL_MAGIC_arylen, NULL, 0);
79072805 328 }
a3874608 329 SETs(*sv);
79072805
LW
330 RETURN;
331}
332
a0d0e21e
LW
333PP(pp_pos)
334{
97aff369 335 dVAR; dSP; dTARGET; dPOPss;
8ec5e241 336
78f9721b 337 if (PL_op->op_flags & OPf_MOD || LVRET) {
5f05dabc 338 if (SvTYPE(TARG) < SVt_PVLV) {
339 sv_upgrade(TARG, SVt_PVLV);
c445ea15 340 sv_magic(TARG, NULL, PERL_MAGIC_pos, NULL, 0);
5f05dabc 341 }
342
343 LvTYPE(TARG) = '.';
6ff81951
GS
344 if (LvTARG(TARG) != sv) {
345 if (LvTARG(TARG))
346 SvREFCNT_dec(LvTARG(TARG));
b37c2d43 347 LvTARG(TARG) = SvREFCNT_inc_simple(sv);
6ff81951 348 }
a0d0e21e
LW
349 PUSHs(TARG); /* no SvSETMAGIC */
350 RETURN;
351 }
352 else {
a0d0e21e 353 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
1b6737cc 354 const MAGIC * const mg = mg_find(sv, PERL_MAGIC_regex_global);
565764a8 355 if (mg && mg->mg_len >= 0) {
a0ed51b3 356 I32 i = mg->mg_len;
7e2040f0 357 if (DO_UTF8(sv))
a0ed51b3 358 sv_pos_b2u(sv, &i);
fc15ae8f 359 PUSHi(i + CopARYBASE_get(PL_curcop));
a0d0e21e
LW
360 RETURN;
361 }
362 }
363 RETPUSHUNDEF;
364 }
365}
366
79072805
LW
367PP(pp_rv2cv)
368{
97aff369 369 dVAR; dSP;
79072805 370 GV *gv;
1eced8f8 371 HV *stash_unused;
c445ea15
AL
372 const I32 flags = (PL_op->op_flags & OPf_SPECIAL)
373 ? 0
374 : ((PL_op->op_private & (OPpLVAL_INTRO|OPpMAY_RETURN_CONSTANT)) == OPpMAY_RETURN_CONSTANT)
375 ? GV_ADD|GV_NOEXPAND
376 : GV_ADD;
4633a7c4
LW
377 /* We usually try to add a non-existent subroutine in case of AUTOLOAD. */
378 /* (But not in defined().) */
e26df76a 379
1eced8f8 380 CV *cv = sv_2cv(TOPs, &stash_unused, &gv, flags);
07055b4c
CS
381 if (cv) {
382 if (CvCLONE(cv))
ad64d0ec 383 cv = MUTABLE_CV(sv_2mortal(MUTABLE_SV(cv_clone(cv))));
d32f2495
SC
384 if ((PL_op->op_private & OPpLVAL_INTRO)) {
385 if (gv && GvCV(gv) == cv && (gv = gv_autoload4(GvSTASH(gv), GvNAME(gv), GvNAMELEN(gv), FALSE)))
386 cv = GvCV(gv);
387 if (!CvLVALUE(cv))
388 DIE(aTHX_ "Can't modify non-lvalue subroutine call");
389 }
07055b4c 390 }
e26df76a 391 else if ((flags == (GV_ADD|GV_NOEXPAND)) && gv && SvROK(gv)) {
ea726b52 392 cv = MUTABLE_CV(gv);
e26df76a 393 }
07055b4c 394 else
ea726b52 395 cv = MUTABLE_CV(&PL_sv_undef);
ad64d0ec 396 SETs(MUTABLE_SV(cv));
79072805
LW
397 RETURN;
398}
399
c07a80fd 400PP(pp_prototype)
401{
97aff369 402 dVAR; dSP;
c07a80fd 403 CV *cv;
404 HV *stash;
405 GV *gv;
fabdb6c0 406 SV *ret = &PL_sv_undef;
c07a80fd 407
b6c543e3 408 if (SvPOK(TOPs) && SvCUR(TOPs) >= 7) {
e3f73d4e 409 const char * s = SvPVX_const(TOPs);
b6c543e3 410 if (strnEQ(s, "CORE::", 6)) {
5458a98a 411 const int code = keyword(s + 6, SvCUR(TOPs) - 6, 1);
b6c543e3
IZ
412 if (code < 0) { /* Overridable. */
413#define MAX_ARGS_OP ((sizeof(I32) - 1) * 2)
59b085e1 414 int i = 0, n = 0, seen_question = 0, defgv = 0;
b6c543e3
IZ
415 I32 oa;
416 char str[ MAX_ARGS_OP * 2 + 2 ]; /* One ';', one '\0' */
417
bdf1bb36 418 if (code == -KEY_chop || code == -KEY_chomp
f23102e2 419 || code == -KEY_exec || code == -KEY_system)
77bc9082 420 goto set;
d116c547 421 if (code == -KEY_mkdir) {
84bafc02 422 ret = newSVpvs_flags("_;$", SVs_TEMP);
d116c547
RGS
423 goto set;
424 }
e3f73d4e
RGS
425 if (code == -KEY_readpipe) {
426 s = "CORE::backtick";
427 }
b6c543e3 428 while (i < MAXO) { /* The slow way. */
22c35a8c
GS
429 if (strEQ(s + 6, PL_op_name[i])
430 || strEQ(s + 6, PL_op_desc[i]))
431 {
b6c543e3 432 goto found;
22c35a8c 433 }
b6c543e3
IZ
434 i++;
435 }
436 goto nonesuch; /* Should not happen... */
437 found:
59b085e1 438 defgv = PL_opargs[i] & OA_DEFGV;
22c35a8c 439 oa = PL_opargs[i] >> OASHIFT;
b6c543e3 440 while (oa) {
59b085e1 441 if (oa & OA_OPTIONAL && !seen_question && !defgv) {
b6c543e3
IZ
442 seen_question = 1;
443 str[n++] = ';';
ef54e1a4 444 }
b13b2135 445 if ((oa & (OA_OPTIONAL - 1)) >= OA_AVREF
6e97e420
SC
446 && (oa & (OA_OPTIONAL - 1)) <= OA_SCALARREF
447 /* But globs are already references (kinda) */
448 && (oa & (OA_OPTIONAL - 1)) != OA_FILEREF
449 ) {
b6c543e3
IZ
450 str[n++] = '\\';
451 }
b6c543e3
IZ
452 str[n++] = ("?$@@%&*$")[oa & (OA_OPTIONAL - 1)];
453 oa = oa >> 4;
454 }
59b085e1
RGS
455 if (defgv && str[n - 1] == '$')
456 str[n - 1] = '_';
b6c543e3 457 str[n++] = '\0';
59cd0e26 458 ret = newSVpvn_flags(str, n - 1, SVs_TEMP);
ef54e1a4
JH
459 }
460 else if (code) /* Non-Overridable */
b6c543e3
IZ
461 goto set;
462 else { /* None such */
463 nonesuch:
d470f89e 464 DIE(aTHX_ "Can't find an opnumber for \"%s\"", s+6);
b6c543e3
IZ
465 }
466 }
467 }
f2c0649b 468 cv = sv_2cv(TOPs, &stash, &gv, 0);
5f05dabc 469 if (cv && SvPOK(cv))
59cd0e26 470 ret = newSVpvn_flags(SvPVX_const(cv), SvCUR(cv), SVs_TEMP);
b6c543e3 471 set:
c07a80fd 472 SETs(ret);
473 RETURN;
474}
475
a0d0e21e
LW
476PP(pp_anoncode)
477{
97aff369 478 dVAR; dSP;
ea726b52 479 CV *cv = MUTABLE_CV(PAD_SV(PL_op->op_targ));
a5f75d66 480 if (CvCLONE(cv))
ad64d0ec 481 cv = MUTABLE_CV(sv_2mortal(MUTABLE_SV(cv_clone(cv))));
5f05dabc 482 EXTEND(SP,1);
ad64d0ec 483 PUSHs(MUTABLE_SV(cv));
a0d0e21e
LW
484 RETURN;
485}
486
487PP(pp_srefgen)
79072805 488{
97aff369 489 dVAR; dSP;
71be2cbc 490 *SP = refto(*SP);
79072805 491 RETURN;
8ec5e241 492}
a0d0e21e
LW
493
494PP(pp_refgen)
495{
97aff369 496 dVAR; dSP; dMARK;
a0d0e21e 497 if (GIMME != G_ARRAY) {
5f0b1d4e
GS
498 if (++MARK <= SP)
499 *MARK = *SP;
500 else
3280af22 501 *MARK = &PL_sv_undef;
5f0b1d4e
GS
502 *MARK = refto(*MARK);
503 SP = MARK;
504 RETURN;
a0d0e21e 505 }
bbce6d69 506 EXTEND_MORTAL(SP - MARK);
71be2cbc 507 while (++MARK <= SP)
508 *MARK = refto(*MARK);
a0d0e21e 509 RETURN;
79072805
LW
510}
511
76e3520e 512STATIC SV*
cea2e8a9 513S_refto(pTHX_ SV *sv)
71be2cbc 514{
97aff369 515 dVAR;
71be2cbc 516 SV* rv;
517
7918f24d
NC
518 PERL_ARGS_ASSERT_REFTO;
519
71be2cbc 520 if (SvTYPE(sv) == SVt_PVLV && LvTYPE(sv) == 'y') {
521 if (LvTARGLEN(sv))
68dc0745 522 vivify_defelem(sv);
523 if (!(sv = LvTARG(sv)))
3280af22 524 sv = &PL_sv_undef;
0dd88869 525 else
b37c2d43 526 SvREFCNT_inc_void_NN(sv);
71be2cbc 527 }
d8b46c1b 528 else if (SvTYPE(sv) == SVt_PVAV) {
502c6561
NC
529 if (!AvREAL((const AV *)sv) && AvREIFY((const AV *)sv))
530 av_reify(MUTABLE_AV(sv));
d8b46c1b 531 SvTEMP_off(sv);
b37c2d43 532 SvREFCNT_inc_void_NN(sv);
d8b46c1b 533 }
f2933f5f
DM
534 else if (SvPADTMP(sv) && !IS_PADGV(sv))
535 sv = newSVsv(sv);
71be2cbc 536 else {
537 SvTEMP_off(sv);
b37c2d43 538 SvREFCNT_inc_void_NN(sv);
71be2cbc 539 }
540 rv = sv_newmortal();
4df7f6af 541 sv_upgrade(rv, SVt_IV);
b162af07 542 SvRV_set(rv, sv);
71be2cbc 543 SvROK_on(rv);
544 return rv;
545}
546
79072805
LW
547PP(pp_ref)
548{
97aff369 549 dVAR; dSP; dTARGET;
e1ec3a88 550 const char *pv;
1b6737cc 551 SV * const sv = POPs;
f12c7020 552
5b295bef
RD
553 if (sv)
554 SvGETMAGIC(sv);
f12c7020 555
a0d0e21e 556 if (!sv || !SvROK(sv))
4633a7c4 557 RETPUSHNO;
79072805 558
1b6737cc 559 pv = sv_reftype(SvRV(sv),TRUE);
463ee0b2 560 PUSHp(pv, strlen(pv));
79072805
LW
561 RETURN;
562}
563
564PP(pp_bless)
565{
97aff369 566 dVAR; dSP;
463ee0b2 567 HV *stash;
79072805 568
463ee0b2 569 if (MAXARG == 1)
11faa288 570 stash = CopSTASH(PL_curcop);
7b8d334a 571 else {
1b6737cc 572 SV * const ssv = POPs;
7b8d334a 573 STRLEN len;
e1ec3a88 574 const char *ptr;
81689caa 575
016a42f3 576 if (ssv && !SvGMAGICAL(ssv) && !SvAMAGIC(ssv) && SvROK(ssv))
81689caa 577 Perl_croak(aTHX_ "Attempt to bless into a reference");
5c144d81 578 ptr = SvPV_const(ssv,len);
041457d9 579 if (len == 0 && ckWARN(WARN_MISC))
9014280d 580 Perl_warner(aTHX_ packWARN(WARN_MISC),
599cee73 581 "Explicit blessing to '' (assuming package main)");
da51bb9b 582 stash = gv_stashpvn(ptr, len, GV_ADD);
7b8d334a 583 }
a0d0e21e 584
5d3fdfeb 585 (void)sv_bless(TOPs, stash);
79072805
LW
586 RETURN;
587}
588
fb73857a 589PP(pp_gelem)
590{
97aff369 591 dVAR; dSP;
b13b2135 592
1b6737cc
AL
593 SV *sv = POPs;
594 const char * const elem = SvPV_nolen_const(sv);
159b6efe 595 GV * const gv = MUTABLE_GV(POPs);
c445ea15 596 SV * tmpRef = NULL;
1b6737cc 597
c445ea15 598 sv = NULL;
c4ba80c3
NC
599 if (elem) {
600 /* elem will always be NUL terminated. */
1b6737cc 601 const char * const second_letter = elem + 1;
c4ba80c3
NC
602 switch (*elem) {
603 case 'A':
1b6737cc 604 if (strEQ(second_letter, "RRAY"))
ad64d0ec 605 tmpRef = MUTABLE_SV(GvAV(gv));
c4ba80c3
NC
606 break;
607 case 'C':
1b6737cc 608 if (strEQ(second_letter, "ODE"))
ad64d0ec 609 tmpRef = MUTABLE_SV(GvCVu(gv));
c4ba80c3
NC
610 break;
611 case 'F':
1b6737cc 612 if (strEQ(second_letter, "ILEHANDLE")) {
c4ba80c3
NC
613 /* finally deprecated in 5.8.0 */
614 deprecate("*glob{FILEHANDLE}");
ad64d0ec 615 tmpRef = MUTABLE_SV(GvIOp(gv));
c4ba80c3
NC
616 }
617 else
1b6737cc 618 if (strEQ(second_letter, "ORMAT"))
ad64d0ec 619 tmpRef = MUTABLE_SV(GvFORM(gv));
c4ba80c3
NC
620 break;
621 case 'G':
1b6737cc 622 if (strEQ(second_letter, "LOB"))
ad64d0ec 623 tmpRef = MUTABLE_SV(gv);
c4ba80c3
NC
624 break;
625 case 'H':
1b6737cc 626 if (strEQ(second_letter, "ASH"))
ad64d0ec 627 tmpRef = MUTABLE_SV(GvHV(gv));
c4ba80c3
NC
628 break;
629 case 'I':
1b6737cc 630 if (*second_letter == 'O' && !elem[2])
ad64d0ec 631 tmpRef = MUTABLE_SV(GvIOp(gv));
c4ba80c3
NC
632 break;
633 case 'N':
1b6737cc 634 if (strEQ(second_letter, "AME"))
a663657d 635 sv = newSVhek(GvNAME_HEK(gv));
c4ba80c3
NC
636 break;
637 case 'P':
1b6737cc 638 if (strEQ(second_letter, "ACKAGE")) {
7fa3a4ab
NC
639 const HV * const stash = GvSTASH(gv);
640 const HEK * const hek = stash ? HvNAME_HEK(stash) : NULL;
396482e1 641 sv = hek ? newSVhek(hek) : newSVpvs("__ANON__");
c4ba80c3
NC
642 }
643 break;
644 case 'S':
1b6737cc 645 if (strEQ(second_letter, "CALAR"))
f9d52e31 646 tmpRef = GvSVn(gv);
c4ba80c3 647 break;
39b99f21 648 }
fb73857a 649 }
76e3520e
GS
650 if (tmpRef)
651 sv = newRV(tmpRef);
fb73857a 652 if (sv)
653 sv_2mortal(sv);
654 else
3280af22 655 sv = &PL_sv_undef;
fb73857a 656 XPUSHs(sv);
657 RETURN;
658}
659
a0d0e21e 660/* Pattern matching */
79072805 661
a0d0e21e 662PP(pp_study)
79072805 663{
97aff369 664 dVAR; dSP; dPOPss;
a0d0e21e
LW
665 register unsigned char *s;
666 register I32 pos;
667 register I32 ch;
668 register I32 *sfirst;
669 register I32 *snext;
a0d0e21e
LW
670 STRLEN len;
671
3280af22 672 if (sv == PL_lastscream) {
1e422769 673 if (SvSCREAM(sv))
674 RETPUSHYES;
675 }
a4f4e906
NC
676 s = (unsigned char*)(SvPV(sv, len));
677 pos = len;
c9b9f909 678 if (pos <= 0 || !SvPOK(sv) || SvUTF8(sv)) {
a4f4e906
NC
679 /* No point in studying a zero length string, and not safe to study
680 anything that doesn't appear to be a simple scalar (and hence might
681 change between now and when the regexp engine runs without our set
bd473224 682 magic ever running) such as a reference to an object with overloaded
a4f4e906
NC
683 stringification. */
684 RETPUSHNO;
685 }
686
687 if (PL_lastscream) {
688 SvSCREAM_off(PL_lastscream);
689 SvREFCNT_dec(PL_lastscream);
c07a80fd 690 }
b37c2d43 691 PL_lastscream = SvREFCNT_inc_simple(sv);
1e422769 692
693 s = (unsigned char*)(SvPV(sv, len));
694 pos = len;
695 if (pos <= 0)
696 RETPUSHNO;
3280af22
NIS
697 if (pos > PL_maxscream) {
698 if (PL_maxscream < 0) {
699 PL_maxscream = pos + 80;
a02a5408
JC
700 Newx(PL_screamfirst, 256, I32);
701 Newx(PL_screamnext, PL_maxscream, I32);
79072805
LW
702 }
703 else {
3280af22
NIS
704 PL_maxscream = pos + pos / 4;
705 Renew(PL_screamnext, PL_maxscream, I32);
79072805 706 }
79072805 707 }
a0d0e21e 708
3280af22
NIS
709 sfirst = PL_screamfirst;
710 snext = PL_screamnext;
a0d0e21e
LW
711
712 if (!sfirst || !snext)
cea2e8a9 713 DIE(aTHX_ "do_study: out of memory");
a0d0e21e
LW
714
715 for (ch = 256; ch; --ch)
716 *sfirst++ = -1;
717 sfirst -= 256;
718
719 while (--pos >= 0) {
1b6737cc 720 register const I32 ch = s[pos];
a0d0e21e
LW
721 if (sfirst[ch] >= 0)
722 snext[pos] = sfirst[ch] - pos;
723 else
724 snext[pos] = -pos;
725 sfirst[ch] = pos;
79072805
LW
726 }
727
c07a80fd 728 SvSCREAM_on(sv);
14befaf4 729 /* piggyback on m//g magic */
c445ea15 730 sv_magic(sv, NULL, PERL_MAGIC_regex_global, NULL, 0);
1e422769 731 RETPUSHYES;
79072805
LW
732}
733
a0d0e21e 734PP(pp_trans)
79072805 735{
97aff369 736 dVAR; dSP; dTARG;
a0d0e21e
LW
737 SV *sv;
738
533c011a 739 if (PL_op->op_flags & OPf_STACKED)
a0d0e21e 740 sv = POPs;
59f00321
RGS
741 else if (PL_op->op_private & OPpTARGET_MY)
742 sv = GETTARGET;
79072805 743 else {
54b9620d 744 sv = DEFSV;
a0d0e21e 745 EXTEND(SP,1);
79072805 746 }
adbc6bb1 747 TARG = sv_newmortal();
4757a243 748 PUSHi(do_trans(sv));
a0d0e21e 749 RETURN;
79072805
LW
750}
751
a0d0e21e 752/* Lvalue operators. */
79072805 753
a0d0e21e
LW
754PP(pp_schop)
755{
97aff369 756 dVAR; dSP; dTARGET;
a0d0e21e
LW
757 do_chop(TARG, TOPs);
758 SETTARG;
759 RETURN;
79072805
LW
760}
761
a0d0e21e 762PP(pp_chop)
79072805 763{
97aff369 764 dVAR; dSP; dMARK; dTARGET; dORIGMARK;
2ec6af5f
RG
765 while (MARK < SP)
766 do_chop(TARG, *++MARK);
767 SP = ORIGMARK;
b59aed67 768 XPUSHTARG;
a0d0e21e 769 RETURN;
79072805
LW
770}
771
a0d0e21e 772PP(pp_schomp)
79072805 773{
97aff369 774 dVAR; dSP; dTARGET;
a0d0e21e
LW
775 SETi(do_chomp(TOPs));
776 RETURN;
79072805
LW
777}
778
a0d0e21e 779PP(pp_chomp)
79072805 780{
97aff369 781 dVAR; dSP; dMARK; dTARGET;
a0d0e21e 782 register I32 count = 0;
8ec5e241 783
a0d0e21e
LW
784 while (SP > MARK)
785 count += do_chomp(POPs);
b59aed67 786 XPUSHi(count);
a0d0e21e 787 RETURN;
79072805
LW
788}
789
a0d0e21e
LW
790PP(pp_undef)
791{
97aff369 792 dVAR; dSP;
a0d0e21e
LW
793 SV *sv;
794
533c011a 795 if (!PL_op->op_private) {
774d564b 796 EXTEND(SP, 1);
a0d0e21e 797 RETPUSHUNDEF;
774d564b 798 }
79072805 799
a0d0e21e
LW
800 sv = POPs;
801 if (!sv)
802 RETPUSHUNDEF;
85e6fe83 803
765f542d 804 SV_CHECK_THINKFIRST_COW_DROP(sv);
85e6fe83 805
a0d0e21e
LW
806 switch (SvTYPE(sv)) {
807 case SVt_NULL:
808 break;
809 case SVt_PVAV:
502c6561 810 av_undef(MUTABLE_AV(sv));
a0d0e21e
LW
811 break;
812 case SVt_PVHV:
85fbaab2 813 hv_undef(MUTABLE_HV(sv));
a0d0e21e
LW
814 break;
815 case SVt_PVCV:
126f53f3 816 if (cv_const_sv((const CV *)sv) && ckWARN(WARN_MISC))
9014280d 817 Perl_warner(aTHX_ packWARN(WARN_MISC), "Constant subroutine %s undefined",
ea726b52
NC
818 CvANON((const CV *)sv) ? "(anonymous)"
819 : GvENAME(CvGV((const CV *)sv)));
5f66b61c 820 /* FALLTHROUGH */
9607fc9c 821 case SVt_PVFM:
6fc92669
GS
822 {
823 /* let user-undef'd sub keep its identity */
ea726b52
NC
824 GV* const gv = CvGV((const CV *)sv);
825 cv_undef(MUTABLE_CV(sv));
826 CvGV((const CV *)sv) = gv;
6fc92669 827 }
a0d0e21e 828 break;
8e07c86e 829 case SVt_PVGV:
6e592b3a 830 if (SvFAKE(sv)) {
3280af22 831 SvSetMagicSV(sv, &PL_sv_undef);
6e592b3a
BM
832 break;
833 }
834 else if (isGV_with_GP(sv)) {
20408e3c 835 GP *gp;
dd69841b
BB
836 HV *stash;
837
838 /* undef *Foo:: */
159b6efe 839 if((stash = GvHV((const GV *)sv)) && HvNAME_get(stash))
dd69841b
BB
840 mro_isa_changed_in(stash);
841 /* undef *Pkg::meth_name ... */
159b6efe
NC
842 else if(GvCVu((const GV *)sv) && (stash = GvSTASH((const GV *)sv))
843 && HvNAME_get(stash))
dd69841b
BB
844 mro_method_changed_in(stash);
845
159b6efe 846 gp_free(MUTABLE_GV(sv));
a02a5408 847 Newxz(gp, 1, GP);
20408e3c 848 GvGP(sv) = gp_ref(gp);
561b68a9 849 GvSV(sv) = newSV(0);
57843af0 850 GvLINE(sv) = CopLINE(PL_curcop);
159b6efe 851 GvEGV(sv) = MUTABLE_GV(sv);
20408e3c 852 GvMULTI_on(sv);
6e592b3a 853 break;
20408e3c 854 }
6e592b3a 855 /* FALL THROUGH */
a0d0e21e 856 default:
b15aece3 857 if (SvTYPE(sv) >= SVt_PV && SvPVX_const(sv) && SvLEN(sv)) {
8bd4d4c5 858 SvPV_free(sv);
c445ea15 859 SvPV_set(sv, NULL);
4633a7c4 860 SvLEN_set(sv, 0);
a0d0e21e 861 }
0c34ef67 862 SvOK_off(sv);
4633a7c4 863 SvSETMAGIC(sv);
79072805 864 }
a0d0e21e
LW
865
866 RETPUSHUNDEF;
79072805
LW
867}
868
a0d0e21e 869PP(pp_predec)
79072805 870{
97aff369 871 dVAR; dSP;
6e592b3a 872 if (SvTYPE(TOPs) >= SVt_PVAV || isGV_with_GP(TOPs))
f1f66076 873 DIE(aTHX_ "%s", PL_no_modify);
3510b4a1
NC
874 if (!SvREADONLY(TOPs) && SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)
875 && SvIVX(TOPs) != IV_MIN)
55497cff 876 {
45977657 877 SvIV_set(TOPs, SvIVX(TOPs) - 1);
55497cff 878 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
748a9306
LW
879 }
880 else
881 sv_dec(TOPs);
a0d0e21e
LW
882 SvSETMAGIC(TOPs);
883 return NORMAL;
884}
79072805 885
a0d0e21e
LW
886PP(pp_postinc)
887{
97aff369 888 dVAR; dSP; dTARGET;
6e592b3a 889 if (SvTYPE(TOPs) >= SVt_PVAV || isGV_with_GP(TOPs))
f1f66076 890 DIE(aTHX_ "%s", PL_no_modify);
a0d0e21e 891 sv_setsv(TARG, TOPs);
3510b4a1
NC
892 if (!SvREADONLY(TOPs) && SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)
893 && SvIVX(TOPs) != IV_MAX)
55497cff 894 {
45977657 895 SvIV_set(TOPs, SvIVX(TOPs) + 1);
55497cff 896 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
748a9306
LW
897 }
898 else
899 sv_inc(TOPs);
a0d0e21e 900 SvSETMAGIC(TOPs);
1e54a23f 901 /* special case for undef: see thread at 2003-03/msg00536.html in archive */
a0d0e21e
LW
902 if (!SvOK(TARG))
903 sv_setiv(TARG, 0);
904 SETs(TARG);
905 return NORMAL;
906}
79072805 907
a0d0e21e
LW
908PP(pp_postdec)
909{
97aff369 910 dVAR; dSP; dTARGET;
6e592b3a 911 if (SvTYPE(TOPs) >= SVt_PVAV || isGV_with_GP(TOPs))
f1f66076 912 DIE(aTHX_ "%s", PL_no_modify);
a0d0e21e 913 sv_setsv(TARG, TOPs);
3510b4a1
NC
914 if (!SvREADONLY(TOPs) && SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)
915 && SvIVX(TOPs) != IV_MIN)
55497cff 916 {
45977657 917 SvIV_set(TOPs, SvIVX(TOPs) - 1);
55497cff 918 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
748a9306
LW
919 }
920 else
921 sv_dec(TOPs);
a0d0e21e
LW
922 SvSETMAGIC(TOPs);
923 SETs(TARG);
924 return NORMAL;
925}
79072805 926
a0d0e21e
LW
927/* Ordinary operators. */
928
929PP(pp_pow)
930{
800401ee 931 dVAR; dSP; dATARGET; SV *svl, *svr;
58d76dfd 932#ifdef PERL_PRESERVE_IVUV
52a96ae6
HS
933 bool is_int = 0;
934#endif
935 tryAMAGICbin(pow,opASSIGN);
800401ee
JH
936 svl = sv_2num(TOPm1s);
937 svr = sv_2num(TOPs);
52a96ae6
HS
938#ifdef PERL_PRESERVE_IVUV
939 /* For integer to integer power, we do the calculation by hand wherever
940 we're sure it is safe; otherwise we call pow() and try to convert to
941 integer afterwards. */
58d76dfd 942 {
800401ee
JH
943 SvIV_please(svr);
944 if (SvIOK(svr)) {
945 SvIV_please(svl);
946 if (SvIOK(svl)) {
900658e3
PF
947 UV power;
948 bool baseuok;
949 UV baseuv;
950
800401ee
JH
951 if (SvUOK(svr)) {
952 power = SvUVX(svr);
900658e3 953 } else {
800401ee 954 const IV iv = SvIVX(svr);
900658e3
PF
955 if (iv >= 0) {
956 power = iv;
957 } else {
958 goto float_it; /* Can't do negative powers this way. */
959 }
960 }
961
800401ee 962 baseuok = SvUOK(svl);
900658e3 963 if (baseuok) {
800401ee 964 baseuv = SvUVX(svl);
900658e3 965 } else {
800401ee 966 const IV iv = SvIVX(svl);
900658e3
PF
967 if (iv >= 0) {
968 baseuv = iv;
969 baseuok = TRUE; /* effectively it's a UV now */
970 } else {
971 baseuv = -iv; /* abs, baseuok == false records sign */
972 }
973 }
52a96ae6
HS
974 /* now we have integer ** positive integer. */
975 is_int = 1;
976
977 /* foo & (foo - 1) is zero only for a power of 2. */
58d76dfd 978 if (!(baseuv & (baseuv - 1))) {
52a96ae6 979 /* We are raising power-of-2 to a positive integer.
58d76dfd
JH
980 The logic here will work for any base (even non-integer
981 bases) but it can be less accurate than
982 pow (base,power) or exp (power * log (base)) when the
983 intermediate values start to spill out of the mantissa.
984 With powers of 2 we know this can't happen.
985 And powers of 2 are the favourite thing for perl
986 programmers to notice ** not doing what they mean. */
987 NV result = 1.0;
988 NV base = baseuok ? baseuv : -(NV)baseuv;
900658e3
PF
989
990 if (power & 1) {
991 result *= base;
992 }
993 while (power >>= 1) {
994 base *= base;
995 if (power & 1) {
996 result *= base;
997 }
998 }
58d76dfd
JH
999 SP--;
1000 SETn( result );
800401ee 1001 SvIV_please(svr);
58d76dfd 1002 RETURN;
52a96ae6
HS
1003 } else {
1004 register unsigned int highbit = 8 * sizeof(UV);
900658e3
PF
1005 register unsigned int diff = 8 * sizeof(UV);
1006 while (diff >>= 1) {
1007 highbit -= diff;
1008 if (baseuv >> highbit) {
1009 highbit += diff;
1010 }
52a96ae6
HS
1011 }
1012 /* we now have baseuv < 2 ** highbit */
1013 if (power * highbit <= 8 * sizeof(UV)) {
1014 /* result will definitely fit in UV, so use UV math
1015 on same algorithm as above */
1016 register UV result = 1;
1017 register UV base = baseuv;
900658e3
PF
1018 const bool odd_power = (bool)(power & 1);
1019 if (odd_power) {
1020 result *= base;
1021 }
1022 while (power >>= 1) {
1023 base *= base;
1024 if (power & 1) {
52a96ae6 1025 result *= base;
52a96ae6
HS
1026 }
1027 }
1028 SP--;
0615a994 1029 if (baseuok || !odd_power)
52a96ae6
HS
1030 /* answer is positive */
1031 SETu( result );
1032 else if (result <= (UV)IV_MAX)
1033 /* answer negative, fits in IV */
1034 SETi( -(IV)result );
1035 else if (result == (UV)IV_MIN)
1036 /* 2's complement assumption: special case IV_MIN */
1037 SETi( IV_MIN );
1038 else
1039 /* answer negative, doesn't fit */
1040 SETn( -(NV)result );
1041 RETURN;
1042 }
1043 }
1044 }
1045 }
58d76dfd 1046 }
52a96ae6 1047 float_it:
58d76dfd 1048#endif
a0d0e21e 1049 {
4efa5a16
RD
1050 NV right = SvNV(svr);
1051 NV left = SvNV(svl);
1052 (void)POPs;
3aaeb624
JA
1053
1054#if defined(USE_LONG_DOUBLE) && defined(HAS_AIX_POWL_NEG_BASE_BUG)
1055 /*
1056 We are building perl with long double support and are on an AIX OS
1057 afflicted with a powl() function that wrongly returns NaNQ for any
1058 negative base. This was reported to IBM as PMR #23047-379 on
1059 03/06/2006. The problem exists in at least the following versions
1060 of AIX and the libm fileset, and no doubt others as well:
1061
1062 AIX 4.3.3-ML10 bos.adt.libm 4.3.3.50
1063 AIX 5.1.0-ML04 bos.adt.libm 5.1.0.29
1064 AIX 5.2.0 bos.adt.libm 5.2.0.85
1065
1066 So, until IBM fixes powl(), we provide the following workaround to
1067 handle the problem ourselves. Our logic is as follows: for
1068 negative bases (left), we use fmod(right, 2) to check if the
1069 exponent is an odd or even integer:
1070
1071 - if odd, powl(left, right) == -powl(-left, right)
1072 - if even, powl(left, right) == powl(-left, right)
1073
1074 If the exponent is not an integer, the result is rightly NaNQ, so
1075 we just return that (as NV_NAN).
1076 */
1077
1078 if (left < 0.0) {
1079 NV mod2 = Perl_fmod( right, 2.0 );
1080 if (mod2 == 1.0 || mod2 == -1.0) { /* odd integer */
1081 SETn( -Perl_pow( -left, right) );
1082 } else if (mod2 == 0.0) { /* even integer */
1083 SETn( Perl_pow( -left, right) );
1084 } else { /* fractional power */
1085 SETn( NV_NAN );
1086 }
1087 } else {
1088 SETn( Perl_pow( left, right) );
1089 }
1090#else
52a96ae6 1091 SETn( Perl_pow( left, right) );
3aaeb624
JA
1092#endif /* HAS_AIX_POWL_NEG_BASE_BUG */
1093
52a96ae6
HS
1094#ifdef PERL_PRESERVE_IVUV
1095 if (is_int)
800401ee 1096 SvIV_please(svr);
52a96ae6
HS
1097#endif
1098 RETURN;
93a17b20 1099 }
a0d0e21e
LW
1100}
1101
1102PP(pp_multiply)
1103{
800401ee
JH
1104 dVAR; dSP; dATARGET; SV *svl, *svr;
1105 tryAMAGICbin(mult,opASSIGN);
1106 svl = sv_2num(TOPm1s);
1107 svr = sv_2num(TOPs);
28e5dec8 1108#ifdef PERL_PRESERVE_IVUV
800401ee
JH
1109 SvIV_please(svr);
1110 if (SvIOK(svr)) {
28e5dec8
JH
1111 /* Unless the left argument is integer in range we are going to have to
1112 use NV maths. Hence only attempt to coerce the right argument if
1113 we know the left is integer. */
1114 /* Left operand is defined, so is it IV? */
800401ee
JH
1115 SvIV_please(svl);
1116 if (SvIOK(svl)) {
1117 bool auvok = SvUOK(svl);
1118 bool buvok = SvUOK(svr);
28e5dec8
JH
1119 const UV topmask = (~ (UV)0) << (4 * sizeof (UV));
1120 const UV botmask = ~((~ (UV)0) << (4 * sizeof (UV)));
1121 UV alow;
1122 UV ahigh;
1123 UV blow;
1124 UV bhigh;
1125
1126 if (auvok) {
800401ee 1127 alow = SvUVX(svl);
28e5dec8 1128 } else {
800401ee 1129 const IV aiv = SvIVX(svl);
28e5dec8
JH
1130 if (aiv >= 0) {
1131 alow = aiv;
1132 auvok = TRUE; /* effectively it's a UV now */
1133 } else {
1134 alow = -aiv; /* abs, auvok == false records sign */
1135 }
1136 }
1137 if (buvok) {
800401ee 1138 blow = SvUVX(svr);
28e5dec8 1139 } else {
800401ee 1140 const IV biv = SvIVX(svr);
28e5dec8
JH
1141 if (biv >= 0) {
1142 blow = biv;
1143 buvok = TRUE; /* effectively it's a UV now */
1144 } else {
1145 blow = -biv; /* abs, buvok == false records sign */
1146 }
1147 }
1148
1149 /* If this does sign extension on unsigned it's time for plan B */
1150 ahigh = alow >> (4 * sizeof (UV));
1151 alow &= botmask;
1152 bhigh = blow >> (4 * sizeof (UV));
1153 blow &= botmask;
1154 if (ahigh && bhigh) {
6f207bd3 1155 NOOP;
28e5dec8
JH
1156 /* eg 32 bit is at least 0x10000 * 0x10000 == 0x100000000
1157 which is overflow. Drop to NVs below. */
1158 } else if (!ahigh && !bhigh) {
1159 /* eg 32 bit is at most 0xFFFF * 0xFFFF == 0xFFFE0001
1160 so the unsigned multiply cannot overflow. */
c445ea15 1161 const UV product = alow * blow;
28e5dec8
JH
1162 if (auvok == buvok) {
1163 /* -ve * -ve or +ve * +ve gives a +ve result. */
1164 SP--;
1165 SETu( product );
1166 RETURN;
1167 } else if (product <= (UV)IV_MIN) {
1168 /* 2s complement assumption that (UV)-IV_MIN is correct. */
1169 /* -ve result, which could overflow an IV */
1170 SP--;
25716404 1171 SETi( -(IV)product );
28e5dec8
JH
1172 RETURN;
1173 } /* else drop to NVs below. */
1174 } else {
1175 /* One operand is large, 1 small */
1176 UV product_middle;
1177 if (bhigh) {
1178 /* swap the operands */
1179 ahigh = bhigh;
1180 bhigh = blow; /* bhigh now the temp var for the swap */
1181 blow = alow;
1182 alow = bhigh;
1183 }
1184 /* now, ((ahigh * blow) << half_UV_len) + (alow * blow)
1185 multiplies can't overflow. shift can, add can, -ve can. */
1186 product_middle = ahigh * blow;
1187 if (!(product_middle & topmask)) {
1188 /* OK, (ahigh * blow) won't lose bits when we shift it. */
1189 UV product_low;
1190 product_middle <<= (4 * sizeof (UV));
1191 product_low = alow * blow;
1192
1193 /* as for pp_add, UV + something mustn't get smaller.
1194 IIRC ANSI mandates this wrapping *behaviour* for
1195 unsigned whatever the actual representation*/
1196 product_low += product_middle;
1197 if (product_low >= product_middle) {
1198 /* didn't overflow */
1199 if (auvok == buvok) {
1200 /* -ve * -ve or +ve * +ve gives a +ve result. */
1201 SP--;
1202 SETu( product_low );
1203 RETURN;
1204 } else if (product_low <= (UV)IV_MIN) {
1205 /* 2s complement assumption again */
1206 /* -ve result, which could overflow an IV */
1207 SP--;
25716404 1208 SETi( -(IV)product_low );
28e5dec8
JH
1209 RETURN;
1210 } /* else drop to NVs below. */
1211 }
1212 } /* product_middle too large */
1213 } /* ahigh && bhigh */
800401ee
JH
1214 } /* SvIOK(svl) */
1215 } /* SvIOK(svr) */
28e5dec8 1216#endif
a0d0e21e 1217 {
4efa5a16
RD
1218 NV right = SvNV(svr);
1219 NV left = SvNV(svl);
1220 (void)POPs;
a0d0e21e
LW
1221 SETn( left * right );
1222 RETURN;
79072805 1223 }
a0d0e21e
LW
1224}
1225
1226PP(pp_divide)
1227{
800401ee
JH
1228 dVAR; dSP; dATARGET; SV *svl, *svr;
1229 tryAMAGICbin(div,opASSIGN);
1230 svl = sv_2num(TOPm1s);
1231 svr = sv_2num(TOPs);
5479d192 1232 /* Only try to do UV divide first
68795e93 1233 if ((SLOPPYDIVIDE is true) or
5479d192
NC
1234 (PERL_PRESERVE_IVUV is true and one or both SV is a UV too large
1235 to preserve))
1236 The assumption is that it is better to use floating point divide
1237 whenever possible, only doing integer divide first if we can't be sure.
1238 If NV_PRESERVES_UV is true then we know at compile time that no UV
1239 can be too large to preserve, so don't need to compile the code to
1240 test the size of UVs. */
1241
a0d0e21e 1242#ifdef SLOPPYDIVIDE
5479d192
NC
1243# define PERL_TRY_UV_DIVIDE
1244 /* ensure that 20./5. == 4. */
a0d0e21e 1245#else
5479d192
NC
1246# ifdef PERL_PRESERVE_IVUV
1247# ifndef NV_PRESERVES_UV
1248# define PERL_TRY_UV_DIVIDE
1249# endif
1250# endif
a0d0e21e 1251#endif
5479d192
NC
1252
1253#ifdef PERL_TRY_UV_DIVIDE
800401ee
JH
1254 SvIV_please(svr);
1255 if (SvIOK(svr)) {
1256 SvIV_please(svl);
1257 if (SvIOK(svl)) {
1258 bool left_non_neg = SvUOK(svl);
1259 bool right_non_neg = SvUOK(svr);
5479d192
NC
1260 UV left;
1261 UV right;
1262
1263 if (right_non_neg) {
800401ee 1264 right = SvUVX(svr);
5479d192
NC
1265 }
1266 else {
800401ee 1267 const IV biv = SvIVX(svr);
5479d192
NC
1268 if (biv >= 0) {
1269 right = biv;
1270 right_non_neg = TRUE; /* effectively it's a UV now */
1271 }
1272 else {
1273 right = -biv;
1274 }
1275 }
1276 /* historically undef()/0 gives a "Use of uninitialized value"
1277 warning before dieing, hence this test goes here.
1278 If it were immediately before the second SvIV_please, then
1279 DIE() would be invoked before left was even inspected, so
1280 no inpsection would give no warning. */
1281 if (right == 0)
1282 DIE(aTHX_ "Illegal division by zero");
1283
1284 if (left_non_neg) {
800401ee 1285 left = SvUVX(svl);
5479d192
NC
1286 }
1287 else {
800401ee 1288 const IV aiv = SvIVX(svl);
5479d192
NC
1289 if (aiv >= 0) {
1290 left = aiv;
1291 left_non_neg = TRUE; /* effectively it's a UV now */
1292 }
1293 else {
1294 left = -aiv;
1295 }
1296 }
1297
1298 if (left >= right
1299#ifdef SLOPPYDIVIDE
1300 /* For sloppy divide we always attempt integer division. */
1301#else
1302 /* Otherwise we only attempt it if either or both operands
1303 would not be preserved by an NV. If both fit in NVs
0c2ee62a
NC
1304 we fall through to the NV divide code below. However,
1305 as left >= right to ensure integer result here, we know that
1306 we can skip the test on the right operand - right big
1307 enough not to be preserved can't get here unless left is
1308 also too big. */
1309
1310 && (left > ((UV)1 << NV_PRESERVES_UV_BITS))
5479d192
NC
1311#endif
1312 ) {
1313 /* Integer division can't overflow, but it can be imprecise. */
1b6737cc 1314 const UV result = left / right;
5479d192
NC
1315 if (result * right == left) {
1316 SP--; /* result is valid */
1317 if (left_non_neg == right_non_neg) {
1318 /* signs identical, result is positive. */
1319 SETu( result );
1320 RETURN;
1321 }
1322 /* 2s complement assumption */
1323 if (result <= (UV)IV_MIN)
91f3b821 1324 SETi( -(IV)result );
5479d192
NC
1325 else {
1326 /* It's exact but too negative for IV. */
1327 SETn( -(NV)result );
1328 }
1329 RETURN;
1330 } /* tried integer divide but it was not an integer result */
32fdb065 1331 } /* else (PERL_ABS(result) < 1.0) or (both UVs in range for NV) */
5479d192
NC
1332 } /* left wasn't SvIOK */
1333 } /* right wasn't SvIOK */
1334#endif /* PERL_TRY_UV_DIVIDE */
1335 {
4efa5a16
RD
1336 NV right = SvNV(svr);
1337 NV left = SvNV(svl);
1338 (void)POPs;(void)POPs;
ebc6a117
PD
1339#if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
1340 if (! Perl_isnan(right) && right == 0.0)
1341#else
5479d192 1342 if (right == 0.0)
ebc6a117 1343#endif
5479d192
NC
1344 DIE(aTHX_ "Illegal division by zero");
1345 PUSHn( left / right );
1346 RETURN;
79072805 1347 }
a0d0e21e
LW
1348}
1349
1350PP(pp_modulo)
1351{
97aff369 1352 dVAR; dSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
a0d0e21e 1353 {
9c5ffd7c
JH
1354 UV left = 0;
1355 UV right = 0;
dc656993
JH
1356 bool left_neg = FALSE;
1357 bool right_neg = FALSE;
e2c88acc
NC
1358 bool use_double = FALSE;
1359 bool dright_valid = FALSE;
9c5ffd7c
JH
1360 NV dright = 0.0;
1361 NV dleft = 0.0;
800401ee
JH
1362 SV * svl;
1363 SV * const svr = sv_2num(TOPs);
1364 SvIV_please(svr);
1365 if (SvIOK(svr)) {
1366 right_neg = !SvUOK(svr);
e2c88acc 1367 if (!right_neg) {
800401ee 1368 right = SvUVX(svr);
e2c88acc 1369 } else {
800401ee 1370 const IV biv = SvIVX(svr);
e2c88acc
NC
1371 if (biv >= 0) {
1372 right = biv;
1373 right_neg = FALSE; /* effectively it's a UV now */
1374 } else {
1375 right = -biv;
1376 }
1377 }
1378 }
1379 else {
4efa5a16 1380 dright = SvNV(svr);
787eafbd
IZ
1381 right_neg = dright < 0;
1382 if (right_neg)
1383 dright = -dright;
e2c88acc
NC
1384 if (dright < UV_MAX_P1) {
1385 right = U_V(dright);
1386 dright_valid = TRUE; /* In case we need to use double below. */
1387 } else {
1388 use_double = TRUE;
1389 }
787eafbd 1390 }
4efa5a16 1391 sp--;
a0d0e21e 1392
e2c88acc
NC
1393 /* At this point use_double is only true if right is out of range for
1394 a UV. In range NV has been rounded down to nearest UV and
1395 use_double false. */
800401ee
JH
1396 svl = sv_2num(TOPs);
1397 SvIV_please(svl);
1398 if (!use_double && SvIOK(svl)) {
1399 if (SvIOK(svl)) {
1400 left_neg = !SvUOK(svl);
e2c88acc 1401 if (!left_neg) {
800401ee 1402 left = SvUVX(svl);
e2c88acc 1403 } else {
800401ee 1404 const IV aiv = SvIVX(svl);
e2c88acc
NC
1405 if (aiv >= 0) {
1406 left = aiv;
1407 left_neg = FALSE; /* effectively it's a UV now */
1408 } else {
1409 left = -aiv;
1410 }
1411 }
1412 }
1413 }
787eafbd 1414 else {
4efa5a16 1415 dleft = SvNV(svl);
787eafbd
IZ
1416 left_neg = dleft < 0;
1417 if (left_neg)
1418 dleft = -dleft;
68dc0745 1419
e2c88acc
NC
1420 /* This should be exactly the 5.6 behaviour - if left and right are
1421 both in range for UV then use U_V() rather than floor. */
1422 if (!use_double) {
1423 if (dleft < UV_MAX_P1) {
1424 /* right was in range, so is dleft, so use UVs not double.
1425 */
1426 left = U_V(dleft);
1427 }
1428 /* left is out of range for UV, right was in range, so promote
1429 right (back) to double. */
1430 else {
1431 /* The +0.5 is used in 5.6 even though it is not strictly
1432 consistent with the implicit +0 floor in the U_V()
1433 inside the #if 1. */
1434 dleft = Perl_floor(dleft + 0.5);
1435 use_double = TRUE;
1436 if (dright_valid)
1437 dright = Perl_floor(dright + 0.5);
1438 else
1439 dright = right;
1440 }
1441 }
1442 }
4efa5a16 1443 sp--;
787eafbd 1444 if (use_double) {
65202027 1445 NV dans;
787eafbd 1446
787eafbd 1447 if (!dright)
cea2e8a9 1448 DIE(aTHX_ "Illegal modulus zero");
787eafbd 1449
65202027 1450 dans = Perl_fmod(dleft, dright);
787eafbd
IZ
1451 if ((left_neg != right_neg) && dans)
1452 dans = dright - dans;
1453 if (right_neg)
1454 dans = -dans;
1455 sv_setnv(TARG, dans);
1456 }
1457 else {
1458 UV ans;
1459
787eafbd 1460 if (!right)
cea2e8a9 1461 DIE(aTHX_ "Illegal modulus zero");
787eafbd
IZ
1462
1463 ans = left % right;
1464 if ((left_neg != right_neg) && ans)
1465 ans = right - ans;
1466 if (right_neg) {
1467 /* XXX may warn: unary minus operator applied to unsigned type */
1468 /* could change -foo to be (~foo)+1 instead */
1469 if (ans <= ~((UV)IV_MAX)+1)
1470 sv_setiv(TARG, ~ans+1);
1471 else
65202027 1472 sv_setnv(TARG, -(NV)ans);
787eafbd
IZ
1473 }
1474 else
1475 sv_setuv(TARG, ans);
1476 }
1477 PUSHTARG;
1478 RETURN;
79072805 1479 }
a0d0e21e 1480}
79072805 1481
a0d0e21e
LW
1482PP(pp_repeat)
1483{
97aff369 1484 dVAR; dSP; dATARGET; tryAMAGICbin(repeat,opASSIGN);
748a9306 1485 {
2b573ace
JH
1486 register IV count;
1487 dPOPss;
5b295bef 1488 SvGETMAGIC(sv);
2b573ace
JH
1489 if (SvIOKp(sv)) {
1490 if (SvUOK(sv)) {
1b6737cc 1491 const UV uv = SvUV(sv);
2b573ace
JH
1492 if (uv > IV_MAX)
1493 count = IV_MAX; /* The best we can do? */
1494 else
1495 count = uv;
1496 } else {
0bd48802 1497 const IV iv = SvIV(sv);
2b573ace
JH
1498 if (iv < 0)
1499 count = 0;
1500 else
1501 count = iv;
1502 }
1503 }
1504 else if (SvNOKp(sv)) {
1b6737cc 1505 const NV nv = SvNV(sv);
2b573ace
JH
1506 if (nv < 0.0)
1507 count = 0;
1508 else
1509 count = (IV)nv;
1510 }
1511 else
4ea561bc 1512 count = SvIV(sv);
533c011a 1513 if (GIMME == G_ARRAY && PL_op->op_private & OPpREPEAT_DOLIST) {
a0d0e21e 1514 dMARK;
0bd48802
AL
1515 static const char oom_list_extend[] = "Out of memory during list extend";
1516 const I32 items = SP - MARK;
1517 const I32 max = items * count;
79072805 1518
2b573ace
JH
1519 MEM_WRAP_CHECK_1(max, SV*, oom_list_extend);
1520 /* Did the max computation overflow? */
27d5b266 1521 if (items > 0 && max > 0 && (max < items || max < count))
2b573ace 1522 Perl_croak(aTHX_ oom_list_extend);
a0d0e21e
LW
1523 MEXTEND(MARK, max);
1524 if (count > 1) {
1525 while (SP > MARK) {
976c8a39
JH
1526#if 0
1527 /* This code was intended to fix 20010809.028:
1528
1529 $x = 'abcd';
1530 for (($x =~ /./g) x 2) {
1531 print chop; # "abcdabcd" expected as output.
1532 }
1533
1534 * but that change (#11635) broke this code:
1535
1536 $x = [("foo")x2]; # only one "foo" ended up in the anonlist.
1537
1538 * I can't think of a better fix that doesn't introduce
1539 * an efficiency hit by copying the SVs. The stack isn't
1540 * refcounted, and mortalisation obviously doesn't
1541 * Do The Right Thing when the stack has more than
1542 * one pointer to the same mortal value.
1543 * .robin.
1544 */
e30acc16
RH
1545 if (*SP) {
1546 *SP = sv_2mortal(newSVsv(*SP));
1547 SvREADONLY_on(*SP);
1548 }
976c8a39
JH
1549#else
1550 if (*SP)
1551 SvTEMP_off((*SP));
1552#endif
a0d0e21e 1553 SP--;
79072805 1554 }
a0d0e21e
LW
1555 MARK++;
1556 repeatcpy((char*)(MARK + items), (char*)MARK,
ad64d0ec 1557 items * sizeof(const SV *), count - 1);
a0d0e21e 1558 SP += max;
79072805 1559 }
a0d0e21e
LW
1560 else if (count <= 0)
1561 SP -= items;
79072805 1562 }
a0d0e21e 1563 else { /* Note: mark already snarfed by pp_list */
0bd48802 1564 SV * const tmpstr = POPs;
a0d0e21e 1565 STRLEN len;
9b877dbb 1566 bool isutf;
2b573ace
JH
1567 static const char oom_string_extend[] =
1568 "Out of memory during string extend";
a0d0e21e 1569
a0d0e21e
LW
1570 SvSetSV(TARG, tmpstr);
1571 SvPV_force(TARG, len);
9b877dbb 1572 isutf = DO_UTF8(TARG);
8ebc5c01 1573 if (count != 1) {
1574 if (count < 1)
1575 SvCUR_set(TARG, 0);
1576 else {
c445ea15 1577 const STRLEN max = (UV)count * len;
19a94d75 1578 if (len > MEM_SIZE_MAX / count)
2b573ace
JH
1579 Perl_croak(aTHX_ oom_string_extend);
1580 MEM_WRAP_CHECK_1(max, char, oom_string_extend);
8569b9dc 1581 SvGROW(TARG, max + 1);
a0d0e21e 1582 repeatcpy(SvPVX(TARG) + len, SvPVX(TARG), len, count - 1);
b162af07 1583 SvCUR_set(TARG, SvCUR(TARG) * count);
7a4c00b4 1584 }
a0d0e21e 1585 *SvEND(TARG) = '\0';
a0d0e21e 1586 }
dfcb284a
GS
1587 if (isutf)
1588 (void)SvPOK_only_UTF8(TARG);
1589 else
1590 (void)SvPOK_only(TARG);
b80b6069
RH
1591
1592 if (PL_op->op_private & OPpREPEAT_DOLIST) {
1593 /* The parser saw this as a list repeat, and there
1594 are probably several items on the stack. But we're
1595 in scalar context, and there's no pp_list to save us
1596 now. So drop the rest of the items -- robin@kitsite.com
1597 */
1598 dMARK;
1599 SP = MARK;
1600 }
a0d0e21e 1601 PUSHTARG;
79072805 1602 }
a0d0e21e 1603 RETURN;
748a9306 1604 }
a0d0e21e 1605}
79072805 1606
a0d0e21e
LW
1607PP(pp_subtract)
1608{
800401ee
JH
1609 dVAR; dSP; dATARGET; bool useleft; SV *svl, *svr;
1610 tryAMAGICbin(subtr,opASSIGN);
1611 svl = sv_2num(TOPm1s);
1612 svr = sv_2num(TOPs);
1613 useleft = USE_LEFT(svl);
28e5dec8 1614#ifdef PERL_PRESERVE_IVUV
7dca457a
NC
1615 /* See comments in pp_add (in pp_hot.c) about Overflow, and how
1616 "bad things" happen if you rely on signed integers wrapping. */
800401ee
JH
1617 SvIV_please(svr);
1618 if (SvIOK(svr)) {
28e5dec8
JH
1619 /* Unless the left argument is integer in range we are going to have to
1620 use NV maths. Hence only attempt to coerce the right argument if
1621 we know the left is integer. */
9c5ffd7c
JH
1622 register UV auv = 0;
1623 bool auvok = FALSE;
7dca457a
NC
1624 bool a_valid = 0;
1625
28e5dec8 1626 if (!useleft) {
7dca457a
NC
1627 auv = 0;
1628 a_valid = auvok = 1;
1629 /* left operand is undef, treat as zero. */
28e5dec8
JH
1630 } else {
1631 /* Left operand is defined, so is it IV? */
800401ee
JH
1632 SvIV_please(svl);
1633 if (SvIOK(svl)) {
1634 if ((auvok = SvUOK(svl)))
1635 auv = SvUVX(svl);
7dca457a 1636 else {
800401ee 1637 register const IV aiv = SvIVX(svl);
7dca457a
NC
1638 if (aiv >= 0) {
1639 auv = aiv;
1640 auvok = 1; /* Now acting as a sign flag. */
1641 } else { /* 2s complement assumption for IV_MIN */
1642 auv = (UV)-aiv;
28e5dec8 1643 }
7dca457a
NC
1644 }
1645 a_valid = 1;
1646 }
1647 }
1648 if (a_valid) {
1649 bool result_good = 0;
1650 UV result;
1651 register UV buv;
800401ee 1652 bool buvok = SvUOK(svr);
9041c2e3 1653
7dca457a 1654 if (buvok)
800401ee 1655 buv = SvUVX(svr);
7dca457a 1656 else {
800401ee 1657 register const IV biv = SvIVX(svr);
7dca457a
NC
1658 if (biv >= 0) {
1659 buv = biv;
1660 buvok = 1;
1661 } else
1662 buv = (UV)-biv;
1663 }
1664 /* ?uvok if value is >= 0. basically, flagged as UV if it's +ve,
602f51c4 1665 else "IV" now, independent of how it came in.
7dca457a
NC
1666 if a, b represents positive, A, B negative, a maps to -A etc
1667 a - b => (a - b)
1668 A - b => -(a + b)
1669 a - B => (a + b)
1670 A - B => -(a - b)
1671 all UV maths. negate result if A negative.
1672 subtract if signs same, add if signs differ. */
1673
1674 if (auvok ^ buvok) {
1675 /* Signs differ. */
1676 result = auv + buv;
1677 if (result >= auv)
1678 result_good = 1;
1679 } else {
1680 /* Signs same */
1681 if (auv >= buv) {
1682 result = auv - buv;
1683 /* Must get smaller */
1684 if (result <= auv)
1685 result_good = 1;
1686 } else {
1687 result = buv - auv;
1688 if (result <= buv) {
1689 /* result really should be -(auv-buv). as its negation
1690 of true value, need to swap our result flag */
1691 auvok = !auvok;
1692 result_good = 1;
28e5dec8 1693 }
28e5dec8
JH
1694 }
1695 }
7dca457a
NC
1696 if (result_good) {
1697 SP--;
1698 if (auvok)
1699 SETu( result );
1700 else {
1701 /* Negate result */
1702 if (result <= (UV)IV_MIN)
1703 SETi( -(IV)result );
1704 else {
1705 /* result valid, but out of range for IV. */
1706 SETn( -(NV)result );
1707 }
1708 }
1709 RETURN;
1710 } /* Overflow, drop through to NVs. */
28e5dec8
JH
1711 }
1712 }
1713#endif
a0d0e21e 1714 {
4efa5a16
RD
1715 NV value = SvNV(svr);
1716 (void)POPs;
1717
28e5dec8
JH
1718 if (!useleft) {
1719 /* left operand is undef, treat as zero - value */
1720 SETn(-value);
1721 RETURN;
1722 }
4efa5a16 1723 SETn( SvNV(svl) - value );
28e5dec8 1724 RETURN;
79072805 1725 }
a0d0e21e 1726}
79072805 1727
a0d0e21e
LW
1728PP(pp_left_shift)
1729{
97aff369 1730 dVAR; dSP; dATARGET; tryAMAGICbin(lshift,opASSIGN);
a0d0e21e 1731 {
1b6737cc 1732 const IV shift = POPi;
d0ba1bd2 1733 if (PL_op->op_private & HINT_INTEGER) {
c445ea15 1734 const IV i = TOPi;
972b05a9 1735 SETi(i << shift);
d0ba1bd2
JH
1736 }
1737 else {
c445ea15 1738 const UV u = TOPu;
972b05a9 1739 SETu(u << shift);
d0ba1bd2 1740 }
55497cff 1741 RETURN;
79072805 1742 }
a0d0e21e 1743}
79072805 1744
a0d0e21e
LW
1745PP(pp_right_shift)
1746{
97aff369 1747 dVAR; dSP; dATARGET; tryAMAGICbin(rshift,opASSIGN);
a0d0e21e 1748 {
1b6737cc 1749 const IV shift = POPi;
d0ba1bd2 1750 if (PL_op->op_private & HINT_INTEGER) {
0bd48802 1751 const IV i = TOPi;
972b05a9 1752 SETi(i >> shift);
d0ba1bd2
JH
1753 }
1754 else {
0bd48802 1755 const UV u = TOPu;
972b05a9 1756 SETu(u >> shift);
d0ba1bd2 1757 }
a0d0e21e 1758 RETURN;
93a17b20 1759 }
79072805
LW
1760}
1761
a0d0e21e 1762PP(pp_lt)
79072805 1763{
97aff369 1764 dVAR; dSP; tryAMAGICbinSET(lt,0);
28e5dec8
JH
1765#ifdef PERL_PRESERVE_IVUV
1766 SvIV_please(TOPs);
1767 if (SvIOK(TOPs)) {
1768 SvIV_please(TOPm1s);
1769 if (SvIOK(TOPm1s)) {
1770 bool auvok = SvUOK(TOPm1s);
1771 bool buvok = SvUOK(TOPs);
a227d84d 1772
28e5dec8 1773 if (!auvok && !buvok) { /* ## IV < IV ## */
1b6737cc
AL
1774 const IV aiv = SvIVX(TOPm1s);
1775 const IV biv = SvIVX(TOPs);
28e5dec8
JH
1776
1777 SP--;
1778 SETs(boolSV(aiv < biv));
1779 RETURN;
1780 }
1781 if (auvok && buvok) { /* ## UV < UV ## */
1b6737cc
AL
1782 const UV auv = SvUVX(TOPm1s);
1783 const UV buv = SvUVX(TOPs);
28e5dec8
JH
1784
1785 SP--;
1786 SETs(boolSV(auv < buv));
1787 RETURN;
1788 }
1789 if (auvok) { /* ## UV < IV ## */
1790 UV auv;
1b6737cc 1791 const IV biv = SvIVX(TOPs);
28e5dec8
JH
1792 SP--;
1793 if (biv < 0) {
1794 /* As (a) is a UV, it's >=0, so it cannot be < */
1795 SETs(&PL_sv_no);
1796 RETURN;
1797 }
1798 auv = SvUVX(TOPs);
28e5dec8
JH
1799 SETs(boolSV(auv < (UV)biv));
1800 RETURN;
1801 }
1802 { /* ## IV < UV ## */
1b6737cc 1803 const IV aiv = SvIVX(TOPm1s);
28e5dec8
JH
1804 UV buv;
1805
28e5dec8
JH
1806 if (aiv < 0) {
1807 /* As (b) is a UV, it's >=0, so it must be < */
1808 SP--;
1809 SETs(&PL_sv_yes);
1810 RETURN;
1811 }
1812 buv = SvUVX(TOPs);
1813 SP--;
28e5dec8
JH
1814 SETs(boolSV((UV)aiv < buv));
1815 RETURN;
1816 }
1817 }
1818 }
1819#endif
30de85b6 1820#ifndef NV_PRESERVES_UV
50fb3111
NC
1821#ifdef PERL_PRESERVE_IVUV
1822 else
1823#endif
0bdaccee
NC
1824 if (SvROK(TOPs) && !SvAMAGIC(TOPs) && SvROK(TOPm1s) && !SvAMAGIC(TOPm1s)) {
1825 SP--;
1826 SETs(boolSV(SvRV(TOPs) < SvRV(TOPp1s)));
1827 RETURN;
1828 }
30de85b6 1829#endif
a0d0e21e 1830 {
cab190d4
JD
1831#if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
1832 dPOPTOPnnrl;
1833 if (Perl_isnan(left) || Perl_isnan(right))
1834 RETSETNO;
1835 SETs(boolSV(left < right));
1836#else
a0d0e21e 1837 dPOPnv;
54310121 1838 SETs(boolSV(TOPn < value));
cab190d4 1839#endif
a0d0e21e 1840 RETURN;
79072805 1841 }
a0d0e21e 1842}
79072805 1843
a0d0e21e
LW
1844PP(pp_gt)
1845{
97aff369 1846 dVAR; dSP; tryAMAGICbinSET(gt,0);
28e5dec8
JH
1847#ifdef PERL_PRESERVE_IVUV
1848 SvIV_please(TOPs);
1849 if (SvIOK(TOPs)) {
1850 SvIV_please(TOPm1s);
1851 if (SvIOK(TOPm1s)) {
1852 bool auvok = SvUOK(TOPm1s);
1853 bool buvok = SvUOK(TOPs);
a227d84d 1854
28e5dec8 1855 if (!auvok && !buvok) { /* ## IV > IV ## */
1b6737cc
AL
1856 const IV aiv = SvIVX(TOPm1s);
1857 const IV biv = SvIVX(TOPs);
1858
28e5dec8
JH
1859 SP--;
1860 SETs(boolSV(aiv > biv));
1861 RETURN;
1862 }
1863 if (auvok && buvok) { /* ## UV > UV ## */
1b6737cc
AL
1864 const UV auv = SvUVX(TOPm1s);
1865 const UV buv = SvUVX(TOPs);
28e5dec8
JH
1866
1867 SP--;
1868 SETs(boolSV(auv > buv));
1869 RETURN;
1870 }
1871 if (auvok) { /* ## UV > IV ## */
1872 UV auv;
1b6737cc
AL
1873 const IV biv = SvIVX(TOPs);
1874
28e5dec8
JH
1875 SP--;
1876 if (biv < 0) {
1877 /* As (a) is a UV, it's >=0, so it must be > */
1878 SETs(&PL_sv_yes);
1879 RETURN;
1880 }
1881 auv = SvUVX(TOPs);
28e5dec8
JH
1882 SETs(boolSV(auv > (UV)biv));
1883 RETURN;
1884 }
1885 { /* ## IV > UV ## */
1b6737cc 1886 const IV aiv = SvIVX(TOPm1s);
28e5dec8
JH
1887 UV buv;
1888
28e5dec8
JH
1889 if (aiv < 0) {
1890 /* As (b) is a UV, it's >=0, so it cannot be > */
1891 SP--;
1892 SETs(&PL_sv_no);
1893 RETURN;
1894 }
1895 buv = SvUVX(TOPs);
1896 SP--;
28e5dec8
JH
1897 SETs(boolSV((UV)aiv > buv));
1898 RETURN;
1899 }
1900 }
1901 }
1902#endif
30de85b6 1903#ifndef NV_PRESERVES_UV
50fb3111
NC
1904#ifdef PERL_PRESERVE_IVUV
1905 else
1906#endif
0bdaccee 1907 if (SvROK(TOPs) && !SvAMAGIC(TOPs) && SvROK(TOPm1s) && !SvAMAGIC(TOPm1s)) {
30de85b6
NC
1908 SP--;
1909 SETs(boolSV(SvRV(TOPs) > SvRV(TOPp1s)));
1910 RETURN;
1911 }
1912#endif
a0d0e21e 1913 {
cab190d4
JD
1914#if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
1915 dPOPTOPnnrl;
1916 if (Perl_isnan(left) || Perl_isnan(right))
1917 RETSETNO;
1918 SETs(boolSV(left > right));
1919#else
a0d0e21e 1920 dPOPnv;
54310121 1921 SETs(boolSV(TOPn > value));
cab190d4 1922#endif
a0d0e21e 1923 RETURN;
79072805 1924 }
a0d0e21e
LW
1925}
1926
1927PP(pp_le)
1928{
97aff369 1929 dVAR; dSP; tryAMAGICbinSET(le,0);
28e5dec8
JH
1930#ifdef PERL_PRESERVE_IVUV
1931 SvIV_please(TOPs);
1932 if (SvIOK(TOPs)) {
1933 SvIV_please(TOPm1s);
1934 if (SvIOK(TOPm1s)) {
1935 bool auvok = SvUOK(TOPm1s);
1936 bool buvok = SvUOK(TOPs);
a227d84d 1937
28e5dec8 1938 if (!auvok && !buvok) { /* ## IV <= IV ## */
1b6737cc
AL
1939 const IV aiv = SvIVX(TOPm1s);
1940 const IV biv = SvIVX(TOPs);
28e5dec8
JH
1941
1942 SP--;
1943 SETs(boolSV(aiv <= biv));
1944 RETURN;
1945 }
1946 if (auvok && buvok) { /* ## UV <= UV ## */
1947 UV auv = SvUVX(TOPm1s);
1948 UV buv = SvUVX(TOPs);
1949
1950 SP--;
1951 SETs(boolSV(auv <= buv));
1952 RETURN;
1953 }
1954 if (auvok) { /* ## UV <= IV ## */
1955 UV auv;
1b6737cc
AL
1956 const IV biv = SvIVX(TOPs);
1957
28e5dec8
JH
1958 SP--;
1959 if (biv < 0) {
1960 /* As (a) is a UV, it's >=0, so a cannot be <= */
1961 SETs(&PL_sv_no);
1962 RETURN;
1963 }
1964 auv = SvUVX(TOPs);
28e5dec8
JH
1965 SETs(boolSV(auv <= (UV)biv));
1966 RETURN;
1967 }
1968 { /* ## IV <= UV ## */
1b6737cc 1969 const IV aiv = SvIVX(TOPm1s);
28e5dec8 1970 UV buv;
1b6737cc 1971
28e5dec8
JH
1972 if (aiv < 0) {
1973 /* As (b) is a UV, it's >=0, so a must be <= */
1974 SP--;
1975 SETs(&PL_sv_yes);
1976 RETURN;
1977 }
1978 buv = SvUVX(TOPs);
1979 SP--;
28e5dec8
JH
1980 SETs(boolSV((UV)aiv <= buv));
1981 RETURN;
1982 }
1983 }
1984 }
1985#endif
30de85b6 1986#ifndef NV_PRESERVES_UV
50fb3111
NC
1987#ifdef PERL_PRESERVE_IVUV
1988 else
1989#endif
0bdaccee 1990 if (SvROK(TOPs) && !SvAMAGIC(TOPs) && SvROK(TOPm1s) && !SvAMAGIC(TOPm1s)) {
30de85b6
NC
1991 SP--;
1992 SETs(boolSV(SvRV(TOPs) <= SvRV(TOPp1s)));
1993 RETURN;
1994 }
1995#endif
a0d0e21e 1996 {
cab190d4
JD
1997#if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
1998 dPOPTOPnnrl;
1999 if (Perl_isnan(left) || Perl_isnan(right))
2000 RETSETNO;
2001 SETs(boolSV(left <= right));
2002#else
a0d0e21e 2003 dPOPnv;
54310121 2004 SETs(boolSV(TOPn <= value));
cab190d4 2005#endif
a0d0e21e 2006 RETURN;
79072805 2007 }
a0d0e21e
LW
2008}
2009
2010PP(pp_ge)
2011{
97aff369 2012 dVAR; dSP; tryAMAGICbinSET(ge,0);
28e5dec8
JH
2013#ifdef PERL_PRESERVE_IVUV
2014 SvIV_please(TOPs);
2015 if (SvIOK(TOPs)) {
2016 SvIV_please(TOPm1s);
2017 if (SvIOK(TOPm1s)) {
2018 bool auvok = SvUOK(TOPm1s);
2019 bool buvok = SvUOK(TOPs);
a227d84d 2020
28e5dec8 2021 if (!auvok && !buvok) { /* ## IV >= IV ## */
1b6737cc
AL
2022 const IV aiv = SvIVX(TOPm1s);
2023 const IV biv = SvIVX(TOPs);
2024
28e5dec8
JH
2025 SP--;
2026 SETs(boolSV(aiv >= biv));
2027 RETURN;
2028 }
2029 if (auvok && buvok) { /* ## UV >= UV ## */
1b6737cc
AL
2030 const UV auv = SvUVX(TOPm1s);
2031 const UV buv = SvUVX(TOPs);
2032
28e5dec8
JH
2033 SP--;
2034 SETs(boolSV(auv >= buv));
2035 RETURN;
2036 }
2037 if (auvok) { /* ## UV >= IV ## */
2038 UV auv;
1b6737cc
AL
2039 const IV biv = SvIVX(TOPs);
2040
28e5dec8
JH
2041 SP--;
2042 if (biv < 0) {
2043 /* As (a) is a UV, it's >=0, so it must be >= */
2044 SETs(&PL_sv_yes);
2045 RETURN;
2046 }
2047 auv = SvUVX(TOPs);
28e5dec8
JH
2048 SETs(boolSV(auv >= (UV)biv));
2049 RETURN;
2050 }
2051 { /* ## IV >= UV ## */
1b6737cc 2052 const IV aiv = SvIVX(TOPm1s);
28e5dec8 2053 UV buv;
1b6737cc 2054
28e5dec8
JH
2055 if (aiv < 0) {
2056 /* As (b) is a UV, it's >=0, so a cannot be >= */
2057 SP--;
2058 SETs(&PL_sv_no);
2059 RETURN;
2060 }
2061 buv = SvUVX(TOPs);
2062 SP--;
28e5dec8
JH
2063 SETs(boolSV((UV)aiv >= buv));
2064 RETURN;
2065 }
2066 }
2067 }
2068#endif
30de85b6 2069#ifndef NV_PRESERVES_UV
50fb3111
NC
2070#ifdef PERL_PRESERVE_IVUV
2071 else
2072#endif
0bdaccee 2073 if (SvROK(TOPs) && !SvAMAGIC(TOPs) && SvROK(TOPm1s) && !SvAMAGIC(TOPm1s)) {
30de85b6
NC
2074 SP--;
2075 SETs(boolSV(SvRV(TOPs) >= SvRV(TOPp1s)));
2076 RETURN;
2077 }
2078#endif
a0d0e21e 2079 {
cab190d4
JD
2080#if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
2081 dPOPTOPnnrl;
2082 if (Perl_isnan(left) || Perl_isnan(right))
2083 RETSETNO;
2084 SETs(boolSV(left >= right));
2085#else
a0d0e21e 2086 dPOPnv;
54310121 2087 SETs(boolSV(TOPn >= value));
cab190d4 2088#endif
a0d0e21e 2089 RETURN;
79072805 2090 }
a0d0e21e 2091}
79072805 2092
a0d0e21e
LW
2093PP(pp_ne)
2094{
97aff369 2095 dVAR; dSP; tryAMAGICbinSET(ne,0);
3bb2c415 2096#ifndef NV_PRESERVES_UV
0bdaccee 2097 if (SvROK(TOPs) && !SvAMAGIC(TOPs) && SvROK(TOPm1s) && !SvAMAGIC(TOPm1s)) {
e61d22ef
NC
2098 SP--;
2099 SETs(boolSV(SvRV(TOPs) != SvRV(TOPp1s)));
3bb2c415
JH
2100 RETURN;
2101 }
2102#endif
28e5dec8
JH
2103#ifdef PERL_PRESERVE_IVUV
2104 SvIV_please(TOPs);
2105 if (SvIOK(TOPs)) {
2106 SvIV_please(TOPm1s);
2107 if (SvIOK(TOPm1s)) {
0bd48802
AL
2108 const bool auvok = SvUOK(TOPm1s);
2109 const bool buvok = SvUOK(TOPs);
a227d84d 2110
30de85b6
NC
2111 if (auvok == buvok) { /* ## IV == IV or UV == UV ## */
2112 /* Casting IV to UV before comparison isn't going to matter
2113 on 2s complement. On 1s complement or sign&magnitude
2114 (if we have any of them) it could make negative zero
2115 differ from normal zero. As I understand it. (Need to
2116 check - is negative zero implementation defined behaviour
2117 anyway?). NWC */
1b6737cc
AL
2118 const UV buv = SvUVX(POPs);
2119 const UV auv = SvUVX(TOPs);
2120
28e5dec8
JH
2121 SETs(boolSV(auv != buv));
2122 RETURN;
2123 }
2124 { /* ## Mixed IV,UV ## */
2125 IV iv;
2126 UV uv;
2127
2128 /* != is commutative so swap if needed (save code) */
2129 if (auvok) {
2130 /* swap. top of stack (b) is the iv */
2131 iv = SvIVX(TOPs);
2132 SP--;
2133 if (iv < 0) {
2134 /* As (a) is a UV, it's >0, so it cannot be == */
2135 SETs(&PL_sv_yes);
2136 RETURN;
2137 }
2138 uv = SvUVX(TOPs);
2139 } else {
2140 iv = SvIVX(TOPm1s);
2141 SP--;
2142 if (iv < 0) {
2143 /* As (b) is a UV, it's >0, so it cannot be == */
2144 SETs(&PL_sv_yes);
2145 RETURN;
2146 }
2147 uv = SvUVX(*(SP+1)); /* Do I want TOPp1s() ? */
2148 }
28e5dec8
JH
2149 SETs(boolSV((UV)iv != uv));
2150 RETURN;
2151 }
2152 }
2153 }
2154#endif
a0d0e21e 2155 {
cab190d4
JD
2156#if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
2157 dPOPTOPnnrl;
2158 if (Perl_isnan(left) || Perl_isnan(right))
2159 RETSETYES;
2160 SETs(boolSV(left != right));
2161#else
a0d0e21e 2162 dPOPnv;
54310121 2163 SETs(boolSV(TOPn != value));
cab190d4 2164#endif
a0d0e21e
LW
2165 RETURN;
2166 }
79072805
LW
2167}
2168
a0d0e21e 2169PP(pp_ncmp)
79072805 2170{
97aff369 2171 dVAR; dSP; dTARGET; tryAMAGICbin(ncmp,0);
d8c7644e 2172#ifndef NV_PRESERVES_UV
0bdaccee 2173 if (SvROK(TOPs) && !SvAMAGIC(TOPs) && SvROK(TOPm1s) && !SvAMAGIC(TOPm1s)) {
0bd48802
AL
2174 const UV right = PTR2UV(SvRV(POPs));
2175 const UV left = PTR2UV(SvRV(TOPs));
e61d22ef 2176 SETi((left > right) - (left < right));
d8c7644e
JH
2177 RETURN;
2178 }
2179#endif
28e5dec8
JH
2180#ifdef PERL_PRESERVE_IVUV
2181 /* Fortunately it seems NaN isn't IOK */
2182 SvIV_please(TOPs);
2183 if (SvIOK(TOPs)) {
2184 SvIV_please(TOPm1s);
2185 if (SvIOK(TOPm1s)) {
1b6737cc
AL
2186 const bool leftuvok = SvUOK(TOPm1s);
2187 const bool rightuvok = SvUOK(TOPs);
28e5dec8
JH
2188 I32 value;
2189 if (!leftuvok && !rightuvok) { /* ## IV <=> IV ## */
1b6737cc
AL
2190 const IV leftiv = SvIVX(TOPm1s);
2191 const IV rightiv = SvIVX(TOPs);
28e5dec8
JH
2192
2193 if (leftiv > rightiv)
2194 value = 1;
2195 else if (leftiv < rightiv)
2196 value = -1;
2197 else
2198 value = 0;
2199 } else if (leftuvok && rightuvok) { /* ## UV <=> UV ## */
1b6737cc
AL
2200 const UV leftuv = SvUVX(TOPm1s);
2201 const UV rightuv = SvUVX(TOPs);
28e5dec8
JH
2202
2203 if (leftuv > rightuv)
2204 value = 1;
2205 else if (leftuv < rightuv)
2206 value = -1;
2207 else
2208 value = 0;
2209 } else if (leftuvok) { /* ## UV <=> IV ## */
1b6737cc 2210 const IV rightiv = SvIVX(TOPs);
28e5dec8
JH
2211 if (rightiv < 0) {
2212 /* As (a) is a UV, it's >=0, so it cannot be < */
2213 value = 1;
2214 } else {
1b6737cc 2215 const UV leftuv = SvUVX(TOPm1s);
83bac5dd 2216 if (leftuv > (UV)rightiv) {
28e5dec8
JH
2217 value = 1;
2218 } else if (leftuv < (UV)rightiv) {
2219 value = -1;
2220 } else {
2221 value = 0;
2222 }
2223 }
2224 } else { /* ## IV <=> UV ## */
1b6737cc 2225 const IV leftiv = SvIVX(TOPm1s);
28e5dec8
JH
2226 if (leftiv < 0) {
2227 /* As (b) is a UV, it's >=0, so it must be < */
2228 value = -1;
2229 } else {
1b6737cc 2230 const UV rightuv = SvUVX(TOPs);
83bac5dd 2231 if ((UV)leftiv > rightuv) {
28e5dec8 2232 value = 1;
83bac5dd 2233 } else if ((UV)leftiv < rightuv) {
28e5dec8
JH
2234 value = -1;
2235 } else {
2236 value = 0;
2237 }
2238 }
2239 }
2240 SP--;
2241 SETi(value);
2242 RETURN;
2243 }
2244 }
2245#endif
a0d0e21e
LW
2246 {
2247 dPOPTOPnnrl;
2248 I32 value;
79072805 2249
a3540c92 2250#ifdef Perl_isnan
1ad04cfd
JH
2251 if (Perl_isnan(left) || Perl_isnan(right)) {
2252 SETs(&PL_sv_undef);
2253 RETURN;
2254 }
2255 value = (left > right) - (left < right);
2256#else
ff0cee69 2257 if (left == right)
a0d0e21e 2258 value = 0;
a0d0e21e
LW
2259 else if (left < right)
2260 value = -1;
44a8e56a 2261 else if (left > right)
2262 value = 1;
2263 else {
3280af22 2264 SETs(&PL_sv_undef);
44a8e56a 2265 RETURN;
2266 }
1ad04cfd 2267#endif
a0d0e21e
LW
2268 SETi(value);
2269 RETURN;
79072805 2270 }
a0d0e21e 2271}
79072805 2272
afd9910b 2273PP(pp_sle)
a0d0e21e 2274{
97aff369 2275 dVAR; dSP;
79072805 2276
afd9910b
NC
2277 int amg_type = sle_amg;
2278 int multiplier = 1;
2279 int rhs = 1;
79072805 2280
afd9910b
NC
2281 switch (PL_op->op_type) {
2282 case OP_SLT:
2283 amg_type = slt_amg;
2284 /* cmp < 0 */
2285 rhs = 0;
2286 break;
2287 case OP_SGT:
2288 amg_type = sgt_amg;
2289 /* cmp > 0 */
2290 multiplier = -1;
2291 rhs = 0;
2292 break;
2293 case OP_SGE:
2294 amg_type = sge_amg;
2295 /* cmp >= 0 */
2296 multiplier = -1;
2297 break;
79072805 2298 }
79072805 2299
afd9910b 2300 tryAMAGICbinSET_var(amg_type,0);
a0d0e21e
LW
2301 {
2302 dPOPTOPssrl;
1b6737cc 2303 const int cmp = (IN_LOCALE_RUNTIME
bbce6d69 2304 ? sv_cmp_locale(left, right)
2305 : sv_cmp(left, right));
afd9910b 2306 SETs(boolSV(cmp * multiplier < rhs));
a0d0e21e
LW
2307 RETURN;
2308 }
2309}
79072805 2310
36477c24 2311PP(pp_seq)
2312{
97aff369 2313 dVAR; dSP; tryAMAGICbinSET(seq,0);
36477c24 2314 {
2315 dPOPTOPssrl;
54310121 2316 SETs(boolSV(sv_eq(left, right)));
a0d0e21e
LW
2317 RETURN;
2318 }
2319}
79072805 2320
a0d0e21e 2321PP(pp_sne)
79072805 2322{
97aff369 2323 dVAR; dSP; tryAMAGICbinSET(sne,0);
a0d0e21e
LW
2324 {
2325 dPOPTOPssrl;
54310121 2326 SETs(boolSV(!sv_eq(left, right)));
a0d0e21e 2327 RETURN;
463ee0b2 2328 }
79072805
LW
2329}
2330
a0d0e21e 2331PP(pp_scmp)
79072805 2332{
97aff369 2333 dVAR; dSP; dTARGET; tryAMAGICbin(scmp,0);
a0d0e21e
LW
2334 {
2335 dPOPTOPssrl;
1b6737cc 2336 const int cmp = (IN_LOCALE_RUNTIME
bbce6d69 2337 ? sv_cmp_locale(left, right)
2338 : sv_cmp(left, right));
2339 SETi( cmp );
a0d0e21e
LW
2340 RETURN;
2341 }
2342}
79072805 2343
55497cff 2344PP(pp_bit_and)
2345{
97aff369 2346 dVAR; dSP; dATARGET; tryAMAGICbin(band,opASSIGN);
a0d0e21e
LW
2347 {
2348 dPOPTOPssrl;
5b295bef
RD
2349 SvGETMAGIC(left);
2350 SvGETMAGIC(right);
4633a7c4 2351 if (SvNIOKp(left) || SvNIOKp(right)) {
d0ba1bd2 2352 if (PL_op->op_private & HINT_INTEGER) {
1b6737cc 2353 const IV i = SvIV_nomg(left) & SvIV_nomg(right);
972b05a9 2354 SETi(i);
d0ba1bd2
JH
2355 }
2356 else {
1b6737cc 2357 const UV u = SvUV_nomg(left) & SvUV_nomg(right);
972b05a9 2358 SETu(u);
d0ba1bd2 2359 }
a0d0e21e
LW
2360 }
2361 else {
533c011a 2362 do_vop(PL_op->op_type, TARG, left, right);
a0d0e21e
LW
2363 SETTARG;
2364 }
2365 RETURN;
2366 }
2367}
79072805 2368
a0d0e21e
LW
2369PP(pp_bit_or)
2370{
3658c1f1
NC
2371 dVAR; dSP; dATARGET;
2372 const int op_type = PL_op->op_type;
2373
2374 tryAMAGICbin_var((op_type == OP_BIT_OR ? bor_amg : bxor_amg), opASSIGN);
a0d0e21e
LW
2375 {
2376 dPOPTOPssrl;
5b295bef
RD
2377 SvGETMAGIC(left);
2378 SvGETMAGIC(right);
4633a7c4 2379 if (SvNIOKp(left) || SvNIOKp(right)) {
d0ba1bd2 2380 if (PL_op->op_private & HINT_INTEGER) {
3658c1f1
NC
2381 const IV l = (USE_LEFT(left) ? SvIV_nomg(left) : 0);
2382 const IV r = SvIV_nomg(right);
2383 const IV result = op_type == OP_BIT_OR ? (l | r) : (l ^ r);
2384 SETi(result);
d0ba1bd2
JH
2385 }
2386 else {
3658c1f1
NC
2387 const UV l = (USE_LEFT(left) ? SvUV_nomg(left) : 0);
2388 const UV r = SvUV_nomg(right);
2389 const UV result = op_type == OP_BIT_OR ? (l | r) : (l ^ r);
2390 SETu(result);
d0ba1bd2 2391 }
a0d0e21e
LW
2392 }
2393 else {
3658c1f1 2394 do_vop(op_type, TARG, left, right);
a0d0e21e
LW
2395 SETTARG;
2396 }
2397 RETURN;
79072805 2398 }
a0d0e21e 2399}
79072805 2400
a0d0e21e
LW
2401PP(pp_negate)
2402{
97aff369 2403 dVAR; dSP; dTARGET; tryAMAGICun(neg);
a0d0e21e 2404 {
800401ee 2405 SV * const sv = sv_2num(TOPs);
1b6737cc 2406 const int flags = SvFLAGS(sv);
5b295bef 2407 SvGETMAGIC(sv);
28e5dec8
JH
2408 if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
2409 /* It's publicly an integer, or privately an integer-not-float */
2410 oops_its_an_int:
9b0e499b
GS
2411 if (SvIsUV(sv)) {
2412 if (SvIVX(sv) == IV_MIN) {
28e5dec8 2413 /* 2s complement assumption. */
9b0e499b
GS
2414 SETi(SvIVX(sv)); /* special case: -((UV)IV_MAX+1) == IV_MIN */
2415 RETURN;
2416 }
2417 else if (SvUVX(sv) <= IV_MAX) {
beccb14c 2418 SETi(-SvIVX(sv));
9b0e499b
GS
2419 RETURN;
2420 }
2421 }
2422 else if (SvIVX(sv) != IV_MIN) {
2423 SETi(-SvIVX(sv));
2424 RETURN;
2425 }
28e5dec8
JH
2426#ifdef PERL_PRESERVE_IVUV
2427 else {
2428 SETu((UV)IV_MIN);
2429 RETURN;
2430 }
2431#endif
9b0e499b
GS
2432 }
2433 if (SvNIOKp(sv))
a0d0e21e 2434 SETn(-SvNV(sv));
4633a7c4 2435 else if (SvPOKp(sv)) {
a0d0e21e 2436 STRLEN len;
c445ea15 2437 const char * const s = SvPV_const(sv, len);
bbce6d69 2438 if (isIDFIRST(*s)) {
76f68e9b 2439 sv_setpvs(TARG, "-");
a0d0e21e 2440 sv_catsv(TARG, sv);
79072805 2441 }
a0d0e21e
LW
2442 else if (*s == '+' || *s == '-') {
2443 sv_setsv(TARG, sv);
2444 *SvPV_force(TARG, len) = *s == '-' ? '+' : '-';
79072805 2445 }
8eb28a70
JH
2446 else if (DO_UTF8(sv)) {
2447 SvIV_please(sv);
2448 if (SvIOK(sv))
2449 goto oops_its_an_int;
2450 if (SvNOK(sv))
2451 sv_setnv(TARG, -SvNV(sv));
2452 else {
76f68e9b 2453 sv_setpvs(TARG, "-");
8eb28a70
JH
2454 sv_catsv(TARG, sv);
2455 }
834a4ddd 2456 }
28e5dec8 2457 else {
8eb28a70
JH
2458 SvIV_please(sv);
2459 if (SvIOK(sv))
2460 goto oops_its_an_int;
2461 sv_setnv(TARG, -SvNV(sv));
28e5dec8 2462 }
a0d0e21e 2463 SETTARG;
79072805 2464 }
4633a7c4
LW
2465 else
2466 SETn(-SvNV(sv));
79072805 2467 }
a0d0e21e 2468 RETURN;
79072805
LW
2469}
2470
a0d0e21e 2471PP(pp_not)
79072805 2472{
97aff369 2473 dVAR; dSP; tryAMAGICunSET(not);
3280af22 2474 *PL_stack_sp = boolSV(!SvTRUE(*PL_stack_sp));
a0d0e21e 2475 return NORMAL;
79072805
LW
2476}
2477
a0d0e21e 2478PP(pp_complement)
79072805 2479{
97aff369 2480 dVAR; dSP; dTARGET; tryAMAGICun(compl);
a0d0e21e
LW
2481 {
2482 dTOPss;
5b295bef 2483 SvGETMAGIC(sv);
4633a7c4 2484 if (SvNIOKp(sv)) {
d0ba1bd2 2485 if (PL_op->op_private & HINT_INTEGER) {
1b6737cc 2486 const IV i = ~SvIV_nomg(sv);
972b05a9 2487 SETi(i);
d0ba1bd2
JH
2488 }
2489 else {
1b6737cc 2490 const UV u = ~SvUV_nomg(sv);
972b05a9 2491 SETu(u);
d0ba1bd2 2492 }
a0d0e21e
LW
2493 }
2494 else {
51723571 2495 register U8 *tmps;
55497cff 2496 register I32 anum;
a0d0e21e
LW
2497 STRLEN len;
2498
10516c54 2499 (void)SvPV_nomg_const(sv,len); /* force check for uninit var */
891f9566 2500 sv_setsv_nomg(TARG, sv);
51723571 2501 tmps = (U8*)SvPV_force(TARG, len);
a0d0e21e 2502 anum = len;
1d68d6cd 2503 if (SvUTF8(TARG)) {
a1ca4561 2504 /* Calculate exact length, let's not estimate. */
1d68d6cd 2505 STRLEN targlen = 0;
ba210ebe 2506 STRLEN l;
a1ca4561
YST
2507 UV nchar = 0;
2508 UV nwide = 0;
01f6e806 2509 U8 * const send = tmps + len;
74d49cd0
TS
2510 U8 * const origtmps = tmps;
2511 const UV utf8flags = UTF8_ALLOW_ANYUV;
1d68d6cd 2512
1d68d6cd 2513 while (tmps < send) {
74d49cd0
TS
2514 const UV c = utf8n_to_uvchr(tmps, send-tmps, &l, utf8flags);
2515 tmps += l;
5bbb0b5a 2516 targlen += UNISKIP(~c);
a1ca4561
YST
2517 nchar++;
2518 if (c > 0xff)
2519 nwide++;
1d68d6cd
SC
2520 }
2521
2522 /* Now rewind strings and write them. */
74d49cd0 2523 tmps = origtmps;
a1ca4561
YST
2524
2525 if (nwide) {
01f6e806
AL
2526 U8 *result;
2527 U8 *p;
2528
74d49cd0 2529 Newx(result, targlen + 1, U8);
01f6e806 2530 p = result;
a1ca4561 2531 while (tmps < send) {
74d49cd0
TS
2532 const UV c = utf8n_to_uvchr(tmps, send-tmps, &l, utf8flags);
2533 tmps += l;
01f6e806 2534 p = uvchr_to_utf8_flags(p, ~c, UNICODE_ALLOW_ANY);
a1ca4561 2535 }
01f6e806 2536 *p = '\0';
c1c21316
NC
2537 sv_usepvn_flags(TARG, (char*)result, targlen,
2538 SV_HAS_TRAILING_NUL);
a1ca4561
YST
2539 SvUTF8_on(TARG);
2540 }
2541 else {
01f6e806
AL
2542 U8 *result;
2543 U8 *p;
2544
74d49cd0 2545 Newx(result, nchar + 1, U8);
01f6e806 2546 p = result;
a1ca4561 2547 while (tmps < send) {
74d49cd0
TS
2548 const U8 c = (U8)utf8n_to_uvchr(tmps, send-tmps, &l, utf8flags);
2549 tmps += l;
01f6e806 2550 *p++ = ~c;
a1ca4561 2551 }
01f6e806 2552 *p = '\0';
c1c21316 2553 sv_usepvn_flags(TARG, (char*)result, nchar, SV_HAS_TRAILING_NUL);
d0a21e00 2554 SvUTF8_off(TARG);
1d68d6cd 2555 }
ec93b65f 2556 SETTARG;
1d68d6cd
SC
2557 RETURN;
2558 }
a0d0e21e 2559#ifdef LIBERAL
51723571
JH
2560 {
2561 register long *tmpl;
2562 for ( ; anum && (unsigned long)tmps % sizeof(long); anum--, tmps++)
2563 *tmps = ~*tmps;
2564 tmpl = (long*)tmps;
bb7a0f54 2565 for ( ; anum >= (I32)sizeof(long); anum -= (I32)sizeof(long), tmpl++)
51723571
JH
2566 *tmpl = ~*tmpl;
2567 tmps = (U8*)tmpl;
2568 }
a0d0e21e
LW
2569#endif
2570 for ( ; anum > 0; anum--, tmps++)
2571 *tmps = ~*tmps;
ec93b65f 2572 SETTARG;
a0d0e21e
LW
2573 }
2574 RETURN;
2575 }
79072805
LW
2576}
2577
a0d0e21e
LW
2578/* integer versions of some of the above */
2579
a0d0e21e 2580PP(pp_i_multiply)
79072805 2581{
97aff369 2582 dVAR; dSP; dATARGET; tryAMAGICbin(mult,opASSIGN);
a0d0e21e
LW
2583 {
2584 dPOPTOPiirl;
2585 SETi( left * right );
2586 RETURN;
2587 }
79072805
LW
2588}
2589
a0d0e21e 2590PP(pp_i_divide)
79072805 2591{
ece1bcef 2592 IV num;
97aff369 2593 dVAR; dSP; dATARGET; tryAMAGICbin(div,opASSIGN);
a0d0e21e
LW
2594 {
2595 dPOPiv;
2596 if (value == 0)
ece1bcef
SP
2597 DIE(aTHX_ "Illegal division by zero");
2598 num = POPi;
a0cec769
YST
2599
2600 /* avoid FPE_INTOVF on some platforms when num is IV_MIN */
2601 if (value == -1)
2602 value = - num;
2603 else
2604 value = num / value;
a0d0e21e
LW
2605 PUSHi( value );
2606 RETURN;
2607 }
79072805
LW
2608}
2609
befad5d1 2610#if defined(__GLIBC__) && IVSIZE == 8
224ec323
JH
2611STATIC
2612PP(pp_i_modulo_0)
befad5d1
NC
2613#else
2614PP(pp_i_modulo)
2615#endif
224ec323
JH
2616{
2617 /* This is the vanilla old i_modulo. */
27da23d5 2618 dVAR; dSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
224ec323
JH
2619 {
2620 dPOPTOPiirl;
2621 if (!right)
2622 DIE(aTHX_ "Illegal modulus zero");
a0cec769
YST
2623 /* avoid FPE_INTOVF on some platforms when left is IV_MIN */
2624 if (right == -1)
2625 SETi( 0 );
2626 else
2627 SETi( left % right );
224ec323
JH
2628 RETURN;
2629 }
2630}
2631
11010fa3 2632#if defined(__GLIBC__) && IVSIZE == 8
224ec323
JH
2633STATIC
2634PP(pp_i_modulo_1)
befad5d1 2635
224ec323 2636{
224ec323 2637 /* This is the i_modulo with the workaround for the _moddi3 bug
fce2b89e 2638 * in (at least) glibc 2.2.5 (the PERL_ABS() the workaround).
224ec323 2639 * See below for pp_i_modulo. */
5186cc12 2640 dVAR; dSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
224ec323
JH
2641 {
2642 dPOPTOPiirl;
2643 if (!right)
2644 DIE(aTHX_ "Illegal modulus zero");
a0cec769
YST
2645 /* avoid FPE_INTOVF on some platforms when left is IV_MIN */
2646 if (right == -1)
2647 SETi( 0 );
2648 else
2649 SETi( left % PERL_ABS(right) );
224ec323
JH
2650 RETURN;
2651 }
224ec323
JH
2652}
2653
a0d0e21e 2654PP(pp_i_modulo)
79072805 2655{
27da23d5 2656 dVAR; dSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
224ec323
JH
2657 {
2658 dPOPTOPiirl;
2659 if (!right)
2660 DIE(aTHX_ "Illegal modulus zero");
2661 /* The assumption is to use hereafter the old vanilla version... */
2662 PL_op->op_ppaddr =
2663 PL_ppaddr[OP_I_MODULO] =
1c127fab 2664 Perl_pp_i_modulo_0;
224ec323
JH
2665 /* .. but if we have glibc, we might have a buggy _moddi3
2666 * (at least glicb 2.2.5 is known to have this bug), in other
2667 * words our integer modulus with negative quad as the second
2668 * argument might be broken. Test for this and re-patch the
2669 * opcode dispatch table if that is the case, remembering to
2670 * also apply the workaround so that this first round works
2671 * right, too. See [perl #9402] for more information. */
224ec323
JH
2672 {
2673 IV l = 3;
2674 IV r = -10;
2675 /* Cannot do this check with inlined IV constants since
2676 * that seems to work correctly even with the buggy glibc. */
2677 if (l % r == -3) {
2678 /* Yikes, we have the bug.
2679 * Patch in the workaround version. */
2680 PL_op->op_ppaddr =
2681 PL_ppaddr[OP_I_MODULO] =
2682 &Perl_pp_i_modulo_1;
2683 /* Make certain we work right this time, too. */
32fdb065 2684 right = PERL_ABS(right);
224ec323
JH
2685 }
2686 }
a0cec769
YST
2687 /* avoid FPE_INTOVF on some platforms when left is IV_MIN */
2688 if (right == -1)
2689 SETi( 0 );
2690 else
2691 SETi( left % right );
224ec323
JH
2692 RETURN;
2693 }
79072805 2694}
befad5d1 2695#endif
79072805 2696
a0d0e21e 2697PP(pp_i_add)
79072805 2698{
97aff369 2699 dVAR; dSP; dATARGET; tryAMAGICbin(add,opASSIGN);
a0d0e21e 2700 {
5e66d4f1 2701 dPOPTOPiirl_ul;
a0d0e21e
LW
2702 SETi( left + right );
2703 RETURN;
79072805 2704 }
79072805
LW
2705}
2706
a0d0e21e 2707PP(pp_i_subtract)
79072805 2708{
97aff369 2709 dVAR; dSP; dATARGET; tryAMAGICbin(subtr,opASSIGN);
a0d0e21e 2710 {
5e66d4f1 2711 dPOPTOPiirl_ul;
a0d0e21e
LW
2712 SETi( left - right );
2713 RETURN;
79072805 2714 }
79072805
LW
2715}
2716
a0d0e21e 2717PP(pp_i_lt)
79072805 2718{
97aff369 2719 dVAR; dSP; tryAMAGICbinSET(lt,0);
a0d0e21e
LW
2720 {
2721 dPOPTOPiirl;
54310121 2722 SETs(boolSV(left < right));
a0d0e21e
LW
2723 RETURN;
2724 }
79072805
LW
2725}
2726
a0d0e21e 2727PP(pp_i_gt)
79072805 2728{
97aff369 2729 dVAR; dSP; tryAMAGICbinSET(gt,0);
a0d0e21e
LW
2730 {
2731 dPOPTOPiirl;
54310121 2732 SETs(boolSV(left > right));
a0d0e21e
LW
2733 RETURN;
2734 }
79072805
LW
2735}
2736
a0d0e21e 2737PP(pp_i_le)
79072805 2738{
97aff369 2739 dVAR; dSP; tryAMAGICbinSET(le,0);
a0d0e21e
LW
2740 {
2741 dPOPTOPiirl;
54310121 2742 SETs(boolSV(left <= right));
a0d0e21e 2743 RETURN;
85e6fe83 2744 }
79072805
LW
2745}
2746
a0d0e21e 2747PP(pp_i_ge)
79072805 2748{
97aff369 2749 dVAR; dSP; tryAMAGICbinSET(ge,0);
a0d0e21e
LW
2750 {
2751 dPOPTOPiirl;
54310121 2752 SETs(boolSV(left >= right));
a0d0e21e
LW
2753 RETURN;
2754 }
79072805
LW
2755}
2756
a0d0e21e 2757PP(pp_i_eq)
79072805 2758{
97aff369 2759 dVAR; dSP; tryAMAGICbinSET(eq,0);
a0d0e21e
LW
2760 {
2761 dPOPTOPiirl;
54310121 2762 SETs(boolSV(left == right));
a0d0e21e
LW
2763 RETURN;
2764 }
79072805
LW
2765}
2766
a0d0e21e 2767PP(pp_i_ne)
79072805 2768{
97aff369 2769 dVAR; dSP; tryAMAGICbinSET(ne,0);
a0d0e21e
LW
2770 {
2771 dPOPTOPiirl;
54310121 2772 SETs(boolSV(left != right));
a0d0e21e
LW
2773 RETURN;
2774 }
79072805
LW
2775}
2776
a0d0e21e 2777PP(pp_i_ncmp)
79072805 2778{
97aff369 2779 dVAR; dSP; dTARGET; tryAMAGICbin(ncmp,0);
a0d0e21e
LW
2780 {
2781 dPOPTOPiirl;
2782 I32 value;
79072805 2783
a0d0e21e 2784 if (left > right)
79072805 2785 value = 1;
a0d0e21e 2786 else if (left < right)
79072805 2787 value = -1;
a0d0e21e 2788 else
79072805 2789 value = 0;
a0d0e21e
LW
2790 SETi(value);
2791 RETURN;
79072805 2792 }
85e6fe83
LW
2793}
2794
2795PP(pp_i_negate)
2796{
97aff369 2797 dVAR; dSP; dTARGET; tryAMAGICun(neg);
85e6fe83
LW
2798 SETi(-TOPi);
2799 RETURN;
2800}
2801
79072805
LW
2802/* High falutin' math. */
2803
2804PP(pp_atan2)
2805{
97aff369 2806 dVAR; dSP; dTARGET; tryAMAGICbin(atan2,0);
a0d0e21e
LW
2807 {
2808 dPOPTOPnnrl;
a1021d57 2809 SETn(Perl_atan2(left, right));
a0d0e21e
LW
2810 RETURN;
2811 }
79072805
LW
2812}
2813
2814PP(pp_sin)
2815{
71302fe3
NC
2816 dVAR; dSP; dTARGET;
2817 int amg_type = sin_amg;
2818 const char *neg_report = NULL;
bc81784a 2819 NV (*func)(NV) = Perl_sin;
71302fe3
NC
2820 const int op_type = PL_op->op_type;
2821
2822 switch (op_type) {
2823 case OP_COS:
2824 amg_type = cos_amg;
bc81784a 2825 func = Perl_cos;
71302fe3
NC
2826 break;
2827 case OP_EXP:
2828 amg_type = exp_amg;
bc81784a 2829 func = Perl_exp;
71302fe3
NC
2830 break;
2831 case OP_LOG:
2832 amg_type = log_amg;
bc81784a 2833 func = Perl_log;
71302fe3
NC
2834 neg_report = "log";
2835 break;
2836 case OP_SQRT:
2837 amg_type = sqrt_amg;
bc81784a 2838 func = Perl_sqrt;
71302fe3
NC
2839 neg_report = "sqrt";
2840 break;
a0d0e21e 2841 }
79072805 2842
71302fe3 2843 tryAMAGICun_var(amg_type);
a0d0e21e 2844 {
1b6737cc 2845 const NV value = POPn;
71302fe3
NC
2846 if (neg_report) {
2847 if (op_type == OP_LOG ? (value <= 0.0) : (value < 0.0)) {
2848 SET_NUMERIC_STANDARD();
2849 DIE(aTHX_ "Can't take %s of %"NVgf, neg_report, value);
2850 }
2851 }
2852 XPUSHn(func(value));
a0d0e21e
LW
2853 RETURN;
2854 }
79072805
LW
2855}
2856
56cb0a1c
AD
2857/* Support Configure command-line overrides for rand() functions.
2858 After 5.005, perhaps we should replace this by Configure support
2859 for drand48(), random(), or rand(). For 5.005, though, maintain
2860 compatibility by calling rand() but allow the user to override it.
2861 See INSTALL for details. --Andy Dougherty 15 July 1998
2862*/
85ab1d1d
JH
2863/* Now it's after 5.005, and Configure supports drand48() and random(),
2864 in addition to rand(). So the overrides should not be needed any more.
2865 --Jarkko Hietaniemi 27 September 1998
2866 */
2867
2868#ifndef HAS_DRAND48_PROTO
20ce7b12 2869extern double drand48 (void);
56cb0a1c
AD
2870#endif
2871
79072805
LW
2872PP(pp_rand)
2873{
97aff369 2874 dVAR; dSP; dTARGET;
65202027 2875 NV value;
79072805
LW
2876 if (MAXARG < 1)
2877 value = 1.0;
2878 else
2879 value = POPn;
2880 if (value == 0.0)
2881 value = 1.0;
80252599 2882 if (!PL_srand_called) {
85ab1d1d 2883 (void)seedDrand01((Rand_seed_t)seed());
80252599 2884 PL_srand_called = TRUE;
93dc8474 2885 }
85ab1d1d 2886 value *= Drand01();
79072805
LW
2887 XPUSHn(value);
2888 RETURN;
2889}
2890
2891PP(pp_srand)
2892{
97aff369 2893 dVAR; dSP;
0bd48802 2894 const UV anum = (MAXARG < 1) ? seed() : POPu;
85ab1d1d 2895 (void)seedDrand01((Rand_seed_t)anum);
80252599 2896 PL_srand_called = TRUE;
79072805
LW
2897 EXTEND(SP, 1);
2898 RETPUSHYES;
2899}
2900
79072805
LW
2901PP(pp_int)
2902{
97aff369 2903 dVAR; dSP; dTARGET; tryAMAGICun(int);
774d564b 2904 {
800401ee
JH
2905 SV * const sv = sv_2num(TOPs);
2906 const IV iv = SvIV(sv);
28e5dec8
JH
2907 /* XXX it's arguable that compiler casting to IV might be subtly
2908 different from modf (for numbers inside (IV_MIN,UV_MAX)) in which
2909 else preferring IV has introduced a subtle behaviour change bug. OTOH
2910 relying on floating point to be accurate is a bug. */
2911
c781a409 2912 if (!SvOK(sv)) {
922c4365 2913 SETu(0);
c781a409
RD
2914 }
2915 else if (SvIOK(sv)) {
2916 if (SvIsUV(sv))
2917 SETu(SvUV(sv));
2918 else
28e5dec8 2919 SETi(iv);
c781a409 2920 }
c781a409
RD
2921 else {
2922 const NV value = SvNV(sv);
1048ea30 2923 if (value >= 0.0) {
28e5dec8
JH
2924 if (value < (NV)UV_MAX + 0.5) {
2925 SETu(U_V(value));
2926 } else {
059a1014 2927 SETn(Perl_floor(value));
28e5dec8 2928 }
1048ea30 2929 }
28e5dec8
JH
2930 else {
2931 if (value > (NV)IV_MIN - 0.5) {
2932 SETi(I_V(value));
2933 } else {
1bbae031 2934 SETn(Perl_ceil(value));
28e5dec8
JH
2935 }
2936 }
774d564b 2937 }
79072805 2938 }
79072805
LW
2939 RETURN;
2940}
2941
463ee0b2
LW
2942PP(pp_abs)
2943{
97aff369 2944 dVAR; dSP; dTARGET; tryAMAGICun(abs);
a0d0e21e 2945 {
800401ee 2946 SV * const sv = sv_2num(TOPs);
28e5dec8 2947 /* This will cache the NV value if string isn't actually integer */
800401ee 2948 const IV iv = SvIV(sv);
a227d84d 2949
800401ee 2950 if (!SvOK(sv)) {
922c4365 2951 SETu(0);
800401ee
JH
2952 }
2953 else if (SvIOK(sv)) {
28e5dec8 2954 /* IVX is precise */
800401ee
JH
2955 if (SvIsUV(sv)) {
2956 SETu(SvUV(sv)); /* force it to be numeric only */
28e5dec8
JH
2957 } else {
2958 if (iv >= 0) {
2959 SETi(iv);
2960 } else {
2961 if (iv != IV_MIN) {
2962 SETi(-iv);
2963 } else {
2964 /* 2s complement assumption. Also, not really needed as
2965 IV_MIN and -IV_MIN should both be %100...00 and NV-able */
2966 SETu(IV_MIN);
2967 }
a227d84d 2968 }
28e5dec8
JH
2969 }
2970 } else{
800401ee 2971 const NV value = SvNV(sv);
774d564b 2972 if (value < 0.0)
1b6737cc 2973 SETn(-value);
a4474c9e
DD
2974 else
2975 SETn(value);
774d564b 2976 }
a0d0e21e 2977 }
774d564b 2978 RETURN;
463ee0b2
LW
2979}
2980
79072805
LW
2981PP(pp_oct)
2982{
97aff369 2983 dVAR; dSP; dTARGET;
5c144d81 2984 const char *tmps;
53305cf1 2985 I32 flags = PERL_SCAN_ALLOW_UNDERSCORES;
6f894ead 2986 STRLEN len;
53305cf1
NC
2987 NV result_nv;
2988 UV result_uv;
1b6737cc 2989 SV* const sv = POPs;
79072805 2990
349d4f2f 2991 tmps = (SvPV_const(sv, len));
2bc69dc4
NIS
2992 if (DO_UTF8(sv)) {
2993 /* If Unicode, try to downgrade
2994 * If not possible, croak. */
1b6737cc 2995 SV* const tsv = sv_2mortal(newSVsv(sv));
2bc69dc4
NIS
2996
2997 SvUTF8_on(tsv);
2998 sv_utf8_downgrade(tsv, FALSE);
349d4f2f 2999 tmps = SvPV_const(tsv, len);
2bc69dc4 3000 }
daa2adfd
NC
3001 if (PL_op->op_type == OP_HEX)
3002 goto hex;
3003
6f894ead 3004 while (*tmps && len && isSPACE(*tmps))
53305cf1 3005 tmps++, len--;
9e24b6e2 3006 if (*tmps == '0')
53305cf1 3007 tmps++, len--;
daa2adfd
NC
3008 if (*tmps == 'x') {
3009 hex:
53305cf1 3010 result_uv = grok_hex (tmps, &len, &flags, &result_nv);
daa2adfd 3011 }
9e24b6e2 3012 else if (*tmps == 'b')
53305cf1 3013 result_uv = grok_bin (tmps, &len, &flags, &result_nv);
464e2e8a 3014 else
53305cf1
NC
3015 result_uv = grok_oct (tmps, &len, &flags, &result_nv);
3016
3017 if (flags & PERL_SCAN_GREATER_THAN_UV_MAX) {
3018 XPUSHn(result_nv);
3019 }
3020 else {
3021 XPUSHu(result_uv);
3022 }
79072805
LW
3023 RETURN;
3024}
3025
3026/* String stuff. */
3027
3028PP(pp_length)
3029{
97aff369 3030 dVAR; dSP; dTARGET;
0bd48802 3031 SV * const sv = TOPs;
a0ed51b3 3032
656266fc 3033 if (SvGAMAGIC(sv)) {
9f621bb0
NC
3034 /* For an overloaded or magic scalar, we can't know in advance if
3035 it's going to be UTF-8 or not. Also, we can't call sv_len_utf8 as
3036 it likes to cache the length. Maybe that should be a documented
3037 feature of it.
92331800
NC
3038 */
3039 STRLEN len;
9f621bb0
NC
3040 const char *const p
3041 = sv_2pv_flags(sv, &len,
3042 SV_UNDEF_RETURNS_NULL|SV_CONST_RETURN|SV_GMAGIC);
92331800 3043
9f621bb0
NC
3044 if (!p)
3045 SETs(&PL_sv_undef);
3046 else if (DO_UTF8(sv)) {
899be101 3047 SETi(utf8_length((U8*)p, (U8*)p + len));
92331800
NC
3048 }
3049 else
3050 SETi(len);
656266fc 3051 } else if (SvOK(sv)) {
9f621bb0
NC
3052 /* Neither magic nor overloaded. */
3053 if (DO_UTF8(sv))
3054 SETi(sv_len_utf8(sv));
3055 else
3056 SETi(sv_len(sv));
656266fc
NC
3057 } else {
3058 SETs(&PL_sv_undef);
92331800 3059 }
79072805
LW
3060 RETURN;
3061}
3062
3063PP(pp_substr)
3064{
97aff369 3065 dVAR; dSP; dTARGET;
79072805 3066 SV *sv;
9c5ffd7c 3067 I32 len = 0;
463ee0b2 3068 STRLEN curlen;
9402d6ed 3069 STRLEN utf8_curlen;
79072805
LW
3070 I32 pos;
3071 I32 rem;
84902520 3072 I32 fail;
050e6362 3073 const I32 lvalue = PL_op->op_flags & OPf_MOD || LVRET;
e1ec3a88 3074 const char *tmps;
fc15ae8f 3075 const I32 arybase = CopARYBASE_get(PL_curcop);
9402d6ed 3076 SV *repl_sv = NULL;
cbbf8932 3077 const char *repl = NULL;
7b8d334a 3078 STRLEN repl_len;
050e6362 3079 const int num_args = PL_op->op_private & 7;
13e30c65 3080 bool repl_need_utf8_upgrade = FALSE;
9402d6ed 3081 bool repl_is_utf8 = FALSE;
79072805 3082
20408e3c 3083 SvTAINTED_off(TARG); /* decontaminate */
7e2040f0 3084 SvUTF8_off(TARG); /* decontaminate */
78f9721b
SM
3085 if (num_args > 2) {
3086 if (num_args > 3) {
9402d6ed 3087 repl_sv = POPs;
83003860 3088 repl = SvPV_const(repl_sv, repl_len);
9402d6ed 3089 repl_is_utf8 = DO_UTF8(repl_sv) && SvCUR(repl_sv);
7b8d334a 3090 }
79072805 3091 len = POPi;
5d82c453 3092 }
84902520 3093 pos = POPi;
79072805 3094 sv = POPs;
849ca7ee 3095 PUTBACK;
9402d6ed
JH
3096 if (repl_sv) {
3097 if (repl_is_utf8) {
3098 if (!DO_UTF8(sv))
3099 sv_utf8_upgrade(sv);
3100 }
13e30c65
JH
3101 else if (DO_UTF8(sv))
3102 repl_need_utf8_upgrade = TRUE;
9402d6ed 3103 }
5c144d81 3104 tmps = SvPV_const(sv, curlen);
7e2040f0 3105 if (DO_UTF8(sv)) {
9402d6ed
JH
3106 utf8_curlen = sv_len_utf8(sv);
3107 if (utf8_curlen == curlen)
3108 utf8_curlen = 0;
a0ed51b3 3109 else
9402d6ed 3110 curlen = utf8_curlen;
a0ed51b3 3111 }
d1c2b58a 3112 else
9402d6ed 3113 utf8_curlen = 0;
a0ed51b3 3114
84902520
TB
3115 if (pos >= arybase) {
3116 pos -= arybase;
3117 rem = curlen-pos;
3118 fail = rem;
78f9721b 3119 if (num_args > 2) {
5d82c453
GA
3120 if (len < 0) {
3121 rem += len;
3122 if (rem < 0)
3123 rem = 0;
3124 }
3125 else if (rem > len)
3126 rem = len;
3127 }
68dc0745 3128 }
84902520 3129 else {
5d82c453 3130 pos += curlen;
78f9721b 3131 if (num_args < 3)
5d82c453
GA
3132 rem = curlen;
3133 else if (len >= 0) {
3134 rem = pos+len;
3135 if (rem > (I32)curlen)
3136 rem = curlen;
3137 }
3138 else {
3139 rem = curlen+len;
3140 if (rem < pos)
3141 rem = pos;
3142 }
3143 if (pos < 0)
3144 pos = 0;
3145 fail = rem;
3146 rem -= pos;
84902520
TB
3147 }
3148 if (fail < 0) {
e476b1b5
GS
3149 if (lvalue || repl)
3150 Perl_croak(aTHX_ "substr outside of string");
3151 if (ckWARN(WARN_SUBSTR))
9014280d 3152 Perl_warner(aTHX_ packWARN(WARN_SUBSTR), "substr outside of string");
2304df62
AD
3153 RETPUSHUNDEF;
3154 }
79072805 3155 else {
1b6737cc
AL
3156 const I32 upos = pos;
3157 const I32 urem = rem;
9402d6ed 3158 if (utf8_curlen)
a0ed51b3 3159 sv_pos_u2b(sv, &pos, &rem);
79072805 3160 tmps += pos;
781e7547
DM
3161 /* we either return a PV or an LV. If the TARG hasn't been used
3162 * before, or is of that type, reuse it; otherwise use a mortal
3163 * instead. Note that LVs can have an extended lifetime, so also
3164 * dont reuse if refcount > 1 (bug #20933) */
3165 if (SvTYPE(TARG) > SVt_NULL) {
3166 if ( (SvTYPE(TARG) == SVt_PVLV)
3167 ? (!lvalue || SvREFCNT(TARG) > 1)
3168 : lvalue)
3169 {
3170 TARG = sv_newmortal();
3171 }
3172 }
3173
050e6362 3174 sv_setpvn(TARG, tmps, rem);
12aa1545 3175#ifdef USE_LOCALE_COLLATE
14befaf4 3176 sv_unmagic(TARG, PERL_MAGIC_collxfrm);
12aa1545 3177#endif
9402d6ed 3178 if (utf8_curlen)
7f66633b 3179 SvUTF8_on(TARG);
f7928d6c 3180 if (repl) {
13e30c65
JH
3181 SV* repl_sv_copy = NULL;
3182
3183 if (repl_need_utf8_upgrade) {
3184 repl_sv_copy = newSVsv(repl_sv);
3185 sv_utf8_upgrade(repl_sv_copy);
349d4f2f 3186 repl = SvPV_const(repl_sv_copy, repl_len);
13e30c65
JH
3187 repl_is_utf8 = DO_UTF8(repl_sv_copy) && SvCUR(sv);
3188 }
502d9230
VP
3189 if (!SvOK(sv))
3190 sv_setpvs(sv, "");
c0dd94a0 3191 sv_insert_flags(sv, pos, rem, repl, repl_len, 0);
9402d6ed 3192 if (repl_is_utf8)
f7928d6c 3193 SvUTF8_on(sv);
9402d6ed
JH
3194 if (repl_sv_copy)
3195 SvREFCNT_dec(repl_sv_copy);
f7928d6c 3196 }
c8faf1c5 3197 else if (lvalue) { /* it's an lvalue! */
dedeecda 3198 if (!SvGMAGICAL(sv)) {
3199 if (SvROK(sv)) {
13c5b33c 3200 SvPV_force_nolen(sv);
599cee73 3201 if (ckWARN(WARN_SUBSTR))
9014280d 3202 Perl_warner(aTHX_ packWARN(WARN_SUBSTR),
599cee73 3203 "Attempt to use reference as lvalue in substr");
dedeecda 3204 }
f7877b28
NC
3205 if (isGV_with_GP(sv))
3206 SvPV_force_nolen(sv);
3207 else if (SvOK(sv)) /* is it defined ? */
7f66633b 3208 (void)SvPOK_only_UTF8(sv);
dedeecda 3209 else
523f125d 3210 sv_setpvs(sv, ""); /* avoid lexical reincarnation */
dedeecda 3211 }
5f05dabc 3212
a0d0e21e
LW
3213 if (SvTYPE(TARG) < SVt_PVLV) {
3214 sv_upgrade(TARG, SVt_PVLV);
c445ea15 3215 sv_magic(TARG, NULL, PERL_MAGIC_substr, NULL, 0);
ed6116ce 3216 }
a0d0e21e 3217
5f05dabc 3218 LvTYPE(TARG) = 'x';
6ff81951
GS
3219 if (LvTARG(TARG) != sv) {
3220 if (LvTARG(TARG))
3221 SvREFCNT_dec(LvTARG(TARG));
b37c2d43 3222 LvTARG(TARG) = SvREFCNT_inc_simple(sv);
6ff81951 3223 }
9aa983d2
JH
3224 LvTARGOFF(TARG) = upos;
3225 LvTARGLEN(TARG) = urem;
79072805
LW
3226 }
3227 }
849ca7ee 3228 SPAGAIN;
79072805
LW
3229 PUSHs(TARG); /* avoid SvSETMAGIC here */
3230 RETURN;
3231}
3232
3233PP(pp_vec)
3234{
97aff369 3235 dVAR; dSP; dTARGET;
1b6737cc
AL
3236 register const IV size = POPi;
3237 register const IV offset = POPi;
3238 register SV * const src = POPs;
3239 const I32 lvalue = PL_op->op_flags & OPf_MOD || LVRET;
a0d0e21e 3240
81e118e0
JH
3241 SvTAINTED_off(TARG); /* decontaminate */
3242 if (lvalue) { /* it's an lvalue! */
24aef97f
HS
3243 if (SvREFCNT(TARG) > 1) /* don't share the TARG (#20933) */
3244 TARG = sv_newmortal();
81e118e0
JH
3245 if (SvTYPE(TARG) < SVt_PVLV) {
3246 sv_upgrade(TARG, SVt_PVLV);
c445ea15 3247 sv_magic(TARG, NULL, PERL_MAGIC_vec, NULL, 0);
79072805 3248 }
81e118e0
JH
3249 LvTYPE(TARG) = 'v';
3250 if (LvTARG(TARG) != src) {
3251 if (LvTARG(TARG))
3252 SvREFCNT_dec(LvTARG(TARG));
b37c2d43 3253 LvTARG(TARG) = SvREFCNT_inc_simple(src);
79072805 3254 }
81e118e0
JH
3255 LvTARGOFF(TARG) = offset;
3256 LvTARGLEN(TARG) = size;
79072805
LW
3257 }
3258
81e118e0 3259 sv_setuv(TARG, do_vecget(src, offset, size));
79072805
LW
3260 PUSHs(TARG);
3261 RETURN;
3262}
3263
3264PP(pp_index)
3265{
97aff369 3266 dVAR; dSP; dTARGET;
79072805
LW
3267 SV *big;
3268 SV *little;
c445ea15 3269 SV *temp = NULL;
ad66a58c 3270 STRLEN biglen;
2723d216 3271 STRLEN llen = 0;
79072805
LW
3272 I32 offset;
3273 I32 retval;
73ee8be2
NC
3274 const char *big_p;
3275 const char *little_p;
fc15ae8f 3276 const I32 arybase = CopARYBASE_get(PL_curcop);
2f040f7f
NC
3277 bool big_utf8;
3278 bool little_utf8;
2723d216 3279 const bool is_index = PL_op->op_type == OP_INDEX;
79072805 3280
2723d216
NC
3281 if (MAXARG >= 3) {
3282 /* arybase is in characters, like offset, so combine prior to the
3283 UTF-8 to bytes calculation. */
79072805 3284 offset = POPi - arybase;
2723d216 3285 }
79072805
LW
3286 little = POPs;
3287 big = POPs;
73ee8be2
NC
3288 big_p = SvPV_const(big, biglen);
3289 little_p = SvPV_const(little, llen);
3290
e609e586
NC
3291 big_utf8 = DO_UTF8(big);
3292 little_utf8 = DO_UTF8(little);
3293 if (big_utf8 ^ little_utf8) {
3294 /* One needs to be upgraded. */
2f040f7f
NC
3295 if (little_utf8 && !PL_encoding) {
3296 /* Well, maybe instead we might be able to downgrade the small
3297 string? */
1eced8f8 3298 char * const pv = (char*)bytes_from_utf8((U8 *)little_p, &llen,
2f040f7f
NC
3299 &little_utf8);
3300 if (little_utf8) {
3301 /* If the large string is ISO-8859-1, and it's not possible to
3302 convert the small string to ISO-8859-1, then there is no
3303 way that it could be found anywhere by index. */
3304 retval = -1;
3305 goto fail;
3306 }
e609e586 3307
2f040f7f
NC
3308 /* At this point, pv is a malloc()ed string. So donate it to temp
3309 to ensure it will get free()d */
3310 little = temp = newSV(0);
73ee8be2
NC
3311 sv_usepvn(temp, pv, llen);
3312 little_p = SvPVX(little);
e609e586 3313 } else {
73ee8be2
NC
3314 temp = little_utf8
3315 ? newSVpvn(big_p, biglen) : newSVpvn(little_p, llen);
2f040f7f
NC
3316
3317 if (PL_encoding) {
3318 sv_recode_to_utf8(temp, PL_encoding);
3319 } else {
3320 sv_utf8_upgrade(temp);
3321 }
3322 if (little_utf8) {
3323 big = temp;
3324 big_utf8 = TRUE;
73ee8be2 3325 big_p = SvPV_const(big, biglen);
2f040f7f
NC
3326 } else {
3327 little = temp;
73ee8be2 3328 little_p = SvPV_const(little, llen);
2f040f7f 3329 }
e609e586
NC
3330 }
3331 }
73ee8be2
NC
3332 if (SvGAMAGIC(big)) {
3333 /* Life just becomes a lot easier if I use a temporary here.
3334 Otherwise I need to avoid calls to sv_pos_u2b(), which (dangerously)
3335 will trigger magic and overloading again, as will fbm_instr()
3336 */
59cd0e26
NC
3337 big = newSVpvn_flags(big_p, biglen,
3338 SVs_TEMP | (big_utf8 ? SVf_UTF8 : 0));
73ee8be2
NC
3339 big_p = SvPVX(big);
3340 }
e4e44778 3341 if (SvGAMAGIC(little) || (is_index && !SvOK(little))) {
73ee8be2
NC
3342 /* index && SvOK() is a hack. fbm_instr() calls SvPV_const, which will
3343 warn on undef, and we've already triggered a warning with the
3344 SvPV_const some lines above. We can't remove that, as we need to
3345 call some SvPV to trigger overloading early and find out if the
3346 string is UTF-8.
3347 This is all getting to messy. The API isn't quite clean enough,
3348 because data access has side effects.
3349 */
59cd0e26
NC
3350 little = newSVpvn_flags(little_p, llen,
3351 SVs_TEMP | (little_utf8 ? SVf_UTF8 : 0));
73ee8be2
NC
3352 little_p = SvPVX(little);
3353 }
e609e586 3354
79072805 3355 if (MAXARG < 3)
2723d216 3356 offset = is_index ? 0 : biglen;
a0ed51b3 3357 else {
ad66a58c 3358 if (big_utf8 && offset > 0)
a0ed51b3 3359 sv_pos_u2b(big, &offset, 0);
73ee8be2
NC
3360 if (!is_index)
3361 offset += llen;
a0ed51b3 3362 }
79072805
LW
3363 if (offset < 0)
3364 offset = 0;
ad66a58c
NC
3365 else if (offset > (I32)biglen)
3366 offset = biglen;
73ee8be2
NC
3367 if (!(little_p = is_index
3368 ? fbm_instr((unsigned char*)big_p + offset,
3369 (unsigned char*)big_p + biglen, little, 0)
3370 : rninstr(big_p, big_p + offset,
3371 little_p, little_p + llen)))
a0ed51b3 3372 retval = -1;
ad66a58c 3373 else {
73ee8be2 3374 retval = little_p - big_p;
ad66a58c
NC
3375 if (retval > 0 && big_utf8)
3376 sv_pos_b2u(big, &retval);
3377 }
e609e586
NC
3378 if (temp)
3379 SvREFCNT_dec(temp);
2723d216 3380 fail:
a0ed51b3 3381 PUSHi(retval + arybase);
79072805
LW
3382 RETURN;
3383}
3384
3385PP(pp_sprintf)
3386{
97aff369 3387 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
20ee07fb
RGS
3388 if (SvTAINTED(MARK[1]))
3389 TAINT_PROPER("sprintf");
79072805 3390 do_sprintf(TARG, SP-MARK, MARK+1);
bbce6d69 3391 TAINT_IF(SvTAINTED(TARG));
79072805
LW
3392 SP = ORIGMARK;
3393 PUSHTARG;
3394 RETURN;
3395}
3396
79072805
LW
3397PP(pp_ord)
3398{
97aff369 3399 dVAR; dSP; dTARGET;
1eced8f8 3400
7df053ec 3401 SV *argsv = POPs;
ba210ebe 3402 STRLEN len;
349d4f2f 3403 const U8 *s = (U8*)SvPV_const(argsv, len);
121910a4 3404
799ef3cb 3405 if (PL_encoding && SvPOK(argsv) && !DO_UTF8(argsv)) {
1eced8f8 3406 SV * const tmpsv = sv_2mortal(newSVsv(argsv));
799ef3cb 3407 s = (U8*)sv_recode_to_utf8(tmpsv, PL_encoding);
121910a4
JH
3408 argsv = tmpsv;
3409 }
79072805 3410
872c91ae 3411 XPUSHu(DO_UTF8(argsv) ?
89ebb4a3 3412 utf8n_to_uvchr(s, UTF8_MAXBYTES, 0, UTF8_ALLOW_ANYUV) :
5fc32dea 3413 (UV)(*s & 0xff));
68795e93 3414
79072805
LW
3415 RETURN;
3416}
3417
463ee0b2
LW
3418PP(pp_chr)
3419{
97aff369 3420 dVAR; dSP; dTARGET;
463ee0b2 3421 char *tmps;
8a064bd6
JH
3422 UV value;
3423
3424 if (((SvIOK_notUV(TOPs) && SvIV(TOPs) < 0)
3425 ||
3426 (SvNOK(TOPs) && SvNV(TOPs) < 0.0))) {
3427 if (IN_BYTES) {
3428 value = POPu; /* chr(-1) eq chr(0xff), etc. */
3429 } else {
3430 (void) POPs; /* Ignore the argument value. */
3431 value = UNICODE_REPLACEMENT;
3432 }
3433 } else {
3434 value = POPu;
3435 }
463ee0b2 3436
862a34c6 3437 SvUPGRADE(TARG,SVt_PV);
a0ed51b3 3438
0064a8a9 3439 if (value > 255 && !IN_BYTES) {
eb160463 3440 SvGROW(TARG, (STRLEN)UNISKIP(value)+1);
62961d2e 3441 tmps = (char*)uvchr_to_utf8_flags((U8*)SvPVX(TARG), value, 0);
349d4f2f 3442 SvCUR_set(TARG, tmps - SvPVX_const(TARG));
a0ed51b3
LW
3443 *tmps = '\0';
3444 (void)SvPOK_only(TARG);
aa6ffa16 3445 SvUTF8_on(TARG);
a0ed51b3
LW
3446 XPUSHs(TARG);
3447 RETURN;
3448 }
3449
748a9306 3450 SvGROW(TARG,2);
463ee0b2
LW
3451 SvCUR_set(TARG, 1);
3452 tmps = SvPVX(TARG);
eb160463 3453 *tmps++ = (char)value;
748a9306 3454 *tmps = '\0';
a0d0e21e 3455 (void)SvPOK_only(TARG);
4c5ed6e2 3456
88632417 3457 if (PL_encoding && !IN_BYTES) {
799ef3cb 3458 sv_recode_to_utf8(TARG, PL_encoding);
88632417
JH
3459 tmps = SvPVX(TARG);
3460 if (SvCUR(TARG) == 0 || !is_utf8_string((U8*)tmps, SvCUR(TARG)) ||
4c5ed6e2
TS
3461 UNICODE_IS_REPLACEMENT(utf8_to_uvchr((U8*)tmps, NULL))) {
3462 SvGROW(TARG, 2);
d5a15ac2 3463 tmps = SvPVX(TARG);
4c5ed6e2
TS
3464 SvCUR_set(TARG, 1);
3465 *tmps++ = (char)value;
88632417 3466 *tmps = '\0';
4c5ed6e2 3467 SvUTF8_off(TARG);
88632417
JH
3468 }
3469 }
4c5ed6e2 3470
463ee0b2
LW
3471 XPUSHs(TARG);
3472 RETURN;
3473}
3474
79072805
LW
3475PP(pp_crypt)
3476{
79072805 3477#ifdef HAS_CRYPT
97aff369 3478 dVAR; dSP; dTARGET;
5f74f29c 3479 dPOPTOPssrl;
85c16d83 3480 STRLEN len;
10516c54 3481 const char *tmps = SvPV_const(left, len);
2bc69dc4 3482
85c16d83 3483 if (DO_UTF8(left)) {
2bc69dc4 3484 /* If Unicode, try to downgrade.
f2791508
JH
3485 * If not possible, croak.
3486 * Yes, we made this up. */
1b6737cc 3487 SV* const tsv = sv_2mortal(newSVsv(left));
2bc69dc4 3488
f2791508 3489 SvUTF8_on(tsv);
2bc69dc4 3490 sv_utf8_downgrade(tsv, FALSE);
349d4f2f 3491 tmps = SvPV_const(tsv, len);
85c16d83 3492 }
05404ffe
JH
3493# ifdef USE_ITHREADS
3494# ifdef HAS_CRYPT_R
3495 if (!PL_reentrant_buffer->_crypt_struct_buffer) {
3496 /* This should be threadsafe because in ithreads there is only
3497 * one thread per interpreter. If this would not be true,
3498 * we would need a mutex to protect this malloc. */
3499 PL_reentrant_buffer->_crypt_struct_buffer =
3500 (struct crypt_data *)safemalloc(sizeof(struct crypt_data));
3501#if defined(__GLIBC__) || defined(__EMX__)
3502 if (PL_reentrant_buffer->_crypt_struct_buffer) {
3503 PL_reentrant_buffer->_crypt_struct_buffer->initialized = 0;
3504 /* work around glibc-2.2.5 bug */
3505 PL_reentrant_buffer->_crypt_struct_buffer->current_saltbits = 0;
3506 }
05404ffe 3507#endif
6ab58e4d 3508 }
05404ffe
JH
3509# endif /* HAS_CRYPT_R */
3510# endif /* USE_ITHREADS */
5f74f29c 3511# ifdef FCRYPT
83003860 3512 sv_setpv(TARG, fcrypt(tmps, SvPV_nolen_const(right)));
5f74f29c 3513# else
83003860 3514 sv_setpv(TARG, PerlProc_crypt(tmps, SvPV_nolen_const(right)));
5f74f29c 3515# endif
ec93b65f 3516 SETTARG;
4808266b 3517 RETURN;
79072805 3518#else
b13b2135 3519 DIE(aTHX_
79072805
LW
3520 "The crypt() function is unimplemented due to excessive paranoia.");
3521#endif
79072805
LW
3522}
3523
3524PP(pp_ucfirst)
3525{
97aff369 3526 dVAR;
39644a26 3527 dSP;
d54190f6 3528 SV *source = TOPs;
a0ed51b3 3529 STRLEN slen;
d54190f6
NC
3530 STRLEN need;
3531 SV *dest;
3532 bool inplace = TRUE;
3533 bool doing_utf8;
12e9c124 3534 const int op_type = PL_op->op_type;
d54190f6
NC
3535 const U8 *s;
3536 U8 *d;
3537 U8 tmpbuf[UTF8_MAXBYTES_CASE+1];
3538 STRLEN ulen;
3539 STRLEN tculen;
3540
3541 SvGETMAGIC(source);
3542 if (SvOK(source)) {
3543 s = (const U8*)SvPV_nomg_const(source, slen);
3544 } else {
0a0ffbce
RGS
3545 if (ckWARN(WARN_UNINITIALIZED))
3546 report_uninit(source);
1eced8f8 3547 s = (const U8*)"";
d54190f6
NC
3548 slen = 0;
3549 }
a0ed51b3 3550
d54190f6
NC
3551 if (slen && DO_UTF8(source) && UTF8_IS_START(*s)) {
3552 doing_utf8 = TRUE;
44bc797b 3553 utf8_to_uvchr(s, &ulen);
12e9c124
NC
3554 if (op_type == OP_UCFIRST) {
3555 toTITLE_utf8(s, tmpbuf, &tculen);
3556 } else {
3557 toLOWER_utf8(s, tmpbuf, &tculen);
3558 }
d54190f6 3559 /* If the two differ, we definately cannot do inplace. */
1eced8f8 3560 inplace = (ulen == tculen);
d54190f6
NC
3561 need = slen + 1 - ulen + tculen;
3562 } else {
3563 doing_utf8 = FALSE;
3564 need = slen + 1;
3565 }
3566
17fa0776 3567 if (SvPADTMP(source) && !SvREADONLY(source) && inplace && SvTEMP(source)) {
d54190f6
NC
3568 /* We can convert in place. */
3569
3570 dest = source;
3571 s = d = (U8*)SvPV_force_nomg(source, slen);
3572 } else {
3573 dTARGET;
3574
3575 dest = TARG;
3576
3577 SvUPGRADE(dest, SVt_PV);
3b416f41 3578 d = (U8*)SvGROW(dest, need);
d54190f6
NC
3579 (void)SvPOK_only(dest);
3580
3581 SETs(dest);
3582
3583 inplace = FALSE;
3584 }
44bc797b 3585
d54190f6
NC
3586 if (doing_utf8) {
3587 if(!inplace) {
3a2263fe
RGS
3588 /* slen is the byte length of the whole SV.
3589 * ulen is the byte length of the original Unicode character
3590 * stored as UTF-8 at s.
12e9c124
NC
3591 * tculen is the byte length of the freshly titlecased (or
3592 * lowercased) Unicode character stored as UTF-8 at tmpbuf.
3593 * We first set the result to be the titlecased (/lowercased)
3594 * character, and then append the rest of the SV data. */
d54190f6 3595 sv_setpvn(dest, (char*)tmpbuf, tculen);
3a2263fe 3596 if (slen > ulen)
d54190f6
NC
3597 sv_catpvn(dest, (char*)(s + ulen), slen - ulen);
3598 SvUTF8_on(dest);
a0ed51b3
LW
3599 }
3600 else {
d54190f6
NC
3601 Copy(tmpbuf, d, tculen, U8);
3602 SvCUR_set(dest, need - 1);
a0ed51b3 3603 }
a0ed51b3 3604 }
626727d5 3605 else {
d54190f6 3606 if (*s) {
2de3dbcc 3607 if (IN_LOCALE_RUNTIME) {
31351b04 3608 TAINT;
d54190f6
NC
3609 SvTAINTED_on(dest);
3610 *d = (op_type == OP_UCFIRST)
3611 ? toUPPER_LC(*s) : toLOWER_LC(*s);
31351b04
JS
3612 }
3613 else
d54190f6
NC
3614 *d = (op_type == OP_UCFIRST) ? toUPPER(*s) : toLOWER(*s);
3615 } else {
3616 /* See bug #39028 */
3617 *d = *s;
3618 }
3619
3620 if (SvUTF8(source))
3621 SvUTF8_on(dest);
3622
3623 if (!inplace) {
3624 /* This will copy the trailing NUL */
3625 Copy(s + 1, d + 1, slen, U8);
3626 SvCUR_set(dest, need - 1);
bbce6d69 3627 }
bbce6d69 3628 }
d54190f6 3629 SvSETMAGIC(dest);
79072805
LW
3630 RETURN;
3631}
3632
67306194
NC
3633/* There's so much setup/teardown code common between uc and lc, I wonder if
3634 it would be worth merging the two, and just having a switch outside each
3635 of the three tight loops. */
79072805
LW
3636PP(pp_uc)
3637{
97aff369 3638 dVAR;
39644a26 3639 dSP;
67306194 3640 SV *source = TOPs;
463ee0b2 3641 STRLEN len;
67306194
NC
3642 STRLEN min;
3643 SV *dest;
3644 const U8 *s;
3645 U8 *d;
79072805 3646
67306194
NC
3647 SvGETMAGIC(source);
3648
3649 if (SvPADTMP(source) && !SvREADONLY(source) && !SvAMAGIC(source)
17fa0776 3650 && SvTEMP(source) && !DO_UTF8(source)) {
67306194
NC
3651 /* We can convert in place. */
3652
3653 dest = source;
3654 s = d = (U8*)SvPV_force_nomg(source, len);
3655 min = len + 1;
3656 } else {
a0ed51b3 3657 dTARGET;
a0ed51b3 3658
67306194 3659 dest = TARG;
128c9517 3660
67306194
NC
3661 /* The old implementation would copy source into TARG at this point.
3662 This had the side effect that if source was undef, TARG was now
3663 an undefined SV with PADTMP set, and they don't warn inside
3664 sv_2pv_flags(). However, we're now getting the PV direct from
3665 source, which doesn't have PADTMP set, so it would warn. Hence the
3666 little games. */
3667
3668 if (SvOK(source)) {
3669 s = (const U8*)SvPV_nomg_const(source, len);
3670 } else {
0a0ffbce
RGS
3671 if (ckWARN(WARN_UNINITIALIZED))
3672 report_uninit(source);
1eced8f8 3673 s = (const U8*)"";
67306194 3674 len = 0;
a0ed51b3 3675 }
67306194
NC
3676 min = len + 1;
3677
3678 SvUPGRADE(dest, SVt_PV);
3b416f41 3679 d = (U8*)SvGROW(dest, min);
67306194
NC
3680 (void)SvPOK_only(dest);
3681
3682 SETs(dest);
a0ed51b3 3683 }
31351b04 3684
67306194
NC
3685 /* Overloaded values may have toggled the UTF-8 flag on source, so we need
3686 to check DO_UTF8 again here. */
3687
3688 if (DO_UTF8(source)) {
3689 const U8 *const send = s + len;
3690 U8 tmpbuf[UTF8_MAXBYTES+1];
3691
3692 while (s < send) {
3693 const STRLEN u = UTF8SKIP(s);
3694 STRLEN ulen;
3695
3696 toUPPER_utf8(s, tmpbuf, &ulen);
3697 if (ulen > u && (SvLEN(dest) < (min += ulen - u))) {
3698 /* If the eventually required minimum size outgrows
3699 * the available space, we need to grow. */
3700 const UV o = d - (U8*)SvPVX_const(dest);
3701
3702 /* If someone uppercases one million U+03B0s we SvGROW() one
3703 * million times. Or we could try guessing how much to
3704 allocate without allocating too much. Such is life. */
3705 SvGROW(dest, min);
3706 d = (U8*)SvPVX(dest) + o;
3707 }
3708 Copy(tmpbuf, d, ulen, U8);
3709 d += ulen;
3710 s += u;
3711 }
3712 SvUTF8_on(dest);
3713 *d = '\0';
3714 SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
3715 } else {
3716 if (len) {
3717 const U8 *const send = s + len;
2de3dbcc 3718 if (IN_LOCALE_RUNTIME) {
31351b04 3719 TAINT;
67306194
NC
3720 SvTAINTED_on(dest);
3721 for (; s < send; d++, s++)
3722 *d = toUPPER_LC(*s);
31351b04
JS
3723 }
3724 else {
67306194
NC
3725 for (; s < send; d++, s++)
3726 *d = toUPPER(*s);
31351b04 3727 }
bbce6d69 3728 }
67306194
NC
3729 if (source != dest) {
3730 *d = '\0';
3731 SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
3732 }
79072805 3733 }
67306194 3734 SvSETMAGIC(dest);
79072805
LW
3735 RETURN;
3736}
3737
3738PP(pp_lc)
3739{
97aff369 3740 dVAR;
39644a26 3741 dSP;
ec9af7d4 3742 SV *source = TOPs;
463ee0b2 3743 STRLEN len;
ec9af7d4
NC
3744 STRLEN min;
3745 SV *dest;
3746 const U8 *s;
3747 U8 *d;
79072805 3748
ec9af7d4
NC
3749 SvGETMAGIC(source);
3750
3751 if (SvPADTMP(source) && !SvREADONLY(source) && !SvAMAGIC(source)
17fa0776 3752 && SvTEMP(source) && !DO_UTF8(source)) {
ec9af7d4
NC
3753 /* We can convert in place. */
3754
3755 dest = source;
3756 s = d = (U8*)SvPV_force_nomg(source, len);
3757 min = len + 1;
3758 } else {
a0ed51b3 3759 dTARGET;
a0ed51b3 3760
ec9af7d4
NC
3761 dest = TARG;
3762
3763 /* The old implementation would copy source into TARG at this point.
3764 This had the side effect that if source was undef, TARG was now
3765 an undefined SV with PADTMP set, and they don't warn inside
3766 sv_2pv_flags(). However, we're now getting the PV direct from
3767 source, which doesn't have PADTMP set, so it would warn. Hence the
3768 little games. */
3769
3770 if (SvOK(source)) {
3771 s = (const U8*)SvPV_nomg_const(source, len);
3772 } else {
0a0ffbce
RGS
3773 if (ckWARN(WARN_UNINITIALIZED))
3774 report_uninit(source);
1eced8f8 3775 s = (const U8*)"";
ec9af7d4 3776 len = 0;
a0ed51b3 3777 }
ec9af7d4 3778 min = len + 1;
128c9517 3779
ec9af7d4 3780 SvUPGRADE(dest, SVt_PV);
3b416f41 3781 d = (U8*)SvGROW(dest, min);
ec9af7d4
NC
3782 (void)SvPOK_only(dest);
3783
3784 SETs(dest);
3785 }
3786
3787 /* Overloaded values may have toggled the UTF-8 flag on source, so we need
3788 to check DO_UTF8 again here. */
3789
3790 if (DO_UTF8(source)) {
3791 const U8 *const send = s + len;
3792 U8 tmpbuf[UTF8_MAXBYTES_CASE+1];
3793
3794 while (s < send) {
3795 const STRLEN u = UTF8SKIP(s);
3796 STRLEN ulen;
3797 const UV uv = toLOWER_utf8(s, tmpbuf, &ulen);
89ebb4a3
JH
3798
3799#define GREEK_CAPITAL_LETTER_SIGMA 0x03A3 /* Unicode U+03A3 */
ec9af7d4
NC
3800 if (uv == GREEK_CAPITAL_LETTER_SIGMA) {
3801 NOOP;
3802 /*
3803 * Now if the sigma is NOT followed by
3804 * /$ignorable_sequence$cased_letter/;
3805 * and it IS preceded by /$cased_letter$ignorable_sequence/;
3806 * where $ignorable_sequence is [\x{2010}\x{AD}\p{Mn}]*
3807 * and $cased_letter is [\p{Ll}\p{Lo}\p{Lt}]
3808 * then it should be mapped to 0x03C2,
3809 * (GREEK SMALL LETTER FINAL SIGMA),
3810 * instead of staying 0x03A3.
3811 * "should be": in other words, this is not implemented yet.
3812 * See lib/unicore/SpecialCasing.txt.
3813 */
3814 }
3815 if (ulen > u && (SvLEN(dest) < (min += ulen - u))) {
3816 /* If the eventually required minimum size outgrows
3817 * the available space, we need to grow. */
3818 const UV o = d - (U8*)SvPVX_const(dest);
89ebb4a3 3819
ec9af7d4
NC
3820 /* If someone lowercases one million U+0130s we SvGROW() one
3821 * million times. Or we could try guessing how much to
3822 allocate without allocating too much. Such is life. */
3823 SvGROW(dest, min);
3824 d = (U8*)SvPVX(dest) + o;
a0ed51b3 3825 }
ec9af7d4
NC
3826 Copy(tmpbuf, d, ulen, U8);
3827 d += ulen;
3828 s += u;
a0ed51b3 3829 }
ec9af7d4
NC
3830 SvUTF8_on(dest);
3831 *d = '\0';
3832 SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
3833 } else {
31351b04 3834 if (len) {
ec9af7d4 3835 const U8 *const send = s + len;
2de3dbcc 3836 if (IN_LOCALE_RUNTIME) {
31351b04 3837 TAINT;
ec9af7d4
NC
3838 SvTAINTED_on(dest);
3839 for (; s < send; d++, s++)
3840 *d = toLOWER_LC(*s);
31351b04
JS
3841 }
3842 else {
ec9af7d4
NC
3843 for (; s < send; d++, s++)
3844 *d = toLOWER(*s);
31351b04 3845 }
bbce6d69 3846 }
ec9af7d4
NC
3847 if (source != dest) {
3848 *d = '\0';
3849 SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
3850 }
79072805 3851 }
ec9af7d4 3852 SvSETMAGIC(dest);
79072805
LW
3853 RETURN;
3854}
3855
a0d0e21e 3856PP(pp_quotemeta)
79072805 3857{
97aff369 3858 dVAR; dSP; dTARGET;
1b6737cc 3859 SV * const sv = TOPs;
a0d0e21e 3860 STRLEN len;
0d46e09a 3861 register const char *s = SvPV_const(sv,len);
79072805 3862
7e2040f0 3863 SvUTF8_off(TARG); /* decontaminate */
a0d0e21e 3864 if (len) {
1b6737cc 3865 register char *d;
862a34c6 3866 SvUPGRADE(TARG, SVt_PV);
c07a80fd 3867 SvGROW(TARG, (len * 2) + 1);
a0d0e21e 3868 d = SvPVX(TARG);
7e2040f0 3869 if (DO_UTF8(sv)) {
0dd2cdef 3870 while (len) {
fd400ab9 3871 if (UTF8_IS_CONTINUED(*s)) {
0dd2cdef
LW
3872 STRLEN ulen = UTF8SKIP(s);
3873 if (ulen > len)
3874 ulen = len;
3875 len -= ulen;
3876 while (ulen--)
3877 *d++ = *s++;
3878 }
3879 else {
3880 if (!isALNUM(*s))
3881 *d++ = '\\';
3882 *d++ = *s++;
3883 len--;
3884 }
3885 }
7e2040f0 3886 SvUTF8_on(TARG);
0dd2cdef
LW
3887 }
3888 else {
3889 while (len--) {
3890 if (!isALNUM(*s))
3891 *d++ = '\\';
3892 *d++ = *s++;
3893 }
79072805 3894 }
a0d0e21e 3895 *d = '\0';
349d4f2f 3896 SvCUR_set(TARG, d - SvPVX_const(TARG));
3aa33fe5 3897 (void)SvPOK_only_UTF8(TARG);
79072805 3898 }
a0d0e21e
LW
3899 else
3900 sv_setpvn(TARG, s, len);
ec93b65f 3901 SETTARG;
79072805
LW
3902 RETURN;
3903}
3904
a0d0e21e 3905/* Arrays. */
79072805 3906
a0d0e21e 3907PP(pp_aslice)
79072805 3908{
97aff369 3909 dVAR; dSP; dMARK; dORIGMARK;
502c6561 3910 register AV *const av = MUTABLE_AV(POPs);
1b6737cc 3911 register const I32 lval = (PL_op->op_flags & OPf_MOD || LVRET);
79072805 3912
a0d0e21e 3913 if (SvTYPE(av) == SVt_PVAV) {
fc15ae8f 3914 const I32 arybase = CopARYBASE_get(PL_curcop);
4ad10a0b
VP
3915 const bool localizing = PL_op->op_private & OPpLVAL_INTRO;
3916 bool can_preserve = FALSE;
3917
3918 if (localizing) {
3919 MAGIC *mg;
3920 HV *stash;
3921
3922 can_preserve = SvCANEXISTDELETE(av);
3923 }
3924
3925 if (lval && localizing) {
1b6737cc 3926 register SV **svp;
748a9306 3927 I32 max = -1;
924508f0 3928 for (svp = MARK + 1; svp <= SP; svp++) {
4ea561bc 3929 const I32 elem = SvIV(*svp);
748a9306
LW
3930 if (elem > max)
3931 max = elem;
3932 }
3933 if (max > AvMAX(av))
3934 av_extend(av, max);
3935 }
4ad10a0b 3936
a0d0e21e 3937 while (++MARK <= SP) {
1b6737cc 3938 register SV **svp;
4ea561bc 3939 I32 elem = SvIV(*MARK);
4ad10a0b 3940 bool preeminent = TRUE;
a0d0e21e 3941
748a9306
LW
3942 if (elem > 0)
3943 elem -= arybase;
4ad10a0b
VP
3944 if (localizing && can_preserve) {
3945 /* If we can determine whether the element exist,
3946 * Try to preserve the existenceness of a tied array
3947 * element by using EXISTS and DELETE if possible.
3948 * Fallback to FETCH and STORE otherwise. */
3949 preeminent = av_exists(av, elem);
3950 }
3951
a0d0e21e
LW
3952 svp = av_fetch(av, elem, lval);
3953 if (lval) {
3280af22 3954 if (!svp || *svp == &PL_sv_undef)
cea2e8a9 3955 DIE(aTHX_ PL_no_aelem, elem);
4ad10a0b
VP
3956 if (localizing) {
3957 if (preeminent)
3958 save_aelem(av, elem, svp);
3959 else
3960 SAVEADELETE(av, elem);
3961 }
79072805 3962 }
3280af22 3963 *MARK = svp ? *svp : &PL_sv_undef;
79072805
LW
3964 }
3965 }
748a9306 3966 if (GIMME != G_ARRAY) {
a0d0e21e 3967 MARK = ORIGMARK;
04ab2c87 3968 *++MARK = SP > ORIGMARK ? *SP : &PL_sv_undef;
a0d0e21e
LW
3969 SP = MARK;
3970 }
79072805
LW
3971 RETURN;
3972}
3973
878d132a
NC
3974PP(pp_aeach)
3975{
3976 dVAR;
3977 dSP;
502c6561 3978 AV *array = MUTABLE_AV(POPs);
878d132a 3979 const I32 gimme = GIMME_V;
453d94a9 3980 IV *iterp = Perl_av_iter_p(aTHX_ array);
878d132a
NC
3981 const IV current = (*iterp)++;
3982
3983 if (current > av_len(array)) {
3984 *iterp = 0;
3985 if (gimme == G_SCALAR)
3986 RETPUSHUNDEF;
3987 else
3988 RETURN;
3989 }
3990
3991 EXTEND(SP, 2);
3992 mPUSHi(CopARYBASE_get(PL_curcop) + current);
3993 if (gimme == G_ARRAY) {
3994 SV **const element = av_fetch(array, current, 0);
3995 PUSHs(element ? *element : &PL_sv_undef);
3996 }
3997 RETURN;
3998}
3999
4000PP(pp_akeys)
4001{
4002 dVAR;
4003 dSP;
502c6561 4004 AV *array = MUTABLE_AV(POPs);
878d132a
NC
4005 const I32 gimme = GIMME_V;
4006
4007 *Perl_av_iter_p(aTHX_ array) = 0;
4008
4009 if (gimme == G_SCALAR) {
4010 dTARGET;
4011 PUSHi(av_len(array) + 1);
4012 }
4013 else if (gimme == G_ARRAY) {
4014 IV n = Perl_av_len(aTHX_ array);
4015 IV i = CopARYBASE_get(PL_curcop);
4016
4017 EXTEND(SP, n + 1);
4018
4019 if (PL_op->op_type == OP_AKEYS) {
4020 n += i;
4021 for (; i <= n; i++) {
4022 mPUSHi(i);
4023 }
4024 }
4025 else {
4026 for (i = 0; i <= n; i++) {
4027 SV *const *const elem = Perl_av_fetch(aTHX_ array, i, 0);
4028 PUSHs(elem ? *elem : &PL_sv_undef);
4029 }
4030 }
4031 }
4032 RETURN;
4033}
4034
79072805
LW
4035/* Associative arrays. */
4036
4037PP(pp_each)
4038{
97aff369 4039 dVAR;
39644a26 4040 dSP;
85fbaab2 4041 HV * hash = MUTABLE_HV(POPs);
c07a80fd 4042 HE *entry;
f54cb97a 4043 const I32 gimme = GIMME_V;
8ec5e241 4044
c07a80fd 4045 PUTBACK;
c750a3ec 4046 /* might clobber stack_sp */
6d822dc4 4047 entry = hv_iternext(hash);
c07a80fd 4048 SPAGAIN;
79072805 4049
79072805
LW
4050 EXTEND(SP, 2);
4051 if (entry) {
1b6737cc 4052 SV* const sv = hv_iterkeysv(entry);
574c8022 4053 PUSHs(sv); /* won't clobber stack_sp */
54310121 4054 if (gimme == G_ARRAY) {
59af0135 4055 SV *val;
c07a80fd 4056 PUTBACK;
c750a3ec 4057 /* might clobber stack_sp */
6d822dc4 4058 val = hv_iterval(hash, entry);
c07a80fd 4059 SPAGAIN;
59af0135 4060 PUSHs(val);
79072805 4061 }
79072805 4062 }
54310121 4063 else if (gimme == G_SCALAR)
79072805
LW
4064 RETPUSHUNDEF;
4065
4066 RETURN;
4067}
4068
79072805
LW
4069PP(pp_delete)
4070{
97aff369 4071 dVAR;
39644a26 4072 dSP;
f54cb97a
AL
4073 const I32 gimme = GIMME_V;
4074 const I32 discard = (gimme == G_VOID) ? G_DISCARD : 0;
5f05dabc 4075
533c011a 4076 if (PL_op->op_private & OPpSLICE) {
5f05dabc 4077 dMARK; dORIGMARK;
85fbaab2 4078 HV * const hv = MUTABLE_HV(POPs);
1b6737cc 4079 const U32 hvtype = SvTYPE(hv);
01020589
GS
4080 if (hvtype == SVt_PVHV) { /* hash element */
4081 while (++MARK <= SP) {
1b6737cc 4082 SV * const sv = hv_delete_ent(hv, *MARK, discard, 0);
01020589
GS
4083 *MARK = sv ? sv : &PL_sv_undef;
4084 }
5f05dabc 4085 }
6d822dc4
MS
4086 else if (hvtype == SVt_PVAV) { /* array element */
4087 if (PL_op->op_flags & OPf_SPECIAL) {
4088 while (++MARK <= SP) {
502c6561 4089 SV * const sv = av_delete(MUTABLE_AV(hv), SvIV(*MARK), discard);
6d822dc4
MS
4090 *MARK = sv ? sv : &PL_sv_undef;
4091 }
4092 }
01020589
GS
4093 }
4094 else
4095 DIE(aTHX_ "Not a HASH reference");
54310121 4096 if (discard)
4097 SP = ORIGMARK;
4098 else if (gimme == G_SCALAR) {
5f05dabc 4099 MARK = ORIGMARK;
9111c9c0
DM
4100 if (SP > MARK)
4101 *++MARK = *SP;
4102 else
4103 *++MARK = &PL_sv_undef;
5f05dabc 4104 SP = MARK;
4105 }
4106 }
4107 else {
4108 SV *keysv = POPs;
85fbaab2 4109 HV * const hv = MUTABLE_HV(POPs);
1b6737cc 4110 SV *sv;
97fcbf96
MB
4111 if (SvTYPE(hv) == SVt_PVHV)
4112 sv = hv_delete_ent(hv, keysv, discard, 0);
01020589
GS
4113 else if (SvTYPE(hv) == SVt_PVAV) {
4114 if (PL_op->op_flags & OPf_SPECIAL)
502c6561 4115 sv = av_delete(MUTABLE_AV(hv), SvIV(keysv), discard);
af288a60
HS
4116 else
4117 DIE(aTHX_ "panic: avhv_delete no longer supported");
01020589 4118 }
97fcbf96 4119 else
cea2e8a9 4120 DIE(aTHX_ "Not a HASH reference");
5f05dabc 4121 if (!sv)
3280af22 4122 sv = &PL_sv_undef;
54310121 4123 if (!discard)
4124 PUSHs(sv);
79072805 4125 }
79072805
LW
4126 RETURN;
4127}
4128
a0d0e21e 4129PP(pp_exists)
79072805 4130{
97aff369 4131 dVAR;
39644a26 4132 dSP;
afebc493
GS
4133 SV *tmpsv;
4134 HV *hv;
4135
4136 if (PL_op->op_private & OPpEXISTS_SUB) {
4137 GV *gv;
0bd48802 4138 SV * const sv = POPs;
f2c0649b 4139 CV * const cv = sv_2cv(sv, &hv, &gv, 0);
afebc493
GS
4140 if (cv)
4141 RETPUSHYES;
4142 if (gv && isGV(gv) && GvCV(gv) && !GvCVGEN(gv))
4143 RETPUSHYES;
4144 RETPUSHNO;
4145 }
4146 tmpsv = POPs;
85fbaab2 4147 hv = MUTABLE_HV(POPs);
c750a3ec 4148 if (SvTYPE(hv) == SVt_PVHV) {
ae77835f 4149 if (hv_exists_ent(hv, tmpsv, 0))
c750a3ec 4150 RETPUSHYES;
ef54e1a4
JH
4151 }
4152 else if (SvTYPE(hv) == SVt_PVAV) {
01020589 4153 if (PL_op->op_flags & OPf_SPECIAL) { /* array element */
502c6561 4154 if (av_exists(MUTABLE_AV(hv), SvIV(tmpsv)))
01020589
GS
4155 RETPUSHYES;
4156 }
ef54e1a4
JH
4157 }
4158 else {
cea2e8a9 4159 DIE(aTHX_ "Not a HASH reference");
a0d0e21e 4160 }
a0d0e21e
LW
4161 RETPUSHNO;
4162}
79072805 4163
a0d0e21e
LW
4164PP(pp_hslice)
4165{
97aff369 4166 dVAR; dSP; dMARK; dORIGMARK;
85fbaab2 4167 register HV * const hv = MUTABLE_HV(POPs);
1b6737cc
AL
4168 register const I32 lval = (PL_op->op_flags & OPf_MOD || LVRET);
4169 const bool localizing = PL_op->op_private & OPpLVAL_INTRO;
d30e492c 4170 bool can_preserve = FALSE;
79072805 4171
eb85dfd3
DM
4172 if (localizing) {
4173 MAGIC *mg;
4174 HV *stash;
4175
d30e492c
VP
4176 if (SvCANEXISTDELETE(hv) || mg_find((const SV *)hv, PERL_MAGIC_env))
4177 can_preserve = TRUE;
eb85dfd3
DM
4178 }
4179
6d822dc4 4180 while (++MARK <= SP) {
1b6737cc 4181 SV * const keysv = *MARK;
6d822dc4
MS
4182 SV **svp;
4183 HE *he;
d30e492c
VP
4184 bool preeminent = TRUE;
4185
4186 if (localizing && can_preserve) {
4187 /* If we can determine whether the element exist,
4188 * try to preserve the existenceness of a tied hash
4189 * element by using EXISTS and DELETE if possible.
4190 * Fallback to FETCH and STORE otherwise. */
4191 preeminent = hv_exists_ent(hv, keysv, 0);
6d822dc4 4192 }
eb85dfd3 4193
6d822dc4 4194 he = hv_fetch_ent(hv, keysv, lval, 0);
fe5bfecd 4195 svp = he ? &HeVAL(he) : NULL;
eb85dfd3 4196
6d822dc4
MS
4197 if (lval) {
4198 if (!svp || *svp == &PL_sv_undef) {
be2597df 4199 DIE(aTHX_ PL_no_helem_sv, SVfARG(keysv));
6d822dc4
MS
4200 }
4201 if (localizing) {
7a2e501a 4202 if (HvNAME_get(hv) && isGV(*svp))
159b6efe 4203 save_gp(MUTABLE_GV(*svp), !(PL_op->op_flags & OPf_SPECIAL));
7a2e501a
RD
4204 else {
4205 if (preeminent)
af7df257
CS
4206 save_helem_flags(hv, keysv, svp,
4207 (PL_op->op_flags & OPf_SPECIAL) ? 0 : SAVEf_SETMAGIC);
7a2e501a
RD
4208 else {
4209 STRLEN keylen;
d4c19fe8 4210 const char * const key = SvPV_const(keysv, keylen);
919acde0 4211 SAVEDELETE(hv, savepvn(key,keylen),
f5992bc4 4212 SvUTF8(keysv) ? -(I32)keylen : (I32)keylen);
7a2e501a
RD
4213 }
4214 }
6d822dc4
MS
4215 }
4216 }
4217 *MARK = svp ? *svp : &PL_sv_undef;
79072805 4218 }
a0d0e21e
LW
4219 if (GIMME != G_ARRAY) {
4220 MARK = ORIGMARK;
04ab2c87 4221 *++MARK = SP > ORIGMARK ? *SP : &PL_sv_undef;
a0d0e21e 4222 SP = MARK;
79072805 4223 }
a0d0e21e
LW
4224 RETURN;
4225}
4226
4227/* List operators. */
4228
4229PP(pp_list)
4230{
97aff369 4231 dVAR; dSP; dMARK;
a0d0e21e
LW
4232 if (GIMME != G_ARRAY) {
4233 if (++MARK <= SP)
4234 *MARK = *SP; /* unwanted list, return last item */
8990e307 4235 else
3280af22 4236 *MARK = &PL_sv_undef;
a0d0e21e 4237 SP = MARK;
79072805 4238 }
a0d0e21e 4239 RETURN;
79072805
LW
4240}
4241
a0d0e21e 4242PP(pp_lslice)
79072805 4243{
97aff369 4244 dVAR;
39644a26 4245 dSP;
1b6737cc
AL
4246 SV ** const lastrelem = PL_stack_sp;
4247 SV ** const lastlelem = PL_stack_base + POPMARK;
4248 SV ** const firstlelem = PL_stack_base + POPMARK + 1;
4249 register SV ** const firstrelem = lastlelem + 1;
fc15ae8f 4250 const I32 arybase = CopARYBASE_get(PL_curcop);
42e73ed0 4251 I32 is_something_there = FALSE;
1b6737cc
AL
4252
4253 register const I32 max = lastrelem - lastlelem;
a0d0e21e 4254 register SV **lelem;
a0d0e21e
LW
4255
4256 if (GIMME != G_ARRAY) {
4ea561bc 4257 I32 ix = SvIV(*lastlelem);
748a9306
LW
4258 if (ix < 0)
4259 ix += max;
4260 else
4261 ix -= arybase;
a0d0e21e 4262 if (ix < 0 || ix >= max)
3280af22 4263 *firstlelem = &PL_sv_undef;
a0d0e21e
LW
4264 else
4265 *firstlelem = firstrelem[ix];
4266 SP = firstlelem;
4267 RETURN;
4268 }
4269
4270 if (max == 0) {
4271 SP = firstlelem - 1;
4272 RETURN;
4273 }
4274
4275 for (lelem = firstlelem; lelem <= lastlelem; lelem++) {
4ea561bc 4276 I32 ix = SvIV(*lelem);
c73bf8e3 4277 if (ix < 0)
a0d0e21e 4278 ix += max;
b13b2135 4279 else
748a9306 4280 ix -= arybase;
c73bf8e3
HS
4281 if (ix < 0 || ix >= max)
4282 *lelem = &PL_sv_undef;
4283 else {
4284 is_something_there = TRUE;
4285 if (!(*lelem = firstrelem[ix]))
3280af22 4286 *lelem = &PL_sv_undef;
748a9306 4287 }
79072805 4288 }
4633a7c4
LW
4289 if (is_something_there)
4290 SP = lastlelem;
4291 else
4292 SP = firstlelem - 1;
79072805
LW
4293 RETURN;
4294}
4295
a0d0e21e
LW
4296PP(pp_anonlist)
4297{
97aff369 4298 dVAR; dSP; dMARK; dORIGMARK;
1b6737cc 4299 const I32 items = SP - MARK;
ad64d0ec 4300 SV * const av = MUTABLE_SV(av_make(items, MARK+1));
44a8e56a 4301 SP = ORIGMARK; /* av_make() might realloc stack_sp */
6e449a3a
MHM
4302 mXPUSHs((PL_op->op_flags & OPf_SPECIAL)
4303 ? newRV_noinc(av) : av);
a0d0e21e
LW
4304 RETURN;
4305}
4306
4307PP(pp_anonhash)
79072805 4308{
97aff369 4309 dVAR; dSP; dMARK; dORIGMARK;
78c72037 4310 HV* const hv = newHV();
a0d0e21e
LW
4311
4312 while (MARK < SP) {
1b6737cc 4313 SV * const key = *++MARK;
561b68a9 4314 SV * const val = newSV(0);
a0d0e21e
LW
4315 if (MARK < SP)
4316 sv_setsv(val, *++MARK);
e476b1b5 4317 else if (ckWARN(WARN_MISC))
9014280d 4318 Perl_warner(aTHX_ packWARN(WARN_MISC), "Odd number of elements in anonymous hash");
f12c7020 4319 (void)hv_store_ent(hv,key,val,0);
79072805 4320 }
a0d0e21e 4321 SP = ORIGMARK;
6e449a3a 4322 mXPUSHs((PL_op->op_flags & OPf_SPECIAL)
ad64d0ec 4323 ? newRV_noinc(MUTABLE_SV(hv)) : MUTABLE_SV(hv));
79072805
LW
4324 RETURN;
4325}
4326
a0d0e21e 4327PP(pp_splice)
79072805 4328{
27da23d5 4329 dVAR; dSP; dMARK; dORIGMARK;
502c6561 4330 register AV *ary = MUTABLE_AV(*++MARK);
a0d0e21e
LW
4331 register SV **src;
4332 register SV **dst;
4333 register I32 i;
4334 register I32 offset;
4335 register I32 length;
4336 I32 newlen;
4337 I32 after;
4338 I32 diff;
ad64d0ec 4339 const MAGIC * const mg = SvTIED_mg((const SV *)ary, PERL_MAGIC_tied);
93965878 4340
1b6737cc 4341 if (mg) {
ad64d0ec 4342 *MARK-- = SvTIED_obj(MUTABLE_SV(ary), mg);
93965878 4343 PUSHMARK(MARK);
8ec5e241 4344 PUTBACK;
a60c0954 4345 ENTER;
864dbfa3 4346 call_method("SPLICE",GIMME_V);
a60c0954 4347 LEAVE;
93965878
NIS
4348 SPAGAIN;
4349 RETURN;
4350 }
79072805 4351
a0d0e21e 4352 SP++;
79072805 4353
a0d0e21e 4354 if (++MARK < SP) {
4ea561bc 4355 offset = i = SvIV(*MARK);
a0d0e21e 4356 if (offset < 0)
93965878 4357 offset += AvFILLp(ary) + 1;
a0d0e21e 4358 else
fc15ae8f 4359 offset -= CopARYBASE_get(PL_curcop);
84902520 4360 if (offset < 0)
cea2e8a9 4361 DIE(aTHX_ PL_no_aelem, i);
a0d0e21e
LW
4362 if (++MARK < SP) {
4363 length = SvIVx(*MARK++);
48cdf507
GA
4364 if (length < 0) {
4365 length += AvFILLp(ary) - offset + 1;
4366 if (length < 0)
4367 length = 0;
4368 }
79072805
LW
4369 }
4370 else
a0d0e21e 4371 length = AvMAX(ary) + 1; /* close enough to infinity */
79072805 4372 }
a0d0e21e
LW
4373 else {
4374 offset = 0;
4375 length = AvMAX(ary) + 1;
4376 }
8cbc2e3b
JH
4377 if (offset > AvFILLp(ary) + 1) {
4378 if (ckWARN(WARN_MISC))
9014280d 4379 Perl_warner(aTHX_ packWARN(WARN_MISC), "splice() offset past end of array" );
93965878 4380 offset = AvFILLp(ary) + 1;
8cbc2e3b 4381 }
93965878 4382 after = AvFILLp(ary) + 1 - (offset + length);
a0d0e21e
LW
4383 if (after < 0) { /* not that much array */
4384 length += after; /* offset+length now in array */
4385 after = 0;
4386 if (!AvALLOC(ary))
4387 av_extend(ary, 0);
4388 }
4389
4390 /* At this point, MARK .. SP-1 is our new LIST */
4391
4392 newlen = SP - MARK;
4393 diff = newlen - length;
13d7cbc1
GS
4394 if (newlen && !AvREAL(ary) && AvREIFY(ary))
4395 av_reify(ary);
a0d0e21e 4396
50528de0
WL
4397 /* make new elements SVs now: avoid problems if they're from the array */
4398 for (dst = MARK, i = newlen; i; i--) {
1b6737cc 4399 SV * const h = *dst;
f2b990bf 4400 *dst++ = newSVsv(h);
50528de0
WL
4401 }
4402
a0d0e21e 4403 if (diff < 0) { /* shrinking the area */
95b63a38 4404 SV **tmparyval = NULL;
a0d0e21e 4405 if (newlen) {
a02a5408 4406 Newx(tmparyval, newlen, SV*); /* so remember insertion */
a0d0e21e 4407 Copy(MARK, tmparyval, newlen, SV*);
79072805 4408 }
a0d0e21e
LW
4409
4410 MARK = ORIGMARK + 1;
4411 if (GIMME == G_ARRAY) { /* copy return vals to stack */
4412 MEXTEND(MARK, length);
4413 Copy(AvARRAY(ary)+offset, MARK, length, SV*);
4414 if (AvREAL(ary)) {
bbce6d69 4415 EXTEND_MORTAL(length);
36477c24 4416 for (i = length, dst = MARK; i; i--) {
d689ffdd 4417 sv_2mortal(*dst); /* free them eventualy */
36477c24 4418 dst++;
4419 }
a0d0e21e
LW
4420 }
4421 MARK += length - 1;
79072805 4422 }
a0d0e21e
LW
4423 else {
4424 *MARK = AvARRAY(ary)[offset+length-1];
4425 if (AvREAL(ary)) {
d689ffdd 4426 sv_2mortal(*MARK);
a0d0e21e
LW
4427 for (i = length - 1, dst = &AvARRAY(ary)[offset]; i > 0; i--)
4428 SvREFCNT_dec(*dst++); /* free them now */
79072805 4429 }
a0d0e21e 4430 }
93965878 4431 AvFILLp(ary) += diff;
a0d0e21e
LW
4432
4433 /* pull up or down? */
4434
4435 if (offset < after) { /* easier to pull up */
4436 if (offset) { /* esp. if nothing to pull */
4437 src = &AvARRAY(ary)[offset-1];
4438 dst = src - diff; /* diff is negative */
4439 for (i = offset; i > 0; i--) /* can't trust Copy */
4440 *dst-- = *src--;
79072805 4441 }
a0d0e21e 4442 dst = AvARRAY(ary);
9c6bc640 4443 AvARRAY(ary) = AvARRAY(ary) - diff; /* diff is negative */
a0d0e21e
LW
4444 AvMAX(ary) += diff;
4445 }
4446 else {
4447 if (after) { /* anything to pull down? */
4448 src = AvARRAY(ary) + offset + length;
4449 dst = src + diff; /* diff is negative */
4450 Move(src, dst, after, SV*);
79072805 4451 }
93965878 4452 dst = &AvARRAY(ary)[AvFILLp(ary)+1];
a0d0e21e
LW
4453 /* avoid later double free */
4454 }
4455 i = -diff;
4456 while (i)
3280af22 4457 dst[--i] = &PL_sv_undef;
a0d0e21e
LW
4458
4459 if (newlen) {
50528de0 4460 Copy( tmparyval, AvARRAY(ary) + offset, newlen, SV* );
a0d0e21e
LW
4461 Safefree(tmparyval);
4462 }
4463 }
4464 else { /* no, expanding (or same) */
d3961450 4465 SV** tmparyval = NULL;
a0d0e21e 4466 if (length) {
a02a5408 4467 Newx(tmparyval, length, SV*); /* so remember deletion */
a0d0e21e
LW
4468 Copy(AvARRAY(ary)+offset, tmparyval, length, SV*);
4469 }
4470
4471 if (diff > 0) { /* expanding */
a0d0e21e 4472 /* push up or down? */
a0d0e21e
LW
4473 if (offset < after && diff <= AvARRAY(ary) - AvALLOC(ary)) {
4474 if (offset) {
4475 src = AvARRAY(ary);
4476 dst = src - diff;
4477 Move(src, dst, offset, SV*);
79072805 4478 }
9c6bc640 4479 AvARRAY(ary) = AvARRAY(ary) - diff;/* diff is positive */
a0d0e21e 4480 AvMAX(ary) += diff;
93965878 4481 AvFILLp(ary) += diff;
79072805
LW
4482 }
4483 else {
93965878
NIS
4484 if (AvFILLp(ary) + diff >= AvMAX(ary)) /* oh, well */
4485 av_extend(ary, AvFILLp(ary) + diff);
4486 AvFILLp(ary) += diff;
a0d0e21e
LW
4487
4488 if (after) {
93965878 4489 dst = AvARRAY(ary) + AvFILLp(ary);
a0d0e21e
LW
4490 src = dst - diff;
4491 for (i = after; i; i--) {
4492 *dst-- = *src--;
4493 }
79072805
LW
4494 }
4495 }
a0d0e21e
LW
4496 }
4497
50528de0
WL
4498 if (newlen) {
4499 Copy( MARK, AvARRAY(ary) + offset, newlen, SV* );
a0d0e21e 4500 }
50528de0 4501
a0d0e21e
LW
4502 MARK = ORIGMARK + 1;
4503 if (GIMME == G_ARRAY) { /* copy return vals to stack */
4504 if (length) {
4505 Copy(tmparyval, MARK, length, SV*);
4506 if (AvREAL(ary)) {
bbce6d69 4507 EXTEND_MORTAL(length);
36477c24 4508 for (i = length, dst = MARK; i; i--) {
d689ffdd 4509 sv_2mortal(*dst); /* free them eventualy */
36477c24 4510 dst++;
4511 }
79072805
LW
4512 }
4513 }
a0d0e21e
LW
4514 MARK += length - 1;
4515 }
4516 else if (length--) {
4517 *MARK = tmparyval[length];
4518 if (AvREAL(ary)) {
d689ffdd 4519 sv_2mortal(*MARK);
a0d0e21e
LW
4520 while (length-- > 0)
4521 SvREFCNT_dec(tmparyval[length]);
79072805 4522 }
79072805 4523 }
a0d0e21e 4524 else
3280af22 4525 *MARK = &PL_sv_undef;
d3961450 4526 Safefree(tmparyval);
79072805 4527 }
a0d0e21e 4528 SP = MARK;
79072805
LW
4529 RETURN;
4530}
4531
a0d0e21e 4532PP(pp_push)
79072805 4533{
27da23d5 4534 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
502c6561 4535 register AV * const ary = MUTABLE_AV(*++MARK);
ad64d0ec 4536 const MAGIC * const mg = SvTIED_mg((const SV *)ary, PERL_MAGIC_tied);
79072805 4537
1b6737cc 4538 if (mg) {
ad64d0ec 4539 *MARK-- = SvTIED_obj(MUTABLE_SV(ary), mg);
93965878
NIS
4540 PUSHMARK(MARK);
4541 PUTBACK;
a60c0954 4542 ENTER;
864dbfa3 4543 call_method("PUSH",G_SCALAR|G_DISCARD);
a60c0954 4544 LEAVE;
93965878 4545 SPAGAIN;
0a75904b 4546 SP = ORIGMARK;
5658d0a9
LR
4547 if (GIMME_V != G_VOID) {
4548 PUSHi( AvFILL(ary) + 1 );
4549 }
93965878 4550 }
a60c0954 4551 else {
89c14e2e 4552 PL_delaymagic = DM_DELAY;
a60c0954 4553 for (++MARK; MARK <= SP; MARK++) {
561b68a9 4554 SV * const sv = newSV(0);
a60c0954
NIS
4555 if (*MARK)
4556 sv_setsv(sv, *MARK);
0a75904b 4557 av_store(ary, AvFILLp(ary)+1, sv);
a60c0954 4558 }
89c14e2e 4559 if (PL_delaymagic & DM_ARRAY)
ad64d0ec 4560 mg_set(MUTABLE_SV(ary));
89c14e2e
BB
4561
4562 PL_delaymagic = 0;
0a75904b
TP
4563 SP = ORIGMARK;
4564 PUSHi( AvFILLp(ary) + 1 );
79072805 4565 }
79072805
LW
4566 RETURN;
4567}
4568
a0d0e21e 4569PP(pp_shift)
79072805 4570{
97aff369 4571 dVAR;
39644a26 4572 dSP;
502c6561 4573 AV * const av = MUTABLE_AV(POPs);
789b4bc9 4574 SV * const sv = PL_op->op_type == OP_SHIFT ? av_shift(av) : av_pop(av);
79072805 4575 EXTEND(SP, 1);
c2b4a044 4576 assert (sv);
d689ffdd 4577 if (AvREAL(av))
a0d0e21e
LW
4578 (void)sv_2mortal(sv);
4579 PUSHs(sv);
79072805 4580 RETURN;
79072805
LW
4581}
4582
a0d0e21e 4583PP(pp_unshift)
79072805 4584{
27da23d5 4585 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
502c6561 4586 register AV *ary = MUTABLE_AV(*++MARK);
ad64d0ec 4587 const MAGIC * const mg = SvTIED_mg((const SV *)ary, PERL_MAGIC_tied);
93965878 4588
1b6737cc 4589 if (mg) {
ad64d0ec 4590 *MARK-- = SvTIED_obj(MUTABLE_SV(ary), mg);
7fd66d9d 4591 PUSHMARK(MARK);
93965878 4592 PUTBACK;
a60c0954 4593 ENTER;
864dbfa3 4594 call_method("UNSHIFT",G_SCALAR|G_DISCARD);
a60c0954 4595 LEAVE;
93965878 4596 SPAGAIN;
93965878 4597 }
a60c0954 4598 else {
1b6737cc 4599 register I32 i = 0;
a60c0954
NIS
4600 av_unshift(ary, SP - MARK);
4601 while (MARK < SP) {
1b6737cc 4602 SV * const sv = newSVsv(*++MARK);
a60c0954
NIS
4603 (void)av_store(ary, i++, sv);
4604 }
79072805 4605 }
a0d0e21e 4606 SP = ORIGMARK;
5658d0a9
LR
4607 if (GIMME_V != G_VOID) {
4608 PUSHi( AvFILL(ary) + 1 );
4609 }
79072805 4610 RETURN;
79072805
LW
4611}
4612
a0d0e21e 4613PP(pp_reverse)
79072805 4614{
97aff369 4615 dVAR; dSP; dMARK;
1b6737cc 4616 SV ** const oldsp = SP;
79072805 4617
a0d0e21e
LW
4618 if (GIMME == G_ARRAY) {
4619 MARK++;
4620 while (MARK < SP) {
1b6737cc 4621 register SV * const tmp = *MARK;
a0d0e21e
LW
4622 *MARK++ = *SP;
4623 *SP-- = tmp;
4624 }
dd58a1ab 4625 /* safe as long as stack cannot get extended in the above */
a0d0e21e 4626 SP = oldsp;
79072805
LW
4627 }
4628 else {
a0d0e21e
LW
4629 register char *up;
4630 register char *down;
4631 register I32 tmp;
4632 dTARGET;
4633 STRLEN len;
9f7d9405 4634 PADOFFSET padoff_du;
79072805 4635
7e2040f0 4636 SvUTF8_off(TARG); /* decontaminate */
a0d0e21e 4637 if (SP - MARK > 1)
3280af22 4638 do_join(TARG, &PL_sv_no, MARK, SP);
1e21d011 4639 else {
e1f795dc
RGS
4640 sv_setsv(TARG, (SP > MARK)
4641 ? *SP
29289021 4642 : (padoff_du = find_rundefsvoffset(),
00b1698f
NC
4643 (padoff_du == NOT_IN_PAD
4644 || PAD_COMPNAME_FLAGS_isOUR(padoff_du))
e1f795dc 4645 ? DEFSV : PAD_SVl(padoff_du)));
1e21d011
B
4646
4647 if (! SvOK(TARG) && ckWARN(WARN_UNINITIALIZED))
4648 report_uninit(TARG);
4649 }
4650
a0d0e21e
LW
4651 up = SvPV_force(TARG, len);
4652 if (len > 1) {
7e2040f0 4653 if (DO_UTF8(TARG)) { /* first reverse each character */
dfe13c55 4654 U8* s = (U8*)SvPVX(TARG);
349d4f2f 4655 const U8* send = (U8*)(s + len);
a0ed51b3 4656 while (s < send) {
d742c382 4657 if (UTF8_IS_INVARIANT(*s)) {
a0ed51b3
LW
4658 s++;
4659 continue;
4660 }
4661 else {
9041c2e3 4662 if (!utf8_to_uvchr(s, 0))
a0dbb045 4663 break;
dfe13c55 4664 up = (char*)s;
a0ed51b3 4665 s += UTF8SKIP(s);
dfe13c55 4666 down = (char*)(s - 1);
a0dbb045 4667 /* reverse this character */
a0ed51b3
LW
4668 while (down > up) {
4669 tmp = *up;
4670 *up++ = *down;
eb160463 4671 *down-- = (char)tmp;
a0ed51b3
LW
4672 }
4673 }
4674 }
4675 up = SvPVX(TARG);
4676 }
a0d0e21e
LW
4677 down = SvPVX(TARG) + len - 1;
4678 while (down > up) {
4679 tmp = *up;
4680 *up++ = *down;
eb160463 4681 *down-- = (char)tmp;
a0d0e21e 4682 }
3aa33fe5 4683 (void)SvPOK_only_UTF8(TARG);
79072805 4684 }
a0d0e21e
LW
4685 SP = MARK + 1;
4686 SETTARG;
79072805 4687 }
a0d0e21e 4688 RETURN;
79072805
LW
4689}
4690
a0d0e21e 4691PP(pp_split)
79072805 4692{
27da23d5 4693 dVAR; dSP; dTARG;
a0d0e21e 4694 AV *ary;
467f0320 4695 register IV limit = POPi; /* note, negative is forever */
1b6737cc 4696 SV * const sv = POPs;
a0d0e21e 4697 STRLEN len;
727b7506 4698 register const char *s = SvPV_const(sv, len);
1b6737cc 4699 const bool do_utf8 = DO_UTF8(sv);
727b7506 4700 const char *strend = s + len;
44a8e56a 4701 register PMOP *pm;
d9f97599 4702 register REGEXP *rx;
a0d0e21e 4703 register SV *dstr;
727b7506 4704 register const char *m;
a0d0e21e 4705 I32 iters = 0;
bb7a0f54 4706 const STRLEN slen = do_utf8 ? utf8_length((U8*)s, (U8*)strend) : (STRLEN)(strend - s);
792b2c16 4707 I32 maxiters = slen + 10;
727b7506 4708 const char *orig;
1b6737cc 4709 const I32 origlimit = limit;
a0d0e21e
LW
4710 I32 realarray = 0;
4711 I32 base;
f54cb97a
AL
4712 const I32 gimme = GIMME_V;
4713 const I32 oldsave = PL_savestack_ix;
437d3b4e 4714 U32 make_mortal = SVs_TEMP;
7fba1cd6 4715 bool multiline = 0;
b37c2d43 4716 MAGIC *mg = NULL;
79072805 4717
44a8e56a 4718#ifdef DEBUGGING
4719 Copy(&LvTARGOFF(POPs), &pm, 1, PMOP*);
4720#else
4721 pm = (PMOP*)POPs;
4722#endif
a0d0e21e 4723 if (!pm || !s)
2269b42e 4724 DIE(aTHX_ "panic: pp_split");
aaa362c4 4725 rx = PM_GETRE(pm);
bbce6d69 4726
07bc277f
NC
4727 TAINT_IF((RX_EXTFLAGS(rx) & RXf_PMf_LOCALE) &&
4728 (RX_EXTFLAGS(rx) & (RXf_WHITE | RXf_SKIPWHITE)));
bbce6d69 4729
a30b2f1f 4730 RX_MATCH_UTF8_set(rx, do_utf8);
d9f424b2 4731
971a9dd3 4732#ifdef USE_ITHREADS
20e98b0f 4733 if (pm->op_pmreplrootu.op_pmtargetoff) {
159b6efe 4734 ary = GvAVn(MUTABLE_GV(PAD_SVl(pm->op_pmreplrootu.op_pmtargetoff)));
20e98b0f 4735 }
971a9dd3 4736#else
20e98b0f
NC
4737 if (pm->op_pmreplrootu.op_pmtargetgv) {
4738 ary = GvAVn(pm->op_pmreplrootu.op_pmtargetgv);
971a9dd3 4739 }
20e98b0f 4740#endif
a0d0e21e 4741 else if (gimme != G_ARRAY)
3280af22 4742 ary = GvAVn(PL_defgv);
79072805 4743 else
7d49f689 4744 ary = NULL;
a0d0e21e
LW
4745 if (ary && (gimme != G_ARRAY || (pm->op_pmflags & PMf_ONCE))) {
4746 realarray = 1;
8ec5e241 4747 PUTBACK;
a0d0e21e
LW
4748 av_extend(ary,0);
4749 av_clear(ary);
8ec5e241 4750 SPAGAIN;
ad64d0ec 4751 if ((mg = SvTIED_mg((const SV *)ary, PERL_MAGIC_tied))) {
8ec5e241 4752 PUSHMARK(SP);
ad64d0ec 4753 XPUSHs(SvTIED_obj(MUTABLE_SV(ary), mg));
8ec5e241
NIS
4754 }
4755 else {
1c0b011c 4756 if (!AvREAL(ary)) {
1b6737cc 4757 I32 i;
1c0b011c 4758 AvREAL_on(ary);
abff13bb 4759 AvREIFY_off(ary);
1c0b011c 4760 for (i = AvFILLp(ary); i >= 0; i--)
3280af22 4761 AvARRAY(ary)[i] = &PL_sv_undef; /* don't free mere refs */
1c0b011c
NIS
4762 }
4763 /* temporarily switch stacks */
8b7059b1 4764 SAVESWITCHSTACK(PL_curstack, ary);
8ec5e241 4765 make_mortal = 0;
1c0b011c 4766 }
79072805 4767 }
3280af22 4768 base = SP - PL_stack_base;
a0d0e21e 4769 orig = s;
07bc277f 4770 if (RX_EXTFLAGS(rx) & RXf_SKIPWHITE) {
613f191e
TS
4771 if (do_utf8) {
4772 while (*s == ' ' || is_utf8_space((U8*)s))
4773 s += UTF8SKIP(s);
4774 }
07bc277f 4775 else if (RX_EXTFLAGS(rx) & RXf_PMf_LOCALE) {
bbce6d69 4776 while (isSPACE_LC(*s))
4777 s++;
4778 }
4779 else {
4780 while (isSPACE(*s))
4781 s++;
4782 }
a0d0e21e 4783 }
07bc277f 4784 if (RX_EXTFLAGS(rx) & PMf_MULTILINE) {
7fba1cd6 4785 multiline = 1;
c07a80fd 4786 }
4787
a0d0e21e
LW
4788 if (!limit)
4789 limit = maxiters + 2;
07bc277f 4790 if (RX_EXTFLAGS(rx) & RXf_WHITE) {
a0d0e21e 4791 while (--limit) {
bbce6d69 4792 m = s;
8727f688
YO
4793 /* this one uses 'm' and is a negative test */
4794 if (do_utf8) {
613f191e
TS
4795 while (m < strend && !( *m == ' ' || is_utf8_space((U8*)m) )) {
4796 const int t = UTF8SKIP(m);
4797 /* is_utf8_space returns FALSE for malform utf8 */
4798 if (strend - m < t)
4799 m = strend;
4800 else
4801 m += t;
4802 }
07bc277f 4803 } else if (RX_EXTFLAGS(rx) & RXf_PMf_LOCALE) {
8727f688
YO
4804 while (m < strend && !isSPACE_LC(*m))
4805 ++m;
4806 } else {
4807 while (m < strend && !isSPACE(*m))
4808 ++m;
4809 }
a0d0e21e
LW
4810 if (m >= strend)
4811 break;
bbce6d69 4812
437d3b4e
NC
4813 dstr = newSVpvn_flags(s, m-s,
4814 (do_utf8 ? SVf_UTF8 : 0) | make_mortal);
a0d0e21e 4815 XPUSHs(dstr);
bbce6d69 4816
613f191e
TS
4817 /* skip the whitespace found last */
4818 if (do_utf8)
4819 s = m + UTF8SKIP(m);
4820 else
4821 s = m + 1;
4822
8727f688
YO
4823 /* this one uses 's' and is a positive test */
4824 if (do_utf8) {
613f191e 4825 while (s < strend && ( *s == ' ' || is_utf8_space((U8*)s) ))
8727f688 4826 s += UTF8SKIP(s);
07bc277f 4827 } else if (RX_EXTFLAGS(rx) & RXf_PMf_LOCALE) {
8727f688
YO
4828 while (s < strend && isSPACE_LC(*s))
4829 ++s;
4830 } else {
4831 while (s < strend && isSPACE(*s))
4832 ++s;
4833 }
79072805
LW
4834 }
4835 }
07bc277f 4836 else if (RX_EXTFLAGS(rx) & RXf_START_ONLY) {
a0d0e21e 4837 while (--limit) {
a6e20a40
AL
4838 for (m = s; m < strend && *m != '\n'; m++)
4839 ;
a0d0e21e
LW
4840 m++;
4841 if (m >= strend)
4842 break;
437d3b4e
NC
4843 dstr = newSVpvn_flags(s, m-s,
4844 (do_utf8 ? SVf_UTF8 : 0) | make_mortal);
a0d0e21e
LW
4845 XPUSHs(dstr);
4846 s = m;
4847 }
4848 }
07bc277f 4849 else if (RX_EXTFLAGS(rx) & RXf_NULL && !(s >= strend)) {
640f820d
AB
4850 /*
4851 Pre-extend the stack, either the number of bytes or
4852 characters in the string or a limited amount, triggered by:
4853
4854 my ($x, $y) = split //, $str;
4855 or
4856 split //, $str, $i;
4857 */
4858 const U32 items = limit - 1;
4859 if (items < slen)
4860 EXTEND(SP, items);
4861 else
4862 EXTEND(SP, slen);
4863
e9515b0f
AB
4864 if (do_utf8) {
4865 while (--limit) {
4866 /* keep track of how many bytes we skip over */
4867 m = s;
640f820d 4868 s += UTF8SKIP(s);
437d3b4e 4869 dstr = newSVpvn_flags(m, s-m, SVf_UTF8 | make_mortal);
640f820d 4870
e9515b0f 4871 PUSHs(dstr);
640f820d 4872
e9515b0f
AB
4873 if (s >= strend)
4874 break;
4875 }
4876 } else {
4877 while (--limit) {
4878 dstr = newSVpvn(s, 1);
4879
4880 s++;
4881
4882 if (make_mortal)
4883 sv_2mortal(dstr);
640f820d 4884
e9515b0f
AB
4885 PUSHs(dstr);
4886
4887 if (s >= strend)
4888 break;
4889 }
640f820d
AB
4890 }
4891 }
3c8556c3 4892 else if (do_utf8 == (RX_UTF8(rx) != 0) &&
07bc277f
NC
4893 (RX_EXTFLAGS(rx) & RXf_USE_INTUIT) && !RX_NPARENS(rx)
4894 && (RX_EXTFLAGS(rx) & RXf_CHECK_ALL)
4895 && !(RX_EXTFLAGS(rx) & RXf_ANCH)) {
4896 const int tail = (RX_EXTFLAGS(rx) & RXf_INTUIT_TAIL);
f9f4320a 4897 SV * const csv = CALLREG_INTUIT_STRING(rx);
cf93c79d 4898
07bc277f 4899 len = RX_MINLENRET(rx);
3c8556c3 4900 if (len == 1 && !RX_UTF8(rx) && !tail) {
1b6737cc 4901 const char c = *SvPV_nolen_const(csv);
a0d0e21e 4902 while (--limit) {
a6e20a40
AL
4903 for (m = s; m < strend && *m != c; m++)
4904 ;
a0d0e21e
LW
4905 if (m >= strend)
4906 break;
437d3b4e
NC
4907 dstr = newSVpvn_flags(s, m-s,
4908 (do_utf8 ? SVf_UTF8 : 0) | make_mortal);
a0d0e21e 4909 XPUSHs(dstr);
93f04dac
JH
4910 /* The rx->minlen is in characters but we want to step
4911 * s ahead by bytes. */
1aa99e6b
IH
4912 if (do_utf8)
4913 s = (char*)utf8_hop((U8*)m, len);
4914 else
4915 s = m + len; /* Fake \n at the end */
a0d0e21e
LW
4916 }
4917 }
4918 else {
a0d0e21e 4919 while (s < strend && --limit &&
f722798b 4920 (m = fbm_instr((unsigned char*)s, (unsigned char*)strend,
7fba1cd6 4921 csv, multiline ? FBMrf_MULTILINE : 0)) )
a0d0e21e 4922 {
437d3b4e
NC
4923 dstr = newSVpvn_flags(s, m-s,
4924 (do_utf8 ? SVf_UTF8 : 0) | make_mortal);
a0d0e21e 4925 XPUSHs(dstr);
93f04dac
JH
4926 /* The rx->minlen is in characters but we want to step
4927 * s ahead by bytes. */
1aa99e6b
IH
4928 if (do_utf8)
4929 s = (char*)utf8_hop((U8*)m, len);
4930 else
4931 s = m + len; /* Fake \n at the end */
a0d0e21e 4932 }
463ee0b2 4933 }
463ee0b2 4934 }
a0d0e21e 4935 else {
07bc277f 4936 maxiters += slen * RX_NPARENS(rx);
080c2dec 4937 while (s < strend && --limit)
bbce6d69 4938 {
1b6737cc 4939 I32 rex_return;
080c2dec 4940 PUTBACK;
f9f4320a 4941 rex_return = CALLREGEXEC(rx, (char*)s, (char*)strend, (char*)orig, 1 ,
727b7506 4942 sv, NULL, 0);
080c2dec 4943 SPAGAIN;
1b6737cc 4944 if (rex_return == 0)
080c2dec 4945 break;
d9f97599 4946 TAINT_IF(RX_MATCH_TAINTED(rx));
07bc277f 4947 if (RX_MATCH_COPIED(rx) && RX_SUBBEG(rx) != orig) {
a0d0e21e
LW
4948 m = s;
4949 s = orig;
07bc277f 4950 orig = RX_SUBBEG(rx);
a0d0e21e
LW
4951 s = orig + (m - s);
4952 strend = s + (strend - m);
4953 }
07bc277f 4954 m = RX_OFFS(rx)[0].start + orig;
437d3b4e
NC
4955 dstr = newSVpvn_flags(s, m-s,
4956 (do_utf8 ? SVf_UTF8 : 0) | make_mortal);
a0d0e21e 4957 XPUSHs(dstr);
07bc277f 4958 if (RX_NPARENS(rx)) {
1b6737cc 4959 I32 i;
07bc277f
NC
4960 for (i = 1; i <= (I32)RX_NPARENS(rx); i++) {
4961 s = RX_OFFS(rx)[i].start + orig;
4962 m = RX_OFFS(rx)[i].end + orig;
6de67870
JP
4963
4964 /* japhy (07/27/01) -- the (m && s) test doesn't catch
4965 parens that didn't match -- they should be set to
4966 undef, not the empty string */
4967 if (m >= orig && s >= orig) {
437d3b4e
NC
4968 dstr = newSVpvn_flags(s, m-s,
4969 (do_utf8 ? SVf_UTF8 : 0)
4970 | make_mortal);
748a9306
LW
4971 }
4972 else
6de67870 4973 dstr = &PL_sv_undef; /* undef, not "" */
a0d0e21e
LW
4974 XPUSHs(dstr);
4975 }
4976 }
07bc277f 4977 s = RX_OFFS(rx)[0].end + orig;
a0d0e21e 4978 }
79072805 4979 }
8ec5e241 4980
3280af22 4981 iters = (SP - PL_stack_base) - base;
a0d0e21e 4982 if (iters > maxiters)
cea2e8a9 4983 DIE(aTHX_ "Split loop");
8ec5e241 4984
a0d0e21e
LW
4985 /* keep field after final delim? */
4986 if (s < strend || (iters && origlimit)) {
1b6737cc 4987 const STRLEN l = strend - s;
437d3b4e 4988 dstr = newSVpvn_flags(s, l, (do_utf8 ? SVf_UTF8 : 0) | make_mortal);
a0d0e21e
LW
4989 XPUSHs(dstr);
4990 iters++;
79072805 4991 }
a0d0e21e 4992 else if (!origlimit) {
89900bd3
SR
4993 while (iters > 0 && (!TOPs || !SvANY(TOPs) || SvCUR(TOPs) == 0)) {
4994 if (TOPs && !make_mortal)
4995 sv_2mortal(TOPs);
4996 iters--;
e3a8873f 4997 *SP-- = &PL_sv_undef;
89900bd3 4998 }
a0d0e21e 4999 }
8ec5e241 5000
8b7059b1
DM
5001 PUTBACK;
5002 LEAVE_SCOPE(oldsave); /* may undo an earlier SWITCHSTACK */
5003 SPAGAIN;
a0d0e21e 5004 if (realarray) {
8ec5e241 5005 if (!mg) {
1c0b011c
NIS
5006 if (SvSMAGICAL(ary)) {
5007 PUTBACK;
ad64d0ec 5008 mg_set(MUTABLE_SV(ary));
1c0b011c
NIS
5009 SPAGAIN;
5010 }
5011 if (gimme == G_ARRAY) {
5012 EXTEND(SP, iters);
5013 Copy(AvARRAY(ary), SP + 1, iters, SV*);
5014 SP += iters;
5015 RETURN;
5016 }
8ec5e241 5017 }
1c0b011c 5018 else {
fb73857a 5019 PUTBACK;
8ec5e241 5020 ENTER;
864dbfa3 5021 call_method("PUSH",G_SCALAR|G_DISCARD);
8ec5e241 5022 LEAVE;
fb73857a 5023 SPAGAIN;
8ec5e241 5024 if (gimme == G_ARRAY) {
1b6737cc 5025 I32 i;
8ec5e241
NIS
5026 /* EXTEND should not be needed - we just popped them */
5027 EXTEND(SP, iters);
5028 for (i=0; i < iters; i++) {
5029 SV **svp = av_fetch(ary, i, FALSE);
3280af22 5030 PUSHs((svp) ? *svp : &PL_sv_undef);
8ec5e241 5031 }
1c0b011c
NIS
5032 RETURN;
5033 }
a0d0e21e
LW
5034 }
5035 }
5036 else {
5037 if (gimme == G_ARRAY)
5038 RETURN;
5039 }
7f18b612
YST
5040
5041 GETTARGET;
5042 PUSHi(iters);
5043 RETURN;
79072805 5044}
85e6fe83 5045
c5917253
NC
5046PP(pp_once)
5047{
5048 dSP;
5049 SV *const sv = PAD_SVl(PL_op->op_targ);
5050
5051 if (SvPADSTALE(sv)) {
5052 /* First time. */
5053 SvPADSTALE_off(sv);
5054 RETURNOP(cLOGOP->op_other);
5055 }
5056 RETURNOP(cLOGOP->op_next);
5057}
5058
c0329465
MB
5059PP(pp_lock)
5060{
97aff369 5061 dVAR;
39644a26 5062 dSP;
c0329465 5063 dTOPss;
e55aaa0e 5064 SV *retsv = sv;
076a2a80 5065 assert(SvTYPE(retsv) != SVt_PVCV);
68795e93 5066 SvLOCK(sv);
076a2a80 5067 if (SvTYPE(retsv) == SVt_PVAV || SvTYPE(retsv) == SVt_PVHV) {
e55aaa0e
MB
5068 retsv = refto(retsv);
5069 }
5070 SETs(retsv);
c0329465
MB
5071 RETURN;
5072}
a863c7d1 5073
65bca31a
NC
5074
5075PP(unimplemented_op)
5076{
97aff369 5077 dVAR;
65bca31a
NC
5078 DIE(aTHX_ "panic: unimplemented op %s (#%d) called", OP_NAME(PL_op),
5079 PL_op->op_type);
5080}
5081
e609e586
NC
5082/*
5083 * Local variables:
5084 * c-indentation-style: bsd
5085 * c-basic-offset: 4
5086 * indent-tabs-mode: t
5087 * End:
5088 *
37442d52
RGS
5089 * ex: set ts=8 sts=4 sw=4 noet:
5090 */