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 'untie' => [ 5.008, DEFAULT_OFF],
53 'substr' => [ 5.008, DEFAULT_OFF],
54 'taint' => [ 5.008, DEFAULT_OFF],
55 'signal' => [ 5.008, DEFAULT_OFF],
56 'closure' => [ 5.008, DEFAULT_OFF],
57 'overflow' => [ 5.008, DEFAULT_OFF],
58 'portable' => [ 5.008, DEFAULT_OFF],
59 'utf8' => [ 5.008, DEFAULT_OFF],
60 'exiting' => [ 5.008, DEFAULT_OFF],
61 'pack' => [ 5.008, DEFAULT_OFF],
62 'unpack' => [ 5.008, DEFAULT_OFF],
63 'threads' => [ 5.008, DEFAULT_OFF],
64 'assertions' => [ 5.009, 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";
256 open(PM, ">lib/warnings.pm") || die "Can't create lib/warnings.pm: $!\n";
260 /* -*- buffer-read-only: t -*-
261 !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
262 This file is built by warnings.pl
263 Any changes made here will be lost!
267 #define Off(x) ((x) / 8)
268 #define Bit(x) (1 << ((x) % 8))
269 #define IsSet(a, x) ((a)[Off(x)] & Bit(x))
272 #define G_WARN_OFF 0 /* $^W == 0 */
273 #define G_WARN_ON 1 /* -w flag and $^W != 0 */
274 #define G_WARN_ALL_ON 2 /* -W flag */
275 #define G_WARN_ALL_OFF 4 /* -X flag */
276 #define G_WARN_ONCE 8 /* set if 'once' ever enabled */
277 #define G_WARN_ALL_MASK (G_WARN_ALL_ON|G_WARN_ALL_OFF)
279 #define pWARN_STD Nullsv
280 #define pWARN_ALL (Nullsv+1) /* use warnings 'all' */
281 #define pWARN_NONE (Nullsv+2) /* no warnings 'all' */
283 #define specialWARN(x) ((x) == pWARN_STD || (x) == pWARN_ALL || \
290 #@{ $list{"all"} } = walk ($tree) ;
292 my $index = orderValues();
294 die <<EOM if $index > 255 ;
295 Too many warnings categories -- max is 255
296 rewrite packWARN* & unpackWARN* macros
302 my $warn_size = int($index / 8) + ($index % 8 != 0) ;
306 foreach $k (sort { $a <=> $b } keys %ValueToName) {
307 my ($name, $version) = @{ $ValueToName{$k} };
308 print WARN "\n/* Warnings Categories added in Perl $version */\n\n"
309 if $last_ver != $version ;
310 print WARN tab(5, "#define WARN_$name"), "$k\n" ;
311 $last_ver = $version ;
315 print WARN tab(5, '#define WARNsize'), "$warn_size\n" ;
316 #print WARN tab(5, '#define WARN_ALLstring'), '"', ('\377' x $warn_size) , "\"\n" ;
317 print WARN tab(5, '#define WARN_ALLstring'), '"', ('\125' x $warn_size) , "\"\n" ;
318 print WARN tab(5, '#define WARN_NONEstring'), '"', ('\0' x $warn_size) , "\"\n" ;
319 my $WARN_TAINTstring = mkOct($warn_size, map $_ * 2, @{ $list{'taint'} });
321 print WARN tab(5, '#define WARN_TAINTstring'), qq["$WARN_TAINTstring"\n] ;
325 #define isLEXWARN_on (PL_curcop->cop_warnings != pWARN_STD)
326 #define isLEXWARN_off (PL_curcop->cop_warnings == pWARN_STD)
327 #define isWARN_ONCE (PL_dowarn & (G_WARN_ON|G_WARN_ONCE))
328 #define isWARN_on(c,x) (IsSet(SvPVX_const(c), 2*(x)))
329 #define isWARNf_on(c,x) (IsSet(SvPVX_const(c), 2*(x)+1))
331 #define ckWARN(w) Perl_ckwarn(aTHX_ packWARN(w))
332 #define ckWARN2(w1,w2) Perl_ckwarn(aTHX_ packWARN2(w1,w2))
333 #define ckWARN3(w1,w2,w3) Perl_ckwarn(aTHX_ packWARN3(w1,w2,w3))
334 #define ckWARN4(w1,w2,w3,w4) Perl_ckwarn(aTHX_ packWARN4(w1,w2,w3,w4))
336 #define ckWARN_d(w) Perl_ckwarn_d(aTHX_ packWARN(w))
337 #define ckWARN2_d(w1,w2) Perl_ckwarn_d(aTHX_ packWARN2(w1,w2))
338 #define ckWARN3_d(w1,w2,w3) Perl_ckwarn_d(aTHX_ packWARN3(w1,w2,w3))
339 #define ckWARN4_d(w1,w2,w3,w4) Perl_ckwarn_d(aTHX_ packWARN4(w1,w2,w3,w4))
341 #define packWARN(a) (a )
342 #define packWARN2(a,b) ((a) | ((b)<<8) )
343 #define packWARN3(a,b,c) ((a) | ((b)<<8) | ((c)<<16) )
344 #define packWARN4(a,b,c,d) ((a) | ((b)<<8) | ((c)<<16) | ((d) <<24))
346 #define unpackWARN1(x) ((x) & 0xFF)
347 #define unpackWARN2(x) (((x) >>8) & 0xFF)
348 #define unpackWARN3(x) (((x) >>16) & 0xFF)
349 #define unpackWARN4(x) (((x) >>24) & 0xFF)
352 ( ! specialWARN(PL_curcop->cop_warnings) && \
353 ( isWARNf_on(PL_curcop->cop_warnings, WARN_ALL) || \
354 isWARNf_on(PL_curcop->cop_warnings, unpackWARN1(x)) || \
355 isWARNf_on(PL_curcop->cop_warnings, unpackWARN2(x)) || \
356 isWARNf_on(PL_curcop->cop_warnings, unpackWARN3(x)) || \
357 isWARNf_on(PL_curcop->cop_warnings, unpackWARN4(x))))
359 /* end of file warnings.h */
366 last if /^KEYWORDS$/ ;
370 #$list{'all'} = [ $offset .. 8 * ($warn_size/2) - 1 ] ;
373 print PM "our %Offsets = (\n" ;
374 foreach my $k (sort { $a <=> $b } keys %ValueToName) {
375 my ($name, $version) = @{ $ValueToName{$k} };
378 if ( $last_ver != $version ) {
380 print PM tab(4, " # Warnings Categories added in Perl $version");
383 print PM tab(4, " '$name'"), "=> $k,\n" ;
384 $last_ver = $version;
389 print PM "our %Bits = (\n" ;
390 foreach $k (sort keys %list) {
393 my @list = sort { $a <=> $b } @$v ;
395 print PM tab(4, " '$k'"), '=> "',
396 # mkHex($warn_size, @list),
397 mkHex($warn_size, map $_ * 2 , @list),
398 '", # [', mkRange(@list), "]\n" ;
403 print PM "our %DeadBits = (\n" ;
404 foreach $k (sort keys %list) {
407 my @list = sort { $a <=> $b } @$v ;
409 print PM tab(4, " '$k'"), '=> "',
410 # mkHex($warn_size, @list),
411 mkHex($warn_size, map $_ * 2 + 1 , @list),
412 '", # [', mkRange(@list), "]\n" ;
416 print PM '$NONE = "', ('\0' x $warn_size) , "\";\n" ;
417 print PM '$LAST_BIT = ' . "$index ;\n" ;
418 print PM '$BYTES = ' . "$warn_size ;\n" ;
423 print PM "# ex: set ro:\n";
427 # -*- buffer-read-only: t -*-
428 # !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
429 # This file was created by warnings.pl
430 # Any changes made here will be lost.
435 our $VERSION = '1.04';
439 warnings - Perl pragma to control optional warnings
449 use warnings::register;
450 if (warnings::enabled()) {
451 warnings::warn("some warning");
454 if (warnings::enabled("void")) {
455 warnings::warn("void", "some warning");
458 if (warnings::enabled($object)) {
459 warnings::warn($object, "some warning");
462 warnings::warnif("some warning");
463 warnings::warnif("void", "some warning");
464 warnings::warnif($object, "some warning");
468 The C<warnings> pragma is a replacement for the command line flag C<-w>,
469 but the pragma is limited to the enclosing block, while the flag is global.
470 See L<perllexwarn> for more information.
472 If no import list is supplied, all possible warnings are either enabled
475 A number of functions are provided to assist module authors.
479 =item use warnings::register
481 Creates a new warnings category with the same name as the package where
482 the call to the pragma is used.
484 =item warnings::enabled()
486 Use the warnings category with the same name as the current package.
488 Return TRUE if that warnings category is enabled in the calling module.
489 Otherwise returns FALSE.
491 =item warnings::enabled($category)
493 Return TRUE if the warnings category, C<$category>, is enabled in the
495 Otherwise returns FALSE.
497 =item warnings::enabled($object)
499 Use the name of the class for the object reference, C<$object>, as the
502 Return TRUE if that warnings category is enabled in the first scope
503 where the object is used.
504 Otherwise returns FALSE.
506 =item warnings::warn($message)
508 Print C<$message> to STDERR.
510 Use the warnings category with the same name as the current package.
512 If that warnings category has been set to "FATAL" in the calling module
513 then die. Otherwise return.
515 =item warnings::warn($category, $message)
517 Print C<$message> to STDERR.
519 If the warnings category, C<$category>, has been set to "FATAL" in the
520 calling module then die. Otherwise return.
522 =item warnings::warn($object, $message)
524 Print C<$message> to STDERR.
526 Use the name of the class for the object reference, C<$object>, as the
529 If that warnings category has been set to "FATAL" in the scope where C<$object>
530 is first used then die. Otherwise return.
533 =item warnings::warnif($message)
537 if (warnings::enabled())
538 { warnings::warn($message) }
540 =item warnings::warnif($category, $message)
544 if (warnings::enabled($category))
545 { warnings::warn($category, $message) }
547 =item warnings::warnif($object, $message)
551 if (warnings::enabled($object))
552 { warnings::warn($object, $message) }
556 See L<perlmodlib/Pragmatic Modules> and L<perllexwarn>.
562 $All = "" ; vec($All, $Offsets{'all'}, 2) = 3 ;
566 require Carp::Heavy; # this initializes %CarpInternal
567 local $Carp::CarpInternal{'warnings'};
568 delete $Carp::CarpInternal{'warnings'};
574 # called from B::Deparse.pm
576 push @_, 'all' unless @_;
583 foreach my $word ( @_ ) {
584 if ($word eq 'FATAL') {
588 elsif ($word eq 'NONFATAL') {
592 elsif ($catmask = $Bits{$word}) {
594 $mask |= $DeadBits{$word} if $fatal ;
595 $mask &= ~($DeadBits{$word}|$All) if $no_fatal ;
598 { Croaker("Unknown warnings category '$word'")}
612 my $mask = ${^WARNING_BITS} ;
614 if (vec($mask, $Offsets{'all'}, 1)) {
615 $mask |= $Bits{'all'} ;
616 $mask |= $DeadBits{'all'} if vec($mask, $Offsets{'all'}+1, 1);
619 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'")}
639 ${^WARNING_BITS} = $mask ;
647 my $mask = ${^WARNING_BITS} ;
649 if (vec($mask, $Offsets{'all'}, 1)) {
650 $mask |= $Bits{'all'} ;
651 $mask |= $DeadBits{'all'} if vec($mask, $Offsets{'all'}+1, 1);
654 push @_, 'all' unless @_;
656 foreach my $word ( @_ ) {
657 if ($word eq 'FATAL') {
660 elsif ($catmask = $Bits{$word}) {
661 $mask &= ~($catmask | $DeadBits{$word} | $All);
664 { Croaker("Unknown warnings category '$word'")}
667 ${^WARNING_BITS} = $mask ;
670 my %builtin_type; @builtin_type{qw(SCALAR ARRAY HASH CODE REF GLOB LVALUE Regexp)} = ();
679 # check the category supplied.
681 if (my $type = ref $category) {
682 Croaker("not an object")
683 if exists $builtin_type{$type};
687 $offset = $Offsets{$category};
688 Croaker("Unknown warnings category '$category'")
689 unless defined $offset;
692 $category = (caller(1))[0] ;
693 $offset = $Offsets{$category};
694 Croaker("package '$category' not registered for warnings")
695 unless defined $offset ;
698 my $this_pkg = (caller(1))[0] ;
703 while (do { { package DB; $pkg = (caller($i++))[0] } } ) {
704 last unless @DB::args && $DB::args[0] =~ /^$category=/ ;
709 $i = _error_loc(); # see where Carp will allocate the error
712 my $callers_bitmask = (caller($i))[9] ;
713 return ($callers_bitmask, $offset, $i) ;
718 goto &Carp::short_error_loc; # don't introduce another stack frame
723 Croaker("Usage: warnings::enabled([category])")
724 unless @_ == 1 || @_ == 0 ;
726 my ($callers_bitmask, $offset, $i) = __chk(@_) ;
728 return 0 unless defined $callers_bitmask ;
729 return vec($callers_bitmask, $offset, 1) ||
730 vec($callers_bitmask, $Offsets{'all'}, 1) ;
736 Croaker("Usage: warnings::warn([category,] 'message')")
737 unless @_ == 2 || @_ == 1 ;
740 my ($callers_bitmask, $offset, $i) = __chk(@_) ;
742 Carp::croak($message)
743 if vec($callers_bitmask, $offset+1, 1) ||
744 vec($callers_bitmask, $Offsets{'all'}+1, 1) ;
745 Carp::carp($message) ;
750 Croaker("Usage: warnings::warnif([category,] 'message')")
751 unless @_ == 2 || @_ == 1 ;
754 my ($callers_bitmask, $offset, $i) = __chk(@_) ;
757 unless defined $callers_bitmask &&
758 (vec($callers_bitmask, $offset, 1) ||
759 vec($callers_bitmask, $Offsets{'all'}, 1)) ;
762 Carp::croak($message)
763 if vec($callers_bitmask, $offset+1, 1) ||
764 vec($callers_bitmask, $Offsets{'all'}+1, 1) ;
766 Carp::carp($message) ;