summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2016-05-29 00:37:51 -0400
committerJesse Luehrs <doy@tozt.net>2016-05-29 00:37:51 -0400
commite91bde6d2c0b5491d56b4427dfff8c35241fe512 (patch)
tree6c61b80bf45284717b73c01d78d7a0c95dd91f09
parentcb0abffcf60e745e24d5b9852531c76f64ac4558 (diff)
parentf8e3dd4db20c5ef34c6ca0064e74b42dca809eb2 (diff)
downloadeval-closure-e91bde6d2c0b5491d56b4427dfff8c35241fe512.tar.gz
eval-closure-e91bde6d2c0b5491d56b4427dfff8c35241fe512.zip
Merge pull request #8 from dolmen/optimisations
Various optimisations
-rw-r--r--lib/Eval/Closure.pm40
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,