This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
[asperl] integrate mainline changes (untested)
authorGurusamy Sarathy <gsar@cpan.org>
Mon, 18 May 1998 09:40:58 +0000 (09:40 +0000)
committerGurusamy Sarathy <gsar@cpan.org>
Mon, 18 May 1998 09:40:58 +0000 (09:40 +0000)
p4raw-id: //depot/asperl@1010

48 files changed:
1  2 
MANIFEST
XSUB.h
bytecode.h
byterun.c
doio.c
dump.c
embed.h
embedvar.h
global.sym
gv.c
hv.c
installperl
interp.sym
intrpvar.h
lib/ExtUtils/MM_Unix.pm
lib/ExtUtils/MakeMaker.pm
lib/ExtUtils/Mksymlists.pm
mg.c
op.c
op.h
opcode.h
perl.c
perl.h
pp.c
pp_ctl.c
pp_hot.c
pp_sys.c
proto.h
regcomp.c
regcomp.h
regexec.c
sv.c
sv.h
thread.h
toke.c
util.c
vms/vms.c
win32/Makefile
win32/config.bc
win32/config.gc
win32/config.vc
win32/config_H.bc
win32/config_H.gc
win32/config_H.vc
win32/makedef.pl
win32/makefile.mk
win32/win32.c
win32/win32.h

