diff options
-rw-r--r-- | pp_sys.c | 2 | ||||
-rwxr-xr-x | t/op/ref.t | 6 | ||||
-rw-r--r-- | util.c | 2 |
3 files changed, 7 insertions, 3 deletions
@@ -423,7 +423,7 @@ PP(pp_warn) tmpsv = TOPs; } tmps = SvPV(tmpsv, len); - if (!tmps || !len) { + if ((!tmps || !len) && PL_errgv) { SV *error = ERRSV; (void)SvUPGRADE(error, SVt_PV); if (SvPOK(error) && SvCUR(error)) diff --git a/t/op/ref.t b/t/op/ref.t index ae3eef7dbf..b29dcb77ac 100755 --- a/t/op/ref.t +++ b/t/op/ref.t @@ -5,7 +5,7 @@ BEGIN { @INC = qw(. ../lib); } -print "1..66\n"; +print "1..67\n"; require 'test.pl'; @@ -346,6 +346,10 @@ runperl(prog => 'sub UNIVERSAL::AUTOLOAD { qr// } a->p' ); if ($? != 0) { print "not " }; print "ok ",++$test," - UNIVERSAL::AUTOLOAD called when freeing qr//\n"; +runperl(prog => 'sub UNIVERSAL::DESTROY { warn } bless \$a, A', stderr => 1); +if ($? != 0) { print "not " }; +print "ok ",++$test," - warn called inside UNIVERSAL::DESTROY\n"; + # test global destruction ++$test; @@ -1247,7 +1247,7 @@ Perl_vwarn(pTHX_ const char* pat, va_list *args) } /* if STDERR is tied, use it instead */ - if (PL_stderrgv && (io = GvIOp(PL_stderrgv)) + if (PL_stderrgv && SvREFCNT(PL_stderrgv) && (io = GvIO(PL_stderrgv)) && (mg = SvTIED_mg((SV*)io, PERL_MAGIC_tiedscalar))) { dSP; ENTER; PUSHMARK(SP); |