Merge the guts of warnings::import and warnings::bits into _bits.
authorNicholas Clark <nick@ccl4.org>
Sat, 19 Jun 2010 21:32:33 +0000 (22:32 +0100)
committerNicholas Clark <nick@ccl4.org>
Wed, 23 Jun 2010 07:44:42 +0000 (08:44 +0100)
Additionally, removing the scope entry caused by the {} in the fast path of
&import reduces instruction count and L1 cache misses for warnings->import()
by 3%.

lib/warnings.pm
warnings.pl

index c6881fe..3ea05e2 100644 (file)
@@ -332,13 +332,8 @@ sub Croaker
     Carp::croak(@_);
 }
 
-sub bits
-{
-    # called from B::Deparse.pm
-
-    push @_, 'all' unless @_;
-
-    my $mask;
+sub _bits {
+    my $mask = shift ;
     my $catmask ;
     my $fatal = 0 ;
     my $no_fatal = 0 ;
@@ -364,6 +359,13 @@ sub bits
     return $mask ;
 }
 
+sub bits
+{
+    # called from B::Deparse.pm
+    push @_, 'all' unless @_ ;
+    return _bits(undef, @_) ;
+}
+
 sub import 
 {
     shift;
@@ -375,34 +377,8 @@ sub import
         $mask |= $DeadBits{'all'} if vec($mask, $Offsets{'all'}+1, 1);
     }
     
-    unless (@_) {
-       # This is equivalent to @_ = 'all' ;
-       return ${^WARNING_BITS} = $mask | $Bits{all} ;
-    }
-
-    my $catmask ;
-    my $fatal = 0 ;
-    my $no_fatal = 0 ;
-
-    foreach my $word ( @_ ) {
-       if ($word eq 'FATAL') {
-           $fatal = 1;
-           $no_fatal = 0;
-       }
-       elsif ($word eq 'NONFATAL') {
-           $fatal = 0;
-           $no_fatal = 1;
-       }
-       elsif ($catmask = $Bits{$word}) {
-           $mask |= $catmask ;
-           $mask |= $DeadBits{$word} if $fatal ;
-           $mask &= ~($DeadBits{$word}|$All) if $no_fatal ;
-       }
-       else
-          { Croaker("Unknown warnings category '$word'")}
-    }
-
-    ${^WARNING_BITS} = $mask ;
+    # Empty @_ is equivalent to @_ = 'all' ;
+    ${^WARNING_BITS} = @_ ? _bits($mask, @_) : $mask | $Bits{all} ;
 }
 
 sub unimport 
index 87bf96a..149d010 100644 (file)
@@ -617,13 +617,8 @@ sub Croaker
     Carp::croak(@_);
 }
 
-sub bits
-{
-    # called from B::Deparse.pm
-
-    push @_, 'all' unless @_;
-
-    my $mask;
+sub _bits {
+    my $mask = shift ;
     my $catmask ;
     my $fatal = 0 ;
     my $no_fatal = 0 ;
@@ -649,6 +644,13 @@ sub bits
     return $mask ;
 }
 
+sub bits
+{
+    # called from B::Deparse.pm
+    push @_, 'all' unless @_ ;
+    return _bits(undef, @_) ;
+}
+
 sub import 
 {
     shift;
@@ -660,34 +662,8 @@ sub import
         $mask |= $DeadBits{'all'} if vec($mask, $Offsets{'all'}+1, 1);
     }
     
-    unless (@_) {
-       # This is equivalent to @_ = 'all' ;
-       return ${^WARNING_BITS} = $mask | $Bits{all} ;
-    }
-
-    my $catmask ;
-    my $fatal = 0 ;
-    my $no_fatal = 0 ;
-
-    foreach my $word ( @_ ) {
-       if ($word eq 'FATAL') {
-           $fatal = 1;
-           $no_fatal = 0;
-       }
-       elsif ($word eq 'NONFATAL') {
-           $fatal = 0;
-           $no_fatal = 1;
-       }
-       elsif ($catmask = $Bits{$word}) {
-           $mask |= $catmask ;
-           $mask |= $DeadBits{$word} if $fatal ;
-           $mask &= ~($DeadBits{$word}|$All) if $no_fatal ;
-       }
-       else
-          { Croaker("Unknown warnings category '$word'")}
-    }
-
-    ${^WARNING_BITS} = $mask ;
+    # Empty @_ is equivalent to @_ = 'all' ;
+    ${^WARNING_BITS} = @_ ? _bits($mask, @_) : $mask | $Bits{all} ;
 }
 
 sub unimport