X-Git-Url: https://perl5.git.perl.org/perl5.git/blobdiff_plain/8751a11f7fafc4d656fe8f44ebc8b5233e437153..02cf5fb76fa9ca5db8d1b04f9087dd6d0f81848e:/perl.h diff --git a/perl.h b/perl.h index 55f9118..791262d 100644 --- a/perl.h +++ b/perl.h @@ -364,6 +364,9 @@ Now a no-op. # if PERL_GCC_VERSION_GE(4,7,0) # define HASATTRIBUTE_ALWAYS_INLINE # endif +# if PERL_GCC_VERSION_GE(3,3,0) +# define HASATTRIBUTE_VISIBILITY +# endif # endif #endif /* #ifndef PERL_MICRO */ @@ -397,6 +400,14 @@ Now a no-op. # define __attribute__always_inline__ __attribute__((always_inline)) # endif #endif +#if defined(HASATTRIBUTE_VISIBILITY) && !defined(_WIN32) && !defined(__CYGWIN__) +/* On Windows instead of this, we use __declspec(dllexport) and a .def file + * Cygwin works by exporting every global symbol, see the definition of ldflags + * near the end of hints/cygwin.sh and the visibility attribute doesn't appear + * to control that. + */ +# define __attribute__visibility__(x) __attribute__((visibility(x))) +#endif /* If we haven't defined the attributes yet, define them to blank. */ #ifndef __attribute__deprecated__ @@ -426,6 +437,9 @@ Now a no-op. #ifndef __attribute__always_inline__ # define __attribute__always_inline__ #endif +#ifndef __attribute__visibility__ +# define __attribute__visibility__(x) +#endif /* Some OS warn on NULL format to printf */ #ifdef PRINTF_FORMAT_NULL_OK @@ -546,7 +560,7 @@ and use C> on that. =cut The __typeof__() is used instead of typeof() since typeof() is not -available under strict C89, and because of compilers masquerading +available under strict ISO C, and because of compilers masquerading as gcc (clang and icc), we want exactly the gcc extension __typeof__ and nothing else. @@ -717,8 +731,8 @@ Now a placeholder that declares nothing /* =for apidoc_section $directives -=for apidoc AmnUu|void|STMT_START -=for apidoc_item ||STMT_END +=for apidoc AmnUu|void|STMT_END +=for apidoc_item | |STMT_START These allow a series of statements in a macro to be used as a single statement, as in @@ -831,7 +845,8 @@ C, for example. =back -=for apidoc AmnuU|bool|PERL_USE_GCC_BRACE_GROUPS +=for apidoc_section $genconfig +=for apidoc Amn#||PERL_USE_GCC_BRACE_GROUPS This C pre-processor value, if defined, indicates that it is permissible to use the GCC brace groups extension. However, use of this extension is DISCOURAGED. @@ -849,6 +864,11 @@ specify an alternative. Thus two code paths have to be maintained, which can get out-of-sync. All these issues are solved by using a C function instead. +Perl can be configured to not use this feature by passing the parameter +C<-Accflags=-DPERL_GCC_BRACE_GROUPS_FORBIDDEN> to F. + +=for apidoc Amnh#||PERL_GCC_BRACE_GROUPS_FORBIDDEN + Example usage: =over @@ -874,10 +894,19 @@ Example usage: # define BYTEORDER 0x1234 #endif +/* +=for apidoc_section $genconfig +=for apidoc Amn#||ASCIIish + +A preprocessor symbol that is defined iff the system is an ASCII platform; this +symbol would not be defined on C> platforms. + +=cut +*/ #if 'A' == 65 && 'I' == 73 && 'J' == 74 && 'Z' == 90 -#define ASCIIish +# define ASCIIish #else -#undef ASCIIish +# undef ASCIIish #endif /* @@ -1185,23 +1214,23 @@ violations are fatal. # endif /* Now create LC_foo_INDEX_ #defines for just those categories on this system */ -# ifdef USE_LOCALE_NUMERIC -# define LC_NUMERIC_INDEX_ 0 -# define PERL_DUMMY_NUMERIC_ LC_NUMERIC_INDEX_ -# else -# define PERL_DUMMY_NUMERIC_ -1 -# endif # ifdef USE_LOCALE_CTYPE -# define LC_CTYPE_INDEX_ PERL_DUMMY_NUMERIC_ + 1 +# define LC_CTYPE_INDEX_ 0 # define PERL_DUMMY_CTYPE_ LC_CTYPE_INDEX_ # else -# define PERL_DUMMY_CTYPE_ PERL_DUMMY_NUMERIC_ +# define PERL_DUMMY_CTYPE_ -1 +# endif +# ifdef USE_LOCALE_NUMERIC +# define LC_NUMERIC_INDEX_ PERL_DUMMY_CTYPE_ + 1 +# define PERL_DUMMY_NUMERIC_ LC_NUMERIC_INDEX_ +# else +# define PERL_DUMMY_NUMERIC_ PERL_DUMMY_CTYPE_ # endif # ifdef USE_LOCALE_COLLATE -# define LC_COLLATE_INDEX_ PERL_DUMMY_CTYPE_ + 1 +# define LC_COLLATE_INDEX_ PERL_DUMMY_NUMERIC_ + 1 # define PERL_DUMMY_COLLATE_ LC_COLLATE_INDEX_ # else -# define PERL_DUMMY_COLLATE_ PERL_DUMMY_CTYPE_ +# define PERL_DUMMY_COLLATE_ PERL_DUMMY_NUMERIC_ # endif # ifdef USE_LOCALE_TIME # define LC_TIME_INDEX_ PERL_DUMMY_COLLATE_ + 1 @@ -1292,7 +1321,25 @@ violations are fatal. # define USE_POSIX_2008_LOCALE # endif # endif -#endif + +/* Allow use of glib's undocumented querylocale() equivalent if asked for, and + * appropriate */ +# ifdef USE_POSIX_2008_LOCALE +# if defined(HAS_QUERYLOCALE) \ + /* Has this internal undocumented item for nl_langinfo() */ \ + || ( defined(_NL_LOCALE_NAME) \ + /* And asked for */ \ + && defined(USE_NL_LOCALE_NAME) \ + /* We need the below because we will be calling it within a \ + * macro, can't have it get messed up by another thread. */ \ + && defined(HAS_THREAD_SAFE_NL_LANGINFO_L) \ + /* On systems that accept any locale name, the real \ + * underlying locale is often returned by this internal \ + * item, so we can't use it */ \ + && ! defined(SETLOCALE_ACCEPTS_ANY_LOCALE_NAME)) +# define USE_QUERYLOCALE +# endif +# endif /* Microsoft documentation reads in the change log for VS 2015: * "The localeconv function declared in locale.h now works correctly when @@ -1300,8 +1347,32 @@ violations are fatal. * function would return the lconv data for the global locale, not the * thread's locale." */ -#if defined(WIN32) && defined(USE_THREAD_SAFE_LOCALE) && _MSC_VER < 1900 +# if defined(WIN32) && defined(USE_THREAD_SAFE_LOCALE) && _MSC_VER < 1900 # define TS_W32_BROKEN_LOCALECONV +# endif +#endif + +#ifdef PERL_CORE + +/* Both typedefs are used in locale.c only, but defined here so that embed.fnc + * can generate the proper prototypes. */ + +typedef enum { + DONT_RECALC_LC_ALL, + YES_RECALC_LC_ALL, + + /* Used in tight loops through all sub-categories, where LC_ALL won't be + * fully known until all subcategories are handled. */ + RECALCULATE_LC_ALL_ON_FINAL_INTERATION +} recalc_lc_all_t; + + +typedef enum { /* Is the locale UTF8? */ + LOCALE_NOT_UTF8, + LOCALE_IS_UTF8, + LOCALE_UTF8NESS_UNKNOWN +} locale_utf8ness_t; + #endif #include @@ -2370,6 +2441,57 @@ typedef UVTYPE UV; #endif /* +=for apidoc AmnU||U32of +=for apidoc_item ||U32uf +=for apidoc_item ||U32xf +=for apidoc_item ||U32Xf + +These symbols define the format strings used for printing variables declared +as U32; respectively as octal, unsigned, hex (lowercase C), and hex +(uppercase C). + +=cut +*/ + +#if U32SIZE == UVSIZE +# define U32uf UVuf +# define U32of UVof +# define U32xf UVxf +# define U32Xf UVXf +#elif U32SIZE == INTSIZE +# define U32uf "u" +# define U32of "o" +# define U32xf "x" +# define U32Xf "X" +#elif U32SIZE == LONGSIZE +# define U32uf "lu" +# define U32of "lo" +# define U32xf "lx" +# define U32Xf "lX" +#else +# error Cant figure out formatting strings for U32SIZE +#endif + +/* +=for apidoc AmnU||I32df + +This symbol defines the format string used for printing a variable declared as +I32 + +=cut +*/ + +#if I32SIZE == IVSIZE +# define I32df IVdf +#elif I32SIZE == INTSIZE +# define I32df "d" +#elif I32SIZE == LONGSIZE +# define I32df "ld" +#else +# error Cant figure out formatting string for I32SIZE +#endif + +/* * The macros INT2PTR and NUM2PTR are (despite their names) * bi-directional: they will convert int/float to or from pointers. * However the conversion to int/float are named explicitly: @@ -2971,8 +3093,13 @@ extern long double Perl_my_frexpl(long double x, int *e); #endif /* The default is to use Perl's own atof() implementation (in numeric.c). - * Usually that is the one to use but for some platforms (e.g. UNICOS) - * it is however best to use the native implementation of atof. + * This knows about if 'use locale' is in effect or not, and handles the radix + * character accordingly. On some platforms (e.g. UNICOS) it is however best + * to use the native implementation of atof, as long as you accept that the + * current underlying locale will affect the radix character. Perl's version + * uses a dot for a radix, execpt within the lexical scope of a Perl C statement. + * * You can experiment with using your native one by -DUSE_PERL_ATOF=0. * Some good tests to try out with either setting are t/base/num.t, * t/op/numconvert.t, and t/op/pack.t. Note that if using long doubles @@ -2989,7 +3116,7 @@ extern long double Perl_my_frexpl(long double x, int *e); #endif #ifdef USE_PERL_ATOF -# define Perl_atof(s) Perl_my_atof(s) +# define Perl_atof(s) Perl_my_atof(aTHX_ s) # define Perl_atof2(s, n) Perl_my_atof3(aTHX_ (s), &(n), 0) #else # define Perl_atof(s) (NV)atof(s) @@ -2998,6 +3125,17 @@ extern long double Perl_my_frexpl(long double x, int *e); #define my_atof2(a,b) my_atof3(a,b,0) /* +=for apidoc AmTR|NV|Atof|NN const char * const s + +This is a synonym for L>. + +=cut + +*/ + +#define Atof my_atof + +/* =for apidoc_section $numeric =for apidoc AmT|NV|Perl_acos|NV x =for apidoc_item |NV|Perl_asin|NV x @@ -3030,6 +3168,7 @@ NV on this platform. If no such function with sufficient precision exists, the highest precision one available is used. =cut + */ /* @@ -3072,24 +3211,24 @@ the highest precision one available is used. /* =for apidoc_section $integer -=for apidoc AmnU||PERL_INT_MAX -=for apidoc_item ||PERL_INT_MIN -=for apidoc_item ||PERL_LONG_MAX -=for apidoc_item ||PERL_LONG_MIN -=for apidoc_item ||PERL_SHORT_MAX -=for apidoc_item ||PERL_SHORT_MIN -=for apidoc_item ||PERL_UCHAR_MAX -=for apidoc_item ||PERL_UCHAR_MIN -=for apidoc_item ||PERL_UINT_MAX -=for apidoc_item ||PERL_UINT_MIN -=for apidoc_item ||PERL_ULONG_MAX -=for apidoc_item ||PERL_ULONG_MIN -=for apidoc_item ||PERL_USHORT_MAX -=for apidoc_item ||PERL_USHORT_MIN -=for apidoc_item ||PERL_QUAD_MAX -=for apidoc_item ||PERL_QUAD_MIN -=for apidoc_item ||PERL_UQUAD_MAX -=for apidoc_item ||PERL_UQUAD_MIN +=for apidoc Amn |int|PERL_INT_MAX +=for apidoc_item |int|PERL_INT_MIN +=for apidoc_item |long|PERL_LONG_MAX +=for apidoc_item |long|PERL_LONG_MIN +=for apidoc_item |IV|PERL_QUAD_MAX +=for apidoc_item |IV|PERL_QUAD_MIN +=for apidoc_item |short|PERL_SHORT_MAX +=for apidoc_item |short|PERL_SHORT_MIN +=for apidoc_item |U8|PERL_UCHAR_MAX +=for apidoc_item |U8|PERL_UCHAR_MIN +=for apidoc_item |unsigned int|PERL_UINT_MAX +=for apidoc_item |unsigned int|PERL_UINT_MIN +=for apidoc_item |unsigned long|PERL_ULONG_MAX +=for apidoc_item |unsigned long|PERL_ULONG_MIN +=for apidoc_item |UV|PERL_UQUAD_MAX +=for apidoc_item |UV|PERL_UQUAD_MIN +=for apidoc_item |unsigned short|PERL_USHORT_MAX +=for apidoc_item |unsigned short|PERL_USHORT_MIN These give the largest and smallest number representable in the current platform in variables of the corresponding types. @@ -4013,30 +4152,59 @@ out there, Solaris being the most prominent. #define SVfARG(p) ((void*)(p)) +/* Render an SV as a quoted and escaped string suitable for an error message. + * Only shows the first PERL_QUOTEDPREFIX_LEN characters, and adds ellipses if the + * string is too long. + */ +#ifndef PERL_QUOTEDPREFIX_LEN +# define PERL_QUOTEDPREFIX_LEN 256 +#endif +#ifndef SVf_QUOTEDPREFIX +# define SVf_QUOTEDPREFIX "5p" +#endif + +/* like %s but runs through the quoted prefix logic */ +#ifndef PVf_QUOTEDPREFIX +# define PVf_QUOTEDPREFIX "1p" +#endif + #ifndef HEKf # define HEKf "2p" #endif +#ifndef HEKf_QUOTEDPREFIX +# define HEKf_QUOTEDPREFIX "7p" +#endif + /* Not ideal, but we cannot easily include a number in an already-numeric * format sequence. */ #ifndef HEKf256 # define HEKf256 "3p" #endif +#ifndef HEKf256_QUOTEDPREFIX +# define HEKf256_QUOTEDPREFIX "8p" +#endif + #define HEKfARG(p) ((void*)(p)) /* Documented in perlguts * - * %4p is a custom format + * %4p and %9p are custom formats for handling UTF8 parameters. + * They only occur when prefixed by specific other formats. */ #ifndef UTF8f # define UTF8f "d%" UVuf "%4p" #endif +#ifndef UTF8f_QUOTEDPREFIX +# define UTF8f_QUOTEDPREFIX "d%" UVuf "%9p" +#endif #define UTF8fARG(u,l,p) (int)cBOOL(u), (UV)(l), (void*)(p) #define PNf UTF8f #define PNfARG(pn) (int)1, (UV)PadnameLEN(pn), (void *)PadnamePV(pn) + #ifdef PERL_CORE /* not used; but needed for backward compatibility with XS code? - RMB =for apidoc_section $io_formats @@ -4156,6 +4324,14 @@ intrinsic function, see its documents for more details. #ifdef DEBUGGING # define ASSUME(x) assert(x) +#elif __has_builtin(__builtin_assume) +# if defined(__clang__) || defined(__clang) +# define ASSUME(x) CLANG_DIAG_IGNORE(-Wassume) \ + __builtin_assume (x) \ + CLANG_DIAG_RESTORE +# else +# define ASSUME(x) __builtin_assume(x) +# endif #elif defined(_MSC_VER) # define ASSUME(x) __assume(x) #elif defined(__ARMCC_VERSION) /* untested */ @@ -5562,6 +5738,9 @@ EXTCONST char PL_bincompat_options[] = # ifdef MYMALLOC " MYMALLOC" # endif +# ifdef NO_HASH_SEED + " NO_HASH_SEED" +# endif # ifdef PERLIO_LAYERS " PERLIO_LAYERS" # endif @@ -5571,6 +5750,16 @@ EXTCONST char PL_bincompat_options[] = # ifdef PERL_DEBUG_READONLY_OPS " PERL_DEBUG_READONLY_OPS" # endif +# ifdef PERL_HASH_FUNC_DEFINE +/* note that this is different from the others, PERL_HASH_FUNC_DEFINE + * is a string which says which define was defined. */ + " " PERL_HASH_FUNC_DEFINE +# endif +# ifdef PERL_HASH_USE_SBOX32 + " PERL_HASH_USE_SBOX32" +# else + " PERL_HASH_NO_SBOX32" +# endif # ifdef PERL_IMPLICIT_SYS " PERL_IMPLICIT_SYS" # endif @@ -6785,14 +6974,14 @@ the plain locale pragma without a parameter (S>) is in effect. * instead it makes sense to minimize space used and do all the work in * the rarely called function */ # ifdef USE_LOCALE_CTYPE -# define _CHECK_AND_WARN_PROBLEMATIC_LOCALE \ +# define CHECK_AND_WARN_PROBLEMATIC_LOCALE_ \ STMT_START { \ if (UNLIKELY(PL_warn_locale)) { \ Perl__warn_problematic_locale(); \ } \ } STMT_END # else -# define _CHECK_AND_WARN_PROBLEMATIC_LOCALE +# define CHECK_AND_WARN_PROBLEMATIC_LOCALE_ # endif @@ -6837,11 +7026,12 @@ the plain locale pragma without a parameter (S>) is in effect. # define IN_LC_COMPILETIME(category) 0 # define IN_LC_RUNTIME(category) 0 # define IN_LC(category) 0 -# define _CHECK_AND_WARN_PROBLEMATIC_LOCALE +# define CHECK_AND_WARN_PROBLEMATIC_LOCALE_ # define _CHECK_AND_OUTPUT_WIDE_LOCALE_UTF8_MSG(s, send) # define _CHECK_AND_OUTPUT_WIDE_LOCALE_CP_MSG(c) #endif +#define locale_panic_(m) Perl_locale_panic((m), __FILE__, __LINE__, errno) /* Locale/thread synchronization macros. */ #if ! ( defined(USE_LOCALE) \ @@ -6924,14 +7114,14 @@ the plain locale pragma without a parameter (S>) is in effect. * separate mutexes for some of them, the only changes needed are here. * Define just the necessary macros. The compiler should then croak if the * #ifdef's in the code are incorrect */ -# if defined(HAS_LOCALECONV) && ( ! defined(HAS_POSIX_2008_LOCALE) \ +# if defined(HAS_LOCALECONV) && ( ! defined(USE_POSIX_2008_LOCALE) \ || ! defined(HAS_LOCALECONV_L) \ || defined(TS_W32_BROKEN_LOCALECONV)) # define LOCALECONV_LOCK LOCALE_LOCK_ # define LOCALECONV_UNLOCK LOCALE_UNLOCK_ # endif # if defined(HAS_NL_LANGINFO) && ( ! defined(HAS_THREAD_SAFE_NL_LANGINFO_L) \ - || ! defined(HAS_POSIX_2008_LOCALE)) + || ! defined(USE_POSIX_2008_LOCALE)) # define NL_LANGINFO_LOCK LOCALE_LOCK_ # define NL_LANGINFO_UNLOCK LOCALE_UNLOCK_ # endif @@ -7008,9 +7198,7 @@ the plain locale pragma without a parameter (S>) is in effect. "%s: %d: avoided lc_numeric_lock; new depth=%d\n", \ __FILE__, __LINE__, PL_lc_numeric_mutex_depth)); \ if (cond_to_panic_if_already_locked) { \ - Perl_croak_nocontext("panic: %s: %d: Trying to change" \ - " LC_NUMERIC incompatibly", \ - __FILE__, __LINE__); \ + locale_panic_("Trying to change LC_NUMERIC incompatibly");\ } \ } \ } STMT_END @@ -7059,9 +7247,9 @@ the plain locale pragma without a parameter (S>) is in effect. } STMT_END # define LOCALE_TERM STMT_START { \ - MUTEX_DESTROY(&PL_locale_mutex); \ - LOCALE_TERM_LC_NUMERIC_; \ LOCALE_TERM_POSIX_2008_; \ + LOCALE_TERM_LC_NUMERIC_; \ + MUTEX_DESTROY(&PL_locale_mutex); \ } STMT_END #endif @@ -7221,12 +7409,12 @@ cannot have changed since the precalculation. * khw believes the reason for the variables instead of the bits in a single * word is to avoid having to have masking instructions. */ -# define _NOT_IN_NUMERIC_STANDARD (! PL_numeric_standard) +# define NOT_IN_NUMERIC_STANDARD_ (! PL_numeric_standard) /* We can lock the category to stay in the C locale, making requests to the * contrary be noops, in the dynamic scope by setting PL_numeric_standard to 2. * */ -# define _NOT_IN_NUMERIC_UNDERLYING \ +# define NOT_IN_NUMERIC_UNDERLYING_ \ (! PL_numeric_underlying && PL_numeric_standard < 2) # define DECLARATION_FOR_LC_NUMERIC_MANIPULATION \ @@ -7236,17 +7424,17 @@ cannot have changed since the precalculation. STMT_START { \ bool _in_lc_numeric = (in); \ LC_NUMERIC_LOCK( \ - ( ( _in_lc_numeric && _NOT_IN_NUMERIC_UNDERLYING) \ - || (! _in_lc_numeric && _NOT_IN_NUMERIC_STANDARD))); \ + ( ( _in_lc_numeric && NOT_IN_NUMERIC_UNDERLYING_) \ + || (! _in_lc_numeric && NOT_IN_NUMERIC_STANDARD_))); \ if (_in_lc_numeric) { \ - if (_NOT_IN_NUMERIC_UNDERLYING) { \ + if (NOT_IN_NUMERIC_UNDERLYING_) { \ Perl_set_numeric_underlying(aTHX); \ _restore_LC_NUMERIC_function \ = &Perl_set_numeric_standard; \ } \ } \ else { \ - if (_NOT_IN_NUMERIC_STANDARD) { \ + if (NOT_IN_NUMERIC_STANDARD_) { \ Perl_set_numeric_standard(aTHX); \ _restore_LC_NUMERIC_function \ = &Perl_set_numeric_underlying; \ @@ -7265,22 +7453,25 @@ cannot have changed since the precalculation. LC_NUMERIC_UNLOCK; \ } STMT_END -/* The next two macros set unconditionally. These should be rarely used, and - * only after being sure that this is what is needed */ +/* The next two macros should be rarely used, and only after being sure that + * this is what is needed */ # define SET_NUMERIC_STANDARD() \ STMT_START { \ DEBUG_Lv(PerlIO_printf(Perl_debug_log, \ "%s: %d: lc_numeric standard=%d\n", \ __FILE__, __LINE__, PL_numeric_standard)); \ - Perl_set_numeric_standard(aTHX); \ + if (UNLIKELY(NOT_IN_NUMERIC_STANDARD_)) { \ + Perl_set_numeric_standard(aTHX); \ + } \ DEBUG_Lv(PerlIO_printf(Perl_debug_log, \ "%s: %d: lc_numeric standard=%d\n", \ __FILE__, __LINE__, PL_numeric_standard)); \ } STMT_END # define SET_NUMERIC_UNDERLYING() \ - STMT_START { \ - if (_NOT_IN_NUMERIC_UNDERLYING) { \ + STMT_START { \ + /*assert(PL_locale_mutex_depth > 0);*/ \ + if (NOT_IN_NUMERIC_UNDERLYING_) { \ Perl_set_numeric_underlying(aTHX); \ } \ } STMT_END @@ -7289,8 +7480,8 @@ cannot have changed since the precalculation. * the RESTORE_foo ones called to switch back, but only if need be */ # define STORE_LC_NUMERIC_SET_STANDARD() \ STMT_START { \ - LC_NUMERIC_LOCK(_NOT_IN_NUMERIC_STANDARD); \ - if (_NOT_IN_NUMERIC_STANDARD) { \ + LC_NUMERIC_LOCK(NOT_IN_NUMERIC_STANDARD_); \ + if (NOT_IN_NUMERIC_STANDARD_) { \ _restore_LC_NUMERIC_function = &Perl_set_numeric_underlying;\ Perl_set_numeric_standard(aTHX); \ } \ @@ -7299,9 +7490,9 @@ cannot have changed since the precalculation. /* Rarely, we want to change to the underlying locale even outside of 'use * locale'. This is principally in the POSIX:: functions */ # define STORE_LC_NUMERIC_FORCE_TO_UNDERLYING() \ - STMT_START { \ - LC_NUMERIC_LOCK(_NOT_IN_NUMERIC_UNDERLYING); \ - if (_NOT_IN_NUMERIC_UNDERLYING) { \ + STMT_START { \ + LC_NUMERIC_LOCK(NOT_IN_NUMERIC_UNDERLYING_); \ + if (NOT_IN_NUMERIC_UNDERLYING_) { \ Perl_set_numeric_underlying(aTHX); \ _restore_LC_NUMERIC_function = &Perl_set_numeric_standard; \ } \ @@ -7438,8 +7629,6 @@ END_EXTERN_C #define ENV_LOCALE_READ_LOCK ENV_LOCALE_LOCK #define ENV_LOCALE_READ_UNLOCK ENV_LOCALE_UNLOCK -#define Atof my_atof - /* =for apidoc_section $numeric @@ -7821,7 +8010,7 @@ extern void moncontrol(int); #endif /* ISO 6429 NEL - C1 control NExt Line */ -/* See https://www.unicode.org/reports/tr13/ */ +/* See https://www.unicode.org/unicode/reports/tr13/ */ #define NEXT_LINE_CHAR NEXT_LINE_NATIVE #ifndef PIPESOCK_MODE @@ -7961,7 +8150,7 @@ Allows one ending \0 #define PERL_PV_ESCAPE_NONASCII 0x000400 #define PERL_PV_ESCAPE_FIRSTCHAR 0x000800 -#define PERL_PV_ESCAPE_ALL 0x001000 +#define PERL_PV_ESCAPE_ALL 0x001000 #define PERL_PV_ESCAPE_NOBACKSLASH 0x002000 #define PERL_PV_ESCAPE_NOCLEAR 0x004000 #define PERL_PV_PRETTY_NOCLEAR PERL_PV_ESCAPE_NOCLEAR @@ -7973,6 +8162,18 @@ Allows one ending \0 /* Escape PV with all hex, including NUL. */ #define PERL_PV_ESCAPE_DWIM_ALL_HEX 0x020000 +/* Do not escape word characters, alters meaning of other flags */ +#define PERL_PV_ESCAPE_NON_WC 0x040000 +#define PERL_PV_ESCAPE_TRUNC_MIDDLE 0x080000 + +#define PERL_PV_PRETTY_QUOTEDPREFIX ( \ + PERL_PV_PRETTY_ELLIPSES | \ + PERL_PV_PRETTY_QUOTE | \ + PERL_PV_ESCAPE_NONASCII | \ + PERL_PV_ESCAPE_NON_WC | \ + PERL_PV_ESCAPE_TRUNC_MIDDLE | \ + 0) + /* used by pv_display in dump.c*/ #define PERL_PV_PRETTY_DUMP PERL_PV_PRETTY_ELLIPSES|PERL_PV_PRETTY_QUOTE @@ -8675,6 +8876,30 @@ END_EXTERN_C #endif /* DOUBLE_HAS_NAN */ +/* these are used to faciliate the env var PERL_RAND_SEED, + * which allows consistent behavior from code that calls + * srand() with no arguments, either explicitly or implicitly. + */ +#define PERL_SRAND_OVERRIDE_NEXT() PERL_XORSHIFT32_A(PL_srand_override_next); + +#define PERL_SRAND_OVERRIDE_NEXT_INIT() STMT_START { \ + PL_srand_override = PL_srand_override_next; \ + PERL_SRAND_OVERRIDE_NEXT(); \ +} STMT_END + +#define PERL_SRAND_OVERRIDE_GET(into) STMT_START { \ + into= PL_srand_override; \ + PERL_SRAND_OVERRIDE_NEXT_INIT(); \ +} STMT_END + +#define PERL_SRAND_OVERRIDE_NEXT_CHILD() STMT_START { \ + PERL_XORSHIFT32_B(PL_srand_override_next); \ + PERL_SRAND_OVERRIDE_NEXT_INIT(); \ +} STMT_END + +#define PERL_SRAND_OVERRIDE_NEXT_PARENT() \ + PERL_SRAND_OVERRIDE_NEXT() + /*