Integrate mainline changes into win32 branch. Now would be a good time
[p5sagit/p5-mst-13.2.git] / perl.h
diff --git a/perl.h b/perl.h
index 6af9ff8..a2f5630 100644 (file)
--- a/perl.h
+++ b/perl.h
 
 #include "embed.h"
 
+#undef START_EXTERN_C
+#undef END_EXTERN_C
+#undef EXTERN_C
+#ifdef __cplusplus
+#  define START_EXTERN_C extern "C" {
+#  define END_EXTERN_C }
+#  define EXTERN_C extern "C"
+#else
+#  define START_EXTERN_C 
+#  define END_EXTERN_C 
+#  define EXTERN_C
+#endif
+
+#if defined(USE_THREADS) /* && !defined(PERL_CORE) && !defined(PERLDLL) */
+#ifndef CRIPPLED_CC
+#define CRIPPLED_CC
+#endif
+#endif
+
 #ifdef OP_IN_REGISTER
 #  ifdef __GNUC__
 #    define stringify_immed(s) #s
@@ -63,16 +82,6 @@ register struct op *op asm(stringify(OP_IN_REGISTER));
 #define NOOP (void)0
 
 #define WITH_THR(s) do { dTHR; s; } while (0)
-#ifdef USE_THREADS
-#ifdef FAKE_THREADS
-#include "fakethr.h"
-#else
-#include <pthread.h>
-typedef pthread_mutex_t perl_mutex;
-typedef pthread_cond_t perl_cond;
-typedef pthread_key_t perl_key;
-#endif /* FAKE_THREADS */
-#endif /* USE_THREADS */
 
 /*
  * SOFT_CAST can be used for args to prototyped functions to retain some
@@ -456,6 +465,14 @@ typedef pthread_key_t perl_key;
 #   define SETERRNO(errcode,vmserrcode) errno = (errcode)
 #endif
 
+#ifdef USE_THREADS
+#  define ERRSV (thr->errsv)
+#  define ERRHV (thr->errhv)
+#else
+#  define ERRSV GvSV(errgv)
+#  define ERRHV GvHV(errgv)
+#endif /* USE_THREADS */
+
 #ifndef errno
        extern int errno;     /* ANSI allows errno to be an lvalue expr */
 #endif
@@ -867,11 +884,6 @@ typedef pthread_key_t perl_key;
 
 #endif
 
-/* Digital UNIX defines a typedef CONTEXT when pthreads is in use */ 
-#if defined(__osf__)
-#  define CONTEXT PERL_CONTEXT
-#endif
-
 typedef MEM_SIZE STRLEN;
 
 typedef struct op OP;
@@ -900,7 +912,7 @@ typedef struct regexp REGEXP;
 typedef struct gp GP;
 typedef struct gv GV;
 typedef struct io IO;
-typedef struct context CONTEXT;
+typedef struct context PERL_CONTEXT;
 typedef struct block BLOCK;
 
 typedef struct magic MAGIC;
@@ -944,7 +956,31 @@ typedef I32 (*filter_t) _((int, SV *, int));
 #     include "unixish.h"
 #   endif
 # endif
-#endif
+#endif         
+
+/* 
+ * USE_THREADS needs to be after unixish.h as <pthread.h> includes <sys/signal.h>
+ * which defines NSIG - which will stop inclusion of <signal.h>
+ * this results in many functions being undeclared which bothers C++
+ * May make sense to have threads after "*ish.h" anyway
+ */
+
+#ifdef USE_THREADS
+#  ifdef FAKE_THREADS
+#    include "fakethr.h"
+#  else
+#    ifdef WIN32
+#      include <win32thread.h>
+#    else
+#      include <pthread.h>
+typedef pthread_mutex_t perl_mutex;
+typedef pthread_cond_t perl_cond;
+typedef pthread_key_t perl_key;
+#    endif /* WIN32 */
+#  endif /* FAKE_THREADS */
+#endif /* USE_THREADS */
+
+
   
 #ifdef VMS
 #   define STATUS_NATIVE       statusvalue_vms
@@ -1024,7 +1060,7 @@ union any {
 };
 
 #ifdef USE_THREADS
-#define ARGSproto struct thread *
+#define ARGSproto struct thread *thr
 #else
 #define ARGSproto void
 #endif /* USE_THREADS */
@@ -1116,13 +1152,7 @@ EXT char Error[1];
 #define U_I(what) ((unsigned int)(what))
 #define U_L(what) ((U32)(what))
 #else
-#  ifdef __cplusplus
-    extern "C" {
-#  endif
-U32 cast_ulong _((double));
-#  ifdef __cplusplus
-    }
-#  endif
+EXTERN_C U32 cast_ulong _((double));
 #define U_S(what) ((U16)cast_ulong((double)(what)))
 #define U_I(what) ((unsigned int)cast_ulong((double)(what)))
 #define U_L(what) (cast_ulong((double)(what)))
@@ -1133,15 +1163,11 @@ U32 cast_ulong _((double));
 #define I_V(what) ((IV)(what))
 #define U_V(what) ((UV)(what))
 #else
-#  ifdef __cplusplus
-    extern "C" {
-#  endif
+START_EXTERN_C
 I32 cast_i32 _((double));
 IV cast_iv _((double));
 UV cast_uv _((double));
-#  ifdef __cplusplus
-    }
-#  endif
+END_EXTERN_C
 #define I_32(what) (cast_i32((double)(what)))
 #define I_V(what) (cast_iv((double)(what)))
 #define U_V(what) (cast_uv((double)(what)))
@@ -1246,9 +1272,7 @@ char *strcpy(), *strcat();
 #ifdef I_MATH
 #    include <math.h>
 #else
