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 NULL
279 #define pWARN_ALL (((SV*)0)+1) /* use warnings 'all' */
280 #define pWARN_NONE (((SV*)0)+2) /* no warnings 'all' */
282 #define specialWARN(x) ((x) == pWARN_STD || (x) == pWARN_ALL || \
285 /* if PL_warnhook is set to this value, then warnings die */
286 #define PERL_WARNHOOK_FATAL (((SV*)0) + 1)
292 #@{ $list{"all"} } = walk ($tree) ;
294 my $index = orderValues();
296 die <<EOM if $index > 255 ;
297 Too many warnings categories -- max is 255
298 rewrite packWARN* & unpackWARN* macros
304 my $warn_size = int($index / 8) + ($index % 8 != 0) ;
308 foreach $k (sort { $a <=> $b } keys %ValueToName) {
309 my ($name, $version) = @{ $ValueToName{$k} };
310 print WARN "\n/* Warnings Categories added in Perl $version */\n\n"
311 if $last_ver != $version ;
312 print WARN tab(5, "#define WARN_$name"), "$k\n" ;
313 $last_ver = $version ;
317 print WARN tab(5, '#define WARNsize'), "$warn_size\n" ;
318 #print WARN tab(5, '#define WARN_ALLstring'), '"', ('\377' x $warn_size) , "\"\n" ;
319 print WARN tab(5, '#define WARN_ALLstring'), '"', ('\125' x $warn_size) , "\"\n" ;
320 print WARN tab(5, '#define WARN_NONEstring'), '"', ('\0' x $warn_size) , "\"\n" ;
321 my $WARN_TAINTstring = mkOct($warn_size, map $_ * 2, @{ $list{'taint'} });
323 print WARN tab(5, '#define WARN_TAINTstring'), qq["$WARN_TAINTstring"\n] ;
327 #define isLEXWARN_on (PL_curcop->cop_warnings != pWARN_STD)
328 #define isLEXWARN_off (PL_curcop->cop_warnings == pWARN_STD)
329 #define isWARN_ONCE (PL_dowarn & (G_WARN_ON|G_WARN_ONCE))
330 #define isWARN_on(c,x) (IsSet(SvPVX_const(c), 2*(x)))
331 #define isWARNf_on(c,x) (IsSet(SvPVX_const(c), 2*(x)+1))
333 #define ckWARN(w) Perl_ckwarn(aTHX_ packWARN(w))
334 #define ckWARN2(w1,w2) Perl_ckwarn(aTHX_ packWARN2(w1,w2))
335 #define ckWARN3(w1,w2,w3) Perl_ckwarn(aTHX_ packWARN3(w1,w2,w3))
336 #define ckWARN4(w1,w2,w3,w4) Perl_ckwarn(aTHX_ packWARN4(w1,w2,w3,w4))
338 #define ckWARN_d(w) Perl_ckwarn_d(aTHX_ packWARN(w))
339 #define ckWARN2_d(w1,w2) Perl_ckwarn_d(aTHX_ packWARN2(w1,w2))
340 #define ckWARN3_d(w1,w2,w3) Perl_ckwarn_d(aTHX_ packWARN3(w1,w2,w3))
341 #define ckWARN4_d(w1,w2,w3,w4) Perl_ckwarn_d(aTHX_ packWARN4(w1,w2,w3,w4))
343 #define packWARN(a) (a )
344 #define packWARN2(a,b) ((a) | ((b)<<8) )
345 #define packWARN3(a,b,c) ((a) | ((b)<<8) | ((c)<<16) )
346 #define packWARN4(a,b,c,d) ((a) | ((b)<<8) | ((c)<<16) | ((d) <<24))
348 #define unpackWARN1(x) ((x) & 0xFF)
349 #define unpackWARN2(x) (((x) >>8) & 0xFF)
350 #define unpackWARN3(x) (((x) >>16) & 0xFF)
351 #define unpackWARN4(x) (((x) >>24) & 0xFF)
354 ( ! specialWARN(PL_curcop->cop_warnings) && \
355 ( isWARNf_on(PL_curcop->cop_warnings, WARN_ALL) || \
356 isWARNf_on(PL_curcop->cop_warnings, unpackWARN1(x)) || \
357 isWARNf_on(PL_curcop->cop_warnings, unpackWARN2(x)) || \
358 isWARNf_on(PL_curcop->cop_warnings, unpackWARN3(x)) || \
359 isWARNf_on(PL_curcop->cop_warnings, unpackWARN4(x))))
361 /* end of file warnings.h */
368 last if /^KEYWORDS$/ ;
372 #$list{'all'} = [ $offset .. 8 * ($warn_size/2) - 1 ] ;
375 print PM "our %Offsets = (\n" ;
376 foreach my $k (sort { $a <=> $b } keys %ValueToName) {
377 my ($name, $version) = @{ $ValueToName{$k} };
380 if ( $last_ver != $version ) {
382 print PM tab(4, " # Warnings Categories added in Perl $version");
385 print PM tab(4, " '$name'"), "=> $k,\n" ;
386 $last_ver = $version;
391 print PM "our %Bits = (\n" ;
392 foreach $k (sort keys %list) {
395 my @list = sort { $a <=> $b } @$v ;
397 print PM tab(4, " '$k'"), '=> "',
398 # mkHex($warn_size, @list),
399 mkHex($warn_size, map $_ * 2 , @list),
400 '", # [', mkRange(@list), "]\n" ;
405 print PM "our %DeadBits = (\n" ;
406 foreach $k (sort keys %list) {
409 my @list = sort { $a <=> $b } @$v ;
411 print PM tab(4, " '$k'"), '=> "',
412 # mkHex($warn_size, @list),
413 mkHex($warn_size, map $_ * 2 + 1 , @list),
414 '", # [', mkRange(@list), "]\n" ;
418 print PM '$NONE = "', ('\0' x $warn_size) , "\";\n" ;
419 print PM '$LAST_BIT = ' . "$index ;\n" ;
420 print PM '$BYTES = ' . "$warn_size ;\n" ;
425 print PM "# ex: set ro:\n";
429 # -*- buffer-read-only: t -*-
430 # !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
431 # This file was created by warnings.pl
432 # Any changes made here will be lost.
437 our $VERSION = '1.05';
441 warnings - Perl pragma to control optional warnings
451 use warnings::register;
452 if (warnings::enabled()) {
453 warnings::warn("some warning");
456 if (warnings::enabled("void")) {
457 warnings::warn("void", "some warning");
460 if (warnings::enabled($object)) {
461 warnings::warn($object, "some warning");
464 warnings::warnif("some warning");
465 warnings::warnif("void", "some warning");
466 warnings::warnif($object, "some warning");
470 The C<warnings> pragma is a replacement for the command line flag C<-w>,
471 but the pragma is limited to the enclosing block, while the flag is global.
472 See L<perllexwarn> for more information.
474 If no import list is supplied, all possible warnings are either enabled
477 A number of functions are provided to assist module authors.
481 =item use warnings::register
483 Creates a new warnings category with the same name as the package where
484 the call to the pragma is used.
486 =item warnings::enabled()
488 Use the warnings category with the same name as the current package.
490 Return TRUE if that warnings category is enabled in the calling module.
491 Otherwise returns FALSE.
493 =item warnings::enabled($category)
495 Return TRUE if the warnings category, C<$category>, is enabled in the
497 Otherwise returns FALSE.
499 =item warnings::enabled($object)
501 Use the name of the class for the object reference, C<$object>, as the
504 Return TRUE if that warnings category is enabled in the first scope
505 where the object is used.
506 Otherwise returns FALSE.
508 =item warnings::warn($message)
510 Print C<$message> to STDERR.
512 Use the warnings category with the same name as the current package.
514 If that warnings category has been set to "FATAL" in the calling module
515 then die. Otherwise return.
517 =item warnings::warn($category, $message)
519 Print C<$message> to STDERR.
521 If the warnings category, C<$category>, has been set to "FATAL" in the
522 calling module then die. Otherwise return.
524 =item warnings::warn($object, $message)
526 Print C<$message> to STDERR.
528 Use the name of the class for the object reference, C<$object>, as the
531 If that warnings category has been set to "FATAL" in the scope where C<$object>
532 is first used then die. Otherwise return.
535 =item warnings::warnif($message)
539 if (warnings::enabled())
540 { warnings::warn($message) }
542 =item warnings::warnif($category, $message)
546 if (warnings::enabled($category))
547 { warnings::warn($category, $message) }
549 =item warnings::warnif($object, $message)
553 if (warnings::enabled($object))
554 { warnings::warn($object, $message) }
558 See L<perlmodlib/Pragmatic Modules> and L<perllexwarn>.
566 $All = "" ; vec($All, $Offsets{'all'}, 2) = 3 ;
570 require Carp::Heavy; # this initializes %CarpInternal
571 delete $Carp::CarpInternal{'warnings'};
577 # called from B::Deparse.pm
579 push @_, 'all' unless @_;
586 foreach my $word ( @_ ) {
587 if ($word eq 'FATAL') {
591 elsif ($word eq 'NONFATAL') {
595 elsif ($catmask = $Bits{$word}) {
597 $mask |= $DeadBits{$word} if $fatal ;
598 $mask &= ~($DeadBits{$word}|$All) if $no_fatal ;
601 { Croaker("Unknown warnings category '$word'")}
615 my $mask = ${^WARNING_BITS} ;
617 if (vec($mask, $Offsets{'all'}, 1)) {
618 $mask |= $Bits{'all'} ;
619 $mask |= $DeadBits{'all'} if vec($mask, $Offsets{'all'}+1, 1);
622 push @_, 'all' unless @_;
624 foreach my $word ( @_ ) {
625 if ($word eq 'FATAL') {
629 elsif ($word eq 'NONFATAL') {
633 elsif ($catmask = $Bits{$word}) {
635 $mask |= $DeadBits{$word} if $fatal ;
636 $mask &= ~($DeadBits{$word}|$All) if $no_fatal ;
639 { Croaker("Unknown warnings category '$word'")}
642 ${^WARNING_BITS} = $mask ;
650 my $mask = ${^WARNING_BITS} ;
652 if (vec($mask, $Offsets{'all'}, 1)) {
653 $mask |= $Bits{'all'} ;
654 $mask |= $DeadBits{'all'} if vec($mask, $Offsets{'all'}+1, 1);
657 push @_, 'all' unless @_;
659 foreach my $word ( @_ ) {
660 if ($word eq 'FATAL') {
663 elsif ($catmask = $Bits{$word}) {
664 $mask &= ~($catmask | $DeadBits{$word} | $All);
667 { Croaker("Unknown warnings category '$word'")}
670 ${^WARNING_BITS} = $mask ;
673 my %builtin_type; @builtin_type{qw(SCALAR ARRAY HASH CODE REF GLOB LVALUE Regexp)} = ();
682 # check the category supplied.
684 if (my $type = ref $category) {
685 Croaker("not an object")
686 if exists $builtin_type{$type};
690 $offset = $Offsets{$category};
691 Croaker("Unknown warnings category '$category'")
692 unless defined $offset;
695 $category = (caller(1))[0] ;
696 $offset = $Offsets{$category};
697 Croaker("package '$category' not registered for warnings")
698 unless defined $offset ;
701 my $this_pkg = (caller(1))[0] ;
706 while (do { { package DB; $pkg = (caller($i++))[0] } } ) {
707 last unless @DB::args && $DB::args[0] =~ /^$category=/ ;
712 for ($i = 2 ; $pkg = (caller($i))[0] ; ++ $i) {
713 last if $pkg ne $this_pkg ;
716 if !$pkg || $pkg eq $this_pkg ;
719 my $callers_bitmask = (caller($i))[9] ;
720 return ($callers_bitmask, $offset, $i) ;
725 Croaker("Usage: warnings::enabled([category])")
726 unless @_ == 1 || @_ == 0 ;
728 my ($callers_bitmask, $offset, $i) = __chk(@_) ;
730 return 0 unless defined $callers_bitmask ;
731 return vec($callers_bitmask, $offset, 1) ||
732 vec($callers_bitmask, $Offsets{'all'}, 1) ;
738 Croaker("Usage: warnings::warn([category,] 'message')")
739 unless @_ == 2 || @_ == 1 ;
742 my ($callers_bitmask, $offset, $i) = __chk(@_) ;
743 Carp::croak($message)
744 if vec($callers_bitmask, $offset+1, 1) ||
745 vec($callers_bitmask, $Offsets{'all'}+1, 1) ;
746 Carp::carp($message) ;
751 Croaker("Usage: warnings::warnif([category,] 'message')")
752 unless @_ == 2 || @_ == 1 ;
755 my ($callers_bitmask, $offset, $i) = __chk(@_) ;
758 unless defined $callers_bitmask &&
759 (vec($callers_bitmask, $offset, 1) ||
760 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) ;