1 # -*- buffer-read-only: t -*-
2 # !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
3 # This file was created by warnings.pl
4 # Any changes made here will be lost.
11 # Verify that we're called correctly so that warnings will work.
13 unless ( __FILE__ =~ /(^|[\/\\])\Q${\__PACKAGE__}\E\.pmc?$/ ) {
14 my (undef, $f, $l) = caller;
15 die("Incorrect use of pragma '${\__PACKAGE__}' at $f line $l.\n");
20 warnings - Perl pragma to control optional warnings
30 use warnings::register;
31 if (warnings::enabled()) {
32 warnings::warn("some warning");
35 if (warnings::enabled("void")) {
36 warnings::warn("void", "some warning");
39 if (warnings::enabled($object)) {
40 warnings::warn($object, "some warning");
43 warnings::warnif("some warning");
44 warnings::warnif("void", "some warning");
45 warnings::warnif($object, "some warning");
49 The C<warnings> pragma is a replacement for the command line flag C<-w>,
50 but the pragma is limited to the enclosing block, while the flag is global.
51 See L<perllexwarn> for more information.
53 If no import list is supplied, all possible warnings are either enabled
56 A number of functions are provided to assist module authors.
60 =item use warnings::register
62 Creates a new warnings category with the same name as the package where
63 the call to the pragma is used.
65 =item warnings::enabled()
67 Use the warnings category with the same name as the current package.
69 Return TRUE if that warnings category is enabled in the calling module.
70 Otherwise returns FALSE.
72 =item warnings::enabled($category)
74 Return TRUE if the warnings category, C<$category>, is enabled in the
76 Otherwise returns FALSE.
78 =item warnings::enabled($object)
80 Use the name of the class for the object reference, C<$object>, as the
83 Return TRUE if that warnings category is enabled in the first scope
84 where the object is used.
85 Otherwise returns FALSE.
87 =item warnings::fatal_enabled()
89 Return TRUE if the warnings category with the same name as the current
90 package has been set to FATAL in the calling module.
91 Otherwise returns FALSE.
93 =item warnings::fatal_enabled($category)
95 Return TRUE if the warnings category C<$category> has been set to FATAL in
97 Otherwise returns FALSE.
99 =item warnings::fatal_enabled($object)
101 Use the name of the class for the object reference, C<$object>, as the
104 Return TRUE if that warnings category has been set to FATAL in the first
105 scope where the object is used.
106 Otherwise returns FALSE.
108 =item warnings::warn($message)
110 Print C<$message> to STDERR.
112 Use the warnings category with the same name as the current package.
114 If that warnings category has been set to "FATAL" in the calling module
115 then die. Otherwise return.
117 =item warnings::warn($category, $message)
119 Print C<$message> to STDERR.
121 If the warnings category, C<$category>, has been set to "FATAL" in the
122 calling module then die. Otherwise return.
124 =item warnings::warn($object, $message)
126 Print C<$message> to STDERR.
128 Use the name of the class for the object reference, C<$object>, as the
131 If that warnings category has been set to "FATAL" in the scope where C<$object>
132 is first used then die. Otherwise return.
135 =item warnings::warnif($message)
139 if (warnings::enabled())
140 { warnings::warn($message) }
142 =item warnings::warnif($category, $message)
146 if (warnings::enabled($category))
147 { warnings::warn($category, $message) }
149 =item warnings::warnif($object, $message)
153 if (warnings::enabled($object))
154 { warnings::warn($object, $message) }
158 See L<perlmodlib/Pragmatic Modules> and L<perllexwarn>.
164 # Warnings Categories added in Perl 5.008
207 'uninitialized' => 82,
213 # Warnings Categories added in Perl 5.011
219 'all' => "\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x15", # [0..46]
220 'ambiguous' => "\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00", # [29]
221 'bareword' => "\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00", # [30]
222 'closed' => "\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [6]
223 'closure' => "\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [1]
224 'debugging' => "\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00", # [22]
225 'deprecated' => "\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [2]
226 'digit' => "\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00", # [31]
227 'exec' => "\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [7]
228 'exiting' => "\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [3]
229 'glob' => "\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [4]
230 'imprecision' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10", # [46]
231 'inplace' => "\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00", # [23]
232 'internal' => "\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00", # [24]
233 'io' => "\x00\x54\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [5..11]
234 'layer' => "\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [8]
235 'malloc' => "\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00", # [25]
236 'misc' => "\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00", # [12]
237 'newline' => "\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [9]
238 'numeric' => "\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00", # [13]
239 'once' => "\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00", # [14]
240 'overflow' => "\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00", # [15]
241 'pack' => "\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00", # [16]
242 'parenthesis' => "\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00", # [32]
243 'pipe' => "\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [10]
244 'portable' => "\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00", # [17]
245 'precedence' => "\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00", # [33]
246 'printf' => "\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00", # [34]
247 'prototype' => "\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00", # [35]
248 'qw' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00", # [36]
249 'recursion' => "\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00", # [18]
250 'redefine' => "\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00", # [19]
251 'regexp' => "\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00", # [20]
252 'reserved' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00", # [37]
253 'semicolon' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00", # [38]
254 'severe' => "\x00\x00\x00\x00\x00\x54\x05\x00\x00\x00\x00\x00", # [21..25]
255 'signal' => "\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00", # [26]
256 'substr' => "\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00", # [27]
257 'syntax' => "\x00\x00\x00\x00\x00\x00\x00\x55\x55\x15\x00\x00", # [28..38]
258 'taint' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00", # [39]
259 'threads' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00", # [40]
260 'uninitialized' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00", # [41]
261 'unopened' => "\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [11]
262 'unpack' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00", # [42]
263 'untie' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00", # [43]
264 'utf8' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01", # [44]
265 'void' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04", # [45]
269 'all' => "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\x2a", # [0..46]
270 'ambiguous' => "\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00", # [29]
271 'bareword' => "\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00", # [30]
272 'closed' => "\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [6]
273 'closure' => "\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [1]
274 'debugging' => "\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00", # [22]
275 'deprecated' => "\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [2]
276 'digit' => "\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00", # [31]
277 'exec' => "\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [7]
278 'exiting' => "\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [3]
279 'glob' => "\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [4]
280 'imprecision' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20", # [46]
281 'inplace' => "\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00", # [23]
282 'internal' => "\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00", # [24]
283 'io' => "\x00\xa8\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [5..11]
284 'layer' => "\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [8]
285 'malloc' => "\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00", # [25]
286 'misc' => "\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00", # [12]
287 'newline' => "\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [9]
288 'numeric' => "\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00", # [13]
289 'once' => "\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00", # [14]
290 'overflow' => "\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00", # [15]
291 'pack' => "\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00", # [16]
292 'parenthesis' => "\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00", # [32]
293 'pipe' => "\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [10]
294 'portable' => "\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00", # [17]
295 'precedence' => "\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00", # [33]
296 'printf' => "\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00", # [34]
297 'prototype' => "\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00", # [35]
298 'qw' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00", # [36]
299 'recursion' => "\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00", # [18]
300 'redefine' => "\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00", # [19]
301 'regexp' => "\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00", # [20]
302 'reserved' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00", # [37]
303 'semicolon' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00", # [38]
304 'severe' => "\x00\x00\x00\x00\x00\xa8\x0a\x00\x00\x00\x00\x00", # [21..25]
305 'signal' => "\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00", # [26]
306 'substr' => "\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00", # [27]
307 'syntax' => "\x00\x00\x00\x00\x00\x00\x00\xaa\xaa\x2a\x00\x00", # [28..38]
308 'taint' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00", # [39]
309 'threads' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00", # [40]
310 'uninitialized' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00", # [41]
311 'unopened' => "\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [11]
312 'unpack' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00", # [42]
313 'untie' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00", # [43]
314 'utf8' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02", # [44]
315 'void' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08", # [45]
318 $NONE = "\0\0\0\0\0\0\0\0\0\0\0\0";
322 $All = "" ; vec($All, $Offsets{'all'}, 2) = 3 ;
326 require Carp; # this initializes %CarpInternal
327 local $Carp::CarpInternal{'warnings'};
328 delete $Carp::CarpInternal{'warnings'};
334 # called from B::Deparse.pm
336 push @_, 'all' unless @_;
343 foreach my $word ( @_ ) {
344 if ($word eq 'FATAL') {
348 elsif ($word eq 'NONFATAL') {
352 elsif ($catmask = $Bits{$word}) {
354 $mask |= $DeadBits{$word} if $fatal ;
355 $mask &= ~($DeadBits{$word}|$All) if $no_fatal ;
358 { Croaker("Unknown warnings category '$word'")}
372 my $mask = ${^WARNING_BITS} ;
374 if (vec($mask, $Offsets{'all'}, 1)) {
375 $mask |= $Bits{'all'} ;
376 $mask |= $DeadBits{'all'} if vec($mask, $Offsets{'all'}+1, 1);
379 push @_, 'all' unless @_;
381 foreach my $word ( @_ ) {
382 if ($word eq 'FATAL') {
386 elsif ($word eq 'NONFATAL') {
390 elsif ($catmask = $Bits{$word}) {
392 $mask |= $DeadBits{$word} if $fatal ;
393 $mask &= ~($DeadBits{$word}|$All) if $no_fatal ;
396 { Croaker("Unknown warnings category '$word'")}
399 ${^WARNING_BITS} = $mask ;
407 my $mask = ${^WARNING_BITS} ;
409 if (vec($mask, $Offsets{'all'}, 1)) {
410 $mask |= $Bits{'all'} ;
411 $mask |= $DeadBits{'all'} if vec($mask, $Offsets{'all'}+1, 1);
414 push @_, 'all' unless @_;
416 foreach my $word ( @_ ) {
417 if ($word eq 'FATAL') {
420 elsif ($catmask = $Bits{$word}) {
421 $mask &= ~($catmask | $DeadBits{$word} | $All);
424 { Croaker("Unknown warnings category '$word'")}
427 ${^WARNING_BITS} = $mask ;
430 my %builtin_type; @builtin_type{qw(SCALAR ARRAY HASH CODE REF GLOB LVALUE Regexp)} = ();
439 # check the category supplied.
441 if (my $type = ref $category) {
442 Croaker("not an object")
443 if exists $builtin_type{$type};
447 $offset = $Offsets{$category};
448 Croaker("Unknown warnings category '$category'")
449 unless defined $offset;
452 $category = (caller(1))[0] ;
453 $offset = $Offsets{$category};
454 Croaker("package '$category' not registered for warnings")
455 unless defined $offset ;
458 my $this_pkg = (caller(1))[0] ;
463 while (do { { package DB; $pkg = (caller($i++))[0] } } ) {
464 last unless @DB::args && $DB::args[0] =~ /^$category=/ ;
469 $i = _error_loc(); # see where Carp will allocate the error
472 my $callers_bitmask = (caller($i))[9] ;
473 return ($callers_bitmask, $offset, $i) ;
478 goto &Carp::short_error_loc; # don't introduce another stack frame
483 Croaker("Usage: warnings::enabled([category])")
484 unless @_ == 1 || @_ == 0 ;
486 my ($callers_bitmask, $offset, $i) = __chk(@_) ;
488 return 0 unless defined $callers_bitmask ;
489 return vec($callers_bitmask, $offset, 1) ||
490 vec($callers_bitmask, $Offsets{'all'}, 1) ;
495 Croaker("Usage: warnings::fatal_enabled([category])")
496 unless @_ == 1 || @_ == 0 ;
498 my ($callers_bitmask, $offset, $i) = __chk(@_) ;
500 return 0 unless defined $callers_bitmask;
501 return vec($callers_bitmask, $offset + 1, 1) ||
502 vec($callers_bitmask, $Offsets{'all'} + 1, 1) ;
507 Croaker("Usage: warnings::warn([category,] 'message')")
508 unless @_ == 2 || @_ == 1 ;
511 my ($callers_bitmask, $offset, $i) = __chk(@_) ;
513 Carp::croak($message)
514 if vec($callers_bitmask, $offset+1, 1) ||
515 vec($callers_bitmask, $Offsets{'all'}+1, 1) ;
516 Carp::carp($message) ;
521 Croaker("Usage: warnings::warnif([category,] 'message')")
522 unless @_ == 2 || @_ == 1 ;
525 my ($callers_bitmask, $offset, $i) = __chk(@_) ;
528 unless defined $callers_bitmask &&
529 (vec($callers_bitmask, $offset, 1) ||
530 vec($callers_bitmask, $Offsets{'all'}, 1)) ;
533 Carp::croak($message)
534 if vec($callers_bitmask, $offset+1, 1) ||
535 vec($callers_bitmask, $Offsets{'all'}+1, 1) ;
537 Carp::carp($message) ;