Created
July 31, 2018 08:42
-
-
Save dallaylaen/14e575d4d3bc5ed672495ecb63e33194 to your computer and use it in GitHub Desktop.
Syntax::Keyword::Try bug: DESTROY via return in a nested try block wreaks havoc on the outer try block
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env perl | |
=head1 DESCRIPTION | |
Executing a DESTROY block while returning from a nested try block has weird side effect | |
on the outer try block. | |
This may seem like a weird & unreachable case, but actually every Moo[se] module | |
has nonempty destructor. | |
=cut | |
use strictures 2; | |
use Test::Most tests => 1; | |
use Syntax::Keyword::Try; | |
eq_or_diff [outer()], [ 123 ], "No extra data in return"; | |
sub outer { | |
my @result; | |
try { | |
@result = middle(); | |
1; # or catch will be triggered | |
} catch { | |
die "Something terrible happened: $@"; | |
}; | |
return @result; | |
} | |
sub middle { | |
my $x = inner(); # MUST be called in scalar or void context & indirectly | |
return 123; | |
}; | |
sub inner { | |
my $canary = Canary->new; | |
try { | |
return 123; | |
} catch { | |
die "Something terrible happened: $@"; | |
} | |
} | |
package Canary; | |
sub new { | |
bless {}, shift; | |
}; | |
sub DESTROY { my $x; $@ = 42; }; # Destructor MUST be nonempty |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment