dougm       00/05/12 00:11:05

  Modified:    .        Changes ToDo
               lib/Apache PerlRun.pm
               t/docs   startup.pl
               t/modules perlrun.t
               t/net/perl dirty-script.cgi dirty-test.cgi
  Log:
  Apache::PerlRun::flush_namespace fixes, so aliased (imported)
  code/hash/array/scalar are undefined without undef-ing the pointed-to
  data and without using B.pm
  
  and: modules/perlrun was never properly run in the first place
  
  Revision  Changes    Path
  1.479     +4 -0      modperl/Changes
  
  Index: Changes
  ===================================================================
  RCS file: /home/cvs/modperl/Changes,v
  retrieving revision 1.478
  retrieving revision 1.479
  diff -u -r1.478 -r1.479
  --- Changes   2000/05/05 08:10:33     1.478
  +++ Changes   2000/05/12 07:10:56     1.479
  @@ -10,6 +10,10 @@
   
   =item 1.23_01-dev
   
  +Apache::PerlRun::flush_namespace fixes, so aliased (imported)
  +code/hash/array/scalar are undefined without undef-ing the pointed-to
  +data and without using B.pm, thanks to Richard Chen for the suggestion
  +
   document Apache::print's special behavior wrt references
   [Jeffrey W. Baker <[EMAIL PROTECTED]>]
   
  
  
  
  1.242     +1 -4      modperl/ToDo
  
  Index: ToDo
  ===================================================================
  RCS file: /home/cvs/modperl/ToDo,v
  retrieving revision 1.241
  retrieving revision 1.242
  diff -u -r1.241 -r1.242
  --- ToDo      2000/04/21 17:04:56     1.241
  +++ ToDo      2000/05/12 07:10:56     1.242
  @@ -52,10 +52,7 @@
   - coderef to $r->custom_response
   [Randal L. Schwartz <[EMAIL PROTECTED]>]
   
  -- PerlRun::flush_namespace needs to check if_owner for all types, not
  -just cvs.  NOTE: i dont think this is possible, only CVs have a GV
  -pointer attached -dougm
  -[John M Vinopal <[EMAIL PROTECTED]>]
  +- Apache::PerlRun::flush_namespace should be re-written in c
   
   - should $r->content unset $r->headers_in('content-length') ?
   NOTE: im worried this could break apps who need to know content-length 
  
  
  
  1.28      +34 -20    modperl/lib/Apache/PerlRun.pm
  
  Index: PerlRun.pm
  ===================================================================
  RCS file: /home/cvs/modperl/lib/Apache/PerlRun.pm,v
  retrieving revision 1.27
  retrieving revision 1.28
  diff -u -r1.27 -r1.28
  --- PerlRun.pm        2000/04/05 06:19:34     1.27
  +++ PerlRun.pm        2000/05/12 07:10:57     1.28
  @@ -312,36 +312,50 @@
       return $rc;
   }
   
  +BEGIN {
  +    if ($] < 5.006) {
  +        $INC{'warnings.pm'} = __FILE__;
  +        *warnings::unimport = sub {};
  +    }
  +}
  +
   sub flush_namespace {
       my($self, $package) = @_;
       $package ||= $self->namespace;
   
  -    no strict;
  +    no strict 'refs';
       my $tab = \%{$package.'::'};
   
       for (keys %$tab) {
  -     if(*{ $tab->{$_} }{CODE}) {
  -         undef_cv_if_owner($package, \&{ $tab->{$_} });
  -     } 
  -        if(*{ $tab->{$_} }{HASH}) {
  -            undef %{ $tab->{$_} };
  +        my $fullname = join '::', $package, $_;
  +        #code/hash/array/scalar might be imported
  +        #make sure the gv does not point elsewhere
  +        #before undefing each
  +        if (%$fullname) {
  +            *{$fullname} = {};
  +            undef %$fullname;
           }
  -        if(*{ $tab->{$_} }{ARRAY}) {
  -            undef @{ $tab->{$_} };
  +        if (@$fullname) {
  +            *{$fullname} = [];
  +            undef @$fullname;
           }
  -        if(*{ $tab->{$_} }{SCALAR}) {
  -         undef ${ $tab->{$_} };
  +        if ($$fullname) {
  +            my $tmp; #argh, no such thing as an anonymous scalar
  +            *{$fullname} = \$tmp;
  +            undef $$fullname;
           }
  -     }
  -}
  -
  -sub undef_cv_if_owner {
  -    return unless $INC{'B.pm'};
  -    my($package, $cv) = @_;
  -    my $obj    = B::svref_2object($cv);
  -    my $stash  = $obj->GV->STASH->NAME;
  -    return unless $package eq $stash;
  -    undef &$cv;
  +        if (defined &$fullname) {
  +            no warnings;
  +            local $^W = 0;
  +            *{$fullname} = sub {};
  +         undef &$fullname;
  +     }
  +        if (*{$fullname}{IO}) {
  +            if (fileno $fullname) {
  +                close $fullname;
  +            }
  +        }
  +    }
   }
   
   1;
  
  
  
  1.37      +5 -2      modperl/t/docs/startup.pl
  
  Index: startup.pl
  ===================================================================
  RCS file: /home/cvs/modperl/t/docs/startup.pl,v
  retrieving revision 1.36
  retrieving revision 1.37
  diff -u -r1.36 -r1.37
  --- startup.pl        1999/04/07 03:34:35     1.36
  +++ startup.pl        2000/05/12 07:10:58     1.37
  @@ -1,4 +1,4 @@
  -#! /usr/local/bin/perl
  +#!perl
   
   unless (defined $ENV{MOD_PERL}) {
       die "\$ENV{MOD_PERL} not set!";
  @@ -103,7 +103,10 @@
   
   $ENV{GATEWAY_INTERFACE} =~ /^CGI-Perl/ or die "GATEWAY_INTERFACE not set!";
   
  -sub Outside::imported {4}
  +sub Outside::code {4}
  +%Outside::hash = (one => 1);
  +@Outside::array = qw(one);
  +$Outside::scalar = 'one';
   
   #will be redef'd during tests
   sub PerlTransHandler::handler {-1}
  
  
  
  1.2       +2 -0      modperl/t/modules/perlrun.t
  
  Index: perlrun.t
  ===================================================================
  RCS file: /home/cvs/modperl/t/modules/perlrun.t,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- perlrun.t 1998/04/26 00:16:40     1.1
  +++ perlrun.t 2000/05/12 07:10:58     1.2
  @@ -1,4 +1,6 @@
   use Apache::test;
   
  +fetch "/dirty-perl/dirty-script.cgi";
  +
   print fetch "/dirty-perl/dirty-test.cgi";
   
  
  
  
  1.5       +4 -1      modperl/t/net/perl/dirty-script.cgi
  
  Index: dirty-script.cgi
  ===================================================================
  RCS file: /home/cvs/modperl/t/net/perl/dirty-script.cgi,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- dirty-script.cgi  1999/01/21 00:38:24     1.4
  +++ dirty-script.cgi  2000/05/12 07:10:59     1.5
  @@ -10,7 +10,10 @@
   open FH, $0 or die $!;
   
   sub subroutine {}
  -*imported = \&Outside::imported;
  +*code_alias = \&Outside::code;
  +*hash_alias = \%Outside::hash;
  +*array_alias = \@Outside::array;
  +*scalar_alias = \$Outside::scalar;
   
   push @array, 1;
   
  
  
  
  1.5       +9 -7      modperl/t/net/perl/dirty-test.cgi
  
  Index: dirty-test.cgi
  ===================================================================
  RCS file: /home/cvs/modperl/t/net/perl/dirty-test.cgi,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- dirty-test.cgi    1999/08/04 01:56:14     1.4
  +++ dirty-test.cgi    2000/05/12 07:10:59     1.5
  @@ -4,21 +4,23 @@
       die "%INC save/restore broken";
   }
   
  -package Apache::ROOT::dirty_2dperl::dirty_2dscript_2epl;
  +package Apache::ROOT::dirty_2dperl::dirty_2dscript_2ecgi;
   
  -use Apache::test;
  +use Apache::test qw(test);
   
   print "Content-type: text/plain\n\n";
   
  -print "1..6\n";
  +print "1..9\n";
   
   my $i = 0;
   
   test ++$i, not defined &subroutine;
  -test ++$i, not *{"array"}{ARRAY};
  -test ++$i, not *{"hash"}{HASH};
  +test ++$i, not @array;
  +test ++$i, not %hash;
   test ++$i, not defined $scalar;
   test ++$i, not defined fileno(FH);
  -test ++$i, Outside::imported() == 4;
  -
  +test ++$i, Outside::code() == 4;
  +test ++$i, keys %Outside::hash == 1;
  +test ++$i, @Outside::array == 1;
  +test ++$i, $Outside::scalar eq 'one';
   
  
  
  

Reply via email to