develooper Front page | perl.perl5.porters | Postings from October 2003

Re: 5.8.2 perldelta

From:
Stas Bekman
Date:
October 29, 2003 17:56
Subject:
Re: 5.8.2 perldelta
Message ID:
3FA06FAB.8040702@stason.org
Here is a test which demonstrates why the new change in require is broken 
(IMHO) (besides a completely hosed mod_perl 1.0 test suite):

use Cwd;
use File::Spec::Functions qw(catdir);
use lib qw(.);

my $i = 1;
my $file = "nick.pm";
my $cwd = cwd;
my $not_cwd = catdir $cwd, "foo";

mkdir $not_cwd;
write_file($file, qq[die "can't find $file" unless -e $file; 1;\n]);

for my $expected_failure (1,0) {
     chdir $expected_failure ? $not_cwd : $cwd;
     eval { require $file };
     print map { "# $_\n" } split /\n/, $@ if $@;

     print "not " if $expected_failure xor $@;
     print "ok ", $i++, "\n";

     print "not " unless exists $INC{$file};
     print "ok ", $i++, "\n";
}
chdir $cwd;
unlink $file;
rmdir $not_cwd;

sub write_file {
     my($file, $data) = @_;
     open my $fh, ">$file" or die $!;
     print $fh $data;
     close $fh;
}


% perl-5.8.1 /tmp/nick
# can't find nick.pm at nick.pm line 1.
# Compilation failed in require at /tmp/nick line 12.
ok 1
ok 2
ok 3
ok 4

% perl-5.8.2 /tmp/nick
# can't find nick.pm at nick.pm line 1.
# Compilation failed in require at /tmp/nick line 12.
ok 1
ok 2
# Compilation failed in require at /tmp/nick line 12.
not ok 3
ok 4

Here is the problem. If a module fails to load once it must not be 
blacklisted. The test demonstrates how a module may fail if loaded from the 
wrong directory, but then is supposed to succeed if moved to a different 
directory.

Imagine a real world situation: program A tries to load module Foo, but fails 
for some reason. Now program B tries to load module Foo and it succeeds (e.g. 
this time loaded from the proper directory, or some other condition became 
true). Now run both program from a persistent enviroment like mod_perl. 
Program A prevents from program B to load module Foo. The only way to fix that 
problem is to delete $INC{"Foo.pm"} in program B. But this is abnormal since 
the developer of program B, had no idea that some other program may do 
something that will require a cleanup of %INC.

It's quite possible that there are more situations when this change breaks 
things. I have found only one so far. If someone has other idea please speak up.

__________________________________________________________________
Stas Bekman            JAm_pH ------> Just Another mod_perl Hacker
http://stason.org/     mod_perl Guide ---> http://perl.apache.org
mailto:stas@stason.org http://use.perl.org http://apacheweek.com
http://modperlbook.org http://apache.org   http://ticketmaster.com




nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About