summaryrefslogtreecommitdiff
path: root/win32/makedef.pl
diff options
context:
space:
mode:
Diffstat (limited to 'win32/makedef.pl')
-rw-r--r--win32/makedef.pl190
1 files changed, 133 insertions, 57 deletions
diff --git a/win32/makedef.pl b/win32/makedef.pl
index d87cbedac2..1bda71e722 100644
--- a/win32/makedef.pl
+++ b/win32/makedef.pl
@@ -38,9 +38,37 @@ if ($CCTYPE ne 'GCC')
print "CODE LOADONCALL\n";
print "DATA LOADONCALL NONSHARED MULTIPLE\n";
}
+else
+ {
+ $define{'PERL_GLOBAL_STRUCT'} = 1;
+ $define{'MULTIPLICITY'} = 1;
+ }
+
print "EXPORTS\n";
-$skip_sym=<<'!END!OF!SKIP!';
+my %skip;
+my %export;
+
+sub skip_symbols
+{
+ my $list = shift;
+ foreach my $symbol (@$list)
+ {
+ $skip{$symbol} = 1;
+ }
+}
+
+sub emit_symbols
+{
+ my $list = shift;
+ foreach my $symbol (@$list)
+ {
+ emit_symbol($symbol) unless exists $skip{$symbol};
+ }
+}
+
+skip_symbols [qw(
+Perl_statusvalue_vms
Perl_block_type
Perl_additem
Perl_cast_ulong
@@ -139,6 +167,11 @@ Perl_wait4pid
Perl_watch
Perl_yyname
Perl_yyrule
+Perl_Yes
+Perl_No
+Perl_hexdigit
+Perl_patleave
+Perl_vert
allgvs
curblock
curcsv
@@ -157,25 +190,26 @@ Perl_my_memset
Perl_cshlen
Perl_cshname
Perl_opsave
-!END!OF!SKIP!
+)];
+
if ($define{'MYMALLOC'})
{
- $skip_sym .= <<'!END!OF!SKIP!';
-Perl_safefree
-Perl_safemalloc
-Perl_saferealloc
-Perl_safecalloc
-!END!OF!SKIP!
- emit_symbol('Perl_malloc');
- emit_symbol('Perl_free');
- emit_symbol('Perl_realloc');
- emit_symbol('Perl_calloc');
+ skip_symbols [qw(
+ Perl_safefree
+ Perl_safemalloc
+ Perl_saferealloc
+ Perl_safecalloc)];
+ emit_symbols [qw(
+ Perl_malloc
+ Perl_free
+ Perl_realloc
+ Perl_calloc)];
}
unless ($define{'USE_THREADS'})
{
- $skip_sym .= <<'!END!OF!SKIP!';
+ skip_symbols [qw(
Perl_condpair_magic
Perl_thr_key
Perl_sv_mutex
@@ -188,6 +222,9 @@ Perl_new_struct_thread
Perl_nthreads
Perl_nthreads_cond
Perl_per_thread_magicals
+Perl_thread_create
+Perl_find_threadsv
+Perl_threadsv_names
Perl_thrsv
Perl_unlock_condpair
Perl_vtbl_mutex
@@ -197,43 +234,63 @@ Perl_sv_nv
Perl_sv_true
Perl_sv_uv
Perl_sv_pvn
-Perl_newRV_noinc
-!END!OF!SKIP!
+Perl_newRV_noinc)];
+
}
-if ($define{'USE_THISPTR'} || $define{'USE_THREADS'})
+sub readvar
+{
+ my $file = shift;
+ open(VARS,$file) || die "Cannot open $file:$!";
+ my @syms;
+ while (<VARS>)
+ {
+ # All symbols have a Perl_ prefix because that's what embed.h
+ # sticks in front of them.
+ push(@syms,"Perl_".$1) if (/\bPERLVARI?\([IGT](\w+)/);
+ }
+ close(VARS);
+ return \@syms;
+}
+
+if ($define{'USE_THREADS'} || $define{'MULTIPLICITY'})
{
- open(THREAD,"<../thread.sym") || die "Cannot open thread.sym:$!";
- while (<THREAD>)
- {
- next if (!/^[A-Za-z]/);
- next if (/_amg[ \t]*$/);
- $skip_sym .= "Perl_".$_;
- }
- close(THREAD);
- $skip_sym .= "Perl_op\n";
+ my $thrd = readvar("../thrdvar.h");
+ skip_symbols $thrd;
}
-unless ($define{'USE_THREADS'})
+if ($define{'MULTIPLICITY'})
{
- $skip_sym .= "Perl_thread_create\n";
- $skip_sym .= "Perl_find_threadsv\n";
- $skip_sym .= "Perl_threadsv_names\n";
- }
+ my $interp = readvar("../intrpvar.h");
+ skip_symbols $interp;
+ }
-# All symbols have a Perl_ prefix because that's what embed.h
-# sticks in front of them.
+if ($define{'PERL_GLOBAL_STRUCT'})
+ {
+ my $global = readvar("../perlvars.h");
+ skip_symbols $global;
+ }
+unless ($define{'DEBUGGING'})
+ {
+ skip_symbols [qw(
+ Perl_runops_debug
+ Perl_sv_peek
+ Perl_watchaddr
+ Perl_watchok)];
+ }
open (GLOBAL, "<../global.sym") || die "failed to open global.sym" . $!;
-while (<GLOBAL>) {
- my $symbol;
- next if (!/^[A-Za-z]/);
- next if (/_amg[ \t]*$/);
- $symbol = "Perl_$_";
- next if ($skip_sym =~ m/$symbol/m);
- emit_symbol($symbol);
-}
+while (<GLOBAL>)
+ {
+ next if (!/^[A-Za-z]/);
+ next if (/_amg[ \t]*$/);
+ # All symbols have a Perl_ prefix because that's what embed.h
+ # sticks in front of them.
+ chomp($_);
+ my $symbol = "Perl_$_";
+ emit_symbol($symbol) unless exists $skip{$symbol};
+ }
close(GLOBAL);
# also add symbols from interp.sym
@@ -241,34 +298,41 @@ close(GLOBAL);
# doesn't hurt to include them anyway.
# these don't have Perl prefix
-open (INTERP, "<../interp.sym") || die "failed to open interp.sym" . $!;
-while (<INTERP>) {
- my $symbol;
- next if (!/^[A-Za-z]/);
- next if (/_amg[ \t]*$/);
- $symbol = $_;
- next if ($skip_sym =~ m/$symbol/m);
- #print "\t$symbol";
- emit_symbol("Perl_" . $symbol);
-}
+if ($define{'PERL_GLOBAL_STRUCT'})
+ {
+ emit_symbol( ($CCTYPE eq 'GCC') ? 'Perl_GetVars' : 'Perl_VarsPtr')
+ }
+else
+ {
+ my $glob = readvar("../perlvars.h");
+ emit_symbols $glob;
+ }
+
+unless ($define{'MULTIPLICITY'})
+ {
+ my $glob = readvar("../intrpvar.h");
+ emit_symbols $glob;
+ }
-#close(INTERP);
+unless ($define{'MULTIPLICITY'} || $define{'USE_THREADS'})
+ {
+ my $glob = readvar("../thrdvar.h");
+ emit_symbols $glob;
+ }
while (<DATA>) {
my $symbol;
next if (!/^[A-Za-z]/);
next if (/^#/);
s/\r//g;
+ chomp($_);
$symbol = $_;
- next if ($skip_sym =~ m/^$symbol/m);
- $symbol = "Perl_".$symbol if ($define{'USE_THISPTR'}
- && $symbol =~ /^perl/);
+ next if exists $skip{$symbol};
emit_symbol($symbol);
}
-sub emit_symbol {
- my $symbol = shift;
- chomp $symbol;
+foreach my $symbol (sort keys %export)
+ {
if ($CCTYPE eq "BORLAND") {
# workaround Borland quirk by exporting both the straight
# name and a name with leading underscore. Note the
@@ -277,12 +341,23 @@ sub emit_symbol {
print "\t_$symbol\n";
print "\t$symbol = _$symbol\n";
}
+ elsif ($CCTYPE eq 'GCC') {
+ # Symbols have leading _ whole process is $%£"% slow
+ # so skip aliases for now
+ print "\t$symbol\n";
+ }
else {
# for binary coexistence, export both the symbol and
# alias with leading underscore
print "\t$symbol\n";
print "\t_$symbol = $symbol\n";
}
+ }
+
+sub emit_symbol {
+ my $symbol = shift;
+ chomp($symbol);
+ $export{$symbol} = 1;
}
1;
@@ -432,3 +507,4 @@ Perl_init_os_extras
Perl_getTHR
Perl_setTHR
RunPerl
+