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 "%Offsets = (\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 "%Bits = (\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 "%DeadBits = (\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.00';
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 If no import list is supplied, all possible warnings are either enabled
513 A number of functions are provided to assist module authors.
517 =item use warnings::register
519 Creates a new warnings category with the same name as the package where
520 the call to the pragma is used.
522 =item warnings::enabled()
524 Use the warnings category with the same name as the current package.
526 Return TRUE if that warnings category is enabled in the calling module.
527 Otherwise returns FALSE.
529 =item warnings::enabled($category)
531 Return TRUE if the warnings category, C<$category>, is enabled in the
533 Otherwise returns FALSE.
535 =item warnings::enabled($object)
537 Use the name of the class for the object reference, C<$object>, as the
540 Return TRUE if that warnings category is enabled in the first scope
541 where the object is used.
542 Otherwise returns FALSE.
544 =item warnings::warn($message)
546 Print C<$message> to STDERR.
548 Use the warnings category with the same name as the current package.
550 If that warnings category has been set to "FATAL" in the calling module
551 then die. Otherwise return.
553 =item warnings::warn($category, $message)
555 Print C<$message> to STDERR.
557 If the warnings category, C<$category>, has been set to "FATAL" in the
558 calling module then die. Otherwise return.
560 =item warnings::warn($object, $message)
562 Print C<$message> to STDERR.
564 Use the name of the class for the object reference, C<$object>, as the
567 If that warnings category has been set to "FATAL" in the scope where C<$object>
568 is first used then die. Otherwise return.
571 =item warnings::warnif($message)
575 if (warnings::enabled())
576 { warnings::warn($message) }
578 =item warnings::warnif($category, $message)
582 if (warnings::enabled($category))
583 { warnings::warn($category, $message) }
585 =item warnings::warnif($object, $message)
589 if (warnings::enabled($object))
590 { warnings::warn($object, $message) }
594 See L<perlmodlib/Pragmatic Modules> and L<perllexwarn>.
602 $All = "" ; vec($All, $Offsets{'all'}, 2) = 3 ;
606 delete $Carp::CarpInternal{'warnings'};
612 # called from B::Deparse.pm
614 push @_, 'all' unless @_;
621 foreach my $word ( @_ ) {
622 if ($word eq 'FATAL') {
626 elsif ($word eq 'NONFATAL') {
630 elsif ($catmask = $Bits{$word}) {
632 $mask |= $DeadBits{$word} if $fatal ;
633 $mask &= ~($DeadBits{$word}|$All) if $no_fatal ;
636 { Croaker("Unknown warnings category '$word'")}
650 my $mask = ${^WARNING_BITS} ;
652 if (vec($mask, $Offsets{'all'}, 1)) {
653 $mask |= $Bits{'all'} ;
654 $mask |= $DeadBits{'all'} if vec($mask, $Offsets{'all'}+1, 1);
657 push @_, 'all' unless @_;
659 foreach my $word ( @_ ) {
660 if ($word eq 'FATAL') {
664 elsif ($word eq 'NONFATAL') {
668 elsif ($catmask = $Bits{$word}) {
670 $mask |= $DeadBits{$word} if $fatal ;
671 $mask &= ~($DeadBits{$word}|$All) if $no_fatal ;
674 { Croaker("Unknown warnings category '$word'")}
677 ${^WARNING_BITS} = $mask ;
685 my $mask = ${^WARNING_BITS} ;
687 if (vec($mask, $Offsets{'all'}, 1)) {
688 $mask |= $Bits{'all'} ;
689 $mask |= $DeadBits{'all'} if vec($mask, $Offsets{'all'}+1, 1);
692 push @_, 'all' unless @_;
694 foreach my $word ( @_ ) {
695 if ($word eq 'FATAL') {
698 elsif ($catmask = $Bits{$word}) {
699 $mask &= ~($catmask | $DeadBits{$word} | $All);
702 { Croaker("Unknown warnings category '$word'")}
705 ${^WARNING_BITS} = $mask ;
715 # check the category supplied.
718 Croaker ("not an object")
719 if $category !~ /^([^=]+)=/ ;
723 $offset = $Offsets{$category};
724 Croaker("Unknown warnings category '$category'")
725 unless defined $offset;
728 $category = (caller(1))[0] ;
729 $offset = $Offsets{$category};
730 Croaker("package '$category' not registered for warnings")
731 unless defined $offset ;
734 my $this_pkg = (caller(1))[0] ;
739 while (do { { package DB; $pkg = (caller($i++))[0] } } ) {
740 last unless @DB::args && $DB::args[0] =~ /^$category=/ ;
745 for ($i = 2 ; $pkg = (caller($i))[0] ; ++ $i) {
746 last if $pkg ne $this_pkg ;
749 if !$pkg || $pkg eq $this_pkg ;
752 my $callers_bitmask = (caller($i))[9] ;
753 return ($callers_bitmask, $offset, $i) ;
758 Croaker("Usage: warnings::enabled([category])")
759 unless @_ == 1 || @_ == 0 ;
761 my ($callers_bitmask, $offset, $i) = __chk(@_) ;
763 return 0 unless defined $callers_bitmask ;
764 return vec($callers_bitmask, $offset, 1) ||
765 vec($callers_bitmask, $Offsets{'all'}, 1) ;
771 Croaker("Usage: warnings::warn([category,] 'message')")
772 unless @_ == 2 || @_ == 1 ;
775 my ($callers_bitmask, $offset, $i) = __chk(@_) ;
777 if vec($callers_bitmask, $offset+1, 1) ||
778 vec($callers_bitmask, $Offsets{'all'}+1, 1) ;
784 Croaker("Usage: warnings::warnif([category,] 'message')")
785 unless @_ == 2 || @_ == 1 ;
788 my ($callers_bitmask, $offset, $i) = __chk(@_) ;
791 unless defined $callers_bitmask &&
792 (vec($callers_bitmask, $offset, 1) ||
793 vec($callers_bitmask, $Offsets{'all'}, 1)) ;
796 if vec($callers_bitmask, $offset+1, 1) ||
797 vec($callers_bitmask, $Offsets{'all'}+1, 1) ;