From 794dc9df98d2aaf2f143f32ac7dfa42fa46ce07e Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Tue, 2 Aug 2011 01:10:22 -0500 Subject: compile each thing in a separate package, to avoid leakage --- lib/Eval/Closure.pm | 18 +++++++++++------- t/compiling-package.t | 29 +++++++++++++++++++++++------ 2 files changed, 34 insertions(+), 13 deletions(-) diff --git a/lib/Eval/Closure.pm b/lib/Eval/Closure.pm index 23cf250..42c20da 100644 --- a/lib/Eval/Closure.pm +++ b/lib/Eval/Closure.pm @@ -207,14 +207,18 @@ sub _clean_eval_closure { } } +$Eval::Closure::SANDBOX_ID = 0; + sub _clean_eval { - package # hide from PAUSE - Eval::Closure::Sandbox; - local $@; - local $SIG{__DIE__}; - my $compiler = eval $_[0]; - my $e = $@; - return [ $compiler, $e ]; + $Eval::Closure::SANDBOX_ID++; + return eval < 'no strict "refs"; sub { keys %{__PACKAGE__ . "::"} }', -); +{ + my $code = eval_closure( + source => 'no strict "refs"; sub { keys %{__PACKAGE__ . "::"} }', + ); -# defining the sub { } creates __ANON__, calling 'no strict' creates BEGIN -my @stash_keys = grep { $_ ne '__ANON__' && $_ ne 'BEGIN' } $code->(); + # defining the sub { } creates __ANON__, calling 'no strict' creates BEGIN + my @stash_keys = grep { $_ ne '__ANON__' && $_ ne 'BEGIN' } $code->(); -is_deeply([@stash_keys], [], "compiled in an empty package"); + is_deeply([@stash_keys], [], "compiled in an empty package"); +} + +{ + # the more common case where you'd run into this is imported subs + # for instance, Bread::Board::as vs Moose::Util::TypeConstraints::as + my $c1 = eval_closure( + source => 'no strict "vars"; sub { ++$foo }', + ); + my $c2 = eval_closure( + source => 'no strict "vars"; sub { --$foo }', + ); + is($c1->(), 1); + is($c1->(), 2); + is($c2->(), -1); + is($c2->(), -2); +} done_testing; -- cgit v1.2.3-54-g00ecf