stas        2003/08/06 20:18:36

  Modified:    lib/ModPerl WrapXS.pm
               .        Changes
  Log:
  add the missing XS methods to ModPerl::MethodLookup, add support for
  mp1 methods that are no longer in the mod_perl 2.0 API.
  
  Revision  Changes    Path
  1.59      +148 -2    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.58
  retrieving revision 1.59
  diff -u -r1.58 -r1.59
  --- WrapXS.pm 14 May 2003 02:50:34 -0000      1.58
  +++ WrapXS.pm 7 Aug 2003 03:18:36 -0000       1.59
  @@ -603,6 +603,14 @@
   
               push @{ $map{$name} }, [$module, $class];
           }
  +
  +        # pure XS wrappers don't have the information about the
  +        # arguments they receive, since they manipulate the arguments
  +        # stack directly. therefore for these methods we can't tell
  +        # what are the objects they are invoked on
  +        for my $xs (@{ $self->{newXS}->{$module} || []}) {
  +            push @{ $map{$1} }, [$module, undef] if $xs->[0] =~ /.+::(.+)/;
  +        }
       }
   
       local $Data::Dumper::Terse    = 1;
  @@ -653,11 +661,132 @@
   sub _get_objects {
       for my $method (sort keys %$methods) { 
           for my $item ( @{ $methods->{$method} }) {
  +            next unless defined $item->[OBJECT];
               push @{ $objects->{$item->[OBJECT]} }, [$method, $item->[MODULE]];
           }
       }
   }
   
  +# if there is only one replacement method in 2.0 API we can
  +# automatically lookup it, up however if there are more than one
  +# (e.g. new()), we need to use a fully qualified value here
  +# of course the same if the package is not a mod_perl one.
  +#
  +# the first field represents the replacement method or undef if none
  +# exists, the second field is for extra comments (e.g. when there is
  +# no replacement method)
  +my $methods_compat = {
  +    # Apache::
  +    gensym            => ['Symbol::gensym',
  +                          'or use "open my $fh, $file"'],
  +    module            => ['Apache::Module::loaded',
  +                          ''],
  +    define            => ['exists_config_define',
  +                          ''],
  +    httpd_conf        => ['add_config',
  +                          ''],
  +    SERVER_VERSION    => ['get_server_version',
  +                          ''],
  +
  +    # Apache::RequestRec
  +    soft_timeout      => [undef,
  +                          'there is no more need for that method'],
  +    hard_timeout      => [undef,
  +                          'there is no more need for that method'],
  +    kill_timeout      => [undef,
  +                          'there is no more need for that method'],
  +    reset_timeout     => [undef,
  +                          'there is no more need for that method'],
  +    send_http_header  => ['content_type',
  +                          ''],
  +    header_in         => ['headers_in',
  +                          'this method works in mod_perl 1.0 too'],
  +    header_out        => ['headers_out',
  +                          'this method works in mod_perl 1.0 too'],
  +    err_header_out    => ['err_headers_out',
  +                          'this method works in mod_perl 1.0 too'],
  +    register_cleanup  => ['cleanup_register',
  +                          ''],
  +    post_connection   => ['cleanup_register',
  +                          ''],
  +    content           => [undef, # XXX: Apache::Request::what?
  +                          'use CGI.pm or Apache::Request instead'],
  +    clear_rgy_endav   => ['special_list_clear',
  +                          ''],
  +    stash_rgy_endav   => [undef,
  +                          ''],
  +    run_rgy_endav     => ['special_list_call',
  +                          'this method is no longer needed'],
  +    seqno             => [undef,
  +                          'internal to mod_perl 1.0'],
  +    chdir_file        => [undef, # XXX: to be resolved
  +                          'temporary unavailable till the issue with chdir' .
  +                          ' in the threaded env is resolved'],
  +    finfo             => [undef,
  +                          'not in the Apache 2.0 API'],
  +    log_reason        => ['log_error',
  +                          'not in the Apache 2.0 API'],
  +    slurp_filename    => [undef,
  +                          'not in the mod_perl 2.0 API'],
  +    READLINE          => [undef, # XXX: to be resolved
  +                          ''],
  +    send_fd_length    => [undef,
  +                          'not in the Apache 2.0 API'],
  +    send_fd           => ['sendfile',
  +                          'requires an offset argument'],
  +    is_main           => ['main',
  +                          'not in the Apache 2.0 API'],
  +    cgi_var           => ['subprocess_env',
  +                          'subprocess_env can be used with mod_perl 1.0'],
  +    cgi_env           => ['subprocess_env',
  +                          'subprocess_env can be used with mod_perl 1.0'],
  +    each_byterange    => [undef,
  +                          'now handled internally by ap_byterange_filter'],
  +    set_byterange     => [undef,
  +                          'now handled internally by ap_byterange_filter'],
  +
  +    # Apache::File
  +    open              => [undef,
  +                          ''],
  +    close             => [undef, # XXX: also defined in APR::Socket
  +                          ''],
  +    tmpfile           => [undef,
  +                          'not in the Apache 2.0 API, ' .
  +                          'use File::Temp instead'],
  +
  +    # Apache::Util
  +    size_string       => ['format_size',
  +                          ''],
  +    escape_uri        => ['unescape_path',
  +                          ''],
  +    unescape_uri      => ['unescape_url',
  +                          ''],
  +    escape_html       => [undef, # XXX: will be ap_escape_html
  +                          'ap_escape_html now requires a pool object'],
  +    ht_time           => ['format_time',
  +                          ''],
  +    parsedate         => ['parse_http',
  +                          ''],
  +    validate_password => ['password_validate',
  +                          ''],
  +
  +    # Apache::Table
  +    #new               => ['make',
  +    #                      ''], # XXX: there are other 'new' methods
  +
  +    # Apache::Connection
  +    auth_type         => ['ap_auth_type',
  +                          'now resides in the request object'],
  +};
  +
  +sub avail_methods_compat {
  +    return keys %$methods_compat;
  +}
  +
  +sub avail_methods {
  +    return keys %$methods;
  +}
  +
   sub preload_all_modules {
       _get_modules() unless $modules;
       eval "require $_" for keys %$modules;
  @@ -702,7 +831,23 @@
       # strip the package name for the fully qualified method
       $method =~ s/.+:://;
   
  -    unless (exists $methods->{$method}) {
  +    if (exists $methods_compat->{$method}) {
  +        my ($replacement, $comment) = @{$methods_compat->{$method}};
  +        my $hint = "'$method' is not a part of the mod_perl 2.0 API\n";
  +        $comment = length $comment ? " $comment\n" : "";
  +
  +        # some removed methods have no replacement
  +        return $hint . "$comment" unless defined $replacement;
  +
  +        $hint .= "use '$replacement' instead. $comment";
  +
  +        # if fully qualified don't look up its container
  +        return $hint if $replacement =~ /::/;
  +
  +        my ($modules_hint, @modules) = lookup_method($replacement, $object);
  +        return $hint . $modules_hint;
  +    }
  +    elsif (!exists $methods->{$method}) {
           my $hint = "Don't know anything about method '$method'\n";
           return ($hint);
       }
  @@ -772,7 +917,8 @@
       my $hint = join '',
           ("\nModule '$module' contains the following XS methods:\n\n", 
            $banner,  sep(length($banner)),
  -         map( { sprintf $format, $_->[0], $_->[1]} @{ $modules->{$module} }),
  +         map( { sprintf $format, $_->[0], $_->[1]||'???'}
  +             @{ $modules->{$module} }),
            sep(length($banner)));
   
       return ($hint, @methods);
  
  
  
  1.204     +3 -0      modperl-2.0/Changes
  
  Index: Changes
  ===================================================================
  RCS file: /home/cvs/modperl-2.0/Changes,v
  retrieving revision 1.203
  retrieving revision 1.204
  diff -u -r1.203 -r1.204
  --- Changes   6 Aug 2003 21:59:03 -0000       1.203
  +++ Changes   7 Aug 2003 03:18:36 -0000       1.204
  @@ -12,6 +12,9 @@
   
   =item 1.99_10-dev
   
  +add the missing XS methods to ModPerl::MethodLookup, add support for
  +mp1 methods that are no longer in the mod_perl 2.0 API. [Stas]
  +
   mod_perl now refuses to build against threaded mpms (non-prefork)
   unless perl 5.8+ w/ithreads is used [Stas]
   
  
  
  

Reply via email to