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