This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Replace PL_vtbl_* with an array PL_magic_vtables.
[perl5.git] / makedef.pl
index e78f750..5b8265a 100644 (file)
@@ -4,12 +4,35 @@
 #
 # Needed by WIN32 and OS/2 for creating perl.dll,
 # and by AIX for creating libperl.a when -Dusershrplib is in effect,
-# and by MacOS Classic.
 #
-# reads global.sym, pp.sym, perlvars.h, intrpvar.h, config.h
-# On OS/2 reads miniperl.map and the previous version of perl5.def as well
+# Reads from information stored in
+#
+#    config.h
+#    config.sh
+#    global.sym
+#    globvar.sym
+#    intrpvar.h
+#    miniperl.map (on OS/2)
+#    perl5.def    (on OS/2; this is the old version of the file being made)
+#    perlio.sym
+#    perlvars.h
+#
+# plus long lists of function names hard-coded directly in this script and
+# in the DATA section.
+#
+# Writes the result to STDOUT.
+#
+# Normally this script is invoked from a makefile (e.g. win32/Makefile),
+# which redirects STDOUT to a suitable file, such as:
+#
+#    perl5.def   OS/2
+#    perldll.def Windows
+#    perl.exp    AIX
+#    perl.imp    NetWare
+
 
 BEGIN { unshift @INC, "lib" }
+use Config;
 use strict;
 
 use vars qw($PLATFORM $CCTYPE $FILETYPE $CONFIG_ARGS $ARCHNAME $PATCHLEVEL);
@@ -34,7 +57,7 @@ while (@ARGV) {
     }
 }
 
-my @PLATFORM = qw(aix win32 wince os2 MacOS netware);
+my @PLATFORM = qw(aix win32 wince os2 netware);
 my %PLATFORM;
 @PLATFORM{@PLATFORM} = ();
 
