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