X-Git-Url: https://perl5.git.perl.org/perl5.git/blobdiff_plain/780fcc9fd03dbbd16715e2b6ecd020f9e50b7cc7..f4fb63c7b74ff0e28cab75889fd6b0947f57d662:/perl.h diff --git a/perl.h b/perl.h index 35624b5..286e8d0 100644 --- a/perl.h +++ b/perl.h @@ -1226,6 +1226,7 @@ EXTERN_C char *crypt(const char *, const char *); # define SS_IVCHAN SS$_IVCHAN # define SS_NORMAL SS$_NORMAL # define SS_NOPRIV SS$_NOPRIV +# define SS_BUFFEROVF SS$_BUFFEROVF #else # define LIB_INVARG 0 # define RMS_DIR 0 @@ -1240,6 +1241,7 @@ EXTERN_C char *crypt(const char *, const char *); # define SS_IVCHAN 0 # define SS_NORMAL 0 # define SS_NOPRIV 0 +# define SS_BUFFEROVF 0 #endif #ifdef WIN32 @@ -3539,7 +3541,7 @@ typedef pthread_key_t perl_key; expression, which allows the compiler to generate better machine code. In a debug build, ASSUME(x) is a synonym for assert(x). ASSUME(0) means the control path is unreachable. In a for loop, ASSUME can be used to hint - that a loop will run atleast X times. ASSUME is based off MSVC's __assume + that a loop will run at least X times. ASSUME is based off MSVC's __assume intrinsic function, see its documents for more details. */ @@ -5783,21 +5785,39 @@ typedef struct am_table_short AMTS; /* This internal macro should be called from places that operate under * locale rules. It there is a problem with the current locale that - * hasn't been raised yet, it will output a warning this time */ + * hasn't been raised yet, it will output a warning this time. Because + * this will so rarely be true, there is no point to optimize for + * time; instead it makes sense to minimize space used and do all the + * work in the rarely called function */ # define _CHECK_AND_WARN_PROBLEMATIC_LOCALE \ STMT_START { \ - if (PL_warn_locale) { \ - /*GCC_DIAG_IGNORE(-Wformat-security); Didn't work */ \ - Perl_ck_warner(aTHX_ packWARN(WARN_LOCALE), \ - SvPVX(PL_warn_locale), \ - 0 /* dummy to avoid comp warning */ ); \ - /* GCC_DIAG_RESTORE; */ \ - SvREFCNT_dec_NN(PL_warn_locale); \ - PL_warn_locale = NULL; \ + if (UNLIKELY(PL_warn_locale)) { \ + _warn_problematic_locale(); \ } \ } STMT_END + /* These two internal macros are called when a warning should be raised, + * and will do so if enabled. The first takes a single code point + * argument; the 2nd, is a pointer to the first byte of the UTF-8 encoded + * string, and an end position which it won't try to read past */ +# define _CHECK_AND_OUTPUT_WIDE_LOCALE_CP_MSG(cp) \ + Perl_ck_warner(aTHX_ packWARN(WARN_LOCALE), \ + "Wide character (U+%"UVXf") in %s", (UV) cp, OP_DESC(PL_op)); + +# define _CHECK_AND_OUTPUT_WIDE_LOCALE_UTF8_MSG(s, send) \ + STMT_START { /* Check if to warn before doing the conversion work */\ + if (ckWARN(WARN_LOCALE)) { \ + UV cp = utf8_to_uvchr_buf((U8 *) s, (U8 *) send, NULL); \ + Perl_warner(aTHX_ packWARN(WARN_LOCALE), \ + "Wide character (U+%"UVXf") in %s", \ + (cp == 0) \ + ? UNICODE_REPLACEMENT \ + : (UV) cp, \ + OP_DESC(PL_op)); \ + } \ + } STMT_END + # endif /* PERL_CORE or PERL_IN_XSUB_RE */ #else /* No locale usage */ @@ -5816,6 +5836,8 @@ typedef struct am_table_short AMTS; # define IN_LC(category) 0 # define _CHECK_AND_WARN_PROBLEMATIC_LOCALE +# define _CHECK_AND_OUTPUT_WIDE_LOCALE_CP_MSG(a) +# define _CHECK_AND_OUTPUT_WIDE_LOCALE_UTF8_MSG(a,b) #endif #ifdef USE_LOCALE_NUMERIC @@ -6133,8 +6155,10 @@ typedef struct am_table_short AMTS; /* Clones the per-interpreter data. */ # define MY_CXT_CLONE \ my_cxt_t *my_cxtp = (my_cxt_t*)SvPVX(newSV(sizeof(my_cxt_t)-1));\ - Copy(PL_my_cxt_list[MY_CXT_INDEX], my_cxtp, 1, my_cxt_t);\ - PL_my_cxt_list[MY_CXT_INDEX] = my_cxtp \ + void * old_my_cxtp = PL_my_cxt_list[MY_CXT_INDEX]; \ + PL_my_cxt_list[MY_CXT_INDEX] = my_cxtp; \ + Copy(old_my_cxtp, my_cxtp, 1, my_cxt_t); + /* This macro must be used to access members of the my_cxt_t structure.