X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FFatal.pm;h=0ea5963df0b0eb6f6941dee81f67b0bb69ef33df;hb=57c7bc0807db52907ce13229410345ba8f983f8a;hp=281474c336525e01b7d0bdfd674b9360d32e0da1;hpb=5f05dabc4054964aa3b10f44f8468547f051cdf8;p=p5sagit%2Fp5-mst-13.2.git diff --git a/lib/Fatal.pm b/lib/Fatal.pm index 281474c..0ea5963 100644 --- a/lib/Fatal.pm +++ b/lib/Fatal.pm @@ -1,17 +1,26 @@ package Fatal; +use 5.006_001; use Carp; use strict; -use vars qw( $AUTOLOAD $Debug ); +our($AUTOLOAD, $Debug, $VERSION); -$Debug = 0; +$VERSION = 1.03; + +$Debug = 0 unless defined $Debug; sub import { my $self = shift(@_); my($sym, $pkg); + my $void = 0; $pkg = (caller)[0]; foreach $sym (@_) { - &_make_fatal($sym, $pkg); + if ($sym eq ":void") { + $void = 1; + } + else { + &_make_fatal($sym, $pkg, $void); + } } }; @@ -22,31 +31,106 @@ sub AUTOLOAD { goto &$AUTOLOAD; } +sub fill_protos { + my $proto = shift; + my ($n, $isref, @out, @out1, $seen_semi) = -1; + while ($proto =~ /\S/) { + $n++; + push(@out1,[$n,@out]) if $seen_semi; + push(@out, $1 . "{\$_[$n]}"), next if $proto =~ s/^\s*\\([\@%\$\&])//; + push(@out, "\$_[$n]"), next if $proto =~ s/^\s*([*\$&])//; + push(@out, "\@_[$n..\$#_]"), last if $proto =~ s/^\s*(;\s*)?\@//; + $seen_semi = 1, $n--, next if $proto =~ s/^\s*;//; # XXXX ???? + die "Unknown prototype letters: \"$proto\""; + } + push(@out1,[$n+1,@out]); + @out1; +} + +sub write_invocation { + my ($core, $call, $name, $void, @argvs) = @_; + if (@argvs == 1) { # No optional arguments + my @argv = @{$argvs[0]}; + shift @argv; + return "\t" . one_invocation($core, $call, $name, $void, @argv) . ";\n"; + } else { + my $else = "\t"; + my (@out, @argv, $n); + while (@argvs) { + @argv = @{shift @argvs}; + $n = shift @argv; + push @out, "$ {else}if (\@_ == $n) {\n"; + $else = "\t} els"; + push @out, + "\t\treturn " . one_invocation($core, $call, $name, $void, @argv) . ";\n"; + } + push @out, < provides a way to conveniently replace functions which normally -return a false value when they fail with equivalents which halt execution +return a false value when they fail with equivalents which raise exceptions if they are not successful. This lets you use these functions without -having to test their return values explicitly on each call. Errors are -reported via C, so you can trap them using C<$SIG{__DIE__}> if you -wish to take some action before the program exits. +having to test their return values explicitly on each call. Exceptions +can be caught using C. See L and L for details. + +The do-or-die equivalents are set up simply by calling Fatal's +C routine, passing it the names of the functions to be +replaced. You may wrap both user-defined functions and overridable +CORE operators (except C, C which cannot be expressed +via prototypes) in this way. + +If the symbol C<:void> appears in the import list, then functions +named later in that import list raise an exception only when +these are called in void context--that is, when their return +values are ignored. For example -The do-or-die equivalents are set up simply by calling Fatal's C -routine, passing it the names of the functions to be replaced. You may -wrap both user-defined functions and CORE operators in this way. + use Fatal qw/:void open close/; + + # properly checked, so no exception raised on error + if(open(FH, "< /bogotic") { + warn "bogo file, dude: $!"; + } + + # not checked, so error raises an exception + close FH; =head1 AUTHOR Lionel.Cons@cern.ch + +prototype updates by Ilya Zakharevich ilya@math.ohio-state.edu + +=cut