dougm 01/10/20 22:29:46
Modified:lib/ModPerl WrapXS.pm
xs .cvsignore
Log:
.{def,exp} generation tweaks:
- do not include static functions
- split __inline__ functions into separate file
- rework into single write_export_file generic function
with header/format functions specific to .def and .exp
Revision ChangesPath
1.27 +68 -25modperl-2.0/lib/ModPerl/WrapXS.pm
Index: WrapXS.pm
===
RCS file: /home/cvs/modperl-2.0/lib/ModPerl/WrapXS.pm,v
retrieving revision 1.26
retrieving revision 1.27
diff -u -r1.26 -r1.27
--- WrapXS.pm 2001/10/09 18:28:18 1.26
+++ WrapXS.pm 2001/10/21 05:29:46 1.27
@@ -568,8 +568,8 @@
$self->get_functions;
$self->get_structures;
-$self->write_exp; #XXX if $^O eq 'aix'
-$self->write_def; #XXX if $^O eq 'Win32'
+$self->write_export_file('exp'); #XXX if $^O eq 'aix'
+$self->write_export_file('def'); #XXX if $^O eq 'Win32'
while (my($module, $functions) = each %{ $self->{XS} }) {
#my($root, $sub) = split '::', $module;
@@ -582,50 +582,93 @@
}
}
-sub open_export_file {
+#two export files are generated:
+#$name.$ext - global symbols
+#${name}_inline.$ext - __inline__ functions
+#the inline export file is needed #ifdef MP_DEBUG
+#since __inline__ will be turned off
+
+sub open_export_files {
my($self, $name, $ext) = @_;
-my $file = join '/', $self->{XS_DIR}, "$name.$ext";
-open my $fh, '>', $file or die "open $file: $!";
-return($fh, $file);
-}
-sub write_exp {
-my $self = shift;
+my $dir = $self->{XS_DIR};
-my %files = (
-modperl => $ModPerl::FunctionTable,
-apache => $Apache::FunctionTable,
-);
+my $exp_file = "$dir/$name.$ext";
+my $exp_file_inline = "$dir/${name}_inline.$ext";
-while (my($name, $table) = each %files) {
-my($fh, $file) = $self->open_export_file($name, 'exp');
-print $fh "#!\n";
+open my $exp_fh, '>', $exp_file or
+ die "open $exp_file: $!";
+open my $exp_inline_fh, '>', $exp_file_inline or
+ die "open $exp_file_inline: $!";
-for my $entry (@$table) {
-print $fh "$entry->{name}\n";
-}
+return($exp_fh, $exp_inline_fh);
+}
+
+sub func_is_static {
+my($self, $entry) = @_;
+if (my $attr = $entry->{attr}) {
+return 1 if grep { $_ eq 'static' } @$attr;
+}
+return 0;
+}
-close $fh or die "close $file: $!";
+sub func_is_inline {
+my($self, $entry) = @_;
+if (my $attr = $entry->{attr}) {
+return 1 if grep { $_ eq '__inline__' } @$attr;
}
+return 0;
}
-sub write_def {
+sub export_file_header_exp {
my $self = shift;
+"#!\n";
+}
+
+sub export_file_format_exp {
+my($self, $val) = @_;
+"$val\n";
+}
+sub export_file_header_def {
+my $self = shift;
+"LIBRARY\n\nEXPORTS\n\n";
+}
+
+sub export_file_format_def {
+my($self, $val) = @_;
+" $val\n";
+}
+
+sub write_export_file {
+my($self, $ext) = @_;
+
my %files = (
modperl => $ModPerl::FunctionTable,
apache => $Apache::FunctionTable,
);
+my $header = \&{"export_file_header_$ext"};
+my $format = \&{"export_file_format_$ext"};
+
while (my($name, $table) = each %files) {
-my($fh, $file) = $self->open_export_file($name, 'def');
-print $fh "LIBRARY\n\nEXPORTS\n\n";
+my($exp_fh, $exp_inline_fh) =
+ $self->open_export_files($name, $ext);
+for my $fh ($exp_fh, $exp_inline_fh) {
+print $fh $self->$header();
+}
+
for my $entry (@$table) {
-print $fh " $entry->{name}\n";
+next if $self->func_is_static($entry);
+my $fh = $self->func_is_inline($entry) ?
+ $exp_inline_fh : $exp_fh;
+print $fh $self->$format($entry->{name});
}
-close $fh or die "close $file: $!";
+for my $fh ($exp_fh, $exp_inline_fh) {
+close $fh;
+}
}
}
1.4 +1 -2 modperl-2.0/xs/.cvsignore
Index: .cvsignore
===
RCS file: /home/cvs/modperl-2.0/xs/.cvsignore,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- .cvsignore2001/10/17 07:25:13 1.3
+++ .cvsignore2001/10/21 05:29:46 1.4
@@ -2,6 +2,5 @@
Makefile
modperl_xs_typedefs.h
modperl_xs_sv_convert.h
-apache.exp
-modperl.exp
+*.exp
*.def