Skip to content

Instantly share code, notes, and snippets.

@dallaylaen
Created July 31, 2018 08:42
Show Gist options
  • Save dallaylaen/14e575d4d3bc5ed672495ecb63e33194 to your computer and use it in GitHub Desktop.
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
#!/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