################################################################################ ## ## Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz. ## Version 2.x, Copyright (C) 2001, Paul Marquess. ## Version 1.x, Copyright (C) 1999, Kenneth Albanowski. ## ## This program is free software; you can redistribute it and/or ## modify it under the same terms as Perl itself. ## ################################################################################ =provides __UNDEFINED__ ckWARN ckWARN_d warner ck_warner ck_warner_d Perl_warner Perl_ck_warner Perl_ck_warner_d Perl_warner_nocontext =implementation __UNDEFINED__ WARN_ALL 0 __UNDEFINED__ WARN_CLOSURE 1 __UNDEFINED__ WARN_DEPRECATED 2 __UNDEFINED__ WARN_EXITING 3 __UNDEFINED__ WARN_GLOB 4 __UNDEFINED__ WARN_IO 5 __UNDEFINED__ WARN_CLOSED 6 __UNDEFINED__ WARN_EXEC 7 __UNDEFINED__ WARN_LAYER 8 __UNDEFINED__ WARN_NEWLINE 9 __UNDEFINED__ WARN_PIPE 10 __UNDEFINED__ WARN_UNOPENED 11 __UNDEFINED__ WARN_MISC 12 __UNDEFINED__ WARN_NUMERIC 13 __UNDEFINED__ WARN_ONCE 14 __UNDEFINED__ WARN_OVERFLOW 15 __UNDEFINED__ WARN_PACK 16 __UNDEFINED__ WARN_PORTABLE 17 __UNDEFINED__ WARN_RECURSION 18 __UNDEFINED__ WARN_REDEFINE 19 __UNDEFINED__ WARN_REGEXP 20 __UNDEFINED__ WARN_SEVERE 21 __UNDEFINED__ WARN_DEBUGGING 22 __UNDEFINED__ WARN_INPLACE 23 __UNDEFINED__ WARN_INTERNAL 24 __UNDEFINED__ WARN_MALLOC 25 __UNDEFINED__ WARN_SIGNAL 26 __UNDEFINED__ WARN_SUBSTR 27 __UNDEFINED__ WARN_SYNTAX 28 __UNDEFINED__ WARN_AMBIGUOUS 29 __UNDEFINED__ WARN_BAREWORD 30 __UNDEFINED__ WARN_DIGIT 31 __UNDEFINED__ WARN_PARENTHESIS 32 __UNDEFINED__ WARN_PRECEDENCE 33 __UNDEFINED__ WARN_PRINTF 34 __UNDEFINED__ WARN_PROTOTYPE 35 __UNDEFINED__ WARN_QW 36 __UNDEFINED__ WARN_RESERVED 37 __UNDEFINED__ WARN_SEMICOLON 38 __UNDEFINED__ WARN_TAINT 39 __UNDEFINED__ WARN_THREADS 40 __UNDEFINED__ WARN_UNINITIALIZED 41 __UNDEFINED__ WARN_UNPACK 42 __UNDEFINED__ WARN_UNTIE 43 __UNDEFINED__ WARN_UTF8 44 __UNDEFINED__ WARN_VOID 45 __UNDEFINED__ WARN_ASSERTIONS 46 __UNDEFINED__ packWARN(a) (a) __UNDEFINED__ packWARN2(a,b) (packWARN(a) << 8 | (b)) __UNDEFINED__ packWARN3(a,b,c) (packWARN2(a,b) << 8 | (c)) __UNDEFINED__ packWARN4(a,b,c,d) (packWARN3(a,b,c) << 8 | (d)) #ifndef ckWARN # ifdef G_WARN_ON # define ckWARN(a) (PL_dowarn & G_WARN_ON) # else # define ckWARN(a) PL_dowarn # endif #endif __UNDEFINED__ ckWARN2(a,b) (ckWARN(a) || ckWARN(b)) __UNDEFINED__ ckWARN3(a,b,c) (ckWARN(c) || ckWARN2(a,b)) __UNDEFINED__ ckWARN4(a,b,c,d) (ckWARN(d) || ckWARN3(a,b,c)) #ifndef ckWARN_d # ifdef isLEXWARN_off # define ckWARN_d(a) (isLEXWARN_off || ckWARN(a)) # else # define ckWARN_d(a) 1 # endif #endif __UNDEFINED__ ckWARN2_d(a,b) (ckWARN_d(a) || ckWARN_d(b)) __UNDEFINED__ ckWARN3_d(a,b,c) (ckWARN_d(c) || ckWARN2_d(a,b)) __UNDEFINED__ ckWARN4_d(a,b,c,d) (ckWARN_d(d) || ckWARN3_d(a,b,c)) __UNDEFINED__ vwarner(err, pat, argsp) \ STMT_START { SV *sv; \ PERL_UNUSED_ARG(err); \ sv = vnewSVpvf(pat, argsp); \ sv_2mortal(sv); \ warn("%s", SvPV_nolen(sv)); \ } STMT_END #if { VERSION >= 5.004 } && !defined(warner) # if { NEED warner } void warner(U32 err, const char *pat, ...) { va_list args; va_start(args, pat); vwarner(err, pat, &args); va_end(args); } # define warner Perl_warner # define Perl_warner_nocontext Perl_warner # endif #endif #if { VERSION >= 5.004 } && !defined(ck_warner) # if { NEED ck_warner } void ck_warner(pTHX_ U32 err, const char *pat, ...) { va_list args; if ( ! ckWARN((err ) & 0xFF) && ! ckWARN((err >> 8) & 0xFF) && ! ckWARN((err >> 16) & 0xFF) && ! ckWARN((err >> 24) & 0xFF)) { return; } va_start(args, pat); vwarner(err, pat, &args); va_end(args); } # define ck_warner Perl_ck_warner # endif #endif #if { VERSION >= 5.004 } && !defined(ck_warner_d) # if { NEED ck_warner_d } void ck_warner_d(pTHX_ U32 err, const char *pat, ...) { va_list args; if ( ! ckWARN_d((err ) & 0xFF) && ! ckWARN_d((err >> 8) & 0xFF) && ! ckWARN_d((err >> 16) & 0xFF) && ! ckWARN_d((err >> 24) & 0xFF)) { return; } va_start(args, pat); vwarner(err, pat, &args); va_end(args); } # define ck_warner_d Perl_ck_warner_d # endif #endif =xsinit #define NEED_warner #define NEED_ck_warner #define NEED_ck_warner_d =xsubs void warner() CODE: #if { VERSION >= 5.004 } warner(packWARN(WARN_MISC), "warner %s:%d", "bar", 42); #endif void Perl_warner() CODE: #if { VERSION >= 5.004 } Perl_warner(aTHX_ packWARN(WARN_MISC), "Perl_warner %s:%d", "bar", 42); #endif void Perl_ck_warner() CODE: #if { VERSION >= 5.004 } Perl_ck_warner(aTHX_ packWARN(WARN_MISC), "Perl_ck_warner %s:%d", "bar", 42); #endif void Perl_ck_warner_d() CODE: #if { VERSION >= 5.004 } Perl_ck_warner_d(aTHX_ packWARN(WARN_MISC), "Perl_ck_warner_d %s:%d", "bar", 42); #endif void Perl_warner_nocontext() CODE: #if { VERSION >= 5.004 } Perl_warner_nocontext(packWARN(WARN_MISC), "Perl_warner_nocontext %s:%d", "bar", 42); #endif void ckWARN() CODE: #if { VERSION >= 5.004 } if (ckWARN(WARN_MISC)) Perl_warner_nocontext(packWARN(WARN_MISC), "ckWARN %s:%d", "bar", 42); #endif void ckWARN_d() CODE: #if { VERSION >= 5.004 } if (ckWARN_d(WARN_MISC)) Perl_warner_nocontext(packWARN(WARN_MISC), "ckWARN_d %s:%d", "bar", 42); #endif =tests plan => 11 $^W = 0; my $warning; $SIG{'__WARN__'} = sub { $warning = $_[0] }; $warning = ''; Devel::PPPort::warner(); ok(ivers($]) >= ivers("5.004") ? $warning =~ /^warner bar:42/ : $warning eq ''); $warning = ''; Devel::PPPort::Perl_warner(); ok(ivers($]) >= ivers("5.004") ? $warning =~ /^Perl_warner bar:42/ : $warning eq ''); $warning = ''; Devel::PPPort::Perl_warner_nocontext(); ok(ivers($]) >= ivers("5.004") ? $warning =~ /^Perl_warner_nocontext bar:42/ : $warning eq ''); $warning = ''; Devel::PPPort::ckWARN(); is($warning, ''); $warning = ''; Devel::PPPort::ckWARN_d(); ok(ivers($]) >= ivers("5.004") ? $warning =~ /^ckWARN_d bar:42/ : $warning eq ''); $warning = ''; Devel::PPPort::Perl_ck_warner(); ok($warning eq ''); $warning = ''; Devel::PPPort::Perl_ck_warner_d(); ok(ivers($]) >= ivers("5.004") ? $warning =~ /^Perl_ck_warner_d bar:42/ : $warning eq ''); $^W = 1; $warning = ''; Devel::PPPort::ckWARN(); ok(ivers($]) >= ivers("5.004") ? $warning =~ /^ckWARN bar:42/ : $warning eq ''); $warning = ''; Devel::PPPort::ckWARN_d(); ok(ivers($]) >= ivers("5.004") ? $warning =~ /^ckWARN_d bar:42/ : $warning eq ''); $warning = ''; Devel::PPPort::Perl_ck_warner(); ok(ivers($]) >= ivers("5.004") ? $warning =~ /^Perl_ck_warner bar:42/ : $warning eq ''); $warning = ''; Devel::PPPort::Perl_ck_warner_d(); ok(ivers($]) >= ivers("5.004") ? $warning =~ /^Perl_ck_warner_d bar:42/ : $warning eq '');