X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl.h;h=27a9de9429a4241aec8170e7be2402f91c863998;hb=c7b62a6899c238c2a399e60a2ab1b36955cfc955;hp=80143017677702a04a544c24a61f4c2d9abfcac0;hpb=71bb2714b36938d6dc57f42cfd830f0a30ac9087;p=p5sagit%2Fp5-mst-13.2.git diff --git a/perl.h b/perl.h index 8014301..27a9de9 100644 --- a/perl.h +++ b/perl.h @@ -26,7 +26,6 @@ /* See L for detailed notes on * PERL_IMPLICIT_CONTEXT and PERL_IMPLICIT_SYS */ -/* XXXXXX testing threads via implicit pointer */ #ifdef USE_THREADS # ifndef PERL_IMPLICIT_CONTEXT # define PERL_IMPLICIT_CONTEXT @@ -36,7 +35,6 @@ # endif #endif -/* XXXXXX testing multiplicity via implicit pointer */ #if defined(MULTIPLICITY) # ifndef PERL_IMPLICIT_CONTEXT # define PERL_IMPLICIT_CONTEXT @@ -148,22 +146,17 @@ class CPerlObj; #define pTHXo CPerlObj *pPerl #define pTHXo_ pTHXo, -#define _pTHXo ,pTHXo #define aTHXo this #define aTHXo_ this, -#define _aTHXo ,this #define PERL_OBJECT_THIS aTHXo #define PERL_OBJECT_THIS_ aTHXo_ -#define _PERL_OBJECT_THIS _aTHXo #define dTHXoa(a) pTHXo = a #define dTHXo dTHXoa(PERL_GET_THX) #define pTHXx void #define pTHXx_ -#define _pTHXx #define aTHXx #define aTHXx_ -#define _aTHXx #else /* !PERL_OBJECT */ @@ -183,9 +176,7 @@ struct perl_thread; # define dTHXa(a) pTHX = a # define dTHX dTHXa(PERL_GET_THX) # define pTHX_ pTHX, -# define _pTHX ,pTHX # define aTHX_ aTHX, -# define _aTHX ,aTHX #endif #define STATIC static @@ -214,10 +205,8 @@ struct perl_thread; #ifndef pTHX # define pTHX void # define pTHX_ -# define _pTHX # define aTHX # define aTHX_ -# define _aTHX # define dTHXa(a) dNOOP # define dTHX dNOOP #endif @@ -225,20 +214,16 @@ struct perl_thread; #ifndef pTHXo # define pTHXo pTHX # define pTHXo_ pTHX_ -# define _pTHXo _pTHX # define aTHXo aTHX # define aTHXo_ aTHX_ -# define _aTHXo _aTHX # define dTHXo dTHX #endif #ifndef pTHXx # define pTHXx register PerlInterpreter *my_perl # define pTHXx_ pTHXx, -# define _pTHXx ,pTHXx # define aTHXx my_perl # define aTHXx_ aTHXx, -# define _aTHXx ,aTHXx # define dTHXx dTHX #endif @@ -404,7 +389,7 @@ register struct op *Perl_op asm(stringify(OP_IN_REGISTER)); /* HP-UX 10.X CMA (Common Multithreaded Architecure) insists that pthread.h must be included before all other header files. */ -#if defined(USE_THREADS) && defined(PTHREAD_H_FIRST) +#if defined(USE_THREADS) && defined(PTHREAD_H_FIRST) && defined(I_PTHREAD) # include #endif @@ -906,21 +891,14 @@ Free_t Perl_mfree (Malloc_t where); #include #endif -/* XXX QUAD stuff is not currently supported on most systems. - Specifically, perl internals don't support long long. Among - the many problems is that some compilers support long long, - but the underlying library functions (such as sprintf) don't. - Some things do work (such as quad pack/unpack on convex); - also some systems use long long for the fpos_t typedef. That - seems to work too. - +/* The IV type is supposed to be long enough to hold any integral value or a pointer. --Andy Dougherty August 1996 */ -/* Much more 64-bit probing added. Now we should get Quad_t - in most systems: int64_t, long long, long, int, will do. +/* We should be able to get Quad_t in most systems: + all of int64_t, long long, long, int, will work. Beware of LP32 systems (ILP32, ILP32LL64). Such systems have been used to sizeof(long) == sizeof(foo*). This is a bad assumption @@ -932,9 +910,11 @@ Free_t Perl_mfree (Malloc_t where); Summary: a long long system needs to add -DUSE_LONG_LONG to $ccflags to get quads -- and if its pointers are still 32 bits, this will break binary compatibility. Casting an IV (a long long) to a pointer will - truncate half of the IV away. + truncate half of the IV away. Most systems can just use + Configure -Duse64bits to get the -DUSE_LONG_LONG added either by + their hints files, or directly by Configure if they are using gcc. - --jhi September 1998 */ + --jhi September 1999 */ #if INTSIZE == 4 && LONGSIZE == 4 && PTRSIZE == 4 # define PERL_ILP32 @@ -1018,6 +998,9 @@ Free_t Perl_mfree (Malloc_t where); # define IV_MAX INT64_MAX # define IV_MIN INT64_MIN # define UV_MAX UINT64_MAX +# ifndef UINT64_MIN +# define UINT64_MIN 0 +# endif # define UV_MIN UINT64_MIN # else # define IV_MAX PERL_QUAD_MAX @@ -1025,7 +1008,7 @@ Free_t Perl_mfree (Malloc_t where); # define UV_MAX PERL_UQUAD_MAX # define UV_MIN PERL_UQUAD_MIN # endif -# define IVSIZF 8 +# define IVSIZE 8 # define UVSIZE 8 # define IV_IS_QUAD # define UV_IS_QUAD @@ -1035,7 +1018,14 @@ Free_t Perl_mfree (Malloc_t where); # if defined(INT32_MAX) && LONGSIZE == 4 # define IV_MAX INT32_MAX # define IV_MIN INT32_MIN -# define UV_MAX UINT32_MAX +# ifndef UINT32_MAX_BROKEN /* e.g. HP-UX with gcc messes this up */ +# define UV_MAX UINT32_MAX +# else +# define UV_MAX 4294967295U +# endif +# ifndef UINT32_MIN +# define UINT32_MIN 0 +# endif # define UV_MIN UINT32_MIN # else # define IV_MAX PERL_LONG_MAX @@ -1053,9 +1043,35 @@ Free_t Perl_mfree (Malloc_t where); # define UVSIZE LONGSIZE # define IVSIZE LONGSIZE #endif -#define IV_DIG (BIT_DIGITS(IVSIZE * 8) + 1) -#define UV_DIG (BIT_DIGITS(IVSIZE * 8) + 1) +#define IV_DIG (BIT_DIGITS(IVSIZE * 8)) +#define UV_DIG (BIT_DIGITS(UVSIZE * 8)) +/* + * 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: + * PTR2IV, PTR2UV, PTR2NV. + * + * For int conversions we do not need two casts if pointers are + * the same size as IV and UV. Otherwise we need an explicit + * cast (PTRV) to avoid compiler warnings. + */ +#if (IVSIZE == PTRSIZE) && (UVSIZE == PTRSIZE) +# define PTRV UV +# define INT2PTR(any,d) (any)(d) +#else +# if PTRSIZE == LONGSIZE +# define PTRV unsigned long +# else +# define PTRV unsigned +# endif +# define INT2PTR(any,d) (any)(PTRV)(d) +#endif +#define NUM2PTR(any,d) (any)(PTRV)(d) +#define PTR2IV(p) INT2PTR(IV,p) +#define PTR2UV(p) INT2PTR(UV,p) +#define PTR2NV(p) NUM2PTR(NV,p) + #ifdef USE_LONG_DOUBLE # if defined(HAS_LONG_DOUBLE) && (LONG_DOUBLESIZE > DOUBLESIZE) # define LDoub_t long double @@ -1085,6 +1101,12 @@ Free_t Perl_mfree (Malloc_t where); #define DBL_DIG 15 /* A guess that works lots of places */ #endif #endif +#ifdef I_FLOAT +#include +#endif +#ifndef HAS_DBL_DIG +#define DBL_DIG 15 /* A guess that works lots of places */ +#endif #ifdef OVR_LDBL_DIG /* Use an overridden LDBL_DIG */ @@ -1405,10 +1427,16 @@ typedef union any ANY; #endif #if defined(USE_64_BIT_FILES) || defined(USE_LARGE_FILES) -# define USE_64_BIT_OFFSETS +# define USE_64_BIT_OFFSETS /* Explicit */ # define USE_64_BIT_STDIO #endif +#if LSEEKSIZE == 8 && !defined(USE_64_BIT_OFFSETS) +# define USE_64_BIT_OFFSETS /* Implicit */ +#endif + +/* Do we need FSEEKSIZE? */ + /* I couldn't find any -Ddefine or -flags in IRIX 6.5 that would * have done the necessary symbol renaming using cpp. --jhi */ #ifdef __sgi @@ -1588,7 +1616,9 @@ typedef mutex_t perl_mutex; typedef condition_t perl_cond; typedef void * perl_key; # else /* Posix threads */ -# include +# ifdef I_PTHREAD +# include +# endif typedef pthread_t perl_os_thread; typedef pthread_mutex_t perl_mutex; typedef pthread_cond_t perl_cond; @@ -1672,6 +1702,10 @@ typedef pthread_key_t perl_key; # endif #endif +/* the traditional thread-unsafe notion of "current interpreter". + * XXX todo: a thread-safe version that fetches it from TLS (akin to THR) + * needs to be defined elsewhere (conditional on pthread_getspecific() + * availability). */ #ifndef PERL_SET_INTERP # define PERL_SET_INTERP(i) (PL_curinterp = (PerlInterpreter*)(i)) #endif @@ -1768,7 +1802,7 @@ typedef I32 (*filter_t) (pTHXo_ int, SV *, int); #include "hv.h" #include "mg.h" #include "scope.h" -#include "warning.h" +#include "warnings.h" #include "utf8.h" /* Current curly descriptor */ @@ -1886,10 +1920,10 @@ typedef I32 CHECKPOINT; #define IV_FITS_IN_NV /* Doubt. */ #if defined(USE_LONG_DOUBLE) && \ - defined(LDBL_MANT_DIG) && IVSIZE*8 >= LDBL_MANT_DIG + defined(LDBL_MANT_DIG) && IV_DIG >= LDBL_MANT_DIG # undef IV_FITS_IN_NV #else -# if defined(DBL_MANT_DIG) && IVSIZE*8 >= DBL_MANT_DIG +# if defined(DBL_MANT_DIG) && IV_DIG >= DBL_MANT_DIG # undef IV_FITS_IN_NV # else # if IV_DIG >= NV_DIG @@ -1947,7 +1981,10 @@ Gid_t getegid (void); # if defined(PERL_OBJECT) # define DEBUG_m(a) if (PL_debug & 128) a # else -# define DEBUG_m(a) if (PERL_GET_INTERP && PL_debug & 128) a +# define DEBUG_m(a) \ + STMT_START { \ + if (PERL_GET_INTERP) { dTHX; if (PL_debug & 128) { a; } } \ + } STMT_END # endif #define DEBUG_f(a) if (PL_debug & 256) a #define DEBUG_r(a) if (PL_debug & 512) a @@ -2003,8 +2040,10 @@ struct ufuncs { /* Fix these up for __STDC__ */ #ifndef DONT_DECLARE_STD char *mktemp (char*); +#ifndef atof double atof (const char*); #endif +#endif #ifndef STANDARD_C /* All of these are in stdlib.h or time.h for ANSI C */ @@ -2431,6 +2470,8 @@ typedef enum { XREF, XSTATE, XBLOCK, + XATTRBLOCK, + XATTRTERM, XTERMBLOCK } expectation; @@ -2566,7 +2607,7 @@ struct perl_vars { EXT struct perl_vars PL_Vars; EXT struct perl_vars *PL_VarsPtr INIT(&PL_Vars); #else /* PERL_CORE */ -#if !defined(__GNUC__) || !(defined(WIN32) || defined(CYGWIN)) +#if !defined(__GNUC__) || !defined(WIN32) EXT #endif /* WIN32 */ struct perl_vars *PL_VarsPtr;