summaryrefslogtreecommitdiffstats
path: root/t
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2011-08-02 00:36:58 -0500
committerJesse Luehrs <doy@tozt.net>2011-08-02 01:05:45 -0500
commit0fb2ea464c6eb6c52831d44ef541a0d4d5c95a92 (patch)
tree41685e2b53718ddef4b6b1e21c6d61d147e2c32a /t
parenta0e934a667e05d3a8b5556e257938472cd9d6243 (diff)
downloadeval-closure-0fb2ea464c6eb6c52831d44ef541a0d4d5c95a92.tar.gz
eval-closure-0fb2ea464c6eb6c52831d44ef541a0d4d5c95a92.zip
i always forget that B exists
Diffstat (limited to 't')
-rw-r--r--t/close-over.t47
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;