You are viewing a plain text version of this content. The canonical link for it is here.
Posted to modperl@perl.apache.org by Ben Tilly <bt...@gmail.com> on 2005/09/12 23:38:04 UTC
Patch for ModPerl::Util to make Apache::Reload and Class::DBI cooperate
Currently in modperl 2 you cannot get Apache::Reload and Class::DBI to
cooperate properly. The problem is that Apache::Reload wipes out the
CODE slot by doing an undef, which leaves a non-working code
reference. Therefore UNIVERSAL::can and *foo{CODE} will both say that
there is a method/function there, but Bad Things happen if you try to
call it.
This confuses Class::DBI (and probably some other modules) on a reload.
The attached patch from Steve Caldwell and me fixes that. (There are
other issues as well, but Class::Data::Reloadable takes care of them.)
Unfortunately this does not preserve the GLOB slot as the old code
did, but since we're skipping stashes, I don't think that that is
likely to cause problems.
Aslo note that we are explicitly closing filehandles. I don't know
why the old code was doing so. Personally I'd be inclined not to -
Perl will close a filehandle when the last reference to it goes away,
and we're leaving a trap for anyone who aliases STDIN, STDOUT or
STDERR to a local filehandle. But I'm trying to not change behaviour
without knowing the reason for the old, so I'll leave that for someone
else to remove.
Cheers,
Ben
--- /usr/lib/perl5/ModPerl/Util.pm 2005-08-11 22:43:50.000000000 -0700
+++ lib/perl5/ModPerl/Util.pm 2005-09-12 13:34:33.282868768 -0700
@@ -38,46 +38,22 @@
no strict 'refs';
my $tab = \%{ $package . '::' };
- # below we assign to a symbol first before undef'ing it, to avoid
- # nuking aliases. If we undef directly we may undef not only the
- # alias but the original function as well
-
for (keys %$tab) {
#Skip sub stashes
next if /::$/;
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 (@$fullname) {
- *{$fullname} = [];
- undef @$fullname;
- }
- if ($$fullname) {
- my $tmp; # argh, no such thing as an anonymous scalar
- *{$fullname} = \$tmp;
- undef $$fullname;
- }
- if (defined &$fullname) {
- no warnings;
- local $^W = 0;
- if (defined(my $p = prototype $fullname)) {
- *{$fullname} = eval "sub ($p) {}";
- }
- else {
- *{$fullname} = sub {};
- }
- undef &$fullname;
- }
+
+ # I'm not sure why we're closing the filehandles, but the version
+ # I replaced did the same
if (*{$fullname}{IO}) {
if (fileno $fullname) {
close $fullname;
}
}
+
+ *{$fullname} = do {local *{$fullname}};
+
}
#Wipe from %INC