Skip to content

Commit

Permalink
but... that breaks memoization, so disable that for now
Browse files Browse the repository at this point in the history
  • Loading branch information
doy committed Aug 2, 2011
1 parent 794dc9d commit fa28785
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 20 deletions.
27 changes: 7 additions & 20 deletions lib/Eval/Closure.pm
Expand Up @@ -36,16 +36,11 @@ String eval is often used for dynamic code generation. For instance, C<Moose>
uses it heavily, to generate inlined versions of accessors and constructors,
which speeds code up at runtime by a significant amount. String eval is not
without its issues however - it's difficult to control the scope it's used in
(which determines which variables are in scope inside the eval), and it can be
quite slow, especially if doing a large number of evals.
(which determines which variables are in scope inside the eval).
This module attempts to solve both of those problems. It provides an
C<eval_closure> function, which evals a string in a clean environment, other
than a fixed list of specified variables. It also caches the result of the
eval, so that doing repeated evals of the same source, even with a different
environment, will be much faster (but note that the description is part of the
string to be evaled, so it must also be the same (or non-existent) if caching
is to work properly).
This module attempts to solve this problem. It provides an C<eval_closure>
function, which evals a string in a clean environment, other than a fixed list
of specified variables.
=cut

Expand Down Expand Up @@ -193,18 +188,10 @@ sub _clean_eval_closure {
return ($code, $e);
}

{
my %compiler_cache;
sub _make_compiler {
my $source = _make_compiler_source(@_);

sub _make_compiler {
my $source = _make_compiler_source(@_);

unless (exists $compiler_cache{$source}) {
$compiler_cache{$source} = _clean_eval($source);
}

return @{ $compiler_cache{$source} };
}
return @{ _clean_eval($source) };
}

$Eval::Closure::SANDBOX_ID = 0;
Expand Down
10 changes: 10 additions & 0 deletions t/compiling-package.t
Expand Up @@ -31,4 +31,14 @@ use Eval::Closure;
is($c2->(), -2);
}

{
my $source = 'no strict "vars"; sub { ++$foo }';
my $c1 = eval_closure(source => $source);
my $c2 = eval_closure(source => $source);
is($c1->(), 1);
is($c1->(), 2);
is($c2->(), 1);
is($c2->(), 2);
}

done_testing;
6 changes: 6 additions & 0 deletions t/memoize.t
Expand Up @@ -7,6 +7,12 @@ use Test::Requires 'Test::Output';

use Eval::Closure;

# XXX this whole test isn't very useful anymore, since we no longer do
# memoization. it would be nice to bring it back at some point though, if there
# was a way to do this without breaking the other tests

plan skip_all => "disabling this test for now";

{
my $source = 'BEGIN { warn "foo\n" } sub { $foo * 2 }';

Expand Down

0 comments on commit fa28785

Please sign in to comment.