Deparse sub calls quietly
authorFather Chrysostomos <sprout@cpan.org>
Mon, 6 Oct 2014 15:28:40 +0000 (08:28 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Mon, 6 Oct 2014 15:28:40 +0000 (08:28 -0700)
In commit a958cfbb8 I used eval{prototype "CORE::..."} to see whether
something is a keyword, not realising that we have a __DIE__ hand-
ler that squeaks every time.  It is only installed when Deparse is
invoked via -MO.

Localising $SIG{__DIE__} does the trick.  Localising $@ as well is a
good idea when using eval, though I haven’t checked whether that was
causing problems.

lib/B/Deparse.pm
lib/B/Deparse.t

index b84217d..d5f290e 100644 (file)
@@ -3905,7 +3905,8 @@ sub pp_entersub {
                my $fq;
                if (exists $feature_keywords{$kid}) {
                    $fq++ if $self->feature_enabled($kid);
-               } elsif (eval { () = prototype "CORE::$kid"; 1 }) {
+               } elsif (do { local $@; local $SIG{__DIE__};
+                             eval { () = prototype "CORE::$kid"; 1 } }) {
                    $fq++
                }
                $fq and substr $kid, 0, 0, = $self->{'curstash'}.'::';
index 75a5fc2..ef238bf 100644 (file)
@@ -13,7 +13,7 @@ use warnings;
 use strict;
 use Test::More;
 
-my $tests = 20; # not counting those in the __DATA__ section
+my $tests = 21; # not counting those in the __DATA__ section
 
 use B::Deparse;
 my $deparse = B::Deparse->new();
@@ -277,6 +277,14 @@ is($deparse->coderef2text(sub{ use utf8; /€/; }),
 }',
 "qr/euro/");
 
+# STDERR when deparsing sub calls
+# For a short while the output included 'While deparsing'
+$a = `$^X $path "-MO=Deparse" -e "foo()" 2>&1`;
+$a =~ s/-e syntax OK\n//g;
+is($a, <<'EOCODI', 'no extra output when deparsing foo()');
+foo();
+EOCODI
+
 
 done_testing($tests);