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
  
  
  


Reply via email to