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 #'default' => [ 5.008, DEFAULT_ON ],
69 ###########################################################################
72 $t .= "\t" x ($l - (length($t) + 1) / 8);
76 ###########################################################################
92 foreach $k (sort keys %$tre) {
94 die "duplicate key $k\n" if defined $list{$k} ;
95 die "Value associated with key '$k' is not an ARRAY reference"
96 if !ref $v || ref $v ne 'ARRAY' ;
98 my ($ver, $rest) = @{ $v } ;
99 push @{ $v_list{$ver} }, $k;
102 { valueWalk ($rest) }
111 foreach my $ver ( sort { $a <=> $b } keys %v_list ) {
112 foreach my $name (@{ $v_list{$ver} } ) {
113 $ValueToName{ $index } = [ uc $name, $ver ] ;
114 $NameToValue{ uc $name } = $index ++ ;
121 ###########################################################################
129 foreach $k (sort keys %$tre) {
131 die "duplicate key $k\n" if defined $list{$k} ;
132 #$Value{$index} = uc $k ;
133 die "Can't find key '$k'"
134 if ! defined $NameToValue{uc $k} ;
135 push @{ $list{$k} }, $NameToValue{uc $k} ;
136 die "Value associated with key '$k' is not an ARRAY reference"
137 if !ref $v || ref $v ne 'ARRAY' ;
139 my ($ver, $rest) = @{ $v } ;
141 { push (@{ $list{$k} }, walk ($rest)) }
143 push @list, @{ $list{$k} } ;
149 ###########################################################################
158 for ($i = 1 ; $i < @a; ++ $i) {
160 if $a[$i] == $a[$i - 1] + 1 && $a[$i] + 1 == $a[$i + 1] ;
163 my $out = join(",",@out);
165 $out =~ s/,(\.\.,)+/../g ;
169 ###########################################################################
176 my $max = (sort {$a <=> $b} map { length $_ } keys %$tre)[-1] ;
177 my @keys = sort keys %$tre ;
179 while ($k = shift @keys) {
181 die "Value associated with key '$k' is not an ARRAY reference"
182 if !ref $v || ref $v ne 'ARRAY' ;
186 print $prefix . "|\n" ;
187 print $prefix . "+- $k" ;
188 $offset = ' ' x ($max + 4) ;
191 print $prefix . "$k" ;
192 $offset = ' ' x ($max + 1) ;
195 my ($ver, $rest) = @{ $v } ;
198 my $bar = @keys ? "|" : " ";
199 print " -" . "-" x ($max - length $k ) . "+\n" ;
200 printTree ($rest, $prefix . $bar . $offset )
208 ###########################################################################
212 my ($f, $max, @a) = @_ ;
213 my $mask = "\x00" x $max ;
217 vec($mask, $_, 1) = 1 ;
220 foreach (unpack("C*", $mask)) {
222 $string .= '\x' . sprintf("%2.2x", $_)
225 $string .= '\\' . sprintf("%o", $_)
234 return mkHexOct("x", $max, @a);
240 return mkHexOct("o", $max, @a);
243 ###########################################################################
245 if (@ARGV && $ARGV[0] eq "tree")
247 printTree($tree, " ") ;
252 unlink "lib/warnings.pm";
253 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";
259 /* -*- buffer-read-only: t -*-
260 !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
261 This file is built by warnings.pl
262 Any changes made here will be lost!
266 #define Off(x) ((x) / 8)
267 #define Bit(x) (1 << ((x) % 8))
268 #define IsSet(a, x) ((a)[Off(x)] & Bit(x))
271 #define G_WARN_OFF 0 /* $^W == 0 */
272 #define G_WARN_ON 1 /* -w flag and $^W != 0 */
273 #define G_WARN_ALL_ON 2 /* -W flag */
274 #define G_WARN_ALL_OFF 4 /* -X flag */
275 #define G_WARN_ONCE 8 /* set if 'once' ever enabled */
276 #define G_WARN_ALL_MASK (G_WARN_ALL_ON|G_WARN_ALL_OFF)
278 #define pWARN_STD Nullsv
279 #define pWARN_ALL (Nullsv+1) /* use warnings 'all' */
280 #define pWARN_NONE (Nullsv+2) /* no warnings 'all' */
282 #define specialWARN(x) ((x) == pWARN_STD || (x) == pWARN_ALL || \
289 #@{ $list{"all"} } = walk ($tree) ;
291 my $index = orderValues();
293 die <<EOM if $index > 255 ;
294 Too many warnings categories -- max is 255
295 rewrite packWARN* & unpackWARN* macros
301 my $warn_size = int($index / 8) + ($index % 8 != 0) ;
305 foreach $k (sort { $a <=> $b } keys %ValueToName) {
306 my ($name, $version) = @{ $ValueToName{$k} };
307 print WARN "\n/* Warnings Categories added in Perl $version */\n\n"
308 if $last_ver != $version ;
309 print WARN tab(5, "#define WARN_$name"), "$k\n" ;
310 $last_ver = $version ;
314 print WARN tab(5, '#define WARNsize'), "$warn_size\n" ;
315 #print WARN tab(5, '#define WARN_ALLstring'), '"', ('\377' x $warn_size) , "\"\n" ;
316 print WARN tab(5, '#define WARN_ALLstring'), '"', ('\125' x $warn_size) , "\"\n" ;
317 print WARN tab(5, '#define WARN_NONEstring'), '"', ('\0' x $warn_size) , "\"\n" ;
318 my $WARN_TAINTstring = mkOct($warn_size, map $_ * 2, @{ $list{'taint'} });
320 print WARN tab(5, '#define WARN_TAINTstring'), qq["$WARN_TAINTstring"\n] ;
324 #define isLEXWARN_on (PL_curcop->cop_warnings != pWARN_STD)
325 #define isLEXWARN_off (PL_curcop->cop_warnings == pWARN_STD)
326 #define isWARN_ONCE (PL_dowarn & (G_WARN_ON|G_WARN_ONCE))
327 #define isWARN_on(c,x) (IsSet(SvPVX_const(c), 2*(x)))
328 #define isWARNf_on(c,x) (IsSet(SvPVX_const(c), 2*(x)+1))
331 ( (isLEXWARN_on && PL_curcop->cop_warnings != pWARN_NONE && \
332 (PL_curcop->cop_warnings == pWARN_ALL || \
333 isWARN_on(PL_curcop->cop_warnings, x) ) ) \
334 || (isLEXWARN_off && PL_dowarn & G_WARN_ON) )
336 #define ckWARN2(x,y) \
337 ( (isLEXWARN_on && PL_curcop->cop_warnings != pWARN_NONE && \
338 (PL_curcop->cop_warnings == pWARN_ALL || \
339 isWARN_on(PL_curcop->cop_warnings, x) || \
340 isWARN_on(PL_curcop->cop_warnings, y) ) ) \
341 || (isLEXWARN_off && PL_dowarn & G_WARN_ON) )
343 #define ckWARN3(x,y,z) \
344 ( (isLEXWARN_on && PL_curcop->cop_warnings != pWARN_NONE && \
345 (PL_curcop->cop_warnings == pWARN_ALL || \
346 isWARN_on(PL_curcop->cop_warnings, x) || \
347 isWARN_on(PL_curcop->cop_warnings, y) || \
348 isWARN_on(PL_curcop->cop_warnings, z) ) ) \
349 || (isLEXWARN_off && PL_dowarn & G_WARN_ON) )
351 #define ckWARN4(x,y,z,t) \
352 ( (isLEXWARN_on && PL_curcop->cop_warnings != pWARN_NONE && \
353 (PL_curcop->cop_warnings == pWARN_ALL || \
354 isWARN_on(PL_curcop->cop_warnings, x) || \
355 isWARN_on(PL_curcop->cop_warnings, y) || \
356 isWARN_on(PL_curcop->cop_warnings, z) || \
357 isWARN_on(PL_curcop->cop_warnings, t) ) ) \
358 || (isLEXWARN_off && PL_dowarn & G_WARN_ON) )
360 #define ckWARN_d(x) \
361 (isLEXWARN_off || PL_curcop->cop_warnings == pWARN_ALL || \
362 (PL_curcop->cop_warnings != pWARN_NONE && \
363 isWARN_on(PL_curcop->cop_warnings, x) ) )
365 #define ckWARN2_d(x,y) \
366 (isLEXWARN_off || PL_curcop->cop_warnings == pWARN_ALL || \
367 (PL_curcop->cop_warnings != pWARN_NONE && \
368 (isWARN_on(PL_curcop->cop_warnings, x) || \
369 isWARN_on(PL_curcop->cop_warnings, y) ) ) )
371 #define ckWARN3_d(x,y,z) \
372 (isLEXWARN_off || PL_curcop->cop_warnings == pWARN_ALL || \
373 (PL_curcop->cop_warnings != pWARN_NONE && \
374 (isWARN_on(PL_curcop->cop_warnings, x) || \
375 isWARN_on(PL_curcop->cop_warnings, y) || \
376 isWARN_on(PL_curcop->cop_warnings, z) ) ) )
378 #define ckWARN4_d(x,y,z,t) \
379 (isLEXWARN_off || PL_curcop->cop_warnings == pWARN_ALL || \
380 (PL_curcop->cop_warnings != pWARN_NONE && \
381 (isWARN_on(PL_curcop->cop_warnings, x) || \
382 isWARN_on(PL_curcop->cop_warnings, y) || \
383 isWARN_on(PL_curcop->cop_warnings, z) || \
384 isWARN_on(PL_curcop->cop_warnings, t) ) ) )
386 #define packWARN(a) (a )
387 #define packWARN2(a,b) ((a) | ((b)<<8) )
388 #define packWARN3(a,b,c) ((a) | ((b)<<8) | ((c)<<16) )
389 #define packWARN4(a,b,c,d) ((a) | ((b)<<8) | ((c)<<16) | ((d) <<24))
391 #define unpackWARN1(x) ((x) & 0xFF)
392 #define unpackWARN2(x) (((x) >>8) & 0xFF)
393 #define unpackWARN3(x) (((x) >>16) & 0xFF)
394 #define unpackWARN4(x) (((x) >>24) & 0xFF)
397 ( ! specialWARN(PL_curcop->cop_warnings) && \
398 ( isWARNf_on(PL_curcop->cop_warnings, WARN_ALL) || \
399 isWARNf_on(PL_curcop->cop_warnings, unpackWARN1(x)) || \
400 isWARNf_on(PL_curcop->cop_warnings, unpackWARN2(x)) || \
401 isWARNf_on(PL_curcop->cop_warnings, unpackWARN3(x)) || \
402 isWARNf_on(PL_curcop->cop_warnings, unpackWARN4(x))))
404 /* end of file warnings.h */
411 last if /^KEYWORDS$/ ;
415 #$list{'all'} = [ $offset .. 8 * ($warn_size/2) - 1 ] ;
418 print PM "our %Offsets = (\n" ;
419 foreach my $k (sort { $a <=> $b } keys %ValueToName) {
420 my ($name, $version) = @{ $ValueToName{$k} };
423 if ( $last_ver != $version ) {
425 print PM tab(4, " # Warnings Categories added in Perl $version");
428 print PM tab(4, " '$name'"), "=> $k,\n" ;
429 $last_ver = $version;
434 print PM "our %Bits = (\n" ;
435 foreach $k (sort keys %list) {
438 my @list = sort { $a <=> $b } @$v ;
440 print PM tab(4, " '$k'"), '=> "',
441 # mkHex($warn_size, @list),
442 mkHex($warn_size, map $_ * 2 , @list),
443 '", # [', mkRange(@list), "]\n" ;
448 print PM "our %DeadBits = (\n" ;
449 foreach $k (sort keys %list) {
452 my @list = sort { $a <=> $b } @$v ;
454 print PM tab(4, " '$k'"), '=> "',
455 # mkHex($warn_size, @list),
456 mkHex($warn_size, map $_ * 2 + 1 , @list),
457 '", # [', mkRange(@list), "]\n" ;
461 print PM '$NONE = "', ('\0' x $warn_size) , "\";\n" ;
462 print PM '$LAST_BIT = ' . "$index ;\n" ;
463 print PM '$BYTES = ' . "$warn_size ;\n" ;
468 print PM "# ex: set ro:\n";
472 # -*- buffer-read-only: t -*-
473 # !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
474 # This file was created by warnings.pl
475 # Any changes made here will be lost.
480 our $VERSION = '1.03';
484 warnings - Perl pragma to control optional warnings
494 use warnings::register;
495 if (warnings::enabled()) {
496 warnings::warn("some warning");
499 if (warnings::enabled("void")) {
500 warnings::warn("void", "some warning");
503 if (warnings::enabled($object)) {
504 warnings::warn($object, "some warning");
507 warnings::warnif("some warning");
508 warnings::warnif("void", "some warning");
509 warnings::warnif($object, "some warning");
513 The C<warnings> pragma is a replacement for the command line flag C<-w>,
514 but the pragma is limited to the enclosing block, while the flag is global.
515 See L<perllexwarn> for more information.
517 If no import list is supplied, all possible warnings are either enabled
520 A number of functions are provided to assist module authors.
524 =item use warnings::register
526 Creates a new warnings category with the same name as the package where
527 the call to the pragma is used.
529 =item warnings::enabled()
531 Use the warnings category with the same name as the current package.
533 Return TRUE if that warnings category is enabled in the calling module.
534 Otherwise returns FALSE.
536 =item warnings::enabled($category)
538 Return TRUE if the warnings category, C<$category>, is enabled in the
540 Otherwise returns FALSE.
542 =item warnings::enabled($object)
544 Use the name of the class for the object reference, C<$object>, as the
547 Return TRUE if that warnings category is enabled in the first scope
548 where the object is used.
549 Otherwise returns FALSE.
551 =item warnings::warn($message)
553 Print C<$message> to STDERR.
555 Use the warnings category with the same name as the current package.
557 If that warnings category has been set to "FATAL" in the calling module
558 then die. Otherwise return.
560 =item warnings::warn($category, $message)
562 Print C<$message> to STDERR.
564 If the warnings category, C<$category>, has been set to "FATAL" in the
565 calling module then die. Otherwise return.
567 =item warnings::warn($object, $message)
569 Print C<$message> to STDERR.
571 Use the name of the class for the object reference, C<$object>, as the
574 If that warnings category has been set to "FATAL" in the scope where C<$object>
575 is first used then die. Otherwise return.
578 =item warnings::warnif($message)
582 if (warnings::enabled())
583 { warnings::warn($message) }
585 =item warnings::warnif($category, $message)
589 if (warnings::enabled($category))
590 { warnings::warn($category, $message) }
592 =item warnings::warnif($object, $message)
596 if (warnings::enabled($object))
597 { warnings::warn($object, $message) }
601 See L<perlmodlib/Pragmatic Modules> and L<perllexwarn>.
609 $All = "" ; vec($All, $Offsets{'all'}, 2) = 3 ;
613 delete $Carp::CarpInternal{'warnings'};
619 # called from B::Deparse.pm
621 push @_, 'all' unless @_;
628 foreach my $word ( @_ ) {
629 if ($word eq 'FATAL') {
633 elsif ($word eq 'NONFATAL') {
637 elsif ($catmask = $Bits{$word}) {
639 $mask |= $DeadBits{$word} if $fatal ;
640 $mask &= ~($DeadBits{$word}|$All) if $no_fatal ;
643 { Croaker("Unknown warnings category '$word'")}
657 my $mask = ${^WARNING_BITS} ;
659 if (vec($mask, $Offsets{'all'}, 1)) {
660 $mask |= $Bits{'all'} ;
661 $mask |= $DeadBits{'all'} if vec($mask, $Offsets{'all'}+1, 1);
664 push @_, 'all' unless @_;
666 foreach my $word ( @_ ) {
667 if ($word eq 'FATAL') {
671 elsif ($word eq 'NONFATAL') {
675 elsif ($catmask = $Bits{$word}) {
677 $mask |= $DeadBits{$word} if $fatal ;
678 $mask &= ~($DeadBits{$word}|$All) if $no_fatal ;
681 { Croaker("Unknown warnings category '$word'")}
684 ${^WARNING_BITS} = $mask ;
692 my $mask = ${^WARNING_BITS} ;
694 if (vec($mask, $Offsets{'all'}, 1)) {
695 $mask |= $Bits{'all'} ;
696 $mask |= $DeadBits{'all'} if vec($mask, $Offsets{'all'}+1, 1);
699 push @_, 'all' unless @_;
701 foreach my $word ( @_ ) {
702 if ($word eq 'FATAL') {
705 elsif ($catmask = $Bits{$word}) {
706 $mask &= ~($catmask | $DeadBits{$word} | $All);
709 { Croaker("Unknown warnings category '$word'")}
712 ${^WARNING_BITS} = $mask ;
715 my %builtin_type; @builtin_type{qw(SCALAR ARRAY HASH CODE REF GLOB LVALUE Regexp)} = ();
724 # check the category supplied.
726 if (my $type = ref $category) {
727 Croaker("not an object")
728 if exists $builtin_type{$type};
732 $offset = $Offsets{$category};
733 Croaker("Unknown warnings category '$category'")
734 unless defined $offset;
737 $category = (caller(1))[0] ;
738 $offset = $Offsets{$category};
739 Croaker("package '$category' not registered for warnings")
740 unless defined $offset ;
743 my $this_pkg = (caller(1))[0] ;
748 while (do { { package DB; $pkg = (caller($i++))[0] } } ) {
749 last unless @DB::args && $DB::args[0] =~ /^$category=/ ;
754 for ($i = 2 ; $pkg = (caller($i))[0] ; ++ $i) {
755 last if $pkg ne $this_pkg ;
758 if !$pkg || $pkg eq $this_pkg ;
761 my $callers_bitmask = (caller($i))[9] ;
762 return ($callers_bitmask, $offset, $i) ;
767 Croaker("Usage: warnings::enabled([category])")
768 unless @_ == 1 || @_ == 0 ;
770 my ($callers_bitmask, $offset, $i) = __chk(@_) ;
772 return 0 unless defined $callers_bitmask ;
773 return vec($callers_bitmask, $offset, 1) ||
774 vec($callers_bitmask, $Offsets{'all'}, 1) ;
780 Croaker("Usage: warnings::warn([category,] 'message')")
781 unless @_ == 2 || @_ == 1 ;
784 my ($callers_bitmask, $offset, $i) = __chk(@_) ;
785 Carp::croak($message)
786 if vec($callers_bitmask, $offset+1, 1) ||
787 vec($callers_bitmask, $Offsets{'all'}+1, 1) ;
788 Carp::carp($message) ;
793 Croaker("Usage: warnings::warnif([category,] 'message')")
794 unless @_ == 2 || @_ == 1 ;
797 my ($callers_bitmask, $offset, $i) = __chk(@_) ;
800 unless defined $callers_bitmask &&
801 (vec($callers_bitmask, $offset, 1) ||
802 vec($callers_bitmask, $Offsets{'all'}, 1)) ;
804 Carp::croak($message)
805 if vec($callers_bitmask, $offset+1, 1) ||
806 vec($callers_bitmask, $Offsets{'all'}+1, 1) ;
808 Carp::carp($message) ;