X-Git-Url: https://perl5.git.perl.org/perl5.git/blobdiff_plain/2abc681d27f72f8a4ad94049b1ae16171521dd33..a09afec511396f7ac9116e5db10cfb3e8a1d8e78:/mg.c diff --git a/mg.c b/mg.c index a9f50b3..64e450f 100644 --- a/mg.c +++ b/mg.c @@ -824,9 +824,8 @@ S_fixup_errno_string(pTHX_ SV* sv) * (http://en.wikipedia.org/wiki/Charset_detection). There is a * potential that we will get it wrong however, especially on short * error message text, so do an additional check. */ - if ( ! IN_BYTES /* respect 'use bytes' */ - && ! is_utf8_invariant_string((U8*) SvPVX_const(sv), SvCUR(sv)) - && is_utf8_string((U8*) SvPVX_const(sv), SvCUR(sv)) + if ( ! IN_BYTES /* respect 'use bytes' */ + && is_utf8_non_invariant_string((U8*) SvPVX_const(sv), SvCUR(sv)) #ifdef USE_LOCALE_MESSAGES @@ -1111,14 +1110,7 @@ Perl_magic_get(pTHX_ SV *sv, MAGIC *mg) goto set_undef; } else if (PL_compiling.cop_warnings == pWARN_ALL) { - /* Get the bit mask for $warnings::Bits{all}, because - * it could have been extended by warnings::register */ - HV * const bits = get_hv("warnings::Bits", 0); - SV ** const bits_all = bits ? hv_fetchs(bits, "all", FALSE) : NULL; - if (bits_all) - sv_copypv(sv, *bits_all); - else - sv_setpvn(sv, WARN_ALLstring, WARNsize); + sv_setpvn(sv, WARN_ALLstring, WARNsize); } else { sv_setpvn(sv, (char *) (PL_compiling.cop_warnings + 1), @@ -1750,7 +1742,7 @@ Perl_magic_setsig(pTHX_ SV *sv, MAGIC *mg) * access to a known hint bit in a known OP, we can't * tell whether HINT_STRICT_REFS is in force or not. */ - if (!strchr(s,':') && !strchr(s,'\'')) + if (!memchr(s, ':', len) && !memchr(s, '\'', len)) Perl_sv_insert_flags(aTHX_ sv, 0, 0, STR_WITH_LEN("main::"), SV_GMAGIC); if (i) @@ -2184,12 +2176,12 @@ Perl_magic_cleararylen_p(pTHX_ SV *sv, MAGIC *mg) PERL_UNUSED_CONTEXT; /* Reset the iterator when the array is cleared */ -#if IVSIZE == I32SIZE - *((IV *) &(mg->mg_len)) = 0; -#else - if (mg->mg_ptr) - *((IV *) mg->mg_ptr) = 0; -#endif + if (sizeof(IV) == sizeof(SSize_t)) { + *((IV *) &(mg->mg_len)) = 0; + } else { + if (mg->mg_ptr) + *((IV *) mg->mg_ptr) = 0; + } return 0; } @@ -2775,7 +2767,8 @@ Perl_magic_set(pTHX_ SV *sv, MAGIC *mg) FmLINES(PL_bodytarget) = 0; if (SvPOK(PL_bodytarget)) { char *s = SvPVX(PL_bodytarget); - while ( ((s = strchr(s, '\n'))) ) { + char *e = SvEND(PL_bodytarget); + while ( ((s = (char *) memchr(s, '\n', e - s))) ) { FmLINES(PL_bodytarget)++; s++; } @@ -2908,25 +2901,18 @@ Perl_magic_set(pTHX_ SV *sv, MAGIC *mg) } { STRLEN len, i; - int accumulate = 0 ; - int any_fatals = 0 ; - const char * const ptr = SvPV_const(sv, len) ; + int not_none = 0, not_all = 0; + const U8 * const ptr = (const U8 *)SvPV_const(sv, len) ; for (i = 0 ; i < len ; ++i) { - accumulate |= ptr[i] ; - any_fatals |= (ptr[i] & 0xAA) ; + not_none |= ptr[i]; + not_all |= ptr[i] ^ 0x55; } - if (!accumulate) { + if (!not_none) { if (!specialWARN(PL_compiling.cop_warnings)) PerlMemShared_free(PL_compiling.cop_warnings); PL_compiling.cop_warnings = pWARN_NONE; - } - /* Yuck. I can't see how to abstract this: */ - else if (isWARN_on( - ((STRLEN *)SvPV_nolen_const(sv)) - 1, - WARN_ALL) - && !any_fatals) - { - if (!specialWARN(PL_compiling.cop_warnings)) + } else if (len >= WARNsize && !not_all) { + if (!specialWARN(PL_compiling.cop_warnings)) PerlMemShared_free(PL_compiling.cop_warnings); PL_compiling.cop_warnings = pWARN_ALL; PL_dowarn |= G_WARN_ONCE ;