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