X-Git-Url: https://perl5.git.perl.org/perl5.git/blobdiff_plain/009819bba34f5d921632a25a7dcbb643b435c0e9..ca53e5d538c69672817c510e43c842c5a2bd2557:/perl.h diff --git a/perl.h b/perl.h index 1c22586..fccf4ba 100644 --- a/perl.h +++ b/perl.h @@ -90,7 +90,7 @@ # define USE_HEAP_INSTEAD_OF_STACK #endif -#/* Use the reentrant APIs like localtime_r and getpwent_r */ +/* Use the reentrant APIs like localtime_r and getpwent_r */ /* Win32 has naturally threadsafe libraries, no need to use any _r variants. */ #if defined(USE_ITHREADS) && !defined(USE_REENTRANT_API) && !defined(NETWARE) && !defined(WIN32) && !defined(PERL_DARWIN) # define USE_REENTRANT_API @@ -98,17 +98,6 @@ /* <--- here ends the logic shared by perl.h and makedef.pl */ -/* - * PERL_DARWIN for MacOSX (__APPLE__ exists but is not officially sanctioned) - * (The -DPERL_DARWIN comes from the hints/darwin.sh.) - * __bsdi__ for BSD/OS - */ -#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(PERL_DARWIN) || defined(__bsdi__) || defined(BSD41) || defined(BSD42) || defined(BSD43) || defined(BSD44) -# ifndef BSDish -# define BSDish -# endif -#endif - /* Microsoft Visual C++ 6.0 needs special treatment in numerous places */ #if defined(WIN32) && defined(_MSC_VER) && _MSC_VER >= 1200 && _MSC_VER < 1300 # define USING_MSVC6 @@ -465,14 +454,8 @@ # define STMT_START (void)( /* gcc supports "({ STATEMENTS; })" */ # define STMT_END ) # else - /* Now which other defined()s do we need here ??? */ -# if (defined(sun) || defined(__sun__)) && !defined(__GNUC__) -# define STMT_START if (1) -# define STMT_END else (void)0 -# else # define STMT_START do # define STMT_END while (0) -# endif # endif #endif @@ -708,6 +691,16 @@ # include #endif +/* On BSD-derived systems, defines BSD to a year-month + value something like 199306. This may be useful if no more-specific + feature test is available. +*/ +#if defined(BSD) +# ifndef BSDish +# define BSDish +# endif +#endif + /* Use all the "standard" definitions? */ #if defined(STANDARD_C) && defined(I_STDLIB) # include @@ -1118,7 +1111,7 @@ EXTERN_C char **environ; #endif #if defined(__cplusplus) -# if defined(__OpenBSD__) || defined(__FreeBSD__) || defined(__NetBSD__) +# if defined(BSDish) EXTERN_C char **environ; # elif defined(__CYGWIN__) EXTERN_C char *crypt(const char *, const char *); @@ -1228,8 +1221,6 @@ EXTERN_C char *crypt(const char *, const char *); # define SAVE_DEFSV SAVESPTR(GvSV(PL_defgv)) #endif -#define ERRHV GvHV(PL_errgv) /* XXX unused, here for compatibility */ - #ifndef errno extern int errno; /* ANSI allows errno to be an lvalue expr. * For example in multithreaded environments @@ -2218,9 +2209,6 @@ int isnan(double d); #endif -struct RExC_state_t; -struct _reg_trie_data; - typedef MEM_SIZE STRLEN; #ifdef PERL_MAD @@ -3087,9 +3075,9 @@ typedef pthread_key_t perl_key; appropriate to call return. In either case, include the lint directive. */ #ifdef HASATTRIBUTE_NORETURN -# define NORETURN_FUNCTION_END assert(0); /* NOTREACHED */ +# define NORETURN_FUNCTION_END NOT_REACHED; /* NOTREACHED */ #else -# define NORETURN_FUNCTION_END assert(0); /* NOTREACHED */ return 0 +# define NORETURN_FUNCTION_END NOT_REACHED; /* NOTREACHED */ return 0 #endif /* Some OS warn on NULL format to printf */ @@ -3110,6 +3098,39 @@ typedef pthread_key_t perl_key; /* placeholder */ #endif + +#ifndef __has_builtin +# define __has_builtin(x) 0 /* not a clang style compiler */ +#endif + +/* ASSUME is like assert(), but it has a benefit in a release build. It is a + hint to a compiler about a statement of fact in a function call free + 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 + intrinsic function, see its documents for more details. +*/ + +#ifndef DEBUGGING +# if __has_builtin(__builtin_unreachable) \ + || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5 || __GNUC__ > 5) /* 4.5 -> */ +# define ASSUME(x) ((x) ? (void) 0 : __builtin_unreachable()) +# elif defined(_MSC_VER) +# define ASSUME(x) __assume(x) +# elif defined(__ARMCC_VERSION) /* untested */ +# define ASSUME(x) __promise(x) +# else +/* a random compiler might define assert to its own special optimization token + so pass it through to C lib as a last resort */ +# define ASSUME(x) assert(x) +# endif +#else +# define ASSUME(x) assert(x) +#endif + +#define NOT_REACHED ASSUME(0) + /* Some unistd.h's give a prototype for pause() even though HAS_PAUSE ends up undefined. This causes the #define below to be rejected by the compiler. Sigh. @@ -3158,6 +3179,7 @@ UNION_ANY_DEFINITION; union any { void* any_ptr; I32 any_i32; + U32 any_u32; IV any_iv; UV any_uv; long any_long; @@ -3281,8 +3303,23 @@ struct _sublex_info { typedef struct magic_state MGS; /* struct magic_state defined in mg.c */ -struct scan_data_t; /* Used in S_* functions in regcomp.c */ -struct regnode_charclass_class; /* Used in S_* functions in regcomp.c */ +#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C) + +/* These have to be predeclared, as they are used in proto.h which is #included + * before their definitions in regcomp.h. */ + +struct scan_data_t; +struct regnode_charclass_class; + +/* A hopefully less confusing name. The sub-classes are all Posix classes only + * used under /l matching */ +typedef struct regnode_charclass_class regnode_charclass_posixl; + +typedef struct regnode_ssc regnode_ssc; +typedef struct RExC_state_t RExC_state_t; +struct _reg_trie_data; + +#endif struct ptr_tbl_ent { struct ptr_tbl_ent* next; @@ -4034,7 +4071,7 @@ EXT char *** environ_pointer; /* VMS and some other platforms don't use the environ array */ # ifdef USE_ENVIRON_ARRAY # if !defined(DONT_DECLARE_STD) || \ - (defined(__svr4__) && defined(__GNUC__) && defined(sun)) || \ + (defined(__svr4__) && defined(__GNUC__) && defined(__sun)) || \ defined(__sgi) extern char ** environ; /* environment variables supplied via exec */ # endif @@ -4657,6 +4694,7 @@ typedef enum { XATTRBLOCK, XATTRTERM, XTERMBLOCK, + XPOSTDEREF, XTERMORDORDOR /* evil hack */ /* update exp_name[] in toke.c if adding to this enum */ } expectation;