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 "our %Offsets : unique = (\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 "our %Bits : unique = (\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 "our %DeadBits : unique = (\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.03';
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 The C<warnings> pragma is a replacement for the command line flag C<-w>,
512 but the pragma is limited to the enclosing block, while the flag is global.
513 See L<perllexwarn> for more information.
515 If no import list is supplied, all possible warnings are either enabled
518 A number of functions are provided to assist module authors.
522 =item use warnings::register
524 Creates a new warnings category with the same name as the package where
525 the call to the pragma is used.
527 =item warnings::enabled()
529 Use the warnings category with the same name as the current package.
531 Return TRUE if that warnings category is enabled in the calling module.
532 Otherwise returns FALSE.
534 =item warnings::enabled($category)
536 Return TRUE if the warnings category, C<$category>, is enabled in the
538 Otherwise returns FALSE.
540 =item warnings::enabled($object)
542 Use the name of the class for the object reference, C<$object>, as the
545 Return TRUE if that warnings category is enabled in the first scope
546 where the object is used.
547 Otherwise returns FALSE.
549 =item warnings::warn($message)
551 Print C<$message> to STDERR.
553 Use the warnings category with the same name as the current package.
555 If that warnings category has been set to "FATAL" in the calling module
556 then die. Otherwise return.
558 =item warnings::warn($category, $message)
560 Print C<$message> to STDERR.
562 If the warnings category, C<$category>, has been set to "FATAL" in the
563 calling module then die. Otherwise return.
565 =item warnings::warn($object, $message)
567 Print C<$message> to STDERR.
569 Use the name of the class for the object reference, C<$object>, as the
572 If that warnings category has been set to "FATAL" in the scope where C<$object>
573 is first used then die. Otherwise return.
576 =item warnings::warnif($message)
580 if (warnings::enabled())
581 { warnings::warn($message) }
583 =item warnings::warnif($category, $message)
587 if (warnings::enabled($category))
588 { warnings::warn($category, $message) }
590 =item warnings::warnif($object, $message)
594 if (warnings::enabled($object))
595 { warnings::warn($object, $message) }
599 See L<perlmodlib/Pragmatic Modules> and L<perllexwarn>.
607 $All = "" ; vec($All, $Offsets{'all'}, 2) = 3 ;
611 delete $Carp::CarpInternal{'warnings'};
617 # called from B::Deparse.pm
619 push @_, 'all' unless @_;
626 foreach my $word ( @_ ) {
627 if ($word eq 'FATAL') {
631 elsif ($word eq 'NONFATAL') {
635 elsif ($catmask = $Bits{$word}) {
637 $mask |= $DeadBits{$word} if $fatal ;
638 $mask &= ~($DeadBits{$word}|$All) if $no_fatal ;
641 { Croaker("Unknown warnings category '$word'")}
655 my $mask = ${^WARNING_BITS} ;
657 if (vec($mask, $Offsets{'all'}, 1)) {
658 $mask |= $Bits{'all'} ;
659 $mask |= $DeadBits{'all'} if vec($mask, $Offsets{'all'}+1, 1);
662 push @_, 'all' unless @_;
664 foreach my $word ( @_ ) {
665 if ($word eq 'FATAL') {
669 elsif ($word eq 'NONFATAL') {
673 elsif ($catmask = $Bits{$word}) {
675 $mask |= $DeadBits{$word} if $fatal ;
676 $mask &= ~($DeadBits{$word}|$All) if $no_fatal ;
679 { Croaker("Unknown warnings category '$word'")}
682 ${^WARNING_BITS} = $mask ;
690 my $mask = ${^WARNING_BITS} ;
692 if (vec($mask, $Offsets{'all'}, 1)) {
693 $mask |= $Bits{'all'} ;
694 $mask |= $DeadBits{'all'} if vec($mask, $Offsets{'all'}+1, 1);
697 push @_, 'all' unless @_;
699 foreach my $word ( @_ ) {
700 if ($word eq 'FATAL') {
703 elsif ($catmask = $Bits{$word}) {
704 $mask &= ~($catmask | $DeadBits{$word} | $All);
707 { Croaker("Unknown warnings category '$word'")}
710 ${^WARNING_BITS} = $mask ;
720 # check the category supplied.
723 Croaker ("not an object")
724 if $category !~ /^([^=]+)=/ ;
728 $offset = $Offsets{$category};
729 Croaker("Unknown warnings category '$category'")
730 unless defined $offset;
733 $category = (caller(1))[0] ;
734 $offset = $Offsets{$category};
735 Croaker("package '$category' not registered for warnings")
736 unless defined $offset ;
739 my $this_pkg = (caller(1))[0] ;
744 while (do { { package DB; $pkg = (caller($i++))[0] } } ) {
745 last unless @DB::args && $DB::args[0] =~ /^$category=/ ;
750 $i = _error_loc(); # see where Carp will allocate the error
753 my $callers_bitmask = (caller($i))[9] ;
754 return ($callers_bitmask, $offset, $i) ;
759 goto &Carp::short_error_loc; # don't introduce another stack frame
764 Croaker("Usage: warnings::enabled([category])")
765 unless @_ == 1 || @_ == 0 ;
767 my ($callers_bitmask, $offset, $i) = __chk(@_) ;
769 return 0 unless defined $callers_bitmask ;
770 return vec($callers_bitmask, $offset, 1) ||
771 vec($callers_bitmask, $Offsets{'all'}, 1) ;
777 Croaker("Usage: warnings::warn([category,] 'message')")
778 unless @_ == 2 || @_ == 1 ;
781 my ($callers_bitmask, $offset, $i) = __chk(@_) ;
782 Carp::croak($message)
783 if vec($callers_bitmask, $offset+1, 1) ||
784 vec($callers_bitmask, $Offsets{'all'}+1, 1) ;
785 Carp::carp($message) ;
790 Croaker("Usage: warnings::warnif([category,] 'message')")
791 unless @_ == 2 || @_ == 1 ;
794 my ($callers_bitmask, $offset, $i) = __chk(@_) ;
797 unless defined $callers_bitmask &&
798 (vec($callers_bitmask, $offset, 1) ||
799 vec($callers_bitmask, $Offsets{'all'}, 1)) ;
801 Carp::croak($message)
802 if vec($callers_bitmask, $offset+1, 1) ||
803 vec($callers_bitmask, $Offsets{'all'}+1, 1) ;
805 Carp::carp($message) ;