diff options
-rw-r--r-- | perlio.c | 13 | ||||
-rw-r--r-- | t/io/layers.t | 9 |
2 files changed, 20 insertions, 2 deletions
@@ -762,7 +762,8 @@ PerlIO_find_layer(pTHX_ const char *name, STRLEN len, int load) ENTER; SAVEINT(PL_in_load_module); if (cv) { - SAVESPTR(PL_warnhook); + SAVEGENERICSV(PL_warnhook); + SvREFCNT_inc(cv); PL_warnhook = (SV *) cv; } PL_in_load_module++; @@ -5039,3 +5040,13 @@ PerlIO_sprintf(char *s, int n, const char *fmt, ...) return result; } #endif + +/* + * Local variables: + * c-indentation-style: bsd + * c-basic-offset: 4 + * indent-tabs-mode: t + * End: + * + * vim: shiftwidth=4: +*/ diff --git a/t/io/layers.t b/t/io/layers.t index 79800dc068..41c44c478a 100644 --- a/t/io/layers.t +++ b/t/io/layers.t @@ -41,7 +41,7 @@ if (${^UNICODE} & 1) { $UNICODE_STDIN = 1; } } -my $NTEST = 43 - (($DOSISH || !$FASTSTDIO) ? 7 : 0) - ($DOSISH ? 5 : 0) +my $NTEST = 44 - (($DOSISH || !$FASTSTDIO) ? 7 : 0) - ($DOSISH ? 5 : 0) + $UNICODE_STDIN; sub PerlIO::F_UTF8 () { 0x00008000 } # from perliol.h @@ -212,5 +212,12 @@ SKIP: { close G; } + # Check that PL_sigwarn's reference count is correct, and that + # &PerlIO::Layer::NoWarnings isn't prematurely freed. + fresh_perl_like (<<'EOT', qr/^CODE/); +open(UTF, "<:raw:encoding(utf8)", $^X) or die $!; +print ref *PerlIO::Layer::NoWarnings{CODE}; +EOT + 1 while unlink "afile"; } |