Skip to content

Commit

Permalink
use less code and fix memory leak
Browse files Browse the repository at this point in the history
  • Loading branch information
kraih committed Oct 29, 2017
1 parent 4790c91 commit 3096cd3
Showing 1 changed file with 20 additions and 23 deletions.
43 changes: 20 additions & 23 deletions lib/Mojo/IOLoop/Delay.pm
Expand Up @@ -47,16 +47,8 @@ sub finally {
my ($self, $finally) = @_;

my $new = $self->_clone;
my $cb = sub {
my ($method, @result) = @_;
my ($res) = eval { $finally->(@result) };
return $new->$method(@result)
unless $res && blessed $res && $res->can('then');
$res->then(sub { $new->$method(@result) }, sub { $new->$method(@result) });
};

push @{$self->{resolve}}, sub { $cb->('resolve', @_) };
push @{$self->{reject}}, sub { $cb->('reject', @_) };
push @{$self->{resolve}}, sub { _finally($new, $finally, 'resolve', @_) };
push @{$self->{reject}}, sub { _finally($new, $finally, 'reject', @_) };

$self->_defer if $self->{result};

Expand Down Expand Up @@ -85,8 +77,8 @@ sub then {
my ($self, $resolve, $reject) = @_;

my $new = $self->_clone;
push @{$self->{resolve}}, $self->_wrap('resolve', $new, $resolve);
push @{$self->{reject}}, $self->_wrap('reject', $new, $reject);
push @{$self->{resolve}}, sub { _then($new, $resolve, 'resolve', @_) };
push @{$self->{reject}}, sub { _then($new, $reject, 'reject', @_) };

$self->_defer if $self->{result};

Expand Down Expand Up @@ -117,6 +109,14 @@ sub _defer {
$self->ioloop->next_tick(sub { $_->(@$result) for @$cbs });
}

sub _finally {
my ($new, $finally, $method, @result) = @_;
my ($res) = eval { $finally->(@result) };
return $new->$method(@result)
unless $res && blessed $res && $res->can('then');
$res->then(sub { $new->$method(@result) }, sub { $new->$method(@result) });
}

sub _settle {
my ($self, $status) = (shift, shift);
return $self if $self->{result};
Expand Down Expand Up @@ -149,21 +149,18 @@ sub _step {
return $self;
}

sub _wrap {
my ($self, $method, $new, $cb) = @_;
sub _then {
my ($new, $cb, $method, @result) = @_;

return sub { $new->$method(@{$self->{result}}) }
unless defined $cb;
return $new->$method(@result) unless defined $cb;

return sub {
my @res;
return $new->reject($@) unless eval { @res = $cb->(@_); 1 };
my @res;
return $new->reject($@) unless eval { @res = $cb->(@result); 1 };

return $new->$method(@res)
unless @res == 1 && blessed $res[0] && $res[0]->can('then');
return $new->$method(@res)
unless @res == 1 && blessed $res[0] && $res[0]->can('then');

$res[0]->then(sub { $new->resolve(@_); () }, sub { $new->reject(@_); () });
};
$res[0]->then(sub { $new->resolve(@_); () }, sub { $new->reject(@_); () });
}

1;
Expand Down

0 comments on commit 3096cd3

Please sign in to comment.