This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
combopatch
[perl5.git] / perl.h
diff --git a/perl.h b/perl.h
index ab6477c..617ca51 100644 (file)
--- a/perl.h
+++ b/perl.h
@@ -1,7 +1,7 @@
 /*    perl.h
  *
  *    Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999,
- *    2000, 2001, 2002, 2003, by Larry Wall and others
+ *    2000, 2001, 2002, 2003, 2004, 2005 by Larry Wall and others
  *
  *    You may distribute under the terms of either the GNU General Public
  *    License or the Artistic License, as specified in the README file.
 #  endif
 #endif
 
+#ifdef PERL_GLOBAL_STRUCT_PRIVATE
+#  ifndef PERL_GLOBAL_STRUCT
+#    define PERL_GLOBAL_STRUCT
+#  endif
+#endif
+#ifdef PERL_GLOBAL_STRUCT
+#  ifndef MULTIPLICITY
+#    define MULTIPLICITY
+#  endif
+#endif
+
 /* undef WIN32 when building on Cygwin (for libwin32) - gph */
 #ifdef __CYGWIN__
 #   undef WIN32
 #   undef _WIN32
 #endif
 
-/* Use the reentrant APIs like localtime_r and getpwent_r */
+#if defined(__SYMBIAN32__) || (defined(__VC32__) && defined(WINS))
+#   ifndef SYMBIAN
+#       define SYMBIAN
+#   endif
+#endif
+
+#ifdef SYMBIAN
+#  include "symbian/symbian_proto.h"
+#endif
+
+/* Any stack-challenged places.  The limit varies (and often
+ * is configurable), but using more than a kilobyte of stack
+ * is usually dubious in these systems. */
+#if defined(EPOC) || defined(SYMBIAN)
+/* EPOC/Symbian: need to work around the SDK features. *
+ * On WINS: MS VC5 generates calls to _chkstk,         *
+ * if a "large" stack frame is allocated.              *
+ * gcc on MARM does not generate calls like these.     */
+#   define USE_HEAP_INSTEAD_OF_STACK
+#endif
+
+#/* 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
 #   endif
 #endif
 
+#ifdef PERL_GLOBAL_STRUCT
+#  ifndef PERL_GET_VARS
+#    ifdef PERL_GLOBAL_STRUCT_PRIVATE
+       extern struct perl_vars* Perl_GetVarsPrivate();
+#      define PERL_GET_VARS() Perl_GetVarsPrivate() /* see miniperlmain.c */
+#      ifndef PERLIO_FUNCS_CONST
+#        define PERLIO_FUNCS_CONST /* Can't have these lying around. */
+#      endif
+#    else
+#      define PERL_GET_VARS() PL_VarsPtr
+#    endif
+#  endif
+#endif
+
+#define pVAR    register struct perl_vars* my_vars PERL_UNUSED_DECL
+
+#ifdef PERL_GLOBAL_STRUCT
+#  define dVAR         pVAR    = (struct perl_vars*)PERL_GET_VARS()
+#else
+#  define dVAR         dNOOP
+#endif
+
 #ifdef PERL_IMPLICIT_CONTEXT
 #  ifndef MULTIPLICITY
 #    define MULTIPLICITY
 #  endif
 #  define pTHX register PerlInterpreter *my_perl PERL_UNUSED_DECL
 #  define aTHX my_perl
-#  define dTHXa(a)     pTHX = (PerlInterpreter*)a
-#  define dTHX         pTHX = PERL_GET_THX
+#  ifdef PERL_GLOBAL_STRUCT
+#    define dTHXa(a)   dVAR; pTHX = (PerlInterpreter*)a
+#  else
+#    define dTHXa(a)   pTHX = (PerlInterpreter*)a
+#  endif
+#  ifdef PERL_GLOBAL_STRUCT
+#    define dTHX               dVAR; pTHX = PERL_GET_THX
+#  else
+#    define dTHX               pTHX = PERL_GET_THX
+#  endif
 #  define pTHX_                pTHX,
 #  define aTHX_                aTHX,
 #  define pTHX_1       2       
 #define CALLREG_INTUIT_STRING CALL_FPTR(PL_regint_string)
 #define CALLREGFREE CALL_FPTR(PL_regfree)
 
-#ifdef PERL_FLEXIBLE_EXCEPTIONS
-#  define CALLPROTECT CALL_FPTR(PL_protect)
+#if defined(SYMBIAN) && defined(__GNUC__)
+#  undef __attribute__
+#  undef __attribute__(_arg_)
+#  define HASATTRIBUTE
 #endif
 
 #ifdef HASATTRIBUTE
 #else
 #  define PERL_UNUSED_DECL
 #endif
+#if defined(SYMBIAN) && defined(__GNUC__)
+#  undef __attribute__
+#  undef __attribute__(_arg_)
+#  define HASATTRIBUTE
+#endif
 
 /* gcc -Wall:
  * for silencing unused variables that are actually used most of the time,
 #  define pTHX_4       4
 #endif
 
+#ifndef dVAR
+#  define dVAR         dNOOP
+#endif
+
 /* these are only defined for compatibility; should not be used internally */
 #if !defined(pTHXo) && !defined(PERL_CORE)
 #  define pTHXo                pTHX
  * PerlIO_foo() expands to PL_StdIO->pFOO(PL_StdIO, ...).
  * dTHXs is therefore needed for all functions using PerlIO_foo(). */
 #ifdef PERL_IMPLICIT_SYS
-#  define dTHXs                dTHX
+#  ifdef PERL_GLOBAL_STRUCT_PRIVATE
+#    define dTHXs              dVAR; dTHX
+#  else
+#    define dTHXs              dTHX
+#  endif
 #else
-#  define dTHXs                dNOOP
+#  ifdef PERL_GLOBAL_STRUCT_PRIVATE
+#    define dTHXs              dVAR
+#  else
+#    define dTHXs              dNOOP
+#  endif
 #endif
 
 #undef START_EXTERN_C
 #  define EXTERN_C extern
 #endif
 
+/* Some platforms require marking function declarations
+ * for them to be exportable.  Used in perlio.h, proto.h
+ * is handled either by the makedef.pl or by defining the
+ * PERL_CALLCONV to be something special.  See also the
+ * definition of XS() in XSUB.h. */
+#ifndef PERL_EXPORT_C
+#  define PERL_EXPORT_C extern
+#endif
+#ifndef PERL_XS_EXPORT_C
+#  define PERL_XS_EXPORT_C
+#endif
+
 #ifdef OP_IN_REGISTER
 #  ifdef __GNUC__
 #    define stringify_immed(s) #s
@@ -208,7 +302,9 @@ register struct op *Perl_op asm(stringify(OP_IN_REGISTER));
 #endif
 
 #if defined(__STRICT_ANSI__) && defined(PERL_GCC_PEDANTIC)
