This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Avoid core dumps resulting from humongous array indices
[perl5.git] / embed.pl
index 6816740..cbd2294 100755 (executable)
--- a/embed.pl
+++ b/embed.pl
@@ -100,11 +100,14 @@ sub munge_c_files () {
 #munge_c_files();
 
 # generate proto.h
+my $wrote_protected = 0;
+
 sub write_protos {
     my $ret = "";
     if (@_ == 1) {
        my $arg = shift;
-       $ret .= "$arg\n" if $arg =~ /^#\s*(if|ifdef|else|endif)\b/;
+       $ret .= "$arg\n" if $arg =~ /^#\s*(if|ifdef|else|endif)\b/
+           or $arg =~ /^\s*(public|protected|private):/;
     }
     else {
        my ($flags,$retval,$func,@args) = @_;
@@ -112,8 +115,11 @@ sub write_protos {
            $retval = "STATIC $retval";
            $func = "S_$func";
        }
-       elsif ($flags =~ /p/) {
-           $func = "Perl_$func";
+       else {
+           $retval = "VIRTUAL $retval";
+           if ($flags =~ /p/) {
+               $func = "Perl_$func";
+           }
        }
        $ret .= "$retval\t$func(";
        unless ($flags =~ /n/) {
@@ -212,12 +218,12 @@ sub readvars(\%$$@) {
        or die "embed.pl: Can't open $file: $!\n";
     while (<FILE>) {
        s/[ \t]*#.*//;          # Delete comments.
-       if (/PERLVARI?C?\($pre(\w+)/) {
+       if (/PERLVARA?I?C?\($pre(\w+)/) {
            my $sym = $1;
            $sym = $pre . $sym if $keep_pre;
            warn "duplicate symbol $sym while processing $file\n"
                if exists $$syms{$sym};
-           $$syms{$sym} = 1;
+           $$syms{$sym} = $pre || 1;
        }
     }
     close(FILE);
@@ -229,12 +235,10 @@ my %thread;
 readvars %intrp,  'intrpvar.h','I';
 readvars %thread, 'thrdvar.h','T';
 readvars %globvar, 'perlvars.h','G';
-readvars %objvar, 'intrpvar.h','pi', 1;
 
-foreach my $sym (sort keys %thread)
- {
+foreach my $sym (sort keys %thread) {
   warn "$sym in intrpvar.h as well as thrdvar.h\n" if exists $intrp{$sym};
- }
+}
 
 sub undefine ($) {
     my ($sym) = @_;
@@ -247,9 +251,10 @@ sub hide ($$) {
     "#define $from" . "\t" x ($t < 3 ? 3 - $t : 1) . "$to\n";
 }
 
-sub objxsub_var ($) {
-    my ($sym) = @_;
-    undefine("PL_$sym") . hide("PL_$sym", "pPerl->PL_$sym");
+sub objxsub_var ($$) {
+    my ($pfx, $sym) = @_;
+    my $arg = ($pfx eq 'G' ? 'NULL' : 'aTHXo');
+    undefine("PL_$sym") . hide("PL_$sym", "(*Perl_${pfx}${sym}_ptr($arg))");
 }
 
 sub embedvar ($) {
@@ -388,13 +393,16 @@ walk_table {
     }
     else {
        my ($flags,$retval,$func,@args) = @_;
-       unless ($flags =~ /o/) {
-           if ($flags =~ /s/) {
-               $ret .= hide("S_$func","CPerlObj::$func");
-           }
-           elsif ($flags =~ /p/) {
-               $ret .= hide("Perl_$func","CPerlObj::$func");
-           }
+       if ($flags =~ /s/) {
+           $ret .= hide("S_$func","CPerlObj::S_$func");
+           $ret .= hide($func,"S_$func");
+       }
+       elsif ($flags =~ /p/) {
+           $ret .= hide("Perl_$func","CPerlObj::Perl_$func");
+           $ret .= hide($func,"Perl_$func");
+       }
+       else {
+           $ret .= hide($func,"CPerlObj::$func");
        }
     }
     $ret;
@@ -402,7 +410,8 @@ walk_table {
 
 for $sym (sort keys %ppsym) {
     $sym =~ s/^Perl_//;
-    print EM hide("Perl_$sym", "CPerlObj::$sym");
+    print EM hide("Perl_$sym", "CPerlObj::Perl_$sym");
+    print EM hide($sym, "Perl_$sym");
 }
 
 print EM <<'END';
@@ -448,14 +457,16 @@ print EM <<'END';
    an extra argument but grab the context pointer using the macro
    dTHX.
  */
-#if defined(PERL_IMPLICIT_CONTEXT)
+#if defined(PERL_IMPLICIT_CONTEXT) && !defined(PERL_OBJECT)
 #  define croak                                Perl_croak_nocontext
+#  define deb                          Perl_deb_nocontext
 #  define die                          Perl_die_nocontext
 #  define form                         Perl_form_nocontext
 #  define newSVpvf                     Perl_newSVpvf_nocontext
 #  define sv_catpvf                    Perl_sv_catpvf_nocontext
 #  define sv_setpvf                    Perl_sv_setpvf_nocontext
 #  define warn                         Perl_warn_nocontext
+#  define warner                       Perl_warner_nocontext
 #  define sv_catpvf_mg                 Perl_sv_catpvf_mg_nocontext
 #  define sv_setpvf_mg                 Perl_sv_setpvf_mg_nocontext
 #endif
@@ -466,11 +477,13 @@ print EM <<'END';
 /* undefined symbols, point them back at the usual ones */
 #  define Perl_croak_nocontext         Perl_croak
 #  define Perl_die_nocontext           Perl_die
+#  define Perl_deb_nocontext           Perl_deb
 #  define Perl_form_nocontext          Perl_form
-#  define Perl_newSVpvf_nocontext              Perl_newSVpvf
-#  define Perl_sv_catpvf_nocontext             Perl_sv_catpvf
-#  define Perl_sv_setpvf_nocontext             Perl_sv_setpvf
+#  define Perl_newSVpvf_nocontext      Perl_newSVpvf
+#  define Perl_sv_catpvf_nocontext     Perl_sv_catpvf
+#  define Perl_sv_setpvf_nocontext     Perl_sv_setpvf
 #  define Perl_warn_nocontext          Perl_warn
+#  define Perl_warner_nocontext                Perl_warner
 #  define Perl_sv_catpvf_mg_nocontext  Perl_sv_catpvf_mg
 #  define Perl_sv_setpvf_mg_nocontext  Perl_sv_setpvf_mg
 #endif
@@ -518,7 +531,7 @@ END
 
 
 for $sym (sort keys %thread) {
-    print EM multon($sym,'T','PL_curinterp->');
+    print EM multon($sym,'T','PERL_GET_INTERP->');
 }
 
 print EM <<'END';
@@ -531,7 +544,7 @@ print EM <<'END';
 END
 
 for $sym (sort keys %intrp) {
-    print EM multon($sym,'I','PL_curinterp->');
+    print EM multon($sym,'I','PERL_GET_INTERP->');
 }
 
 print EM <<'END';
@@ -662,18 +675,26 @@ print OBX <<'EOT';
 
 EOT
 
-foreach my $sym (sort(keys(%intrp),
-                     keys(%thread),
-                     keys(%globvar),
-                     keys(%objvar)))
-{
-    print OBX objxsub_var($sym);
+foreach my $sym (sort keys %intrp) {
+    print OBX objxsub_var('I',$sym);
+}
+
+foreach my $sym (sort keys %thread) {
+    print OBX objxsub_var('T',$sym);
+}
+
+foreach my $sym (sort keys %globvar) {
+    print OBX objxsub_var('G',$sym);
 }
 
 print OBX <<'EOT';
 
 /* Functions */
 
+#if defined(PERL_OBJECT)
+
+/* XXX soon to be eliminated, only a few things in PERLCORE need these now */
+
 EOT
 
 walk_table {
@@ -684,8 +705,12 @@ walk_table {
     }
     else {
        my ($flags,$retval,$func,@args) = @_;
-       unless ($flags =~ /o/) {
+       unless ($flags =~ /s/) {
            if ($flags =~ /p/) {
+               $ret .= undefine("Perl_$func") . hide("Perl_$func","pPerl->Perl_$func");
+               $ret .= undefine($func) . hide($func,"Perl_$func");
+           }
+           else {
                $ret .= undefine($func) . hide($func,"pPerl->$func");
            }
        }
@@ -695,16 +720,249 @@ walk_table {
 
 for $sym (sort keys %ppsym) {
     $sym =~ s/^Perl_//;
-    print OBX undefine($sym) . hide($sym, "pPerl->$sym");
+    print OBX undefine("Perl_$sym") . hide("Perl_$sym", "pPerl->Perl_$sym");
+    print OBX undefine($sym) . hide($sym, "Perl_$sym");
 }
 
 print OBX <<'EOT';
 
+#endif  /* PERL_OBJECT */
 #endif /* __objXSUB_h__ */
 EOT
 
 close(OBX);
 
+unlink 'perlapi.h';
+unlink 'perlapi.c';
+open(CAPI, '> perlapi.c') or die "Can't create perlapi.c: $!\n";
+open(CAPIH, '> perlapi.h') or die "Can't create perlapi.h: $!\n";
+
+print CAPIH <<'EOT';
+/* !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+   This file is built by embed.pl from data in embed.pl, pp.sym, intrpvar.h,
+   perlvars.h and thrdvar.h.  Any changes made here will be lost!
+*/
+
+/* declare accessor functions for Perl variables */
+
+#if defined(PERL_OBJECT) || defined (PERL_CAPI)
+
+#if defined(PERL_OBJECT)
+#  undef  aTHXo
+#  define aTHXo                        pPerl
+#  undef  aTHXo_
+#  define aTHXo_               aTHXo,
+#  undef  _aTHXo
+#  define _aTHXo               ,aTHXo
+#endif /* PERL_OBJECT */
+
+START_EXTERN_C
+
+#undef PERLVAR
+#undef PERLVARA
+#undef PERLVARI
+#undef PERLVARIC
+#define PERLVAR(v,t)   EXTERN_C t* Perl_##v##_ptr(pTHXo);
+#define PERLVARA(v,n,t)        typedef t PL_##v##_t[n];                        \
+                       EXTERN_C PL_##v##_t* Perl_##v##_ptr(pTHXo);
+#define PERLVARI(v,t,i)        PERLVAR(v,t)
+#define PERLVARIC(v,t,i) PERLVAR(v, const t)
+
+#include "thrdvar.h"
+#include "intrpvar.h"
+#include "perlvars.h"
+
+#undef PERLVAR
+#undef PERLVARA
+#undef PERLVARI
+#undef PERLVARIC
+
+END_EXTERN_C
+
+#endif /* PERL_OBJECT || PERL_CAPI */
+
+EOT
+
+
+print CAPI <<'EOT';
+/* !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+   This file is built by embed.pl from data in embed.pl, pp.sym, intrpvar.h,
+   perlvars.h and thrdvar.h.  Any changes made here will be lost!
+*/
+
+#include "EXTERN.h"
+#include "perl.h"
+#include "perlapi.h"
+
+#if defined(PERL_OBJECT)
+
+/* accessor functions for Perl variables (provides binary compatibility) */
+START_EXTERN_C
+
+#undef PERLVAR
+#undef PERLVARA
+#undef PERLVARI
+#undef PERLVARIC
+#define PERLVAR(v,t)   t* Perl_##v##_ptr(pTHXo)                        \
+                       { return &(aTHXo->PL_##v); }
+#define PERLVARA(v,n,t)        PL_##v##_t* Perl_##v##_ptr(pTHXo)               \
+                       { return &(aTHXo->PL_##v); }
+#define PERLVARI(v,t,i)        PERLVAR(v,t)
+#define PERLVARIC(v,t,i) PERLVAR(v, const t)
+
+#include "thrdvar.h"
+#include "intrpvar.h"
+
+#undef PERLVAR
+#undef PERLVARA
+#define PERLVAR(v,t)   t* Perl_##v##_ptr(pTHXo)                        \
+                       { return &(PL_##v); }
+#define PERLVARA(v,n,t)        PL_##v##_t* Perl_##v##_ptr(pTHXo)               \
+                       { return &(PL_##v); }
+#include "perlvars.h"
+
+#undef PERLVAR
+#undef PERLVARA
+#undef PERLVARI
+#undef PERLVARIC
+
+EOT
+
+# functions that take va_list* for implementing vararg functions
+my %vfuncs = qw(
+    Perl_croak                 Perl_vcroak
+    Perl_warn                  Perl_vwarn
+    Perl_warner                        Perl_vwarner
+    Perl_die                   Perl_vdie
+    Perl_form                  Perl_vform
+    Perl_deb                   Perl_vdeb
+    Perl_newSVpvf              Perl_vnewSVpvf
+    Perl_sv_setpvf             Perl_sv_vsetpvf
+    Perl_sv_setpvf_mg          Perl_sv_vsetpvf_mg
+    Perl_sv_catpvf             Perl_sv_vcatpvf
+    Perl_sv_catpvf_mg          Perl_sv_vcatpvf_mg
+    Perl_dump_indent           Perl_dump_vindent
+    Perl_default_protect       Perl_vdefault_protect
+);
+
+sub emit_func {
+    my ($addcontext, $rettype,$func,@args) = @_;
+    my @aargs = @args;
+    for my $a (@aargs) { $a =~ s/^.*\b(\w+)$/$1/ }
+    my $ctxarg = '';
+    if (not $addcontext) {
+       $ctxarg = 'pTHXo';
+       $ctxarg .= '_ ' if @args;
+    }
+    my $decl = '';
+    if ($addcontext) {
+       $decl .= "    dTHXo;\n";
+    }
+    local $" = ', ';
+    my $return = ($rettype =~ /^\s*(void|Free_t|Signal_t)\s*$/
+                 ? '' : 'return ');
+    my $emitval = '';
+    if (@args and $args[$#args] =~ /\.\.\./) {
+       pop @args;
+       pop @aargs;
+       my $retarg = '';
+       my $ctxfunc = $func;
+       $ctxfunc =~ s/_nocontext$//;
+       return $emitval unless exists $vfuncs{$ctxfunc};
+       if (length $return) {
+           $decl .= "    $rettype retval;\n";
+           $retarg .= "retval = ";
+           $return = "\n    ${return}retval;\n";
+       }
+       $emitval .= <<EOT
+$rettype
+$func($ctxarg@args)
+{
+$decl    va_list args;
+    va_start(args, $aargs[$#aargs]);
+    $retarg((CPerlObj*)pPerl)->$vfuncs{$ctxfunc}(@aargs, &args);
+    va_end(args);$return
+}
+EOT
+    }
+    else {
+       $emitval .= <<EOT
+$rettype
+$func($ctxarg@args)
+{
+$decl    $return((CPerlObj*)pPerl)->$func(@aargs);
+}
+EOT
+    }
+    $emitval;
+}
+
+# XXXX temporary hack
+for my $sym (qw(
+               perl_construct
+               perl_destruct
+               perl_free
+               perl_run
+               perl_parse
+               ))
+{
+    $skipapi_funcs{$sym}++;
+}
+
+walk_table {
+    my $ret = "";
+    if (@_ == 1) {
+       my $arg = shift;
+       $ret .= "$arg\n" if $arg =~ /^#\s*(if|ifdef|else|endif)\b/;
+    }
+    else {
+       my ($flags,$retval,$func,@args) = @_;
+       return $ret if exists $skipapi_funcs{$func};
+       unless ($flags =~ /s/) {
+           $ret .= "\n";
+           my $addctx = 1 if $flags =~ /n/;
+           if ($flags =~ /p/) {
+               $ret .= undefine("Perl_$func");
+               $ret .= emit_func($addctx,$retval,"Perl_$func",@args);
+           }
+           else {
+               $ret .= undefine($func);
+               $ret .= emit_func($addctx,$retval,$func,@args);
+           }
+       }
+    }
+    $ret;
+} \*CAPI;
+
+for $sym (sort keys %ppsym) {
+    $sym =~ s/^Perl_//;
+    print CAPI "\n";
+    print CAPI undefine("Perl_$sym");
+    if ($sym =~ /^ck_/) {
+       print CAPI emit_func(0, 'OP *',"Perl_$sym",'OP *o');
+    }
+    else {                                     # pp_foo
+       print CAPI emit_func(0, 'OP *',"Perl_$sym");
+    }
+}
+
+print CAPI <<'EOT';
+
+#undef Perl_fprintf_nocontext
+int
+Perl_fprintf_nocontext(PerlIO *stream, const char *format, ...)
+{
+    dTHXo;
+    va_list(arglist);
+    va_start(arglist, format);
+    return (*pPerl->PL_StdIO->pVprintf)(pPerl->PL_StdIO, stream, format, arglist);
+}
+
+END_EXTERN_C
+
+#endif /* PERL_OBJECT */
+EOT
+
 __END__
 
 # Lines are of the form:
@@ -731,6 +989,9 @@ __END__
 #          may be autogenerated.
 #
 
+#if defined(PERL_OBJECT)
+public:
+#endif
 p      |SV*    |amagic_call    |SV* left|SV* right|int method|int dir
 p      |bool   |Gv_AMupdate    |HV* stash
 p      |OP*    |append_elem    |I32 optype|OP* head|OP* tail
@@ -763,10 +1024,10 @@ p        |int    |block_start    |int full
 p      |void   |boot_core_UNIVERSAL
 p      |void   |call_list      |I32 oldscope|AV* av_list
 p      |I32    |cando          |I32 bit|I32 effective|Stat_t* statbufp
-p      |U32    |cast_ulong     |double f
-p      |I32    |cast_i32       |double f
-p      |IV     |cast_iv        |double f
-p      |UV     |cast_uv        |double f
+p      |U32    |cast_ulong     |NV f
+p      |I32    |cast_i32       |NV f
+p      |IV     |cast_iv        |NV f
+p      |UV     |cast_uv        |NV f
 #if !defined(HAS_TRUNCATE) && !defined(HAS_CHSIZE) && defined(F_FREESP)
 p      |I32    |my_chsize      |int fd|Off_t length
 #endif
@@ -775,16 +1036,20 @@ p        |MAGIC* |condpair_magic |SV *sv
 #endif
 p      |OP*    |convert        |I32 optype|I32 flags|OP* o
 pr     |void   |croak          |const char* pat|...
+pr     |void   |vcroak         |const char* pat|va_list* args
 #if defined(PERL_IMPLICIT_CONTEXT)
 npr    |void   |croak_nocontext|const char* pat|...
 np     |OP*    |die_nocontext  |const char* pat|...
+np     |void   |deb_nocontext  |const char* pat|...
 np     |char*  |form_nocontext |const char* pat|...
 np     |void   |warn_nocontext |const char* pat|...
+np     |void   |warner_nocontext|U32 err|const char* pat|...
 np     |SV*    |newSVpvf_nocontext|const char* pat|...
 np     |void   |sv_catpvf_nocontext|SV* sv|const char* pat|...
 np     |void   |sv_setpvf_nocontext|SV* sv|const char* pat|...
 np     |void   |sv_catpvf_mg_nocontext|SV* sv|const char* pat|...
 np     |void   |sv_setpvf_mg_nocontext|SV* sv|const char* pat|...
+np     |int    |fprintf_nocontext|PerlIO* stream|const char* fmt|...
 #endif
 p      |void   |cv_ckproto     |CV* cv|GV* gv|char* p
 p      |CV*    |cv_clone       |CV* proto
@@ -799,8 +1064,10 @@ p |char** |get_op_descs
 p      |char** |get_op_names
 p      |char*  |get_no_modify
 p      |U32*   |get_opargs
+p      |PPADDR_t*|get_ppaddr
 p      |I32    |cxinc
 p      |void   |deb            |const char* pat|...
+p      |void   |vdeb           |const char* pat|va_list* args
 p      |void   |deb_growlevel
 p      |void   |debprofdump
 p      |I32    |debop          |OP* o
@@ -810,9 +1077,11 @@ p |char*  |delimcpy       |char* to|char* toend|char* from \
                                |char* fromend|int delim|I32* retlen
 p      |void   |deprecate      |char* s
 p      |OP*    |die            |const char* pat|...
+p      |OP*    |vdie           |const char* pat|va_list* args
 p      |OP*    |die_where      |char* message|STRLEN msglen
 p      |void   |dounwind       |I32 cxix
 p      |bool   |do_aexec       |SV* really|SV** mark|SV** sp
+p      |bool   |do_aexec5      |SV* really|SV** mark|SV** sp|int fd|int flag
 p      |int    |do_binmode     |PerlIO *fp|int iotype|int flag
 p      |void   |do_chop        |SV* asv|SV* sv
 p      |bool   |do_close       |GV* gv|bool not_implicit
@@ -869,6 +1138,7 @@ p  |PADOFFSET|find_threadsv|const char *name
 p      |OP*    |force_list     |OP* arg
 p      |OP*    |fold_constants |OP* arg
 p      |char*  |form           |const char* pat|...
+p      |char*  |vform          |const char* pat|va_list* args
 p      |void   |free_tmps
 p      |OP*    |gen_constant_list|OP* o
 #if !defined(HAS_GETENV_LEN)
@@ -922,41 +1192,60 @@ p        |void   |hv_undef       |HV* tb
 p      |I32    |ibcmp          |const char* a|const char* b|I32 len
 p      |I32    |ibcmp_locale   |const char* a|const char* b|I32 len
 p      |I32    |ingroup        |I32 testgid|I32 effective
+p      |void   |init_debugger
 p      |void   |init_stacks
 p      |U32    |intro_my
 p      |char*  |instr          |const char* big|const char* little
 p      |bool   |io_close       |IO* io
 p      |OP*    |invert         |OP* cmd
 p      |bool   |is_uni_alnum   |U32 c
+p      |bool   |is_uni_alnumc  |U32 c
 p      |bool   |is_uni_idfirst |U32 c
 p      |bool   |is_uni_alpha   |U32 c
+p      |bool   |is_uni_ascii   |U32 c
 p      |bool   |is_uni_space   |U32 c
+p      |bool   |is_uni_cntrl   |U32 c
+p      |bool   |is_uni_graph   |U32 c
 p      |bool   |is_uni_digit   |U32 c
 p      |bool   |is_uni_upper   |U32 c
 p      |bool   |is_uni_lower   |U32 c
 p      |bool   |is_uni_print   |U32 c
+p      |bool   |is_uni_punct   |U32 c
+p      |bool   |is_uni_xdigit  |U32 c
 p      |U32    |to_uni_upper   |U32 c
 p      |U32    |to_uni_title   |U32 c
 p      |U32    |to_uni_lower   |U32 c
 p      |bool   |is_uni_alnum_lc|U32 c
+p      |bool   |is_uni_alnumc_lc|U32 c
 p      |bool   |is_uni_idfirst_lc|U32 c
 p      |bool   |is_uni_alpha_lc|U32 c
+p      |bool   |is_uni_ascii_lc|U32 c
 p      |bool   |is_uni_space_lc|U32 c
+p      |bool   |is_uni_cntrl_lc|U32 c
+p      |bool   |is_uni_graph_lc|U32 c
 p      |bool   |is_uni_digit_lc|U32 c
 p      |bool   |is_uni_upper_lc|U32 c
 p      |bool   |is_uni_lower_lc|U32 c
 p      |bool   |is_uni_print_lc|U32 c
+p      |bool   |is_uni_punct_lc|U32 c
+p      |bool   |is_uni_xdigit_lc|U32 c
 p      |U32    |to_uni_upper_lc|U32 c
 p      |U32    |to_uni_title_lc|U32 c
 p      |U32    |to_uni_lower_lc|U32 c
 p      |bool   |is_utf8_alnum  |U8 *p
+p      |bool   |is_utf8_alnumc |U8 *p
 p      |bool   |is_utf8_idfirst|U8 *p
 p      |bool   |is_utf8_alpha  |U8 *p
+p      |bool   |is_utf8_ascii  |U8 *p
 p      |bool   |is_utf8_space  |U8 *p
+p      |bool   |is_utf8_cntrl  |U8 *p
 p      |bool   |is_utf8_digit  |U8 *p
+p      |bool   |is_utf8_graph  |U8 *p
 p      |bool   |is_utf8_upper  |U8 *p
 p      |bool   |is_utf8_lower  |U8 *p
 p      |bool   |is_utf8_print  |U8 *p
+p      |bool   |is_utf8_punct  |U8 *p
+p      |bool   |is_utf8_xdigit |U8 *p
 p      |bool   |is_utf8_mark   |U8 *p
 p      |OP*    |jmaybe         |OP* arg
 p      |I32    |keyword        |char* d|I32 len
@@ -1019,7 +1308,6 @@ p |int    |magic_set_all_env|SV* sv|MAGIC* mg
 p      |U32    |magic_sizepack |SV* sv|MAGIC* mg
 p      |int    |magic_wipepack |SV* sv|MAGIC* mg
 p      |void   |magicname      |char* sym|char* name|I32 namlen
-no     |int    |main           |int argc|char** argv|char** env
 #if defined(MYMALLOC)
 np     |MEM_SIZE|malloced_size |void *p
 #endif
@@ -1040,9 +1328,7 @@ p |I32    |mg_size        |SV* sv
 p      |OP*    |mod            |OP* o|I32 type
 p      |char*  |moreswitches   |char* s
 p      |OP*    |my             |OP* o
-#ifdef USE_LOCALE_NUMERIC
-p      |double |my_atof        |const char *s
-#endif
+p      |NV     |my_atof        |const char *s
 #if !defined(HAS_BCOPY) || !defined(HAS_SAFE_BCOPY)
 p      |char*  |my_bcopy       |const char* from|char* to|I32 len
 #endif
@@ -1111,18 +1397,17 @@ p       |SV*    |newSV          |STRLEN len
 p      |OP*    |newSVREF       |OP* o
 p      |OP*    |newSVOP        |I32 type|I32 flags|SV* sv
 p      |SV*    |newSViv        |IV i
-p      |SV*    |newSVnv        |double n
+p      |SV*    |newSVnv        |NV n
 p      |SV*    |newSVpv        |const char* s|STRLEN len
 p      |SV*    |newSVpvn       |const char* s|STRLEN len
 p      |SV*    |newSVpvf       |const char* pat|...
+p      |SV*    |vnewSVpvf      |const char* pat|va_list* args
 p      |SV*    |newSVrv        |SV* rv|const char* classname
 p      |SV*    |newSVsv        |SV* old
 p      |OP*    |newUNOP        |I32 type|I32 flags|OP* first
 p      |OP*    |newWHILEOP     |I32 flags|I32 debuggable|LOOP* loop \
                                |I32 whileline|OP* expr|OP* block|OP* cont
-#if defined(USE_THREADS)
-p      |struct perl_thread*|new_struct_thread|struct perl_thread *t
-#endif
+
 p      |PERL_SI*|new_stackinfo|I32 stitems|I32 cxitems
 p      |PerlIO*|nextargv       |GV* gv
 p      |char*  |ninstr         |const char* big|const char* bigend \
@@ -1141,17 +1426,32 @@ p       |void   |pad_free       |PADOFFSET po
 p      |void   |pad_reset
 p      |void   |pad_swipe      |PADOFFSET po
 p      |void   |peep           |OP* o
+#if defined(PERL_OBJECT)
+no     |void   |perl_construct
+no     |void   |perl_destruct
+no     |void   |perl_free
+no     |int    |perl_run
+no     |int    |perl_parse     |XSINIT_t xsinit \
+                               |int argc|char** argv|char** env
+#else
 no     |PerlInterpreter*       |perl_alloc
+no     |void   |perl_construct |PerlInterpreter* sv_interp
+no     |void   |perl_destruct  |PerlInterpreter* sv_interp
+no     |void   |perl_free      |PerlInterpreter* sv_interp
+no     |int    |perl_run       |PerlInterpreter* sv_interp
+no     |int    |perl_parse     |PerlInterpreter* sv_interp|XSINIT_t xsinit \
+                               |int argc|char** argv|char** env
+#if defined(USE_THREADS)
+p      |struct perl_thread*    |new_struct_thread|struct perl_thread *t
+#endif
+#endif
 p      |void   |call_atexit    |ATEXIT_t fn|void *ptr
 p      |I32    |call_argv      |const char* sub_name|I32 flags|char** argv
 p      |I32    |call_method    |const char* methname|I32 flags
 p      |I32    |call_pv        |const char* sub_name|I32 flags
 p      |I32    |call_sv        |SV* sv|I32 flags
-no     |void   |perl_construct |PerlInterpreter* sv_interp
-no     |void   |perl_destruct  |PerlInterpreter* sv_interp
 p      |SV*    |eval_pv        |const char* p|I32 croak_on_error
 p      |I32    |eval_sv        |SV* sv|I32 flags
-no     |void   |perl_free      |PerlInterpreter* sv_interp
 p      |SV*    |get_sv         |const char* name|I32 create
 p      |AV*    |get_av         |const char* name|I32 create
 p      |HV*    |get_hv         |const char* name|I32 create
@@ -1164,10 +1464,7 @@ p        |void   |new_numeric    |const char* newcoll
 p      |void   |set_numeric_local
 p      |void   |set_numeric_radix
 p      |void   |set_numeric_standard
-no     |int    |perl_parse     |PerlInterpreter* sv_interp|XSINIT_t xsinit \
-                               |int argc|char** argv|char** env
 p      |void   |require_pv     |const char* pv
-no     |int    |perl_run       |PerlInterpreter* sv_interp
 p      |void   |pidgone        |int pid|int status
 p      |void   |pmflag         |U16* pmfl|int ch
 p      |OP*    |pmruntime      |OP* pm|OP* expr|OP* repl
@@ -1185,6 +1482,10 @@ p        |I32    |pregexec       |regexp* prog|char* stringarg \
                                |SV* screamer|U32 nosave
 p      |void   |pregfree       |struct regexp* r
 p      |regexp*|pregcomp       |char* exp|char* xend|PMOP* pm
+p      |char*  |re_intuit_start|regexp* prog|SV* sv|char* strpos \
+                               |char* strend|U32 flags \
+                               |struct re_scream_pos_data_s *data
+p      |SV*    |re_intuit_string|regexp* prog
 p      |I32    |regexec_flags  |regexp* prog|char* stringarg \
                                |char* strend|char* strbeg|I32 minend \
                                |SV* screamer|void* data|U32 flags
@@ -1264,18 +1565,19 @@ p       |CV*    |sv_2cv         |SV* sv|HV** st|GV** gvp|I32 lref
 p      |IO*    |sv_2io         |SV* sv
 p      |IV     |sv_2iv         |SV* sv
 p      |SV*    |sv_2mortal     |SV* sv
-p      |double |sv_2nv         |SV* sv
+p      |NV     |sv_2nv         |SV* sv
 p      |char*  |sv_2pv         |SV* sv|STRLEN* lp
 p      |UV     |sv_2uv         |SV* sv
 p      |IV     |sv_iv          |SV* sv
 p      |UV     |sv_uv          |SV* sv
-p      |double |sv_nv          |SV* sv
+p      |NV     |sv_nv          |SV* sv
 p      |char*  |sv_pvn         |SV *sv|STRLEN *len
 p      |I32    |sv_true        |SV *sv
 p      |void   |sv_add_arena   |char* ptr|U32 size|U32 flags
 p      |int    |sv_backoff     |SV* sv
 p      |SV*    |sv_bless       |SV* sv|HV* stash
 p      |void   |sv_catpvf      |SV* sv|const char* pat|...
+p      |void   |sv_vcatpvf     |SV* sv|const char* pat|va_list* args
 p      |void   |sv_catpv       |SV* sv|const char* ptr
 p      |void   |sv_catpvn      |SV* sv|const char* ptr|STRLEN len
 p      |void   |sv_catsv       |SV* dsv|SV* ssv
@@ -1318,12 +1620,13 @@ p       |void   |sv_replace     |SV* sv|SV* nsv
 p      |void   |sv_report_used
 p      |void   |sv_reset       |char* s|HV* stash
 p      |void   |sv_setpvf      |SV* sv|const char* pat|...
+p      |void   |sv_vsetpvf     |SV* sv|const char* pat|va_list* args
 p      |void   |sv_setiv       |SV* sv|IV num
 p      |void   |sv_setpviv     |SV* sv|IV num
 p      |void   |sv_setuv       |SV* sv|UV num
-p      |void   |sv_setnv       |SV* sv|double num
+p      |void   |sv_setnv       |SV* sv|NV num
 p      |SV*    |sv_setref_iv   |SV* rv|const char* classname|IV iv
-p      |SV*    |sv_setref_nv   |SV* rv|const char* classname|double nv
+p      |SV*    |sv_setref_nv   |SV* rv|const char* classname|NV nv
 p      |SV*    |sv_setref_pv   |SV* rv|const char* classname|void* pv
 p      |SV*    |sv_setref_pvn  |SV* rv|const char* classname|char* pv \
                                |STRLEN n
@@ -1370,7 +1673,9 @@ p |void   |vivify_defelem |SV* sv
 p      |void   |vivify_ref     |SV* sv|U32 to_what
 p      |I32    |wait4pid       |int pid|int* statusp|int flags
 p      |void   |warn           |const char* pat|...
+p      |void   |vwarn          |const char* pat|va_list* args
 p      |void   |warner         |U32 err|const char* pat|...
+p      |void   |vwarner        |U32 err|const char* pat|va_list* args
 p      |void   |watch          |char** addr
 p      |I32    |whichsig       |char* sig
 p      |int    |yyerror        |char* s
@@ -1401,22 +1706,19 @@ pn      |void   |safexfree      |Malloc_t where
 #if defined(PERL_GLOBAL_STRUCT)
 p      |struct perl_vars *|GetVars
 #endif
-p      |void   |yydestruct     |void *ptr
 p      |int    |runops_standard
 p      |int    |runops_debug
-
-#if defined(WIN32)
-p      |int*   |ErrorNo
-#endif
 p      |void   |sv_catpvf_mg   |SV *sv|const char* pat|...
+p      |void   |sv_vcatpvf_mg  |SV* sv|const char* pat|va_list* args
 p      |void   |sv_catpv_mg    |SV *sv|const char *ptr
 p      |void   |sv_catpvn_mg   |SV *sv|const char *ptr|STRLEN len
 p      |void   |sv_catsv_mg    |SV *dstr|SV *sstr
 p      |void   |sv_setpvf_mg   |SV *sv|const char* pat|...
+p      |void   |sv_vsetpvf_mg  |SV* sv|const char* pat|va_list* args
 p      |void   |sv_setiv_mg    |SV *sv|IV i
 p      |void   |sv_setpviv_mg  |SV *sv|IV iv
 p      |void   |sv_setuv_mg    |SV *sv|UV u
-p      |void   |sv_setnv_mg    |SV *sv|double num
+p      |void   |sv_setnv_mg    |SV *sv|NV num
 p      |void   |sv_setpv_mg    |SV *sv|const char *ptr
 p      |void   |sv_setpvn_mg   |SV *sv|const char *ptr|STRLEN len
 p      |void   |sv_setsv_mg    |SV *dstr|SV *sstr
@@ -1425,6 +1727,8 @@ p |MGVTBL*|get_vtbl       |int vtbl_id
 p      |char*  |pv_display     |SV *sv|char *pv|STRLEN cur|STRLEN len \
                                |STRLEN pvlim
 p      |void   |dump_indent    |I32 level|PerlIO *file|const char* pat|...
+p      |void   |dump_vindent   |I32 level|PerlIO *file|const char* pat \
+                               |va_list *args
 p      |void   |do_gv_dump     |I32 level|PerlIO *file|char *name|GV *sv
 p      |void   |do_gvgv_dump   |I32 level|PerlIO *file|char *name|GV *sv
 p      |void   |do_hv_dump     |I32 level|PerlIO *file|char *name|HV *sv
@@ -1436,6 +1740,7 @@ p |void   |do_sv_dump     |I32 level|PerlIO *file|SV *sv|I32 nest \
                                |I32 maxnest|bool dumpops|STRLEN pvlim
 p      |void   |magic_dump     |MAGIC *mg
 p      |void*  |default_protect|int *excpt|protect_body_t body|...
+p      |void*  |vdefault_protect|int *excpt|protect_body_t body|va_list *args
 p      |void   |reginitcolors
 p      |char*  |sv_2pv_nolen   |SV* sv
 p      |char*  |sv_pv          |SV *sv
@@ -1444,11 +1749,14 @@ p       |void   |tmps_grow      |I32 n
 p      |SV*    |sv_rvweaken    |SV *sv
 p      |int    |magic_killbackrefs|SV *sv|MAGIC *mg
 
-#if defined(PERL_IN_AV_C)
+#if defined(PERL_OBJECT)
+protected:
+#endif
+#if defined(PERL_IN_AV_C) || defined(PERL_DECL_PROT)
 s      |I32    |avhv_index_sv  |SV* sv
 #endif
 
-#if defined(PERL_IN_DOOP_C)
+#if defined(PERL_IN_DOOP_C) || defined(PERL_DECL_PROT)
 s      |I32    |do_trans_CC_simple     |SV *sv
 s      |I32    |do_trans_CC_count      |SV *sv
 s      |I32    |do_trans_CC_complex    |SV *sv
@@ -1461,11 +1769,11 @@ s       |I32    |do_trans_UC_trivial    |SV *sv
 s      |I32    |do_trans_CU_trivial    |SV *sv
 #endif
 
-#if defined(PERL_IN_GV_C)
+#if defined(PERL_IN_GV_C) || defined(PERL_DECL_PROT)
 s      |void   |gv_init_sv     |GV *gv|I32 sv_type
 #endif
 
-#if defined(PERL_IN_HV_C)
+#if defined(PERL_IN_HV_C) || defined(PERL_DECL_PROT)
 s      |void   |hsplit         |HV *hv
 s      |void   |hfreeentries   |HV *hv
 s      |void   |more_he
@@ -1475,18 +1783,17 @@ s       |HEK*   |save_hek       |const char *str|I32 len|U32 hash
 s      |void   |hv_magic_check |HV *hv|bool *needs_copy|bool *needs_store
 #endif
 
-#if defined(PERL_IN_MG_C)
+#if defined(PERL_IN_MG_C) || defined(PERL_DECL_PROT)
 s      |void   |save_magic     |I32 mgs_ix|SV *sv
 s      |int    |magic_methpack |SV *sv|MAGIC *mg|char *meth
 s      |int    |magic_methcall |SV *sv|MAGIC *mg|char *meth|I32 f \
                                |int n|SV *val
-s      |void   |unwind_handler_stack   |void *p
-s      |void   |restore_magic  |void *p
 #endif
 
-#if defined(PERL_IN_OP_C)
+#if defined(PERL_IN_OP_C) || defined(PERL_DECL_PROT)
 s      |I32    |list_assignment|OP *o
 s      |void   |bad_type       |I32 n|char *t|char *name|OP *kid
+s      |void   |cop_free       |COP *cop
 s      |OP*    |modkids        |OP *o|I32 type
 s      |void   |no_bareword_allowed|OP *o
 s      |OP*    |no_fh_allowed  |OP *o
@@ -1508,13 +1815,12 @@ s       |void*  |Slab_Alloc     |int m|size_t sz
 #  endif
 #endif
 
-#if defined(PERL_IN_PERL_C)
+#if defined(PERL_IN_PERL_C) || defined(PERL_DECL_PROT)
 s      |void   |find_beginning
 s      |void   |forbid_setid   |char *
 s      |void   |incpush        |char *|int
 s      |void   |init_interp
 s      |void   |init_ids
-s      |void   |init_debugger
 s      |void   |init_lexer
 s      |void   |init_main_stash
 s      |void   |init_perllib
@@ -1525,7 +1831,6 @@ s |void   |nuke_stacks
 s      |void   |open_script    |char *|bool|SV *|int *fd
 s      |void   |usage          |char *
 s      |void   |validate_suid  |char *|char*|int
-s      |I32    |read_e_script  |int idx|SV *buf_sv|int maxlen
 #  if defined(IAMSUID)
 s      |int    |fd_on_nosuid_fs|int fd
 #  endif
@@ -1539,7 +1844,7 @@ s |struct perl_thread *   |init_main_thread
 #  endif
 #endif
 
-#if defined(PERL_IN_PP_C)
+#if defined(PERL_IN_PP_C) || defined(PERL_DECL_PROT)
 s      |void   |doencodes      |SV* sv|char* s|I32 len
 s      |SV*    |refto          |SV* sv
 s      |U32    |seed
@@ -1548,7 +1853,7 @@ s |SV*    |is_an_int      |char *s|STRLEN l
 s      |int    |div128         |SV *pnum|bool *done
 #endif
 
-#if defined(PERL_IN_PP_CTL_C)
+#if defined(PERL_IN_PP_CTL_C) || defined(PERL_DECL_PROT)
 s      |OP*    |docatch        |OP *o
 s      |void*  |docatch_body   |va_list args
 s      |OP*    |dofindlabel    |OP *o|char *label|OP **opstack|OP **oplimit
@@ -1563,23 +1868,13 @@ s       |void   |save_lines     |AV *array|SV *sv
 s      |OP*    |doeval         |int gimme|OP** startop
 s      |PerlIO *|doopen_pmc    |const char *name|const char *mode
 s      |void   |qsortsv        |SV ** array|size_t num_elts|SVCOMPARE_t f
-s      |I32    |sortcv         |SV *a|SV *b
-s      |I32    |sv_ncmp        |SV *a|SV *b
-s      |I32    |sv_i_ncmp      |SV *a|SV *b
-s      |I32    |amagic_ncmp    |SV *a|SV *b
-s      |I32    |amagic_i_ncmp  |SV *a|SV *b
-s      |I32    |amagic_cmp     |SV *str1|SV *str2
-s      |I32    |amagic_cmp_locale|SV *str1|SV *str2
 #endif
 
-#if defined(PERL_IN_PP_HOT_C)
+#if defined(PERL_IN_PP_HOT_C) || defined(PERL_DECL_PROT)
 s      |CV*    |get_db_sub     |SV **svp|CV *cv
-#  if defined(USE_THREADS)
-s      |void   |unset_cvowner  |void *cvarg
-#  endif
 #endif
 
-#if defined(PERL_IN_PP_SYS_C)
+#if defined(PERL_IN_PP_SYS_C) || defined(PERL_DECL_PROT)
 s      |OP*    |doform         |CV *cv|GV *gv|OP *retop
 s      |int    |emulate_eaccess|const char* path|int mode
 #  if !defined(HAS_MKDIR) || !defined(HAS_RMDIR)
@@ -1587,7 +1882,7 @@ s |int    |dooneliner     |char *cmd|char *filename
 #  endif
 #endif
 
-#if defined(PERL_IN_REGCOMP_C)
+#if defined(PERL_IN_REGCOMP_C) || defined(PERL_DECL_PROT)
 s      |regnode*|reg           |I32|I32 *
 s      |regnode*|reganode      |U8|U32
 s      |regnode*|regatom       |I32 *
@@ -1611,11 +1906,11 @@ s       |I32    |study_chunk    |regnode **scanp|I32 *deltap \
                                |regnode *last|scan_data_t *data|U32 flags
 s      |I32    |add_data       |I32 n|char *s
 rs     |void|re_croak2 |const char* pat1|const char* pat2|...
-s      |char*|regpposixcc      |I32 value
-s      |void   |clear_re       |void *r
+s      |I32    |regpposixcc    |I32 value
+s      |void   |checkposixcc
 #endif
 
-#if defined(PERL_IN_REGEXEC_C)
+#if defined(PERL_IN_REGEXEC_C) || defined(PERL_DECL_PROT)
 s      |I32    |regmatch       |regnode *prog
 s      |I32    |regrepeat      |regnode *p|I32 max
 s      |I32    |regrepeat_hard |regnode *p|I32 max|I32 *lp
@@ -1626,20 +1921,19 @@ s       |CHECKPOINT|regcppush   |I32 parenfloor
 s      |char*|regcppop
 s      |char*|regcp_set_to     |I32 ss
 s      |void   |cache_re       |regexp *prog
-s      |void   |restore_pos    |void *arg
 s      |U8*    |reghop         |U8 *pos|I32 off
 s      |U8*    |reghopmaybe    |U8 *pos|I32 off
 #endif
 
-#if defined(PERL_IN_RUN_C)
+#if defined(PERL_IN_RUN_C) || defined(PERL_DECL_PROT)
 s      |void   |debprof        |OP *o
 #endif
 
-#if defined(PERL_IN_SCOPE_C)
+#if defined(PERL_IN_SCOPE_C) || defined(PERL_DECL_PROT)
 s      |SV*    |save_scalar_at |SV **sptr
 #endif
 
-#if defined(PERL_IN_SV_C)
+#if defined(PERL_IN_SV_C) || defined(PERL_DECL_PROT)
 s      |IV     |asIV           |SV* sv
 s      |UV     |asUV           |SV* sv
 s      |SV*    |more_sv
@@ -1656,10 +1950,6 @@ s        |void   |del_xnv        |XPVNV* p
 s      |void   |del_xpv        |XPV* p
 s      |void   |del_xrv        |XRV* p
 s      |void   |sv_unglob      |SV* sv
-s      |void   |do_report_used |SV *sv
-s      |void   |do_clean_objs  |SV *sv
-s      |void   |do_clean_named_objs|SV *sv
-s      |void   |do_clean_all   |SV *sv
 s      |void   |not_a_number   |SV *sv
 s      |void   |visit          |SVFUNC_t f
 #  if defined(PURIFY)
@@ -1675,7 +1965,7 @@ s |void   |del_sv |SV *p
 #  endif
 #endif
 
-#if defined(PERL_IN_TOKE_C)
+#if defined(PERL_IN_TOKE_C) || defined(PERL_DECL_PROT)
 s      |void   |check_uni
 s      |void   |force_next     |I32 type
 s      |char*  |force_version  |char *start
@@ -1715,9 +2005,6 @@ s |void   |depcom
 s      |char*  |incl_perldb
 s      |I32    |utf16_textfilter|int idx|SV *sv|int maxlen
 s      |I32    |utf16rev_textfilter|int idx|SV *sv|int maxlen
-s      |void   |restore_rsfp   |void *f
-s      |void   |restore_expect |void *e
-s      |void   |restore_lex_expect     |void *e
 #  if defined(CRIPPLED_CC)
 s      |int    |uni            |I32 f|char *s
 #  endif
@@ -1726,14 +2013,12 @@ s       |I32    |win32_textfilter       |int idx|SV *sv|int maxlen
 #  endif
 #endif
 
-#if defined(PERL_IN_UNIVERSAL_C)
+#if defined(PERL_IN_UNIVERSAL_C) || defined(PERL_DECL_PROT)
 s      |SV*|isa_lookup |HV *stash|const char *name|int len|int level
 #endif
 
-#if defined(PERL_IN_UTIL_C)
+#if defined(PERL_IN_UTIL_C) || defined(PERL_DECL_PROT)
 s      |SV*    |mess_alloc
-rs     |void   |do_croak       |const char *pat|va_list *args
-s      |void   |do_warn        |const char *pat|va_list *args
 #  if defined(LEAKTEST)
 s      |void   |xstat          |int
 #  endif