diff options
author | Jesse Luehrs <doy@tozt.net> | 2011-08-02 00:36:58 -0500 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2011-08-02 01:05:45 -0500 |
commit | 0fb2ea464c6eb6c52831d44ef541a0d4d5c95a92 (patch) | |
tree | 41685e2b53718ddef4b6b1e21c6d61d147e2c32a /t | |
parent | a0e934a667e05d3a8b5556e257938472cd9d6243 (diff) | |
download | eval-closure-0fb2ea464c6eb6c52831d44ef541a0d4d5c95a92.tar.gz eval-closure-0fb2ea464c6eb6c52831d44ef541a0d4d5c95a92.zip |
i always forget that B exists
Diffstat (limited to 't')
-rw-r--r-- | t/close-over.t | 47 |
1 files changed, 32 insertions, 15 deletions
diff --git a/t/close-over.t b/t/close-over.t index 8a58aa3..254ec40 100644 --- a/t/close-over.t +++ b/t/close-over.t @@ -4,6 +4,7 @@ use warnings; use Test::More; use Test::Fatal; +use B; use Eval::Closure; use Test::Requires 'PadWalker'; @@ -34,22 +35,38 @@ use Test::Requires 'PadWalker'; } { - my $foo = []; - my $env = { '$foo' => \$foo }; + # i feel dirty + my $c = eval_closure(source => 'sub { }'); + my $b = B::svref_2object($c); + my @scopes; + while ($b->isa('B::CV')) { + push @scopes, $b; + $b = $b->OUTSIDE; + } + my @visible_in_outer_scope + = grep { $_ ne '&' } + map { $_->PV } + grep { $_->isa('B::PV') } + map { $_->PADLIST->ARRAYelt(0)->ARRAY } + @scopes; - like( - exception { - eval_closure( - source => 'sub { push @$foo, @_; return $__captures }', - environment => $env, - ); - }, - qr/Global symbol "\$__captures/, - "we don't close over \$__captures" - ); -} + # test to ensure we don't inadvertently screw up this test by rearranging + # code. if the scope that encloses the eval ends up not declaring $e, then + # change this test. + ok(scalar(grep { $_ eq '$e' } @visible_in_outer_scope), + "visible list is sane"); -# it'd be nice if we could test that closing over other things wasn't possible, -# but perl's optimizer gets in the way of that + for my $outer_scope_pad_entry (@visible_in_outer_scope) { + like( + exception { + eval_closure( + source => "sub { $outer_scope_pad_entry }", + ); + }, + qr/Global symbol "\Q$outer_scope_pad_entry/, + "we don't close over $outer_scope_pad_entry" + ); + } +} done_testing; |