-#   define PERL_GCC_BRACE_GROUPS_FORBIDDEN
+#  if !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
+#    define PERL_GCC_BRACE_GROUPS_FORBIDDEN
+#  endif
 #endif
 
 /*
@@ -275,7 +371,7 @@ register struct op *Perl_op asm(stringify(OP_IN_REGISTER));
 #define DOSISH 1
 #endif
 
-#if defined(__STDC__) || defined(vax11c) || defined(_AIX) || defined(__stdc__) || defined(__cplusplus) || defined( EPOC) || defined(NETWARE)
+#if defined(__STDC__) || defined(vax11c) || defined(_AIX) || defined(__stdc__) || defined(__cplusplus) || defined( EPOC) || defined(NETWARE) || defined(SYMBIAN)
 # define STANDARD_C 1
 #endif
 
@@ -437,6 +533,10 @@ register struct op *Perl_op asm(stringify(OP_IN_REGISTER));
 #   include <unistd.h>
 #endif
 
+#ifdef SYMBIAN
+#   undef _SC_ARG_MAX /* Symbian has _SC_ARG_MAX but no sysconf() */
+#endif
+
 #if defined(HAS_SYSCALL) && !defined(HAS_SYSCALL_PROTO) && !defined(PERL_MICRO)
 int syscall(int, ...);
 #endif
@@ -449,6 +549,241 @@ int usleep(unsigned int);
 #  define MYSWAP
 #endif
 
+#ifdef PERL_CORE
+
+/* macros for correct constant construction */
+# if INTSIZE >= 2
+#  define U16_CONST(x) ((U16)x##U)
+# else
+#  define U16_CONST(x) ((U16)x##UL)
+# endif
+
+# if INTSIZE >= 4
+#  define U32_CONST(x) ((U32)x##U)
+# else
+#  define U32_CONST(x) ((U32)x##UL)
+# endif
+
+# ifdef HAS_QUAD
+#  if INTSIZE >= 8
+#   define U64_CONST(x) ((U64)x##U)
+#  elif LONGSIZE >= 8
+#   define U64_CONST(x) ((U64)x##UL)
+#  elif QUADKIND == QUAD_IS_LONG_LONG
+#   define U64_CONST(x) ((U64)x##ULL)
+#  else /* best guess we can make */
+#   define U64_CONST(x) ((U64)x##UL)
+#  endif
+# endif
+
+/* byte-swapping functions for big-/little-endian conversion */
+# define _swab_16_(x) ((U16)( \
+         (((U16)(x) & U16_CONST(0x00ff)) << 8) | \
+         (((U16)(x) & U16_CONST(0xff00)) >> 8) ))
+
+# define _swab_32_(x) ((U32)( \
+         (((U32)(x) & U32_CONST(0x000000ff)) << 24) | \
+         (((U32)(x) & U32_CONST(0x0000ff00)) <<  8) | \
+         (((U32)(x) & U32_CONST(0x00ff0000)) >>  8) | \
+         (((U32)(x) & U32_CONST(0xff000000)) >> 24) ))
+
+# ifdef HAS_QUAD
+#  define _swab_64_(x) ((U64)( \
+          (((U64)(x) & U64_CONST(0x00000000000000ff)) << 56) | \
+          (((U64)(x) & U64_CONST(0x000000000000ff00)) << 40) | \
+          (((U64)(x) & U64_CONST(0x0000000000ff0000)) << 24) | \
+          (((U64)(x) & U64_CONST(0x00000000ff000000)) <<  8) | \
+          (((U64)(x) & U64_CONST(0x000000ff00000000)) >>  8) | \
+          (((U64)(x) & U64_CONST(0x0000ff0000000000)) >> 24) | \
+          (((U64)(x) & U64_CONST(0x00ff000000000000)) >> 40) | \
+          (((U64)(x) & U64_CONST(0xff00000000000000)) >> 56) ))
+# endif
+
+/*----------------------------------------------------------------------------*/
+# if BYTEORDER == 0x1234 || BYTEORDER == 0x12345678  /*     little-endian     */
+/*----------------------------------------------------------------------------*/
+#  define my_htole16(x)                (x)
+#  define my_letoh16(x)                (x)
+#  define my_htole32(x)                (x)
+#  define my_letoh32(x)                (x)
+#  define my_htobe16(x)                _swab_16_(x)
+#  define my_betoh16(x)                _swab_16_(x)
+#  define my_htobe32(x)                _swab_32_(x)
+#  define my_betoh32(x)                _swab_32_(x)
+#  ifdef HAS_QUAD
+#   define my_htole64(x)       (x)
+#   define my_letoh64(x)       (x)
+#   define my_htobe64(x)       _swab_64_(x)
+#   define my_betoh64(x)       _swab_64_(x)
+#  endif
+#  define my_htoles(x)         (x)
+#  define my_letohs(x)         (x)
+#  define my_htolei(x)         (x)
+#  define my_letohi(x)         (x)
+#  define my_htolel(x)         (x)
+#  define my_letohl(x)         (x)
+#  if SHORTSIZE == 1
+#   define my_htobes(x)                (x)
+#   define my_betohs(x)                (x)
+#  elif SHORTSIZE == 2
+#   define my_htobes(x)                _swab_16_(x)
+#   define my_betohs(x)                _swab_16_(x)
+#  elif SHORTSIZE == 4
+#   define my_htobes(x)                _swab_32_(x)
+#   define my_betohs(x)                _swab_32_(x)
+#  elif SHORTSIZE == 8
+#   define my_htobes(x)                _swab_64_(x)
+#   define my_betohs(x)                _swab_64_(x)
+#  else
+#   define PERL_NEED_MY_HTOBES
+#   define PERL_NEED_MY_BETOHS
+#  endif
+#  if INTSIZE == 1
+#   define my_htobei(x)                (x)
+#   define my_betohi(x)                (x)
+#  elif INTSIZE == 2
+#   define my_htobei(x)                _swab_16_(x)
+#   define my_betohi(x)                _swab_16_(x)
+#  elif INTSIZE == 4
+#   define my_htobei(x)                _swab_32_(x)
+#   define my_betohi(x)                _swab_32_(x)
+#  elif INTSIZE == 8
+#   define my_htobei(x)                _swab_64_(x)
+#   define my_betohi(x)                _swab_64_(x)
+#  else
+#   define PERL_NEED_MY_HTOBEI
+#   define PERL_NEED_MY_BETOHI
+#  endif
+#  if LONGSIZE == 1
+#   define my_htobel(x)                (x)
+#   define my_betohl(x)                (x)
+#  elif LONGSIZE == 2
+#   define my_htobel(x)                _swab_16_(x)
+#   define my_betohl(x)                _swab_16_(x)
+#  elif LONGSIZE == 4
+#   define my_htobel(x)                _swab_32_(x)
+#   define my_betohl(x)                _swab_32_(x)
+#  elif LONGSIZE == 8
+#   define my_htobel(x)                _swab_64_(x)
+#   define my_betohl(x)                _swab_64_(x)
+#  else
+#   define PERL_NEED_MY_HTOBEL
+#   define PERL_NEED_MY_BETOHL
+#  endif
+#  define my_htolen(p,n)       NOOP
+#  define my_letohn(p,n)       NOOP
+#  define my_htoben(p,n)       my_swabn(p,n)
+#  define my_betohn(p,n)       my_swabn(p,n)
+/*----------------------------------------------------------------------------*/
+# elif BYTEORDER == 0x4321 || BYTEORDER == 0x87654321  /*     big-endian      */
+/*----------------------------------------------------------------------------*/
+#  define my_htobe16(x)                (x)
+#  define my_betoh16(x)                (x)
+#  define my_htobe32(x)                (x)
+#  define my_betoh32(x)                (x)
+#  define my_htole16(x)                _swab_16_(x)
+#  define my_letoh16(x)                _swab_16_(x)
+#  define my_htole32(x)                _swab_32_(x)
+#  define my_letoh32(x)                _swab_32_(x)
+#  ifdef HAS_QUAD
+#   define my_htobe64(x)       (x)
+#   define my_betoh64(x)       (x)
+#   define my_htole64(x)       _swab_64_(x)
+#   define my_letoh64(x)       _swab_64_(x)
+#  endif
+#  define my_htobes(x)         (x)
+#  define my_betohs(x)         (x)
+#  define my_htobei(x)         (x)
+#  define my_betohi(x)         (x)
+#  define my_htobel(x)         (x)
+#  define my_betohl(x)         (x)
+#  if SHORTSIZE == 1
+#   define my_htoles(x)                (x)
+#   define my_letohs(x)                (x)
+#  elif SHORTSIZE == 2
+#   define my_htoles(x)                _swab_16_(x)
+#   define my_letohs(x)                _swab_16_(x)
+#  elif SHORTSIZE == 4
+#   define my_htoles(x)                _swab_32_(x)
+#   define my_letohs(x)                _swab_32_(x)
+#  elif SHORTSIZE == 8
+#   define my_htoles(x)                _swab_64_(x)
+#   define my_letohs(x)                _swab_64_(x)
+#  else
+#   define PERL_NEED_MY_HTOLES
+#   define PERL_NEED_MY_LETOHS
+#  endif
+#  if INTSIZE == 1
+#   define my_htolei(x)                (x)
+#   define my_letohi(x)                (x)
+#  elif INTSIZE == 2
+#   define my_htolei(x)                _swab_16_(x)
+#   define my_letohi(x)                _swab_16_(x)
+#  elif INTSIZE == 4
+#   define my_htolei(x)                _swab_32_(x)
+#   define my_letohi(x)                _swab_32_(x)
+#  elif INTSIZE == 8
+#   define my_htolei(x)                _swab_64_(x)
+#   define my_letohi(x)                _swab_64_(x)
+#  else
+#   define PERL_NEED_MY_HTOLEI
+#   define PERL_NEED_MY_LETOHI
+#  endif
+#  if LONGSIZE == 1
+#   define my_htolel(x)                (x)
+#   define my_letohl(x)                (x)
+#  elif LONGSIZE == 2
+#   define my_htolel(x)                _swab_16_(x)
+#   define my_letohl(x)                _swab_16_(x)
+#  elif LONGSIZE == 4
+#   define my_htolel(x)                _swab_32_(x)
+#   define my_letohl(x)                _swab_32_(x)
+#  elif LONGSIZE == 8
+#   define my_htolel(x)                _swab_64_(x)
+#   define my_letohl(x)                _swab_64_(x)
+#  else
+#   define PERL_NEED_MY_HTOLEL
+#   define PERL_NEED_MY_LETOHL
+#  endif
+#  define my_htolen(p,n)       my_swabn(p,n)
+#  define my_letohn(p,n)       my_swabn(p,n)
+#  define my_htoben(p,n)       NOOP
+#  define my_betohn(p,n)       NOOP
+/*----------------------------------------------------------------------------*/
+# else /*                       all other byte-orders                         */
+/*----------------------------------------------------------------------------*/
+#  define PERL_NEED_MY_HTOLE16
+#  define PERL_NEED_MY_LETOH16
+#  define PERL_NEED_MY_HTOBE16
+#  define PERL_NEED_MY_BETOH16
+#  define PERL_NEED_MY_HTOLE32
+#  define PERL_NEED_MY_LETOH32
+#  define PERL_NEED_MY_HTOBE32
+#  define PERL_NEED_MY_BETOH32
+#  ifdef HAS_QUAD
+#   define PERL_NEED_MY_HTOLE64
+#   define PERL_NEED_MY_LETOH64
+#   define PERL_NEED_MY_HTOBE64
+#   define PERL_NEED_MY_BETOH64
+#  endif
+#  define PERL_NEED_MY_HTOLES
+#  define PERL_NEED_MY_LETOHS
+#  define PERL_NEED_MY_HTOBES
+#  define PERL_NEED_MY_BETOHS
+#  define PERL_NEED_MY_HTOLEI
+#  define PERL_NEED_MY_LETOHI
+#  define PERL_NEED_MY_HTOBEI
+#  define PERL_NEED_MY_BETOHI
+#  define PERL_NEED_MY_HTOLEL
+#  define PERL_NEED_MY_LETOHL
+#  define PERL_NEED_MY_HTOBEL
+#  define PERL_NEED_MY_BETOHL
+/*----------------------------------------------------------------------------*/
+# endif /*                     end of byte-order macros                       */
+/*----------------------------------------------------------------------------*/
+
+#endif /* PERL_CORE */
+
 /* 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
  */
