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