diff options
author | Jesse Luehrs <doy@tozt.net> | 2016-05-29 00:37:51 -0400 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2016-05-29 00:37:51 -0400 |
commit | e91bde6d2c0b5491d56b4427dfff8c35241fe512 (patch) | |
tree | 6c61b80bf45284717b73c01d78d7a0c95dd91f09 | |
parent | cb0abffcf60e745e24d5b9852531c76f64ac4558 (diff) | |
parent | f8e3dd4db20c5ef34c6ca0064e74b42dca809eb2 (diff) | |
download | eval-closure-e91bde6d2c0b5491d56b4427dfff8c35241fe512.tar.gz eval-closure-e91bde6d2c0b5491d56b4427dfff8c35241fe512.zip |
Merge pull request #8 from dolmen/optimisations
Various optimisations
-rw-r--r-- | lib/Eval/Closure.pm | 40 |
1 files changed, 24 insertions, 16 deletions
diff --git a/lib/Eval/Closure.pm b/lib/Eval/Closure.pm index e129c53..3021d68 100644 --- a/lib/Eval/Closure.pm +++ b/lib/Eval/Closure.pm @@ -9,7 +9,6 @@ use Exporter 'import'; use Carp; use overload (); use Scalar::Util qw(reftype); -use Try::Tiny; use constant HAS_LEXICAL_SUBS => $] >= 5.018; @@ -171,11 +170,11 @@ sub _validate_env { for my $var (keys %$env) { if (HAS_LEXICAL_SUBS) { croak("Environment key '$var' should start with \@, \%, \$, or \&") - unless $var =~ /^([\@\%\$\&])/; + if index('$@%&', substr($var, 0, 1)) < 0; } else { croak("Environment key '$var' should start with \@, \%, or \$") - unless $var =~ /^([\@\%\$])/; + if index('$@%', substr($var, 0, 1)) < 0; } croak("Environment values must be references, not $env->{$var}") unless ref($env->{$var}); @@ -193,28 +192,36 @@ sub _line_directive { sub _clean_eval_closure { my ($source, $captures, $alias) = @_; - my @capture_keys = sort keys %$captures; + my @capture_keys = keys %$captures; if ($ENV{EVAL_CLOSURE_PRINT_SOURCE}) { _dump_source(_make_compiler_source($source, $alias, @capture_keys)); } my ($compiler, $e) = _make_compiler($source, $alias, @capture_keys); - my $code; - if (defined $compiler) { - $code = $compiler->(@$captures{@capture_keys}); - } + return (undef, $e) unless defined $compiler; + + my $code = $compiler->(@$captures{@capture_keys}); - if (defined($code) && (!ref($code) || ref($code) ne 'CODE')) { - $e = "The 'source' parameter must return a subroutine reference, " - . "not $code"; - undef $code; + if (!defined $code) { + return ( + undef, + "The 'source' parameter must return a subroutine reference, " + . "not undef" + ) + } + if (!ref($code) || ref($code) ne 'CODE') { + return ( + undef, + "The 'source' parameter must return a subroutine reference, not " + . ref($code) + ) } if ($alias) { require Devel::LexAlias; Devel::LexAlias::lexalias($code, $_, $captures->{$_}) - for grep !/^\&/, keys %$captures; + for grep index($_, '&')==-1, @capture_keys; } return ($code, $e); @@ -223,7 +230,7 @@ sub _clean_eval_closure { sub _make_compiler { my $source = _make_compiler_source(@_); - return @{ _clean_eval($source) }; + _clean_eval($source) } sub _clean_eval { @@ -231,7 +238,7 @@ sub _clean_eval { local $SIG{__DIE__}; my $compiler = eval $_[0]; my $e = $@; - [ $compiler, $e ]; + ( $compiler, $e ) } $Eval::Closure::SANDBOX_ID = 0; @@ -272,7 +279,8 @@ sub _dump_source { my ($source) = @_; my $output; - if (try { require Perl::Tidy }) { + local $@; + if (eval { require Perl::Tidy; 1 }) { Perl::Tidy::perltidy( source => \$source, destination => \$output, |