@@ -465,10 +800,12 @@ int usleep(unsigned int);
 #   define STRUCT_OFFSET(s,m)  (Size_t)(&(((s *)0)->m))
 #endif
 
-#if defined(I_STRING) || defined(__cplusplus)
-#   include <string.h>
-#else
-#   include <strings.h>
+#ifndef SYMBIAN
+#  if defined(I_STRING) || defined(__cplusplus)
+#     include <string.h>
+#  else
+#     include <strings.h>
+#  endif
 #endif
 
 /* This comes after <stdlib.h> so we don't try to change the standard
@@ -516,7 +853,7 @@ int usleep(unsigned int);
 #  define MALLOC_CHECK_TAINT(argc,argv,env)
 #endif /* MYMALLOC */
 
-#define TOO_LATE_FOR_(ch,s)    Perl_croak(aTHX_ "Too late for \"-%c\" option%s", (char)(ch), s)
+#define TOO_LATE_FOR_(ch,what) Perl_croak(aTHX_ "\"-%c\" is on the #! line, it must also be used on the command line%s", (char)(ch), what)
 #define TOO_LATE_FOR(ch)       TOO_LATE_FOR_(ch, "")
 #define MALLOC_TOO_LATE_FOR(ch)        TOO_LATE_FOR_(ch, " with $ENV{PERL_MALLOC_OPT}")
 #define MALLOC_CHECK_TAINT2(argc,argv) MALLOC_CHECK_TAINT(argc,argv,NULL)
@@ -580,7 +917,7 @@ int usleep(unsigned int);
 #    endif
 #  endif
 #  ifdef BUGGY_MSC
-  #  pragma function(memcmp)
+#    pragma function(memcmp)
 #  endif
 #else
 #   ifndef memcmp
@@ -1091,6 +1428,13 @@ typedef UVTYPE UV;
 #  endif
 #endif
 
+#ifndef HAS_QUAD
+# undef PERL_NEED_MY_HTOLE64
+# undef PERL_NEED_MY_LETOH64
+# undef PERL_NEED_MY_HTOBE64
+# undef PERL_NEED_MY_BETOH64
+#endif
+
 #if defined(uts) || defined(UTS)
 #      undef UV_MAX
 #      define UV_MAX (4294967295u)
@@ -1282,6 +1626,7 @@ typedef NVTYPE NV;
 #       define Perl_atan2 atan2l
 #       define Perl_pow powl
 #       define Perl_floor floorl
+#       define Perl_ceil ceill
 #       define Perl_fmod fmodl
 #   endif
 /* e.g. libsunmath doesn't have modfl and frexpl as of mid-March 2000 */
@@ -1290,7 +1635,7 @@ typedef NVTYPE NV;
 /* eg glibc 2.2 series seems to provide modfl on ppc and arm, but has no
    prototype in <math.h> */
 #       ifndef HAS_MODFL_PROTO
