X-Git-Url: https://perl5.git.perl.org/perl5.git/blobdiff_plain/c80e42f3bedc86f49112644858de416b7d06c09a..be2822b05a2917d75353f93b9331bb7bb06a63eb:/doop.c diff --git a/doop.c b/doop.c index ac11c73..2bd4e13 100644 --- a/doop.c +++ b/doop.c @@ -30,7 +30,6 @@ STATIC I32 S_do_trans_simple(pTHX_ SV * const sv) { - dVAR; I32 matches = 0; STRLEN len; U8 *s = (U8*)SvPV_nomg(sv,len); @@ -99,7 +98,6 @@ S_do_trans_simple(pTHX_ SV * const sv) STATIC I32 S_do_trans_count(pTHX_ SV * const sv) { - dVAR; STRLEN len; const U8 *s = (const U8*)SvPV_nomg_const(sv, len); const U8 * const send = s + len; @@ -137,7 +135,6 @@ S_do_trans_count(pTHX_ SV * const sv) STATIC I32 S_do_trans_complex(pTHX_ SV * const sv) { - dVAR; STRLEN len; U8 *s = (U8*)SvPV_nomg(sv, len); U8 * const send = s+len; @@ -301,7 +298,6 @@ S_do_trans_complex(pTHX_ SV * const sv) STATIC I32 S_do_trans_simple_utf8(pTHX_ SV * const sv) { - dVAR; U8 *s; U8 *send; U8 *d; @@ -331,7 +327,7 @@ S_do_trans_simple_utf8(pTHX_ SV * const sv) const U8 * const e = s + len; while (t < e) { const U8 ch = *t++; - hibit = !NATIVE_IS_INVARIANT(ch); + hibit = !NATIVE_BYTE_IS_INVARIANT(ch); if (hibit) { s = bytes_to_utf8(s, &len); break; @@ -406,7 +402,6 @@ S_do_trans_simple_utf8(pTHX_ SV * const sv) STATIC I32 S_do_trans_count_utf8(pTHX_ SV * const sv) { - dVAR; const U8 *s; const U8 *start = NULL; const U8 *send; @@ -432,7 +427,7 @@ S_do_trans_count_utf8(pTHX_ SV * const sv) const U8 * const e = s + len; while (t < e) { const U8 ch = *t++; - hibit = !NATIVE_IS_INVARIANT(ch); + hibit = !NATIVE_BYTE_IS_INVARIANT(ch); if (hibit) { start = s = bytes_to_utf8(s, &len); break; @@ -456,7 +451,6 @@ S_do_trans_count_utf8(pTHX_ SV * const sv) STATIC I32 S_do_trans_complex_utf8(pTHX_ SV * const sv) { - dVAR; U8 *start, *send; U8 *d; I32 matches = 0; @@ -487,7 +481,7 @@ S_do_trans_complex_utf8(pTHX_ SV * const sv) const U8 * const e = s + len; while (t < e) { const U8 ch = *t++; - hibit = !NATIVE_IS_INVARIANT(ch); + hibit = !NATIVE_BYTE_IS_INVARIANT(ch); if (hibit) { s = bytes_to_utf8(s, &len); break; @@ -624,7 +618,6 @@ S_do_trans_complex_utf8(pTHX_ SV * const sv) I32 Perl_do_trans(pTHX_ SV *sv) { - dVAR; STRLEN len; const I32 hasutf = (PL_op->op_private & (OPpTRANS_FROM_UTF|OPpTRANS_TO_UTF)); @@ -672,17 +665,14 @@ Perl_do_trans(pTHX_ SV *sv) void Perl_do_join(pTHX_ SV *sv, SV *delim, SV **mark, SV **sp) { - dVAR; SV ** const oldmark = mark; I32 items = sp - mark; STRLEN len; STRLEN delimlen; + const char * const delims = SvPV_const(delim, delimlen); PERL_ARGS_ASSERT_DO_JOIN; - (void) SvPV_const(delim, delimlen); /* stringify and get the delimlen */ - /* SvCUR assumes it's SvPOK() and woe betide you if it's not. */ - mark++; len = (items > 0 ? (delimlen * (items - 1) ) : 0); SvUPGRADE(sv, SVt_PV); @@ -716,14 +706,24 @@ Perl_do_join(pTHX_ SV *sv, SV *delim, SV **mark, SV **sp) } if (delimlen) { + const U32 delimflag = DO_UTF8(delim) ? SV_CATUTF8 : SV_CATBYTES; for (; items > 0; items--,mark++) { - sv_catsv_nomg(sv,delim); - sv_catsv(sv,*mark); + STRLEN len; + const char *s; + sv_catpvn_flags(sv,delims,delimlen,delimflag); + s = SvPV_const(*mark,len); + sv_catpvn_flags(sv,s,len, + DO_UTF8(*mark) ? SV_CATUTF8 : SV_CATBYTES); } } else { for (; items > 0; items--,mark++) - sv_catsv(sv,*mark); + { + STRLEN len; + const char *s = SvPV_const(*mark,len); + sv_catpvn_flags(sv,s,len, + DO_UTF8(*mark) ? SV_CATUTF8 : SV_CATBYTES); + } } SvSETMAGIC(sv); } @@ -731,7 +731,6 @@ Perl_do_join(pTHX_ SV *sv, SV *delim, SV **mark, SV **sp) void Perl_do_sprintf(pTHX_ SV *sv, I32 len, SV **sarg) { - dVAR; STRLEN patlen; const char * const pat = SvPV_const(*sarg, patlen); bool do_taint = FALSE; @@ -759,15 +758,15 @@ Perl_do_sprintf(pTHX_ SV *sv, I32 len, SV **sarg) UV Perl_do_vecget(pTHX_ SV *sv, SSize_t offset, int size) { - dVAR; STRLEN srclen, len, uoffset, bitoffs = 0; - const unsigned char *s = (const unsigned char *) SvPV_flags_const(sv, srclen, - SV_GMAGIC | ((PL_op->op_flags & OPf_MOD || LVRET) - ? SV_UNDEF_RETURNS_NULL : 0)); + const I32 svpv_flags = ((PL_op->op_flags & OPf_MOD || LVRET) + ? SV_UNDEF_RETURNS_NULL : 0); + unsigned char *s = (unsigned char *) + SvPV_flags(sv, srclen, (svpv_flags|SV_GMAGIC)); UV retnum = 0; if (!s) { - s = (const unsigned char *)""; + s = (unsigned char *)""; } PERL_ARGS_ASSERT_DO_VECGET; @@ -777,8 +776,11 @@ Perl_do_vecget(pTHX_ SV *sv, SSize_t offset, int size) if (size < 1 || (size & (size-1))) /* size < 1 or not a power of two */ Perl_croak(aTHX_ "Illegal number of bits in vec"); - if (SvUTF8(sv)) + if (SvUTF8(sv)) { (void) Perl_sv_utf8_downgrade(aTHX_ sv, TRUE); + /* PVX may have changed */ + s = (unsigned char *) SvPV_flags(sv, srclen, svpv_flags); + } if (size < 8) { bitoffs = ((offset%8)*size)%8; @@ -846,7 +848,7 @@ Perl_do_vecget(pTHX_ SV *sv, SSize_t offset, int size) ((UV) s[uoffset + 1] << 48) + ((UV) s[uoffset + 2] << 40) + ((UV) s[uoffset + 3] << 32) + - ( s[uoffset + 4] << 24); + ((UV) s[uoffset + 4] << 24); else if (uoffset + 6 >= srclen) retnum = ((UV) s[uoffset ] << 56) + @@ -863,7 +865,7 @@ Perl_do_vecget(pTHX_ SV *sv, SSize_t offset, int size) ((UV) s[uoffset + 3] << 32) + ((UV) s[uoffset + 4] << 24) + ((UV) s[uoffset + 5] << 16) + - ( s[uoffset + 6] << 8); + ((UV) s[uoffset + 6] << 8); } #endif } @@ -910,7 +912,6 @@ Perl_do_vecget(pTHX_ SV *sv, SSize_t offset, int size) void Perl_do_vecset(pTHX_ SV *sv) { - dVAR; SSize_t offset, bitoffs = 0; int size; unsigned char *s; @@ -997,7 +998,6 @@ Perl_do_vecset(pTHX_ SV *sv) void Perl_do_vop(pTHX_ I32 optype, SV *sv, SV *left, SV *right) { - dVAR; #ifdef LIBERAL long *dl; long *ll; @@ -1219,14 +1219,16 @@ Perl_do_vop(pTHX_ I32 optype, SV *sv, SV *left, SV *right) break; } } -finish: + finish: SvTAINT(sv); } + +/* used for: pp_keys(), pp_values() */ + OP * Perl_do_kv(pTHX) { - dVAR; dSP; HV * const keys = MUTABLE_HV(POPs); HE *entry; @@ -1267,27 +1269,22 @@ Perl_do_kv(pTHX) EXTEND(SP, HvUSEDKEYS(keys) * (dokeys + dovalues)); - PUTBACK; /* hv_iternext and hv_iterval might clobber stack_sp */ while ((entry = hv_iternext(keys))) { - SPAGAIN; if (dokeys) { SV* const sv = hv_iterkeysv(entry); - XPUSHs(sv); /* won't clobber stack_sp */ + XPUSHs(sv); } if (dovalues) { SV *tmpstr; - PUTBACK; tmpstr = hv_iterval(keys,entry); DEBUG_H(Perl_sv_setpvf(aTHX_ tmpstr, "%lu%%%d=%lu", (unsigned long)HeHASH(entry), (int)HvMAX(keys)+1, (unsigned long)(HeHASH(entry) & HvMAX(keys)))); - SPAGAIN; XPUSHs(tmpstr); } - PUTBACK; } - return NORMAL; + RETURN; } /*