FAQ

On Wed, May 04, 2016 at 11:43:45AM +0100, Nicholas Clark wrote:

On the assumption that this fixes the actual problems that Coro hit,
short of test cases to demonstrate otherwise.
I suspect that *this* is the bug that Coro hit.

For $whatever reason, PerlIO_find_layer() chooses to silence all warnings,
and implements this by localising PL_warnhook and then assigning a no-op sub
to it. The problem is that this isn't reflected in %SIG, so when Perl-space
code localises $SIG{__WARN__}, the previous value of $SIG{__WARN__} is
stored on the scope stack as the thing to write back at scope exit:


$ cat ~/test/via.pl
#!/usr/bin/perl -w
use strict;

unshift @INC, sub {
     return undef unless caller eq "main";
     return \<<'EOP';

print STDERR "This code is being called\n";

warn "My errors are eaten";

{
     local $SIG{__WARN__} = sub {
         my $message = shift;
         chomp $message;
         print STDERR "Warning you about '$message'\n";
     };
     warn "Christmas";
}

warn "This error message should still be eaten";

EOP
};

PerlIO::Layer->find("Noisy", 1);
__END__
$ ./perl -Ilib ~/test/via.pl
This code is being called
Warning you about 'Christmas at /loader/0xb99c00/PerlIO.pm line 12.'
This error message should still be eaten at /loader/0xb99c00/PerlIO.pm line 15.


Remove the local $SIG{__WARN__} and that last warning is correctly suppressed.

Nicholas Clark

Search Discussions

Discussion Posts

Previous

Related Discussions

Discussion Navigation
viewthread | post
posts ‹ prev | 25 of 25 | next ›
Discussion Overview
groupperl5-porters @
categoriesperl
postedMay 3, '16 at 6:34p
activeMay 5, '16 at 11:50a
posts25
users12
websiteperl.org

People

Translate

site design / logo © 2017 Grokbase