-long double modfl(long double, long double *);
+EXTERN_C long double modfl(long double, long double *);
 #      endif
 #   else
 #       if defined(HAS_AINTL) && defined(HAS_COPYSIGNL)
@@ -1352,6 +1697,7 @@ long double modfl(long double, long double *);
 #   define Perl_atan2 atan2
 #   define Perl_pow pow
 #   define Perl_floor floor
+#   define Perl_ceil ceil
 #   define Perl_fmod fmod
 #   define Perl_modf(x,y) modf(x,y)
 #   define Perl_frexp(x,y) frexp(x,y)
@@ -1765,7 +2111,6 @@ 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"
 
 #if defined(USE_LARGE_FILES) && !defined(NO_64_BIT_RAWIO)
@@ -1916,6 +2261,12 @@ typedef struct clone_params CLONE_PARAMS;
 #   define ISHISH "epoc"
 #endif
 
+#ifdef SYMBIAN
+#   include "symbian/symbianish.h"
+#   include "embed.h"
+#   define ISHISH "symbian"
+#endif
+
 #if defined(MACOS_TRADITIONAL)
 #   include "macos/macish.h"
 #   ifndef NO_ENVIRON_ARRAY
@@ -2149,40 +2500,37 @@ typedef pthread_key_t   perl_key;
 
 #ifndef SVf
 #  ifdef CHECK_FORMAT
-#    define SVf "p"
-#    ifndef SVf256
-#      define SVf256 SVf
-#    endif
+#    define SVf "-p"
 #  else
 #    define SVf "_"
 #  endif
 #endif
 
-#ifndef SVf256
-#  define SVf256 ".256"SVf
-#endif
-
-#ifndef UVf
+#ifndef SVf_precision
 #  ifdef CHECK_FORMAT
-#    define UVf UVuf
+#    define SVf_precision(n) "-" n "p"
 #  else
-#    define UVf "Vu"
+#    define SVf_precision(n) "." n "_"
 #  endif
 #endif
 
-#ifndef VDf
-#  ifdef CHECK_FORMAT
-#    define VDf "p"
-#  else
-#    define VDf "vd"
-#  endif
+#ifndef SVf32
+#  define SVf32 SVf_precision("32")
 #endif
 
-#ifndef Nullformat
+#ifndef SVf256
+#  define SVf256 SVf_precision("256")
+#endif
+#ifndef UVf
+#  define UVf UVuf
+#endif
+
+#ifndef DieNull
 #  ifdef CHECK_FORMAT
-#    define Nullformat "%s",""
+#    define DieNull Perl_vdie(aTHX_ Nullch, Null(va_list *))
 #  else
-#    define Nullformat Nullch
+#    define DieNull Perl_die(aTHX_ Nullch)
 #  endif
 #endif
 
@@ -2465,7 +2813,7 @@ long vtohl(long n);
 #endif
 
 #ifndef __cplusplus
-#ifndef UNDER_CE
+#if !(defined(UNDER_CE) || defined(SYMBIAN))
 Uid_t getuid (void);
 Uid_t geteuid (void);
 Gid_t getgid (void);
@@ -2499,6 +2847,7 @@ Gid_t getegid (void);
 #define DEBUG_r_FLAG           0x00000200 /*    512 */
 #define DEBUG_x_FLAG           0x00000400 /*   1024 */
 #define DEBUG_u_FLAG           0x00000800 /*   2048 */
+                                          /*  spare */
 #define DEBUG_H_FLAG           0x00002000 /*   8192 */
 #define DEBUG_X_FLAG           0x00004000 /*  16384 */
 #define DEBUG_D_FLAG           0x00008000 /*  32768 */
@@ -2508,7 +2857,9 @@ Gid_t getegid (void);
 #define DEBUG_J_FLAG           0x00080000 /* 524288 */
 #define DEBUG_v_FLAG           0x00100000 /*1048576 */
 #define DEBUG_C_FLAG           0x00200000 /*2097152 */
-#define DEBUG_MASK             0x003FEFFF /* mask of all the standard flags */
+#define DEBUG_A_FLAG           0x00400000 /*4194304 */
+#define DEBUG_q_FLAG           0x00800000 /*8388608 */
+#define DEBUG_MASK             0x00FFEFFF /* mask of all the standard flags */
 
 #define DEBUG_DB_RECURSE_FLAG  0x40000000
 #define DEBUG_TOP_FLAG         0x80000000 /* XXX what's this for ??? Signal
@@ -2535,13 +2886,12 @@ Gid_t getegid (void);
 #  define DEBUG_J_TEST_ (PL_debug & DEBUG_J_FLAG)
 #  define DEBUG_v_TEST_ (PL_debug & DEBUG_v_FLAG)
 #  define DEBUG_C_TEST_ (PL_debug & DEBUG_C_FLAG)
+#  define DEBUG_A_TEST_ (PL_debug & DEBUG_A_FLAG)
+#  define DEBUG_q_TEST_ (PL_debug & DEBUG_q_FLAG)
 #  define DEBUG_Xv_TEST_ (DEBUG_X_TEST_ && DEBUG_v_TEST_)
 
 #ifdef DEBUGGING
 
-#  undef  YYDEBUG
-#  define YYDEBUG 1
-
 #  define DEBUG_p_TEST DEBUG_p_TEST_
 #  define DEBUG_s_TEST DEBUG_s_TEST_
 #  define DEBUG_l_TEST DEBUG_l_TEST_
@@ -2564,6 +2914,8 @@ Gid_t getegid (void);
 #  define DEBUG_J_TEST DEBUG_J_TEST_
 #  define DEBUG_v_TEST DEBUG_v_TEST_
 #  define DEBUG_C_TEST DEBUG_C_TEST_
+#  define DEBUG_A_TEST DEBUG_A_TEST_
+#  define DEBUG_q_TEST DEBUG_q_TEST_
 
 #  define PERL_DEB(a)                  a
 #  define PERL_DEBUG(a) if (PL_debug)  a
@@ -2602,6 +2954,8 @@ Gid_t getegid (void);
 #  define DEBUG_R(a) DEBUG__(DEBUG_R_TEST, a)
 #  define DEBUG_v(a) DEBUG__(DEBUG_v_TEST, a)
 #  define DEBUG_C(a) DEBUG__(DEBUG_C_TEST, a)
+#  define DEBUG_A(a) DEBUG__(DEBUG_A_TEST, a)
+#  define DEBUG_q(a) DEBUG__(DEBUG_q_TEST, a)
 
 #else /* DEBUGGING */
 
@@ -2627,6 +2981,8 @@ Gid_t getegid (void);
 #  define DEBUG_J_TEST (0)
 #  define DEBUG_v_TEST (0)
 #  define DEBUG_C_TEST (0)
+#  define DEBUG_A_TEST (0)
+#  define DEBUG_q_TEST (0)
 
 #  define PERL_DEB(a)
 #  define PERL_DEBUG(a)
@@ -2651,6 +3007,8 @@ Gid_t getegid (void);
 #  define DEBUG_R(a)
 #  define DEBUG_v(a)
 #  define DEBUG_C(a)
+#  define DEBUG_A(a)
+#  define DEBUG_q(a)
 #endif /* DEBUGGING */
 
 
@@ -2712,24 +3070,13 @@ Gid_t getegid (void);
 #define PERL_MAGIC_ext           '~' /* Available for use by extensions */
 
 
