[win32] integrate mainline changes
Gurusamy Sarathy [Sat, 7 Mar 1998 07:51:28 +0000 (07:51 +0000)]
p4raw-id: //depot/asperl@799

26 files changed:
1  2 
XSUB.h
embed.h
ext/Opcode/Opcode.xs
global.sym
gv.c
mg.c
op.c
perl.c
perl.h
perldir.h
perly.c
pp.c
pp_ctl.c
pp_hot.c
pp_sys.c
proto.h
regcomp.c
scope.c
scope.h
sv.c
toke.c
util.c
win32/Makefile
win32/config_H.vc
win32/makefile.mk
win32/win32.c

diff --cc XSUB.h
Simple merge
diff --cc embed.h
Simple merge
Simple merge
diff --cc global.sym
Simple merge
diff --cc gv.c
Simple merge
diff --cc mg.c
Simple merge
diff --cc op.c
--- 1/op.c
--- 2/op.c
+++ b/op.c
@@@ -48,9 -41,9 +48,10 @@@ static void null _((OP* o))
  static PADOFFSET pad_findlex _((char* name, PADOFFSET newoff, U32 seq,
        CV* startcv, I32 cx_ix));
  static OP *newDEFSVOP _((void));
+ static OP *new_logop _((I32 type, I32 flags, OP **firstp, OP **otherp));
 +#endif
  
 -static char*
 +STATIC char*
  gv_ename(GV *gv)
  {
      SV* tmpsv = sv_newmortal();
@@@ -2603,6 -2609,12 +2614,12 @@@ intro_my(void
  OP *
  newLOGOP(I32 type, I32 flags, OP *first, OP *other)
  {
+     return new_logop(type, flags, &first, &other);
+ }
 -static OP *
++STATIC OP *
+ new_logop(I32 type, I32 flags, OP** firstp, OP** otherp)
+ {
      dTHR;
      LOGOP *logop;
      OP *o;
diff --cc perl.c
Simple merge
diff --cc perl.h
Simple merge
diff --cc perldir.h
+++ b/perldir.h
@@@ -2,20 -2,8 +2,20 @@@
  #define H_PERLDIR 1
  
  #ifdef PERL_OBJECT
 +
 +#include "ipdir.h"
 +
 +#define PerlDir_mkdir(name, mode) piDir->Makedir((name), (mode), ErrorNo())
 +#define PerlDir_chdir(name) piDir->Chdir((name), ErrorNo())
 +#define PerlDir_rmdir(name) piDir->Rmdir((name), ErrorNo())
 +#define PerlDir_close(dir) piDir->Close((dir), ErrorNo())
 +#define PerlDir_open(name) piDir->Open((name), ErrorNo())
 +#define PerlDir_read(dir) piDir->Read((dir), ErrorNo())
 +#define PerlDir_rewind(dir) piDir->Rewind((dir), ErrorNo())
 +#define PerlDir_seek(dir, loc) piDir->Seek((dir), (loc), ErrorNo())
 +#define PerlDir_tell(dir) piDir->Tell((dir), ErrorNo())
  #else
- #define PerlDir_mkdir(name, mode) mkdir((name), (mode))
+ #define PerlDir_mkdir(name, mode) Mkdir((name), (mode))
  #define PerlDir_chdir(name) chdir((name))
  #define PerlDir_rmdir(name) rmdir((name))
  #define PerlDir_close(dir) closedir((dir))
diff --cc perly.c
Simple merge
diff --cc pp.c
Simple merge
diff --cc pp_ctl.c
Simple merge
diff --cc pp_hot.c
Simple merge
diff --cc pp_sys.c
+++ b/pp_sys.c
@@@ -3932,8 -3932,8 +3932,8 @@@ PP(pp_gservent
  PP(pp_shostent)
  {
      djSP;
- #ifdef HAS_SOCKET
+ #ifdef HAS_SETHOSTENT
 -    sethostent(TOPi);
 +    PerlSock_sethostent(TOPi);
      RETSETYES;
  #else
      DIE(no_sock_func, "sethostent");
  PP(pp_snetent)
  {
      djSP;
- #ifdef HAS_SOCKET
+ #ifdef HAS_SETNETENT
 -    setnetent(TOPi);
 +    PerlSock_setnetent(TOPi);
      RETSETYES;
  #else
      DIE(no_sock_func, "setnetent");
  PP(pp_sprotoent)
  {
      djSP;
- #ifdef HAS_SOCKET
+ #ifdef HAS_SETPROTOENT
 -    setprotoent(TOPi);
 +    PerlSock_setprotoent(TOPi);
      RETSETYES;
  #else
      DIE(no_sock_func, "setprotoent");
  PP(pp_sservent)
  {
      djSP;
- #ifdef HAS_SOCKET
+ #ifdef HAS_SETSERVENT
 -    setservent(TOPi);
 +    PerlSock_setservent(TOPi);
      RETSETYES;
  #else
      DIE(no_sock_func, "setservent");
  PP(pp_ehostent)
  {
      djSP;
- #ifdef HAS_SOCKET
+ #ifdef HAS_ENDHOSTENT
 -    endhostent();
 +    PerlSock_endhostent();
-     EXTEND(sp,1);
+     EXTEND(SP,1);
      RETPUSHYES;
  #else
      DIE(no_sock_func, "endhostent");
  PP(pp_enetent)
  {
      djSP;
- #ifdef HAS_SOCKET
+ #ifdef HAS_ENDNETENT
 -    endnetent();
 +    PerlSock_endnetent();
-     EXTEND(sp,1);
+     EXTEND(SP,1);
      RETPUSHYES;
  #else
      DIE(no_sock_func, "endnetent");
  PP(pp_eprotoent)
  {
      djSP;
- #ifdef HAS_SOCKET
+ #ifdef HAS_ENDPROTOENT
 -    endprotoent();
 +    PerlSock_endprotoent();
-     EXTEND(sp,1);
+     EXTEND(SP,1);
      RETPUSHYES;
  #else
      DIE(no_sock_func, "endprotoent");
  PP(pp_eservent)
  {
      djSP;
- #ifdef HAS_SOCKET
+ #ifdef HAS_ENDSERVENT
 -    endservent();
 +    PerlSock_endservent();
-     EXTEND(sp,1);
+     EXTEND(SP,1);
      RETPUSHYES;
  #else
      DIE(no_sock_func, "endservent");
diff --cc proto.h
+++ b/proto.h
@@@ -152,143 -137,143 +152,143 @@@ void dump_op _((OP* arg))
  void  dump_pm _((PMOP* pm));
  void  dump_packsubs _((HV* stash));
  void  dump_sub _((GV* gv));
- VIRTUAL void  fbm_compile _((SV* sv));
 -void  fbm_compile _((SV* sv, U32 flags));
 -char* fbm_instr _((unsigned char* big, unsigned char* bigend, SV* littlesv));
++VIRTUAL void  fbm_compile _((SV* sv, U32 flags));
 +VIRTUAL char* fbm_instr _((unsigned char* big, unsigned char* bigend, SV* littlesv));
  #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_getpack   _((SV* sv, MAGIC* mg));
 -int   magic_getpos    _((SV* sv, MAGIC* mg));
 -int   magic_getsig    _((SV* sv, MAGIC* mg));
 -int   magic_gettaint  _((SV* sv, MAGIC* mg));
 -int   magic_getuvar   _((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_getpack   _((SV* sv, MAGIC* mg));
 +VIRTUAL int   magic_getpos    _((SV* sv, MAGIC* mg));
 +VIRTUAL int   magic_getsig    _((SV* sv, MAGIC* mg));
 +VIRTUAL int   magic_gettaint  _((SV* sv, MAGIC* mg));
 +VIRTUAL int   magic_getuvar   _((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* , char* , I32));
 +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));
@@@ -302,334 -287,316 +302,336 @@@ 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  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 *));
 +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  newFORM _((I32 floor, OP* o, OP* block));
 +VIRTUAL OP*   newFOROP _((I32 flags, char* label, line_t forline, OP* scalar, 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)(CPERLproto_ CV* cv), 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* ref));
 +#if !defined(__GNUC__) && (defined(CRIPPLED_CC) || defined(USE_THREADS) || defined(PERL_OBJECT))
 +VIRTUAL SV*   newRV_noinc _((SV *));
  #endif
  #ifdef LEAKTEST
 -SV*   newSV _((I32 x, STRLEN len));
 +VIRTUAL SV*   newSV _((I32 x, STRLEN len));
  #else
 -SV*   newSV _((STRLEN len));
 -#endif
 -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 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
 -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 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));
 -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 I32   perl_call_argv _((char* subname, I32 flags, char** argv));
 +VIRTUAL I32   perl_call_method _((char* methname, I32 flags));
 +VIRTUAL I32   perl_call_pv _((char* subname, 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, Sighandler_t));
 +VIRTUAL int   rsignal_restore _((int, Sigsave_t*));
 +VIRTUAL int   rsignal_save _((int, Sighandler_t, Sigsave_t*));
 +VIRTUAL Sighandler_t rsignal_state _((int));
 +VIRTUAL void  rxres_free _((void** rsp));
 +VIRTUAL void  rxres_restore _((void** rsp, REGEXP* rx));
 +VIRTUAL void  rxres_save _((void** rsp, REGEXP* rx));
  #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 *, STRLEN *));
 +VIRTUAL I32   sv_true _((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
@@@ -117,8 -129,19 +117,10 @@@ 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;
 -char *colors[4];
 -#endif 
++static void re_croak2 _((const char* pat1,const char* pat2,...)) __attribute__((noreturn));
 +#endif
  
  /* Length of a variant. */
  
diff --cc scope.c
+++ b/scope.c
@@@ -690,20 -711,29 +715,29 @@@ leave_scope(I32 base
            break;
        case SAVEt_DESTRUCTOR:
            ptr = SSPOPPTR;
 -          (*SSPOPDPTR)(ptr);
 +          (CALLDESTRUCTOR)(ptr);
            break;
        case SAVEt_REGCONTEXT:
-           {
-               I32 delta = SSPOPINT;
-               savestack_ix -= delta;  /* regexp must have croaked */
-           }
+           i = SSPOPINT;
+           savestack_ix -= i;          /* regexp must have croaked */
            break;
        case SAVEt_STACK_POS:           /* Position on Perl stack */
-           {
-               I32 delta = SSPOPINT;
-               stack_sp = stack_base + delta;
-           }
+           i = SSPOPINT;
+           stack_sp = stack_base + i;
            break;
+       case SAVEt_AELEM:               /* array element */
+           value = (SV*)SSPOPPTR;
+           i = SSPOPINT;
+           av = (AV*)SSPOPPTR;
+           ptr = av_fetch(av,i,1);
+           goto restore_sv;
+       case SAVEt_HELEM:               /* hash element */
+           value = (SV*)SSPOPPTR;
+           sv = (SV*)SSPOPPTR;
+           hv = (HV*)SSPOPPTR;
+           ptr = hv_fetch_ent(hv, sv, 1, 0);
+           ptr = &HeVAL((HE*)ptr);
+           goto restore_sv;
        case SAVEt_OP:
            op = (OP*)SSPOPPTR;
            break;
diff --cc scope.h
Simple merge
diff --cc sv.c
Simple merge
diff --cc toke.c
--- 1/toke.c
--- 2/toke.c
+++ b/toke.c
@@@ -748,15 -758,88 +748,88 @@@ sublex_done(void
      }
  }
  
+ /*
+   scan_const
+   Extracts a pattern, double-quoted string, or transliteration.  This
+   is terrifying code.
+   It looks at lex_inwhat and lex_inpat to find out whether it's
+   processing a pattern (lex_inpat is true), a transliteration
+   (lex_inwhat & OP_TRANS is true), or a double-quoted string.
+   In patterns:
+     backslashes:
+       double-quoted style: \r and \n
+       regexp special ones: \D \s
+       constants: \x3
+       backrefs: \1 (deprecated in substitution replacements)
+       case and quoting: \U \Q \E
+     stops on @ and $, but not for $ as tail anchor
+   In transliterations:
+     characters are VERY literal, except for - not at the start or end
+     of the string, which indicates a range.  scan_const expands the
+     range to the full set of intermediate characters.
+   In double-quoted strings:
+     backslashes:
+       double-quoted style: \r and \n
+       constants: \x3
+       backrefs: \1 (deprecated)
+       case and quoting: \U \Q \E
+     stops on @ and $
+   scan_const does *not* construct ops to handle interpolated strings.
+   It stops processing as soon as it finds an embedded $ or @ variable
+   and leaves it to the caller to work out what's going on.
+   @ in pattern could be: @foo, @{foo}, @$foo, @'foo, @:foo.
+   $ in pattern could be $foo or could be tail anchor.  Assumption:
+   it's a tail anchor if $ is the last thing in the string, or if it's
+   followed by one of ")| \n\t"
+   \1 (backreferences) are turned into $1
+   The structure of the code is
+       while (there's a character to process) {
+           handle transliteration ranges
+         skip regexp comments
+         skip # initiated comments in //x patterns
+         check for embedded @foo
+         check for embedded scalars
+         if (backslash) {
+             leave intact backslashes from leave (below)
+             deprecate \1 in strings and sub replacements
+             handle string-changing backslashes \l \U \Q \E, etc.
+             switch (what was escaped) {
+                 handle - in a transliteration (becomes a literal -)
+                 handle \132 octal characters
+                 handle 0x15 hex characters
+                 handle \cV (control V)
+                 handle printf backslashes (\f, \r, \n, etc)
+             } (end switch)
+         } (end if backslash)
+     } (end while character to read)
+                 
+ */
 -static char *
 +STATIC char *
  scan_const(char *start)
  {
-     register char *send = bufend;
-     SV *sv = NEWSV(93, send - start);
-     register char *s = start;
-     register char *d = SvPVX(sv);
-     bool dorange = FALSE;
-     I32 len;
+     register char *send = bufend;             /* end of the constant */
+     SV *sv = NEWSV(93, send - start);         /* sv for the constant */
+     register char *s = start;                 /* start of the constant */
+     register char *d = SvPVX(sv);             /* destination for copies */
+     bool dorange = FALSE;                     /* are we in a translit range? */
+     I32 len;                                  /* ? */
+     /*
+       leave is the set of acceptably-backslashed characters.
+       I do *not* understand why there's the double hook here.
+     */
      char *leaveit =
        lex_inpat
            ? "\\.^$@AGZdDwWsSbB+*?|()-nrtfeaxc0123456789[{]} \t\n\r\f\v#"
@@@ -1225,8 -1360,7 +1350,7 @@@ filter_read(int idx, SV *buf_sv, int ma
      return (*funcp)(idx, buf_sv, maxlen);
  }
  
 -static char *
 +STATIC char *
  filter_gets(register SV *sv, register PerlIO *fp, STRLEN append)
  {
  #ifdef WIN32FILTER
@@@ -4921,10 -5133,26 +5123,26 @@@ scan_heredoc(register char *s
      return s;
  }
  
+ /* scan_inputsymbol
+    takes: current position in input buffer
+    returns: new position in input buffer
+    side-effects: yylval and lex_op are set.
+    This code handles:
+    <>         read from ARGV
+    <FH>       read from filehandle
+    <pkg::FH>  read from package qualified filehandle
+    <pkg'FH>   read from package qualified filehandle
+    <$fh>      read from filehandle in $fh
+    <*.h>      filename glob
+ */
 -static char *
 +STATIC char *
  scan_inputsymbol(char *start)
  {
-     register char *s = start;
+     register char *s = start;         /* current position in buffer */
      register char *d;
      register char *e;
      I32 len;
      return s;
  }
  
+ /* scan_str
+    takes: start position in buffer
+    returns: position to continue reading from buffer
+    side-effects: multi_start, multi_close, lex_repl or lex_stuff, and
+       updates the read buffer.
+    This subroutine pulls a string out of the input.  It is called for:
+       q               single quotes           q(literal text)
+       '               single quotes           'literal text'
+       qq              double quotes           qq(interpolate $here please)
+       "               double quotes           "interpolate $here please"
+       qx              backticks               qx(/bin/ls -l)
+       `               backticks               `/bin/ls -l`
+       qw              quote words             @EXPORT_OK = qw( func() $spam )
+       m//             regexp match            m/this/
+       s///            regexp substitute       s/this/that/
+       tr///           string transliterate    tr/this/that/
+       y///            string transliterate    y/this/that/
+       ($*@)           sub prototypes          sub foo ($)
+       <>              readline or globs       <FOO>, <>, <$fh>, or <*.c>
+       
+    In most of these cases (all but <>, patterns and transliterate)
+    yylex() calls scan_str().  m// makes yylex() call scan_pat() which
+    calls scan_str().  s/// makes yylex() call scan_subst() which calls
+    scan_str().  tr/// and y/// make yylex() call scan_trans() which
+    calls scan_str().
+       
+    It skips whitespace before the string starts, and treats the first
+    character as the delimiter.  If the delimiter is one of ([{< then
+    the corresponding "close" character )]}> is used as the closing
+    delimiter.  It allows quoting of delimiters, and if the string has
+    balanced delimiters ([{<>}]) it allows nesting.
+    The lexer always reads these strings into lex_stuff, except in the
+    case of the operators which take *two* arguments (s/// and tr///)
+    when it checks to see if lex_stuff is full (presumably with the 1st
+    arg to s or tr) and if so puts the string into lex_repl.
+ */
 -static char *
 +STATIC char *
  scan_str(char *start)
  {
      dTHR;
diff --cc util.c
Simple merge
diff --cc win32/Makefile
@@@ -21,12 -21,8 +21,12 @@@ INST_TOP=$(INST_DRV)\perl5004.5
  #CCTYPE=MSVC20
  
  #
 +# uncomment next line if you want to use the perl object
- #OBJECT=-DPERL_OBJECT
++OBJECT=-DPERL_OBJECT
 +
 +#
  # uncomment next line if you want debug version of perl (big,slow)
--#CFG=Debug
++CFG=Debug
  
  #
  # if you have the source for des_fcrypt(), uncomment this and make sure the
Simple merge
Simple merge
diff --cc win32/win32.c
@@@ -370,18 -347,21 +382,21 @@@ do_aspawn(void *vreally, void **vmark, 
                               (const char* const*)argv);
      }
  
-     if (status < 0) {
-       if (dowarn)
-           warn("Can't spawn \"%s\": %s", argv[0], strerror(errno));
-       status = 255 * 256;
+     if (flag != P_NOWAIT) {
+       if (status < 0) {
+           if (dowarn)
+               warn("Can't spawn \"%s\": %s", argv[0], strerror(errno));
+           status = 255 * 256;
+       }
+       else
+           status *= 256;
+       statusvalue = status;
      }
-     else if (flag != P_NOWAIT)
-       status *= 256;
      Safefree(argv);
-     return (statusvalue = status);
+     return (status);
  }
  
 -static int
 +int
  do_spawn2(char *cmd, int exectype)
  {
      char **a;