6 require 'regen_lib.pl';
11 sub DEFAULT_ON () { 1 }
12 sub DEFAULT_OFF () { 2 }
18 'pipe' => [ 5.008, DEFAULT_OFF],
19 'unopened' => [ 5.008, DEFAULT_OFF],
20 'closed' => [ 5.008, DEFAULT_OFF],
21 'newline' => [ 5.008, DEFAULT_OFF],
22 'exec' => [ 5.008, DEFAULT_OFF],
23 'layer' => [ 5.008, DEFAULT_OFF],
25 'syntax' => [ 5.008, {
26 'ambiguous' => [ 5.008, DEFAULT_OFF],
27 'semicolon' => [ 5.008, DEFAULT_OFF],
28 'precedence' => [ 5.008, DEFAULT_OFF],
29 'bareword' => [ 5.008, DEFAULT_OFF],
30 'reserved' => [ 5.008, DEFAULT_OFF],
31 'digit' => [ 5.008, DEFAULT_OFF],
32 'parenthesis' => [ 5.008, DEFAULT_OFF],
33 'printf' => [ 5.008, DEFAULT_OFF],
34 'prototype' => [ 5.008, DEFAULT_OFF],
35 'qw' => [ 5.008, DEFAULT_OFF],
37 'severe' => [ 5.008, {
38 'inplace' => [ 5.008, DEFAULT_ON],
39 'internal' => [ 5.008, DEFAULT_ON],
40 'debugging' => [ 5.008, DEFAULT_ON],
41 'malloc' => [ 5.008, DEFAULT_ON],
43 'deprecated' => [ 5.008, DEFAULT_OFF],
44 'void' => [ 5.008, DEFAULT_OFF],
45 'recursion' => [ 5.008, DEFAULT_OFF],
46 'redefine' => [ 5.008, DEFAULT_OFF],
47 'numeric' => [ 5.008, DEFAULT_OFF],
48 'uninitialized' => [ 5.008, DEFAULT_OFF],
49 'once' => [ 5.008, DEFAULT_OFF],
50 'misc' => [ 5.008, DEFAULT_OFF],
51 'regexp' => [ 5.008, DEFAULT_OFF],
52 'glob' => [ 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 'imprecision' => [ 5.011, 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, " ") ;
253 my $warn = safer_open("warnings.h-new");
254 my $pm = safer_open("lib/warnings.pm-new");
256 print $warn <<'EOM' ;
257 /* -*- buffer-read-only: t -*-
258 !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
259 This file is built by warnings.pl
260 Any changes made here will be lost!
264 #define Off(x) ((x) / 8)
265 #define Bit(x) (1 << ((x) % 8))
266 #define IsSet(a, x) ((a)[Off(x)] & Bit(x))
269 #define G_WARN_OFF 0 /* $^W == 0 */
270 #define G_WARN_ON 1 /* -w flag and $^W != 0 */
271 #define G_WARN_ALL_ON 2 /* -W flag */
272 #define G_WARN_ALL_OFF 4 /* -X flag */
273 #define G_WARN_ONCE 8 /* set if 'once' ever enabled */
274 #define G_WARN_ALL_MASK (G_WARN_ALL_ON|G_WARN_ALL_OFF)
276 #define pWARN_STD NULL
277 #define pWARN_ALL (((STRLEN*)0)+1) /* use warnings 'all' */
278 #define pWARN_NONE (((STRLEN*)0)+2) /* no warnings 'all' */
280 #define specialWARN(x) ((x) == pWARN_STD || (x) == pWARN_ALL || \
283 /* if PL_warnhook is set to this value, then warnings die */
284 #define PERL_WARNHOOK_FATAL (&PL_sv_placeholder)
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" ;
322 #define isLEXWARN_on (PL_curcop->cop_warnings != pWARN_STD)
323 #define isLEXWARN_off (PL_curcop->cop_warnings == pWARN_STD)
324 #define isWARN_ONCE (PL_dowarn & (G_WARN_ON|G_WARN_ONCE))
325 #define isWARN_on(c,x) (IsSet((U8 *)(c + 1), 2*(x)))
326 #define isWARNf_on(c,x) (IsSet((U8 *)(c + 1), 2*(x)+1))
328 #define DUP_WARNINGS(p) \
329 (specialWARN(p) ? (STRLEN*)(p) \
330 : (STRLEN*)CopyD(p, PerlMemShared_malloc(sizeof(*p)+*p), sizeof(*p)+*p, \
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 */
366 rename_if_different("warnings.h-new", "warnings.h");
369 last if /^KEYWORDS$/ ;
373 #$list{'all'} = [ $offset .. 8 * ($warn_size/2) - 1 ] ;
376 print $pm "our %Offsets = (\n" ;
377 foreach my $k (sort { $a <=> $b } keys %ValueToName) {
378 my ($name, $version) = @{ $ValueToName{$k} };
381 if ( $last_ver != $version ) {
383 print $pm tab(4, " # Warnings Categories added in Perl $version");
386 print $pm tab(4, " '$name'"), "=> $k,\n" ;
387 $last_ver = $version;
390 print $pm " );\n\n" ;
392 print $pm "our %Bits = (\n" ;
393 foreach $k (sort keys %list) {
396 my @list = sort { $a <=> $b } @$v ;
398 print $pm tab(4, " '$k'"), '=> "',
399 # mkHex($warn_size, @list),
400 mkHex($warn_size, map $_ * 2 , @list),
401 '", # [', mkRange(@list), "]\n" ;
404 print $pm " );\n\n" ;
406 print $pm "our %DeadBits = (\n" ;
407 foreach $k (sort keys %list) {
410 my @list = sort { $a <=> $b } @$v ;
412 print $pm tab(4, " '$k'"), '=> "',
413 # mkHex($warn_size, @list),
414 mkHex($warn_size, map $_ * 2 + 1 , @list),
415 '", # [', mkRange(@list), "]\n" ;
418 print $pm " );\n\n" ;
419 print $pm '$NONE = "', ('\0' x $warn_size) , "\";\n" ;
420 print $pm '$LAST_BIT = ' . "$index ;\n" ;
421 print $pm '$BYTES = ' . "$warn_size ;\n" ;
426 print $pm "# ex: set ro:\n";
428 rename_if_different("lib/warnings.pm-new", "lib/warnings.pm");
431 # -*- buffer-read-only: t -*-
432 # !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
433 # This file was created by warnings.pl
434 # Any changes made here will be lost.
439 our $VERSION = '1.06';
441 # Verify that we're called correctly so that warnings will work.
442 # see also strict.pm.
443 unless ( __FILE__ =~ /(^|[\/\\])\Q${\__PACKAGE__}\E\.pmc?$/ ) {
444 my (undef, $f, $l) = caller;
445 die("Incorrect use of pragma '${\__PACKAGE__}' at $f line $l.\n");
450 warnings - Perl pragma to control optional warnings
460 use warnings::register;
461 if (warnings::enabled()) {
462 warnings::warn("some warning");
465 if (warnings::enabled("void")) {
466 warnings::warn("void", "some warning");
469 if (warnings::enabled($object)) {
470 warnings::warn($object, "some warning");
473 warnings::warnif("some warning");
474 warnings::warnif("void", "some warning");
475 warnings::warnif($object, "some warning");
479 The C<warnings> pragma is a replacement for the command line flag C<-w>,
480 but the pragma is limited to the enclosing block, while the flag is global.
481 See L<perllexwarn> for more information.
483 If no import list is supplied, all possible warnings are either enabled
486 A number of functions are provided to assist module authors.
490 =item use warnings::register
492 Creates a new warnings category with the same name as the package where
493 the call to the pragma is used.
495 =item warnings::enabled()
497 Use the warnings category with the same name as the current package.
499 Return TRUE if that warnings category is enabled in the calling module.
500 Otherwise returns FALSE.
502 =item warnings::enabled($category)
504 Return TRUE if the warnings category, C<$category>, is enabled in the
506 Otherwise returns FALSE.
508 =item warnings::enabled($object)
510 Use the name of the class for the object reference, C<$object>, as the
513 Return TRUE if that warnings category is enabled in the first scope
514 where the object is used.
515 Otherwise returns FALSE.
517 =item warnings::warn($message)
519 Print C<$message> to STDERR.
521 Use the warnings category with the same name as the current package.
523 If that warnings category has been set to "FATAL" in the calling module
524 then die. Otherwise return.
526 =item warnings::warn($category, $message)
528 Print C<$message> to STDERR.
530 If the warnings category, C<$category>, has been set to "FATAL" in the
531 calling module then die. Otherwise return.
533 =item warnings::warn($object, $message)
535 Print C<$message> to STDERR.
537 Use the name of the class for the object reference, C<$object>, as the
540 If that warnings category has been set to "FATAL" in the scope where C<$object>
541 is first used then die. Otherwise return.
544 =item warnings::warnif($message)
548 if (warnings::enabled())
549 { warnings::warn($message) }
551 =item warnings::warnif($category, $message)
555 if (warnings::enabled($category))
556 { warnings::warn($category, $message) }
558 =item warnings::warnif($object, $message)
562 if (warnings::enabled($object))
563 { warnings::warn($object, $message) }
567 See L<perlmodlib/Pragmatic Modules> and L<perllexwarn>.
573 $All = "" ; vec($All, $Offsets{'all'}, 2) = 3 ;
577 require Carp::Heavy; # this initializes %CarpInternal
578 local $Carp::CarpInternal{'warnings'};
579 delete $Carp::CarpInternal{'warnings'};
585 # called from B::Deparse.pm
587 push @_, 'all' unless @_;
594 foreach my $word ( @_ ) {
595 if ($word eq 'FATAL') {
599 elsif ($word eq 'NONFATAL') {
603 elsif ($catmask = $Bits{$word}) {
605 $mask |= $DeadBits{$word} if $fatal ;
606 $mask &= ~($DeadBits{$word}|$All) if $no_fatal ;
609 { Croaker("Unknown warnings category '$word'")}
623 my $mask = ${^WARNING_BITS} ;
625 if (vec($mask, $Offsets{'all'}, 1)) {
626 $mask |= $Bits{'all'} ;
627 $mask |= $DeadBits{'all'} if vec($mask, $Offsets{'all'}+1, 1);
630 push @_, 'all' unless @_;
632 foreach my $word ( @_ ) {
633 if ($word eq 'FATAL') {
637 elsif ($word eq 'NONFATAL') {
641 elsif ($catmask = $Bits{$word}) {
643 $mask |= $DeadBits{$word} if $fatal ;
644 $mask &= ~($DeadBits{$word}|$All) if $no_fatal ;
647 { Croaker("Unknown warnings category '$word'")}
650 ${^WARNING_BITS} = $mask ;
658 my $mask = ${^WARNING_BITS} ;
660 if (vec($mask, $Offsets{'all'}, 1)) {
661 $mask |= $Bits{'all'} ;
662 $mask |= $DeadBits{'all'} if vec($mask, $Offsets{'all'}+1, 1);
665 push @_, 'all' unless @_;
667 foreach my $word ( @_ ) {
668 if ($word eq 'FATAL') {
671 elsif ($catmask = $Bits{$word}) {
672 $mask &= ~($catmask | $DeadBits{$word} | $All);
675 { Croaker("Unknown warnings category '$word'")}
678 ${^WARNING_BITS} = $mask ;
681 my %builtin_type; @builtin_type{qw(SCALAR ARRAY HASH CODE REF GLOB LVALUE Regexp)} = ();
690 # check the category supplied.
692 if (my $type = ref $category) {
693 Croaker("not an object")
694 if exists $builtin_type{$type};
698 $offset = $Offsets{$category};
699 Croaker("Unknown warnings category '$category'")
700 unless defined $offset;
703 $category = (caller(1))[0] ;
704 $offset = $Offsets{$category};
705 Croaker("package '$category' not registered for warnings")
706 unless defined $offset ;
709 my $this_pkg = (caller(1))[0] ;
714 while (do { { package DB; $pkg = (caller($i++))[0] } } ) {
715 last unless @DB::args && $DB::args[0] =~ /^$category=/ ;
720 $i = _error_loc(); # see where Carp will allocate the error
723 my $callers_bitmask = (caller($i))[9] ;
724 return ($callers_bitmask, $offset, $i) ;
729 goto &Carp::short_error_loc; # don't introduce another stack frame
734 Croaker("Usage: warnings::enabled([category])")
735 unless @_ == 1 || @_ == 0 ;
737 my ($callers_bitmask, $offset, $i) = __chk(@_) ;
739 return 0 unless defined $callers_bitmask ;
740 return vec($callers_bitmask, $offset, 1) ||
741 vec($callers_bitmask, $Offsets{'all'}, 1) ;
747 Croaker("Usage: warnings::warn([category,] 'message')")
748 unless @_ == 2 || @_ == 1 ;
751 my ($callers_bitmask, $offset, $i) = __chk(@_) ;
753 Carp::croak($message)
754 if vec($callers_bitmask, $offset+1, 1) ||
755 vec($callers_bitmask, $Offsets{'all'}+1, 1) ;
756 Carp::carp($message) ;
761 Croaker("Usage: warnings::warnif([category,] 'message')")
762 unless @_ == 2 || @_ == 1 ;
765 my ($callers_bitmask, $offset, $i) = __chk(@_) ;
768 unless defined $callers_bitmask &&
769 (vec($callers_bitmask, $offset, 1) ||
770 vec($callers_bitmask, $Offsets{'all'}, 1)) ;
773 Carp::croak($message)
774 if vec($callers_bitmask, $offset+1, 1) ||
775 vec($callers_bitmask, $Offsets{'all'}+1, 1) ;
777 Carp::carp($message) ;