-#define YYMAXDEPTH 300
-
 #ifndef assert  /* <assert.h> might have been included somehow */
-#ifdef DEBUGGING
-#define assert(what)   PERL_DEB( {                                     \
-       if (!(what)) {                                                  \
-           Perl_croak(aTHX_ "Assertion " STRINGIFY(what) " failed: file \"%s\", line %d",      \
-               __FILE__, __LINE__);                                    \
-           PerlProc_exit(1);                                           \
-       }})
-#else
-#define assert(what)   PERL_DEB( {                                     \
-       if (!(what)) {                                                  \
-           Perl_croak(aTHX_ "Assertion failed: file \"%s\", line %d",  \
-               __FILE__, __LINE__);                                    \
-           PerlProc_exit(1);                                           \
-       }})
-#endif
+#define assert(what)   PERL_DEB(                                       \
+       ((what) ? ((void) 0) :                                          \
+           (Perl_croak(aTHX_ "Assertion " STRINGIFY(what) " failed: file \"%s\", line %d",     \
+               __FILE__, __LINE__),                                    \
+           PerlProc_exit(1),                                           \
+           (void) 0)))
 #endif
 
 struct ufuncs {
@@ -2986,7 +3333,7 @@ START_EXTERN_C
 
 /* handy constants */
 EXTCONST char PL_warn_uninit[]
-  INIT("Use of uninitialized value%s%s");
+  INIT("Use of uninitialized value%s%s%s");
 EXTCONST char PL_warn_nosemi[]
   INIT("Semicolon seems to be missing");
 EXTCONST char PL_warn_reserved[]
@@ -2997,6 +3344,8 @@ EXTCONST char PL_no_wrongref[]
   INIT("Can't use %s ref as %s ref");
 EXTCONST char PL_no_symref[]
   INIT("Can't use string (\"%.32s\") as %s ref while \"strict refs\" in use");
+EXTCONST char PL_no_symref_sv[]
+  INIT("Can't use string (\"%" SVf32 "\") as %s ref while \"strict refs\" in use");
 EXTCONST char PL_no_usym[]
   INIT("Can't use an undefined value as %s reference");
 EXTCONST char PL_no_aelem[]
@@ -3019,24 +3368,28 @@ EXTCONST char PL_no_myglob[]
   INIT("\"my\" variable %s can't be in a package");
 EXTCONST char PL_no_localize_ref[]
   INIT("Can't localize through a reference");
+#ifdef PERL_MALLOC_WRAP
+EXTCONST char PL_memory_wrap[]
+  INIT("panic: memory wrap");
+#endif
 
 EXTCONST char PL_uuemap[65]
   INIT("`!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_");
 
 
 #ifdef DOINIT
-EXT char *PL_sig_name[] = { SIG_NAME };
-EXT int   PL_sig_num[]  = { SIG_NUM };
+EXTCONST char* const PL_sig_name[] = { SIG_NAME };
+EXTCONST int         PL_sig_num[]  = { SIG_NUM };
 #else
-EXT char *PL_sig_name[];
-EXT int   PL_sig_num[];
+EXTCONST char* const PL_sig_name[];
+EXTCONST int         PL_sig_num[];
 #endif
 
 /* fast conversion and case folding tables */
 
 #ifdef DOINIT
 #ifdef EBCDIC
-EXT unsigned char PL_fold[] = { /* fast EBCDIC case folding table */
+EXTCONST unsigned char PL_fold[] = { /* fast EBCDIC case folding table */
     0,      1,      2,      3,      4,      5,      6,      7,
     8,      9,      10,     11,     12,     13,     14,     15,
     16,     17,     18,     19,     20,     21,     22,     23,
@@ -3110,8 +3463,9 @@ EXTCONST  unsigned char PL_fold[] = {
 EXTCONST unsigned char PL_fold[];
 #endif
 
+#ifndef PERL_GLOBAL_STRUCT /* or perlvars.h */
 #ifdef DOINIT
-EXT unsigned char PL_fold_locale[] = {
+EXT unsigned char PL_fold_locale[] = { /* Unfortunately not EXTCONST. */
        0,      1,      2,      3,      4,      5,      6,      7,
        8,      9,      10,     11,     12,     13,     14,     15,
        16,     17,     18,     19,     20,     21,     22,     23,
@@ -3146,12 +3500,13 @@ EXT unsigned char PL_fold_locale[] = {
        248,    249,    250,    251,    252,    253,    254,    255
 };
 #else
-EXT unsigned char PL_fold_locale[];
+EXT unsigned char PL_fold_locale[]; /* Unfortunately not EXTCONST. */
 #endif
+#endif /* !PERL_GLOBAL_STRUCT */
 
 #ifdef DOINIT
 #ifdef EBCDIC
-EXT unsigned char PL_freq[] = {/* EBCDIC frequencies for mixed English/C */
+EXTCONST unsigned char PL_freq[] = {/* EBCDIC frequencies for mixed English/C */
     1,      2,      84,     151,    154,    155,    156,    157,
     165,    246,    250,    3,      158,    7,      18,     29,
     40,     51,     62,     73,     85,     96,     107,    118,
@@ -3227,7 +3582,7 @@ EXTCONST unsigned char PL_freq[];
 
 #ifdef DEBUGGING
 #ifdef DOINIT
-EXTCONST char* PL_block_type[] = {
+EXTCONST char* const PL_block_type[] = {
        "NULL",
        "SUB",
        "EVAL",
@@ -3247,6 +3602,23 @@ END_EXTERN_C
 /*****************************************************************************/
 /* XXX This needs to be revisited, since BEGIN makes yacc re-enter... */
 
+#ifdef __Lynx__
+/* LynxOS defines these in scsi.h which is included via ioctl.h */
+#ifdef FORMAT
+#undef FORMAT
+#endif
+#ifdef SPACE
+#undef SPACE
+#endif
+#endif
+
+/* Win32 defines a type 'WORD' in windef.h. This conflicts with the enumerator
+ * 'WORD' defined in perly.h. The yytokentype enum is only a debugging aid, so
+ * it's not really needed.
+ */
+#if defined(WIN32)
+#  define YYTOKENTYPE
+#endif
 #include "perly.h"
 
 #define LEX_NOTPARSING         11      /* borrowed from toke.c */
@@ -3351,7 +3723,9 @@ struct perl_debug_pad {
 };
 
 #define PERL_DEBUG_PAD(i)      &(PL_debug_pad.pad[i])
-#define PERL_DEBUG_PAD_ZERO(i) (SvPVX(PERL_DEBUG_PAD(i))[0] = 0, SvCUR(PERL_DEBUG_PAD(i)) = 0, PERL_DEBUG_PAD(i))
+#define PERL_DEBUG_PAD_ZERO(i) (SvPVX(PERL_DEBUG_PAD(i))[0] = 0, \
+       (((XPV*) SvANY(PERL_DEBUG_PAD(i)))->xpv_cur = 0), \
+       PERL_DEBUG_PAD(i))
 
 /* Enable variables which are pointers to functions */
 typedef void (CPERLscope(*peep_t))(pTHX_ OP* o);
@@ -3379,6 +3753,10 @@ typedef void (*XSUBADDR_t) (pTHX_ CV *);
 #define PERLVARA(var,n,type) type var[n];
 #define PERLVARI(var,type,init) type var;
 #define PERLVARIC(var,type,init) type var;
+#define PERLVARISC(var,init) const char var[sizeof(init)];
+
+typedef OP* (CPERLscope(*Perl_ppaddr_t))(pTHX);
+typedef OP* (CPERLscope(*Perl_check_t)) (pTHX_ OP*);
 
 /* Interpreter exitlist entry */
 typedef struct exitlistentry {
@@ -3386,14 +3764,28 @@ typedef struct exitlistentry {
     void *ptr;
 } PerlExitListEntry;
 
+/* if you only have signal() and it resets on each signal, FAKE_PERSISTENT_SIGNAL_HANDLERS fixes */
+/* These have to be before perlvars.h */
+#if !defined(HAS_SIGACTION) && defined(VMS)
+#  define  FAKE_PERSISTENT_SIGNAL_HANDLERS
+#endif
+/* if we're doing kill() with sys$sigprc on VMS, FAKE_DEFAULT_SIGNAL_HANDLERS */
+#if defined(KILL_BY_SIGPRC)
+#  define  FAKE_DEFAULT_SIGNAL_HANDLERS
+#endif
+
 #ifdef PERL_GLOBAL_STRUCT
 struct perl_vars {
 #  include "perlvars.h"
 };
 
 #  ifdef PERL_CORE
+#    ifndef PERL_GLOBAL_STRUCT_PRIVATE
 EXT struct perl_vars PL_Vars;
 EXT struct perl_vars *PL_VarsPtr INIT(&PL_Vars);
+#      undef PERL_GET_VARS
+#      define PERL_GET_VARS() PL_VarsPtr
+#    endif /* !PERL_GLOBAL_STRUCT_PRIVATE */
 #  else /* PERL_CORE */
 #    if !defined(__GNUC__) || !defined(WIN32)
 EXT
@@ -3434,6 +3826,7 @@ typedef void *Thread;
 #undef PERLVARA
 #undef PERLVARI
 #undef PERLVARIC
+#undef PERLVARISC
 
 /* Types used by pack/unpack */ 
 typedef enum {
@@ -3442,16 +3835,19 @@ typedef enum {
   e_star        /* asterisk   */
 } howlen_t;
 
-typedef struct {
+typedef struct tempsym {
   char*    patptr;   /* current template char */
   char*    patend;   /* one after last char   */
   char*    grpbeg;   /* 1st char of ()-group  */
   char*    grpend;   /* end of ()-group       */
-  I32      code;     /* template code (!)     */
+  I32      code;     /* template code (!<>)   */
   I32      length;   /* length/repeat count   */
   howlen_t howlen;   /* how length is given   */ 
   int      level;    /* () nesting level      */
   U32      flags;    /* /=4, comma=2, pack=1  */
+                     /*   and group modifiers */
+  STRLEN   strbeg;   /* offset of group start */
+  struct tempsym *previous; /* previous group */
 } tempsym_t;
 
 #include "thread.h"
@@ -3495,6 +3891,7 @@ typedef struct {
 #define PERLVARA(var,n,type) EXT type PL_##var[n];
 #define PERLVARI(var,type,init) EXT type  PL_##var INIT(init);
 #define PERLVARIC(var,type,init) EXTCONST type PL_##var INIT(init);
+#define PERLVARISC(var,init) EXTCONST char PL_##var[sizeof(init)] INIT(init);
 
 #if !defined(MULTIPLICITY)
 START_EXTERN_C
@@ -3524,142 +3921,361 @@ END_EXTERN_C
 START_EXTERN_C
 
 #ifdef DOINIT
-
-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};
-EXT MGVTBL PL_vtbl_env =       {0,     MEMBER_TO_FPTR(Perl_magic_set_all_env),
-                               0,      MEMBER_TO_FPTR(Perl_magic_clear_all_env),
-                                                       0};
-EXT MGVTBL PL_vtbl_envelem =   {0,     MEMBER_TO_FPTR(Perl_magic_setenv),
-                                       0,      MEMBER_TO_FPTR(Perl_magic_clearenv),
-                                                       0};
-EXT MGVTBL PL_vtbl_sig =       {0,     0,               0, 0, 0};
-#ifdef PERL_MICRO
-EXT MGVTBL PL_vtbl_sigelem =   {0,     0,               0, 0, 0};
+#  define MGVTBL_SET(var,a,b,c,d,e,f,g) EXTCONST MGVTBL var = {a,b,c,d,e,f,g}
 #else
-EXT MGVTBL PL_vtbl_sigelem =   {MEMBER_TO_FPTR(Perl_magic_getsig),
-                                       MEMBER_TO_FPTR(Perl_magic_setsig),
-                                       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),
-                                                       0};
-EXT MGVTBL PL_vtbl_packelem =  {MEMBER_TO_FPTR(Perl_magic_getpack),
-                                       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),
-                                       0,      0,      0};
-EXT MGVTBL PL_vtbl_isa =       {0,     MEMBER_TO_FPTR(Perl_magic_setisa),
-                                       0,      MEMBER_TO_FPTR(Perl_magic_setisa),
-                                                       0};
-EXT MGVTBL PL_vtbl_isaelem =   {0,     MEMBER_TO_FPTR(Perl_magic_setisa),
-                                       0,      0,      0};
-EXT MGVTBL PL_vtbl_arylen =    {MEMBER_TO_FPTR(Perl_magic_getarylen),
-                               MEMBER_TO_FPTR(Perl_magic_setarylen),
-                                       0,      0,      0};
-EXT MGVTBL PL_vtbl_glob =      {MEMBER_TO_FPTR(Perl_magic_getglob),
-                               MEMBER_TO_FPTR(Perl_magic_setglob),
-                                       0,      0,      0};
-EXT MGVTBL PL_vtbl_mglob =     {0,     MEMBER_TO_FPTR(Perl_magic_setmglob),
-                                       0,      0,      0};
-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),
-                                       0,      0,      0};
-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),
-                                       0,      0,      0};
-EXT MGVTBL PL_vtbl_pos =       {MEMBER_TO_FPTR(Perl_magic_getpos),
-                               MEMBER_TO_FPTR(Perl_magic_setpos),
-                                       0,      0,      0};
-EXT MGVTBL PL_vtbl_bm =        {0,     MEMBER_TO_FPTR(Perl_magic_setbm),
-                                       0,      0,      0};
-EXT MGVTBL PL_vtbl_fm =        {0,     MEMBER_TO_FPTR(Perl_magic_setfm),
-                                       0,      0,      0};
-EXT MGVTBL PL_vtbl_uvar =      {MEMBER_TO_FPTR(Perl_magic_getuvar),
-                               MEMBER_TO_FPTR(Perl_magic_setuvar),
-                                       0,      0,      0};
-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, MEMBER_TO_FPTR(Perl_magic_setregexp),0,0, MEMBER_TO_FPTR(Perl_magic_freeregexp)};
-EXT MGVTBL PL_vtbl_regdata = {0, 0, MEMBER_TO_FPTR(Perl_magic_regdata_cnt), 0, 0};
-EXT MGVTBL PL_vtbl_regdatum = {MEMBER_TO_FPTR(Perl_magic_regdatum_get),
-                              MEMBER_TO_FPTR(Perl_magic_regdatum_set), 0, 0, 0};
+#  define MGVTBL_SET(var,a,b,c,d,e,f,g) EXTCONST MGVTBL var
+#endif
+
+MGVTBL_SET(
+    PL_vtbl_sv,
+    MEMBER_TO_FPTR(Perl_magic_get),
+    MEMBER_TO_FPTR(Perl_magic_set),
+    MEMBER_TO_FPTR(Perl_magic_len),
+    NULL,
+    NULL,
+    NULL,
+    NULL
+);
+
+MGVTBL_SET(
+    PL_vtbl_env,
+    NULL,
+    MEMBER_TO_FPTR(Perl_magic_set_all_env),
+    NULL,
+    MEMBER_TO_FPTR(Perl_magic_clear_all_env),
+    NULL,
+    NULL,
+    NULL
+);
+
+MGVTBL_SET(
+    PL_vtbl_envelem,
+    NULL,
+    MEMBER_TO_FPTR(Perl_magic_setenv),
+    NULL,
+    MEMBER_TO_FPTR(Perl_magic_clearenv),
+    NULL,
+    NULL,
+    NULL
+);
+
+MGVTBL_SET(
+    PL_vtbl_sig,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL
+);
 
-#ifdef USE_LOCALE_COLLATE
-EXT MGVTBL PL_vtbl_collxfrm = {0,
-                               MEMBER_TO_FPTR(Perl_magic_setcollxfrm),
-                                       0,      0,      0};
-#endif
-
-EXT MGVTBL PL_vtbl_amagic =       {0,     MEMBER_TO_FPTR(Perl_magic_setamagic),
-                                        0,      0,      MEMBER_TO_FPTR(Perl_magic_setamagic)};
-EXT MGVTBL PL_vtbl_amagicelem =   {0,     MEMBER_TO_FPTR(Perl_magic_setamagic),
-                                        0,      0,      MEMBER_TO_FPTR(Perl_magic_setamagic)};
-
-EXT MGVTBL PL_vtbl_backref =     {0,   0,
-                                       0,      0,      MEMBER_TO_FPTR(Perl_magic_killbackrefs)};
-
-EXT MGVTBL PL_vtbl_ovrld   =     {0,   0,
-                                       0,      0,      MEMBER_TO_FPTR(Perl_magic_freeovrld)};
-
-EXT MGVTBL PL_vtbl_utf8 = {0,
-                               MEMBER_TO_FPTR(Perl_magic_setutf8),
-                                       0,      0,      0};
-
-#else /* !DOINIT */
-
-EXT MGVTBL PL_vtbl_sv;
-EXT MGVTBL PL_vtbl_env;
-EXT MGVTBL PL_vtbl_envelem;
-EXT MGVTBL PL_vtbl_sig;
-EXT MGVTBL PL_vtbl_sigelem;
-EXT MGVTBL PL_vtbl_pack;
-EXT MGVTBL PL_vtbl_packelem;
-EXT MGVTBL PL_vtbl_dbline;
-EXT MGVTBL PL_vtbl_isa;
-EXT MGVTBL PL_vtbl_isaelem;
-EXT MGVTBL PL_vtbl_arylen;
-EXT MGVTBL PL_vtbl_glob;
-EXT MGVTBL PL_vtbl_mglob;
-EXT MGVTBL PL_vtbl_nkeys;
-EXT MGVTBL PL_vtbl_taint;
-EXT MGVTBL PL_vtbl_substr;
-EXT MGVTBL PL_vtbl_vec;
-EXT MGVTBL PL_vtbl_pos;
-EXT MGVTBL PL_vtbl_bm;
-EXT MGVTBL PL_vtbl_fm;
-EXT MGVTBL PL_vtbl_uvar;
-EXT MGVTBL PL_vtbl_ovrld;
-
-EXT MGVTBL PL_vtbl_defelem;
-EXT MGVTBL PL_vtbl_regexp;
-EXT MGVTBL PL_vtbl_regdata;
-EXT MGVTBL PL_vtbl_regdatum;
+#ifdef PERL_MICRO
+MGVTBL_SET(
+    PL_vtbl_sigelem,
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL
+);
 
+#else
+MGVTBL_SET(
+    PL_vtbl_sigelem,
+    MEMBER_TO_FPTR(Perl_magic_getsig),
+    MEMBER_TO_FPTR(Perl_magic_setsig),
+    NULL,
+    MEMBER_TO_FPTR(Perl_magic_clearsig),
+    NULL,
+    NULL,
+    NULL
+);
+#endif
+
+MGVTBL_SET(
+    PL_vtbl_pack,
+    NULL,
+    NULL,
+    MEMBER_TO_FPTR(Perl_magic_sizepack),
+    MEMBER_TO_FPTR(Perl_magic_wipepack),
+    NULL,
+    NULL,
+    NULL
+);
+
+MGVTBL_SET(
+    PL_vtbl_packelem,
+    MEMBER_TO_FPTR(Perl_magic_getpack),
+    MEMBER_TO_FPTR(Perl_magic_setpack),
+    NULL,
+    MEMBER_TO_FPTR(Perl_magic_clearpack),
+    NULL,
+    NULL,
+    NULL
+);
+
+MGVTBL_SET(
+    PL_vtbl_dbline,
+    NULL,
+    MEMBER_TO_FPTR(Perl_magic_setdbline),
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL
+);
+
+MGVTBL_SET(
+    PL_vtbl_isa,
+    NULL,
+    MEMBER_TO_FPTR(Perl_magic_setisa),
+    NULL,
+    MEMBER_TO_FPTR(Perl_magic_setisa),
+    NULL,
+    NULL,
+    NULL
+);
+
+MGVTBL_SET(
+    PL_vtbl_isaelem,
+    NULL,
+    MEMBER_TO_FPTR(Perl_magic_setisa),
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL
+);
+
+MGVTBL_SET(
+    PL_vtbl_arylen,
+    MEMBER_TO_FPTR(Perl_magic_getarylen),
+    MEMBER_TO_FPTR(Perl_magic_setarylen),
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL
+);
+
+MGVTBL_SET(
+    PL_vtbl_glob,
+    MEMBER_TO_FPTR(Perl_magic_getglob),
+    MEMBER_TO_FPTR(Perl_magic_setglob),
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL
+);
+
+MGVTBL_SET(
+    PL_vtbl_mglob,
+    NULL,
+    MEMBER_TO_FPTR(Perl_magic_setmglob),
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL
+);
+
+MGVTBL_SET(
+    PL_vtbl_nkeys,
+    MEMBER_TO_FPTR(Perl_magic_getnkeys),
+    MEMBER_TO_FPTR(Perl_magic_setnkeys),
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL
+);
+
+MGVTBL_SET(
+    PL_vtbl_taint,
+    MEMBER_TO_FPTR(Perl_magic_gettaint),
+    MEMBER_TO_FPTR(Perl_magic_settaint),
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL
+);
+
+MGVTBL_SET(
+    PL_vtbl_substr,
+    MEMBER_TO_FPTR(Perl_magic_getsubstr),
+    MEMBER_TO_FPTR(Perl_magic_setsubstr),
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL
+);
+
+MGVTBL_SET(
+    PL_vtbl_vec,
+    MEMBER_TO_FPTR(Perl_magic_getvec),
+    MEMBER_TO_FPTR(Perl_magic_setvec),
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL
+);
+
+MGVTBL_SET(
+    PL_vtbl_pos,
+    MEMBER_TO_FPTR(Perl_magic_getpos),
+    MEMBER_TO_FPTR(Perl_magic_setpos),
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL
+);
+
+MGVTBL_SET(
+    PL_vtbl_bm,
+    NULL,
+    MEMBER_TO_FPTR(Perl_magic_setbm),
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL
+);
+
+MGVTBL_SET(
+    PL_vtbl_fm,
+    NULL,
+    MEMBER_TO_FPTR(Perl_magic_setfm),
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL
+);
+
+MGVTBL_SET(
+    PL_vtbl_uvar,
+    MEMBER_TO_FPTR(Perl_magic_getuvar),
+    MEMBER_TO_FPTR(Perl_magic_setuvar),
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL
+);
+
+MGVTBL_SET(
+    PL_vtbl_defelem,
+    MEMBER_TO_FPTR(Perl_magic_getdefelem),
+    MEMBER_TO_FPTR(Perl_magic_setdefelem),
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL
+);
+
+MGVTBL_SET(
+    PL_vtbl_regexp,
+    NULL,
+    MEMBER_TO_FPTR(Perl_magic_setregexp),
+    NULL,
+    NULL,
+    MEMBER_TO_FPTR(Perl_magic_freeregexp),
+    NULL,
+    NULL
+);
+
+MGVTBL_SET(
+    PL_vtbl_regdata,
+    NULL,
+    NULL,
+    MEMBER_TO_FPTR(Perl_magic_regdata_cnt),
+    NULL,
+    NULL,
+    NULL,
+    NULL
+);
+
+MGVTBL_SET(
+    PL_vtbl_regdatum,
+    MEMBER_TO_FPTR(Perl_magic_regdatum_get),
+    MEMBER_TO_FPTR(Perl_magic_regdatum_set),
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL
+);
+
+MGVTBL_SET(
+    PL_vtbl_amagic,
+    NULL,
+    MEMBER_TO_FPTR(Perl_magic_setamagic),
+    NULL,
+    NULL,
+    MEMBER_TO_FPTR(Perl_magic_setamagic),
+    NULL,
+    NULL
+);
+
+MGVTBL_SET(
+    PL_vtbl_amagicelem,
+    NULL,
+    MEMBER_TO_FPTR(Perl_magic_setamagic),
+    NULL,
+    NULL,
+    MEMBER_TO_FPTR(Perl_magic_setamagic),
+    NULL,
+    NULL
+);
+
+MGVTBL_SET(
+    PL_vtbl_backref,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    MEMBER_TO_FPTR(Perl_magic_killbackrefs),
+    NULL,
+    NULL
+);
+
+MGVTBL_SET(
+    PL_vtbl_ovrld,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    MEMBER_TO_FPTR(Perl_magic_freeovrld),
+    NULL,
+    NULL
+);
+
+MGVTBL_SET(
+    PL_vtbl_utf8,
+    NULL,
+    MEMBER_TO_FPTR(Perl_magic_setutf8),
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL
+);
 #ifdef USE_LOCALE_COLLATE
-EXT MGVTBL PL_vtbl_collxfrm;
+MGVTBL_SET(
+    PL_vtbl_collxfrm,
+    NULL,
+    MEMBER_TO_FPTR(Perl_magic_setcollxfrm),
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL
+);
 #endif
 
-EXT MGVTBL PL_vtbl_amagic;
-EXT MGVTBL PL_vtbl_amagicelem;
-
-EXT MGVTBL PL_vtbl_backref;
-EXT MGVTBL PL_vtbl_utf8;
-
-#endif /* !DOINIT */
 
 enum {
   fallback_amg,        abs_amg,
@@ -3700,10 +4316,10 @@ enum {
 };
 
 #define NofAMmeth max_amg_code
-#define AMG_id2name(id) ((char*)PL_AMG_names[id]+1)
+#define AMG_id2name(id) (PL_AMG_names[id]+1)
 
 #ifdef DOINIT
-EXTCONST char * PL_AMG_names[NofAMmeth] = {
+EXTCONST char * const PL_AMG_names[NofAMmeth] = {
   /* Names kept in the symbol table.  fallback => "()", the rest has
      "(" prepended.  The only other place in perl which knows about
      this convention is AMG_id2name (used for debugging output and
@@ -4010,7 +4626,7 @@ typedef struct am_table_short AMTS;
        new_chunk_size = (chunk_size);                     \
        if (new_chunk_size > PL_nice_chunk_size) {         \
            if (PL_nice_chunk) Safefree(PL_nice_chunk);    \
-           PL_nice_chunk = new_chunk;                     \
+           PL_nice_chunk = (char *) new_chunk;            \
            PL_nice_chunk_size = new_chunk_size;           \
        } else {                                           \
            Safefree(chunk);                               \
@@ -4098,6 +4714,13 @@ typedef struct am_table_short AMTS;
        Zero(my_cxtp, 1, my_cxt_t);                                     \
        sv_setuv(my_cxt_sv, PTR2UV(my_cxtp))
 
+/* Clones the per-interpreter data. */
+#define MY_CXT_CLONE \
+       dMY_CXT_SV;                                                     \
+       my_cxt_t *my_cxtp = (my_cxt_t*)SvPVX(newSV(sizeof(my_cxt_t)-1));\
+       Copy(INT2PTR(my_cxt_t*, SvUV(my_cxt_sv)), 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)
@@ -4117,6 +4740,7 @@ typedef struct am_table_short AMTS;
 #define dMY_CXT_SV     dNOOP
 #define dMY_CXT                dNOOP
 #define MY_CXT_INIT    NOOP
+#define MY_CXT_CLONE   NOOP
 #define MY_CXT         my_cxt
 
 #define pMY_CXT                void
@@ -4132,6 +4756,10 @@ typedef struct am_table_short AMTS;
 #  include <fcntl.h>
 #endif
 
+#ifdef __Lynx__
+#  include <fcntl.h>
+#endif
+
 #ifdef I_SYS_FILE
 #  include <sys/file.h>
 #endif
@@ -4216,6 +4844,19 @@ int flock(int fd, int op);
 #   define PERL_MOUNT_NOSUID M_NOSUID
 #endif
 
+#if !defined(PERL_MOUNT_NOEXEC) && defined(MOUNT_NOEXEC)
+#    define PERL_MOUNT_NOEXEC MOUNT_NOEXEC
+#endif
+#if !defined(PERL_MOUNT_NOEXEC) && defined(MNT_NOEXEC)
+#    define PERL_MOUNT_NOEXEC MNT_NOEXEC
+#endif
+#if !defined(PERL_MOUNT_NOEXEC) && defined(MS_NOEXEC)
+#   define PERL_MOUNT_NOEXEC MS_NOEXEC
+#endif
+#if !defined(PERL_MOUNT_NOEXEC) && defined(M_NOEXEC)
+#   define PERL_MOUNT_NOEXEC M_NOEXEC
+#endif
+
 #endif /* IAMSUID */
 
 #ifdef I_LIBUTIL
@@ -4280,6 +4921,14 @@ extern void moncontrol(int);
 #  define PIPESOCK_MODE
 #endif
 
+#ifndef SOCKET_OPEN_MODE
+#  define SOCKET_OPEN_MODE     PIPESOCK_MODE
+#endif
+
+#ifndef PIPE_OPEN_MODE
+#  define PIPE_OPEN_MODE       PIPESOCK_MODE
+#endif
+
 #define PERL_MAGIC_UTF8_CACHESIZE      2
 
 #define PERL_UNICODE_STDIN_FLAG                        0x0001