# from Smylers
# on Wednesday 23 April 2008 14:51:
>Why would it being under his control mean he didn't want to test for
> it?
He didn't say anything about testing for it. Ovid said he was thinking
about changing his code to e.g. "open(my $fh, '<', $file) or EXIT;",
which IMO is not required because that would mean you ended up with a
$SIG{__DIE__} in scope from 'main', aka t/foo.t.
# dienow.pm
package dienow; use warnings; use strict; use Carp ();
use Class::Accessor::Classy; with 'new'; no Class::Accessor::Classy;
use overload '&{}' => sub {sub{die @_}}, fallback => 1;
$SIG{__DIE__} = __PACKAGE__->new;
my $ended = 0; END {$ended = 1};
sub DESTROY { return if($ended); Carp::carp("bad bunny"); exit(1); }
1;
There. If anyone sets a global die handler, we complain and stop.
Apparently 'die' from inside the DESTROY() of the object in
$SIG{__DIE__} doesn't work... fancy that. ;-)
For extra points, wrap any existing die handler so that the load order
determines which ones are okay. Other than that, I think it just needs
a better name.
For those thinking "but you now always have a die handler", I say "yes,
but it is not a _broken_ one".
perl -e 'use dienow; eval{ die "foo!";}; warn "eval works: $@"'
perl -e 'use dienow; die "foo!";'
--Eric
--
So malloc calls a timeout and starts rummaging around the free chain,
sorting things out, and merging adjacent small free blocks into larger
blocks. This takes 3 1/2 days.
--Joel Spolsky
---------------------------------------------------
http://scratchcomputing.com
---------------------------------------------------