@@ -51,7 +74,11 @@ if ($PLATFORM eq 'win32' or $PLATFORM eq 'wince' or $PLATFORM eq "aix") {
        # the user might have chosen to disable because the canned configs are
        # minimal configs that don't include any of those options.
        my $opts = ($PLATFORM eq 'wince' ? '-MCross' : ''); # for wince need Cross.pm to get Config.pm
-       my $config = `$^X $opts -Ilib -V`;
+
+       $ENV{PERL5LIB} = join $Config{path_sep}, @INC;
+       my $cmd = "$^X $opts -V";
+       my $config = `$cmd`
+           or die "Couldn't run [$cmd]: $!";
        my($options) = $config =~ /^  Compile-time options: (.*?)\n^  \S/ms;
        $options =~ s/\s+/ /g;
        print STDERR "Options: ($options)\n";
@@ -75,7 +102,6 @@ my $config_h    = "config.h";
 my $intrpvar_h  = "intrpvar.h";
 my $perlvars_h  = "perlvars.h";
 my $global_sym  = "global.sym";
-my $pp_sym      = "pp.sym";
 my $globvar_sym = "globvar.sym";
 my $perlio_sym  = "perlio.sym";
 my $static_ext = "";
@@ -85,19 +111,12 @@ if ($PLATFORM eq 'aix') {
 }
 elsif ($PLATFORM =~ /^win(?:32|ce)$/ || $PLATFORM eq 'netware') {
     $CCTYPE = "MSVC" unless defined $CCTYPE;
-    foreach ($intrpvar_h, $perlvars_h, $global_sym,
-            $pp_sym, $globvar_sym, $perlio_sym) {
+    foreach ($intrpvar_h, $perlvars_h, $global_sym, $globvar_sym, $perlio_sym) {
        s!^!..\\!;
     }
 }
-elsif ($PLATFORM eq 'MacOS') {
-    foreach ($intrpvar_h, $perlvars_h, $global_sym,
-            $pp_sym, $globvar_sym, $perlio_sym) {
-       s!^!::!;
-    }
-}
 
-unless ($PLATFORM eq 'win32' || $PLATFORM eq 'wince' || $PLATFORM eq 'MacOS' || $PLATFORM eq 'netware') {
+unless ($PLATFORM eq 'win32' || $PLATFORM eq 'wince' || $PLATFORM eq 'netware') {
     open(CFG,$config_sh) || die "Cannot open $config_sh: $!\n";
     while (<CFG>) {
        if (/^(?:ccflags|optimize)='(.+)'$/) {
@@ -129,6 +148,7 @@ while (<CFG>) {
     $define{$1} = 1 if /^\s*#\s*define\s+(MULTIPLICITY)\b/;
     $define{$1} = 1 if /^\s*#\s*define\s+(PERL_\w+)\b/;
     $define{$1} = 1 if /^\s*#\s*define\s+(USE_\w+)\b/;
+    $define{$1} = 1 if /^\s*#\s*define\s+(HAS_\w+)\b/;
 }
 close(CFG);
 
@@ -159,11 +179,11 @@ my $sym_ord = 0;
 print STDERR "Defines: (" . join(' ', sort keys %define) . ")\n";
 
 if ($PLATFORM =~ /^win(?:32|ce)$/) {
-    (my $dll = ($define{PERL_DLL} || "perl511")) =~ s/\.dll$//i;
+    (my $dll = ($define{PERL_DLL} || "perl515")) =~ s/\.dll$//i;
     print "LIBRARY $dll\n";
     # The DESCRIPTION module definition file statement is not supported
     # by VC7 onwards.
-    if ($CCTYPE !~ /^MSVC7/ && $CCTYPE !~ /^MSVC8/ && $CCTYPE !~ /^MSVC9/) {
+    if ($CCTYPE =~ /^(?:MSVC60|GCC|BORLAND)$/) {
        print "DESCRIPTION 'Perl interpreter'\n";
     }
     print "EXPORTS\n";
@@ -215,7 +235,7 @@ elsif ($PLATFORM eq 'aix') {
 }
 elsif ($PLATFORM eq 'netware') {
        if ($FILETYPE eq 'def') {
-       print "LIBRARY perl511\n";
+       print "LIBRARY perl515\n";
        print "DESCRIPTION 'Perl interpreter for NetWare'\n";
        print "EXPORTS\n";
        }
@@ -329,7 +349,6 @@ if ($PLATFORM eq 'wince') {
                     PL_numeric_name
                     PL_numeric_radix_sv
                     PL_numeric_standard
-                    PL_vtbl_collxfrm
                     Perl_sv_collxfrm
                     setgid
                     setuid
@@ -404,6 +423,13 @@ elsif ($PLATFORM eq 'aix') {
                     PL_statusvalue_vms
                     PL_sys_intern
                     )]);
+    skip_symbols([qw(
+                    Perl_signbit
+                    )])
+       if $define{'HAS_SIGNBIT'};
+    emit_symbols([qw(
+                    boot_DynaLoader
+                    )]);
 }
 elsif ($PLATFORM eq 'os2') {
     emit_symbols([qw(
@@ -480,34 +506,6 @@ elsif ($PLATFORM eq 'os2') {
                    )])
       if $define{'USE_5005THREADS'} or $define{'USE_ITHREADS'};
 }
-elsif ($PLATFORM eq 'MacOS') {
-    skip_symbols [qw(
-                   Perl_GetVars
-                   PL_cryptseen
-                   PL_cshlen
-                   PL_cshname
-                   PL_statusvalue_vms
-                   PL_sys_intern
-                   PL_opsave
-                   PL_timesbuf
-                   Perl_dump_fds
-                   Perl_my_bcopy
-                   Perl_my_bzero
-                   Perl_my_chsize
-                   Perl_my_htonl
-                   Perl_my_memcmp
-                   Perl_my_memset
-                   Perl_my_ntohl
-                   Perl_my_swap
-                   Perl_safexcalloc
-                   Perl_safexfree
-                   Perl_safexmalloc
-                   Perl_safexrealloc
-                   Perl_unlnk
-                   Perl_sys_intern_clear
-                   Perl_sys_intern_init
-                   )];
-}
 elsif ($PLATFORM eq 'netware') {
        skip_symbols [qw(
                        PL_statusvalue_vms
@@ -593,7 +591,6 @@ unless ($define{'DEBUGGING'}) {
                    Perl_debstack
                    Perl_debstackptrs
                    Perl_pad_sv
-                   Perl_sv_peek
                    Perl_hv_assert
                    PL_block_type
                    PL_watchaddr
@@ -667,6 +664,7 @@ else {
                    Perl_dump_mstats
                    Perl_get_mstats
                    Perl_malloced_size
+                   Perl_malloc_good_size
                    MallocCfg_ptr
                    MallocCfgP_ptr
                    )];
@@ -721,8 +719,11 @@ unless ($define{'USE_ITHREADS'}) {
                    PL_sharedsv_space_mutex
                    PL_dollarzero_mutex
                    PL_hints_mutex
+                   PL_my_ctx_mutex
                    PL_perlio_mutex
                    PL_regdupe
+                   Perl_clone_params_del
+                   Perl_clone_params_new
                    Perl_parser_dup
                    Perl_dirp_dup
                    Perl_cx_dup
@@ -734,8 +735,9 @@ unless ($define{'USE_ITHREADS'}) {
                    Perl_he_dup
                    Perl_mg_dup
                    Perl_mro_meta_dup
-                   Perl_re_dup
+                   Perl_re_dup_guts
                    Perl_sv_dup
+                   Perl_sv_dup_inc
                    Perl_rvpv_dup
                    Perl_hek_dup
                    Perl_sys_intern_dup
@@ -756,7 +758,6 @@ unless ($define{'USE_ITHREADS'}) {
 
 unless ($define{'PERL_IMPLICIT_CONTEXT'}) {
     skip_symbols [qw(
-                   PL_my_ctx_mutex
                    PL_my_cxt_index
                    PL_my_cxt_list
                    PL_my_cxt_size
@@ -823,6 +824,12 @@ unless ($define{'PERL_NEED_TIMESBASE'}) {
                    )];
 }
 
+unless ($define{'DEBUG_LEAKING_SCALARS'}) {
+    skip_symbols [qw(
+                   PL_sv_serial
+                   )];
+}
+
 unless ($define{'DEBUG_LEAKING_SCALARS_FORK_DUMP'}) {
     skip_symbols [qw(
                    PL_dumper_fd
@@ -956,7 +963,7 @@ if ($define{'PERL_GLOBAL_STRUCT'}) {
 
 # functions from *.sym files
 
-my @syms = ($global_sym, $globvar_sym); # $pp_sym is not part of the API
+my @syms = ($global_sym, $globvar_sym);
 
 # Symbols that are the public face of the PerlIO layers implementation
 # These are in _addition to_ the public face of the abstraction
@@ -999,8 +1006,10 @@ my @layer_syms = qw(
                    PerlIO_arg_fetch
                    PerlIO_debug
                    PerlIO_define_layer
+                   PerlIO_find_layer
                    PerlIO_isutf8
                    PerlIO_layer_fetch
+                   PerlIO_list_alloc
                    PerlIO_list_free
                    PerlIO_modestr
                    PerlIO_parse_layers
@@ -1173,8 +1182,8 @@ for my $syms (@syms) {
 
 # variables
 
-if ($define{'MULTIPLICITY'}) {
-    for my $f ($perlvars_h, $intrpvar_h) {
+if ($define{'MULTIPLICITY'} && $define{PERL_GLOBAL_STRUCT}) {
+    for my $f ($perlvars_h) {
        my $glob = readvar($f, sub { "Perl_" . $_[1] . $_[2] . "_ptr" });
        emit_symbols $glob;
     }
@@ -1189,7 +1198,7 @@ else {
        my $glob = readvar($perlvars_h);
        emit_symbols $glob;
     }
-    unless ($define{'MULTIPLICITY'}) {
+    unless ($define{MULTIPLICITY}) {
        my $glob = readvar($intrpvar_h);
        emit_symbols $glob;
     }
@@ -1239,6 +1248,7 @@ if ($PLATFORM =~ /^win(?:32|ce)$/) {
                            win32_open
                            win32_close
                            win32_eof
+                           win32_isatty
                            win32_read
                            win32_write
                            win32_spawnvp
@@ -1391,15 +1401,6 @@ elsif ($PLATFORM eq 'os2') {
     @missing = grep { !exists $exportperlmalloc{$_} } @missing;
     delete $export{$_} foreach @missing;
 }
-elsif ($PLATFORM eq 'MacOS') {
-    open MACSYMS, 'macperl.sym' or die 'Cannot read macperl.sym';
-
-    while (<MACSYMS>) {
-       try_symbol($_);
-    }
-
-    close MACSYMS;
-}
 elsif ($PLATFORM eq 'netware') {
 foreach my $symbol (qw(
                        boot_DynaLoader
@@ -1613,7 +1614,7 @@ sub output_symbol {
          $ordinal{$exportperlmalloc{$symbol}} || ++$sym_ord
          if $exportperlmalloc and exists $exportperlmalloc{$symbol};
     }
-    elsif ($PLATFORM eq 'aix' || $PLATFORM eq 'MacOS') {
+    elsif ($PLATFORM eq 'aix') {
        print "$symbol\n";
     }
        elsif ($PLATFORM eq 'netware') {