X-Git-Url: https://perl5.git.perl.org/perl5.git/blobdiff_plain/e25d460c7424add881539f78a45c918bc5d5bc94..ca53e5d538c69672817c510e43c842c5a2bd2557:/perl.h diff --git a/perl.h b/perl.h index ca80f53..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,15 +98,9 @@ /* <--- 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 +/* 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 #endif #undef START_EXTERN_C @@ -429,14 +423,6 @@ # endif #endif -#ifdef OP_IN_REGISTER -# ifdef __GNUC__ -# define stringify_immed(s) #s -# define stringify(s) stringify_immed(s) -struct op *Perl_op asm(stringify(OP_IN_REGISTER)); -# endif -#endif - /* gcc (-ansi) -pedantic doesn't allow gcc statement expressions, * g++ allows them but seems to have problems with them * (insane errors ensue). @@ -468,14 +454,8 @@ struct op *Perl_op asm(stringify(OP_IN_REGISTER)); # 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 @@ -636,11 +616,7 @@ struct op *Perl_op asm(stringify(OP_IN_REGISTER)); # include #endif -#ifndef _TYPES_ /* If types.h defines this it's easy. */ -# ifndef major /* Does everyone's types.h define this? */ -# include -# endif -#endif +#include #ifdef __cplusplus # ifndef I_STDARG @@ -715,6 +691,16 @@ struct op *Perl_op asm(stringify(OP_IN_REGISTER)); # 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 @@ -964,9 +950,6 @@ EXTERN_C int usleep(unsigned int); extern int memcmp (char*, char*, int); # endif # endif -# ifdef BUGGY_MSC -# pragma function(memcmp) -# endif #else # ifndef memcmp # define memcmp my_memcmp @@ -1128,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 *); @@ -1238,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 @@ -1320,13 +1301,6 @@ EXTERN_C char *crypt(const char *, const char *); # endif #endif -#ifdef FPUTS_BOTCH -/* work around botch in SunOS 4.0.1 and 4.0.2 */ -# ifndef fputs -# define fputs(sv,fp) fprintf(fp,"%s",sv) -# endif -#endif - /* * The following gobbledygook brought to you on behalf of __STDC__. * (I could just use #ifndef __STDC__, but this is more bulletproof @@ -1477,10 +1451,6 @@ EXTERN_C char *crypt(const char *, const char *); # define S_IEXEC S_IXUSR #endif -#ifdef ff_next -# undef ff_next -#endif - #if defined(cray) || defined(gould) || defined(i860) || defined(pyr) # define SLOPPYDIVIDE #endif @@ -1605,10 +1575,11 @@ typedef UVTYPE UV; # else # undef IV_IS_QUAD # undef UV_IS_QUAD -#ifndef PERL_CORE +#if !defined(PERL_CORE) || defined(USING_MSVC6) /* We think that removing this decade-old undef this will cause too much breakage on CPAN for too little gain. (See RT #119753) - However, we do need HAS_QUAD in the core for use by the drand48 code. */ + However, we do need HAS_QUAD in the core for use by the drand48 code, + but not for Win32 VC6 because it has poor __int64 support. */ # undef HAS_QUAD #endif # endif @@ -1616,13 +1587,6 @@ typedef UVTYPE UV; #define SSize_t_MAX (SSize_t)(~(size_t)0 >> 1) -#ifndef HAS_QUAD -# undef PERL_NEED_MY_HTOLE64 -# undef PERL_NEED_MY_LETOH64 -# undef PERL_NEED_MY_HTOBE64 -# undef PERL_NEED_MY_BETOH64 -#endif - #define IV_DIG (BIT_DIGITS(IVSIZE * 8)) #define UV_DIG (BIT_DIGITS(UVSIZE * 8)) @@ -2245,9 +2209,6 @@ int isnan(double d); #endif -struct RExC_state_t; -struct _reg_trie_data; - typedef MEM_SIZE STRLEN; #ifdef PERL_MAD @@ -2449,42 +2410,22 @@ typedef SV PADNAME; # else # include "dosish.h" # endif -# define ISHISH "dos" -#endif - -#if defined(VMS) +#elif defined(VMS) # include "vmsish.h" -# define ISHISH "vms" -#endif - -#if defined(PLAN9) +#elif defined(PLAN9) # include "./plan9/plan9ish.h" -# define ISHISH "plan9" -#endif - -#if defined(__VOS__) +#elif defined(__VOS__) # ifdef __GNUC__ # include "./vos/vosish.h" # else # include "vos/vosish.h" # endif -# define ISHISH "vos" -#endif - -#ifdef __SYMBIAN32__ +#elif defined(__SYMBIAN32__) # include "symbian/symbianish.h" -# define ISHISH "symbian" -#endif - - -#if defined(__HAIKU__) +#elif defined(__HAIKU__) # include "haiku/haikuish.h" -# define ISHISH "haiku" -#endif - -#ifndef ISHISH +#else # include "unixish.h" -# define ISHISH "unix" #endif /* NSIG logic from Configure --> */ @@ -3072,15 +3013,6 @@ typedef pthread_key_t perl_key; #ifdef PERL_CORE /* not used; but needed for backward compatibility with XS code? - RMB */ -# undef VDf -#else -# ifndef VDf -# define VDf "vd" -# endif -#endif - -#ifdef PERL_CORE -/* not used; but needed for backward compatibility with XS code? - RMB */ # undef UVf #else # ifndef UVf @@ -3143,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 */ @@ -3166,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. @@ -3214,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; @@ -3337,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; @@ -4090,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 @@ -4713,6 +4694,7 @@ typedef enum { XATTRBLOCK, XATTRTERM, XTERMBLOCK, + XPOSTDEREF, XTERMORDORDOR /* evil hack */ /* update exp_name[] in toke.c if adding to this enum */ } expectation;