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))
330 #define ckWARN(w) Perl_ckwarn(aTHX_ packWARN(w))
331 #define ckWARN2(w1,w2) Perl_ckwarn(aTHX_ packWARN2(w1,w2))
332 #define ckWARN3(w1,w2,w3) Perl_ckwarn(aTHX_ packWARN3(w1,w2,w3))
333 #define ckWARN4(w1,w2,w3,w4) Perl_ckwarn(aTHX_ packWARN4(w1,w2,w3,w4))
335 #define ckWARN_d(w) Perl_ckwarn_d(aTHX_ packWARN(w))
336 #define ckWARN2_d(w1,w2) Perl_ckwarn_d(aTHX_ packWARN2(w1,w2))
337 #define ckWARN3_d(w1,w2,w3) Perl_ckwarn_d(aTHX_ packWARN3(w1,w2,w3))
338 #define ckWARN4_d(w1,w2,w3,w4) Perl_ckwarn_d(aTHX_ packWARN4(w1,w2,w3,w4))
340 #define packWARN(a) (a )
341 #define packWARN2(a,b) ((a) | ((b)<<8) )
342 #define packWARN3(a,b,c) ((a) | ((b)<<8) | ((c)<<16) )
343 #define packWARN4(a,b,c,d) ((a) | ((b)<<8) | ((c)<<16) | ((d) <<24))
345 #define unpackWARN1(x) ((x) & 0xFF)
346 #define unpackWARN2(x) (((x) >>8) & 0xFF)
347 #define unpackWARN3(x) (((x) >>16) & 0xFF)
348 #define unpackWARN4(x) (((x) >>24) & 0xFF)
351 ( ! specialWARN(PL_curcop->cop_warnings) && \
352 ( isWARNf_on(PL_curcop->cop_warnings, WARN_ALL) || \
353 isWARNf_on(PL_curcop->cop_warnings, unpackWARN1(x)) || \
354 isWARNf_on(PL_curcop->cop_warnings, unpackWARN2(x)) || \
355 isWARNf_on(PL_curcop->cop_warnings, unpackWARN3(x)) || \
356 isWARNf_on(PL_curcop->cop_warnings, unpackWARN4(x))))
358 /* end of file warnings.h */
365 last if /^KEYWORDS$/ ;
369 #$list{'all'} = [ $offset .. 8 * ($warn_size/2) - 1 ] ;
372 print PM "our %Offsets = (\n" ;
373 foreach my $k (sort { $a <=> $b } keys %ValueToName) {
374 my ($name, $version) = @{ $ValueToName{$k} };
377 if ( $last_ver != $version ) {
379 print PM tab(4, " # Warnings Categories added in Perl $version");
382 print PM tab(4, " '$name'"), "=> $k,\n" ;
383 $last_ver = $version;
388 print PM "our %Bits = (\n" ;
389 foreach $k (sort keys %list) {
392 my @list = sort { $a <=> $b } @$v ;
394 print PM tab(4, " '$k'"), '=> "',
395 # mkHex($warn_size, @list),
396 mkHex($warn_size, map $_ * 2 , @list),
397 '", # [', mkRange(@list), "]\n" ;
402 print PM "our %DeadBits = (\n" ;
403 foreach $k (sort keys %list) {
406 my @list = sort { $a <=> $b } @$v ;
408 print PM tab(4, " '$k'"), '=> "',
409 # mkHex($warn_size, @list),
410 mkHex($warn_size, map $_ * 2 + 1 , @list),
411 '", # [', mkRange(@list), "]\n" ;
415 print PM '$NONE = "', ('\0' x $warn_size) , "\";\n" ;
416 print PM '$LAST_BIT = ' . "$index ;\n" ;
417 print PM '$BYTES = ' . "$warn_size ;\n" ;
422 print PM "# ex: set ro:\n";
426 # -*- buffer-read-only: t -*-
427 # !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
428 # This file was created by warnings.pl
429 # Any changes made here will be lost.
434 our $VERSION = '1.03';
438 warnings - Perl pragma to control optional warnings
448 use warnings::register;
449 if (warnings::enabled()) {
450 warnings::warn("some warning");
453 if (warnings::enabled("void")) {
454 warnings::warn("void", "some warning");
457 if (warnings::enabled($object)) {
458 warnings::warn($object, "some warning");
461 warnings::warnif("some warning");
462 warnings::warnif("void", "some warning");
463 warnings::warnif($object, "some warning");
467 The C<warnings> pragma is a replacement for the command line flag C<-w>,
468 but the pragma is limited to the enclosing block, while the flag is global.
469 See L<perllexwarn> for more information.
471 If no import list is supplied, all possible warnings are either enabled
474 A number of functions are provided to assist module authors.
478 =item use warnings::register
480 Creates a new warnings category with the same name as the package where
481 the call to the pragma is used.
483 =item warnings::enabled()
485 Use the warnings category with the same name as the current package.
487 Return TRUE if that warnings category is enabled in the calling module.
488 Otherwise returns FALSE.
490 =item warnings::enabled($category)
492 Return TRUE if the warnings category, C<$category>, is enabled in the
494 Otherwise returns FALSE.
496 =item warnings::enabled($object)
498 Use the name of the class for the object reference, C<$object>, as the
501 Return TRUE if that warnings category is enabled in the first scope
502 where the object is used.
503 Otherwise returns FALSE.
505 =item warnings::warn($message)
507 Print C<$message> to STDERR.
509 Use the warnings category with the same name as the current package.
511 If that warnings category has been set to "FATAL" in the calling module
512 then die. Otherwise return.
514 =item warnings::warn($category, $message)
516 Print C<$message> to STDERR.
518 If the warnings category, C<$category>, has been set to "FATAL" in the
519 calling module then die. Otherwise return.
521 =item warnings::warn($object, $message)
523 Print C<$message> to STDERR.
525 Use the name of the class for the object reference, C<$object>, as the
528 If that warnings category has been set to "FATAL" in the scope where C<$object>
529 is first used then die. Otherwise return.
532 =item warnings::warnif($message)
536 if (warnings::enabled())
537 { warnings::warn($message) }
539 =item warnings::warnif($category, $message)
543 if (warnings::enabled($category))
544 { warnings::warn($category, $message) }
546 =item warnings::warnif($object, $message)
550 if (warnings::enabled($object))
551 { warnings::warn($object, $message) }
555 See L<perlmodlib/Pragmatic Modules> and L<perllexwarn>.
563 $All = "" ; vec($All, $Offsets{'all'}, 2) = 3 ;
567 delete $Carp::CarpInternal{'warnings'};
573 # called from B::Deparse.pm
575 push @_, 'all' unless @_;
582 foreach my $word ( @_ ) {
583 if ($word eq 'FATAL') {
587 elsif ($word eq 'NONFATAL') {
591 elsif ($catmask = $Bits{$word}) {
593 $mask |= $DeadBits{$word} if $fatal ;
594 $mask &= ~($DeadBits{$word}|$All) if $no_fatal ;
597 { Croaker("Unknown warnings category '$word'")}
611 my $mask = ${^WARNING_BITS} ;
613 if (vec($mask, $Offsets{'all'}, 1)) {
614 $mask |= $Bits{'all'} ;
615 $mask |= $DeadBits{'all'} if vec($mask, $Offsets{'all'}+1, 1);
618 push @_, 'all' unless @_;
620 foreach my $word ( @_ ) {
621 if ($word eq 'FATAL') {
625 elsif ($word eq 'NONFATAL') {
629 elsif ($catmask = $Bits{$word}) {
631 $mask |= $DeadBits{$word} if $fatal ;
632 $mask &= ~($DeadBits{$word}|$All) if $no_fatal ;
635 { Croaker("Unknown warnings category '$word'")}
638 ${^WARNING_BITS} = $mask ;
646 my $mask = ${^WARNING_BITS} ;
648 if (vec($mask, $Offsets{'all'}, 1)) {
649 $mask |= $Bits{'all'} ;
650 $mask |= $DeadBits{'all'} if vec($mask, $Offsets{'all'}+1, 1);
653 push @_, 'all' unless @_;
655 foreach my $word ( @_ ) {
656 if ($word eq 'FATAL') {
659 elsif ($catmask = $Bits{$word}) {
660 $mask &= ~($catmask | $DeadBits{$word} | $All);
663 { Croaker("Unknown warnings category '$word'")}
666 ${^WARNING_BITS} = $mask ;
669 my %builtin_type; @builtin_type{qw(SCALAR ARRAY HASH CODE REF GLOB LVALUE Regexp)} = ();
678 # check the category supplied.
680 if (my $type = ref $category) {
681 Croaker("not an object")
682 if exists $builtin_type{$type};
686 $offset = $Offsets{$category};
687 Croaker("Unknown warnings category '$category'")
688 unless defined $offset;
691 $category = (caller(1))[0] ;
692 $offset = $Offsets{$category};
693 Croaker("package '$category' not registered for warnings")
694 unless defined $offset ;
697 my $this_pkg = (caller(1))[0] ;
702 while (do { { package DB; $pkg = (caller($i++))[0] } } ) {
703 last unless @DB::args && $DB::args[0] =~ /^$category=/ ;
708 for ($i = 2 ; $pkg = (caller($i))[0] ; ++ $i) {
709 last if $pkg ne $this_pkg ;
712 if !$pkg || $pkg eq $this_pkg ;
715 my $callers_bitmask = (caller($i))[9] ;
716 return ($callers_bitmask, $offset, $i) ;
721 Croaker("Usage: warnings::enabled([category])")
722 unless @_ == 1 || @_ == 0 ;
724 my ($callers_bitmask, $offset, $i) = __chk(@_) ;
726 return 0 unless defined $callers_bitmask ;
727 return vec($callers_bitmask, $offset, 1) ||
728 vec($callers_bitmask, $Offsets{'all'}, 1) ;
734 Croaker("Usage: warnings::warn([category,] 'message')")
735 unless @_ == 2 || @_ == 1 ;
738 my ($callers_bitmask, $offset, $i) = __chk(@_) ;
739 Carp::croak($message)
740 if vec($callers_bitmask, $offset+1, 1) ||
741 vec($callers_bitmask, $Offsets{'all'}+1, 1) ;
742 Carp::carp($message) ;
747 Croaker("Usage: warnings::warnif([category,] 'message')")
748 unless @_ == 2 || @_ == 1 ;
751 my ($callers_bitmask, $offset, $i) = __chk(@_) ;
754 unless defined $callers_bitmask &&
755 (vec($callers_bitmask, $offset, 1) ||
756 vec($callers_bitmask, $Offsets{'all'}, 1)) ;
758 Carp::croak($message)
759 if vec($callers_bitmask, $offset+1, 1) ||
760 vec($callers_bitmask, $Offsets{'all'}+1, 1) ;
762 Carp::carp($message) ;