diff --cc MANIFEST
Simple merge
diff --cc XSUB.h
Simple merge
diff --cc bytecode.h
Simple merge
diff --cc byterun.c
Simple merge
diff --cc doio.c
--- 1/doio.c
--- 2/doio.c
+++ b/doio.c
@@@ -1063,9 -1120,12 +1120,12 @@@ apply(I32 type, register SV **mark, reg
        if (sp - mark > 2) {
            val = SvIVx(*++mark);
            val2 = SvIVx(*++mark);
+           APPLY_TAINT_PROPER();
            tot = sp - mark;
            while (++mark <= sp) {
-               if (PerlLIO_chown(SvPVx(*mark, na),val,val2))
+               char *name = SvPVx(*mark, na);
+               APPLY_TAINT_PROPER();
 -              if (chown(name, val, val2))
++              if (PerlLIO_chown(name, val, val2))
                    tot--;
            }
        }
diff --cc dump.c
Simple merge
diff --cc embed.h
Simple merge
diff --cc embedvar.h
Simple merge
diff --cc global.sym
Simple merge
diff --cc gv.c
--- 1/gv.c
--- 2/gv.c
+++ b/gv.c
@@@ -102,9 -110,30 +110,30 @@@ gv_init(GV *gv, HV *stash, char *name, 
      GvNAMELEN(gv) = len;
      if (multi)
        GvMULTI_on(gv);
+     if (doproto) {                    /* Replicate part of newSUB here. */
+       ENTER;
+       start_subparse(0,0);            /* Create CV in compcv. */
+       GvCV(gv) = compcv;
+       LEAVE;
+       GvCVGEN(gv) = 0;
+       sub_generation++;
+       CvGV(GvCV(gv)) = (GV*)SvREFCNT_inc(gv);
+       CvFILEGV(GvCV(gv)) = curcop->cop_filegv;
+       CvSTASH(GvCV(gv)) = curstash;
+ #ifdef USE_THREADS
+       CvOWNER(GvCV(gv)) = 0;
+       New(666, CvMUTEXP(GvCV(gv)), 1, perl_mutex);
+       MUTEX_INIT(CvMUTEXP(GvCV(gv)));
+ #endif /* USE_THREADS */
+       if (proto) {
+           sv_setpv((SV*)GvCV(gv), proto);
+           Safefree(proto);
+       }
+     }
  }
  
 -static void
 +STATIC void
  gv_init_sv(GV *gv, I32 sv_type)
  {
      switch (sv_type) {
diff --cc hv.c
Simple merge
diff --cc installperl
Simple merge
diff --cc interp.sym
@@@ -65,9 -57,9 +65,10 @@@ in_eva
  incgv
  initav
  inplace
+ sys_intern
  last_in_gv
  lastfd
 +lastgotoprobe
  lastscream
  lastsize
  lastspbase
diff --cc intrpvar.h
@@@ -152,66 -151,15 +151,75 @@@ PERLVAR(Iors,           char *)         /* $\ *
  PERLVAR(Iorslen,      STRLEN)         
  PERLVAR(Iofmt,                char *)         /* $# */
  
+ /* interpreter atexit processing */
+ PERLVARI(Iexitlist,   PerlExitListEntry *, NULL)      /* list of exit functions */
+ PERLVARI(Iexitlistlen,        I32, 0)                         /* length of same */
+ PERLVAR(Imodglobal,   HV *)                           /* per-interp module data */
+ #ifdef HAVE_INTERP_INTERN
+ PERLVAR(Isys_intern,  struct interp_intern)           /* platform internals */
+ #endif
 +/* more statics moved here */
 +PERLVAR(Imh,          HE)             /* from hv.c */
 +PERLVAR(Imodcount,    I32)            /* from op.c */
 +PERLVARI(Igeneration, int,    100)    /* from op.c */
 +PERLVAR(IDBcv,                CV *)           /* from perl.c */
 +PERLVAR(Iarchpat_auto,        char*)          /* from perl.c */
 +PERLVAR(Isortcxix,    I32)            /* from pp_ctl.c */
 +PERLVAR(Ilastgotoprobe,       OP*)            /* from pp_ctl.c */
 +PERLVAR(Iregdummy,    regnode)        /* from regcomp.c */
 +PERLVAR(Iregparse,    char*)          /* Input-scan pointer. */
 +PERLVAR(Iregxend,     char*)          /* End of input for compile */
 +PERLVAR(Iregcode,     regnode*)       /* Code-emit pointer; &regdummy = don't. */
 +PERLVAR(Iregnaughty,  I32)            /* How bad is this pattern? */
 +PERLVAR(Iregsawback,  I32)            /* Did we see \1, ...? */
 +
 +/* This guys appear both in regcomp.c and regexec.c, */
 +PERLVAR(Iregprecomp,  char *)         /* uncompiled string. */
 +PERLVAR(Iregnpar,     I32)            /* () count. */
 +PERLVAR(Iregsize,     I32)            /* Code size. */
 +PERLVAR(Iregflags,    U16)            /* are we folding, multilining? */
 +
 +PERLVAR(Iregseen,     U32)            /* from regcomp.c */
 +PERLVAR(Iseen_zerolen,        I32)            /* from regcomp.c */
 +PERLVAR(Irx,          regexp *)       /* from regcomp.c */
 +PERLVAR(Iextralen,    I32)            /* from regcomp.c */
 +#ifdef DEBUGGING
 +PERLVAR(Icolorset,    int)            /* from regcomp.c */
 +PERLVAR(Icolors[4],   char *)         /* from regcomp.c */
 +#endif 
 +
 +PERLVAR(Ireginput,    char *)         /* String-input pointer. */
 +PERLVAR(Iregbol,      char *)         /* Beginning of input, for ^ check. */
 +PERLVAR(Iregeol,      char *)         /* End of input, for $ check. */
 +PERLVAR(Iregstartp,   char **)        /* Pointer to startp array. */
 +PERLVAR(Iregendp,     char **)        /* Ditto for endp. */
 +PERLVAR(Ireglastparen,        U32 *)          /* Similarly for lastparen. */
 +PERLVAR(Iregtill,     char *)         /* How far we are required to go. */
 +PERLVAR(Iregprev,     char)           /* char before regbol, \n if none */
 +
 +PERLVAR(Ireg_start_tmp,       char **)        /* from regexec.c */
 +PERLVAR(Ireg_start_tmpl,U32)          /* from regexec.c */
 +PERLVAR(Iregdata,     struct reg_data *) /* from regexec.c renamed was data */
 +PERLVAR(Ibostr,               char *)         /* from regexec.c */
 +PERLVAR(Ireg_flags,   U32)            /* from regexec.c */
 +PERLVAR(Ireg_eval_set,        I32)            /* from regexec.c */
 +
 +#ifdef DEBUGGING
 +PERLVAR(Iregnarrate,  I32)            /* from regexec.c */
 +PERLVAR(Iregprogram,  regnode *)      /* from regexec.c */
 +PERLVARI(Iregindent,  int,        0)  /* from regexec.c */
 +#endif
 +
 +PERLVAR(Iregcc,               CURCUR *)       /* from regexec.c */
 +PERLVARI(Iin_clean_objs,bool,     FALSE)  /* from sv.c */
 +PERLVARI(Iin_clean_all,       bool,       FALSE)  /* from sv.c */
 +
 +PERLVAR(Ilinestart,   char *)         /* beg. of most recently read line */
 +PERLVAR(Ipending_ident,       char)           /* pending identifier lookup */
 +PERLVAR(Isublex_info, SUBLEXINFO)     /* from toke.c */
 +
  #ifdef USE_THREADS
  PERLVAR(Ithrsv,               SV *)           /* holds struct perl_thread for main thread */
  PERLVARI(Ithreadnum,  U32,    0)      /* incremented each thread creation */
Simple merge
Simple merge
Simple merge
diff --cc mg.c
Simple merge
diff --cc op.c
Simple merge
diff --cc op.h
Simple merge
diff --cc opcode.h
Simple merge
diff --cc perl.c
--- 1/perl.c
--- 2/perl.c
+++ b/perl.c
@@@ -85,22 -84,13 +85,23 @@@ static void init_postdump_symbols _((in
  static void init_predump_symbols _((void));
  static void my_exit_jump _((void)) __attribute__((noreturn));
  static void nuke_stacks _((void));
 -static void open_script _((char *, bool, SV *));
 +static void open_script _((char *, bool, SV *, int *fd));
  static void usage _((char *));
 -static void validate_suid _((char *, char*));
 +static void validate_suid _((char *, char*, int));
+ static I32 read_e_script _((int idx, SV *buf_sv, int maxlen));
 +#endif
  
 -static int fdscript = -1;
 +#ifdef PERL_OBJECT
 +CPerlObj* perl_alloc(IPerlMem* ipM, IPerlEnv* ipE, IPerlStdIO* ipStd,
 +                                           IPerlLIO* ipLIO, IPerlDir* ipD, IPerlSock* ipS, IPerlProc* ipP)
 +{
 +    CPerlObj* pPerl = new(ipM) CPerlObj(ipM, ipE, ipStd, ipLIO, ipD, ipS, ipP);
 +    if(pPerl != NULL)
 +      pPerl->Init();
  
 +    return pPerl;
 +}
 +#else
  PerlInterpreter *
  perl_alloc(void)
  {
@@@ -586,15 -555,19 +591,24 @@@ perl_free(PerlInterpreter *sv_interp
      if (!(curinterp = sv_interp))
        return;
      Safefree(sv_interp);
 +#endif
  }
  
+ void
+ perl_atexit(void (*fn) (void *), void *ptr)
+ {
+     Renew(exitlist, exitlistlen+1, PerlExitListEntry);
+     exitlist[exitlistlen].fn = fn;
+     exitlist[exitlistlen].ptr = ptr;
+     ++exitlistlen;
+ }
  int
 +#ifdef PERL_OBJECT
 +CPerlObj::perl_parse(void (*xsinit) (CPerlObj*), int argc, char **argv, char **env)
 +#else
  perl_parse(PerlInterpreter *sv_interp, void (*xsinit) (void), int argc, char **argv, char **env)
 +#endif
  {
      dTHR;
      register SV *sv;
      char *validarg = "";
      I32 oldscope;
      AV* comppadlist;
-     int e_tmpfd = -1;
      dJMPENV;
      int ret;
 +    int fdscript = -1;
  
  #ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
  #ifdef IAMSUID
@@@ -1832,205 -1770,13 +1820,13 @@@ init_main_stash(void
      sv_setpvn(GvSV(gv_fetchpv("/", TRUE, SVt_PV)), "\n", 1);
  }
  
 -static void
 -open_script(char *scriptname, bool dosearch, SV *sv)
 +STATIC void
 +open_script(char *scriptname, bool dosearch, SV *sv, int *fdscript)
  {
      dTHR;
-     char *xfound = Nullch;
-     char *xfailed = Nullch;
      register char *s;
-     I32 len;
-     int retval;
- #if defined(DOSISH) && !defined(OS2) && !defined(atarist)
- #  define SEARCH_EXTS ".bat", ".cmd", NULL
- #  define MAX_EXT_LEN 4
- #endif
- #ifdef OS2
- #  define SEARCH_EXTS ".cmd", ".btm", ".bat", ".pl", NULL
- #  define MAX_EXT_LEN 4
- #endif
- #ifdef VMS
- #  define SEARCH_EXTS ".pl", ".com", NULL
- #  define MAX_EXT_LEN 4
- #endif
-     /* additional extensions to try in each dir if scriptname not found */
- #ifdef SEARCH_EXTS
-     char *ext[] = { SEARCH_EXTS };
-     int extidx = 0, i = 0;
-     char *curext = Nullch;
- #else
- #  define MAX_EXT_LEN 0
- #endif
-     /*
-      * If dosearch is true and if scriptname does not contain path
-      * delimiters, search the PATH for scriptname.
-      *
-      * If SEARCH_EXTS is also defined, will look for each
-      * scriptname{SEARCH_EXTS} whenever scriptname is not found
-      * while searching the PATH.
-      *
-      * Assuming SEARCH_EXTS is C<".foo",".bar",NULL>, PATH search
-      * proceeds as follows:
-      *   If DOSISH or VMSISH:
-      *     + look for ./scriptname{,.foo,.bar}
-      *     + search the PATH for scriptname{,.foo,.bar}
-      *
-      *   If !DOSISH:
-      *     + look *only* in the PATH for scriptname{,.foo,.bar} (note
-      *       this will not look in '.' if it's not in the PATH)
-      */
  
- #ifdef VMS
- #  ifdef ALWAYS_DEFTYPES
-     len = strlen(scriptname);
-     if (!(len == 1 && *scriptname == '-') && scriptname[len-1] != ':') {
-       int hasdir, idx = 0, deftypes = 1;
-       bool seen_dot = 1;
-       hasdir = !dosearch || (strpbrk(scriptname,":[</") != Nullch) ;
- #  else
-     if (dosearch) {
-       int hasdir, idx = 0, deftypes = 1;
-       bool seen_dot = 1;
-       hasdir = (strpbrk(scriptname,":[</") != Nullch) ;
- #  endif
-       /* The first time through, just add SEARCH_EXTS to whatever we
-        * already have, so we can check for default file types. */
-       while (deftypes ||
-              (!hasdir && my_trnlnm("DCL$PATH",tokenbuf,idx++)) )
-       {
-           if (deftypes) {
-               deftypes = 0;
-               *tokenbuf = '\0';
-           }
-           if ((strlen(tokenbuf) + strlen(scriptname)
-                + MAX_EXT_LEN) >= sizeof tokenbuf)
-               continue;       /* don't search dir with too-long name */
-           strcat(tokenbuf, scriptname);
- #else  /* !VMS */
- #ifdef DOSISH
-     if (strEQ(scriptname, "-"))
-       dosearch = 0;
-     if (dosearch) {           /* Look in '.' first. */
-       char *cur = scriptname;
- #ifdef SEARCH_EXTS
-       if ((curext = strrchr(scriptname,'.'))) /* possible current ext */
-           while (ext[i])
-               if (strEQ(ext[i++],curext)) {
-                   extidx = -1;                /* already has an ext */
-                   break;
-               }
-       do {
- #endif
-           DEBUG_p(PerlIO_printf(Perl_debug_log,
-                                 "Looking for %s\n",cur));
-           if (PerlLIO_stat(cur,&statbuf) >= 0) {
-               dosearch = 0;
-               scriptname = cur;
- #ifdef SEARCH_EXTS
-               break;
- #endif
-           }
- #ifdef SEARCH_EXTS
-           if (cur == scriptname) {
-               len = strlen(scriptname);
-               if (len+MAX_EXT_LEN+1 >= sizeof(tokenbuf))
-                   break;
-               cur = strcpy(tokenbuf, scriptname);
-           }
-       } while (extidx >= 0 && ext[extidx]     /* try an extension? */
-                && strcpy(tokenbuf+len, ext[extidx++]));
- #endif
-     }
- #endif
-     if (dosearch && !strchr(scriptname, '/')
- #ifdef DOSISH
-                && !strchr(scriptname, '\\')
- #endif
-                && (s = PerlEnv_getenv("PATH"))) {
-       bool seen_dot = 0;
-       
-       bufend = s + strlen(s);
-       while (s < bufend) {
- #if defined(atarist) || defined(DOSISH)
-           for (len = 0; *s
- #  ifdef atarist
-                   && *s != ','
- #  endif
-                   && *s != ';'; len++, s++) {
-               if (len < sizeof tokenbuf)
-                   tokenbuf[len] = *s;
-           }
-           if (len < sizeof tokenbuf)
-               tokenbuf[len] = '\0';
- #else  /* ! (atarist || DOSISH) */
-           s = delimcpy(tokenbuf, tokenbuf + sizeof tokenbuf, s, bufend,
-                       ':',
-                       &len);
- #endif /* ! (atarist || DOSISH) */
-           if (s < bufend)
-               s++;
-           if (len + 1 + strlen(scriptname) + MAX_EXT_LEN >= sizeof tokenbuf)
-               continue;       /* don't search dir with too-long name */
-           if (len
- #if defined(atarist) || defined(DOSISH)
-               && tokenbuf[len - 1] != '/'
-               && tokenbuf[len - 1] != '\\'
- #endif
-              )
-               tokenbuf[len++] = '/';
-           if (len == 2 && tokenbuf[0] == '.')
-               seen_dot = 1;
-           (void)strcpy(tokenbuf + len, scriptname);
- #endif  /* !VMS */
- #ifdef SEARCH_EXTS
-           len = strlen(tokenbuf);
-           if (extidx > 0)     /* reset after previous loop */
-               extidx = 0;
-           do {
- #endif
-               DEBUG_p(PerlIO_printf(Perl_debug_log, "Looking for %s\n",tokenbuf));
-               retval = PerlLIO_stat(tokenbuf,&statbuf);
- #ifdef SEARCH_EXTS
-           } while (  retval < 0               /* not there */
-                   && extidx>=0 && ext[extidx] /* try an extension? */
-                   && strcpy(tokenbuf+len, ext[extidx++])
-               );
- #endif
-           if (retval < 0)
-               continue;
-           if (S_ISREG(statbuf.st_mode)
-               && cando(S_IRUSR,TRUE,&statbuf)
- #ifndef DOSISH
-               && cando(S_IXUSR,TRUE,&statbuf)
- #endif
-               )
-           {
-               xfound = tokenbuf;              /* bingo! */
-               break;
-           }
-           if (!xfailed)
-               xfailed = savepv(tokenbuf);
-       }
- #ifndef DOSISH
-       if (!xfound && !seen_dot && !xfailed && (PerlLIO_stat(scriptname,&statbuf) < 0))
- #endif
-           seen_dot = 1;                       /* Disable message. */
-       if (!xfound)
-           croak("Can't %s %s%s%s",
-                 (xfailed ? "execute" : "find"),
-                 (xfailed ? xfailed : scriptname),
-                 (xfailed ? "" : " on PATH"),
-                 (xfailed || seen_dot) ? "" : ", '.' not in PATH");
-       if (xfailed)
-           Safefree(xfailed);
-       scriptname = xfound;
-     }
+     scriptname = find_script(scriptname, dosearch, NULL, 0);
  
      if (strnEQ(scriptname, "/dev/fd/", 8) && isDIGIT(scriptname[8]) ) {
        char *s = scriptname + 8;
            scriptname = s + 1;
      }
      else
 -      fdscript = -1;
 +      *fdscript = -1;
-     origfilename = savepv(e_tmpname ? "-e" : scriptname);
+     origfilename = savepv(e_script ? "-e" : scriptname);
      curcop->cop_filegv = gv_fetchfile(origfilename);
      if (strEQ(origfilename,"-"))
        scriptname = "";
@@@ -2425,13 -2168,30 +2218,30 @@@ find_beginning(void
      }
  }
  
 -static I32
 -static void
++STATIC I32
+ read_e_script(int idx, SV *buf_sv, int maxlen)
+ {
+     char *p, *nl;
+     FILTER_READ(idx+1, buf_sv, maxlen);
+     p  = SvPVX(e_script);
+     nl = strchr(p, '\n');
+     nl = (nl) ? nl+1 : SvEND(e_script);
+     if (nl-p == 0)
+       return 0;
+     sv_catpvn(buf_sv, p, nl-p);
+     sv_chop(e_script, nl);
+     return 1;
+ }
 +STATIC void
  init_ids(void)
  {
 -    uid = (int)getuid();
 -    euid = (int)geteuid();
 -    gid = (int)getgid();
 -    egid = (int)getegid();
 +    uid = (int)PerlProc_getuid();
 +    euid = (int)PerlProc_geteuid();
 +    gid = (int)PerlProc_getgid();
 +    egid = (int)PerlProc_getegid();
  #ifdef VMS
      uid |= gid << 16;
      euid |= egid << 16;
diff --cc perl.h
--- 1/perl.h
--- 2/perl.h
+++ b/perl.h
@@@ -1809,24 -1654,12 +1818,30 @@@ typedef enum 
  #define PERLVARI(var,type,init) type var;
  #define PERLVARIC(var,type,init) type var;
  
 +#ifdef PERL_OBJECT
 +extern "C" CPerlObj* perl_alloc _((IPerlMem*, IPerlEnv*, IPerlStdIO*, IPerlLIO*, IPerlDir*, IPerlSock*, IPerlProc*));
 +
 +typedef int (CPerlObj::*runops_proc_t) _((void));
 +#undef EXT
 +#define EXT
 +#undef EXTCONST
 +#define EXTCONST
 +#undef INIT
 +#define INIT(x)
 +
 +class CPerlObj {
 +public:
 +      CPerlObj(IPerlMem*, IPerlEnv*, IPerlStdIO*, IPerlLIO*, IPerlDir*, IPerlSock*, IPerlProc*);
 +      void Init(void);
 +      void* operator new(size_t nSize, IPerlMem *pvtbl);
 +#endif /* PERL_OBJECT */
 +
+ /* Interpreter exitlist entry */
+ typedef struct exitlistentry {
+     void (*fn) _((void*));
+     void *ptr;
+ } PerlExitListEntry;
  #ifdef PERL_GLOBAL_STRUCT
  struct perl_vars {
  #include "perlvars.h"
diff --cc pp.c
Simple merge
diff --cc pp_ctl.c
+++ b/pp_ctl.c
@@@ -747,11 -750,10 +751,12 @@@ PP(pp_sort
        if (max > 1) {
            MEXTEND(SP, 20);    /* Can't afford stack realloc on signal. */
            qsortsv(ORIGMARK+1, max,
 -                (op->op_private & OPpLOCALE) ? sv_cmp_locale : sv_cmp);
 +                  (op->op_private & OPpLOCALE)
 +                  ? FUNC_NAME_TO_PTR(sv_cmp_locale)
 +                  : FUNC_NAME_TO_PTR(sv_cmp));
        }
      }
+     LEAVE;
      stack_sp = ORIGMARK + max;
      return nextop;
  }
diff --cc pp_hot.c
Simple merge
diff --cc pp_sys.c
Simple merge
diff --cc proto.h
+++ b/proto.h
@@@ -82,44 -69,33 +82,45 @@@ VIRTUAL void       cv_undef _((CV* cv))
  #ifdef DEBUGGING
  void  cx_dump _((PERL_CONTEXT* cs));
  #endif
 -SV*   filter_add _((filter_t funcp, SV* datasv));
 -void  filter_del _((filter_t funcp));
 -I32   filter_read _((int idx, SV* buffer, int maxlen));
 -char **       get_op_descs _((void));
 -char **       get_op_names _((void));
 -I32   cxinc _((void));
 -void  deb _((const char* pat,...)) __attribute__((format(printf,1,2)));
 -void  deb_growlevel _((void));
 -I32   debop _((OP* o));
 -I32   debstackptrs _((void));
 +VIRTUAL SV*   filter_add _((filter_t funcp, SV* datasv));
 +VIRTUAL void  filter_del _((filter_t funcp));
 +VIRTUAL I32   filter_read _((int idx, SV* buffer, int maxlen));
 +VIRTUAL char **       get_op_descs _((void));
 +VIRTUAL char **       get_op_names _((void));
 +VIRTUAL char *        get_no_modify _((void));
 +VIRTUAL U32 * get_opargs _((void));
 +VIRTUAL I32   cxinc _((void));
  #ifdef DEBUGGING
 -void  debprofdump _((void));
 +VIRTUAL void  deb _((const char* pat,...)) __attribute__((format(printf,1,2)));
 +VIRTUAL void  deb_growlevel _((void));
 +VIRTUAL void  debprofdump _((void));
 +VIRTUAL I32   debop _((OP* o));
 +VIRTUAL I32   debstack _((void));
 +VIRTUAL I32   debstackptrs _((void));
 +#else
 +#ifdef PERL_OBJECT
 +/* create a matching set of virtual entries for the non debugging version */
 +VIRTUAL void  deb_place_holder _((const char* pat,...));
 +VIRTUAL void  deb_growlevel_place_holder _((void));
 +VIRTUAL void  debprofdump_place_holder _((void));
 +VIRTUAL I32   debop_place_holder _((OP* o));
 +VIRTUAL I32   debstack_place_holder _((void));
 +VIRTUAL I32   debstackptrs_place_holder _((void));
  #endif
 -I32   debstack _((void));
 -char* delimcpy _((char* to, char* toend, char* from, char* fromend,
 +#endif
 +VIRTUAL char* delimcpy _((char* to, char* toend, char* from, char* fromend,
                    int delim, I32* retlen));
 -void  deprecate _((char* s));
 -OP*   die _((const char* pat,...));
 -OP*   die_where _((char* message));
 -void  dounwind _((I32 cxix));
 -bool  do_aexec _((SV* really, SV** mark, SV** sp));
 -int   do_binmode _((PerlIO *fp, int iotype, int flag));
 -void    do_chop _((SV* asv, SV* sv));
 -bool  do_close _((GV* gv, bool not_implicit));
 -bool  do_eof _((GV* gv));
 -bool  do_exec _((char* cmd));
 -void  do_execfree _((void));
 +VIRTUAL void  deprecate _((char* s));
 +VIRTUAL OP*   die _((const char* pat,...));
 +VIRTUAL OP*   die_where _((char* message));
 +VIRTUAL void  dounwind _((I32 cxix));
 +VIRTUAL bool  do_aexec _((SV* really, SV** mark, SV** sp));
++VIRTUAL int   do_binmode _((PerlIO *fp, int iotype, int flag));
 +VIRTUAL void    do_chop _((SV* asv, SV* sv));
 +VIRTUAL bool  do_close _((GV* gv, bool not_implicit));
 +VIRTUAL bool  do_eof _((GV* gv));
 +VIRTUAL bool  do_exec _((char* cmd));
 +VIRTUAL void  do_execfree _((void));
  #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
  I32   do_ipcctl _((I32 optype, SV** mark, SV** sp));
  I32   do_ipcget _((I32 optype, SV** mark, SV** sp));
@@@ -164,143 -138,147 +165,147 @@@ void dump_op _((OP* arg))
  void  dump_pm _((PMOP* pm));
  void  dump_packsubs _((HV* stash));
  void  dump_sub _((GV* gv));
 -void  fbm_compile _((SV* sv, U32 flags));
 -char* fbm_instr _((unsigned char* big, unsigned char* bigend, SV* littlesv));
 -char* find_script _((char *scriptname, bool dosearch, char **search_ext, I32 flags));
 +VIRTUAL void  fbm_compile _((SV* sv, U32 flags));
 +VIRTUAL char* fbm_instr _((unsigned char* big, unsigned char* bigend, SV* littlesv));
++VIRTUAL char* find_script _((char *scriptname, bool dosearch, char **search_ext, I32 flags));
  #ifdef USE_THREADS
 -PADOFFSET     find_threadsv _((char *name));
 -#endif
 -OP*   force_list _((OP* arg));
 -OP*   fold_constants _((OP* arg));
 -char* form _((const char* pat, ...));
 -void  free_tmps _((void));
 -OP*   gen_constant_list _((OP* o));
 -void  gp_free _((GV* gv));
 -GP*   gp_ref _((GP* gp));
 -GV*   gv_AVadd _((GV* gv));
 -GV*   gv_HVadd _((GV* gv));
 -GV*   gv_IOadd _((GV* gv));
 -GV*   gv_autoload4 _((HV* stash, char* name, STRLEN len, I32 method));
 -void  gv_check _((HV* stash));
 -void  gv_efullname _((SV* sv, GV* gv));
 -void  gv_efullname3 _((SV* sv, GV* gv, char* prefix));
 -GV*   gv_fetchfile _((char* name));
 -GV*   gv_fetchmeth _((HV* stash, char* name, STRLEN len, I32 level));
 -GV*   gv_fetchmethod _((HV* stash, char* name));
 -GV*   gv_fetchmethod_autoload _((HV* stash, char* name, I32 autoload));
 -GV*   gv_fetchpv _((char* name, I32 add, I32 sv_type));
 -void  gv_fullname _((SV* sv, GV* gv));
 -void  gv_fullname3 _((SV* sv, GV* gv, char* prefix));
 -void  gv_init _((GV* gv, HV* stash, char* name, STRLEN len, int multi));
 -HV*   gv_stashpv _((char* name, I32 create));
 -HV*   gv_stashpvn _((char* name, U32 namelen, I32 create));
 -HV*   gv_stashsv _((SV* sv, I32 create));
 -void  hv_clear _((HV* tb));
 -void  hv_delayfree_ent _((HV* hv, HE* entry));
 -SV*   hv_delete _((HV* tb, char* key, U32 klen, I32 flags));
 -SV*   hv_delete_ent _((HV* tb, SV* key, I32 flags, U32 hash));
 -bool  hv_exists _((HV* tb, char* key, U32 klen));
 -bool  hv_exists_ent _((HV* tb, SV* key, U32 hash));
 -SV**  hv_fetch _((HV* tb, char* key, U32 klen, I32 lval));
 -HE*   hv_fetch_ent _((HV* tb, SV* key, I32 lval, U32 hash));
 -void  hv_free_ent _((HV* hv, HE* entry));
 -I32   hv_iterinit _((HV* tb));
 -char* hv_iterkey _((HE* entry, I32* retlen));
 -SV*   hv_iterkeysv _((HE* entry));
 -HE*   hv_iternext _((HV* tb));
 -SV*   hv_iternextsv _((HV* hv, char** key, I32* retlen));
 -SV*   hv_iterval _((HV* tb, HE* entry));
 -void  hv_ksplit _((HV* hv, IV newmax));
 -void  hv_magic _((HV* hv, GV* gv, int how));
 -SV**  hv_store _((HV* tb, char* key, U32 klen, SV* val, U32 hash));
 -HE*   hv_store_ent _((HV* tb, SV* key, SV* val, U32 hash));
 -void  hv_undef _((HV* tb));
 -I32   ibcmp _((char* a, char* b, I32 len));
 -I32   ibcmp_locale _((char* a, char* b, I32 len));
 -I32   ingroup _((I32 testgid, I32 effective));
 -void  init_stacks _((ARGSproto));
 -U32   intro_my _((void));
 -char* instr _((char* big, char* little));
 -bool  io_close _((IO* io));
 -OP*   invert _((OP* cmd));
 -OP*   jmaybe _((OP* arg));
 -I32   keyword _((char* d, I32 len));
 -void  leave_scope _((I32 base));
 -void  lex_end _((void));
 -void  lex_start _((SV* line));
 -OP*   linklist _((OP* o));
 -OP*   list _((OP* o));
 -OP*   listkids _((OP* o));
 -OP*   localize _((OP* arg, I32 lexical));
 -I32   looks_like_number _((SV* sv));
 -int   magic_clearenv  _((SV* sv, MAGIC* mg));
 -int   magic_clear_all_env _((SV* sv, MAGIC* mg));
 -int   magic_clearpack _((SV* sv, MAGIC* mg));
 -int   magic_clearsig  _((SV* sv, MAGIC* mg));
 -int   magic_existspack _((SV* sv, MAGIC* mg));
 -int   magic_freedefelem _((SV* sv, MAGIC* mg));
 -int   magic_freeregexp _((SV* sv, MAGIC* mg));
 -int   magic_get       _((SV* sv, MAGIC* mg));
 -int   magic_getarylen _((SV* sv, MAGIC* mg));
 -int   magic_getdefelem _((SV* sv, MAGIC* mg));
 -int   magic_getglob   _((SV* sv, MAGIC* mg));
 -int   magic_getnkeys  _((SV* sv, MAGIC* mg));
 -int   magic_getpack   _((SV* sv, MAGIC* mg));
 -int   magic_getpos    _((SV* sv, MAGIC* mg));
 -int   magic_getsig    _((SV* sv, MAGIC* mg));
 -int   magic_getsubstr _((SV* sv, MAGIC* mg));
 -int   magic_gettaint  _((SV* sv, MAGIC* mg));
 -int   magic_getuvar   _((SV* sv, MAGIC* mg));
 -int   magic_getvec    _((SV* sv, MAGIC* mg));
 -U32   magic_len       _((SV* sv, MAGIC* mg));
 +VIRTUAL PADOFFSET     find_threadsv _((char *name));
 +#endif
 +VIRTUAL OP*   force_list _((OP* arg));
 +VIRTUAL OP*   fold_constants _((OP* arg));
 +VIRTUAL char* form _((const char* pat, ...));
 +VIRTUAL void  free_tmps _((void));
 +VIRTUAL OP*   gen_constant_list _((OP* o));
 +VIRTUAL void  gp_free _((GV* gv));
 +VIRTUAL GP*   gp_ref _((GP* gp));
 +VIRTUAL GV*   gv_AVadd _((GV* gv));
 +VIRTUAL GV*   gv_HVadd _((GV* gv));
 +VIRTUAL GV*   gv_IOadd _((GV* gv));
 +VIRTUAL GV*   gv_autoload4 _((HV* stash, char* name, STRLEN len, I32 method));
 +VIRTUAL void  gv_check _((HV* stash));
 +VIRTUAL void  gv_efullname _((SV* sv, GV* gv));
 +VIRTUAL void  gv_efullname3 _((SV* sv, GV* gv, char* prefix));
 +VIRTUAL GV*   gv_fetchfile _((char* name));
 +VIRTUAL GV*   gv_fetchmeth _((HV* stash, char* name, STRLEN len, I32 level));
 +VIRTUAL GV*   gv_fetchmethod _((HV* stash, char* name));
 +VIRTUAL GV*   gv_fetchmethod_autoload _((HV* stash, char* name, I32 autoload));
 +VIRTUAL GV*   gv_fetchpv _((char* name, I32 add, I32 sv_type));
 +VIRTUAL void  gv_fullname _((SV* sv, GV* gv));
 +VIRTUAL void  gv_fullname3 _((SV* sv, GV* gv, char* prefix));
 +VIRTUAL void  gv_init _((GV* gv, HV* stash, char* name, STRLEN len, int multi));
 +VIRTUAL HV*   gv_stashpv _((char* name, I32 create));
 +VIRTUAL HV*   gv_stashpvn _((char* name, U32 namelen, I32 create));
 +VIRTUAL HV*   gv_stashsv _((SV* sv, I32 create));
 +VIRTUAL void  hv_clear _((HV* tb));
 +VIRTUAL void  hv_delayfree_ent _((HV* hv, HE* entry));
 +VIRTUAL SV*   hv_delete _((HV* tb, char* key, U32 klen, I32 flags));
 +VIRTUAL SV*   hv_delete_ent _((HV* tb, SV* key, I32 flags, U32 hash));
 +VIRTUAL bool  hv_exists _((HV* tb, char* key, U32 klen));
 +VIRTUAL bool  hv_exists_ent _((HV* tb, SV* key, U32 hash));
 +VIRTUAL SV**  hv_fetch _((HV* tb, char* key, U32 klen, I32 lval));
 +VIRTUAL HE*   hv_fetch_ent _((HV* tb, SV* key, I32 lval, U32 hash));
 +VIRTUAL void  hv_free_ent _((HV* hv, HE* entry));
 +VIRTUAL I32   hv_iterinit _((HV* tb));
 +VIRTUAL char* hv_iterkey _((HE* entry, I32* retlen));
 +VIRTUAL SV*   hv_iterkeysv _((HE* entry));
 +VIRTUAL HE*   hv_iternext _((HV* tb));
 +VIRTUAL SV*   hv_iternextsv _((HV* hv, char** key, I32* retlen));
 +VIRTUAL SV*   hv_iterval _((HV* tb, HE* entry));
 +VIRTUAL void  hv_ksplit _((HV* hv, IV newmax));
 +VIRTUAL void  hv_magic _((HV* hv, GV* gv, int how));
 +VIRTUAL SV**  hv_store _((HV* tb, char* key, U32 klen, SV* val, U32 hash));
 +VIRTUAL HE*   hv_store_ent _((HV* tb, SV* key, SV* val, U32 hash));
 +VIRTUAL void  hv_undef _((HV* tb));
 +VIRTUAL I32   ibcmp _((char* a, char* b, I32 len));
 +VIRTUAL I32   ibcmp_locale _((char* a, char* b, I32 len));
 +VIRTUAL I32   ingroup _((I32 testgid, I32 effective));
 +VIRTUAL void  init_stacks _((ARGSproto));
 +VIRTUAL U32   intro_my _((void));
 +VIRTUAL char* instr _((char* big, char* little));
 +VIRTUAL bool  io_close _((IO* io));
 +VIRTUAL OP*   invert _((OP* cmd));
 +VIRTUAL OP*   jmaybe _((OP* arg));
 +VIRTUAL I32   keyword _((char* d, I32 len));
 +VIRTUAL void  leave_scope _((I32 base));
 +VIRTUAL void  lex_end _((void));
 +VIRTUAL void  lex_start _((SV* line));
 +VIRTUAL OP*   linklist _((OP* o));
 +VIRTUAL OP*   list _((OP* o));
 +VIRTUAL OP*   listkids _((OP* o));
 +VIRTUAL OP*   localize _((OP* arg, I32 lexical));
 +VIRTUAL I32   looks_like_number _((SV* sv));
 +VIRTUAL int   magic_clearenv  _((SV* sv, MAGIC* mg));
 +VIRTUAL int   magic_clear_all_env _((SV* sv, MAGIC* mg));
 +VIRTUAL int   magic_clearpack _((SV* sv, MAGIC* mg));
 +VIRTUAL int   magic_clearsig  _((SV* sv, MAGIC* mg));
 +VIRTUAL int   magic_existspack _((SV* sv, MAGIC* mg));
 +VIRTUAL int   magic_freedefelem _((SV* sv, MAGIC* mg));
 +VIRTUAL int   magic_freeregexp _((SV* sv, MAGIC* mg));
 +VIRTUAL int   magic_get       _((SV* sv, MAGIC* mg));
 +VIRTUAL int   magic_getarylen _((SV* sv, MAGIC* mg));
 +VIRTUAL int   magic_getdefelem _((SV* sv, MAGIC* mg));
 +VIRTUAL int   magic_getglob   _((SV* sv, MAGIC* mg));
++VIRTUAL int   magic_getnkeys  _((SV* sv, MAGIC* mg));
 +VIRTUAL int   magic_getpack   _((SV* sv, MAGIC* mg));
 +VIRTUAL int   magic_getpos    _((SV* sv, MAGIC* mg));
 +VIRTUAL int   magic_getsig    _((SV* sv, MAGIC* mg));
++VIRTUAL int   magic_getsubstr _((SV* sv, MAGIC* mg));
 +VIRTUAL int   magic_gettaint  _((SV* sv, MAGIC* mg));
 +VIRTUAL int   magic_getuvar   _((SV* sv, MAGIC* mg));
++VIRTUAL int   magic_getvec    _((SV* sv, MAGIC* mg));
 +VIRTUAL U32   magic_len       _((SV* sv, MAGIC* mg));
  #ifdef USE_THREADS
 -int   magic_mutexfree _((SV* sv, MAGIC* mg));
 +VIRTUAL int   magic_mutexfree _((SV* sv, MAGIC* mg));
  #endif /* USE_THREADS */
 -int   magic_nextpack  _((SV* sv, MAGIC* mg, SV* key));
 -int   magic_set       _((SV* sv, MAGIC* mg));
 +VIRTUAL int   magic_nextpack  _((SV* sv, MAGIC* mg, SV* key));
 +VIRTUAL int   magic_set       _((SV* sv, MAGIC* mg));
  #ifdef OVERLOAD
 -int   magic_setamagic _((SV* sv, MAGIC* mg));
 +VIRTUAL int   magic_setamagic _((SV* sv, MAGIC* mg));
  #endif /* OVERLOAD */
 -int   magic_setarylen _((SV* sv, MAGIC* mg));
 -int   magic_setbm     _((SV* sv, MAGIC* mg));
 -int   magic_setdbline _((SV* sv, MAGIC* mg));
 +VIRTUAL int   magic_setarylen _((SV* sv, MAGIC* mg));
 +VIRTUAL int   magic_setbm     _((SV* sv, MAGIC* mg));
 +VIRTUAL int   magic_setdbline _((SV* sv, MAGIC* mg));
  #ifdef USE_LOCALE_COLLATE
 -int   magic_setcollxfrm _((SV* sv, MAGIC* mg));
 -#endif
 -int   magic_setdefelem _((SV* sv, MAGIC* mg));
 -int   magic_setenv    _((SV* sv, MAGIC* mg));
 -int   magic_setfm     _((SV* sv, MAGIC* mg));
 -int   magic_setisa    _((SV* sv, MAGIC* mg));
 -int   magic_setglob   _((SV* sv, MAGIC* mg));
 -int   magic_setmglob  _((SV* sv, MAGIC* mg));
 -int   magic_setnkeys  _((SV* sv, MAGIC* mg));
 -int   magic_setpack   _((SV* sv, MAGIC* mg));
 -int   magic_setpos    _((SV* sv, MAGIC* mg));
 -int   magic_setsig    _((SV* sv, MAGIC* mg));
 -int   magic_setsubstr _((SV* sv, MAGIC* mg));
 -int   magic_settaint  _((SV* sv, MAGIC* mg));
 -int   magic_setuvar   _((SV* sv, MAGIC* mg));
 -int   magic_setvec    _((SV* sv, MAGIC* mg));
 -int   magic_set_all_env _((SV* sv, MAGIC* mg));
 -U32   magic_sizepack  _((SV* sv, MAGIC* mg));
 -int   magic_wipepack  _((SV* sv, MAGIC* mg));
 -void  magicname _((char* sym, char* name, I32 namlen));
 +VIRTUAL int   magic_setcollxfrm _((SV* sv, MAGIC* mg));
 +#endif
 +VIRTUAL int   magic_setdefelem _((SV* sv, MAGIC* mg));
 +VIRTUAL int   magic_setenv    _((SV* sv, MAGIC* mg));
 +VIRTUAL int   magic_setfm     _((SV* sv, MAGIC* mg));
 +VIRTUAL int   magic_setisa    _((SV* sv, MAGIC* mg));
 +VIRTUAL int   magic_setglob   _((SV* sv, MAGIC* mg));
 +VIRTUAL int   magic_setmglob  _((SV* sv, MAGIC* mg));
 +VIRTUAL int   magic_setnkeys  _((SV* sv, MAGIC* mg));
 +VIRTUAL int   magic_setpack   _((SV* sv, MAGIC* mg));
 +VIRTUAL int   magic_setpos    _((SV* sv, MAGIC* mg));
 +VIRTUAL int   magic_setsig    _((SV* sv, MAGIC* mg));
 +VIRTUAL int   magic_setsubstr _((SV* sv, MAGIC* mg));
 +VIRTUAL int   magic_settaint  _((SV* sv, MAGIC* mg));
 +VIRTUAL int   magic_setuvar   _((SV* sv, MAGIC* mg));
 +VIRTUAL int   magic_setvec    _((SV* sv, MAGIC* mg));
 +VIRTUAL int   magic_set_all_env _((SV* sv, MAGIC* mg));
 +VIRTUAL U32   magic_sizepack  _((SV* sv, MAGIC* mg));
 +VIRTUAL int   magic_wipepack  _((SV* sv, MAGIC* mg));
 +VIRTUAL void  magicname _((char* sym, char* name, I32 namlen));
  int   main _((int argc, char** argv, char** env));
 -void  markstack_grow _((void));
 +VIRTUAL void  markstack_grow _((void));
  #ifdef USE_LOCALE_COLLATE
 -char* mem_collxfrm _((const char* s, STRLEN len, STRLEN* xlen));
 -#endif
 -char* mess _((const char* pat, va_list* args));
 -int   mg_clear _((SV* sv));
 -int   mg_copy _((SV* , SV* , char* , I32));
 -MAGIC*        mg_find _((SV* sv, int type));
 -int   mg_free _((SV* sv));
 -int   mg_get _((SV* sv));
 -U32   mg_len _((SV* sv));
 -void  mg_magical _((SV* sv));
 -int   mg_set _((SV* sv));
 -I32   mg_size _((SV* sv));
 -OP*   mod _((OP* o, I32 type));
 -char* moreswitches _((char* s));
 -OP*   my _((OP* o));
 +VIRTUAL char* mem_collxfrm _((const char* s, STRLEN len, STRLEN* xlen));
 +#endif
 +VIRTUAL char* mess _((const char* pat, va_list* args));
 +VIRTUAL int   mg_clear _((SV* sv));
 +VIRTUAL int   mg_copy _((SV* sv, SV* nsv, char* key, I32 klen));
 +VIRTUAL MAGIC*        mg_find _((SV* sv, int type));
 +VIRTUAL int   mg_free _((SV* sv));
 +VIRTUAL int   mg_get _((SV* sv));
 +VIRTUAL U32   mg_length _((SV* sv));
 +VIRTUAL void  mg_magical _((SV* sv));
 +VIRTUAL int   mg_set _((SV* sv));
 +VIRTUAL I32   mg_size _((SV* sv));
 +VIRTUAL OP*   mod _((OP* o, I32 type));
 +VIRTUAL char* moreswitches _((char* s));
 +VIRTUAL OP*   my _((OP* o));
  #if !defined(HAS_BCOPY) || !defined(HAS_SAFE_BCOPY)
 -char* my_bcopy _((char* from, char* to, I32 len));
 +VIRTUAL char* my_bcopy _((char* from, char* to, I32 len));
  #endif
  #if !defined(HAS_BZERO) && !defined(HAS_MEMSET)
  char* my_bzero _((char* loc, I32 len));
@@@ -314,338 -292,315 +319,335 @@@ I32  my_memcmp _((char* s1, char* s2, I3
  #if !defined(HAS_MEMSET)
  void* my_memset _((char* loc, I32 ch, I32 len));
  #endif
 -I32   my_pclose _((PerlIO* ptr));
 -PerlIO*       my_popen _((char* cmd, char* mode));
 -void  my_setenv _((char* nam, char* val));
 -I32   my_stat _((ARGSproto));
 +#ifndef PERL_OBJECT
 +VIRTUAL I32   my_pclose _((PerlIO* ptr));
 +VIRTUAL PerlIO*       my_popen _((char* cmd, char* mode));
 +#endif
 +VIRTUAL void  my_setenv _((char* nam, char* val));
 +VIRTUAL I32   my_stat _((ARGSproto));
  #ifdef MYSWAP
 -short my_swap _((short s));
 -long  my_htonl _((long l));
 -long  my_ntohl _((long l));
 -#endif
 -void  my_unexec _((void));
 -OP*   newANONLIST _((OP* o));
 -OP*   newANONHASH _((OP* o));
 -OP*   newANONSUB _((I32 floor, OP* proto, OP* block));
 -OP*   newASSIGNOP _((I32 flags, OP* left, I32 optype, OP* right));
 -OP*   newCONDOP _((I32 flags, OP* expr, OP* trueop, OP* falseop));
 -void  newCONSTSUB _((HV* stash, char* name, SV* sv));
 -void  newFORM _((I32 floor, OP* o, OP* block));
 -OP*   newFOROP _((I32 flags, char* label, line_t forline, OP* scalar, OP* expr, OP*block, OP*cont));
 -OP*   newLOGOP _((I32 optype, I32 flags, OP* left, OP* right));
 -OP*   newLOOPEX _((I32 type, OP* label));
 -OP*   newLOOPOP _((I32 flags, I32 debuggable, OP* expr, OP* block));
 -OP*   newNULLLIST _((void));
 -OP*   newOP _((I32 optype, I32 flags));
 -void  newPROG _((OP* o));
 -OP*   newRANGE _((I32 flags, OP* left, OP* right));
 -OP*   newSLICEOP _((I32 flags, OP* subscript, OP* list));
 -OP*   newSTATEOP _((I32 flags, char* label, OP* o));
 -CV*   newSUB _((I32 floor, OP* o, OP* proto, OP* block));
 -CV*   newXS _((char* name, void (*subaddr)(CV* cv), char* filename));
 -AV*   newAV _((void));
 -OP*   newAVREF _((OP* o));
 -OP*   newBINOP _((I32 type, I32 flags, OP* first, OP* last));
 -OP*   newCVREF _((I32 flags, OP* o));
 -OP*   newGVOP _((I32 type, I32 flags, GV* gv));
 -GV*   newGVgen _((char* pack));
 -OP*   newGVREF _((I32 type, OP* o));
 -OP*   newHVREF _((OP* o));
 -HV*   newHV _((void));
 -IO*   newIO _((void));
 -OP*   newLISTOP _((I32 type, I32 flags, OP* first, OP* last));
 -OP*   newPMOP _((I32 type, I32 flags));
 -OP*   newPVOP _((I32 type, I32 flags, char* pv));
 -SV*   newRV _((SV* ref));
 -#if !defined(__GNUC__) && (defined(CRIPPLED_CC) || defined(USE_THREADS))
 -SV*   newRV_noinc _((SV *));
 -#endif
 -SV*   newSV _((STRLEN len));
 -OP*   newSVREF _((OP* o));
 -OP*   newSVOP _((I32 type, I32 flags, SV* sv));
 -SV*   newSViv _((IV i));
 -SV*   newSVnv _((double n));
 -SV*   newSVpv _((char* s, STRLEN len));
 -SV*   newSVpvn _((char* s, STRLEN len));
 -SV*   newSVpvf _((const char* pat, ...));
 -SV*   newSVrv _((SV* rv, char* classname));
 -SV*   newSVsv _((SV* old));
 -OP*   newUNOP _((I32 type, I32 flags, OP* first));
 -OP*   newWHILEOP _((I32 flags, I32 debuggable, LOOP* loop,
 +VIRTUAL short my_swap _((short s));
 +VIRTUAL long  my_htonl _((long l));
 +VIRTUAL long  my_ntohl _((long l));
 +#endif
 +VIRTUAL void  my_unexec _((void));
 +VIRTUAL OP*   newANONLIST _((OP* o));
 +VIRTUAL OP*   newANONHASH _((OP* o));
 +VIRTUAL OP*   newANONSUB _((I32 floor, OP* proto, OP* block));
 +VIRTUAL OP*   newASSIGNOP _((I32 flags, OP* left, I32 optype, OP* right));
 +VIRTUAL OP*   newCONDOP _((I32 flags, OP* expr, OP* trueop, OP* falseop));
 +VIRTUAL void  newCONSTSUB _((HV* stash, char* name, SV* sv));
 +VIRTUAL void  newFORM _((I32 floor, OP* o, OP* block));
 +VIRTUAL OP*   newFOROP _((I32 flags, char* label, line_t forline, OP* sclr, OP* expr, OP*block, OP*cont));
 +VIRTUAL OP*   newLOGOP _((I32 optype, I32 flags, OP* left, OP* right));
 +VIRTUAL OP*   newLOOPEX _((I32 type, OP* label));
 +VIRTUAL OP*   newLOOPOP _((I32 flags, I32 debuggable, OP* expr, OP* block));
 +VIRTUAL OP*   newNULLLIST _((void));
 +VIRTUAL OP*   newOP _((I32 optype, I32 flags));
 +VIRTUAL void  newPROG _((OP* o));
 +VIRTUAL OP*   newRANGE _((I32 flags, OP* left, OP* right));
 +VIRTUAL OP*   newSLICEOP _((I32 flags, OP* subscript, OP* list));
 +VIRTUAL OP*   newSTATEOP _((I32 flags, char* label, OP* o));
 +VIRTUAL CV*   newSUB _((I32 floor, OP* o, OP* proto, OP* block));
 +VIRTUAL CV*   newXS _((char* name, void (*subaddr)(CV* cv _CPERLproto), char* filename));
 +VIRTUAL AV*   newAV _((void));
 +VIRTUAL OP*   newAVREF _((OP* o));
 +VIRTUAL OP*   newBINOP _((I32 type, I32 flags, OP* first, OP* last));
 +VIRTUAL OP*   newCVREF _((I32 flags, OP* o));
 +VIRTUAL OP*   newGVOP _((I32 type, I32 flags, GV* gv));
 +VIRTUAL GV*   newGVgen _((char* pack));
 +VIRTUAL OP*   newGVREF _((I32 type, OP* o));
 +VIRTUAL OP*   newHVREF _((OP* o));
 +VIRTUAL HV*   newHV _((void));
 +VIRTUAL IO*   newIO _((void));
 +VIRTUAL OP*   newLISTOP _((I32 type, I32 flags, OP* first, OP* last));
 +VIRTUAL OP*   newPMOP _((I32 type, I32 flags));
 +VIRTUAL OP*   newPVOP _((I32 type, I32 flags, char* pv));
 +VIRTUAL SV*   newRV _((SV* pref));
 +#if !defined(__GNUC__) && (defined(CRIPPLED_CC) || defined(USE_THREADS) || defined(PERL_OBJECT))
 +VIRTUAL SV*   newRV_noinc _((SV *sv));
 +#endif
- #ifdef LEAKTEST
- VIRTUAL SV*   newSV _((I32 x, STRLEN len));
- #else
 +VIRTUAL SV*   newSV _((STRLEN len));
- #endif
 +VIRTUAL OP*   newSVREF _((OP* o));
 +VIRTUAL OP*   newSVOP _((I32 type, I32 flags, SV* sv));
 +VIRTUAL SV*   newSViv _((IV i));
 +VIRTUAL SV*   newSVnv _((double n));
 +VIRTUAL SV*   newSVpv _((char* s, STRLEN len));
 +VIRTUAL SV*   newSVpvf _((const char* pat, ...));
 +VIRTUAL SV*   newSVrv _((SV* rv, char* classname));
 +VIRTUAL SV*   newSVsv _((SV* old));
 +VIRTUAL OP*   newUNOP _((I32 type, I32 flags, OP* first));
 +VIRTUAL OP*   newWHILEOP _((I32 flags, I32 debuggable, LOOP* loop,
                      I32 whileline, OP* expr, OP* block, OP* cont));
  #ifdef USE_THREADS
 -struct perl_thread *  new_struct_thread _((struct perl_thread *t));
 -#endif
 -PERL_SI *     new_stackinfo _((I32 stitems, I32 cxitems));
 -PerlIO*       nextargv _((GV* gv));
 -char* ninstr _((char* big, char* bigend, char* little, char* lend));
 -OP*   oopsCV _((OP* o));
 -void  op_free _((OP* arg));
 -void  package _((OP* o));
 -PADOFFSET     pad_alloc _((I32 optype, U32 tmptype));
 -PADOFFSET     pad_allocmy _((char* name));
 -PADOFFSET     pad_findmy _((char* name));
 -OP*   oopsAV _((OP* o));
 -OP*   oopsHV _((OP* o));
 -void  pad_leavemy _((I32 fill));
 -SV*   pad_sv _((PADOFFSET po));
 -void  pad_free _((PADOFFSET po));
 -void  pad_reset _((void));
 -void  pad_swipe _((PADOFFSET po));
 -void  peep _((OP* o));
 +VIRTUAL struct perl_thread *  new_struct_thread _((struct perl_thread *t));
 +#endif
 +VIRTUAL PERL_SI *     new_stackinfo _((I32 stitems, I32 cxitems));
 +VIRTUAL PerlIO*       nextargv _((GV* gv));
 +VIRTUAL char* ninstr _((char* big, char* bigend, char* little, char* lend));
 +VIRTUAL OP*   oopsCV _((OP* o));
 +VIRTUAL void  op_free _((OP* arg));
 +VIRTUAL void  package _((OP* o));
 +VIRTUAL PADOFFSET     pad_alloc _((I32 optype, U32 tmptype));
 +VIRTUAL PADOFFSET     pad_allocmy _((char* name));
 +VIRTUAL PADOFFSET     pad_findmy _((char* name));
 +VIRTUAL OP*   oopsAV _((OP* o));
 +VIRTUAL OP*   oopsHV _((OP* o));
 +VIRTUAL void  pad_leavemy _((I32 fill));
 +VIRTUAL SV*   pad_sv _((PADOFFSET po));
 +VIRTUAL void  pad_free _((PADOFFSET po));
 +VIRTUAL void  pad_reset _((void));
 +VIRTUAL void  pad_swipe _((PADOFFSET po));
 +VIRTUAL void  peep _((OP* o));
 +#ifndef PERL_OBJECT
  PerlInterpreter*      perl_alloc _((void));
 -void    perl_atexit _((void(*fn)(void *), void*));
 -I32   perl_call_argv _((char* subname, I32 flags, char** argv));
 -I32   perl_call_method _((char* methname, I32 flags));
 -I32   perl_call_pv _((char* subname, I32 flags));
 -I32   perl_call_sv _((SV* sv, I32 flags));
 +#endif
++VIRTUAL void    perl_atexit _((void(*fn)(void *), void*));
 +VIRTUAL I32   perl_call_argv _((char* sub_name, I32 flags, char** argv));
 +VIRTUAL I32   perl_call_method _((char* methname, I32 flags));
 +VIRTUAL I32   perl_call_pv _((char* sub_name, I32 flags));
 +VIRTUAL I32   perl_call_sv _((SV* sv, I32 flags));
 +#ifdef PERL_OBJECT
 +VIRTUAL void  perl_construct _((void));
 +VIRTUAL void  perl_destruct _((void));
 +#else
  void  perl_construct _((PerlInterpreter* sv_interp));
  void  perl_destruct _((PerlInterpreter* sv_interp));
 -SV*   perl_eval_pv _((char* p, I32 croak_on_error));
 -I32   perl_eval_sv _((SV* sv, I32 flags));
 +#endif
 +VIRTUAL SV*   perl_eval_pv _((char* p, I32 croak_on_error));
 +VIRTUAL I32   perl_eval_sv _((SV* sv, I32 flags));
 +#ifdef PERL_OBJECT
 +VIRTUAL void  perl_free _((void));
 +#else
  void  perl_free _((PerlInterpreter* sv_interp));
 -SV*   perl_get_sv _((char* name, I32 create));
 -AV*   perl_get_av _((char* name, I32 create));
 -HV*   perl_get_hv _((char* name, I32 create));
 -CV*   perl_get_cv _((char* name, I32 create));
 -int   perl_init_i18nl10n _((int printwarn));
 -int   perl_init_i18nl14n _((int printwarn));
 -void  perl_new_collate _((char* newcoll));
 -void  perl_new_ctype _((char* newctype));
 -void  perl_new_numeric _((char* newcoll));
 -void  perl_set_numeric_local _((void));
 -void  perl_set_numeric_standard _((void));
 +#endif
 +VIRTUAL SV*   perl_get_sv _((char* name, I32 create));
 +VIRTUAL AV*   perl_get_av _((char* name, I32 create));
 +VIRTUAL HV*   perl_get_hv _((char* name, I32 create));
 +VIRTUAL CV*   perl_get_cv _((char* name, I32 create));
 +VIRTUAL int   perl_init_i18nl10n _((int printwarn));
 +VIRTUAL int   perl_init_i18nl14n _((int printwarn));
 +VIRTUAL void  perl_new_collate _((char* newcoll));
 +VIRTUAL void  perl_new_ctype _((char* newctype));
 +VIRTUAL void  perl_new_numeric _((char* newcoll));
 +VIRTUAL void  perl_set_numeric_local _((void));
 +VIRTUAL void  perl_set_numeric_standard _((void));
 +#ifdef PERL_OBJECT
 +VIRTUAL int   perl_parse _((void(*xsinit)(CPerlObj*), int argc, char** argv, char** env));
 +#else
  int   perl_parse _((PerlInterpreter* sv_interp, void(*xsinit)(void), int argc, char** argv, char** env));
 -void  perl_require_pv _((char* pv));
 +#endif
 +VIRTUAL void  perl_require_pv _((char* pv));
  #define perl_requirepv perl_require_pv
 +#ifdef PERL_OBJECT
 +VIRTUAL int   perl_run _((void));
 +#else
  int   perl_run _((PerlInterpreter* sv_interp));
 -void  pidgone _((int pid, int status));
 -void  pmflag _((U16* pmfl, int ch));
 -OP*   pmruntime _((OP* pm, OP* expr, OP* repl));
 -OP*   pmtrans _((OP* o, OP* expr, OP* repl));
 -OP*   pop_return _((void));
 -void  pop_scope _((void));
 -OP*   prepend_elem _((I32 optype, OP* head, OP* tail));
 -void  push_return _((OP* o));
 -void  push_scope _((void));
 -regexp*       pregcomp _((char* exp, char* xend, PMOP* pm));
 -OP*   ref _((OP* o, I32 type));
 -OP*   refkids _((OP* o, I32 type));
 +#endif
 +VIRTUAL void  pidgone _((int pid, int status));
 +VIRTUAL void  pmflag _((U16* pmfl, int ch));
 +VIRTUAL OP*   pmruntime _((OP* pm, OP* expr, OP* repl));
 +VIRTUAL OP*   pmtrans _((OP* o, OP* expr, OP* repl));
 +VIRTUAL OP*   pop_return _((void));
 +VIRTUAL void  pop_scope _((void));
 +VIRTUAL OP*   prepend_elem _((I32 optype, OP* head, OP* tail));
 +VIRTUAL void  push_return _((OP* o));
 +VIRTUAL void  push_scope _((void));
 +VIRTUAL regexp*       pregcomp _((char* exp, char* xend, PMOP* pm));
 +VIRTUAL OP*   ref _((OP* o, I32 type));
 +VIRTUAL OP*   refkids _((OP* o, I32 type));
 +#ifdef DEBUGGING
  void  regdump _((regexp* r));
 -I32   pregexec _((regexp* prog, char* stringarg, char* strend, char* strbeg, I32 minend, SV* screamer, U32 nosave));
 -I32   regexec_flags _((regexp* prog, char* stringarg, char* strend, char* strbeg, I32 minend, SV* screamer, void* data, U32 flags));
 -  void        pregfree _((struct regexp* r));
 -regnode*regnext _((regnode* p));
 +#endif
 +VIRTUAL I32   pregexec _((regexp* prog, char* stringarg, char* strend, char* strbeg, I32 minend, SV* screamer, U32 nosave));
 +VIRTUAL I32   regexec_flags _((regexp* prog, char* stringarg, char* strend, char* strbeg, I32 minend, SV* screamer, void* data, U32 flags));
 +VIRTUAL void  pregfree _((struct regexp* r));
 +VIRTUAL regnode* regnext _((regnode* p));
 +#ifdef DEBUGGING
  void  regprop _((SV* sv, regnode* o));
 -void  repeatcpy _((char* to, char* from, I32 len, I32 count));
 -char* rninstr _((char* big, char* bigend, char* little, char* lend));
 -Sighandler_t rsignal _((int, Sighandler_t));
 -int   rsignal_restore _((int, Sigsave_t*));
 -int   rsignal_save _((int, Sighandler_t, Sigsave_t*));
 -Sighandler_t rsignal_state _((int));
 -void  rxres_free _((void** rsp));
 -void  rxres_restore _((void** rsp, REGEXP* rx));
 -void  rxres_save _((void** rsp, REGEXP* rx));
 +#endif
 +VIRTUAL void  repeatcpy _((char* to, char* from, I32 len, I32 count));
 +VIRTUAL char* rninstr _((char* big, char* bigend, char* little, char* lend));
 +VIRTUAL Sighandler_t rsignal _((int i, Sighandler_t t));
 +VIRTUAL int   rsignal_restore _((int i, Sigsave_t* t));
 +VIRTUAL int   rsignal_save _((int i, Sighandler_t t1, Sigsave_t* t2));
 +VIRTUAL Sighandler_t rsignal_state _((int i));
 +VIRTUAL void  rxres_free _((void** rsp));
 +VIRTUAL void  rxres_restore _((void** rsp, REGEXP* prx));
 +VIRTUAL void  rxres_save _((void** rsp, REGEXP* prx));
  #ifndef HAS_RENAME
 -I32   same_dirent _((char* a, char* b));
 -#endif
 -char* savepv _((char* sv));
 -char* savepvn _((char* sv, I32 len));
 -void  savestack_grow _((void));
 -void  save_aelem _((AV* av, I32 idx, SV **sptr));
 -void  save_aptr _((AV** aptr));
 -AV*   save_ary _((GV* gv));
 -void  save_clearsv _((SV** svp));
 -void  save_delete _((HV* hv, char* key, I32 klen));
 +VIRTUAL I32   same_dirent _((char* a, char* b));
 +#endif
 +VIRTUAL char* savepv _((char* sv));
 +VIRTUAL char* savepvn _((char* sv, I32 len));
 +VIRTUAL void  savestack_grow _((void));
 +VIRTUAL void  save_aelem _((AV* av, I32 idx, SV **sptr));
 +VIRTUAL void  save_aptr _((AV** aptr));
 +VIRTUAL AV*   save_ary _((GV* gv));
 +VIRTUAL void  save_clearsv _((SV** svp));
 +VIRTUAL void  save_delete _((HV* hv, char* key, I32 klen));
  #ifndef titan  /* TitanOS cc can't handle this */
 +#ifdef PERL_OBJECT
 +typedef void (CPerlObj::*DESTRUCTORFUNC) _((void*));
 +VIRTUAL void  save_destructor _((DESTRUCTORFUNC f, void* p));
 +#else
  void  save_destructor _((void (*f)(void*), void* p));
 +#endif
  #endif /* titan */
 -void  save_freesv _((SV* sv));
 -void  save_freeop _((OP* o));
 -void  save_freepv _((char* pv));
 -void  save_gp _((GV* gv, I32 empty));
 -HV*   save_hash _((GV* gv));
 -void  save_helem _((HV* hv, SV *key, SV **sptr));
 -void  save_hptr _((HV** hptr));
 -void  save_I16 _((I16* intp));
 -void  save_I32 _((I32* intp));
 -void  save_int _((int* intp));
 -void  save_item _((SV* item));
 -void  save_iv _((IV* iv));
 -void  save_list _((SV** sarg, I32 maxsarg));
 -void  save_long _((long* longp));
 -void  save_nogv _((GV* gv));
 -void  save_op _((void));
 -SV*   save_scalar _((GV* gv));
 -void  save_pptr _((char** pptr));
 -void  save_sptr _((SV** sptr));
 -SV*   save_svref _((SV** sptr));
 -SV**  save_threadsv _((PADOFFSET i));
 -OP*   sawparens _((OP* o));
 -OP*   scalar _((OP* o));
 -OP*   scalarkids _((OP* o));
 -OP*   scalarseq _((OP* o));
 -OP*   scalarvoid _((OP* o));
 -UV    scan_hex _((char* start, I32 len, I32* retlen));
 -char* scan_num _((char* s));
 -UV    scan_oct _((char* start, I32 len, I32* retlen));
 -OP*   scope _((OP* o));
 -char* screaminstr _((SV* bigsv, SV* littlesv, I32 start_shift, I32 end_shift, I32 *state, I32 last));
 +VIRTUAL void  save_freesv _((SV* sv));
 +VIRTUAL void  save_freeop _((OP* o));
 +VIRTUAL void  save_freepv _((char* pv));
 +VIRTUAL void  save_gp _((GV* gv, I32 empty));
 +VIRTUAL HV*   save_hash _((GV* gv));
 +VIRTUAL void  save_helem _((HV* hv, SV *key, SV **sptr));
 +VIRTUAL void  save_hptr _((HV** hptr));
 +VIRTUAL void  save_I16 _((I16* intp));
 +VIRTUAL void  save_I32 _((I32* intp));
 +VIRTUAL void  save_int _((int* intp));
 +VIRTUAL void  save_item _((SV* item));
 +VIRTUAL void  save_iv _((IV* iv));
 +VIRTUAL void  save_list _((SV** sarg, I32 maxsarg));
 +VIRTUAL void  save_long _((long* longp));
 +VIRTUAL void  save_nogv _((GV* gv));
 +VIRTUAL void  save_op _((void));
 +VIRTUAL SV*   save_scalar _((GV* gv));
 +VIRTUAL void  save_pptr _((char** pptr));
 +VIRTUAL void  save_sptr _((SV** sptr));
 +VIRTUAL SV*   save_svref _((SV** sptr));
 +VIRTUAL SV**  save_threadsv _((PADOFFSET i));
 +VIRTUAL OP*   sawparens _((OP* o));
 +VIRTUAL OP*   scalar _((OP* o));
 +VIRTUAL OP*   scalarkids _((OP* o));
 +VIRTUAL OP*   scalarseq _((OP* o));
 +VIRTUAL OP*   scalarvoid _((OP* o));
 +VIRTUAL UV    scan_hex _((char* start, I32 len, I32* retlen));
 +VIRTUAL char* scan_num _((char* s));
 +VIRTUAL UV    scan_oct _((char* start, I32 len, I32* retlen));
 +VIRTUAL OP*   scope _((OP* o));
 +VIRTUAL char* screaminstr _((SV* bigsv, SV* littlesv, I32 start_shift, I32 end_shift, I32 *state, I32 last));
  #ifndef VMS
 -I32   setenv_getix _((char* nam));
 -#endif
 -void  setdefout _((GV* gv));
 -char* sharepvn _((char* sv, I32 len, U32 hash));
 -HEK*  share_hek _((char* sv, I32 len, U32 hash));
 -Signal_t sighandler _((int sig));
 -SV**  stack_grow _((SV** sp, SV**p, int n));
 -I32   start_subparse _((I32 is_format, U32 flags));
 -void  sub_crush_depth _((CV* cv));
 -bool  sv_2bool _((SV* sv));
 -CV*   sv_2cv _((SV* sv, HV** st, GV** gvp, I32 lref));
 -IO*   sv_2io _((SV* sv));
 -IV    sv_2iv _((SV* sv));
 -SV*   sv_2mortal _((SV* sv));
 -double        sv_2nv _((SV* sv));
 -char* sv_2pv _((SV* sv, STRLEN* lp));
 -UV    sv_2uv _((SV* sv));
 -IV    sv_iv _((SV* sv));
 -UV    sv_uv _((SV* sv));
 -double        sv_nv _((SV* sv));
 -char *        sv_pvn _((SV *, STRLEN *));
 -I32   sv_true _((SV *));
 -void  sv_add_arena _((char* ptr, U32 size, U32 flags));
 -int   sv_backoff _((SV* sv));
 -SV*   sv_bless _((SV* sv, HV* stash));
 -void  sv_catpvf _((SV* sv, const char* pat, ...));
 -void  sv_catpvf_mg _((SV* sv, const char* pat, ...));
 -void  sv_catpv _((SV* sv, char* ptr));
 -void  sv_catpv_mg _((SV* sv, char* ptr));
 -void  sv_catpvn _((SV* sv, char* ptr, STRLEN len));
 -void  sv_catpvn_mg _((SV* sv, char* ptr, STRLEN len));
 -void  sv_catsv _((SV* dsv, SV* ssv));
 -void  sv_catsv_mg _((SV* dsv, SV* ssv));
 -void  sv_chop _((SV* sv, char* ptr));
 -void  sv_clean_all _((void));
 -void  sv_clean_objs _((void));
 -void  sv_clear _((SV* sv));
 -I32   sv_cmp _((SV* sv1, SV* sv2));
 -I32   sv_cmp_locale _((SV* sv1, SV* sv2));
 +VIRTUAL I32   setenv_getix _((char* nam));
 +#endif
 +VIRTUAL void  setdefout _((GV* gv));
 +VIRTUAL char* sharepvn _((char* sv, I32 len, U32 hash));
 +VIRTUAL HEK*  share_hek _((char* sv, I32 len, U32 hash));
 +VIRTUAL Signal_t sighandler _((int sig));
 +VIRTUAL SV**  stack_grow _((SV** sp, SV**p, int n));
 +VIRTUAL I32   start_subparse _((I32 is_format, U32 flags));
 +VIRTUAL void  sub_crush_depth _((CV* cv));
 +VIRTUAL bool  sv_2bool _((SV* sv));
 +VIRTUAL CV*   sv_2cv _((SV* sv, HV** st, GV** gvp, I32 lref));
 +VIRTUAL IO*   sv_2io _((SV* sv));
 +VIRTUAL IV    sv_2iv _((SV* sv));
 +VIRTUAL SV*   sv_2mortal _((SV* sv));
 +VIRTUAL double        sv_2nv _((SV* sv));
 +VIRTUAL char* sv_2pv _((SV* sv, STRLEN* lp));
 +VIRTUAL UV    sv_2uv _((SV* sv));
 +VIRTUAL IV    sv_iv _((SV* sv));
 +VIRTUAL UV    sv_uv _((SV* sv));
 +VIRTUAL double        sv_nv _((SV* sv));
 +VIRTUAL char *        sv_pvn _((SV *sv, STRLEN *len));
 +VIRTUAL I32   sv_true _((SV *sv));
 +VIRTUAL void  sv_add_arena _((char* ptr, U32 size, U32 flags));
 +VIRTUAL int   sv_backoff _((SV* sv));
 +VIRTUAL SV*   sv_bless _((SV* sv, HV* stash));
 +VIRTUAL void  sv_catpvf _((SV* sv, const char* pat, ...));
 +VIRTUAL void  sv_catpv _((SV* sv, char* ptr));
 +VIRTUAL void  sv_catpvn _((SV* sv, char* ptr, STRLEN len));
 +VIRTUAL void  sv_catsv _((SV* dsv, SV* ssv));
 +VIRTUAL void  sv_chop _((SV* sv, char* ptr));
 +VIRTUAL void  sv_clean_all _((void));
 +VIRTUAL void  sv_clean_objs _((void));
 +VIRTUAL void  sv_clear _((SV* sv));
 +VIRTUAL I32   sv_cmp _((SV* sv1, SV* sv2));
 +VIRTUAL I32   sv_cmp_locale _((SV* sv1, SV* sv2));
  #ifdef USE_LOCALE_COLLATE
 -char* sv_collxfrm _((SV* sv, STRLEN* nxp));
 -#endif
 -OP*   sv_compile_2op _((SV* sv, OP** startp, char* code, AV** avp));
 -void  sv_dec _((SV* sv));
 -void  sv_dump _((SV* sv));
 -bool  sv_derived_from _((SV* sv, char* name));
 -I32   sv_eq _((SV* sv1, SV* sv2));
 -void  sv_free _((SV* sv));
 -void  sv_free_arenas _((void));
 -char* sv_gets _((SV* sv, PerlIO* fp, I32 append));
 +VIRTUAL char* sv_collxfrm _((SV* sv, STRLEN* nxp));
 +#endif
 +VIRTUAL OP*   sv_compile_2op _((SV* sv, OP** startp, char* code, AV** avp));
 +VIRTUAL void  sv_dec _((SV* sv));
 +VIRTUAL void  sv_dump _((SV* sv));
 +VIRTUAL bool  sv_derived_from _((SV* sv, char* name));
 +VIRTUAL I32   sv_eq _((SV* sv1, SV* sv2));
 +VIRTUAL void  sv_free _((SV* sv));
 +VIRTUAL void  sv_free_arenas _((void));
 +VIRTUAL char* sv_gets _((SV* sv, PerlIO* fp, I32 append));
  #ifndef DOSISH
 -char* sv_grow _((SV* sv, I32 newlen));
 +VIRTUAL char* sv_grow _((SV* sv, I32 newlen));
  #else
 -char* sv_grow _((SV* sv, unsigned long newlen));
 -#endif
 -void  sv_inc _((SV* sv));
 -void  sv_insert _((SV* bigsv, STRLEN offset, STRLEN len, char* little, STRLEN littlelen));
 -int   sv_isa _((SV* sv, char* name));
 -int   sv_isobject _((SV* sv));
 -STRLEN        sv_len _((SV* sv));
 -void  sv_magic _((SV* sv, SV* obj, int how, char* name, I32 namlen));
 -SV*   sv_mortalcopy _((SV* oldsv));
 -SV*   sv_newmortal _((void));
 -SV*   sv_newref _((SV* sv));
 +VIRTUAL char* sv_grow _((SV* sv, unsigned long newlen));
 +#endif
 +VIRTUAL void  sv_inc _((SV* sv));
 +VIRTUAL void  sv_insert _((SV* bigsv, STRLEN offset, STRLEN len, char* little, STRLEN littlelen));
 +VIRTUAL int   sv_isa _((SV* sv, char* name));
 +VIRTUAL int   sv_isobject _((SV* sv));
 +VIRTUAL STRLEN        sv_len _((SV* sv));
 +VIRTUAL void  sv_magic _((SV* sv, SV* obj, int how, char* name, I32 namlen));
 +VIRTUAL SV*   sv_mortalcopy _((SV* oldsv));
 +VIRTUAL SV*   sv_newmortal _((void));
 +VIRTUAL SV*   sv_newref _((SV* sv));
 +#ifdef DEBUGGING
  char* sv_peek _((SV* sv));
 -char* sv_pvn_force _((SV* sv, STRLEN* lp));
 -char* sv_reftype _((SV* sv, int ob));
 -void  sv_replace _((SV* sv, SV* nsv));
 -void  sv_report_used _((void));
 -void  sv_reset _((char* s, HV* stash));
 -void  sv_setpvf _((SV* sv, const char* pat, ...));
 -void  sv_setpvf_mg _((SV* sv, const char* pat, ...));
 -void  sv_setiv _((SV* sv, IV num));
 -void  sv_setiv_mg _((SV* sv, IV num));
 -void  sv_setpviv _((SV* sv, IV num));
 -void  sv_setpviv_mg _((SV* sv, IV num));
 -void  sv_setuv _((SV* sv, UV num));
 -void  sv_setuv_mg _((SV* sv, UV num));
 -void  sv_setnv _((SV* sv, double num));
 -void  sv_setnv_mg _((SV* sv, double num));
 -SV*   sv_setref_iv _((SV* rv, char* classname, IV iv));
 -SV*   sv_setref_nv _((SV* rv, char* classname, double nv));
 -SV*   sv_setref_pv _((SV* rv, char* classname, void* pv));
 -SV*   sv_setref_pvn _((SV* rv, char* classname, char* pv, I32 n));
 -void  sv_setpv _((SV* sv, const char* ptr));
 -void  sv_setpv_mg _((SV* sv, const char* ptr));
 -void  sv_setpvn _((SV* sv, const char* ptr, STRLEN len));
 -void  sv_setpvn_mg _((SV* sv, const char* ptr, STRLEN len));
 -void  sv_setsv _((SV* dsv, SV* ssv));
 -void  sv_setsv_mg _((SV* dsv, SV* ssv));
 -void  sv_taint _((SV* sv));
 -bool  sv_tainted _((SV* sv));
 -int   sv_unmagic _((SV* sv, int type));
 -void  sv_unref _((SV* sv));
 -void  sv_untaint _((SV* sv));
 -bool  sv_upgrade _((SV* sv, U32 mt));
 -void  sv_usepvn _((SV* sv, char* ptr, STRLEN len));
 -void  sv_usepvn_mg _((SV* sv, char* ptr, STRLEN len));
 -void  sv_vcatpvfn _((SV* sv, const char* pat, STRLEN patlen,
 +#endif
 +VIRTUAL char* sv_pvn_force _((SV* sv, STRLEN* lp));
 +VIRTUAL char* sv_reftype _((SV* sv, int ob));
 +VIRTUAL void  sv_replace _((SV* sv, SV* nsv));
 +VIRTUAL void  sv_report_used _((void));
 +VIRTUAL void  sv_reset _((char* s, HV* stash));
 +VIRTUAL void  sv_setpvf _((SV* sv, const char* pat, ...));
 +VIRTUAL void  sv_setiv _((SV* sv, IV num));
 +VIRTUAL void  sv_setpviv _((SV* sv, IV num));
 +VIRTUAL void  sv_setuv _((SV* sv, UV num));
 +VIRTUAL void  sv_setnv _((SV* sv, double num));
 +VIRTUAL SV*   sv_setref_iv _((SV* rv, char* classname, IV iv));
 +VIRTUAL SV*   sv_setref_nv _((SV* rv, char* classname, double nv));
 +VIRTUAL SV*   sv_setref_pv _((SV* rv, char* classname, void* pv));
 +VIRTUAL SV*   sv_setref_pvn _((SV* rv, char* classname, char* pv, I32 n));
 +VIRTUAL void  sv_setpv _((SV* sv, const char* ptr));
 +VIRTUAL void  sv_setpvn _((SV* sv, const char* ptr, STRLEN len));
 +VIRTUAL void  sv_setsv _((SV* dsv, SV* ssv));
 +VIRTUAL void  sv_taint _((SV* sv));
 +VIRTUAL bool  sv_tainted _((SV* sv));
 +VIRTUAL int   sv_unmagic _((SV* sv, int type));
 +VIRTUAL void  sv_unref _((SV* sv));
 +VIRTUAL void  sv_untaint _((SV* sv));
 +VIRTUAL bool  sv_upgrade _((SV* sv, U32 mt));
 +VIRTUAL void  sv_usepvn _((SV* sv, char* ptr, STRLEN len));
 +VIRTUAL void  sv_vcatpvfn _((SV* sv, const char* pat, STRLEN patlen,
                       va_list* args, SV** svargs, I32 svmax,
                       bool *used_locale));
 -void  sv_vsetpvfn _((SV* sv, const char* pat, STRLEN patlen,
 +VIRTUAL void  sv_vsetpvfn _((SV* sv, const char* pat, STRLEN patlen,
                       va_list* args, SV** svargs, I32 svmax,
                       bool *used_locale));
 -void  taint_env _((void));
 -void  taint_proper _((const char* f, char* s));
 +VIRTUAL void  taint_env _((void));
 +VIRTUAL void  taint_proper _((const char* f, char* s));
  #ifdef UNLINK_ALL_VERSIONS
 -I32   unlnk _((char* f));
 +VIRTUAL I32   unlnk _((char* f));
  #endif
  #ifdef USE_THREADS
 -void  unlock_condpair _((void* svv));
 -#endif
 -void  unsharepvn _((char* sv, I32 len, U32 hash));
 -void  unshare_hek _((HEK* hek));
 -void  utilize _((int aver, I32 floor, OP* version, OP* id, OP* arg));
 -void  vivify_defelem _((SV* sv));
 -void  vivify_ref _((SV* sv, U32 to_what));
 -I32   wait4pid _((int pid, int* statusp, int flags));
 -void  warn _((const char* pat,...));
 +VIRTUAL void  unlock_condpair _((void* svv));
 +#endif
 +VIRTUAL void  unsharepvn _((char* sv, I32 len, U32 hash));
 +VIRTUAL void  unshare_hek _((HEK* hek));
 +VIRTUAL void  utilize _((int aver, I32 floor, OP* version, OP* id, OP* arg));
 +VIRTUAL void  vivify_defelem _((SV* sv));
 +VIRTUAL void  vivify_ref _((SV* sv, U32 to_what));
 +VIRTUAL I32   wait4pid _((int pid, int* statusp, int flags));
 +VIRTUAL void  warn _((const char* pat,...));
 +#ifdef DEBUGGING
  void  watch _((char** addr));
 -I32   whichsig _((char* sig));
 -int   yyerror _((char* s));
 -int   yylex _((void));
 -int   yyparse _((void));
 -int   yywarn _((char* s));
 +#endif
 +VIRTUAL I32   whichsig _((char* sig));
 +VIRTUAL int   yyerror _((char* s));
 +VIRTUAL int   yylex _((void));
 +VIRTUAL int   yyparse _((void));
 +VIRTUAL int   yywarn _((char* s));
  
  #ifndef MYMALLOC
 -Malloc_t safemalloc _((MEM_SIZE nbytes));
 -Malloc_t safecalloc _((MEM_SIZE elements, MEM_SIZE size));
 -Malloc_t saferealloc _((Malloc_t where, MEM_SIZE nbytes));
 -Free_t   safefree _((Malloc_t where));
 +VIRTUAL Malloc_t safemalloc _((MEM_SIZE nbytes));
 +VIRTUAL Malloc_t safecalloc _((MEM_SIZE elements, MEM_SIZE size));
 +VIRTUAL Malloc_t saferealloc _((Malloc_t where, MEM_SIZE nbytes));
 +VIRTUAL Free_t   safefree _((Malloc_t where));
  #endif
  
  #ifdef LEAKTEST
diff --cc regcomp.c
+++ b/regcomp.c
@@@ -115,12 -127,19 +115,11 @@@ static regnode *reg_node _((U8))
  static regnode *regpiece _((I32 *));
  static void reginsert _((U8, regnode *));
  static void regoptail _((regnode *, regnode *));
- static void regset _((char *, I32));
  static void regtail _((regnode *, regnode *));
 -static char* regwhite _((char *, char *));
  static char* nextchar _((void));
 -static void re_croak2 _((const char* pat1,const char* pat2,...)) __attribute__((noreturn));
  
 -static U32 regseen;
 -static I32 seen_zerolen;
 -static regexp *rx;
 -static I32 extralen;
 -
 -#ifdef DEBUGGING
 -static int colorset;
 -#endif 
 +static void re_croak2 _((const char* pat1,const char* pat2,...)) __attribute__((noreturn));
 +#endif
  
  /* Length of a variant. */
  
@@@ -1813,16 -1833,7 +1815,7 @@@ regwhite(char *p, char *e
      return p;
  }
  
- STATIC void
- regset(char *opnd, register I32 c)
- {
-     if (SIZE_ONLY)
-       return;
-     c &= 0xFF;
-     opnd[1 + (c >> 3)] |= (1 << (c & 7));
- }
 -static regnode *
 +STATIC regnode *
  regclass(void)
  {
      register char *opnd, *s;
diff --cc regcomp.h
Simple merge
diff --cc regexec.c
+++ b/regexec.c
@@@ -77,9 -118,9 +78,10 @@@ static I32 regtry _((regexp *prog, cha
  static bool reginclass _((char *p, I32 c));
  static CHECKPOINT regcppush _((I32 parenfloor));
  static char * regcppop _((void));
 +#endif
+ #define REGINCLASS(p,c)  (*(p) ? reginclass(p,c) : ANYOF_TEST(p,c))
  
 -static CHECKPOINT
 +STATIC CHECKPOINT
  regcppush(I32 parenfloor)
  {
      dTHR;
@@@ -848,13 -890,13 +850,13 @@@ regmatch(regnode *prog
            break;
        case ANYOF:
            s = (char *) OPERAND(scan);
 -          if (nextchar < 0)
 -              nextchar = UCHARAT(locinput);
 +          if (nextchr < 0)
 +              nextchr = UCHARAT(locinput);
-           if (!reginclass(s, nextchr))
+           if (!REGINCLASS(s, nextchar))
                sayNO;
 -          if (!nextchar && locinput >= regeol)
 +          if (!nextchr && locinput >= regeol)
                sayNO;
 -          nextchar = UCHARAT(++locinput);
 +          nextchr = UCHARAT(++locinput);
            break;
        case ALNUML:
            reg_flags |= RF_tainted;
diff --cc sv.c
Simple merge
diff --cc sv.h
Simple merge
diff --cc thread.h
Simple merge
diff --cc toke.c
Simple merge
diff --cc util.c
Simple merge
diff --cc vms/vms.c
Simple merge
diff --cc win32/Makefile
@@@ -678,20 -676,16 +682,24 @@@ realclean: clea
        cd $(EXTDIR)
        -del /s *.lib *.def *.map *.bs Makefile *$(o) pm_to_blib
        cd ..\win32
 +      -del /f $(EXTDIR)\DynaLoader\dl_win32.xs
 +      -del /f $(EXTDIR)\DynaLoader\DynaLoader.c
 +      -del /f $(LIBDIR)\.exists $(LIBDIR)\attrs.pm $(LIBDIR)\Dynaloader.pm $(LIBDIR)\FCntl.pm
 +      -del /f $(LIBDIR)\IO.pm $(LIBDIR)\Opcode.pm $(LIBDIR)\ops.pm $(LIBDIR)\Safe.pm
 +      -del /f $(LIBDIR)\SDBM_File.pm $(LIBDIR)\Socket.pm
 +      -del /f ..\x2p\find2perl ..\x2p\s2p
 +      -rmdir /s /q $(LIBDIR)\IO || rmdir /s $(LIBDIR)\IO
        -rmdir /s /q $(AUTODIR) || rmdir /s $(AUTODIR)
        -rmdir /s /q $(COREDIR) || rmdir /s $(COREDIR)
 +      -rmdir /s /q $(MINIDIR) || rmdir /s $(MINIDIR)
  
- install : all doc utils
+ install : all installbare installutils installhtml
+ installbare :
        $(PERLEXE) ..\installperl
        $(XCOPY) $(PERL95EXE) $(INST_BIN)\*.*
+ installutils : utils
        $(XCOPY) $(GLOBEXE) $(INST_BIN)\*.*
        $(XCOPY) bin\*.bat $(INST_BIN)\*.*
        $(XCOPY) ..\pod\*.bat $(INST_BIN)\*.*
diff --cc win32/config.bc
@@@ -159,11 -159,11 +159,11 @@@ d_mkfifo='undef
  d_mkstemp='undef'
  d_mktime='define'
  d_msg='undef'
- d_msgctl='define'
- d_msgget='define'
- d_msgrcv='define'
- d_msgsnd='define'
+ d_msgctl='undef'
+ d_msgget='undef'
+ d_msgrcv='undef'
+ d_msgsnd='undef'
 -d_mymalloc='define'
 +d_mymalloc='undef'
  d_nice='undef'
  d_oldpthreads='undef'
  d_oldsock='undef'
diff --cc win32/config.gc
@@@ -159,11 -159,11 +159,11 @@@ d_mkfifo='undef
  d_mkstemp='undef'
  d_mktime='define'
  d_msg='undef'
- d_msgctl='define'
- d_msgget='define'
- d_msgrcv='define'
- d_msgsnd='define'
+ d_msgctl='undef'
+ d_msgget='undef'
+ d_msgrcv='undef'
+ d_msgsnd='undef'
 -d_mymalloc='define'
 +d_mymalloc='undef'
  d_nice='undef'
  d_oldpthreads='undef'
  d_oldsock='undef'
diff --cc win32/config.vc
@@@ -159,11 -159,11 +159,11 @@@ d_mkfifo='undef
  d_mkstemp='undef'
  d_mktime='define'
  d_msg='undef'
- d_msgctl='define'
- d_msgget='define'
- d_msgrcv='define'
- d_msgsnd='define'
+ d_msgctl='undef'
+ d_msgget='undef'
+ d_msgrcv='undef'
+ d_msgsnd='undef'
 -d_mymalloc='define'
 +d_mymalloc='undef'
  d_nice='undef'
  d_oldpthreads='undef'
  d_oldsock='undef'
Simple merge
Simple merge
Simple merge
Simple merge
@@@ -797,11 -810,22 +807,13 @@@ distclean: clea
                $(PERLIMPLIB) ..\miniperl.lib $(MINIMOD)
        -del /f *.def *.map
        -del /f $(EXTENSION_DLL)
 -      -del /f $(EXTENSION_C) $(DYNALOADER).c
 -      -del /f $(EXTDIR)\DynaLoader\dl_win32.xs
 -      -del /f $(LIBDIR)\.exists $(LIBDIR)\attrs.pm $(LIBDIR)\DynaLoader.pm
 -      -del /f $(LIBDIR)\Fcntl.pm $(LIBDIR)\IO.pm $(LIBDIR)\Opcode.pm
 -      -del /f $(LIBDIR)\ops.pm $(LIBDIR)\Safe.pm $(LIBDIR)\Thread.pm
 -      -del /f $(LIBDIR)\SDBM_File.pm $(LIBDIR)\Socket.pm $(LIBDIR)\POSIX.pm
 -      -del /f $(LIBDIR)\B.pm $(LIBDIR)\O.pm
 -      -rmdir /s /q $(LIBDIR)\IO || rmdir /s $(LIBDIR)\IO
 -      -rmdir /s /q $(LIBDIR)\Thread || rmdir /s $(LIBDIR)\Thread
 -      -rmdir /s /q $(LIBDIR)\B || rmdir /s $(LIBDIR)\B
 +      -del /f $(EXTENSION_C)
        -del /f $(PODDIR)\*.html
        -del /f $(PODDIR)\*.bat
+       -cd ..\utils && del /f h2ph splain perlbug pl2pm c2ph h2xs perldoc pstruct *.bat
+       -cd ..\x2p && del /f find2perl s2p *.bat
        -del /f ..\config.sh ..\splittree.pl perlmain.c dlutils.c config.h.new
 -      -del /f $(CONFIGPM)
 +      -del /f ..\lib\Config.pm
  .IF "$(PERL95EXE)" != ""
        -del /f perl95.c
  .ENDIF
        -cd $(EXTDIR) && del /s *.lib *.def *.map *.bs Makefile *$(o) pm_to_blib
        -rmdir /s /q $(AUTODIR) || rmdir /s $(AUTODIR)
        -rmdir /s /q $(COREDIR) || rmdir /s $(COREDIR)
 -
 -install : all installbare installutils installhtml
 +      -rmdir /s /q $(MINIDIR) || rmdir /s $(MINIDIR)
  
- install : all doc utils
+ installbare :
        $(PERLEXE) ..\installperl
  .IF "$(PERL95EXE)" != ""
        $(XCOPY) $(PERL95EXE) $(INST_BIN)\*.*
diff --cc win32/win32.c
@@@ -111,31 -73,8 +111,9 @@@ static BOOL                has_redirection(char *ptr)
  static long           filetime_to_clock(PFILETIME ft);
  static BOOL           filetime_from_time(PFILETIME ft, time_t t);
  
- char *        w32_perlshell_tokens = Nullch;
- char **       w32_perlshell_vec;
- long  w32_perlshell_items = -1;
- DWORD w32_platform = (DWORD)-1;
- char  w32_perllib_root[MAX_PATH+1];
 +
  HANDLE        w32_perldll_handle = INVALID_HANDLE_VALUE;
- #ifndef __BORLANDC__
- long  w32_num_children = 0;
- HANDLE        w32_child_pids[MAXIMUM_WAIT_OBJECTS];
- #endif
- #ifndef FOPEN_MAX
- #  if defined(_NSTREAM_)
- #    define FOPEN_MAX _NSTREAM_
- #  elsif defined(_NFILE_)
- #    define FOPEN_MAX _NFILE_
- #  elsif defined(_NFILE)
- #    define FOPEN_MAX _NFILE
- #  endif
- #endif
- #ifndef USE_CRT_POPEN
- int   w32_popen_pids[FOPEN_MAX];
- #endif
+ static DWORD  w32_platform = (DWORD)-1;
  
  #ifdef USE_THREADS
  #  ifdef USE_DECLSPEC_THREAD
diff --cc win32/win32.h
@@@ -138,11 -119,8 +138,13 @@@ struct tms 
  #pragma warn -csu     /* "comparing signed and unsigned values" */
  #pragma warn -pro     /* "call to function with no prototype" */
  
+ #define USE_RTL_WAIT  /* Borland has a working wait() */
 +/* Borland is picky about a bare member function name used as its ptr */
 +#ifdef PERL_OBJECT
 +#define FUNC_NAME_TO_PTR(name)        &(name)
 +#endif
 +
  #endif
  
  #ifdef _MSC_VER                       /* Microsoft Visual C++ */