11 sub DEFAULT_ON () { 1 }
12 sub DEFAULT_OFF () { 2 }
18 'pipe' => [ 5.008, DEFAULT_OFF],
19 'unopened' => [ 5.008, DEFAULT_OFF],
20 'closed' => [ 5.008, DEFAULT_OFF],
21 'newline' => [ 5.008, DEFAULT_OFF],
22 'exec' => [ 5.008, DEFAULT_OFF],
23 'layer' => [ 5.008, DEFAULT_OFF],
25 'syntax' => [ 5.008, {
26 'ambiguous' => [ 5.008, DEFAULT_OFF],
27 'semicolon' => [ 5.008, DEFAULT_OFF],
28 'precedence' => [ 5.008, DEFAULT_OFF],
29 'bareword' => [ 5.008, DEFAULT_OFF],
30 'reserved' => [ 5.008, DEFAULT_OFF],
31 'digit' => [ 5.008, DEFAULT_OFF],
32 'parenthesis' => [ 5.008, DEFAULT_OFF],
33 'printf' => [ 5.008, DEFAULT_OFF],
34 'prototype' => [ 5.008, DEFAULT_OFF],
35 'qw' => [ 5.008, DEFAULT_OFF],
37 'severe' => [ 5.008, {
38 'inplace' => [ 5.008, DEFAULT_ON],
39 'internal' => [ 5.008, DEFAULT_ON],
40 'debugging' => [ 5.008, DEFAULT_ON],
41 'malloc' => [ 5.008, DEFAULT_ON],
43 'deprecated' => [ 5.008, DEFAULT_OFF],
44 'void' => [ 5.008, DEFAULT_OFF],
45 'recursion' => [ 5.008, DEFAULT_OFF],
46 'redefine' => [ 5.008, DEFAULT_OFF],
47 'numeric' => [ 5.008, DEFAULT_OFF],
48 'uninitialized' => [ 5.008, DEFAULT_OFF],
49 'once' => [ 5.008, DEFAULT_OFF],
50 'misc' => [ 5.008, DEFAULT_OFF],
51 'regexp' => [ 5.008, DEFAULT_OFF],
52 'glob' => [ 5.008, DEFAULT_OFF],
53 'y2k' => [ 5.008, DEFAULT_OFF],
54 'untie' => [ 5.008, DEFAULT_OFF],
55 'substr' => [ 5.008, DEFAULT_OFF],
56 'taint' => [ 5.008, DEFAULT_OFF],
57 'signal' => [ 5.008, DEFAULT_OFF],
58 'closure' => [ 5.008, DEFAULT_OFF],
59 'overflow' => [ 5.008, DEFAULT_OFF],
60 'portable' => [ 5.008, DEFAULT_OFF],
61 'utf8' => [ 5.008, DEFAULT_OFF],
62 'exiting' => [ 5.008, DEFAULT_OFF],
63 'pack' => [ 5.008, DEFAULT_OFF],
64 'unpack' => [ 5.008, DEFAULT_OFF],
65 'threads' => [ 5.008, DEFAULT_OFF],
66 #'default' => [ 5.008, DEFAULT_ON ],
70 ###########################################################################
73 $t .= "\t" x ($l - (length($t) + 1) / 8);
77 ###########################################################################
93 foreach $k (sort keys %$tre) {
95 die "duplicate key $k\n" if defined $list{$k} ;
96 die "Value associated with key '$k' is not an ARRAY reference"
97 if !ref $v || ref $v ne 'ARRAY' ;
99 my ($ver, $rest) = @{ $v } ;
100 push @{ $v_list{$ver} }, $k;
103 { valueWalk ($rest) }
112 foreach my $ver ( sort { $a <=> $b } keys %v_list ) {
113 foreach my $name (@{ $v_list{$ver} } ) {
114 $ValueToName{ $index } = [ uc $name, $ver ] ;
115 $NameToValue{ uc $name } = $index ++ ;
122 ###########################################################################
130 foreach $k (sort keys %$tre) {
132 die "duplicate key $k\n" if defined $list{$k} ;
133 #$Value{$index} = uc $k ;
134 die "Can't find key '$k'"
135 if ! defined $NameToValue{uc $k} ;
136 push @{ $list{$k} }, $NameToValue{uc $k} ;
137 die "Value associated with key '$k' is not an ARRAY reference"
138 if !ref $v || ref $v ne 'ARRAY' ;
140 my ($ver, $rest) = @{ $v } ;
142 { push (@{ $list{$k} }, walk ($rest)) }
144 push @list, @{ $list{$k} } ;
150 ###########################################################################
159 for ($i = 1 ; $i < @a; ++ $i) {
161 if $a[$i] == $a[$i - 1] + 1 && $a[$i] + 1 == $a[$i + 1] ;
164 my $out = join(",",@out);
166 $out =~ s/,(\.\.,)+/../g ;
170 ###########################################################################
177 my $max = (sort {$a <=> $b} map { length $_ } keys %$tre)[-1] ;
178 my @keys = sort keys %$tre ;
180 while ($k = shift @keys) {
182 die "Value associated with key '$k' is not an ARRAY reference"
183 if !ref $v || ref $v ne 'ARRAY' ;
187 print $prefix . "|\n" ;
188 print $prefix . "+- $k" ;
189 $offset = ' ' x ($max + 4) ;
192 print $prefix . "$k" ;
193 $offset = ' ' x ($max + 1) ;
196 my ($ver, $rest) = @{ $v } ;
199 my $bar = @keys ? "|" : " ";
200 print " -" . "-" x ($max - length $k ) . "+\n" ;
201 printTree ($rest, $prefix . $bar . $offset )
209 ###########################################################################
213 my ($f, $max, @a) = @_ ;
214 my $mask = "\x00" x $max ;
218 vec($mask, $_, 1) = 1 ;
221 foreach (unpack("C*", $mask)) {
223 $string .= '\x' . sprintf("%2.2x", $_)
226 $string .= '\\' . sprintf("%o", $_)
235 return mkHexOct("x", $max, @a);
241 return mkHexOct("o", $max, @a);
244 ###########################################################################
246 if (@ARGV && $ARGV[0] eq "tree")
248 printTree($tree, " ") ;
253 unlink "lib/warnings.pm";
254 open(WARN, ">warnings.h") || die "Can't create warnings.h: $!\n";
255 open(PM, ">lib/warnings.pm") || die "Can't create lib/warnings.pm: $!\n";
258 /* !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
259 This file is built by warnings.pl
260 Any changes made here will be lost!
264 #define Off(x) ((x) / 8)
265 #define Bit(x) (1 << ((x) % 8))
266 #define IsSet(a, x) ((a)[Off(x)] & Bit(x))
269 #define G_WARN_OFF 0 /* $^W == 0 */
270 #define G_WARN_ON 1 /* -w flag and $^W != 0 */
271 #define G_WARN_ALL_ON 2 /* -W flag */
272 #define G_WARN_ALL_OFF 4 /* -X flag */
273 #define G_WARN_ONCE 8 /* set if 'once' ever enabled */
274 #define G_WARN_ALL_MASK (G_WARN_ALL_ON|G_WARN_ALL_OFF)
276 #define pWARN_STD Nullsv
277 #define pWARN_ALL (Nullsv+1) /* use warnings 'all' */
278 #define pWARN_NONE (Nullsv+2) /* no warnings 'all' */
280 #define specialWARN(x) ((x) == pWARN_STD || (x) == pWARN_ALL || \
287 #@{ $list{"all"} } = walk ($tree) ;
289 my $index = orderValues();
291 die <<EOM if $index > 255 ;
292 Too many warnings categories -- max is 255
293 rewrite packWARN* & unpackWARN* macros
299 my $warn_size = int($index / 8) + ($index % 8 != 0) ;
303 foreach $k (sort { $a <=> $b } keys %ValueToName) {
304 my ($name, $version) = @{ $ValueToName{$k} };
305 print WARN "\n/* Warnings Categories added in Perl $version */\n\n"
306 if $last_ver != $version ;
307 print WARN tab(5, "#define WARN_$name"), "$k\n" ;
308 $last_ver = $version ;
312 print WARN tab(5, '#define WARNsize'), "$warn_size\n" ;
313 #print WARN tab(5, '#define WARN_ALLstring'), '"', ('\377' x $warn_size) , "\"\n" ;
314 print WARN tab(5, '#define WARN_ALLstring'), '"', ('\125' x $warn_size) , "\"\n" ;
315 print WARN tab(5, '#define WARN_NONEstring'), '"', ('\0' x $warn_size) , "\"\n" ;
316 my $WARN_TAINTstring = mkOct($warn_size, map $_ * 2, @{ $list{'taint'} });
318 print WARN tab(5, '#define WARN_TAINTstring'), qq["$WARN_TAINTstring"\n] ;
322 #define isLEXWARN_on (PL_curcop->cop_warnings != pWARN_STD)
323 #define isLEXWARN_off (PL_curcop->cop_warnings == pWARN_STD)
324 #define isWARN_ONCE (PL_dowarn & (G_WARN_ON|G_WARN_ONCE))
325 #define isWARN_on(c,x) (IsSet(SvPVX(c), 2*(x)))
326 #define isWARNf_on(c,x) (IsSet(SvPVX(c), 2*(x)+1))
329 ( (isLEXWARN_on && PL_curcop->cop_warnings != pWARN_NONE && \
330 (PL_curcop->cop_warnings == pWARN_ALL || \
331 isWARN_on(PL_curcop->cop_warnings, x) ) ) \
332 || (isLEXWARN_off && PL_dowarn & G_WARN_ON) )
334 #define ckWARN2(x,y) \
335 ( (isLEXWARN_on && PL_curcop->cop_warnings != pWARN_NONE && \
336 (PL_curcop->cop_warnings == pWARN_ALL || \
337 isWARN_on(PL_curcop->cop_warnings, x) || \
338 isWARN_on(PL_curcop->cop_warnings, y) ) ) \
339 || (isLEXWARN_off && PL_dowarn & G_WARN_ON) )
341 #define ckWARN3(x,y,z) \
342 ( (isLEXWARN_on && PL_curcop->cop_warnings != pWARN_NONE && \
343 (PL_curcop->cop_warnings == pWARN_ALL || \
344 isWARN_on(PL_curcop->cop_warnings, x) || \
345 isWARN_on(PL_curcop->cop_warnings, y) || \
346 isWARN_on(PL_curcop->cop_warnings, z) ) ) \
347 || (isLEXWARN_off && PL_dowarn & G_WARN_ON) )
349 #define ckWARN4(x,y,z,t) \
350 ( (isLEXWARN_on && PL_curcop->cop_warnings != pWARN_NONE && \
351 (PL_curcop->cop_warnings == pWARN_ALL || \
352 isWARN_on(PL_curcop->cop_warnings, x) || \
353 isWARN_on(PL_curcop->cop_warnings, y) || \
354 isWARN_on(PL_curcop->cop_warnings, z) || \
355 isWARN_on(PL_curcop->cop_warnings, t) ) ) \
356 || (isLEXWARN_off && PL_dowarn & G_WARN_ON) )
358 #define ckWARN_d(x) \
359 (isLEXWARN_off || PL_curcop->cop_warnings == pWARN_ALL || \
360 (PL_curcop->cop_warnings != pWARN_NONE && \
361 isWARN_on(PL_curcop->cop_warnings, x) ) )
363 #define ckWARN2_d(x,y) \
364 (isLEXWARN_off || PL_curcop->cop_warnings == pWARN_ALL || \
365 (PL_curcop->cop_warnings != pWARN_NONE && \
366 (isWARN_on(PL_curcop->cop_warnings, x) || \
367 isWARN_on(PL_curcop->cop_warnings, y) ) ) )
369 #define ckWARN3_d(x,y,z) \
370 (isLEXWARN_off || PL_curcop->cop_warnings == pWARN_ALL || \
371 (PL_curcop->cop_warnings != pWARN_NONE && \
372 (isWARN_on(PL_curcop->cop_warnings, x) || \
373 isWARN_on(PL_curcop->cop_warnings, y) || \
374 isWARN_on(PL_curcop->cop_warnings, z) ) ) )
376 #define ckWARN4_d(x,y,z,t) \
377 (isLEXWARN_off || PL_curcop->cop_warnings == pWARN_ALL || \
378 (PL_curcop->cop_warnings != pWARN_NONE && \
379 (isWARN_on(PL_curcop->cop_warnings, x) || \
380 isWARN_on(PL_curcop->cop_warnings, y) || \
381 isWARN_on(PL_curcop->cop_warnings, z) || \
382 isWARN_on(PL_curcop->cop_warnings, t) ) ) )
384 #define packWARN(a) (a )
385 #define packWARN2(a,b) ((a) | (b)<<8 )
386 #define packWARN3(a,b,c) ((a) | (b)<<8 | (c) <<16 )
387 #define packWARN4(a,b,c,d) ((a) | (b)<<8 | (c) <<16 | (d) <<24)
389 #define unpackWARN1(x) ((x) & 0xFF)
390 #define unpackWARN2(x) (((x) >>8) & 0xFF)
391 #define unpackWARN3(x) (((x) >>16) & 0xFF)
392 #define unpackWARN4(x) (((x) >>24) & 0xFF)
395 ( ! specialWARN(PL_curcop->cop_warnings) && \
396 ( isWARNf_on(PL_curcop->cop_warnings, WARN_ALL) || \
397 isWARNf_on(PL_curcop->cop_warnings, unpackWARN1(x)) || \
398 isWARNf_on(PL_curcop->cop_warnings, unpackWARN2(x)) || \
399 isWARNf_on(PL_curcop->cop_warnings, unpackWARN3(x)) || \
400 isWARNf_on(PL_curcop->cop_warnings, unpackWARN4(x))))
402 /* end of file warnings.h */
409 last if /^KEYWORDS$/ ;
413 #$list{'all'} = [ $offset .. 8 * ($warn_size/2) - 1 ] ;
416 print PM "our %Offsets : unique = (\n" ;
417 foreach my $k (sort { $a <=> $b } keys %ValueToName) {
418 my ($name, $version) = @{ $ValueToName{$k} };
421 if ( $last_ver != $version ) {
423 print PM tab(4, " # Warnings Categories added in Perl $version");
426 print PM tab(4, " '$name'"), "=> $k,\n" ;
427 $last_ver = $version;
432 print PM "our %Bits : unique = (\n" ;
433 foreach $k (sort keys %list) {
436 my @list = sort { $a <=> $b } @$v ;
438 print PM tab(4, " '$k'"), '=> "',
439 # mkHex($warn_size, @list),
440 mkHex($warn_size, map $_ * 2 , @list),
441 '", # [', mkRange(@list), "]\n" ;
446 print PM "our %DeadBits : unique = (\n" ;
447 foreach $k (sort keys %list) {
450 my @list = sort { $a <=> $b } @$v ;
452 print PM tab(4, " '$k'"), '=> "',
453 # mkHex($warn_size, @list),
454 mkHex($warn_size, map $_ * 2 + 1 , @list),
455 '", # [', mkRange(@list), "]\n" ;
459 print PM '$NONE = "', ('\0' x $warn_size) , "\";\n" ;
460 print PM '$LAST_BIT = ' . "$index ;\n" ;
461 print PM '$BYTES = ' . "$warn_size ;\n" ;
470 # !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
471 # This file was created by warnings.pl
472 # Any changes made here will be lost.
477 our $VERSION = '1.03';
481 warnings - Perl pragma to control optional warnings
491 use warnings::register;
492 if (warnings::enabled()) {
493 warnings::warn("some warning");
496 if (warnings::enabled("void")) {
497 warnings::warn("void", "some warning");
500 if (warnings::enabled($object)) {
501 warnings::warn($object, "some warning");
504 warnings::warnif("some warning");
505 warnings::warnif("void", "some warning");
506 warnings::warnif($object, "some warning");
510 The C<warnings> pragma is a replacement for the command line flag C<-w>,
511 but the pragma is limited to the enclosing block, while the flag is global.
512 See L<perllexwarn> for more information.
514 If no import list is supplied, all possible warnings are either enabled
517 A number of functions are provided to assist module authors.
521 =item use warnings::register
523 Creates a new warnings category with the same name as the package where
524 the call to the pragma is used.
526 =item warnings::enabled()
528 Use the warnings category with the same name as the current package.
530 Return TRUE if that warnings category is enabled in the calling module.
531 Otherwise returns FALSE.
533 =item warnings::enabled($category)
535 Return TRUE if the warnings category, C<$category>, is enabled in the
537 Otherwise returns FALSE.
539 =item warnings::enabled($object)
541 Use the name of the class for the object reference, C<$object>, as the
544 Return TRUE if that warnings category is enabled in the first scope
545 where the object is used.
546 Otherwise returns FALSE.
548 =item warnings::warn($message)
550 Print C<$message> to STDERR.
552 Use the warnings category with the same name as the current package.
554 If that warnings category has been set to "FATAL" in the calling module
555 then die. Otherwise return.
557 =item warnings::warn($category, $message)
559 Print C<$message> to STDERR.
561 If the warnings category, C<$category>, has been set to "FATAL" in the
562 calling module then die. Otherwise return.
564 =item warnings::warn($object, $message)
566 Print C<$message> to STDERR.
568 Use the name of the class for the object reference, C<$object>, as the
571 If that warnings category has been set to "FATAL" in the scope where C<$object>
572 is first used then die. Otherwise return.
575 =item warnings::warnif($message)
579 if (warnings::enabled())
580 { warnings::warn($message) }
582 =item warnings::warnif($category, $message)
586 if (warnings::enabled($category))
587 { warnings::warn($category, $message) }
589 =item warnings::warnif($object, $message)
593 if (warnings::enabled($object))
594 { warnings::warn($object, $message) }
598 See L<perlmodlib/Pragmatic Modules> and L<perllexwarn>.
606 $All = "" ; vec($All, $Offsets{'all'}, 2) = 3 ;
610 delete $Carp::CarpInternal{'warnings'};
616 # called from B::Deparse.pm
618 push @_, 'all' unless @_;
625 foreach my $word ( @_ ) {
626 if ($word eq 'FATAL') {
630 elsif ($word eq 'NONFATAL') {
634 elsif ($catmask = $Bits{$word}) {
636 $mask |= $DeadBits{$word} if $fatal ;
637 $mask &= ~($DeadBits{$word}|$All) if $no_fatal ;
640 { Croaker("Unknown warnings category '$word'")}
654 my $mask = ${^WARNING_BITS} ;
656 if (vec($mask, $Offsets{'all'}, 1)) {
657 $mask |= $Bits{'all'} ;
658 $mask |= $DeadBits{'all'} if vec($mask, $Offsets{'all'}+1, 1);
661 push @_, 'all' unless @_;
663 foreach my $word ( @_ ) {
664 if ($word eq 'FATAL') {
668 elsif ($word eq 'NONFATAL') {
672 elsif ($catmask = $Bits{$word}) {
674 $mask |= $DeadBits{$word} if $fatal ;
675 $mask &= ~($DeadBits{$word}|$All) if $no_fatal ;
678 { Croaker("Unknown warnings category '$word'")}
681 ${^WARNING_BITS} = $mask ;
689 my $mask = ${^WARNING_BITS} ;
691 if (vec($mask, $Offsets{'all'}, 1)) {
692 $mask |= $Bits{'all'} ;
693 $mask |= $DeadBits{'all'} if vec($mask, $Offsets{'all'}+1, 1);
696 push @_, 'all' unless @_;
698 foreach my $word ( @_ ) {
699 if ($word eq 'FATAL') {
702 elsif ($catmask = $Bits{$word}) {
703 $mask &= ~($catmask | $DeadBits{$word} | $All);
706 { Croaker("Unknown warnings category '$word'")}
709 ${^WARNING_BITS} = $mask ;
719 # check the category supplied.
722 Croaker ("not an object")
723 if $category !~ /^([^=]+)=/ ;
727 $offset = $Offsets{$category};
728 Croaker("Unknown warnings category '$category'")
729 unless defined $offset;
732 $category = (caller(1))[0] ;
733 $offset = $Offsets{$category};
734 Croaker("package '$category' not registered for warnings")
735 unless defined $offset ;
738 my $this_pkg = (caller(1))[0] ;
743 while (do { { package DB; $pkg = (caller($i++))[0] } } ) {
744 last unless @DB::args && $DB::args[0] =~ /^$category=/ ;
749 for ($i = 2 ; $pkg = (caller($i))[0] ; ++ $i) {
750 last if $pkg ne $this_pkg ;
753 if !$pkg || $pkg eq $this_pkg ;
756 my $callers_bitmask = (caller($i))[9] ;
757 return ($callers_bitmask, $offset, $i) ;
762 Croaker("Usage: warnings::enabled([category])")
763 unless @_ == 1 || @_ == 0 ;
765 my ($callers_bitmask, $offset, $i) = __chk(@_) ;
767 return 0 unless defined $callers_bitmask ;
768 return vec($callers_bitmask, $offset, 1) ||
769 vec($callers_bitmask, $Offsets{'all'}, 1) ;
775 Croaker("Usage: warnings::warn([category,] 'message')")
776 unless @_ == 2 || @_ == 1 ;
779 my ($callers_bitmask, $offset, $i) = __chk(@_) ;
780 Carp::croak($message)
781 if vec($callers_bitmask, $offset+1, 1) ||
782 vec($callers_bitmask, $Offsets{'all'}+1, 1) ;
783 Carp::carp($message) ;
788 Croaker("Usage: warnings::warnif([category,] 'message')")
789 unless @_ == 2 || @_ == 1 ;
792 my ($callers_bitmask, $offset, $i) = __chk(@_) ;
795 unless defined $callers_bitmask &&
796 (vec($callers_bitmask, $offset, 1) ||
797 vec($callers_bitmask, $Offsets{'all'}, 1)) ;
799 Carp::croak($message)
800 if vec($callers_bitmask, $offset+1, 1) ||
801 vec($callers_bitmask, $Offsets{'all'}+1, 1) ;
803 Carp::carp($message) ;