summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorPaul Marquess <paul.marquess@btinternet.com>2000-08-18 23:42:06 +0100
committerJarkko Hietaniemi <jhi@iki.fi>2000-08-18 21:55:14 +0000
commit7e6d00f88633359fc96f8d1e8d7c3aa419c0d976 (patch)
tree115e92e1d9659da8ccbcc678280e29721d6d8a57 /lib
parent68cc8748cd09408eb4c1922bf0cb3edbeb4cec80 (diff)
downloadperl-7e6d00f88633359fc96f8d1e8d7c3aa419c0d976.tar.gz
Add warnif(), check warnings further up the stack,
all the warnings functions now can take an optional object reference. Subject: [PATCH bleedperl@6691] warnings pragma update Message-ID: <000c01c0095d$278e0040$ca01073e@bfs.phone.com> p4raw-id: //depot/perl@6707
Diffstat (limited to 'lib')
-rw-r--r--lib/Class/Struct.pm3
-rw-r--r--lib/Tie/Handle.pm3
-rw-r--r--lib/Tie/Hash.pm3
-rw-r--r--lib/Tie/Scalar.pm3
-rw-r--r--lib/fields.pm3
-rw-r--r--lib/syslog.pl2
-rw-r--r--lib/warnings.pm176
7 files changed, 142 insertions, 51 deletions
diff --git a/lib/Class/Struct.pm b/lib/Class/Struct.pm
index 63eddac739..ac1fb4736d 100644
--- a/lib/Class/Struct.pm
+++ b/lib/Class/Struct.pm
@@ -168,8 +168,7 @@ sub struct {
$cnt = 0;
foreach $name (@methods){
if ( do { no strict 'refs'; defined &{$class . "::$name"} } ) {
- warnings::warn "function '$name' already defined, overrides struct accessor method"
- if warnings::enabled();
+ warnings::warnif("function '$name' already defined, overrides struct accessor method");
}
else {
$pre = $pst = $cmt = $sel = '';
diff --git a/lib/Tie/Handle.pm b/lib/Tie/Handle.pm
index 588ecead89..42d0834ed8 100644
--- a/lib/Tie/Handle.pm
+++ b/lib/Tie/Handle.pm
@@ -120,8 +120,7 @@ sub new {
sub TIEHANDLE {
my $pkg = shift;
if (defined &{"{$pkg}::new"}) {
- warnings::warn "WARNING: calling ${pkg}->new since ${pkg}->TIEHANDLE is missing"
- if warnings::enabled();
+ warnings::warnif("WARNING: calling ${pkg}->new since ${pkg}->TIEHANDLE is missing");
$pkg->new(@_);
}
else {
diff --git a/lib/Tie/Hash.pm b/lib/Tie/Hash.pm
index c6ec3d4f5c..2244711669 100644
--- a/lib/Tie/Hash.pm
+++ b/lib/Tie/Hash.pm
@@ -114,8 +114,7 @@ sub new {
sub TIEHASH {
my $pkg = shift;
if (defined &{"${pkg}::new"}) {
- warnings::warn "WARNING: calling ${pkg}->new since ${pkg}->TIEHASH is missing"
- if warnings::enabled();
+ warnings::warnif("WARNING: calling ${pkg}->new since ${pkg}->TIEHASH is missing");
$pkg->new(@_);
}
else {
diff --git a/lib/Tie/Scalar.pm b/lib/Tie/Scalar.pm
index 0c6759006f..89ad03eddc 100644
--- a/lib/Tie/Scalar.pm
+++ b/lib/Tie/Scalar.pm
@@ -91,8 +91,7 @@ sub new {
sub TIESCALAR {
my $pkg = shift;
if (defined &{"{$pkg}::new"}) {
- warnings::warn "WARNING: calling ${pkg}->new since ${pkg}->TIESCALAR is missing"
- if warnings::enabled();
+ warnings::warnif("WARNING: calling ${pkg}->new since ${pkg}->TIESCALAR is missing");
$pkg->new(@_);
}
else {
diff --git a/lib/fields.pm b/lib/fields.pm
index ac4581036f..37ff99d78a 100644
--- a/lib/fields.pm
+++ b/lib/fields.pm
@@ -172,8 +172,7 @@ sub import {
if ($fno and $fno != $next) {
require Carp;
if ($fno < $fattr->[0]) {
- warnings::warn("Hides field '$f' in base class")
- if warnings::enabled();
+ warnings::warnif("Hides field '$f' in base class") ;
} else {
Carp::croak("Field name '$f' already in use");
}
diff --git a/lib/syslog.pl b/lib/syslog.pl
index 70c439b9ae..f0dbb1c96a 100644
--- a/lib/syslog.pl
+++ b/lib/syslog.pl
@@ -34,7 +34,7 @@ use warnings::register;
$host = 'localhost' unless $host; # set $syslog'host to change
if ($] >= 5 && warnings::enabled()) {
- warnings::warn "You should 'use Sys::Syslog' instead; continuing";
+ warnings::warn("You should 'use Sys::Syslog' instead; continuing");
}
require 'syslog.ph';
diff --git a/lib/warnings.pm b/lib/warnings.pm
index ac6d919954..df9f787e1c 100644
--- a/lib/warnings.pm
+++ b/lib/warnings.pm
@@ -26,6 +26,14 @@ warnings - Perl pragma to control optional warnings
warnings::warn("void", "some warning");
}
+ if (warnings::enabled($object)) {
+ warnings::warn($object, "some warning");
+ }
+
+ warnif("some warning");
+ warnif("void", "some warning");
+ warnif($object, "some warning");
+
=head1 DESCRIPTION
If no import list is supplied, all possible warnings are either enabled
@@ -37,26 +45,78 @@ A number of functions are provided to assist module authors.
=item use warnings::register
-Creates a new warnings category which has the same name as the module
-where the call to the pragma is used.
+Creates a new warnings category with the same name as the package where
+the call to the pragma is used.
+
+=item warnings::enabled()
+
+Use the warnings category with the same name as the current package.
+
+Return TRUE if that warnings category is enabled in the calling module.
+Otherwise returns FALSE.
+
+=item warnings::enabled($category)
+
+Return TRUE if the warnings category, C<$category>, is enabled in the
+calling module.
+Otherwise returns FALSE.
+
+=item warnings::enabled($object)
+
+Use the name of the class for the object reference, C<$object>, as the
+warnings category.
+
+Return TRUE if that warnings category is enabled in the first scope
+where the object is used.
+Otherwise returns FALSE.
+
+=item warnings::warn($message)
+
+Print C<$message> to STDERR.
+
+Use the warnings category with the same name as the current package.
+
+If that warnings category has been set to "FATAL" in the calling module
+then die. Otherwise return.
+
+=item warnings::warn($category, $message)
+
+Print C<$message> to STDERR.
+
+If the warnings category, C<$category>, has been set to "FATAL" in the
+calling module then die. Otherwise return.
-=item warnings::enabled([$category])
+=item warnings::warn($object, $message)
-Returns TRUE if the warnings category C<$category> is enabled in the
-calling module. Otherwise returns FALSE.
+Print C<$message> to STDERR.
-If the parameter, C<$category>, isn't supplied, the current package name
-will be used.
+Use the name of the class for the object reference, C<$object>, as the
+warnings category.
-=item warnings::warn([$category,] $message)
+If that warnings category has been set to "FATAL" in the scope where C<$object>
+is first used then die. Otherwise return.
-If the calling module has I<not> set C<$category> to "FATAL", print
-C<$message> to STDERR.
-If the calling module has set C<$category> to "FATAL", print C<$message>
-STDERR then die.
-If the parameter, C<$category>, isn't supplied, the current package name
-will be used.
+=item warnings::warnif($message)
+
+Equivalent to:
+
+ if (warnings::enabled())
+ { warnings::warn($message) }
+
+=item warnings::warnif($category, $message)
+
+Equivalent to:
+
+ if (warnings::enabled($category))
+ { warnings::warn($category, $message) }
+
+=item warnings::warnif($object, $message)
+
+Equivalent to:
+
+ if (warnings::enabled($object))
+ { warnings::warn($object, $message) }
=back
@@ -256,31 +316,62 @@ sub unimport {
${^WARNING_BITS} = $mask & ~ (bits(@_ ? @_ : 'all') | $All) ;
}
-sub enabled
+sub __chk
{
- croak("Usage: warnings::enabled([category])")
- unless @_ == 1 || @_ == 0 ;
- local $Carp::CarpLevel = 1 ;
my $category ;
my $offset ;
- my $callers_bitmask = (caller(1))[9] ;
- return 0 unless defined $callers_bitmask ;
-
+ my $isobj = 0 ;
if (@_) {
# check the category supplied.
$category = shift ;
+ if (ref $category) {
+ croak ("not an object")
+ if $category !~ /^([^=]+)=/ ;+
+ $category = $1 ;
+ $isobj = 1 ;
+ }
$offset = $Offsets{$category};
croak("unknown warnings category '$category'")
unless defined $offset;
}
else {
- $category = (caller(0))[0] ;
+ $category = (caller(1))[0] ;
$offset = $Offsets{$category};
croak("package '$category' not registered for warnings")
unless defined $offset ;
}
+ my $this_pkg = (caller(1))[0] ;
+ my $i = 2 ;
+ my $pkg ;
+
+ if ($isobj) {
+ while (do { { package DB; $pkg = (caller($i++))[0] } } ) {
+ last unless @DB::args && $DB::args[0] =~ /^$category=/ ;
+ }
+ $i -= 2 ;
+ }
+ else {
+ for ($i = 2 ; $pkg = (caller($i))[0] ; ++ $i) {
+ last if $pkg ne $this_pkg ;
+ }
+ $i = 2
+ if !$pkg || $pkg eq $this_pkg ;
+ }
+
+ my $callers_bitmask = (caller($i))[9] ;
+ return ($callers_bitmask, $offset, $i) ;
+}
+
+sub enabled
+{
+ croak("Usage: warnings::enabled([category])")
+ unless @_ == 1 || @_ == 0 ;
+
+ my ($callers_bitmask, $offset, $i) = __chk(@_) ;
+
+ return 0 unless defined $callers_bitmask ;
return vec($callers_bitmask, $offset, 1) ||
vec($callers_bitmask, $Offsets{'all'}, 1) ;
}
@@ -290,29 +381,34 @@ sub warn
{
croak("Usage: warnings::warn([category,] 'message')")
unless @_ == 2 || @_ == 1 ;
- local $Carp::CarpLevel = 1 ;
- my $category ;
- my $offset ;
- my $callers_bitmask = (caller(1))[9] ;
-
- if (@_ == 2) {
- $category = shift ;
- $offset = $Offsets{$category};
- croak("unknown warnings category '$category'")
- unless defined $offset ;
- }
- else {
- $category = (caller(0))[0] ;
- $offset = $Offsets{$category};
- croak("package '$category' not registered for warnings")
- unless defined $offset ;
- }
- my $message = shift ;
+ my $message = pop ;
+ my ($callers_bitmask, $offset, $i) = __chk(@_) ;
+ local $Carp::CarpLevel = $i ;
croak($message)
if vec($callers_bitmask, $offset+1, 1) ||
vec($callers_bitmask, $Offsets{'all'}+1, 1) ;
carp($message) ;
}
+sub warnif
+{
+ croak("Usage: warnings::warnif([category,] 'message')")
+ unless @_ == 2 || @_ == 1 ;
+
+ my $message = pop ;
+ my ($callers_bitmask, $offset, $i) = __chk(@_) ;
+ local $Carp::CarpLevel = $i ;
+
+ return
+ unless defined $callers_bitmask &&
+ (vec($callers_bitmask, $offset, 1) ||
+ vec($callers_bitmask, $Offsets{'all'}, 1)) ;
+
+ croak($message)
+ if vec($callers_bitmask, $offset+1, 1) ||
+ vec($callers_bitmask, $Offsets{'all'}+1, 1) ;
+
+ carp($message) ;
+}
1;