This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Merge gv_AVadd(), gv_HVadd() and gv_SVadd() into gv_add_by_type().
[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
7332a6c4
VP
4069STATIC OP *
4070S_do_delete_local(pTHX)
79072805 4071{
97aff369 4072 dVAR;
39644a26 4073 dSP;
f54cb97a 4074 const I32 gimme = GIMME_V;
7332a6c4
VP
4075 const MAGIC *mg;
4076 HV *stash;
4077
4078 if (PL_op->op_private & OPpSLICE) {
4079 dMARK; dORIGMARK;
4080 SV * const osv = POPs;
4081 const bool tied = SvRMAGICAL(osv)
4082 && mg_find((const SV *)osv, PERL_MAGIC_tied);
4083 const bool can_preserve = SvCANEXISTDELETE(osv)
4084 || mg_find((const SV *)osv, PERL_MAGIC_env);
4085 const U32 type = SvTYPE(osv);
4086 if (type == SVt_PVHV) { /* hash element */
4087 HV * const hv = MUTABLE_HV(osv);
4088 while (++MARK <= SP) {
4089 SV * const keysv = *MARK;
4090 SV *sv = NULL;
4091 bool preeminent = TRUE;
4092 if (can_preserve)
4093 preeminent = hv_exists_ent(hv, keysv, 0);
4094 if (tied) {
4095 HE *he = hv_fetch_ent(hv, keysv, 1, 0);
4096 if (he)
4097 sv = HeVAL(he);
4098 else
4099 preeminent = FALSE;
4100 }
4101 else {
4102 sv = hv_delete_ent(hv, keysv, 0, 0);
4103 SvREFCNT_inc_simple_void(sv); /* De-mortalize */
4104 }
4105 if (preeminent) {
4106 save_helem_flags(hv, keysv, &sv, SAVEf_KEEPOLDELEM);
4107 if (tied) {
4108 *MARK = sv_mortalcopy(sv);
4109 mg_clear(sv);
4110 } else
4111 *MARK = sv;
4112 }
4113 else {
4114 SAVEHDELETE(hv, keysv);
4115 *MARK = &PL_sv_undef;
4116 }
4117 }
4118 }
4119 else if (type == SVt_PVAV) { /* array element */
4120 if (PL_op->op_flags & OPf_SPECIAL) {
4121 AV * const av = MUTABLE_AV(osv);
4122 while (++MARK <= SP) {
4123 I32 idx = SvIV(*MARK);
4124 SV *sv = NULL;
4125 bool preeminent = TRUE;
4126 if (can_preserve)
4127 preeminent = av_exists(av, idx);
4128 if (tied) {
4129 SV **svp = av_fetch(av, idx, 1);
4130 if (svp)
4131 sv = *svp;
4132 else
4133 preeminent = FALSE;
4134 }
4135 else {
4136 sv = av_delete(av, idx, 0);
4137 SvREFCNT_inc_simple_void(sv); /* De-mortalize */
4138 }
4139 if (preeminent) {
4140 save_aelem_flags(av, idx, &sv, SAVEf_KEEPOLDELEM);
4141 if (tied) {
4142 *MARK = sv_mortalcopy(sv);
4143 mg_clear(sv);
4144 } else
4145 *MARK = sv;
4146 }
4147 else {
4148 SAVEADELETE(av, idx);
4149 *MARK = &PL_sv_undef;
4150 }
4151 }
4152 }
4153 }
4154 else
4155 DIE(aTHX_ "Not a HASH reference");
4156 if (gimme == G_VOID)
4157 SP = ORIGMARK;
4158 else if (gimme == G_SCALAR) {
4159 MARK = ORIGMARK;
4160 if (SP > MARK)
4161 *++MARK = *SP;
4162 else
4163 *++MARK = &PL_sv_undef;
4164 SP = MARK;
4165 }
4166 }
4167 else {
4168 SV * const keysv = POPs;
4169 SV * const osv = POPs;
4170 const bool tied = SvRMAGICAL(osv)
4171 && mg_find((const SV *)osv, PERL_MAGIC_tied);
4172 const bool can_preserve = SvCANEXISTDELETE(osv)
4173 || mg_find((const SV *)osv, PERL_MAGIC_env);
4174 const U32 type = SvTYPE(osv);
4175 SV *sv = NULL;
4176 if (type == SVt_PVHV) {
4177 HV * const hv = MUTABLE_HV(osv);
4178 bool preeminent = TRUE;
4179 if (can_preserve)
4180 preeminent = hv_exists_ent(hv, keysv, 0);
4181 if (tied) {
4182 HE *he = hv_fetch_ent(hv, keysv, 1, 0);
4183 if (he)
4184 sv = HeVAL(he);
4185 else
4186 preeminent = FALSE;
4187 }
4188 else {
4189 sv = hv_delete_ent(hv, keysv, 0, 0);
4190 SvREFCNT_inc_simple_void(sv); /* De-mortalize */
4191 }
4192 if (preeminent) {
4193 save_helem_flags(hv, keysv, &sv, SAVEf_KEEPOLDELEM);
4194 if (tied) {
4195 SV *nsv = sv_mortalcopy(sv);
4196 mg_clear(sv);
4197 sv = nsv;
4198 }
4199 }
4200 else
4201 SAVEHDELETE(hv, keysv);
4202 }
4203 else if (type == SVt_PVAV) {
4204 if (PL_op->op_flags & OPf_SPECIAL) {
4205 AV * const av = MUTABLE_AV(osv);
4206 I32 idx = SvIV(keysv);
4207 bool preeminent = TRUE;
4208 if (can_preserve)
4209 preeminent = av_exists(av, idx);
4210 if (tied) {
4211 SV **svp = av_fetch(av, idx, 1);
4212 if (svp)
4213 sv = *svp;
4214 else
4215 preeminent = FALSE;
4216 }
4217 else {
4218 sv = av_delete(av, idx, 0);
4219 SvREFCNT_inc_simple_void(sv); /* De-mortalize */
4220 }
4221 if (preeminent) {
4222 save_aelem_flags(av, idx, &sv, SAVEf_KEEPOLDELEM);
4223 if (tied) {
4224 SV *nsv = sv_mortalcopy(sv);
4225 mg_clear(sv);
4226 sv = nsv;
4227 }
4228 }
4229 else
4230 SAVEADELETE(av, idx);
4231 }
4232 else
4233 DIE(aTHX_ "panic: avhv_delete no longer supported");
4234 }
4235 else
4236 DIE(aTHX_ "Not a HASH reference");
4237 if (!sv)
4238 sv = &PL_sv_undef;
4239 if (gimme != G_VOID)
4240 PUSHs(sv);
4241 }
4242
4243 RETURN;
4244}
4245
4246PP(pp_delete)
4247{
4248 dVAR;
4249 dSP;
4250 I32 gimme;
4251 I32 discard;
4252
4253 if (PL_op->op_private & OPpLVAL_INTRO)
4254 return do_delete_local();
4255
4256 gimme = GIMME_V;
4257 discard = (gimme == G_VOID) ? G_DISCARD : 0;
5f05dabc 4258
533c011a 4259 if (PL_op->op_private & OPpSLICE) {
5f05dabc 4260 dMARK; dORIGMARK;
85fbaab2 4261 HV * const hv = MUTABLE_HV(POPs);
1b6737cc 4262 const U32 hvtype = SvTYPE(hv);
01020589
GS
4263 if (hvtype == SVt_PVHV) { /* hash element */
4264 while (++MARK <= SP) {
1b6737cc 4265 SV * const sv = hv_delete_ent(hv, *MARK, discard, 0);
01020589
GS
4266 *MARK = sv ? sv : &PL_sv_undef;
4267 }
5f05dabc 4268 }
6d822dc4
MS
4269 else if (hvtype == SVt_PVAV) { /* array element */
4270 if (PL_op->op_flags & OPf_SPECIAL) {
4271 while (++MARK <= SP) {
502c6561 4272 SV * const sv = av_delete(MUTABLE_AV(hv), SvIV(*MARK), discard);
6d822dc4
MS
4273 *MARK = sv ? sv : &PL_sv_undef;
4274 }
4275 }
01020589
GS
4276 }
4277 else
4278 DIE(aTHX_ "Not a HASH reference");
54310121 4279 if (discard)
4280 SP = ORIGMARK;
4281 else if (gimme == G_SCALAR) {
5f05dabc 4282 MARK = ORIGMARK;
9111c9c0
DM
4283 if (SP > MARK)
4284 *++MARK = *SP;
4285 else
4286 *++MARK = &PL_sv_undef;
5f05dabc 4287 SP = MARK;
4288 }
4289 }
4290 else {
4291 SV *keysv = POPs;
85fbaab2 4292 HV * const hv = MUTABLE_HV(POPs);
1b6737cc 4293 SV *sv;
97fcbf96
MB
4294 if (SvTYPE(hv) == SVt_PVHV)
4295 sv = hv_delete_ent(hv, keysv, discard, 0);
01020589
GS
4296 else if (SvTYPE(hv) == SVt_PVAV) {
4297 if (PL_op->op_flags & OPf_SPECIAL)
502c6561 4298 sv = av_delete(MUTABLE_AV(hv), SvIV(keysv), discard);
af288a60
HS
4299 else
4300 DIE(aTHX_ "panic: avhv_delete no longer supported");
01020589 4301 }
97fcbf96 4302 else
cea2e8a9 4303 DIE(aTHX_ "Not a HASH reference");
5f05dabc 4304 if (!sv)
3280af22 4305 sv = &PL_sv_undef;
54310121 4306 if (!discard)
4307 PUSHs(sv);
79072805 4308 }
79072805
LW
4309 RETURN;
4310}
4311
a0d0e21e 4312PP(pp_exists)
79072805 4313{
97aff369 4314 dVAR;
39644a26 4315 dSP;
afebc493
GS
4316 SV *tmpsv;
4317 HV *hv;
4318
4319 if (PL_op->op_private & OPpEXISTS_SUB) {
4320 GV *gv;
0bd48802 4321 SV * const sv = POPs;
f2c0649b 4322 CV * const cv = sv_2cv(sv, &hv, &gv, 0);
afebc493
GS
4323 if (cv)
4324 RETPUSHYES;
4325 if (gv && isGV(gv) && GvCV(gv) && !GvCVGEN(gv))
4326 RETPUSHYES;
4327 RETPUSHNO;
4328 }
4329 tmpsv = POPs;
85fbaab2 4330 hv = MUTABLE_HV(POPs);
c750a3ec 4331 if (SvTYPE(hv) == SVt_PVHV) {
ae77835f 4332 if (hv_exists_ent(hv, tmpsv, 0))
c750a3ec 4333 RETPUSHYES;
ef54e1a4
JH
4334 }
4335 else if (SvTYPE(hv) == SVt_PVAV) {
01020589 4336 if (PL_op->op_flags & OPf_SPECIAL) { /* array element */
502c6561 4337 if (av_exists(MUTABLE_AV(hv), SvIV(tmpsv)))
01020589
GS
4338 RETPUSHYES;
4339 }
ef54e1a4
JH
4340 }
4341 else {
cea2e8a9 4342 DIE(aTHX_ "Not a HASH reference");
a0d0e21e 4343 }
a0d0e21e
LW
4344 RETPUSHNO;
4345}
79072805 4346
a0d0e21e
LW
4347PP(pp_hslice)
4348{
97aff369 4349 dVAR; dSP; dMARK; dORIGMARK;
85fbaab2 4350 register HV * const hv = MUTABLE_HV(POPs);
1b6737cc
AL
4351 register const I32 lval = (PL_op->op_flags & OPf_MOD || LVRET);
4352 const bool localizing = PL_op->op_private & OPpLVAL_INTRO;
d30e492c 4353 bool can_preserve = FALSE;
79072805 4354
eb85dfd3
DM
4355 if (localizing) {
4356 MAGIC *mg;
4357 HV *stash;
4358
d30e492c
VP
4359 if (SvCANEXISTDELETE(hv) || mg_find((const SV *)hv, PERL_MAGIC_env))
4360 can_preserve = TRUE;
eb85dfd3
DM
4361 }
4362
6d822dc4 4363 while (++MARK <= SP) {
1b6737cc 4364 SV * const keysv = *MARK;
6d822dc4
MS
4365 SV **svp;
4366 HE *he;
d30e492c
VP
4367 bool preeminent = TRUE;
4368
4369 if (localizing && can_preserve) {
4370 /* If we can determine whether the element exist,
4371 * try to preserve the existenceness of a tied hash
4372 * element by using EXISTS and DELETE if possible.
4373 * Fallback to FETCH and STORE otherwise. */
4374 preeminent = hv_exists_ent(hv, keysv, 0);
6d822dc4 4375 }
eb85dfd3 4376
6d822dc4 4377 he = hv_fetch_ent(hv, keysv, lval, 0);
fe5bfecd 4378 svp = he ? &HeVAL(he) : NULL;
eb85dfd3 4379
6d822dc4
MS
4380 if (lval) {
4381 if (!svp || *svp == &PL_sv_undef) {
be2597df 4382 DIE(aTHX_ PL_no_helem_sv, SVfARG(keysv));
6d822dc4
MS
4383 }
4384 if (localizing) {
7a2e501a 4385 if (HvNAME_get(hv) && isGV(*svp))
159b6efe 4386 save_gp(MUTABLE_GV(*svp), !(PL_op->op_flags & OPf_SPECIAL));
47cfc530
VP
4387 else if (preeminent)
4388 save_helem_flags(hv, keysv, svp,
4389 (PL_op->op_flags & OPf_SPECIAL) ? 0 : SAVEf_SETMAGIC);
4390 else
4391 SAVEHDELETE(hv, keysv);
6d822dc4
MS
4392 }
4393 }
4394 *MARK = svp ? *svp : &PL_sv_undef;
79072805 4395 }
a0d0e21e
LW
4396 if (GIMME != G_ARRAY) {
4397 MARK = ORIGMARK;
04ab2c87 4398 *++MARK = SP > ORIGMARK ? *SP : &PL_sv_undef;
a0d0e21e 4399 SP = MARK;
79072805 4400 }
a0d0e21e
LW
4401 RETURN;
4402}
4403
4404/* List operators. */
4405
4406PP(pp_list)
4407{
97aff369 4408 dVAR; dSP; dMARK;
a0d0e21e
LW
4409 if (GIMME != G_ARRAY) {
4410 if (++MARK <= SP)
4411 *MARK = *SP; /* unwanted list, return last item */
8990e307 4412 else
3280af22 4413 *MARK = &PL_sv_undef;
a0d0e21e 4414 SP = MARK;
79072805 4415 }
a0d0e21e 4416 RETURN;
79072805
LW
4417}
4418
a0d0e21e 4419PP(pp_lslice)
79072805 4420{
97aff369 4421 dVAR;
39644a26 4422 dSP;
1b6737cc
AL
4423 SV ** const lastrelem = PL_stack_sp;
4424 SV ** const lastlelem = PL_stack_base + POPMARK;
4425 SV ** const firstlelem = PL_stack_base + POPMARK + 1;
4426 register SV ** const firstrelem = lastlelem + 1;
fc15ae8f 4427 const I32 arybase = CopARYBASE_get(PL_curcop);
42e73ed0 4428 I32 is_something_there = FALSE;
1b6737cc
AL
4429
4430 register const I32 max = lastrelem - lastlelem;
a0d0e21e 4431 register SV **lelem;
a0d0e21e
LW
4432
4433 if (GIMME != G_ARRAY) {
4ea561bc 4434 I32 ix = SvIV(*lastlelem);
748a9306
LW
4435 if (ix < 0)
4436 ix += max;
4437 else
4438 ix -= arybase;
a0d0e21e 4439 if (ix < 0 || ix >= max)
3280af22 4440 *firstlelem = &PL_sv_undef;
a0d0e21e
LW
4441 else
4442 *firstlelem = firstrelem[ix];
4443 SP = firstlelem;
4444 RETURN;
4445 }
4446
4447 if (max == 0) {
4448 SP = firstlelem - 1;
4449 RETURN;
4450 }
4451
4452 for (lelem = firstlelem; lelem <= lastlelem; lelem++) {
4ea561bc 4453 I32 ix = SvIV(*lelem);
c73bf8e3 4454 if (ix < 0)
a0d0e21e 4455 ix += max;
b13b2135 4456 else
748a9306 4457 ix -= arybase;
c73bf8e3
HS
4458 if (ix < 0 || ix >= max)
4459 *lelem = &PL_sv_undef;
4460 else {
4461 is_something_there = TRUE;
4462 if (!(*lelem = firstrelem[ix]))
3280af22 4463 *lelem = &PL_sv_undef;
748a9306 4464 }
79072805 4465 }
4633a7c4
LW
4466 if (is_something_there)
4467 SP = lastlelem;
4468 else
4469 SP = firstlelem - 1;
79072805
LW
4470 RETURN;
4471}
4472
a0d0e21e
LW
4473PP(pp_anonlist)
4474{
97aff369 4475 dVAR; dSP; dMARK; dORIGMARK;
1b6737cc 4476 const I32 items = SP - MARK;
ad64d0ec 4477 SV * const av = MUTABLE_SV(av_make(items, MARK+1));
44a8e56a 4478 SP = ORIGMARK; /* av_make() might realloc stack_sp */
6e449a3a
MHM
4479 mXPUSHs((PL_op->op_flags & OPf_SPECIAL)
4480 ? newRV_noinc(av) : av);
a0d0e21e
LW
4481 RETURN;
4482}
4483
4484PP(pp_anonhash)
79072805 4485{
97aff369 4486 dVAR; dSP; dMARK; dORIGMARK;
78c72037 4487 HV* const hv = newHV();
a0d0e21e
LW
4488
4489 while (MARK < SP) {
1b6737cc 4490 SV * const key = *++MARK;
561b68a9 4491 SV * const val = newSV(0);
a0d0e21e
LW
4492 if (MARK < SP)
4493 sv_setsv(val, *++MARK);
e476b1b5 4494 else if (ckWARN(WARN_MISC))
9014280d 4495 Perl_warner(aTHX_ packWARN(WARN_MISC), "Odd number of elements in anonymous hash");
f12c7020 4496 (void)hv_store_ent(hv,key,val,0);
79072805 4497 }
a0d0e21e 4498 SP = ORIGMARK;
6e449a3a 4499 mXPUSHs((PL_op->op_flags & OPf_SPECIAL)
ad64d0ec 4500 ? newRV_noinc(MUTABLE_SV(hv)) : MUTABLE_SV(hv));
79072805
LW
4501 RETURN;
4502}
4503
a0d0e21e 4504PP(pp_splice)
79072805 4505{
27da23d5 4506 dVAR; dSP; dMARK; dORIGMARK;
502c6561 4507 register AV *ary = MUTABLE_AV(*++MARK);
a0d0e21e
LW
4508 register SV **src;
4509 register SV **dst;
4510 register I32 i;
4511 register I32 offset;
4512 register I32 length;
4513 I32 newlen;
4514 I32 after;
4515 I32 diff;
ad64d0ec 4516 const MAGIC * const mg = SvTIED_mg((const SV *)ary, PERL_MAGIC_tied);
93965878 4517
1b6737cc 4518 if (mg) {
ad64d0ec 4519 *MARK-- = SvTIED_obj(MUTABLE_SV(ary), mg);
93965878 4520 PUSHMARK(MARK);
8ec5e241 4521 PUTBACK;
a60c0954 4522 ENTER;
864dbfa3 4523 call_method("SPLICE",GIMME_V);
a60c0954 4524 LEAVE;
93965878
NIS
4525 SPAGAIN;
4526 RETURN;
4527 }
79072805 4528
a0d0e21e 4529 SP++;
79072805 4530
a0d0e21e 4531 if (++MARK < SP) {
4ea561bc 4532 offset = i = SvIV(*MARK);
a0d0e21e 4533 if (offset < 0)
93965878 4534 offset += AvFILLp(ary) + 1;
a0d0e21e 4535 else
fc15ae8f 4536 offset -= CopARYBASE_get(PL_curcop);
84902520 4537 if (offset < 0)
cea2e8a9 4538 DIE(aTHX_ PL_no_aelem, i);
a0d0e21e
LW
4539 if (++MARK < SP) {
4540 length = SvIVx(*MARK++);
48cdf507
GA
4541 if (length < 0) {
4542 length += AvFILLp(ary) - offset + 1;
4543 if (length < 0)
4544 length = 0;
4545 }
79072805
LW
4546 }
4547 else
a0d0e21e 4548 length = AvMAX(ary) + 1; /* close enough to infinity */
79072805 4549 }
a0d0e21e
LW
4550 else {
4551 offset = 0;
4552 length = AvMAX(ary) + 1;
4553 }
8cbc2e3b
JH
4554 if (offset > AvFILLp(ary) + 1) {
4555 if (ckWARN(WARN_MISC))
9014280d 4556 Perl_warner(aTHX_ packWARN(WARN_MISC), "splice() offset past end of array" );
93965878 4557 offset = AvFILLp(ary) + 1;
8cbc2e3b 4558 }
93965878 4559 after = AvFILLp(ary) + 1 - (offset + length);
a0d0e21e
LW
4560 if (after < 0) { /* not that much array */
4561 length += after; /* offset+length now in array */
4562 after = 0;
4563 if (!AvALLOC(ary))
4564 av_extend(ary, 0);
4565 }
4566
4567 /* At this point, MARK .. SP-1 is our new LIST */
4568
4569 newlen = SP - MARK;
4570 diff = newlen - length;
13d7cbc1
GS
4571 if (newlen && !AvREAL(ary) && AvREIFY(ary))
4572 av_reify(ary);
a0d0e21e 4573
50528de0
WL
4574 /* make new elements SVs now: avoid problems if they're from the array */
4575 for (dst = MARK, i = newlen; i; i--) {
1b6737cc 4576 SV * const h = *dst;
f2b990bf 4577 *dst++ = newSVsv(h);
50528de0
WL
4578 }
4579
a0d0e21e 4580 if (diff < 0) { /* shrinking the area */
95b63a38 4581 SV **tmparyval = NULL;
a0d0e21e 4582 if (newlen) {
a02a5408 4583 Newx(tmparyval, newlen, SV*); /* so remember insertion */
a0d0e21e 4584 Copy(MARK, tmparyval, newlen, SV*);
79072805 4585 }
a0d0e21e
LW
4586
4587 MARK = ORIGMARK + 1;
4588 if (GIMME == G_ARRAY) { /* copy return vals to stack */
4589 MEXTEND(MARK, length);
4590 Copy(AvARRAY(ary)+offset, MARK, length, SV*);
4591 if (AvREAL(ary)) {
bbce6d69 4592 EXTEND_MORTAL(length);
36477c24 4593 for (i = length, dst = MARK; i; i--) {
d689ffdd 4594 sv_2mortal(*dst); /* free them eventualy */
36477c24 4595 dst++;
4596 }
a0d0e21e
LW
4597 }
4598 MARK += length - 1;
79072805 4599 }
a0d0e21e
LW
4600 else {
4601 *MARK = AvARRAY(ary)[offset+length-1];
4602 if (AvREAL(ary)) {
d689ffdd 4603 sv_2mortal(*MARK);
a0d0e21e
LW
4604 for (i = length - 1, dst = &AvARRAY(ary)[offset]; i > 0; i--)
4605 SvREFCNT_dec(*dst++); /* free them now */
79072805 4606 }
a0d0e21e 4607 }
93965878 4608 AvFILLp(ary) += diff;
a0d0e21e
LW
4609
4610 /* pull up or down? */
4611
4612 if (offset < after) { /* easier to pull up */
4613 if (offset) { /* esp. if nothing to pull */
4614 src = &AvARRAY(ary)[offset-1];
4615 dst = src - diff; /* diff is negative */
4616 for (i = offset; i > 0; i--) /* can't trust Copy */
4617 *dst-- = *src--;
79072805 4618 }
a0d0e21e 4619 dst = AvARRAY(ary);
9c6bc640 4620 AvARRAY(ary) = AvARRAY(ary) - diff; /* diff is negative */
a0d0e21e
LW
4621 AvMAX(ary) += diff;
4622 }
4623 else {
4624 if (after) { /* anything to pull down? */
4625 src = AvARRAY(ary) + offset + length;
4626 dst = src + diff; /* diff is negative */
4627 Move(src, dst, after, SV*);
79072805 4628 }
93965878 4629 dst = &AvARRAY(ary)[AvFILLp(ary)+1];
a0d0e21e
LW
4630 /* avoid later double free */
4631 }
4632 i = -diff;
4633 while (i)
3280af22 4634 dst[--i] = &PL_sv_undef;
a0d0e21e
LW
4635
4636 if (newlen) {
50528de0 4637 Copy( tmparyval, AvARRAY(ary) + offset, newlen, SV* );
a0d0e21e
LW
4638 Safefree(tmparyval);
4639 }
4640 }
4641 else { /* no, expanding (or same) */
d3961450 4642 SV** tmparyval = NULL;
a0d0e21e 4643 if (length) {
a02a5408 4644 Newx(tmparyval, length, SV*); /* so remember deletion */
a0d0e21e
LW
4645 Copy(AvARRAY(ary)+offset, tmparyval, length, SV*);
4646 }
4647
4648 if (diff > 0) { /* expanding */
a0d0e21e 4649 /* push up or down? */
a0d0e21e
LW
4650 if (offset < after && diff <= AvARRAY(ary) - AvALLOC(ary)) {
4651 if (offset) {
4652 src = AvARRAY(ary);
4653 dst = src - diff;
4654 Move(src, dst, offset, SV*);
79072805 4655 }
9c6bc640 4656 AvARRAY(ary) = AvARRAY(ary) - diff;/* diff is positive */
a0d0e21e 4657 AvMAX(ary) += diff;
93965878 4658 AvFILLp(ary) += diff;
79072805
LW
4659 }
4660 else {
93965878
NIS
4661 if (AvFILLp(ary) + diff >= AvMAX(ary)) /* oh, well */
4662 av_extend(ary, AvFILLp(ary) + diff);
4663 AvFILLp(ary) += diff;
a0d0e21e
LW
4664
4665 if (after) {
93965878 4666 dst = AvARRAY(ary) + AvFILLp(ary);
a0d0e21e
LW
4667 src = dst - diff;
4668 for (i = after; i; i--) {
4669 *dst-- = *src--;
4670 }
79072805
LW
4671 }
4672 }
a0d0e21e
LW
4673 }
4674
50528de0
WL
4675 if (newlen) {
4676 Copy( MARK, AvARRAY(ary) + offset, newlen, SV* );
a0d0e21e 4677 }
50528de0 4678
a0d0e21e
LW
4679 MARK = ORIGMARK + 1;
4680 if (GIMME == G_ARRAY) { /* copy return vals to stack */
4681 if (length) {
4682 Copy(tmparyval, MARK, length, SV*);
4683 if (AvREAL(ary)) {
bbce6d69 4684 EXTEND_MORTAL(length);
36477c24 4685 for (i = length, dst = MARK; i; i--) {
d689ffdd 4686 sv_2mortal(*dst); /* free them eventualy */
36477c24 4687 dst++;
4688 }
79072805
LW
4689 }
4690 }
a0d0e21e
LW
4691 MARK += length - 1;
4692 }
4693 else if (length--) {
4694 *MARK = tmparyval[length];
4695 if (AvREAL(ary)) {
d689ffdd 4696 sv_2mortal(*MARK);
a0d0e21e
LW
4697 while (length-- > 0)
4698 SvREFCNT_dec(tmparyval[length]);
79072805 4699 }
79072805 4700 }
a0d0e21e 4701 else
3280af22 4702 *MARK = &PL_sv_undef;
d3961450 4703 Safefree(tmparyval);
79072805 4704 }
a0d0e21e 4705 SP = MARK;
79072805
LW
4706 RETURN;
4707}
4708
a0d0e21e 4709PP(pp_push)
79072805 4710{
27da23d5 4711 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
502c6561 4712 register AV * const ary = MUTABLE_AV(*++MARK);
ad64d0ec 4713 const MAGIC * const mg = SvTIED_mg((const SV *)ary, PERL_MAGIC_tied);
79072805 4714
1b6737cc 4715 if (mg) {
ad64d0ec 4716 *MARK-- = SvTIED_obj(MUTABLE_SV(ary), mg);
93965878
NIS
4717 PUSHMARK(MARK);
4718 PUTBACK;
a60c0954 4719 ENTER;
864dbfa3 4720 call_method("PUSH",G_SCALAR|G_DISCARD);
a60c0954 4721 LEAVE;
93965878 4722 SPAGAIN;
0a75904b 4723 SP = ORIGMARK;
5658d0a9
LR
4724 if (GIMME_V != G_VOID) {
4725 PUSHi( AvFILL(ary) + 1 );
4726 }
93965878 4727 }
a60c0954 4728 else {
89c14e2e 4729 PL_delaymagic = DM_DELAY;
a60c0954 4730 for (++MARK; MARK <= SP; MARK++) {
561b68a9 4731 SV * const sv = newSV(0);
a60c0954
NIS
4732 if (*MARK)
4733 sv_setsv(sv, *MARK);
0a75904b 4734 av_store(ary, AvFILLp(ary)+1, sv);
a60c0954 4735 }
89c14e2e 4736 if (PL_delaymagic & DM_ARRAY)
ad64d0ec 4737 mg_set(MUTABLE_SV(ary));
89c14e2e
BB
4738
4739 PL_delaymagic = 0;
0a75904b
TP
4740 SP = ORIGMARK;
4741 PUSHi( AvFILLp(ary) + 1 );
79072805 4742 }
79072805
LW
4743 RETURN;
4744}
4745
a0d0e21e 4746PP(pp_shift)
79072805 4747{
97aff369 4748 dVAR;
39644a26 4749 dSP;
502c6561 4750 AV * const av = MUTABLE_AV(POPs);
789b4bc9 4751 SV * const sv = PL_op->op_type == OP_SHIFT ? av_shift(av) : av_pop(av);
79072805 4752 EXTEND(SP, 1);
c2b4a044 4753 assert (sv);
d689ffdd 4754 if (AvREAL(av))
a0d0e21e
LW
4755 (void)sv_2mortal(sv);
4756 PUSHs(sv);
79072805 4757 RETURN;
79072805
LW
4758}
4759
a0d0e21e 4760PP(pp_unshift)
79072805 4761{
27da23d5 4762 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
502c6561 4763 register AV *ary = MUTABLE_AV(*++MARK);
ad64d0ec 4764 const MAGIC * const mg = SvTIED_mg((const SV *)ary, PERL_MAGIC_tied);
93965878 4765
1b6737cc 4766 if (mg) {
ad64d0ec 4767 *MARK-- = SvTIED_obj(MUTABLE_SV(ary), mg);
7fd66d9d 4768 PUSHMARK(MARK);
93965878 4769 PUTBACK;
a60c0954 4770 ENTER;
864dbfa3 4771 call_method("UNSHIFT",G_SCALAR|G_DISCARD);
a60c0954 4772 LEAVE;
93965878 4773 SPAGAIN;
93965878 4774 }
a60c0954 4775 else {
1b6737cc 4776 register I32 i = 0;
a60c0954
NIS
4777 av_unshift(ary, SP - MARK);
4778 while (MARK < SP) {
1b6737cc 4779 SV * const sv = newSVsv(*++MARK);
a60c0954
NIS
4780 (void)av_store(ary, i++, sv);
4781 }
79072805 4782 }
a0d0e21e 4783 SP = ORIGMARK;
5658d0a9
LR
4784 if (GIMME_V != G_VOID) {
4785 PUSHi( AvFILL(ary) + 1 );
4786 }
79072805 4787 RETURN;
79072805
LW
4788}
4789
a0d0e21e 4790PP(pp_reverse)
79072805 4791{
97aff369 4792 dVAR; dSP; dMARK;
1b6737cc 4793 SV ** const oldsp = SP;
79072805 4794
a0d0e21e
LW
4795 if (GIMME == G_ARRAY) {
4796 MARK++;
4797 while (MARK < SP) {
1b6737cc 4798 register SV * const tmp = *MARK;
a0d0e21e
LW
4799 *MARK++ = *SP;
4800 *SP-- = tmp;
4801 }
dd58a1ab 4802 /* safe as long as stack cannot get extended in the above */
a0d0e21e 4803 SP = oldsp;
79072805
LW
4804 }
4805 else {
a0d0e21e
LW
4806 register char *up;
4807 register char *down;
4808 register I32 tmp;
4809 dTARGET;
4810 STRLEN len;
9f7d9405 4811 PADOFFSET padoff_du;
79072805 4812
7e2040f0 4813 SvUTF8_off(TARG); /* decontaminate */
a0d0e21e 4814 if (SP - MARK > 1)
3280af22 4815 do_join(TARG, &PL_sv_no, MARK, SP);
1e21d011 4816 else {
e1f795dc
RGS
4817 sv_setsv(TARG, (SP > MARK)
4818 ? *SP
29289021 4819 : (padoff_du = find_rundefsvoffset(),
00b1698f
NC
4820 (padoff_du == NOT_IN_PAD
4821 || PAD_COMPNAME_FLAGS_isOUR(padoff_du))
e1f795dc 4822 ? DEFSV : PAD_SVl(padoff_du)));
1e21d011
B
4823
4824 if (! SvOK(TARG) && ckWARN(WARN_UNINITIALIZED))
4825 report_uninit(TARG);
4826 }
4827
a0d0e21e
LW
4828 up = SvPV_force(TARG, len);
4829 if (len > 1) {
7e2040f0 4830 if (DO_UTF8(TARG)) { /* first reverse each character */
dfe13c55 4831 U8* s = (U8*)SvPVX(TARG);
349d4f2f 4832 const U8* send = (U8*)(s + len);
a0ed51b3 4833 while (s < send) {
d742c382 4834 if (UTF8_IS_INVARIANT(*s)) {
a0ed51b3
LW
4835 s++;
4836 continue;
4837 }
4838 else {
9041c2e3 4839 if (!utf8_to_uvchr(s, 0))
a0dbb045 4840 break;
dfe13c55 4841 up = (char*)s;
a0ed51b3 4842 s += UTF8SKIP(s);
dfe13c55 4843 down = (char*)(s - 1);
a0dbb045 4844 /* reverse this character */
a0ed51b3
LW
4845 while (down > up) {
4846 tmp = *up;
4847 *up++ = *down;
eb160463 4848 *down-- = (char)tmp;
a0ed51b3
LW
4849 }
4850 }
4851 }
4852 up = SvPVX(TARG);
4853 }
a0d0e21e
LW
4854 down = SvPVX(TARG) + len - 1;
4855 while (down > up) {
4856 tmp = *up;
4857 *up++ = *down;
eb160463 4858 *down-- = (char)tmp;
a0d0e21e 4859 }
3aa33fe5 4860 (void)SvPOK_only_UTF8(TARG);
79072805 4861 }
a0d0e21e
LW
4862 SP = MARK + 1;
4863 SETTARG;
79072805 4864 }
a0d0e21e 4865 RETURN;
79072805
LW
4866}
4867
a0d0e21e 4868PP(pp_split)
79072805 4869{
27da23d5 4870 dVAR; dSP; dTARG;
a0d0e21e 4871 AV *ary;
467f0320 4872 register IV limit = POPi; /* note, negative is forever */
1b6737cc 4873 SV * const sv = POPs;
a0d0e21e 4874 STRLEN len;
727b7506 4875 register const char *s = SvPV_const(sv, len);
1b6737cc 4876 const bool do_utf8 = DO_UTF8(sv);
727b7506 4877 const char *strend = s + len;
44a8e56a 4878 register PMOP *pm;
d9f97599 4879 register REGEXP *rx;
a0d0e21e 4880 register SV *dstr;
727b7506 4881 register const char *m;
a0d0e21e 4882 I32 iters = 0;
bb7a0f54 4883 const STRLEN slen = do_utf8 ? utf8_length((U8*)s, (U8*)strend) : (STRLEN)(strend - s);
792b2c16 4884 I32 maxiters = slen + 10;
727b7506 4885 const char *orig;
1b6737cc 4886 const I32 origlimit = limit;
a0d0e21e
LW
4887 I32 realarray = 0;
4888 I32 base;
f54cb97a
AL
4889 const I32 gimme = GIMME_V;
4890 const I32 oldsave = PL_savestack_ix;
437d3b4e 4891 U32 make_mortal = SVs_TEMP;
7fba1cd6 4892 bool multiline = 0;
b37c2d43 4893 MAGIC *mg = NULL;
79072805 4894
44a8e56a 4895#ifdef DEBUGGING
4896 Copy(&LvTARGOFF(POPs), &pm, 1, PMOP*);
4897#else
4898 pm = (PMOP*)POPs;
4899#endif
a0d0e21e 4900 if (!pm || !s)
2269b42e 4901 DIE(aTHX_ "panic: pp_split");
aaa362c4 4902 rx = PM_GETRE(pm);
bbce6d69 4903
07bc277f
NC
4904 TAINT_IF((RX_EXTFLAGS(rx) & RXf_PMf_LOCALE) &&
4905 (RX_EXTFLAGS(rx) & (RXf_WHITE | RXf_SKIPWHITE)));
bbce6d69 4906
a30b2f1f 4907 RX_MATCH_UTF8_set(rx, do_utf8);
d9f424b2 4908
971a9dd3 4909#ifdef USE_ITHREADS
20e98b0f 4910 if (pm->op_pmreplrootu.op_pmtargetoff) {
159b6efe 4911 ary = GvAVn(MUTABLE_GV(PAD_SVl(pm->op_pmreplrootu.op_pmtargetoff)));
20e98b0f 4912 }
971a9dd3 4913#else
20e98b0f
NC
4914 if (pm->op_pmreplrootu.op_pmtargetgv) {
4915 ary = GvAVn(pm->op_pmreplrootu.op_pmtargetgv);
971a9dd3 4916 }
20e98b0f 4917#endif
a0d0e21e 4918 else if (gimme != G_ARRAY)
3280af22 4919 ary = GvAVn(PL_defgv);
79072805 4920 else
7d49f689 4921 ary = NULL;
a0d0e21e
LW
4922 if (ary && (gimme != G_ARRAY || (pm->op_pmflags & PMf_ONCE))) {
4923 realarray = 1;
8ec5e241 4924 PUTBACK;
a0d0e21e
LW
4925 av_extend(ary,0);
4926 av_clear(ary);
8ec5e241 4927 SPAGAIN;
ad64d0ec 4928 if ((mg = SvTIED_mg((const SV *)ary, PERL_MAGIC_tied))) {
8ec5e241 4929 PUSHMARK(SP);
ad64d0ec 4930 XPUSHs(SvTIED_obj(MUTABLE_SV(ary), mg));
8ec5e241
NIS
4931 }
4932 else {
1c0b011c 4933 if (!AvREAL(ary)) {
1b6737cc 4934 I32 i;
1c0b011c 4935 AvREAL_on(ary);
abff13bb 4936 AvREIFY_off(ary);
1c0b011c 4937 for (i = AvFILLp(ary); i >= 0; i--)
3280af22 4938 AvARRAY(ary)[i] = &PL_sv_undef; /* don't free mere refs */
1c0b011c
NIS
4939 }
4940 /* temporarily switch stacks */
8b7059b1 4941 SAVESWITCHSTACK(PL_curstack, ary);
8ec5e241 4942 make_mortal = 0;
1c0b011c 4943 }
79072805 4944 }
3280af22 4945 base = SP - PL_stack_base;
a0d0e21e 4946 orig = s;
07bc277f 4947 if (RX_EXTFLAGS(rx) & RXf_SKIPWHITE) {
613f191e
TS
4948 if (do_utf8) {
4949 while (*s == ' ' || is_utf8_space((U8*)s))
4950 s += UTF8SKIP(s);
4951 }
07bc277f 4952 else if (RX_EXTFLAGS(rx) & RXf_PMf_LOCALE) {
bbce6d69 4953 while (isSPACE_LC(*s))
4954 s++;
4955 }
4956 else {
4957 while (isSPACE(*s))
4958 s++;
4959 }
a0d0e21e 4960 }
07bc277f 4961 if (RX_EXTFLAGS(rx) & PMf_MULTILINE) {
7fba1cd6 4962 multiline = 1;
c07a80fd 4963 }
4964
a0d0e21e
LW
4965 if (!limit)
4966 limit = maxiters + 2;
07bc277f 4967 if (RX_EXTFLAGS(rx) & RXf_WHITE) {
a0d0e21e 4968 while (--limit) {
bbce6d69 4969 m = s;
8727f688
YO
4970 /* this one uses 'm' and is a negative test */
4971 if (do_utf8) {
613f191e
TS
4972 while (m < strend && !( *m == ' ' || is_utf8_space((U8*)m) )) {
4973 const int t = UTF8SKIP(m);
4974 /* is_utf8_space returns FALSE for malform utf8 */
4975 if (strend - m < t)
4976 m = strend;
4977 else
4978 m += t;
4979 }
07bc277f 4980 } else if (RX_EXTFLAGS(rx) & RXf_PMf_LOCALE) {
8727f688
YO
4981 while (m < strend && !isSPACE_LC(*m))
4982 ++m;
4983 } else {
4984 while (m < strend && !isSPACE(*m))
4985 ++m;
4986 }
a0d0e21e
LW
4987 if (m >= strend)
4988 break;
bbce6d69 4989
437d3b4e
NC
4990 dstr = newSVpvn_flags(s, m-s,
4991 (do_utf8 ? SVf_UTF8 : 0) | make_mortal);
a0d0e21e 4992 XPUSHs(dstr);
bbce6d69 4993
613f191e
TS
4994 /* skip the whitespace found last */
4995 if (do_utf8)
4996 s = m + UTF8SKIP(m);
4997 else
4998 s = m + 1;
4999
8727f688
YO
5000 /* this one uses 's' and is a positive test */
5001 if (do_utf8) {
613f191e 5002 while (s < strend && ( *s == ' ' || is_utf8_space((U8*)s) ))
8727f688 5003 s += UTF8SKIP(s);
07bc277f 5004 } else if (RX_EXTFLAGS(rx) & RXf_PMf_LOCALE) {
8727f688
YO
5005 while (s < strend && isSPACE_LC(*s))
5006 ++s;
5007 } else {
5008 while (s < strend && isSPACE(*s))
5009 ++s;
5010 }
79072805
LW
5011 }
5012 }
07bc277f 5013 else if (RX_EXTFLAGS(rx) & RXf_START_ONLY) {
a0d0e21e 5014 while (--limit) {
a6e20a40
AL
5015 for (m = s; m < strend && *m != '\n'; m++)
5016 ;
a0d0e21e
LW
5017 m++;
5018 if (m >= strend)
5019 break;
437d3b4e
NC
5020 dstr = newSVpvn_flags(s, m-s,
5021 (do_utf8 ? SVf_UTF8 : 0) | make_mortal);
a0d0e21e
LW
5022 XPUSHs(dstr);
5023 s = m;
5024 }
5025 }
07bc277f 5026 else if (RX_EXTFLAGS(rx) & RXf_NULL && !(s >= strend)) {
640f820d
AB
5027 /*
5028 Pre-extend the stack, either the number of bytes or
5029 characters in the string or a limited amount, triggered by:
5030
5031 my ($x, $y) = split //, $str;
5032 or
5033 split //, $str, $i;
5034 */
5035 const U32 items = limit - 1;
5036 if (items < slen)
5037 EXTEND(SP, items);
5038 else
5039 EXTEND(SP, slen);
5040
e9515b0f
AB
5041 if (do_utf8) {
5042 while (--limit) {
5043 /* keep track of how many bytes we skip over */
5044 m = s;
640f820d 5045 s += UTF8SKIP(s);
437d3b4e 5046 dstr = newSVpvn_flags(m, s-m, SVf_UTF8 | make_mortal);
640f820d 5047
e9515b0f 5048 PUSHs(dstr);
640f820d 5049
e9515b0f
AB
5050 if (s >= strend)
5051 break;
5052 }
5053 } else {
5054 while (--limit) {
5055 dstr = newSVpvn(s, 1);
5056
5057 s++;
5058
5059 if (make_mortal)
5060 sv_2mortal(dstr);
640f820d 5061
e9515b0f
AB
5062 PUSHs(dstr);
5063
5064 if (s >= strend)
5065 break;
5066 }
640f820d
AB
5067 }
5068 }
3c8556c3 5069 else if (do_utf8 == (RX_UTF8(rx) != 0) &&
07bc277f
NC
5070 (RX_EXTFLAGS(rx) & RXf_USE_INTUIT) && !RX_NPARENS(rx)
5071 && (RX_EXTFLAGS(rx) & RXf_CHECK_ALL)
5072 && !(RX_EXTFLAGS(rx) & RXf_ANCH)) {
5073 const int tail = (RX_EXTFLAGS(rx) & RXf_INTUIT_TAIL);
f9f4320a 5074 SV * const csv = CALLREG_INTUIT_STRING(rx);
cf93c79d 5075
07bc277f 5076 len = RX_MINLENRET(rx);
3c8556c3 5077 if (len == 1 && !RX_UTF8(rx) && !tail) {
1b6737cc 5078 const char c = *SvPV_nolen_const(csv);
a0d0e21e 5079 while (--limit) {
a6e20a40
AL
5080 for (m = s; m < strend && *m != c; m++)
5081 ;
a0d0e21e
LW
5082 if (m >= strend)
5083 break;
437d3b4e
NC
5084 dstr = newSVpvn_flags(s, m-s,
5085 (do_utf8 ? SVf_UTF8 : 0) | make_mortal);
a0d0e21e 5086 XPUSHs(dstr);
93f04dac
JH
5087 /* The rx->minlen is in characters but we want to step
5088 * s ahead by bytes. */
1aa99e6b
IH
5089 if (do_utf8)
5090 s = (char*)utf8_hop((U8*)m, len);
5091 else
5092 s = m + len; /* Fake \n at the end */
a0d0e21e
LW
5093 }
5094 }
5095 else {
a0d0e21e 5096 while (s < strend && --limit &&
f722798b 5097 (m = fbm_instr((unsigned char*)s, (unsigned char*)strend,
7fba1cd6 5098 csv, multiline ? FBMrf_MULTILINE : 0)) )
a0d0e21e 5099 {
437d3b4e
NC
5100 dstr = newSVpvn_flags(s, m-s,
5101 (do_utf8 ? SVf_UTF8 : 0) | make_mortal);
a0d0e21e 5102 XPUSHs(dstr);
93f04dac
JH
5103 /* The rx->minlen is in characters but we want to step
5104 * s ahead by bytes. */
1aa99e6b
IH
5105 if (do_utf8)
5106 s = (char*)utf8_hop((U8*)m, len);
5107 else
5108 s = m + len; /* Fake \n at the end */
a0d0e21e 5109 }
463ee0b2 5110 }
463ee0b2 5111 }
a0d0e21e 5112 else {
07bc277f 5113 maxiters += slen * RX_NPARENS(rx);
080c2dec 5114 while (s < strend && --limit)
bbce6d69 5115 {
1b6737cc 5116 I32 rex_return;
080c2dec 5117 PUTBACK;
f9f4320a 5118 rex_return = CALLREGEXEC(rx, (char*)s, (char*)strend, (char*)orig, 1 ,
727b7506 5119 sv, NULL, 0);
080c2dec 5120 SPAGAIN;
1b6737cc 5121 if (rex_return == 0)
080c2dec 5122 break;
d9f97599 5123 TAINT_IF(RX_MATCH_TAINTED(rx));
07bc277f 5124 if (RX_MATCH_COPIED(rx) && RX_SUBBEG(rx) != orig) {
a0d0e21e
LW
5125 m = s;
5126 s = orig;
07bc277f 5127 orig = RX_SUBBEG(rx);
a0d0e21e
LW
5128 s = orig + (m - s);
5129 strend = s + (strend - m);
5130 }
07bc277f 5131 m = RX_OFFS(rx)[0].start + orig;
437d3b4e
NC
5132 dstr = newSVpvn_flags(s, m-s,
5133 (do_utf8 ? SVf_UTF8 : 0) | make_mortal);
a0d0e21e 5134 XPUSHs(dstr);
07bc277f 5135 if (RX_NPARENS(rx)) {
1b6737cc 5136 I32 i;
07bc277f
NC
5137 for (i = 1; i <= (I32)RX_NPARENS(rx); i++) {
5138 s = RX_OFFS(rx)[i].start + orig;
5139 m = RX_OFFS(rx)[i].end + orig;
6de67870
JP
5140
5141 /* japhy (07/27/01) -- the (m && s) test doesn't catch
5142 parens that didn't match -- they should be set to
5143 undef, not the empty string */
5144 if (m >= orig && s >= orig) {
437d3b4e
NC
5145 dstr = newSVpvn_flags(s, m-s,
5146 (do_utf8 ? SVf_UTF8 : 0)
5147 | make_mortal);
748a9306
LW
5148 }
5149 else
6de67870 5150 dstr = &PL_sv_undef; /* undef, not "" */
a0d0e21e
LW
5151 XPUSHs(dstr);
5152 }
5153 }
07bc277f 5154 s = RX_OFFS(rx)[0].end + orig;
a0d0e21e 5155 }
79072805 5156 }
8ec5e241 5157
3280af22 5158 iters = (SP - PL_stack_base) - base;
a0d0e21e 5159 if (iters > maxiters)
cea2e8a9 5160 DIE(aTHX_ "Split loop");
8ec5e241 5161
a0d0e21e
LW
5162 /* keep field after final delim? */
5163 if (s < strend || (iters && origlimit)) {
1b6737cc 5164 const STRLEN l = strend - s;
437d3b4e 5165 dstr = newSVpvn_flags(s, l, (do_utf8 ? SVf_UTF8 : 0) | make_mortal);
a0d0e21e
LW
5166 XPUSHs(dstr);
5167 iters++;
79072805 5168 }
a0d0e21e 5169 else if (!origlimit) {
89900bd3
SR
5170 while (iters > 0 && (!TOPs || !SvANY(TOPs) || SvCUR(TOPs) == 0)) {
5171 if (TOPs && !make_mortal)
5172 sv_2mortal(TOPs);
5173 iters--;
e3a8873f 5174 *SP-- = &PL_sv_undef;
89900bd3 5175 }
a0d0e21e 5176 }
8ec5e241 5177
8b7059b1
DM
5178 PUTBACK;
5179 LEAVE_SCOPE(oldsave); /* may undo an earlier SWITCHSTACK */
5180 SPAGAIN;
a0d0e21e 5181 if (realarray) {
8ec5e241 5182 if (!mg) {
1c0b011c
NIS
5183 if (SvSMAGICAL(ary)) {
5184 PUTBACK;
ad64d0ec 5185 mg_set(MUTABLE_SV(ary));
1c0b011c
NIS
5186 SPAGAIN;
5187 }
5188 if (gimme == G_ARRAY) {
5189 EXTEND(SP, iters);
5190 Copy(AvARRAY(ary), SP + 1, iters, SV*);
5191 SP += iters;
5192 RETURN;
5193 }
8ec5e241 5194 }
1c0b011c 5195 else {
fb73857a 5196 PUTBACK;
8ec5e241 5197 ENTER;
864dbfa3 5198 call_method("PUSH",G_SCALAR|G_DISCARD);
8ec5e241 5199 LEAVE;
fb73857a 5200 SPAGAIN;
8ec5e241 5201 if (gimme == G_ARRAY) {
1b6737cc 5202 I32 i;
8ec5e241
NIS
5203 /* EXTEND should not be needed - we just popped them */
5204 EXTEND(SP, iters);
5205 for (i=0; i < iters; i++) {
5206 SV **svp = av_fetch(ary, i, FALSE);
3280af22 5207 PUSHs((svp) ? *svp : &PL_sv_undef);
8ec5e241 5208 }
1c0b011c
NIS
5209 RETURN;
5210 }
a0d0e21e
LW
5211 }
5212 }
5213 else {
5214 if (gimme == G_ARRAY)
5215 RETURN;
5216 }
7f18b612
YST
5217
5218 GETTARGET;
5219 PUSHi(iters);
5220 RETURN;
79072805 5221}
85e6fe83 5222
c5917253
NC
5223PP(pp_once)
5224{
5225 dSP;
5226 SV *const sv = PAD_SVl(PL_op->op_targ);
5227
5228 if (SvPADSTALE(sv)) {
5229 /* First time. */
5230 SvPADSTALE_off(sv);
5231 RETURNOP(cLOGOP->op_other);
5232 }
5233 RETURNOP(cLOGOP->op_next);
5234}
5235
c0329465
MB
5236PP(pp_lock)
5237{
97aff369 5238 dVAR;
39644a26 5239 dSP;
c0329465 5240 dTOPss;
e55aaa0e 5241 SV *retsv = sv;
076a2a80 5242 assert(SvTYPE(retsv) != SVt_PVCV);
68795e93 5243 SvLOCK(sv);
076a2a80 5244 if (SvTYPE(retsv) == SVt_PVAV || SvTYPE(retsv) == SVt_PVHV) {
e55aaa0e
MB
5245 retsv = refto(retsv);
5246 }
5247 SETs(retsv);
c0329465
MB
5248 RETURN;
5249}
a863c7d1 5250
65bca31a
NC
5251
5252PP(unimplemented_op)
5253{
97aff369 5254 dVAR;
65bca31a
NC
5255 DIE(aTHX_ "panic: unimplemented op %s (#%d) called", OP_NAME(PL_op),
5256 PL_op->op_type);
5257}
5258
e609e586
NC
5259/*
5260 * Local variables:
5261 * c-indentation-style: bsd
5262 * c-basic-offset: 4
5263 * indent-tabs-mode: t
5264 * End:
5265 *
37442d52
RGS
5266 * ex: set ts=8 sts=4 sw=4 noet:
5267 */