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 Changes Path
1.27 +68 -25 modperl-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
--- .cvsignore 2001/10/17 07:25:13 1.3
+++ .cvsignore 2001/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