X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl.h;h=4d9a94edc566bbf56202e8c035761d14d6ed6d64;hb=0bc0ad857ef0ded50c72fba42503c958a1579a5a;hp=a699fd1d37b3762d37c0fb3ffa4abc82f1b64eb6;hpb=4d1ff10ffec86208b0da135b87c76b89e61c866e;p=p5sagit%2Fp5-mst-13.2.git diff --git a/perl.h b/perl.h index a699fd1..4d9a94e 100644 --- a/perl.h +++ b/perl.h @@ -1,11 +1,12 @@ /* perl.h * - * Copyright (c) 1987-2001, Larry Wall + * Copyright (c) 1987-2002, Larry Wall * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. * */ + #ifndef H_PERL #define H_PERL 1 @@ -41,8 +42,17 @@ /* See L for detailed notes on * PERL_IMPLICIT_CONTEXT and PERL_IMPLICIT_SYS */ +#ifdef PERL_IMPLICIT_SYS +/* PERL_IMPLICIT_SYS implies PerlMemShared != PerlMem + so use slab allocator to avoid lots of MUTEX overhead + */ +# ifndef PL_OP_SLAB_ALLOC +# define PL_OP_SLAB_ALLOC +# endif +#endif + #ifdef USE_ITHREADS -# if !defined(MULTIPLICITY) && !defined(PERL_OBJECT) +# if !defined(MULTIPLICITY) # define MULTIPLICITY # endif #endif @@ -59,129 +69,10 @@ # endif #endif -#ifdef PERL_CAPI -# undef PERL_OBJECT -# ifndef MULTIPLICITY -# define MULTIPLICITY -# endif -# ifndef PERL_IMPLICIT_CONTEXT -# define PERL_IMPLICIT_CONTEXT -# endif -# ifndef PERL_IMPLICIT_SYS -# define PERL_IMPLICIT_SYS -# endif -#endif - -#ifdef PERL_OBJECT -# ifndef PERL_IMPLICIT_CONTEXT -# define PERL_IMPLICIT_CONTEXT -# endif -# ifndef PERL_IMPLICIT_SYS -# define PERL_IMPLICIT_SYS -# endif -#endif - -#ifdef PERL_OBJECT - -/* PERL_OBJECT explained - DickH and DougL @ ActiveState.com - -Defining PERL_OBJECT turns on creation of a C++ object that -contains all writable core perl global variables and functions. -Stated another way, all necessary global variables and functions -are members of a big C++ object. This object's class is CPerlObj. -This allows a Perl Host to have multiple, independent perl -interpreters in the same process space. This is very important on -Win32 systems as the overhead of process creation is quite high -- -this could be even higher than the script compile and execute time -for small scripts. - -The perl executable implementation on Win32 is composed of perl.exe -(the Perl Host) and perlX.dll. (the Perl Core). This allows the -same Perl Core to easily be embedded in other applications that use -the perl interpreter. - -+-----------+ -| Perl Host | -+-----------+ - ^ - | - v -+-----------+ +-----------+ -| Perl Core |<->| Extension | -+-----------+ +-----------+ ... - -Defining PERL_OBJECT has the following effects: - -PERL CORE -1. CPerlObj is defined (this is the PERL_OBJECT) -2. all static functions that needed to access either global -variables or functions needed are made member functions -3. all writable static variables are made member variables -4. all global variables and functions are defined as: - #define var CPerlObj::PL_var - #define func CPerlObj::Perl_func - * these are in embed.h -This necessitated renaming some local variables and functions that -had the same name as a global variable or function. This was -probably a _good_ thing anyway. - - -EXTENSIONS -1. Access to global variables and perl functions is through a -pointer to the PERL_OBJECT. This pointer type is CPerlObj*. This is -made transparent to extension developers by the following macros: - #define var pPerl->PL_var - #define func pPerl->Perl_func - * these are done in objXSUB.h -This requires that the extension be compiled as C++, which means -that the code must be ANSI C and not K&R C. For K&R extensions, -please see the C API notes located in Win32/GenCAPI.pl. This script -creates a perlCAPI.lib that provides a K & R compatible C interface -to the PERL_OBJECT. -2. Local variables and functions cannot have the same name as perl's -variables or functions since the macros will redefine these. Look for -this if you get some strange error message and it does not look like -the code that you had written. This often happens with variables that -are local to a function. - -PERL HOST -1. The perl host is linked with perlX.lib to get perl_alloc. This -function will return a pointer to CPerlObj (the PERL_OBJECT). It -takes pointers to the various PerlXXX_YYY interfaces (see iperlsys.h -for more information on this). -2. The perl host calls the same functions as normally would be -called in setting up and running a perl script, except that the -functions are now member functions of the PERL_OBJECT. - -*/ - - -class CPerlObj; - -#define STATIC -#define CPERLscope(x) CPerlObj::x -#define CALL_FPTR(fptr) (aTHXo->*fptr) - -#define pTHXo CPerlObj *pPerl -#define pTHXo_ pTHXo, -#define aTHXo this -#define aTHXo_ this, -#define PERL_OBJECT_THIS aTHXo -#define PERL_OBJECT_THIS_ aTHXo_ -#define dTHXoa(a) pTHXo = (CPerlObj*)a -#define dTHXo pTHXo = PERL_GET_THX - -#define pTHXx void -#define pTHXx_ -#define aTHXx -#define aTHXx_ - -#else /* !PERL_OBJECT */ - #ifdef PERL_IMPLICIT_CONTEXT # ifdef USE_5005THREADS struct perl_thread; -# define pTHX register struct perl_thread *thr +# define pTHX register struct perl_thread *thr PERL_UNUSED_DECL # define aTHX thr # define dTHR dNOOP /* only backward compatibility */ # define dTHXa(a) pTHX = (struct perl_thread*)a @@ -189,7 +80,7 @@ struct perl_thread; # ifndef MULTIPLICITY # define MULTIPLICITY # endif -# define pTHX register PerlInterpreter *my_perl +# define pTHX register PerlInterpreter *my_perl PERL_UNUSED_DECL # define aTHX my_perl # define dTHXa(a) pTHX = (PerlInterpreter*)a # endif @@ -212,8 +103,6 @@ struct perl_thread; #define PERL_OBJECT_THIS_ #define CALL_FPTR(fptr) (*fptr) -#endif /* PERL_OBJECT */ - #define CALLRUNOPS CALL_FPTR(PL_runops) #define CALLREGCOMP CALL_FPTR(PL_regcompp) #define CALLREGEXEC CALL_FPTR(PL_regexecp) @@ -253,7 +142,8 @@ struct perl_thread; # define pTHX_4 4 #endif -#ifndef pTHXo +/* these are only defined for compatibility; should not be used internally */ +#if !defined(pTHXo) && !defined(PERL_CORE) # define pTHXo pTHX # define pTHXo_ pTHX_ # define aTHXo aTHX @@ -374,7 +264,7 @@ register struct op *Perl_op asm(stringify(OP_IN_REGISTER)); #if defined(HASVOLATILE) || defined(STANDARD_C) # ifdef __cplusplus -# define VOL // to temporarily suppress warnings +# define VOL /* to temporarily suppress warnings */ # else # define VOL volatile # endif @@ -533,11 +423,11 @@ register struct op *Perl_op asm(stringify(OP_IN_REGISTER)); # include #endif -#if defined(HAS_SYSCALL) && !defined(HAS_SYSCALL_PROTO) +#if defined(HAS_SYSCALL) && !defined(HAS_SYSCALL_PROTO) && !defined(PERL_MICRO) int syscall(int, ...); #endif -#if defined(HAS_USLEEP) && !defined(HAS_USLEEP_PROTO) +#if defined(HAS_USLEEP) && !defined(HAS_USLEEP_PROTO) && !defined(PERL_MICRO) int usleep(unsigned int); #endif @@ -545,7 +435,10 @@ int usleep(unsigned int); # define MYSWAP #endif -#if !defined(PERL_FOR_X2P) && !defined(WIN32) +/* Cannot include embed.h here on Win32 as win32.h has not + yet been included and defines some config variables e.g. HAVE_INTERP_INTERN + */ +#if !defined(PERL_FOR_X2P) && !(defined(WIN32)||defined(VMS)) # include "embed.h" #endif @@ -749,7 +642,7 @@ typedef struct perl_mstats perl_mstats_t; #include -#if defined(WIN32) && (defined(PERL_OBJECT) || defined(PERL_IMPLICIT_SYS) || defined(PERL_CAPI)) +#if defined(WIN32) && defined(PERL_IMPLICIT_SYS) # define WIN32SCK_IS_STDSCK /* don't pull in custom wsock layer */ #endif @@ -872,6 +765,12 @@ int sockatmark(int); # endif #endif +#ifndef HAS_SOCKETPAIR +# ifdef HAS_SOCKET +# define socketpair Perl_my_socketpair +# endif +#endif + #if INTSIZE == 2 # define htoni htons # define ntohi ntohs @@ -920,7 +819,7 @@ int sockatmark(int); * in the face of half-implementations.) */ -#ifdef I_SYSMODE +#if defined(I_SYSMODE) && !defined(PERL_MICRO) #include #endif @@ -1048,11 +947,15 @@ int sockatmark(int); # define S_IRWXO (S_IROTH|S_IWOTH|S_IXOTH) #endif -#ifndef S_IREAD +/* BeOS 5.0 seems to define S_IREAD and S_IWRITE in + * which would get included through , but that is 3000 + * lines in the future. --jhi */ + +#if !defined(S_IREAD) && !defined(__BEOS__) # define S_IREAD S_IRUSR #endif -#ifndef S_IWRITE +#if !defined(S_IWRITE) && !defined(__BEOS__) # define S_IWRITE S_IWUSR #endif @@ -1402,7 +1305,7 @@ typedef NVTYPE NV; # define Perl_fp_class_zero(x) (Perl_fp_class(x)==FP_CLASS_NZERO||Perl_fp_class(x)==FP_CLASS_PZERO) #endif -#if !defined(Perl_fp_class) && defined(HAS_FP_CLASS) +#if !defined(Perl_fp_class) && defined(HAS_FP_CLASS) && !defined(PERL_MICRO) # include # if !defined(FP_SNAN) && defined(I_FP_CLASS) # include @@ -1477,6 +1380,10 @@ typedef NVTYPE NV; # endif #endif +#ifdef UNDER_CE +int isnan(double d); +#endif + #ifndef Perl_isinf # ifdef HAS_ISINF # define Perl_isinf(x) isinf((NV)x) @@ -1752,6 +1659,8 @@ typedef struct mgvtbl MGVTBL; typedef union any ANY; typedef struct ptr_tbl_ent PTR_TBL_ENT_t; typedef struct ptr_tbl PTR_TBL_t; +typedef struct clone_params CLONE_PARAMS; + #include "handy.h" @@ -1855,60 +1764,74 @@ typedef struct ptr_tbl PTR_TBL_t; # endif #endif -#if defined(OS2) +#if defined(OS2) || defined(MACOS_TRADITIONAL) # include "iperlsys.h" #endif #if defined(__OPEN_VM) -# include "vmesa/vmesaish.h" +# include "vmesa/vmesaish.h" +# define ISHISH "vmesa" #endif #ifdef DOSISH -# if defined(OS2) -# include "os2ish.h" -# else -# include "dosish.h" -# endif -#else -# if defined(VMS) +# if defined(OS2) +# include "os2ish.h" +# else +# include "dosish.h" +# endif +# define ISHISH "dos" +#endif + +#if defined(VMS) # include "vmsish.h" -# else -# if defined(PLAN9) -# include "./plan9/plan9ish.h" +# include "embed.h" +# define ISHISH "vms" +#endif + +#if defined(PLAN9) +# include "./plan9/plan9ish.h" +# define ISHISH "plan9" +#endif + +#if defined(MPE) +# include "mpeix/mpeixish.h" +# define ISHISH "mpeix" +#endif + +#if defined(__VOS__) +# ifdef __GNUC__ +# include "./vos/vosish.h" # else -# if defined(MPE) -# include "mpeix/mpeixish.h" -# else -# if defined(__VOS__) -# include "vosish.h" -# else -# if defined(EPOC) -# include "epocish.h" -# else -# if defined(MACOS_TRADITIONAL) -# include "macos/macish.h" -# ifndef NO_ENVIRON_ARRAY -# define NO_ENVIRON_ARRAY -# endif -# else -# include "unixish.h" -# endif -# endif -# endif -# endif +# include "vos/vosish.h" # endif -# endif +# define ISHISH "vos" #endif -#ifndef NO_ENVIRON_ARRAY -# define USE_ENVIRON_ARRAY +#if defined(EPOC) +# include "epocish.h" +# define ISHISH "epoc" +#endif + +#if defined(MACOS_TRADITIONAL) +# include "macos/macish.h" +# ifndef NO_ENVIRON_ARRAY +# define NO_ENVIRON_ARRAY +# endif +# define ISHISH "macos classic" +#endif + +#if defined(__BEOS__) +# include "beos/beosish.h" +# define ISHISH "beos" +#endif + +#ifndef ISHISH +# include "unixish.h" +# define ISHISH "unix" #endif -#ifdef JPL - /* E.g. JPL needs to operate on a copy of the real environment. - * JDK 1.2 and 1.3 seem to get upset if the original environment - * is diddled with. */ -# define NEED_ENVIRON_DUP_FOR_MODIFY +#ifndef NO_ENVIRON_ARRAY +# define USE_ENVIRON_ARRAY #endif /* @@ -1933,6 +1856,10 @@ typedef struct ptr_tbl PTR_TBL_t; # define PERL_SYS_INIT3(argvp,argcp,envp) PERL_SYS_INIT(argvp,argcp) #endif +#ifndef PERL_WRITE_MSG_TO_CONSOLE +# define PERL_WRITE_MSG_TO_CONSOLE(io, msg, len) PerlIO_write(io, msg, len) +#endif + #ifndef MAXPATHLEN # ifdef PATH_MAX # ifdef _POSIX_PATH_MAX @@ -2004,7 +1931,7 @@ typedef pthread_key_t perl_key; #endif /* NETWARE */ #endif /* USE_5005THREADS || USE_ITHREADS */ -#ifdef WIN32 +#if defined(WIN32) # include "win32.h" #endif @@ -2111,10 +2038,6 @@ typedef pthread_key_t perl_key; # else # ifdef MULTIPLICITY # define PERL_GET_THX ((PerlInterpreter *)PERL_GET_CONTEXT) -# else -# ifdef PERL_OBJECT -# define PERL_GET_THX ((CPerlObj *)PERL_GET_CONTEXT) -# endif # endif # endif # define PERL_SET_THX(t) PERL_SET_CONTEXT(t) @@ -2144,6 +2067,14 @@ typedef pthread_key_t perl_key; # endif #endif +#ifndef Nullformat +# ifdef CHECK_FORMAT +# define Nullformat "%s","" +# else +# define Nullformat Nullch +# endif +#endif + /* 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. @@ -2185,7 +2116,7 @@ union any { IV any_iv; long any_long; void (*any_dptr) (void*); - void (*any_dxptr) (pTHXo_ void*); + void (*any_dxptr) (pTHX_ void*); }; #endif @@ -2195,13 +2126,13 @@ union any { #define ARGSproto #endif /* USE_5005THREADS */ -typedef I32 (*filter_t) (pTHXo_ int, SV *, int); +typedef I32 (*filter_t) (pTHX_ int, SV *, int); #define FILTER_READ(idx, sv, len) filter_read(idx, sv, len) #define FILTER_DATA(idx) (AvARRAY(PL_rsfp_filters)[idx]) #define FILTER_ISREADER(idx) (idx >= AvFILLp(PL_rsfp_filters)) -#if !defined(OS2) +#if !defined(OS2) && !defined(MACOS_TRADITIONAL) # include "iperlsys.h" #endif #include "regexp.h" @@ -2219,7 +2150,6 @@ typedef I32 (*filter_t) (pTHXo_ int, SV *, int); #include "scope.h" #include "warnings.h" #include "utf8.h" -#include "sharedsv.h" /* Current curly descriptor */ typedef struct curcur CURCUR; @@ -2428,30 +2358,50 @@ Gid_t getegid (void); #define DEBUG_TOP_FLAG 0x80000000 /* XXX what's this for ??? */ +# define DEBUG_p_TEST_ (PL_debug & DEBUG_p_FLAG) +# define DEBUG_s_TEST_ (PL_debug & DEBUG_s_FLAG) +# define DEBUG_l_TEST_ (PL_debug & DEBUG_l_FLAG) +# define DEBUG_t_TEST_ (PL_debug & DEBUG_t_FLAG) +# define DEBUG_o_TEST_ (PL_debug & DEBUG_o_FLAG) +# define DEBUG_c_TEST_ (PL_debug & DEBUG_c_FLAG) +# define DEBUG_P_TEST_ (PL_debug & DEBUG_P_FLAG) +# define DEBUG_m_TEST_ (PL_debug & DEBUG_m_FLAG) +# define DEBUG_f_TEST_ (PL_debug & DEBUG_f_FLAG) +# define DEBUG_r_TEST_ (PL_debug & DEBUG_r_FLAG) +# define DEBUG_x_TEST_ (PL_debug & DEBUG_x_FLAG) +# define DEBUG_u_TEST_ (PL_debug & DEBUG_u_FLAG) +# define DEBUG_L_TEST_ (PL_debug & DEBUG_L_FLAG) +# define DEBUG_H_TEST_ (PL_debug & DEBUG_H_FLAG) +# define DEBUG_X_TEST_ (PL_debug & DEBUG_X_FLAG) +# define DEBUG_D_TEST_ (PL_debug & DEBUG_D_FLAG) +# define DEBUG_S_TEST_ (PL_debug & DEBUG_S_FLAG) +# define DEBUG_T_TEST_ (PL_debug & DEBUG_T_FLAG) +# define DEBUG_R_TEST_ (PL_debug & DEBUG_R_FLAG) + #ifdef DEBUGGING # undef YYDEBUG # define YYDEBUG 1 -# define DEBUG_p_TEST (PL_debug & DEBUG_p_FLAG) -# define DEBUG_s_TEST (PL_debug & DEBUG_s_FLAG) -# define DEBUG_l_TEST (PL_debug & DEBUG_l_FLAG) -# define DEBUG_t_TEST (PL_debug & DEBUG_t_FLAG) -# define DEBUG_o_TEST (PL_debug & DEBUG_o_FLAG) -# define DEBUG_c_TEST (PL_debug & DEBUG_c_FLAG) -# define DEBUG_P_TEST (PL_debug & DEBUG_P_FLAG) -# define DEBUG_m_TEST (PL_debug & DEBUG_m_FLAG) -# define DEBUG_f_TEST (PL_debug & DEBUG_f_FLAG) -# define DEBUG_r_TEST (PL_debug & DEBUG_r_FLAG) -# define DEBUG_x_TEST (PL_debug & DEBUG_x_FLAG) -# define DEBUG_u_TEST (PL_debug & DEBUG_u_FLAG) -# define DEBUG_L_TEST (PL_debug & DEBUG_L_FLAG) -# define DEBUG_H_TEST (PL_debug & DEBUG_H_FLAG) -# define DEBUG_X_TEST (PL_debug & DEBUG_X_FLAG) -# define DEBUG_D_TEST (PL_debug & DEBUG_D_FLAG) -# define DEBUG_S_TEST (PL_debug & DEBUG_S_FLAG) -# define DEBUG_T_TEST (PL_debug & DEBUG_T_FLAG) -# define DEBUG_R_TEST (PL_debug & DEBUG_R_FLAG) +# define DEBUG_p_TEST DEBUG_p_TEST_ +# define DEBUG_s_TEST DEBUG_s_TEST_ +# define DEBUG_l_TEST DEBUG_l_TEST_ +# define DEBUG_t_TEST DEBUG_t_TEST_ +# define DEBUG_o_TEST DEBUG_o_TEST_ +# define DEBUG_c_TEST DEBUG_c_TEST_ +# define DEBUG_P_TEST DEBUG_P_TEST_ +# define DEBUG_m_TEST DEBUG_m_TEST_ +# define DEBUG_f_TEST DEBUG_f_TEST_ +# define DEBUG_r_TEST DEBUG_r_TEST_ +# define DEBUG_x_TEST DEBUG_x_TEST_ +# define DEBUG_u_TEST DEBUG_u_TEST_ +# define DEBUG_L_TEST DEBUG_L_TEST_ +# define DEBUG_H_TEST DEBUG_H_TEST_ +# define DEBUG_X_TEST DEBUG_X_TEST_ +# define DEBUG_D_TEST DEBUG_D_TEST_ +# define DEBUG_S_TEST DEBUG_S_TEST_ +# define DEBUG_T_TEST DEBUG_T_TEST_ +# define DEBUG_R_TEST DEBUG_R_TEST_ # define DEB(a) a # define DEBUG(a) if (PL_debug) a @@ -2463,16 +2413,12 @@ Gid_t getegid (void); # define DEBUG_c(a) if (DEBUG_c_TEST) a # define DEBUG_P(a) if (DEBUG_P_TEST) a -# if defined(PERL_OBJECT) -# define DEBUG_m(a) if (DEBUG_m_TEST) a -# else /* Temporarily turn off memory debugging in case the a * does memory allocation, either directly or indirectly. */ -# define DEBUG_m(a) \ +# define DEBUG_m(a) \ STMT_START { \ if (PERL_GET_INTERP) { dTHX; if (DEBUG_m_TEST) {PL_debug&=~DEBUG_m_FLAG; a; PL_debug|=DEBUG_m_FLAG;} } \ } STMT_END -# endif # define DEBUG__(t, a) \ STMT_START { \ @@ -2543,7 +2489,7 @@ Gid_t getegid (void); #endif /* DEBUGGING */ -/* These constants should be used in preference to to raw characters +/* These constants should be used in preference to raw characters * when using magic. Note that some perl guts still assume * certain character properties of these constants, namely that * isUPPER() and toLOWER() may do useful mappings. @@ -2568,7 +2514,9 @@ Gid_t getegid (void); #define PERL_MAGIC_nkeys 'k' /* scalar(keys()) lvalue */ #define PERL_MAGIC_dbfile 'L' /* Debugger %_ might have been included somehow */ +#ifdef DEBUGGING +#define assert(what) DEB( { \ + if (!(what)) { \ + Perl_croak(aTHX_ "Assertion " STRINGIFY(what) " failed: file \"%s\", line %d", \ + __FILE__, __LINE__); \ + PerlProc_exit(1); \ + }}) +#else #define assert(what) DEB( { \ if (!(what)) { \ Perl_croak(aTHX_ "Assertion failed: file \"%s\", line %d", \ @@ -2599,6 +2556,7 @@ Gid_t getegid (void); PerlProc_exit(1); \ }}) #endif +#endif struct ufuncs { I32 (*uf_val)(pTHX_ IV, SV*); @@ -2816,6 +2774,7 @@ typedef Sighandler_t Sigsave_t; typedef int (CPERLscope(*runops_proc_t)) (pTHX); +typedef void (CPERLscope(*share_proc_t)) (pTHX_ SV *sv); typedef OP* (CPERLscope(*PPADDR_t)[]) (pTHX); /* _ (for $_) must be first in the following list (DEFSV requires it) */ @@ -3166,7 +3125,6 @@ enum { /* pass one of these to get_vtbl */ #define HINT_STRICT_REFS 0x00000002 #define HINT_LOCALE 0x00000004 #define HINT_BYTES 0x00000008 -#define HINT_BYTES 0x00000008 /* #define HINT_notused10 0x00000010 */ /* Note: 20,40,80 used for NATIVE_HINTS */ @@ -3187,12 +3145,28 @@ enum { /* pass one of these to get_vtbl */ #define HINT_FILETEST_ACCESS 0x00400000 #define HINT_UTF8 0x00800000 -/* Various states of an input record separator SV (rs, nrs) */ +#define HINT_SORT_SORT_BITS 0x000000FF /* allow 256 different ones */ +#define HINT_SORT_QUICKSORT 0x00000001 +#define HINT_SORT_MERGESORT 0x00000002 +#define HINT_SORT_STABLE 0x00000100 /* sort styles (currently one) */ + +/* Various states of the input record separator SV (rs) */ #define RsSNARF(sv) (! SvOK(sv)) #define RsSIMPLE(sv) (SvOK(sv) && (! SvPOK(sv) || SvCUR(sv))) #define RsPARA(sv) (SvPOK(sv) && ! SvCUR(sv)) #define RsRECORD(sv) (SvROK(sv) && (SvIV(SvRV(sv)) > 0)) +/* A struct for keeping various DEBUGGING related stuff, + * neatly packed. Currently only scratch variables for + * constructing debug output are included. Needed always, + * not just when DEBUGGING, though, because of the re extension. c*/ +struct perl_debug_pad { + SV pad[3]; +}; + +#define PERL_DEBUG_PAD(i) &(PL_debug_pad.pad[i]) +#define PERL_DEBUG_PAD_ZERO(i) (sv_setpvn(PERL_DEBUG_PAD(i), "", 0), PERL_DEBUG_PAD(i)) + /* Enable variables which are pointers to functions */ typedef void (CPERLscope(*peep_t))(pTHX_ OP* o); typedef regexp*(CPERLscope(*regcomp_t)) (pTHX_ char* exp, char* xend, PMOP* pm); @@ -3207,12 +3181,12 @@ typedef SV* (CPERLscope(*re_intuit_string_t)) (pTHX_ regexp *prog); typedef void (CPERLscope(*regfree_t)) (pTHX_ struct regexp* r); typedef void (*DESTRUCTORFUNC_NOCONTEXT_t) (void*); -typedef void (*DESTRUCTORFUNC_t) (pTHXo_ void*); -typedef void (*SVFUNC_t) (pTHXo_ SV*); -typedef I32 (*SVCOMPARE_t) (pTHXo_ SV*, SV*); -typedef void (*XSINIT_t) (pTHXo); -typedef void (*ATEXIT_t) (pTHXo_ void*); -typedef void (*XSUBADDR_t) (pTHXo_ CV *); +typedef void (*DESTRUCTORFUNC_t) (pTHX_ void*); +typedef void (*SVFUNC_t) (pTHX_ SV*); +typedef I32 (*SVCOMPARE_t) (pTHX_ SV*, SV*); +typedef void (*XSINIT_t) (pTHX); +typedef void (*ATEXIT_t) (pTHX_ void*); +typedef void (*XSUBADDR_t) (pTHX_ CV *); /* Set up PERLVAR macros for populating structs */ #define PERLVAR(var,type) type var; @@ -3222,7 +3196,7 @@ typedef void (*XSUBADDR_t) (pTHXo_ CV *); /* Interpreter exitlist entry */ typedef struct exitlistentry { - void (*fn) (pTHXo_ void*); + void (*fn) (pTHX_ void*); void *ptr; } PerlExitListEntry; @@ -3244,7 +3218,7 @@ struct perl_vars *PL_VarsPtr; # endif /* PERL_CORE */ #endif /* PERL_GLOBAL_STRUCT */ -#if defined(MULTIPLICITY) || defined(PERL_OBJECT) +#if defined(MULTIPLICITY) /* If we have multiple interpreters define a struct holding variables which must be per-interpreter If we don't have threads anything that would have @@ -3258,7 +3232,7 @@ struct interpreter { # include "intrpvar.h" /* * The following is a buffer where new variables must - * be defined to maintain binary compatibility with PERL_OBJECT + * be defined to maintain binary compatibility with previous versions */ PERLVARA(object_compatibility,30, char) }; @@ -3267,7 +3241,7 @@ PERLVARA(object_compatibility,30, char) struct interpreter { char broiled; }; -#endif /* MULTIPLICITY || PERL_OBJECT */ +#endif /* MULTIPLICITY */ #ifdef USE_5005THREADS /* If we have threads define a struct with all the variables @@ -3307,10 +3281,6 @@ typedef void *Thread; # endif #endif -#ifdef PERL_OBJECT -# define PERL_DECL_PROT -#endif - #undef PERL_CKDEF #undef PERL_PPDEF #define PERL_CKDEF(s) OP *s (pTHX_ OP *o); @@ -3318,14 +3288,8 @@ typedef void *Thread; #include "proto.h" -#ifdef PERL_OBJECT -# undef PERL_DECL_PROT -#endif - -#ifndef PERL_OBJECT /* this has structure inits, so it cannot be included before here */ -# include "opcode.h" -#endif +#include "opcode.h" /* The following must follow proto.h as #defines mess up syntax */ @@ -3343,7 +3307,7 @@ typedef void *Thread; #define PERLVARI(var,type,init) EXT type PL_##var INIT(init); #define PERLVARIC(var,type,init) EXTCONST type PL_##var INIT(init); -#if !defined(MULTIPLICITY) && !defined(PERL_OBJECT) +#if !defined(MULTIPLICITY) START_EXTERN_C # include "intrpvar.h" # ifndef USE_5005THREADS @@ -3352,23 +3316,10 @@ START_EXTERN_C END_EXTERN_C #endif -#ifdef PERL_OBJECT +#if defined(WIN32) +/* Now all the config stuff is setup we can include embed.h */ # include "embed.h" - -# ifdef DOINIT -# include "INTERN.h" -# else -# include "EXTERN.h" -# endif - -/* this has structure inits, so it cannot be included before here */ -# include "opcode.h" - -#else -# if defined(WIN32) -# include "embed.h" -# endif -#endif /* PERL_OBJECT */ +#endif #ifndef PERL_GLOBAL_STRUCT START_EXTERN_C @@ -3387,7 +3338,7 @@ START_EXTERN_C #ifdef DOINIT -EXT MGVTBL PL_vtbl_sv = {MEMBER_TO_FPTR(Perl_magic_get), +EXT MGVTBL PL_vtbl_sv = {MEMBER_TO_FPTR(Perl_magic_get), MEMBER_TO_FPTR(Perl_magic_set), MEMBER_TO_FPTR(Perl_magic_len), 0, 0}; @@ -3406,10 +3357,12 @@ EXT MGVTBL PL_vtbl_sigelem = {MEMBER_TO_FPTR(Perl_magic_getsig), 0, MEMBER_TO_FPTR(Perl_magic_clearsig), 0}; #endif -EXT MGVTBL PL_vtbl_pack = {0, 0, MEMBER_TO_FPTR(Perl_magic_sizepack), MEMBER_TO_FPTR(Perl_magic_wipepack), +EXT MGVTBL PL_vtbl_pack = {0, 0, + MEMBER_TO_FPTR(Perl_magic_sizepack), + MEMBER_TO_FPTR(Perl_magic_wipepack), 0}; EXT MGVTBL PL_vtbl_packelem = {MEMBER_TO_FPTR(Perl_magic_getpack), - MEMBER_TO_FPTR(Perl_magic_setpack), + MEMBER_TO_FPTR(Perl_magic_setpack), 0, MEMBER_TO_FPTR(Perl_magic_clearpack), 0}; EXT MGVTBL PL_vtbl_dbline = {0, MEMBER_TO_FPTR(Perl_magic_setdbline), @@ -3430,12 +3383,14 @@ EXT MGVTBL PL_vtbl_mglob = {0, MEMBER_TO_FPTR(Perl_magic_setmglob), EXT MGVTBL PL_vtbl_nkeys = {MEMBER_TO_FPTR(Perl_magic_getnkeys), MEMBER_TO_FPTR(Perl_magic_setnkeys), 0, 0, 0}; -EXT MGVTBL PL_vtbl_taint = {MEMBER_TO_FPTR(Perl_magic_gettaint),MEMBER_TO_FPTR(Perl_magic_settaint), +EXT MGVTBL PL_vtbl_taint = {MEMBER_TO_FPTR(Perl_magic_gettaint), + MEMBER_TO_FPTR(Perl_magic_settaint), 0, 0, 0}; -EXT MGVTBL PL_vtbl_substr = {MEMBER_TO_FPTR(Perl_magic_getsubstr), MEMBER_TO_FPTR(Perl_magic_setsubstr), +EXT MGVTBL PL_vtbl_substr = {MEMBER_TO_FPTR(Perl_magic_getsubstr), + MEMBER_TO_FPTR(Perl_magic_setsubstr), 0, 0, 0}; EXT MGVTBL PL_vtbl_vec = {MEMBER_TO_FPTR(Perl_magic_getvec), - MEMBER_TO_FPTR(Perl_magic_setvec), + MEMBER_TO_FPTR(Perl_magic_setvec), 0, 0, 0}; EXT MGVTBL PL_vtbl_pos = {MEMBER_TO_FPTR(Perl_magic_getpos), MEMBER_TO_FPTR(Perl_magic_setpos), @@ -3448,9 +3403,11 @@ EXT MGVTBL PL_vtbl_uvar = {MEMBER_TO_FPTR(Perl_magic_getuvar), MEMBER_TO_FPTR(Perl_magic_setuvar), 0, 0, 0}; #ifdef USE_5005THREADS -EXT MGVTBL PL_vtbl_mutex = {0, 0, 0, 0, MEMBER_TO_FPTR(Perl_magic_mutexfree)}; +EXT MGVTBL PL_vtbl_mutex = {0, 0, 0, 0, + MEMBER_TO_FPTR(Perl_magic_mutexfree)}; #endif /* USE_5005THREADS */ -EXT MGVTBL PL_vtbl_defelem = {MEMBER_TO_FPTR(Perl_magic_getdefelem),MEMBER_TO_FPTR(Perl_magic_setdefelem), +EXT MGVTBL PL_vtbl_defelem = {MEMBER_TO_FPTR(Perl_magic_getdefelem), + MEMBER_TO_FPTR(Perl_magic_setdefelem), 0, 0, 0}; EXT MGVTBL PL_vtbl_regexp = {0,0,0,0, MEMBER_TO_FPTR(Perl_magic_freeregexp)}; @@ -3910,6 +3867,83 @@ typedef struct am_table_short AMTS; # endif #endif +/* + * Boilerplate macros for initializing and accessing interpreter-local + * data from C. All statics in extensions should be reworked to use + * this, if you want to make the extension thread-safe. See ext/re/re.xs + * for an example of the use of these macros. + * + * Code that uses these macros is responsible for the following: + * 1. #define MY_CXT_KEY to a unique string, e.g. "DynaLoader_guts" + * 2. Declare a typedef named my_cxt_t that is a structure that contains + * all the data that needs to be interpreter-local. + * 3. Use the START_MY_CXT macro after the declaration of my_cxt_t. + * 4. Use the MY_CXT_INIT macro such that it is called exactly once + * (typically put in the BOOT: section). + * 5. Use the members of the my_cxt_t structure everywhere as + * MY_CXT.member. + * 6. Use the dMY_CXT macro (a declaration) in all the functions that + * access MY_CXT. + */ + +#if defined(PERL_IMPLICIT_CONTEXT) + +/* This must appear in all extensions that define a my_cxt_t structure, + * right after the definition (i.e. at file scope). The non-threads + * case below uses it to declare the data as static. */ +#define START_MY_CXT + +/* Fetches the SV that keeps the per-interpreter data. */ +#define dMY_CXT_SV \ + SV *my_cxt_sv = *hv_fetch(PL_modglobal, MY_CXT_KEY, \ + sizeof(MY_CXT_KEY)-1, TRUE) + +/* This declaration should be used within all functions that use the + * interpreter-local data. */ +#define dMY_CXT \ + dMY_CXT_SV; \ + my_cxt_t *my_cxtp = INT2PTR(my_cxt_t*, SvUV(my_cxt_sv)) + +/* Creates and zeroes the per-interpreter data. + * (We allocate my_cxtp in a Perl SV so that it will be released when + * the interpreter goes away.) */ +#define MY_CXT_INIT \ + dMY_CXT_SV; \ + /* newSV() allocates one more than needed */ \ + my_cxt_t *my_cxtp = (my_cxt_t*)SvPVX(newSV(sizeof(my_cxt_t)-1));\ + Zero(my_cxtp, 1, my_cxt_t); \ + sv_setuv(my_cxt_sv, PTR2UV(my_cxtp)) + +/* This macro must be used to access members of the my_cxt_t structure. + * e.g. MYCXT.some_data */ +#define MY_CXT (*my_cxtp) + +/* Judicious use of these macros can reduce the number of times dMY_CXT + * is used. Use is similar to pTHX, aTHX etc. */ +#define pMY_CXT my_cxt_t *my_cxtp +#define pMY_CXT_ pMY_CXT, +#define _pMY_CXT ,pMY_CXT +#define aMY_CXT my_cxtp +#define aMY_CXT_ aMY_CXT, +#define _aMY_CXT ,aMY_CXT + +#else /* USE_ITHREADS */ + +#define START_MY_CXT static my_cxt_t my_cxt; +#define dMY_CXT_SV dNOOP +#define dMY_CXT dNOOP +#define MY_CXT_INIT NOOP +#define MY_CXT my_cxt + +#define pMY_CXT void +#define pMY_CXT_ +#define _pMY_CXT +#define aMY_CXT +#define aMY_CXT_ +#define _aMY_CXT + +#endif /* !defined(USE_ITHREADS) */ + #ifdef I_FCNTL # include #endif @@ -3938,6 +3972,23 @@ int flock(int fd, int op); # define O_TEXT 0 #endif +#if O_TEXT != O_BINARY + /* If you have different O_TEXT and O_BINARY and you are a CLRF shop, + * that is, you are somehow DOSish. */ +# if defined(__BEOS__) || defined(__VOS__) + /* BeOS has O_TEXT != O_BINARY but O_TEXT and O_BINARY have no effect; + * BeOS is always UNIXoid (LF), not DOSish (CRLF). */ + /* VOS has O_TEXT != O_BINARY, and they have effect, + * but VOS always uses LF, never CRLF. */ + /* If you have O_TEXT different from your O_BINARY but you still are + * not a CRLF shop. */ +# undef PERLIO_USING_CRLF +# else + /* If you really are DOSish. */ +# define PERLIO_USING_CRLF 1 +# endif +#endif + #ifdef IAMSUID #ifdef I_SYS_STATVFS @@ -4002,6 +4053,12 @@ int flock(int fd, int op); #define GROK_NUMERIC_RADIX(sp, send) grok_numeric_radix(sp, send) +/* Input flags: */ +#define PERL_SCAN_ALLOW_UNDERSCORES 0x01 /* grok_??? accept _ in numbers */ +#define PERL_SCAN_DISALLOW_PREFIX 0x02 /* grok_??? reject 0x in hex etc */ +/* Output flags: */ +#define PERL_SCAN_GREATER_THAN_UV_MAX 0x02 /* should this merge with above? */ + /* to let user control profiling */ #ifdef PERL_GPROF_CONTROL extern void moncontrol(int); @@ -4010,6 +4067,30 @@ extern void moncontrol(int); #define PERL_GPROF_MONCONTROL(x) #endif +#ifdef UNDER_CE +#include "wince.h" +#endif + +/* ISO 6429 NEL - C1 control NExt Line */ +/* See http://www.unicode.org/unicode/reports/tr13/ */ +#ifdef EBCDIC /* In EBCDIC NEL is just an alias for LF */ +# if '^' == 95 /* CP 1047: MVS OpenEdition - OS/390 - z/OS */ +# define NEXT_LINE_CHAR 0x15 +# else /* CDRA */ +# define NEXT_LINE_CHAR 0x25 +# endif +#else +# define NEXT_LINE_CHAR 0x85 +#endif + +/* The UTF-8 bytes of the Unicode LS and PS, U+2028 and U+2029 */ +#define UNICODE_LINE_SEPA_0 0xE2 +#define UNICODE_LINE_SEPA_1 0x80 +#define UNICODE_LINE_SEPA_2 0xA8 +#define UNICODE_PARA_SEPA_0 0xE2 +#define UNICODE_PARA_SEPA_1 0x80 +#define UNICODE_PARA_SEPA_2 0xA9 + /* and finally... */ #define PERL_PATCHLEVEL_H_IMPLICIT #include "patchlevel.h" @@ -4019,9 +4100,6 @@ extern void moncontrol(int); NV_PRESERVES_UV - HAS_ICONV - I_ICONV - HAS_MKSTEMP HAS_MKSTEMPS HAS_MKDTEMP @@ -4056,10 +4134,9 @@ extern void moncontrol(int); HAS_NL_LANGINFO - so that Configure picks them up. */ + HAS_DIRFD -#ifdef UNDER_CE -#include "wince.h" -#endif + so that Configure picks them up. */ #endif /* Include guard */ +