10 sub DEFAULT_ON () { 1 }
11 sub DEFAULT_OFF () { 2 }
17 'pipe' => [ 5.008, DEFAULT_OFF],
18 'unopened' => [ 5.008, DEFAULT_OFF],
19 'closed' => [ 5.008, DEFAULT_OFF],
20 'newline' => [ 5.008, DEFAULT_OFF],
21 'exec' => [ 5.008, DEFAULT_OFF],
22 'layer' => [ 5.008, DEFAULT_OFF],
24 'syntax' => [ 5.008, {
25 'ambiguous' => [ 5.008, DEFAULT_OFF],
26 'semicolon' => [ 5.008, DEFAULT_OFF],
27 'precedence' => [ 5.008, DEFAULT_OFF],
28 'bareword' => [ 5.008, DEFAULT_OFF],
29 'reserved' => [ 5.008, DEFAULT_OFF],
30 'digit' => [ 5.008, DEFAULT_OFF],
31 'parenthesis' => [ 5.008, DEFAULT_OFF],
32 'printf' => [ 5.008, DEFAULT_OFF],
33 'prototype' => [ 5.008, DEFAULT_OFF],
34 'qw' => [ 5.008, DEFAULT_OFF],
36 'severe' => [ 5.008, {
37 'inplace' => [ 5.008, DEFAULT_ON],
38 'internal' => [ 5.008, DEFAULT_ON],
39 'debugging' => [ 5.008, DEFAULT_ON],
40 'malloc' => [ 5.008, DEFAULT_ON],
42 'deprecated' => [ 5.008, DEFAULT_OFF],
43 'void' => [ 5.008, DEFAULT_OFF],
44 'recursion' => [ 5.008, DEFAULT_OFF],
45 'redefine' => [ 5.008, DEFAULT_OFF],
46 'numeric' => [ 5.008, DEFAULT_OFF],
47 'uninitialized' => [ 5.008, DEFAULT_OFF],
48 'once' => [ 5.008, DEFAULT_OFF],
49 'misc' => [ 5.008, DEFAULT_OFF],
50 'regexp' => [ 5.008, DEFAULT_OFF],
51 'glob' => [ 5.008, DEFAULT_OFF],
52 'y2k' => [ 5.008, DEFAULT_OFF],
53 'untie' => [ 5.008, DEFAULT_OFF],
54 'substr' => [ 5.008, DEFAULT_OFF],
55 'taint' => [ 5.008, DEFAULT_OFF],
56 'signal' => [ 5.008, DEFAULT_OFF],
57 'closure' => [ 5.008, DEFAULT_OFF],
58 'overflow' => [ 5.008, DEFAULT_OFF],
59 'portable' => [ 5.008, DEFAULT_OFF],
60 'utf8' => [ 5.008, DEFAULT_OFF],
61 'exiting' => [ 5.008, DEFAULT_OFF],
62 'pack' => [ 5.008, DEFAULT_OFF],
63 'unpack' => [ 5.008, DEFAULT_OFF],
64 'threads' => [ 5.008, DEFAULT_OFF],
65 'assertions' => [ 5.009, DEFAULT_OFF],
67 #'default' => [ 5.008, DEFAULT_ON ],
71 ###########################################################################
74 $t .= "\t" x ($l - (length($t) + 1) / 8);
78 ###########################################################################
94 foreach $k (sort keys %$tre) {
96 die "duplicate key $k\n" if defined $list{$k} ;
97 die "Value associated with key '$k' is not an ARRAY reference"
98 if !ref $v || ref $v ne 'ARRAY' ;
100 my ($ver, $rest) = @{ $v } ;
101 push @{ $v_list{$ver} }, $k;
104 { valueWalk ($rest) }
113 foreach my $ver ( sort { $a <=> $b } keys %v_list ) {
114 foreach my $name (@{ $v_list{$ver} } ) {
115 $ValueToName{ $index } = [ uc $name, $ver ] ;
116 $NameToValue{ uc $name } = $index ++ ;
123 ###########################################################################
131 foreach $k (sort keys %$tre) {
133 die "duplicate key $k\n" if defined $list{$k} ;
134 #$Value{$index} = uc $k ;
135 die "Can't find key '$k'"
136 if ! defined $NameToValue{uc $k} ;
137 push @{ $list{$k} }, $NameToValue{uc $k} ;
138 die "Value associated with key '$k' is not an ARRAY reference"
139 if !ref $v || ref $v ne 'ARRAY' ;
141 my ($ver, $rest) = @{ $v } ;
143 { push (@{ $list{$k} }, walk ($rest)) }
145 push @list, @{ $list{$k} } ;
151 ###########################################################################
160 for ($i = 1 ; $i < @a; ++ $i) {
162 if $a[$i] == $a[$i - 1] + 1 && $a[$i] + 1 == $a[$i + 1] ;
165 my $out = join(",",@out);
167 $out =~ s/,(\.\.,)+/../g ;
171 ###########################################################################
178 my $max = (sort {$a <=> $b} map { length $_ } keys %$tre)[-1] ;
179 my @keys = sort keys %$tre ;
181 while ($k = shift @keys) {
183 die "Value associated with key '$k' is not an ARRAY reference"
184 if !ref $v || ref $v ne 'ARRAY' ;
188 print $prefix . "|\n" ;
189 print $prefix . "+- $k" ;
190 $offset = ' ' x ($max + 4) ;
193 print $prefix . "$k" ;
194 $offset = ' ' x ($max + 1) ;
197 my ($ver, $rest) = @{ $v } ;
200 my $bar = @keys ? "|" : " ";
201 print " -" . "-" x ($max - length $k ) . "+\n" ;
202 printTree ($rest, $prefix . $bar . $offset )
210 ###########################################################################
214 my ($f, $max, @a) = @_ ;
215 my $mask = "\x00" x $max ;
219 vec($mask, $_, 1) = 1 ;
222 foreach (unpack("C*", $mask)) {
224 $string .= '\x' . sprintf("%2.2x", $_)
227 $string .= '\\' . sprintf("%o", $_)
236 return mkHexOct("x", $max, @a);
242 return mkHexOct("o", $max, @a);
245 ###########################################################################
247 if (@ARGV && $ARGV[0] eq "tree")
249 printTree($tree, " ") ;
254 unlink "lib/warnings.pm";
255 open(WARN, ">warnings.h") || die "Can't create warnings.h: $!\n";
256 open(PM, ">lib/warnings.pm") || die "Can't create lib/warnings.pm: $!\n";
259 /* !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
260 This file is built by warnings.pl
261 Any changes made here will be lost!
265 #define Off(x) ((x) / 8)
266 #define Bit(x) (1 << ((x) % 8))
267 #define IsSet(a, x) ((a)[Off(x)] & Bit(x))
270 #define G_WARN_OFF 0 /* $^W == 0 */
271 #define G_WARN_ON 1 /* -w flag and $^W != 0 */
272 #define G_WARN_ALL_ON 2 /* -W flag */
273 #define G_WARN_ALL_OFF 4 /* -X flag */
274 #define G_WARN_ONCE 8 /* set if 'once' ever enabled */
275 #define G_WARN_ALL_MASK (G_WARN_ALL_ON|G_WARN_ALL_OFF)
277 #define pWARN_STD Nullsv
278 #define pWARN_ALL (Nullsv+1) /* use warnings 'all' */
279 #define pWARN_NONE (Nullsv+2) /* no warnings 'all' */
281 #define specialWARN(x) ((x) == pWARN_STD || (x) == pWARN_ALL || \
288 #@{ $list{"all"} } = walk ($tree) ;
290 my $index = orderValues();
292 die <<EOM if $index > 255 ;
293 Too many warnings categories -- max is 255
294 rewrite packWARN* & unpackWARN* macros
300 my $warn_size = int($index / 8) + ($index % 8 != 0) ;
304 foreach $k (sort { $a <=> $b } keys %ValueToName) {
305 my ($name, $version) = @{ $ValueToName{$k} };
306 print WARN "\n/* Warnings Categories added in Perl $version */\n\n"
307 if $last_ver != $version ;
308 print WARN tab(5, "#define WARN_$name"), "$k\n" ;
309 $last_ver = $version ;
313 print WARN tab(5, '#define WARNsize'), "$warn_size\n" ;
314 #print WARN tab(5, '#define WARN_ALLstring'), '"', ('\377' x $warn_size) , "\"\n" ;
315 print WARN tab(5, '#define WARN_ALLstring'), '"', ('\125' x $warn_size) , "\"\n" ;
316 print WARN tab(5, '#define WARN_NONEstring'), '"', ('\0' x $warn_size) , "\"\n" ;
317 my $WARN_TAINTstring = mkOct($warn_size, map $_ * 2, @{ $list{'taint'} });
319 print WARN tab(5, '#define WARN_TAINTstring'), qq["$WARN_TAINTstring"\n] ;
323 #define isLEXWARN_on (PL_curcop->cop_warnings != pWARN_STD)
324 #define isLEXWARN_off (PL_curcop->cop_warnings == pWARN_STD)
325 #define isWARN_ONCE (PL_dowarn & (G_WARN_ON|G_WARN_ONCE))
326 #define isWARN_on(c,x) (IsSet(SvPVX(c), 2*(x)))
327 #define isWARNf_on(c,x) (IsSet(SvPVX(c), 2*(x)+1))
330 ( (isLEXWARN_on && PL_curcop->cop_warnings != pWARN_NONE && \
331 (PL_curcop->cop_warnings == pWARN_ALL || \
332 isWARN_on(PL_curcop->cop_warnings, x) ) ) \
333 || (isLEXWARN_off && PL_dowarn & G_WARN_ON) )
335 #define ckWARN2(x,y) \
336 ( (isLEXWARN_on && PL_curcop->cop_warnings != pWARN_NONE && \
337 (PL_curcop->cop_warnings == pWARN_ALL || \
338 isWARN_on(PL_curcop->cop_warnings, x) || \
339 isWARN_on(PL_curcop->cop_warnings, y) ) ) \
340 || (isLEXWARN_off && PL_dowarn & G_WARN_ON) )
342 #define ckWARN3(x,y,z) \
343 ( (isLEXWARN_on && PL_curcop->cop_warnings != pWARN_NONE && \
344 (PL_curcop->cop_warnings == pWARN_ALL || \
345 isWARN_on(PL_curcop->cop_warnings, x) || \
346 isWARN_on(PL_curcop->cop_warnings, y) || \
347 isWARN_on(PL_curcop->cop_warnings, z) ) ) \
348 || (isLEXWARN_off && PL_dowarn & G_WARN_ON) )
350 #define ckWARN4(x,y,z,t) \
351 ( (isLEXWARN_on && PL_curcop->cop_warnings != pWARN_NONE && \
352 (PL_curcop->cop_warnings == pWARN_ALL || \
353 isWARN_on(PL_curcop->cop_warnings, x) || \
354 isWARN_on(PL_curcop->cop_warnings, y) || \
355 isWARN_on(PL_curcop->cop_warnings, z) || \
356 isWARN_on(PL_curcop->cop_warnings, t) ) ) \
357 || (isLEXWARN_off && PL_dowarn & G_WARN_ON) )
359 #define ckWARN_d(x) \
360 (isLEXWARN_off || PL_curcop->cop_warnings == pWARN_ALL || \
361 (PL_curcop->cop_warnings != pWARN_NONE && \
362 isWARN_on(PL_curcop->cop_warnings, x) ) )
364 #define ckWARN2_d(x,y) \
365 (isLEXWARN_off || PL_curcop->cop_warnings == pWARN_ALL || \
366 (PL_curcop->cop_warnings != pWARN_NONE && \
367 (isWARN_on(PL_curcop->cop_warnings, x) || \
368 isWARN_on(PL_curcop->cop_warnings, y) ) ) )
370 #define ckWARN3_d(x,y,z) \
371 (isLEXWARN_off || PL_curcop->cop_warnings == pWARN_ALL || \
372 (PL_curcop->cop_warnings != pWARN_NONE && \
373 (isWARN_on(PL_curcop->cop_warnings, x) || \
374 isWARN_on(PL_curcop->cop_warnings, y) || \
375 isWARN_on(PL_curcop->cop_warnings, z) ) ) )
377 #define ckWARN4_d(x,y,z,t) \
378 (isLEXWARN_off || PL_curcop->cop_warnings == pWARN_ALL || \
379 (PL_curcop->cop_warnings != pWARN_NONE && \
380 (isWARN_on(PL_curcop->cop_warnings, x) || \
381 isWARN_on(PL_curcop->cop_warnings, y) || \
382 isWARN_on(PL_curcop->cop_warnings, z) || \
383 isWARN_on(PL_curcop->cop_warnings, t) ) ) )
385 #define packWARN(a) (a )
386 #define packWARN2(a,b) ((a) | (b)<<8 )
387 #define packWARN3(a,b,c) ((a) | (b)<<8 | (c) <<16 )
388 #define packWARN4(a,b,c,d) ((a) | (b)<<8 | (c) <<16 | (d) <<24)
390 #define unpackWARN1(x) ((x) & 0xFF)
391 #define unpackWARN2(x) (((x) >>8) & 0xFF)
392 #define unpackWARN3(x) (((x) >>16) & 0xFF)
393 #define unpackWARN4(x) (((x) >>24) & 0xFF)
396 ( ! specialWARN(PL_curcop->cop_warnings) && \
397 ( isWARNf_on(PL_curcop->cop_warnings, WARN_ALL) || \
398 isWARNf_on(PL_curcop->cop_warnings, unpackWARN1(x)) || \
399 isWARNf_on(PL_curcop->cop_warnings, unpackWARN2(x)) || \
400 isWARNf_on(PL_curcop->cop_warnings, unpackWARN3(x)) || \
401 isWARNf_on(PL_curcop->cop_warnings, unpackWARN4(x))))
403 /* end of file warnings.h */
410 last if /^KEYWORDS$/ ;
414 #$list{'all'} = [ $offset .. 8 * ($warn_size/2) - 1 ] ;
417 print PM "%Offsets = (\n" ;
418 foreach my $k (sort { $a <=> $b } keys %ValueToName) {
419 my ($name, $version) = @{ $ValueToName{$k} };
422 if ( $last_ver != $version ) {
424 print PM tab(4, " # Warnings Categories added in Perl $version");
427 print PM tab(4, " '$name'"), "=> $k,\n" ;
428 $last_ver = $version;
433 print PM "%Bits = (\n" ;
434 foreach $k (sort keys %list) {
437 my @list = sort { $a <=> $b } @$v ;
439 print PM tab(4, " '$k'"), '=> "',
440 # mkHex($warn_size, @list),
441 mkHex($warn_size, map $_ * 2 , @list),
442 '", # [', mkRange(@list), "]\n" ;
447 print PM "%DeadBits = (\n" ;
448 foreach $k (sort keys %list) {
451 my @list = sort { $a <=> $b } @$v ;
453 print PM tab(4, " '$k'"), '=> "',
454 # mkHex($warn_size, @list),
455 mkHex($warn_size, map $_ * 2 + 1 , @list),
456 '", # [', mkRange(@list), "]\n" ;
460 print PM '$NONE = "', ('\0' x $warn_size) , "\";\n" ;
461 print PM '$LAST_BIT = ' . "$index ;\n" ;
462 print PM '$BYTES = ' . "$warn_size ;\n" ;
471 # !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
472 # This file was created by warnings.pl
473 # Any changes made here will be lost.
478 our $VERSION = '1.02';
482 warnings - Perl pragma to control optional warnings
492 use warnings::register;
493 if (warnings::enabled()) {
494 warnings::warn("some warning");
497 if (warnings::enabled("void")) {
498 warnings::warn("void", "some warning");
501 if (warnings::enabled($object)) {
502 warnings::warn($object, "some warning");
505 warnings::warnif("some warning");
506 warnings::warnif("void", "some warning");
507 warnings::warnif($object, "some warning");
511 If no import list is supplied, all possible warnings are either enabled
514 A number of functions are provided to assist module authors.
518 =item use warnings::register
520 Creates a new warnings category with the same name as the package where
521 the call to the pragma is used.
523 =item warnings::enabled()
525 Use the warnings category with the same name as the current package.
527 Return TRUE if that warnings category is enabled in the calling module.
528 Otherwise returns FALSE.
530 =item warnings::enabled($category)
532 Return TRUE if the warnings category, C<$category>, is enabled in the
534 Otherwise returns FALSE.
536 =item warnings::enabled($object)
538 Use the name of the class for the object reference, C<$object>, as the
541 Return TRUE if that warnings category is enabled in the first scope
542 where the object is used.
543 Otherwise returns FALSE.
545 =item warnings::warn($message)
547 Print C<$message> to STDERR.
549 Use the warnings category with the same name as the current package.
551 If that warnings category has been set to "FATAL" in the calling module
552 then die. Otherwise return.
554 =item warnings::warn($category, $message)
556 Print C<$message> to STDERR.
558 If the warnings category, C<$category>, has been set to "FATAL" in the
559 calling module then die. Otherwise return.
561 =item warnings::warn($object, $message)
563 Print C<$message> to STDERR.
565 Use the name of the class for the object reference, C<$object>, as the
568 If that warnings category has been set to "FATAL" in the scope where C<$object>
569 is first used then die. Otherwise return.
572 =item warnings::warnif($message)
576 if (warnings::enabled())
577 { warnings::warn($message) }
579 =item warnings::warnif($category, $message)
583 if (warnings::enabled($category))
584 { warnings::warn($category, $message) }
586 =item warnings::warnif($object, $message)
590 if (warnings::enabled($object))
591 { warnings::warn($object, $message) }
595 See L<perlmodlib/Pragmatic Modules> and L<perllexwarn>.
603 $All = "" ; vec($All, $Offsets{'all'}, 2) = 3 ;
607 delete $Carp::CarpInternal{'warnings'};
613 # called from B::Deparse.pm
615 push @_, 'all' unless @_;
622 foreach my $word ( @_ ) {
623 if ($word eq 'FATAL') {
627 elsif ($word eq 'NONFATAL') {
631 elsif ($catmask = $Bits{$word}) {
633 $mask |= $DeadBits{$word} if $fatal ;
634 $mask &= ~($DeadBits{$word}|$All) if $no_fatal ;
637 { Croaker("Unknown warnings category '$word'")}
651 my $mask = ${^WARNING_BITS} ;
653 if (vec($mask, $Offsets{'all'}, 1)) {
654 $mask |= $Bits{'all'} ;
655 $mask |= $DeadBits{'all'} if vec($mask, $Offsets{'all'}+1, 1);
658 push @_, 'all' unless @_;
660 foreach my $word ( @_ ) {
661 if ($word eq 'FATAL') {
665 elsif ($word eq 'NONFATAL') {
669 elsif ($catmask = $Bits{$word}) {
671 $mask |= $DeadBits{$word} if $fatal ;
672 $mask &= ~($DeadBits{$word}|$All) if $no_fatal ;
675 { Croaker("Unknown warnings category '$word'")}
678 ${^WARNING_BITS} = $mask ;
686 my $mask = ${^WARNING_BITS} ;
688 if (vec($mask, $Offsets{'all'}, 1)) {
689 $mask |= $Bits{'all'} ;
690 $mask |= $DeadBits{'all'} if vec($mask, $Offsets{'all'}+1, 1);
693 push @_, 'all' unless @_;
695 foreach my $word ( @_ ) {
696 if ($word eq 'FATAL') {
699 elsif ($catmask = $Bits{$word}) {
700 $mask &= ~($catmask | $DeadBits{$word} | $All);
703 { Croaker("Unknown warnings category '$word'")}
706 ${^WARNING_BITS} = $mask ;
716 # check the category supplied.
719 Croaker ("not an object")
720 if $category !~ /^([^=]+)=/ ;
724 $offset = $Offsets{$category};
725 Croaker("Unknown warnings category '$category'")
726 unless defined $offset;
729 $category = (caller(1))[0] ;
730 $offset = $Offsets{$category};
731 Croaker("package '$category' not registered for warnings")
732 unless defined $offset ;
735 my $this_pkg = (caller(1))[0] ;
740 while (do { { package DB; $pkg = (caller($i++))[0] } } ) {
741 last unless @DB::args && $DB::args[0] =~ /^$category=/ ;
746 for ($i = 2 ; $pkg = (caller($i))[0] ; ++ $i) {
747 last if $pkg ne $this_pkg ;
750 if !$pkg || $pkg eq $this_pkg ;
753 my $callers_bitmask = (caller($i))[9] ;
754 return ($callers_bitmask, $offset, $i) ;
759 Croaker("Usage: warnings::enabled([category])")
760 unless @_ == 1 || @_ == 0 ;
762 my ($callers_bitmask, $offset, $i) = __chk(@_) ;
764 return 0 unless defined $callers_bitmask ;
765 return vec($callers_bitmask, $offset, 1) ||
766 vec($callers_bitmask, $Offsets{'all'}, 1) ;
772 Croaker("Usage: warnings::warn([category,] 'message')")
773 unless @_ == 2 || @_ == 1 ;
776 my ($callers_bitmask, $offset, $i) = __chk(@_) ;
778 if vec($callers_bitmask, $offset+1, 1) ||
779 vec($callers_bitmask, $Offsets{'all'}+1, 1) ;
785 Croaker("Usage: warnings::warnif([category,] 'message')")
786 unless @_ == 2 || @_ == 1 ;
789 my ($callers_bitmask, $offset, $i) = __chk(@_) ;
792 unless defined $callers_bitmask &&
793 (vec($callers_bitmask, $offset, 1) ||
794 vec($callers_bitmask, $Offsets{'all'}, 1)) ;
797 if vec($callers_bitmask, $offset+1, 1) ||
798 vec($callers_bitmask, $Offsets{'all'}+1, 1) ;