-#   ifdef __cplusplus
-       extern "C" {
-#   endif
+START_EXTERN_C
            double exp _((double));
            double log _((double));
            double log10 _((double));
@@ -1260,9 +1284,7 @@ char *strcpy(), *strcat();
            double cos _((double));
            double atan2 _((double,double));
            double pow _((double,double));
-#   ifdef __cplusplus
-       };
-#   endif
+END_EXTERN_C
 #endif
 
 #ifndef __cplusplus
@@ -1333,6 +1355,8 @@ int runops_standard _((void));
 int runops_debug _((void));
 #endif
 
+#define PER_THREAD_MAGICALS "123456789&`'+/.,\\\";^-%=|~:\001\005!@"
+
 /****************/
 /* Truly global */
 /****************/
@@ -1349,6 +1373,7 @@ EXT struct thread *       eval_owner;     /* Owner thread for doeval */
 EXT int                        nthreads;       /* Number of threads currently */
 EXT perl_mutex         threads_mutex;  /* Mutex for nthreads and thread list */
 EXT perl_cond          nthreads_cond;  /* Condition variable for nthreads */
+EXT char *             per_thread_magicals INIT(PER_THREAD_MAGICALS);
 #ifdef FAKE_THREADS
 EXT struct thread *    thr;            /* Currently executing (fake) thread */
 #endif
@@ -1356,7 +1381,7 @@ EXT struct thread *       thr;            /* Currently executing (fake) thread */
 
 /* VMS doesn't use environ array and NeXT has problems with crt0.o globals */
 #if !defined(VMS) && !(defined(NeXT) && defined(__DYNAMIC__))
-#ifndef DONT_DECLARE_STD
+#if !defined(DONT_DECLARE_STD) || (defined(__svr4__) && defined(__GNUC__) && defined(sun))
 extern char ** environ;        /* environment variables supplied via exec */
 #endif
 #else
@@ -1643,6 +1668,8 @@ EXTCONST char* block_type[];
 
 #include "perly.h"
 
+#define LEX_NOTPARSING         11      /* borrowed from toke.c */
+
 typedef enum {
     XOPERATOR,
     XTERM,
@@ -1865,6 +1892,7 @@ IEXT AV * Idbargs;        /* args to call listed by caller function */
 IEXT HV *      Idefstash;      /* main symbol table */
 IEXT HV *      Icurstash;      /* symbol table for current package */
 IEXT HV *      Idebstash;      /* symbol table for perldb package */
+IEXT HV *      Iglobalstash;   /* global keyword overrides imported here */
 IEXT SV *      Icurstname;     /* name of current package */
 IEXT AV *      Ibeginav;       /* names of BEGIN subroutines */
 IEXT AV *      Iendav;         /* names of END subroutines */
@@ -1916,12 +1944,11 @@ IEXT OP *       Ieval_start;
 IEXT COP * VOL Icurcop IINIT(&compiling);
 IEXT COP *     Icurcopdb IINIT(NULL);
 IEXT line_t    Icopline IINIT(NOLINE);
-IEXT CONTEXT * Icxstack;
+IEXT PERL_CONTEXT *    Icxstack;
 IEXT I32       Icxstack_ix IINIT(-1);
 IEXT I32       Icxstack_max IINIT(128);
 IEXT JMPENV    Istart_env;     /* empty startup sigjmp() environment */
 IEXT JMPENV *  Itop_env;       /* ptr. to current sigjmp() environment */
-IEXT I32       Irunlevel;
 
 /* stack stuff */
 IEXT AV *      Icurstack;              /* THE STACK */
@@ -1955,6 +1982,11 @@ IEXT int Ilaststatval IINIT(-1);
 IEXT I32       Ilaststype IINIT(OP_STAT);
 IEXT SV *      Imess_sv;
 
+#ifdef USE_THREADS
+/* threads stuff */
+IEXT SV *      Ithrsv;         /* holds struct thread for main thread */
+#endif /* USE_THREADS */
+
 #undef IEXT
 #undef IINIT
 
@@ -1969,10 +2001,7 @@ struct interpreter {
 #include "thread.h"
 #include "pp.h"
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
+START_EXTERN_C
 #include "proto.h"
 
 #ifdef EMBED
@@ -1983,9 +2012,7 @@ extern "C" {
 #define sv_setptrref(rv,ptr) sv_setref_iv(rv,Nullch,(IV)ptr)
 #endif
 
-#ifdef __cplusplus
-};
-#endif
+END_EXTERN_C
 
 /* The following must follow proto.h */
 
@@ -1995,7 +2022,8 @@ EXT MGVTBL vtbl_sv =      {magic_get,
                                magic_set,
                                        magic_len,
                                                0,      0};
-EXT MGVTBL vtbl_env =  {0,     0,      0,      magic_clear_all_env,
+EXT MGVTBL vtbl_env =  {0,     magic_set_all_env,
+                               0,      magic_clear_all_env,
                                                        0};
 EXT MGVTBL vtbl_envelem =      {0,     magic_setenv,
                                        0,      magic_clearenv,
@@ -2014,7 +2042,8 @@ EXT MGVTBL vtbl_packelem =        {magic_getpack,
 EXT MGVTBL vtbl_dbline =       {0,     magic_setdbline,
                                        0,      0,      0};
 EXT MGVTBL vtbl_isa =  {0,     magic_setisa,
-                                       0,      0,      0};
+                                       0,      magic_setisa,
+                                                       0};
 EXT MGVTBL vtbl_isaelem =      {0,     magic_setisa,
                                        0,      0,      0};
 EXT MGVTBL vtbl_arylen =       {magic_getarylen,